1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/shell/renderer/test_runner/mock_grammar_check.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <algorithm>
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/logging.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "content/shell/renderer/test_runner/test_common.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebCString.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "third_party/WebKit/public/web/WebTextCheckingResult.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace content {
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool MockGrammarCheck::CheckGrammarOfString(
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const blink::WebString& text,
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    std::vector<blink::WebTextCheckingResult>* results) {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(results);
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  base::string16 string_text = text;
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (std::find_if(string_text.begin(), string_text.end(), IsASCIIAlpha) ==
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      string_text.end())
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return true;
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Find matching grammatical errors from known ones. This function has to
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // check all errors because the given text may consist of two or more
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // sentences that have grammatical errors.
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static const struct {
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const char* text;
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int location;
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    int length;
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } kGrammarErrors[] = {
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"I have a issue.", 7, 1},
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"I have an grape.", 7, 2},
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"I have an kiwi.", 7, 2},
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"I have an muscat.", 7, 2},
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"You has the right.", 4, 3},
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"apple orange zz.", 0, 16},
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"apple zz orange.", 0, 16},
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"apple,zz,orange.", 0, 16},
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"orange,zz,apple.", 0, 16},
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"the the adlj adaasj sdklj. there there", 4, 3},
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"the the adlj adaasj sdklj. there there", 33, 5},
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        {"zz apple orange.", 0, 16},
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    };
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kGrammarErrors); ++i) {
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    size_t offset = 0;
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    base::string16 error(
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        kGrammarErrors[i].text,
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        kGrammarErrors[i].text + strlen(kGrammarErrors[i].text));
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    while ((offset = string_text.find(error, offset)) != base::string16::npos) {
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      results->push_back(
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          blink::WebTextCheckingResult(blink::WebTextDecorationTypeGrammar,
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       offset + kGrammarErrors[i].location,
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                       kGrammarErrors[i].length));
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      offset += kGrammarErrors[i].length;
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return false;
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace content
64