| Index: chrome/renderer/spellchecker/spellcheck_unittest.cc
|
| diff --git a/chrome/renderer/spellchecker/spellcheck_unittest.cc b/chrome/renderer/spellchecker/spellcheck_unittest.cc
|
| index 34886aa2469ceff7d1f0f40296a8a6a2cf35ed10..0e36c245e9a32f79d94bdd8c02b6dc1b022e7478 100644
|
| --- a/chrome/renderer/spellchecker/spellcheck_unittest.cc
|
| +++ b/chrome/renderer/spellchecker/spellcheck_unittest.cc
|
| @@ -17,6 +17,8 @@
|
| #include "third_party/WebKit/public/web/WebTextCheckingCompletion.h"
|
| #include "third_party/WebKit/public/web/WebTextCheckingResult.h"
|
|
|
| +#define TYPOGRAPHICAL_APOSTROPHE L"\x2019"
|
| +
|
| namespace {
|
|
|
| base::FilePath GetHunspellDirectory() {
|
| @@ -80,6 +82,10 @@ class SpellCheckTest : public testing::Test {
|
| base::ASCIIToUTF16(word), tag);
|
| }
|
|
|
| + bool IsValidContraction(const base::string16& word, int tag) {
|
| + return spell_check_->spellcheck_.IsValidContraction(word, tag);
|
| + }
|
| +
|
| #if !defined(OS_MACOSX)
|
| protected:
|
| void TestSpellCheckParagraph(
|
| @@ -201,7 +207,7 @@ TEST_F(SpellCheckTest, SpellCheckStrings_EN_US) {
|
| // A valid English contraction
|
| {L"isn't", true},
|
| // A valid English contraction with a typographical apostrophe.
|
| - {L"isn\x2019t", true},
|
| + {L"isn" TYPOGRAPHICAL_APOSTROPHE L"t", true},
|
| // A valid English word enclosed with underscores.
|
| {L"_hello_", true},
|
|
|
| @@ -1140,7 +1146,7 @@ TEST_F(SpellCheckTest, CreateTextCheckingResults) {
|
| text,
|
| spellcheck_results,
|
| &textcheck_results);
|
| - EXPECT_EQ(spellcheck_results.size(), textcheck_results.size());
|
| + ASSERT_EQ(spellcheck_results.size(), textcheck_results.size());
|
| EXPECT_EQ(blink::WebTextDecorationTypeSpelling,
|
| textcheck_results[0].decoration);
|
| EXPECT_EQ(spellcheck_results[0].location, textcheck_results[0].location);
|
| @@ -1160,12 +1166,78 @@ TEST_F(SpellCheckTest, CreateTextCheckingResults) {
|
| text,
|
| spellcheck_results,
|
| &textcheck_results);
|
| - EXPECT_EQ(spellcheck_results.size(), textcheck_results.size());
|
| + ASSERT_EQ(spellcheck_results.size(), textcheck_results.size());
|
| EXPECT_EQ(blink::WebTextDecorationTypeGrammar,
|
| textcheck_results[0].decoration);
|
| EXPECT_EQ(spellcheck_results[0].location, textcheck_results[0].location);
|
| EXPECT_EQ(spellcheck_results[0].length, textcheck_results[0].length);
|
| }
|
| +
|
| + // Verify that the SpellCheck preserves the original apostrophe type in the
|
| + // checked text, regardless of the type of apostrophe the browser returns.
|
| + {
|
| + base::string16 text = base::WideToUTF16(
|
| + L"Ik've havn" TYPOGRAPHICAL_APOSTROPHE L"t ni'n"
|
| + TYPOGRAPHICAL_APOSTROPHE L"out-s I've I" TYPOGRAPHICAL_APOSTROPHE
|
| + L"ve");
|
| + std::vector<SpellCheckResult> spellcheck_results;
|
| +
|
| + // All typewriter apostrophe results.
|
| + spellcheck_results.push_back(SpellCheckResult(
|
| + SpellCheckResult::SPELLING, 0, 5, base::UTF8ToUTF16("I've")));
|
| + spellcheck_results.push_back(SpellCheckResult(
|
| + SpellCheckResult::SPELLING, 6, 6, base::UTF8ToUTF16("haven't")));
|
| + spellcheck_results.push_back(SpellCheckResult(
|
| + SpellCheckResult::SPELLING, 13, 10, base::UTF8ToUTF16("in'n'out's")));
|
| +
|
| + // Replacements that differ only by apostrophe type should be ignored.
|
| + spellcheck_results.push_back(SpellCheckResult(
|
| + SpellCheckResult::SPELLING, 24, 4, base::UTF8ToUTF16("I've")));
|
| + spellcheck_results.push_back(SpellCheckResult(
|
| + SpellCheckResult::SPELLING, 29, 4, base::UTF8ToUTF16("I've")));
|
| +
|
| + // All typographical apostrophe results.
|
| + spellcheck_results.push_back(SpellCheckResult(
|
| + SpellCheckResult::SPELLING, 0, 5,
|
| + base::WideToUTF16(L"I" TYPOGRAPHICAL_APOSTROPHE L"ve")));
|
| + spellcheck_results.push_back(SpellCheckResult(
|
| + SpellCheckResult::SPELLING, 6, 6,
|
| + base::WideToUTF16(L"haven" TYPOGRAPHICAL_APOSTROPHE L"t")));
|
| + spellcheck_results.push_back(SpellCheckResult(
|
| + SpellCheckResult::SPELLING, 13, 10, base::WideToUTF16(
|
| + L"in" TYPOGRAPHICAL_APOSTROPHE L"n" TYPOGRAPHICAL_APOSTROPHE L"out"
|
| + TYPOGRAPHICAL_APOSTROPHE L"s")));
|
| +
|
| + // Replacements that differ only by apostrophe type should be ignored.
|
| + spellcheck_results.push_back(SpellCheckResult(
|
| + SpellCheckResult::SPELLING, 24, 4,
|
| + base::WideToUTF16(L"I" TYPOGRAPHICAL_APOSTROPHE L"ve")));
|
| + spellcheck_results.push_back(SpellCheckResult(
|
| + SpellCheckResult::SPELLING, 29, 4,
|
| + base::WideToUTF16(L"I" TYPOGRAPHICAL_APOSTROPHE L"ve")));
|
| +
|
| + blink::WebVector<blink::WebTextCheckingResult> textcheck_results;
|
| + spell_check()->CreateTextCheckingResults(SpellCheck::USE_NATIVE_CHECKER, 0,
|
| + text, spellcheck_results,
|
| + &textcheck_results);
|
| +
|
| + static const wchar_t* kExpectedReplacements[] = {
|
| + L"I've",
|
| + L"haven" TYPOGRAPHICAL_APOSTROPHE L"t",
|
| + L"in'n" TYPOGRAPHICAL_APOSTROPHE L"out's",
|
| + L"I've",
|
| + L"haven" TYPOGRAPHICAL_APOSTROPHE L"t",
|
| + L"in'n" TYPOGRAPHICAL_APOSTROPHE L"out" TYPOGRAPHICAL_APOSTROPHE L"s",
|
| + };
|
| +
|
| + ASSERT_EQ(arraysize(kExpectedReplacements), textcheck_results.size());
|
| + for (size_t i = 0; i < arraysize(kExpectedReplacements); ++i) {
|
| + EXPECT_EQ(base::WideToUTF16(kExpectedReplacements[i]),
|
| + textcheck_results[i].replacement)
|
| + << "i=" << i << "\nactual: \""
|
| + << base::string16(textcheck_results[i].replacement) << "\"";
|
| + }
|
| + }
|
| }
|
|
|
| #endif
|
| @@ -1373,3 +1445,24 @@ TEST_F(SpellCheckTest, LogicalSuggestions) {
|
| EXPECT_EQ(suggestions[0], base::ASCIIToUTF16(kTestCases[i].suggestion));
|
| }
|
| }
|
| +
|
| +// Words with apostrophes should be valid contractions.
|
| +TEST_F(SpellCheckTest, IsValidContraction) {
|
| + static const char* kLanguages[] = {
|
| + "en-AU",
|
| + "en-CA",
|
| + "en-GB",
|
| + "en-US",
|
| + };
|
| +
|
| + static const wchar_t* kWords[] = {
|
| + L"in'n'out",
|
| + L"in" TYPOGRAPHICAL_APOSTROPHE L"n" TYPOGRAPHICAL_APOSTROPHE L"out",
|
| + };
|
| +
|
| + for (size_t i = 0; i < arraysize(kLanguages); ++i) {
|
| + ReinitializeSpellCheck(kLanguages[i]);
|
| + for (size_t j = 0; j < arraysize(kWords); ++j)
|
| + EXPECT_TRUE(IsValidContraction(base::WideToUTF16(kWords[j]), 0));
|
| + }
|
| +}
|
|
|