spellcheck_worditerator_unittest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/format_macros.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/string_split.h" 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h" 11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/renderer/spellchecker/spellcheck_worditerator.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestCase { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* language; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool allow_contraction; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t* expected_words; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests whether or not our SpellcheckWordIterator can extract only words used 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// by the specified language from a multi-language text. 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SpellcheckWordIteratorTest, SplitWord) { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // An input text. This text includes words of several languages. (Some words 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are not separated with whitespace characters.) Our SpellcheckWordIterator 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // should extract only the words used by the specified language from this text 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // and normalize them so our spell-checker can check their spellings. 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t kTestText[] = 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Graphic characters 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"!@#$%^&*()" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Latin (including a contraction character and a ligature). 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"hello:hello a\xFB03x" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Greek 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x03B3\x03B5\x03B9\x03AC\x0020\x03C3\x03BF\x03C5" 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Cyrillic 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0437\x0434\x0440\x0430\x0432\x0441\x0442\x0432" 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0443\x0439\x0442\x0435" 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hebrew (including niqquds) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x05e9\x05c1\x05b8\x05dc\x05d5\x05b9\x05dd " 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hebrew words with U+0027 and U+05F3 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x05e6\x0027\x05d9\x05e4\x05e1 \x05e6\x05F3\x05d9\x05e4\x05e1 " 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hebrew words with U+0022 and U+05F4 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x05e6\x05d4\x0022\x05dc \x05e6\x05d4\x05f4\x05dc " 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hebrew words enclosed with ASCII quotes. 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\"\x05e6\x05d4\x0022\x05dc\" '\x05e9\x05c1\x05b8\x05dc\x05d5'" 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Arabic (including vowel marks) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0627\x064e\x0644\x0633\x064e\x0651\x0644\x0627" 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0645\x064f\x0020\x0639\x064e\x0644\x064e\x064a" 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0652\x0643\x064f\x0645\x0652" 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hindi 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0930\x093E\x091C\x0927\x093E\x0928" 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Thai 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0e2a\x0e27\x0e31\x0e2a\x0e14\x0e35\x0020\x0e04" 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0e23\x0e31\x0e1a" 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hiraganas 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x3053\x3093\x306B\x3061\x306F" 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // CJKV ideographs 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x4F60\x597D" 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hangul Syllables 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\xC548\xB155\xD558\xC138\xC694" 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Full-width latin : Hello 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\xFF28\xFF45\xFF4C\xFF4C\xFF4F " 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"e.g.,"; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The languages and expected results used in this test. 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const TestCase kTestCases[] = { 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // English (keep contraction words) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "en-US", true, L"hello:hello affix Hello e.g" 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // English (split contraction words) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "en-US", false, L"hello hello affix Hello e g" 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Greek 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "el-GR", true, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x03B3\x03B5\x03B9\x03AC\x0020\x03C3\x03BF\x03C5" 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Russian 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ru-RU", true, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0437\x0434\x0440\x0430\x0432\x0441\x0442\x0432" 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0443\x0439\x0442\x0435" 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hebrew 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "he-IL", true, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x05e9\x05dc\x05d5\x05dd " 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x05e6\x0027\x05d9\x05e4\x05e1 \x05e6\x05F3\x05d9\x05e4\x05e1 " 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x05e6\x05d4\x0022\x05dc \x05e6\x05d4\x05f4\x05dc " 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x05e6\x05d4\x0022\x05dc \x05e9\x05dc\x05d5" 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Arabic 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ar", true, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0627\x0644\x0633\x0644\x0627\x0645\x0020\x0639" 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0644\x064a\x0643\x0645" 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hindi 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hi-IN", true, 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0930\x093E\x091C\x0927\x093E\x0928" 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Thai 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "th-TH", true, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0e2a\x0e27\x0e31\x0e2a\x0e14\x0e35\x0020\x0e04" 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x0e23\x0e31\x0e1a" 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Korean 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ko-KR", true, 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x110b\x1161\x11ab\x1102\x1167\x11bc\x1112\x1161" 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) L"\x1109\x1166\x110b\x116d" 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < arraysize(kTestCases); ++i) { 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(base::StringPrintf("kTestCases[%" PRIuS "]: language=%s", i, 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestCases[i].language)); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellcheckCharAttribute attributes; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attributes.SetDefaultLanguage(kTestCases[i].language); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 input(WideToUTF16(kTestText)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellcheckWordIterator iterator; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(iterator.Initialize(&attributes, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestCases[i].allow_contraction)); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(iterator.SetText(input.c_str(), input.length())); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<base::string16> expected_words; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::SplitString( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WideToUTF16(kTestCases[i].expected_words), ' ', &expected_words); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 actual_word; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int actual_start, actual_end; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_t index = 0; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (iterator.GetNextWord(&actual_word, &actual_start, &actual_end)) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(index < expected_words.size()); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (index < expected_words.size()) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_words[index], actual_word); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++index; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests whether our SpellcheckWordIterator extracts an empty word without 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// getting stuck in an infinite loop when inputting a Khmer text. (This is a 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// regression test for Issue 46278.) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SpellcheckWordIteratorTest, RuleSetConsistency) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellcheckCharAttribute attributes; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attributes.SetDefaultLanguage("en-US"); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t kTestText[] = L"\x1791\x17c1\x002e"; 152a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 input(WideToUTF16(kTestText)); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellcheckWordIterator iterator; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(iterator.Initialize(&attributes, true)); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(iterator.SetText(input.c_str(), input.length())); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // When SpellcheckWordIterator uses an inconsistent ICU ruleset, the following 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // iterator.GetNextWord() call gets stuck in an infinite loop. Therefore, this 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test succeeds if this call returns without timeouts. 161a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 actual_word; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int actual_start, actual_end; 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(iterator.GetNextWord(&actual_word, &actual_start, &actual_end)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, actual_start); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0, actual_end); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Vertify our SpellcheckWordIterator can treat ASCII numbers as word characters 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on LTR languages. On the other hand, it should not treat ASCII numbers as 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// word characters on RTL languages because they change the text direction from 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RTL to LTR. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(SpellcheckWordIteratorTest, TreatNumbersAsWordCharacters) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A set of a language, a dummy word, and a text direction used in this test. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // For each language, this test splits a dummy word, which consists of ASCII 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // numbers and an alphabet of the language, into words. When ASCII numbers are 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // treated as word characters, the split word becomes equal to the dummy word. 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Otherwise, the split word does not include ASCII numbers. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const struct { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char* language; 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const wchar_t* text; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool left_to_right; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } kTestCases[] = { 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // English 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "en-US", L"0123456789" L"a", true, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Greek 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "el-GR", L"0123456789" L"\x03B1", true, 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Russian 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ru-RU", L"0123456789" L"\x0430", true, 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hebrew 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "he-IL", L"0123456789" L"\x05D0", false, 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Arabic 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ar", L"0123456789" L"\x0627", false, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hindi 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "hi-IN", L"0123456789" L"\x0905", true, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Thai 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "th-TH", L"0123456789" L"\x0e01", true, 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, { 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Korean 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "ko-KR", L"0123456789" L"\x1100\x1161", true, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestCases); ++i) { 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SCOPED_TRACE(base::StringPrintf("kTestCases[%" PRIuS "]: language=%s", i, 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kTestCases[i].language)); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellcheckCharAttribute attributes; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) attributes.SetDefaultLanguage(kTestCases[i].language); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 input_word(WideToUTF16(kTestCases[i].text)); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SpellcheckWordIterator iterator; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(iterator.Initialize(&attributes, true)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(iterator.SetText(input_word.c_str(), input_word.length())); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 actual_word; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int actual_start, actual_end; 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(iterator.GetNextWord(&actual_word, &actual_start, &actual_end)); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (kTestCases[i].left_to_right) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(input_word, actual_word); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_NE(input_word, actual_word); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST(SpellcheckWordIteratorTest, Initialization) { 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test initialization works when a default language is set. 2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellcheckCharAttribute attributes; 2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) attributes.SetDefaultLanguage("en-US"); 2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellcheckWordIterator iterator; 2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(iterator.Initialize(&attributes, true)); 2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Test initialization fails when no default language is set. 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) { 2442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellcheckCharAttribute attributes; 2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SpellcheckWordIterator iterator; 2472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(iterator.Initialize(&attributes, true)); 2482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 250