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)
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 input(base::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(
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        base::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";
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  base::string16 input(base::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)
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::string16 input_word(base::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