• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/string_util.h"
6 #include "base/utf_string_conversions.h"
7 #include "chrome/browser/spellchecker_platform_engine.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 
10 // Tests that words are properly ignored. Currently only enabled on OS X as it
11 // is the only platform to support ignoring words. Note that in this test, we
12 // supply a non-zero doc_tag, in order to test that ignored words are matched to
13 // the correct document.
TEST(PlatformSpellCheckTest,IgnoreWords_EN_US)14 TEST(PlatformSpellCheckTest, IgnoreWords_EN_US) {
15   const char* kTestCases[] = {
16     "teh",
17     "morblier",
18     "watre",
19     "noooen",
20   };
21 
22   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
23     const string16 word(ASCIIToUTF16(kTestCases[i]));
24     const int doc_tag = SpellCheckerPlatform::GetDocumentTag();
25 
26     // The word should show up as misspelled.
27     EXPECT_FALSE(SpellCheckerPlatform::CheckSpelling(word, doc_tag)) << word;
28 
29     // Ignore the word.
30     SpellCheckerPlatform::IgnoreWord(word);
31 
32     // The word should now show up as correctly spelled.
33     EXPECT_TRUE(SpellCheckerPlatform::CheckSpelling(word, doc_tag)) << word;
34 
35     // Close the docuemnt. Any words that we had previously ignored should no
36     // longer be ignored and thus should show up as misspelled.
37     SpellCheckerPlatform::CloseDocumentWithTag(doc_tag);
38 
39     // The word should now show be spelled wrong again
40     EXPECT_FALSE(SpellCheckerPlatform::CheckSpelling(word, doc_tag)) << word;
41   }
42 }  // Test IgnoreWords_EN_US
43 
TEST(PlatformSpellCheckTest,SpellCheckSuggestions_EN_US)44 TEST(PlatformSpellCheckTest, SpellCheckSuggestions_EN_US) {
45   static const struct {
46     const char* input;           // A string to be tested.
47     const char* suggested_word;  // A suggested word that should occur.
48   } kTestCases[] = {
49     // We need to have separate test cases here, since hunspell and the OS X
50     // spellchecking service occasionally differ on what they consider a valid
51     // suggestion for a given word, although these lists could likely be
52     // integrated somewhat. The test cases for non-Mac are in
53     // chrome/renderer/spellcheck_unittest.cc
54     // These words come from the wikipedia page of the most commonly
55     // misspelled words in english.
56     // (http://en.wikipedia.org/wiki/Commonly_misspelled_words).
57     // However, 10.6 loads multiple dictionaries and enables many non-English
58     // dictionaries by default. As a result, we have removed from the list any
59     // word that is marked as correct because it is correct in another
60     // language.
61     {"absense", "absence"},
62     {"acceptible", "acceptable"},
63     {"accidentaly", "accidentally"},
64     {"acheive", "achieve"},
65     {"acknowlege", "acknowledge"},
66     {"acquaintence", "acquaintance"},
67     {"aquire", "acquire"},
68     {"aquit", "acquit"},
69     {"acrage", "acreage"},
70     {"adultary", "adultery"},
71     {"advertize", "advertise"},
72     {"adviseable", "advisable"},
73     {"alchohol", "alcohol"},
74     {"alege", "allege"},
75     {"allegaince", "allegiance"},
76     {"allmost", "almost"},
77     // Ideally, this test should pass. It works in firefox, but not in hunspell
78     // or OS X.
79     // {"alot", "a lot"},
80     {"amatuer", "amateur"},
81     {"ammend", "amend"},
82     {"amung", "among"},
83     {"anually", "annually"},
84     {"apparant", "apparent"},
85     {"artic", "arctic"},
86     {"arguement", "argument"},
87     {"athiest", "atheist"},
88     {"athelete", "athlete"},
89     {"avrage", "average"},
90     {"awfull", "awful"},
91     {"ballance", "balance"},
92     {"basicly", "basically"},
93     {"becuase", "because"},
94     {"becomeing", "becoming"},
95     {"befor", "before"},
96     {"begining", "beginning"},
97     {"beleive", "believe"},
98     {"bellweather", "bellwether"},
99     {"benifit", "benefit"},
100     {"bouy", "buoy"},
101     {"briliant", "brilliant"},
102     {"burgler", "burglar"},
103     {"camoflage", "camouflage"},
104     {"carefull", "careful"},
105     {"Carribean", "Caribbean"},
106     {"catagory", "category"},
107     {"cauhgt", "caught"},
108     {"cieling", "ceiling"},
109     {"cemetary", "cemetery"},
110     {"certin", "certain"},
111     {"changable", "changeable"},
112     {"cheif", "chief"},
113     {"citezen", "citizen"},
114     {"collaegue", "colleague"},
115     {"colum", "column"},
116     {"comming", "coming"},
117     {"commited", "committed"},
118     {"compitition", "competition"},
119     {"conceed", "concede"},
120     {"congradulate", "congratulate"},
121     {"consciencious", "conscientious"},
122     {"concious", "conscious"},
123     {"concensus", "consensus"},
124     {"contraversy", "controversy"},
125     {"conveniance", "convenience"},
126     {"critecize", "criticize"},
127     {"dacquiri", "daiquiri"},
128     {"decieve", "deceive"},
129     {"dicide", "decide"},
130     {"definate", "definite"},
131     {"definitly", "definitely"},
132     {"desparate", "desperate"},
133     {"develope", "develop"},
134     {"diffrence", "difference"},
135     {"disapear", "disappear"},
136     {"disapoint", "disappoint"},
137     {"disasterous", "disastrous"},
138     {"disipline", "discipline"},
139     {"drunkeness", "drunkenness"},
140     {"dumbell", "dumbbell"},
141     {"easely", "easily"},
142     {"eigth", "eight"},
143     {"embarass", "embarrass"},
144     {"enviroment", "environment"},
145     {"equiped", "equipped"},
146     {"equiptment", "equipment"},
147     {"exagerate", "exaggerate"},
148     {"exellent", "excellent"},
149     {"exsept", "except"},
150     {"exercize", "exercise"},
151     {"exilerate", "exhilarate"},
152     {"existance", "existence"},
153     {"experiance", "experience"},
154     {"experament", "experiment"},
155     {"explaination", "explanation"},
156     {"facinating", "fascinating"},
157     {"firey", "fiery"},
158     {"finaly", "finally"},
159     {"flourescent", "fluorescent"},
160     {"foriegn", "foreign"},
161     {"fourty", "forty"},
162     {"foreward", "forward"},
163     {"freind", "friend"},
164     {"fundemental", "fundamental"},
165     {"guage", "gauge"},
166     {"generaly", "generally"},
167     {"goverment", "government"},
168     {"gratefull", "grateful"},
169     {"garantee", "guarantee"},
170     {"guidence", "guidance"},
171     {"happyness", "happiness"},
172     {"harrass", "harass"},
173     {"heighth", "height"},
174     {"heirarchy", "hierarchy"},
175     {"humerous", "humorous"},
176     {"hygene", "hygiene"},
177     {"hipocrit", "hypocrite"},
178     {"idenity", "identity"},
179     {"ignorence", "ignorance"},
180     {"imaginery", "imaginary"},
181     {"immitate", "imitate"},
182     {"immitation", "imitation"},
183     {"imediately", "immediately"},
184     {"incidently", "incidentally"},
185     {"independant", "independent"},
186     {"indispensible", "indispensable"},
187     {"innoculate", "inoculate"},
188     {"inteligence", "intelligence"},
189     {"intresting", "interesting"},
190     {"interuption", "interruption"},
191     {"irrelevent", "irrelevant"},
192     {"irritible", "irritable"},
193     {"jellous", "jealous"},
194     {"knowlege", "knowledge"},
195     {"labratory", "laboratory"},
196     {"lenght", "length"},
197     {"liason", "liaison"},
198     {"libary", "library"},
199     {"lisence", "license"},
200     {"lonelyness", "loneliness"},
201     {"lieing", "lying"},
202     {"maintenence", "maintenance"},
203     {"manuever", "maneuver"},
204     {"marrige", "marriage"},
205     {"mathmatics", "mathematics"},
206     {"medcine", "medicine"},
207     {"miniture", "miniature"},
208     {"minite", "minute"},
209     {"mischevous", "mischievous"},
210     {"mispell", "misspell"},
211     // Maybe this one should pass, as it works in hunspell, but not in firefox.
212     // {"misterius", "mysterious"},
213     {"naturaly", "naturally"},
214     {"neccessary", "necessary"},
215     {"neice", "niece"},
216     {"nieghbor", "neighbor"},
217     {"nieghbour", "neighbor"},
218     {"niether", "neither"},
219     {"noticable", "noticeable"},
220     {"occassion", "occasion"},
221     {"occasionaly", "occasionally"},
222     {"occurrance", "occurrence"},
223     {"occured", "occurred"},
224     {"ommision", "omission"},
225     {"oppurtunity", "opportunity"},
226     {"outragous", "outrageous"},
227     {"parrallel", "parallel"},
228     {"parliment", "parliament"},
229     {"particurly", "particularly"},
230     {"passtime", "pastime"},
231     {"peculier", "peculiar"},
232     {"percieve", "perceive"},
233     {"pernament", "permanent"},
234     {"perseverence", "perseverance"},
235     {"personaly", "personally"},
236     {"persaude", "persuade"},
237     {"pichure", "picture"},
238     {"peice", "piece"},
239     {"plagerize", "plagiarize"},
240     {"playright", "playwright"},
241     {"plesant", "pleasant"},
242     {"pollitical", "political"},
243     {"posession", "possession"},
244     {"potatos", "potatoes"},
245     {"practicle", "practical"},
246     {"preceed", "precede"},
247     {"predjudice", "prejudice"},
248     {"presance", "presence"},
249     {"privelege", "privilege"},
250     // This one should probably work. It does in FF and Hunspell.
251     // {"probly", "probably"},
252     {"proffesional", "professional"},
253     {"promiss", "promise"},
254     {"pronounciation", "pronunciation"},
255     {"prufe", "proof"},
256     {"psycology", "psychology"},
257     {"publically", "publicly"},
258     {"quanity", "quantity"},
259     {"quarentine", "quarantine"},
260     {"questionaire", "questionnaire"},
261     {"readible", "readable"},
262     {"realy", "really"},
263     {"recieve", "receive"},
264     {"reciept", "receipt"},
265     {"reconize", "recognize"},
266     {"recomend", "recommend"},
267     {"refered", "referred"},
268     {"referance", "reference"},
269     {"relevent", "relevant"},
270     {"religous", "religious"},
271     {"repitition", "repetition"},
272     {"restarant", "restaurant"},
273     {"rythm", "rhythm"},
274     {"rediculous", "ridiculous"},
275     {"sacrefice", "sacrifice"},
276     {"saftey", "safety"},
277     {"sissors", "scissors"},
278     {"secratary", "secretary"},
279     {"seperate", "separate"},
280     {"sargent", "sergeant"},
281     {"shineing", "shining"},
282     {"similer", "similar"},
283     {"sinceerly", "sincerely"},
284     {"speach", "speech"},
285     {"strenght", "strength"},
286     {"succesful", "successful"},
287     {"supercede", "supersede"},
288     {"surelly", "surely"},
289     {"suprise", "surprise"},
290     {"temperture", "temperature"},
291     {"temprary", "temporary"},
292     {"tommorrow", "tomorrow"},
293     {"tounge", "tongue"},
294     {"truely", "truly"},
295     {"twelth", "twelfth"},
296     {"tyrany", "tyranny"},
297     {"underate", "underrate"},
298     {"untill", "until"},
299     {"unuseual", "unusual"},
300     {"upholstry", "upholstery"},
301     {"usible", "usable"},
302     {"useing", "using"},
303     {"usualy", "usually"},
304     {"vaccuum", "vacuum"},
305     {"vegatarian", "vegetarian"},
306     {"vehical", "vehicle"},
307     {"visious", "vicious"},
308     {"villege", "village"},
309     {"wierd", "weird"},
310     {"wellcome", "welcome"},
311     {"wellfare", "welfare"},
312     {"wilfull", "willful"},
313     {"withold", "withhold"},
314     {"writting", "writing"},
315   };
316 
317   for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
318     const string16 word(ASCIIToUTF16(kTestCases[i].input));
319     EXPECT_FALSE(SpellCheckerPlatform::CheckSpelling(word, 0)) << word;
320 
321     // Check if the suggested words occur.
322     std::vector<string16> suggestions;
323     SpellCheckerPlatform::FillSuggestionList(word, &suggestions);
324     bool suggested_word_is_present = false;
325     const string16 suggested_word(ASCIIToUTF16(kTestCases[i].suggested_word));
326     for (size_t j = 0; j < suggestions.size(); j++) {
327       if (suggestions[j].compare(suggested_word) == 0) {
328         suggested_word_is_present = true;
329         break;
330       }
331     }
332     EXPECT_TRUE(suggested_word_is_present) << suggested_word;
333   }
334 }
335