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