blob: aba1a2dacd268bc676b9a942f8fba2b256f772f9 [file] [log] [blame]
// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/utf_string_conversions.h"
#include "chrome/browser/spellchecker_platform_engine.h"
#include "testing/gtest/include/gtest/gtest.h"
// Tests that words are properly ignored. Currently only enabled on OS X as it
// is the only platform to support ignoring words. Note that in this test, we
// supply a non-zero doc_tag, in order to test that ignored words are matched to
// the correct document.
TEST(PlatformSpellCheckTest, IgnoreWords_EN_US) {
static const struct {
// A misspelled word.
const char* input;
bool input_result;
} kTestCases[] = {
{"teh"},
{"morblier"},
{"watre"},
{"noooen"},
};
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
string16 word(UTF8ToUTF16(kTestCases[i].input));
std::vector<string16> suggestions;
size_t input_length = 0;
if (kTestCases[i].input != NULL) {
input_length = word.length();
}
int doc_tag = SpellCheckerPlatform::GetDocumentTag();
bool result = SpellCheckerPlatform::CheckSpelling(word, doc_tag);
// The word should show up as misspelled.
EXPECT_EQ(kTestCases[i].input_result, result);
// Ignore the word.
SpellCheckerPlatform::IgnoreWord(word);
// Spellcheck again.
result = SpellCheckerPlatform::CheckSpelling(word, doc_tag);
// The word should now show up as correctly spelled.
EXPECT_EQ(!(kTestCases[i].input_result), result);
// Close the docuemnt. Any words that we had previously ignored should no
// longer be ignored and thus should show up as misspelled.
SpellCheckerPlatform::CloseDocumentWithTag(doc_tag);
// Spellcheck one more time.
result = SpellCheckerPlatform::CheckSpelling(word, doc_tag);
// The word should now show be spelled wrong again
EXPECT_EQ(kTestCases[i].input_result, result);
}
} // Test IgnoreWords_EN_US
TEST(PlatformSpellCheckTest, SpellCheckSuggestions_EN_US) {
static const struct {
// A string to be tested.
const wchar_t* input;
// A suggested word that should occur.
const wchar_t* suggested_word;
} kTestCases[] = { // A valid English word with a preceding whitespace
// We need to have separate test cases here, since hunspell and the OS X
// spellchecking service occasionally differ on what they consider a valid
// suggestion for a given word, although these lists could likely be
// integrated somewhat. The test cases for non-Mac are in
// chrome/renderer/spellcheck_unittest.cc
// These words come from the wikipedia page of the most commonly
// misspelled words in english.
// (http://en.wikipedia.org/wiki/Commonly_misspelled_words).
// However, 10.6 loads multiple dictionaries and enables many non-English
// dictionaries by default. As a result, we have removed from the list any
// word that is marked as correct because it is correct in another
// language.
{L"absense", L"absence"},
{L"acceptible", L"acceptable"},
{L"accidentaly", L"accidentally"},
{L"acheive", L"achieve"},
{L"acknowlege", L"acknowledge"},
{L"acquaintence", L"acquaintance"},
{L"aquire", L"acquire"},
{L"aquit", L"acquit"},
{L"acrage", L"acreage"},
{L"adultary", L"adultery"},
{L"advertize", L"advertise"},
{L"adviseable", L"advisable"},
{L"alchohol", L"alcohol"},
{L"alege", L"allege"},
{L"allegaince", L"allegiance"},
{L"allmost", L"almost"},
// Ideally, this test should pass. It works in firefox, but not in hunspell
// or OS X.
// {L"alot", L"a lot"},
{L"amatuer", L"amateur"},
{L"ammend", L"amend"},
{L"amung", L"among"},
{L"anually", L"annually"},
{L"apparant", L"apparent"},
{L"artic", L"arctic"},
{L"arguement", L"argument"},
{L"athiest", L"atheist"},
{L"athelete", L"athlete"},
{L"avrage", L"average"},
{L"awfull", L"awful"},
{L"ballance", L"balance"},
{L"basicly", L"basically"},
{L"becuase", L"because"},
{L"becomeing", L"becoming"},
{L"befor", L"before"},
{L"begining", L"beginning"},
{L"beleive", L"believe"},
{L"bellweather", L"bellwether"},
{L"benifit", L"benefit"},
{L"bouy", L"buoy"},
{L"briliant", L"brilliant"},
{L"burgler", L"burglar"},
{L"camoflage", L"camouflage"},
{L"carefull", L"careful"},
{L"Carribean", L"Caribbean"},
{L"catagory", L"category"},
{L"cauhgt", L"caught"},
{L"cieling", L"ceiling"},
{L"cemetary", L"cemetery"},
{L"certin", L"certain"},
{L"changable", L"changeable"},
{L"cheif", L"chief"},
{L"citezen", L"citizen"},
{L"collaegue", L"colleague"},
{L"colum", L"column"},
{L"comming", L"coming"},
{L"commited", L"committed"},
{L"compitition", L"competition"},
{L"conceed", L"concede"},
{L"congradulate", L"congratulate"},
{L"consciencious", L"conscientious"},
{L"concious", L"conscious"},
{L"concensus", L"consensus"},
{L"contraversy", L"controversy"},
{L"conveniance", L"convenience"},
{L"critecize", L"criticize"},
{L"dacquiri", L"daiquiri"},
{L"decieve", L"deceive"},
{L"dicide", L"decide"},
{L"definate", L"definite"},
{L"definitly", L"definitely"},
{L"desparate", L"desperate"},
{L"develope", L"develop"},
{L"diffrence", L"difference"},
{L"disapear", L"disappear"},
{L"disapoint", L"disappoint"},
{L"disasterous", L"disastrous"},
{L"disipline", L"discipline"},
{L"drunkeness", L"drunkenness"},
{L"dumbell", L"dumbbell"},
{L"easely", L"easily"},
{L"eigth", L"eight"},
{L"embarass", L"embarrass"},
{L"enviroment", L"environment"},
{L"equiped", L"equipped"},
{L"equiptment", L"equipment"},
{L"exagerate", L"exaggerate"},
{L"exellent", L"excellent"},
{L"exsept", L"except"},
{L"exercize", L"exercise"},
{L"exilerate", L"exhilarate"},
{L"existance", L"existence"},
{L"experiance", L"experience"},
{L"experament", L"experiment"},
{L"explaination", L"explanation"},
{L"facinating", L"fascinating"},
{L"firey", L"fiery"},
{L"finaly", L"finally"},
{L"flourescent", L"fluorescent"},
{L"foriegn", L"foreign"},
{L"fourty", L"forty"},
{L"foreward", L"forward"},
{L"freind", L"friend"},
{L"fundemental", L"fundamental"},
{L"guage", L"gauge"},
{L"generaly", L"generally"},
{L"goverment", L"government"},
{L"gratefull", L"grateful"},
{L"garantee", L"guarantee"},
{L"guidence", L"guidance"},
{L"happyness", L"happiness"},
{L"harrass", L"harass"},
{L"heighth", L"height"},
{L"heirarchy", L"hierarchy"},
{L"humerous", L"humorous"},
{L"hygene", L"hygiene"},
{L"hipocrit", L"hypocrite"},
{L"idenity", L"identity"},
{L"ignorence", L"ignorance"},
{L"imaginery", L"imaginary"},
{L"immitate", L"imitate"},
{L"immitation", L"imitation"},
{L"imediately", L"immediately"},
{L"incidently", L"incidentally"},
{L"independant", L"independent"},
{L"indispensible", L"indispensable"},
{L"innoculate", L"inoculate"},
{L"inteligence", L"intelligence"},
{L"intresting", L"interesting"},
{L"interuption", L"interruption"},
{L"irrelevent", L"irrelevant"},
{L"irritible", L"irritable"},
{L"jellous", L"jealous"},
{L"knowlege", L"knowledge"},
{L"labratory", L"laboratory"},
{L"lenght", L"length"},
{L"liason", L"liaison"},
{L"libary", L"library"},
{L"lisence", L"license"},
{L"lonelyness", L"loneliness"},
{L"lieing", L"lying"},
{L"maintenence", L"maintenance"},
{L"manuever", L"maneuver"},
{L"marrige", L"marriage"},
{L"mathmatics", L"mathematics"},
{L"medcine", L"medicine"},
{L"miniture", L"miniature"},
{L"minite", L"minute"},
{L"mischevous", L"mischievous"},
{L"mispell", L"misspell"},
// Maybe this one should pass, as it works in hunspell, but not in firefox.
// {L"misterius", L"mysterious"},
{L"naturaly", L"naturally"},
{L"neccessary", L"necessary"},
{L"neice", L"niece"},
{L"nieghbor", L"neighbor"},
{L"nieghbour", L"neighbor"},
{L"niether", L"neither"},
{L"noticable", L"noticeable"},
{L"occassion", L"occasion"},
{L"occasionaly", L"occasionally"},
{L"occurrance", L"occurrence"},
{L"occured", L"occurred"},
{L"ommision", L"omission"},
{L"oppurtunity", L"opportunity"},
{L"outragous", L"outrageous"},
{L"parrallel", L"parallel"},
{L"parliment", L"parliament"},
{L"particurly", L"particularly"},
{L"passtime", L"pastime"},
{L"peculier", L"peculiar"},
{L"percieve", L"perceive"},
{L"pernament", L"permanent"},
{L"perseverence", L"perseverance"},
{L"personaly", L"personally"},
{L"persaude", L"persuade"},
{L"pichure", L"picture"},
{L"peice", L"piece"},
{L"plagerize", L"plagiarize"},
{L"playright", L"playwright"},
{L"plesant", L"pleasant"},
{L"pollitical", L"political"},
{L"posession", L"possession"},
{L"potatos", L"potatoes"},
{L"practicle", L"practical"},
{L"preceed", L"precede"},
{L"predjudice", L"prejudice"},
{L"presance", L"presence"},
{L"privelege", L"privilege"},
// This one should probably work. It does in FF and Hunspell.
// {L"probly", L"probably"},
{L"proffesional", L"professional"},
{L"promiss", L"promise"},
{L"pronounciation", L"pronunciation"},
{L"prufe", L"proof"},
{L"psycology", L"psychology"},
{L"publically", L"publicly"},
{L"quanity", L"quantity"},
{L"quarentine", L"quarantine"},
{L"questionaire", L"questionnaire"},
{L"readible", L"readable"},
{L"realy", L"really"},
{L"recieve", L"receive"},
{L"reciept", L"receipt"},
{L"reconize", L"recognize"},
{L"recomend", L"recommend"},
{L"refered", L"referred"},
{L"referance", L"reference"},
{L"relevent", L"relevant"},
{L"religous", L"religious"},
{L"repitition", L"repetition"},
{L"restarant", L"restaurant"},
{L"rythm", L"rhythm"},
{L"rediculous", L"ridiculous"},
{L"sacrefice", L"sacrifice"},
{L"saftey", L"safety"},
{L"sissors", L"scissors"},
{L"secratary", L"secretary"},
{L"seperate", L"separate"},
{L"sargent", L"sergeant"},
{L"shineing", L"shining"},
{L"similer", L"similar"},
{L"sinceerly", L"sincerely"},
{L"speach", L"speech"},
{L"stoping", L"stopping"},
{L"strenght", L"strength"},
{L"succesful", L"successful"},
{L"supercede", L"supersede"},
{L"surelly", L"surely"},
{L"suprise", L"surprise"},
{L"temperture", L"temperature"},
{L"temprary", L"temporary"},
{L"tommorrow", L"tomorrow"},
{L"tounge", L"tongue"},
{L"truely", L"truly"},
{L"twelth", L"twelfth"},
{L"tyrany", L"tyranny"},
{L"underate", L"underrate"},
{L"untill", L"until"},
{L"unuseual", L"unusual"},
{L"upholstry", L"upholstery"},
{L"usible", L"usable"},
{L"useing", L"using"},
{L"usualy", L"usually"},
{L"vaccuum", L"vacuum"},
{L"vegatarian", L"vegetarian"},
{L"vehical", L"vehicle"},
{L"visious", L"vicious"},
{L"villege", L"village"},
{L"wierd", L"weird"},
{L"wellcome", L"welcome"},
{L"wellfare", L"welfare"},
{L"wilfull", L"willful"},
{L"withold", L"withhold"},
{L"writting", L"writing"},
};
for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) {
std::vector<string16> suggestions;
size_t input_length = 0;
if (kTestCases[i].input != NULL) {
input_length = wcslen(kTestCases[i].input);
}
bool result = SpellCheckerPlatform::CheckSpelling(
WideToUTF16(kTestCases[i].input), 0);
EXPECT_FALSE(result);
SpellCheckerPlatform::FillSuggestionList(WideToUTF16(kTestCases[i].input),
&suggestions);
// Check if the suggested words occur.
bool suggested_word_is_present = false;
for (int j = 0; j < static_cast<int>(suggestions.size()); j++) {
if (suggestions.at(j).compare(WideToUTF16(kTestCases[i].suggested_word))
== 0) {
suggested_word_is_present = true;
break;
}
}
EXPECT_TRUE(suggested_word_is_present);
}
}