Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5778)

Unified Diff: chrome/renderer/spellcheck_unittest.cc

Issue 8176: Move the spellcheck unittest into browser next to the file (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 12 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome/browser/spellcheck_unittest.cc ('k') | chrome/test/unit/unittests.vcproj » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/renderer/spellcheck_unittest.cc
===================================================================
--- chrome/renderer/spellcheck_unittest.cc (revision 3969)
+++ chrome/renderer/spellcheck_unittest.cc (working copy)
@@ -1,487 +0,0 @@
-// Copyright (c) 2006-2008 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 "webkit/glue/webkit_glue.h"
-
-#include "base/file_util.h"
-#include "base/message_loop.h"
-#include "base/path_service.h"
-#include "chrome/browser/spellchecker.h"
-#include "chrome/common/chrome_paths.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace {
-class SpellCheckTest : public testing::Test {
- private:
- MessageLoop message_loop_;
-};
-
-const std::wstring kTempCustomDictionaryFile(L"temp_custom_dictionary.txt");
-
-} // namespace
-
-// Represents a special initialization function used only for the unit tests
-// in this file.
-extern void InitHunspellWithFiles(FILE* file_aff_hunspell,
- FILE* file_dic_hunspell);
-
-// Operates unit tests for the webkit_glue::SpellCheckWord() function
-// with the US English dictionary.
-// The unit tests in this function consist of:
-// * Tests for the function with empty strings;
-// * Tests for the function with a valid English word;
-// * Tests for the function with a valid non-English word;
-// * Tests for the function with a valid English word with a preceding
-// space character;
-// * Tests for the function with a valid English word with a preceding
-// non-English word;
-// * Tests for the function with a valid English word with a following
-// space character;
-// * Tests for the function with a valid English word with a following
-// non-English word;
-// * Tests for the function with two valid English words concatenated
-// with space characters or non-English words;
-// * Tests for the function with an invalid English word;
-// * Tests for the function with an invalid English word with a preceding
-// space character;
-// * Tests for the function with an invalid English word with a preceding
-// non-English word;
-// * Tests for the function with2 an invalid English word with a following
-// space character;
-// * Tests for the function with an invalid English word with a following
-// non-English word, and;
-// * Tests for the function with two invalid English words concatenated
-// with space characters or non-English words.
-// A test with a "[ROBUSTNESS]" mark shows it is a robustness test and it uses
-// grammartically incorrect string.
-// TODO(hbono): Please feel free to add more tests.
-TEST_F(SpellCheckTest, SpellCheckStrings_EN_US) {
- static const struct {
- // A string to be tested.
- const wchar_t* input;
- // An expected result for this test case.
- // * true: the input string does not have any invalid words.
- // * false: the input string has one or more invalid words.
- bool expected_result;
- // The position and the length of the first invalid word.
- int misspelling_start;
- int misspelling_length;
- } kTestCases[] = {
- // Empty strings.
- {NULL, true, 0, 0},
- {L"", true, 0, 0},
- {L" ", true, 0, 0},
- {L"\xA0", true, 0, 0},
- {L"\x3000", true, 0, 0},
-
- // A valid English word "hello".
- {L"hello", true, 0, 0},
- // A valid Chinese word (meaning "hello") consisiting of two CJKV
- // ideographs
- {L"\x4F60\x597D", true, 0, 0},
- // A valid Korean word (meaning "hello") consisting of five hangul
- // syllables
- {L"\xC548\xB155\xD558\xC138\xC694", true, 0, 0},
- // A valid Japanese word (meaning "hello") consisting of five Hiragana
- // letters
- {L"\x3053\x3093\x306B\x3061\x306F", true, 0, 0},
- // A valid Hindi word (meaning ?) consisting of six Devanagari letters
- // (This word is copied from "http://b/issue?id=857583".)
- {L"\x0930\x093E\x091C\x0927\x093E\x0928", true, 0, 0},
- // A valid English word "affix" using a Latin ligature 'ffi'
- {L"a\xFB03x", true, 0, 0},
- // A valid English word "hello" (fullwidth version)
- {L"\xFF28\xFF45\xFF4C\xFF4C\xFF4F", true, 0, 0},
- // Two valid Greek words (meaning "hello") consisting of seven Greek
- // letters
- {L"\x03B3\x03B5\x03B9\x03AC" L" " L"\x03C3\x03BF\x03C5", true, 0, 0},
- // A valid Russian word (meainng "hello") consisting of twelve Cyrillic
- // letters
- {L"\x0437\x0434\x0440\x0430\x0432\x0441"
- L"\x0442\x0432\x0443\x0439\x0442\x0435", true, 0, 0},
- // A valid English contraction
- {L"isn't", true, 0, 0},
- // A valid English word enclosed with underscores.
- {L"_hello_", true, 0, 0},
-
- // A valid English word with a preceding whitespace
- {L" " L"hello", true, 0, 0},
- // A valid English word with a preceding no-break space
- {L"\xA0" L"hello", true, 0, 0},
- // A valid English word with a preceding ideographic space
- {L"\x3000" L"hello", true, 0, 0},
- // A valid English word with a preceding Chinese word
- {L"\x4F60\x597D" L"hello", true, 0, 0},
- // [ROBUSTNESS] A valid English word with a preceding Korean word
- {L"\xC548\xB155\xD558\xC138\xC694" L"hello", true, 0, 0},
- // A valid English word with a preceding Japanese word
- {L"\x3053\x3093\x306B\x3061\x306F" L"hello", true, 0, 0},
- // [ROBUSTNESS] A valid English word with a preceding Hindi word
- {L"\x0930\x093E\x091C\x0927\x093E\x0928" L"hello", true, 0, 0},
- // [ROBUSTNESS] A valid English word with two preceding Greek words
- {L"\x03B3\x03B5\x03B9\x03AC" L" " L"\x03C3\x03BF\x03C5"
- L"hello", true, 0, 0},
- // [ROBUSTNESS] A valid English word with a preceding Russian word
- {L"\x0437\x0434\x0440\x0430\x0432\x0441"
- L"\x0442\x0432\x0443\x0439\x0442\x0435" L"hello", true, 0, 0},
-
- // A valid English word with a following whitespace
- {L"hello" L" ", true, 0, 0},
- // A valid English word with a following no-break space
- {L"hello" L"\xA0", true, 0, 0},
- // A valid English word with a following ideographic space
- {L"hello" L"\x3000", true, 0, 0},
- // A valid English word with a following Chinese word
- {L"hello" L"\x4F60\x597D", true, 0, 0},
- // [ROBUSTNESS] A valid English word with a following Korean word
- {L"hello" L"\xC548\xB155\xD558\xC138\xC694", true, 0, 0},
- // A valid English word with a following Japanese word
- {L"hello" L"\x3053\x3093\x306B\x3061\x306F", true, 0, 0},
- // [ROBUSTNESS] A valid English word with a following Hindi word
- {L"hello" L"\x0930\x093E\x091C\x0927\x093E\x0928", true, 0, 0},
- // [ROBUSTNESS] A valid English word with two following Greek words
- {L"hello"
- L"\x03B3\x03B5\x03B9\x03AC" L" " L"\x03C3\x03BF\x03C5", true, 0, 0},
- // [ROBUSTNESS] A valid English word with a following Russian word
- {L"hello" L"\x0437\x0434\x0440\x0430\x0432\x0441"
- L"\x0442\x0432\x0443\x0439\x0442\x0435", true, 0, 0},
-
- // Two valid English words concatenated with a whitespace
- {L"hello" L" " L"hello", true, 0, 0},
- // Two valid English words concatenated with a no-break space
- {L"hello" L"\xA0" L"hello", true, 0, 0},
- // Two valid English words concatenated with an ideographic space
- {L"hello" L"\x3000" L"hello", true, 0, 0},
- // Two valid English words concatenated with a Chinese word
- {L"hello" L"\x4F60\x597D" L"hello", true, 0, 0},
- // [ROBUSTNESS] Two valid English words concatenated with a Korean word
- {L"hello" L"\xC548\xB155\xD558\xC138\xC694" L"hello", true, 0, 0},
- // Two valid English words concatenated with a Japanese word
- {L"hello" L"\x3053\x3093\x306B\x3061\x306F" L"hello", true, 0, 0},
- // [ROBUSTNESS] Two valid English words concatenated with a Hindi word
- {L"hello" L"\x0930\x093E\x091C\x0927\x093E\x0928" L"hello" , true, 0, 0},
- // [ROBUSTNESS] Two valid English words concatenated with two Greek words
- {L"hello" L"\x03B3\x03B5\x03B9\x03AC" L" " L"\x03C3\x03BF\x03C5"
- L"hello", true, 0, 0},
- // [ROBUSTNESS] Two valid English words concatenated with a Russian word
- {L"hello" L"\x0437\x0434\x0440\x0430\x0432\x0441"
- L"\x0442\x0432\x0443\x0439\x0442\x0435" L"hello", true, 0, 0},
- // [ROBUSTNESS] Two valid English words concatenated with a contraction
- // character.
- {L"hello:hello", true, 0, 0},
-
- // An invalid English word
- {L"ifmmp", false, 0, 5},
- // An invalid English word "bffly" containing a Latin ligature 'ffl'
- {L"b\xFB04y", false, 0, 3},
- // An invalid English word "ifmmp" (fullwidth version)
- {L"\xFF29\xFF46\xFF4D\xFF4D\xFF50", false, 0, 5},
- // An invalid English contraction
- {L"jtm'u", false, 0, 5},
- // An invalid English word enclosed with underscores.
- {L"_ifmmp_", false, 1, 5},
-
- // An invalid English word with a preceding whitespace
- {L" " L"ifmmp", false, 1, 5},
- // An invalid English word with a preceding no-break space
- {L"\xA0" L"ifmmp", false, 1, 5},
- // An invalid English word with a preceding ideographic space
- {L"\x3000" L"ifmmp", false, 1, 5},
- // An invalid English word with a preceding Chinese word
- {L"\x4F60\x597D" L"ifmmp", false, 2, 5},
- // [ROBUSTNESS] An invalid English word with a preceding Korean word
- {L"\xC548\xB155\xD558\xC138\xC694" L"ifmmp", false, 5, 5},
- // An invalid English word with a preceding Japanese word
- {L"\x3053\x3093\x306B\x3061\x306F" L"ifmmp", false, 5, 5},
- // [ROBUSTNESS] An invalid English word with a preceding Hindi word
- {L"\x0930\x093E\x091C\x0927\x093E\x0928" L"ifmmp", false, 6, 5},
- // [ROBUSTNESS] An invalid English word with two preceding Greek words
- {L"\x03B3\x03B5\x03B9\x03AC" L" " L"\x03C3\x03BF\x03C5"
- L"ifmmp", false, 8, 5},
- // [ROBUSTNESS] An invalid English word with a preceding Russian word
- {L"\x0437\x0434\x0440\x0430\x0432\x0441"
- L"\x0442\x0432\x0443\x0439\x0442\x0435" L"ifmmp", false, 12, 5},
-
- // An invalid English word with a following whitespace
- {L"ifmmp" L" ", false, 0, 5},
- // An invalid English word with a following no-break space
- {L"ifmmp" L"\xA0", false, 0, 5},
- // An invalid English word with a following ideographic space
- {L"ifmmp" L"\x3000", false, 0, 5},
- // An invalid English word with a following Chinese word
- {L"ifmmp" L"\x4F60\x597D", false, 0, 5},
- // [ROBUSTNESS] An invalid English word with a following Korean word
- {L"ifmmp" L"\xC548\xB155\xD558\xC138\xC694", false, 0, 5},
- // An invalid English word with a following Japanese word
- {L"ifmmp" L"\x3053\x3093\x306B\x3061\x306F", false, 0, 5},
- // [ROBUSTNESS] An invalid English word with a following Hindi word
- {L"ifmmp" L"\x0930\x093E\x091C\x0927\x093E\x0928", false, 0, 5},
- // [ROBUSTNESS] An invalid English word with two following Greek words
- {L"ifmmp"
- L"\x03B3\x03B5\x03B9\x03AC" L" " L"\x03C3\x03BF\x03C5", false, 0, 5},
- // [ROBUSTNESS] An invalid English word with a following Russian word
- {L"ifmmp" L"\x0437\x0434\x0440\x0430\x0432\x0441"
- L"\x0442\x0432\x0443\x0439\x0442\x0435", false, 0, 5},
-
- // Two invalid English words concatenated with a whitespace
- {L"ifmmp" L" " L"ifmmp", false, 0, 5},
- // Two invalid English words concatenated with a no-break space
- {L"ifmmp" L"\xA0" L"ifmmp", false, 0, 5},
- // Two invalid English words concatenated with an ideographic space
- {L"ifmmp" L"\x3000" L"ifmmp", false, 0, 5},
- // Two invalid English words concatenated with a Chinese word
- {L"ifmmp" L"\x4F60\x597D" L"ifmmp", false, 0, 5},
- // [ROBUSTNESS] Two invalid English words concatenated with a Korean word
- {L"ifmmp" L"\xC548\xB155\xD558\xC138\xC694" L"ifmmp", false, 0, 5},
- // Two invalid English words concatenated with a Japanese word
- {L"ifmmp" L"\x3053\x3093\x306B\x3061\x306F" L"ifmmp", false, 0, 5},
- // [ROBUSTNESS] Two invalid English words concatenated with a Hindi word
- {L"ifmmp" L"\x0930\x093E\x091C\x0927\x093E\x0928" L"ifmmp" , false, 0, 5},
- // [ROBUSTNESS] Two invalid English words concatenated with two Greek words
- {L"ifmmp" L"\x03B3\x03B5\x03B9\x03AC" L" " L"\x03C3\x03BF\x03C5"
- L"ifmmp", false, 0, 5},
- // [ROBUSTNESS] Two invalid English words concatenated with a Russian word
- {L"ifmmp" L"\x0437\x0434\x0440\x0430\x0432\x0441"
- L"\x0442\x0432\x0443\x0439\x0442\x0435" L"ifmmp", false, 0, 5},
- // [ROBUSTNESS] Two invalid English words concatenated with a contraction
- // character.
- {L"ifmmp:ifmmp", false, 0, 11},
- };
-
- std::wstring hunspell_directory;
- ASSERT_TRUE(PathService::Get(chrome::DIR_APP_DICTIONARIES,
- &hunspell_directory));
-
- scoped_refptr<SpellChecker> spell_checker(new SpellChecker(
- hunspell_directory, L"en-US", NULL, L""));
-
- for (int i = 0; i < arraysize(kTestCases); i++) {
- size_t input_length = 0;
- if (kTestCases[i].input != NULL) {
- input_length = wcslen(kTestCases[i].input);
- }
- int misspelling_start;
- int misspelling_length;
- bool result = spell_checker->SpellCheckWord(kTestCases[i].input,
- static_cast<int>(input_length),
- &misspelling_start,
- &misspelling_length, NULL);
-
- EXPECT_EQ(result, kTestCases[i].expected_result);
- EXPECT_EQ(misspelling_start, kTestCases[i].misspelling_start);
- EXPECT_EQ(misspelling_length, kTestCases[i].misspelling_length);
- }
-}
-
-
-TEST_F(SpellCheckTest, SpellCheckSuggestions_EN_US) {
- static const struct {
- // A string to be tested.
- const wchar_t* input;
- // An expected result for this test case.
- // * true: the input string does not have any invalid words.
- // * false: the input string has one or more invalid words.
- bool expected_result;
- // The position and the length of the first invalid word.
- int misspelling_start;
- int misspelling_length;
-
- // A suggested word that should occur.
- const wchar_t* suggested_word;
- } kTestCases[] = { // A valid English word with a preceding whitespace
- {L"ello", false, 0, 0, L"hello"},
- {L"ello", false, 0, 0, L"cello"},
- {L"wate", false, 0, 0, L"water"},
- {L"wate", false, 0, 0, L"waste"},
- {L"wate", false, 0, 0, L"sate"},
- {L"wate", false, 0, 0, L"rate"},
- {L"jum", false, 0, 0, L"jump"},
- {L"jum", false, 0, 0, L"rum"},
- {L"jum", false, 0, 0, L"sum"},
- {L"jum", false, 0, 0, L"tum"},
- // TODO (Sidchat): add many more examples.
- };
-
- std::wstring hunspell_directory;
- ASSERT_TRUE(PathService::Get(chrome::DIR_APP_DICTIONARIES,
- &hunspell_directory));
-
- scoped_refptr<SpellChecker> spell_checker(new SpellChecker(
- hunspell_directory, L"en-US", NULL, L""));
-
- for (int i = 0; i < arraysize(kTestCases); i++) {
- std::vector<std::wstring> suggestions;
- size_t input_length = 0;
- if (kTestCases[i].input != NULL) {
- input_length = wcslen(kTestCases[i].input);
- }
- int misspelling_start;
- int misspelling_length;
- bool result = spell_checker->SpellCheckWord(kTestCases[i].input,
- static_cast<int>(input_length),
- &misspelling_start,
- &misspelling_length,
- &suggestions);
-
- // Check for spelling.
- EXPECT_EQ(result, kTestCases[i].expected_result);
-
- // 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(kTestCases[i].suggested_word) == 0) {
- suggested_word_is_present = true;
- break;
- }
- }
-
- EXPECT_TRUE(suggested_word_is_present);
- }
-}
-
-// This test Adds words to the SpellChecker and veifies that it remembers them.
-TEST_F(SpellCheckTest, DISABLED_SpellCheckAddToDictionary_EN_US) {
- static const struct {
- // A string to be added to SpellChecker.
- const wchar_t* word_to_add;
- } kTestCases[] = { // word to be added to SpellChecker
- {L"Googley"},
- {L"Googleplex"},
- {L"Googler"},
- };
-
- std::wstring hunspell_directory;
- ASSERT_TRUE(PathService::Get(chrome::DIR_APP_DICTIONARIES,
- &hunspell_directory));
-
- scoped_refptr<SpellChecker> spell_checker(new SpellChecker(
- hunspell_directory, L"en-US", NULL, kTempCustomDictionaryFile));
-
- for (int i = 0; i < arraysize(kTestCases); i++) {
- // Add the word to spellchecker.
- spell_checker->AddWord(std::wstring(kTestCases[i].word_to_add));
-
- // Now check whether it is added to Spellchecker.
- std::vector<std::wstring> suggestions;
- size_t input_length = 0;
- if (kTestCases[i].word_to_add != NULL) {
- input_length = wcslen(kTestCases[i].word_to_add);
- }
- int misspelling_start;
- int misspelling_length;
- bool result = spell_checker->SpellCheckWord(kTestCases[i].word_to_add,
- static_cast<int>(input_length),
- &misspelling_start,
- &misspelling_length,
- &suggestions);
-
- // Check for spelling.
- EXPECT_TRUE(result);
- }
-
- // Now initialize another spellchecker to see that AddToWord is permanent.
- scoped_refptr<SpellChecker> spell_checker_new(new SpellChecker(
- hunspell_directory, L"en-US", NULL, kTempCustomDictionaryFile));
-
- for (int i = 0; i < arraysize(kTestCases); i++) {
- // Now check whether it is added to Spellchecker.
- std::vector<std::wstring> suggestions;
- size_t input_length = 0;
- if (kTestCases[i].word_to_add != NULL) {
- input_length = wcslen(kTestCases[i].word_to_add);
- }
- int misspelling_start;
- int misspelling_length;
- bool result = spell_checker_new->SpellCheckWord(
- kTestCases[i].word_to_add,
- static_cast<int>(input_length),
- &misspelling_start,
- &misspelling_length,
- &suggestions);
-
- // Check for spelling.
- EXPECT_TRUE(result);
- }
-
- // Remove the temp custom dictionary file.
- file_util::Delete(kTempCustomDictionaryFile, false);
-}
-
-// SpellChecker should suggest custome words for misspelled words.
-TEST_F(SpellCheckTest, DISABLED_SpellCheckSuggestionsAddToDictionary_EN_US) {
- static const struct {
- // A string to be added to SpellChecker.
- const wchar_t* word_to_add;
- } kTestCases[] = { // word to be added to SpellChecker
- {L"Googley"},
- {L"Googleplex"},
- {L"Googler"},
- };
-
- std::wstring hunspell_directory;
- ASSERT_TRUE(PathService::Get(chrome::DIR_APP_DICTIONARIES,
- &hunspell_directory));
-
- scoped_refptr<SpellChecker> spell_checker(new SpellChecker(
- hunspell_directory, L"en-US", NULL, kTempCustomDictionaryFile));
-
- for (int i = 0; i < arraysize(kTestCases); i++) {
- // Add the word to spellchecker.
- spell_checker->AddWord(std::wstring(kTestCases[i].word_to_add));
- }
-
- // Now check to see whether the custom words are suggested for
- // misspelled but similar words.
- static const struct {
- // A string to be tested.
- const wchar_t* input;
- // An expected result for this test case.
- // * true: the input string does not have any invalid words.
- // * false: the input string has one or more invalid words.
- bool expected_result;
- // The position and the length of the first invalid word.
- int misspelling_start;
- int misspelling_length;
-
- // A suggested word that should occur.
- const wchar_t* suggested_word;
- } kTestCasesToBeTested[] = {
- {L"oogley", false, 0, 0, L"Googley"},
- {L"oogler", false, 0, 0, L"Googler"},
- {L"oogleplex", false, 0, 0, L"Googleplex"},
- };
-
- for (int i = 0; i < arraysize(kTestCasesToBeTested); i++) {
- std::vector<std::wstring> suggestions;
- size_t input_length = 0;
- if (kTestCasesToBeTested[i].input != NULL) {
- input_length = wcslen(kTestCasesToBeTested[i].input);
- }
- int misspelling_start;
- int misspelling_length;
- bool result = spell_checker->SpellCheckWord(kTestCasesToBeTested[i].input,
- static_cast<int>(input_length),
- &misspelling_start,
- &misspelling_length,
- &suggestions);
-
- // Check for spelling.
- EXPECT_EQ(result, kTestCasesToBeTested[i].expected_result);
-
- // 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(kTestCasesToBeTested[i].suggested_word) ==
- 0) {
- suggested_word_is_present = true;
- break;
- }
- }
-
- EXPECT_TRUE(suggested_word_is_present);
- }
-
- // Remove the temp custom dictionary file.
- file_util::Delete(kTempCustomDictionaryFile, false);
-}
« no previous file with comments | « chrome/browser/spellcheck_unittest.cc ('k') | chrome/test/unit/unittests.vcproj » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698