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 "chrome/browser/chromeos/input_method/input_method_util.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/bind.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/ime/extension_ime_util.h"
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/fake_input_method_delegate.h"
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_manager.h"
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_whitelist.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16;
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chromeos {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)extern const char* kExtensionImePrefix;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace input_method {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char pinyin_ime_id[] = "zh-t-i0-pinyin";
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const char zhuyin_ime_id[] = "zh-hant-t-i0-und";
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestableInputMethodUtil : public InputMethodUtil {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit TestableInputMethodUtil(InputMethodDelegate* delegate,
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   scoped_ptr<InputMethodDescriptors> methods)
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      : InputMethodUtil(delegate) {
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ResetInputMethods(*methods);
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Change access rights.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  using InputMethodUtil::GetInputMethodIdsFromLanguageCodeInternal;
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  using InputMethodUtil::GetKeyboardLayoutName;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class InputMethodUtilTest : public testing::Test {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  InputMethodUtilTest()
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : util_(&delegate_, whitelist_.GetSupportedInputMethods()) {
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    delegate_.set_get_localized_string_callback(
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&l10n_util::GetStringUTF16));
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    delegate_.set_get_display_language_name_callback(
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        base::Bind(&InputMethodUtilTest::GetDisplayLanguageName));
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void SetUp() OVERRIDE {
57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    InputMethodDescriptors input_methods;
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::vector<std::string> layouts;
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    std::vector<std::string> languages;
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    layouts.push_back("us");
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    languages.push_back("zh-CN");
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
6446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    InputMethodDescriptor pinyin_ime(Id(pinyin_ime_id),
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     "Pinyin input for testing",
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     "CN",
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     layouts,
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     languages,
69424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                     false,
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     GURL(""),
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     GURL(""));
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    input_methods.push_back(pinyin_ime);
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    languages.clear();
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    languages.push_back("zh-TW");
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    InputMethodDescriptor zhuyin_ime(zhuyin_ime_id,
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     "Zhuyin input for testing",
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     "TW",
79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     layouts,
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     languages,
81424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                     false,
82f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                     GURL(""),
83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                     GURL(""));
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    input_methods.push_back(zhuyin_ime);
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
8646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    util_.InitXkbInputMethodsForTesting();
8746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    util_.AppendInputMethods(input_methods);
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  std::string Id(const std::string& id) {
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return extension_ime_util::GetInputMethodIDByEngineID(id);
92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputMethodDescriptor GetDesc(const std::string& id,
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                const std::string& raw_layout,
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                const std::string& language_code,
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                const std::string& indicator) {
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    std::vector<std::string> layouts;
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    layouts.push_back(raw_layout);
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    std::vector<std::string> languages;
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    languages.push_back(language_code);
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return InputMethodDescriptor(Id(id),
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 "",         // Description.
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                 indicator,  // Short name used for indicator.
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 layouts,
1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                 languages,
107424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)                                 true,
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                 GURL(),   // options page url
109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                                 GURL());  // input view page url
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static base::string16 GetDisplayLanguageName(const std::string& language_code) {
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return l10n_util::GetDisplayNameForLocale(language_code, "en", true);
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  FakeInputMethodDelegate delegate_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InputMethodWhitelist whitelist_;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestableInputMethodUtil util_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, GetInputMethodShortNameTest) {
12246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Test invalid cases. Two-letter language code should be returned.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc = GetDesc("invalid-id", "us", "xx", "");
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Upper-case string of the unknown language code, "xx", should be returned.
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("XX"), util_.GetInputMethodShortName(desc));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Test special cases.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc =
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetDesc("xkb:us:dvorak:eng", "us", "en-US", "DV");
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("DV"), util_.GetInputMethodShortName(desc));
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc =
1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetDesc("xkb:us:colemak:eng", "us", "en-US", "CO");
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CO"), util_.GetInputMethodShortName(desc));
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InputMethodDescriptor desc =
1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetDesc("xkb:us:altgr-intl:eng", "us", "en-US", "EXTD");
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("EXTD"), util_.GetInputMethodShortName(desc));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc =
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetDesc("xkb:us:intl:eng", "us", "en-US", "INTL");
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("INTL"), util_.GetInputMethodShortName(desc));
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc =
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetDesc("xkb:de:neo:ger", "de(neo)", "de", "NEO");
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("NEO"), util_.GetInputMethodShortName(desc));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc =
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetDesc("xkb:es:cat:cat", "es(cat)", "ca", "CAS");
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("CAS"), util_.GetInputMethodShortName(desc));
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc =
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetDesc(pinyin_ime_id, "us", "zh-CN", "");
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("\xe6\x8b\xbc"),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodShortName(desc));
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
16746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    InputMethodDescriptor desc = GetDesc(zhuyin_ime_id, "us", "zh-TW", "");
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_EQ(base::UTF8ToUTF16("\xE6\xB3\xA8"),
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodShortName(desc));
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, GetInputMethodMediumNameTest) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // input methods with medium name equal to short name
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char * input_method_id[] = {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xkb:us:altgr-intl:eng",
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xkb:us:dvorak:eng",
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xkb:us:intl:eng",
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xkb:us:colemak:eng",
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xkb:de:neo:ger",
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xkb:es:cat:cat",
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "xkb:gb:dvorak:eng",
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int len = ARRAYSIZE_UNSAFE(input_method_id);
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i=0; i<len; ++i) {
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InputMethodDescriptor desc = GetDesc(input_method_id[i], "", "", "");
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16 medium_name = util_.GetInputMethodMediumName(desc);
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16 short_name = util_.GetInputMethodShortName(desc);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_EQ(medium_name,short_name);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // input methods with medium name not equal to short name
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const char * input_method_id[] = {
196eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      pinyin_ime_id,
197eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      zhuyin_ime_id,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    };
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const int len = ARRAYSIZE_UNSAFE(input_method_id);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (int i=0; i<len; ++i) {
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      InputMethodDescriptor desc = GetDesc(input_method_id[i], "", "", "");
202a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16 medium_name = util_.GetInputMethodMediumName(desc);
203a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      base::string16 short_name = util_.GetInputMethodShortName(desc);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EXPECT_NE(medium_name,short_name);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, GetInputMethodLongNameTest) {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // For most languages input method or keyboard layout name is returned.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See below for exceptions.
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc = GetDesc("xkb:jp::jpn", "jp", "ja", "");
214a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Japanese"),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodLongName(desc));
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InputMethodDescriptor desc =
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetDesc("xkb:us:dvorak:eng", "us(dvorak)", "en-US", "");
220a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("US Dvorak"),
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodLongName(desc));
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    InputMethodDescriptor desc =
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)        GetDesc("xkb:gb:dvorak:eng", "gb(dvorak)", "en-US", "");
226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("UK Dvorak"),
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodLongName(desc));
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
23046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // For Dutch, French, German and Hindi,
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // "language - keyboard layout" pair is returned.
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc = GetDesc("xkb:be::nld", "be", "nl", "");
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("Dutch - Belgian"),
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodLongName(desc));
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc = GetDesc("xkb:fr::fra", "fr", "fr", "");
239a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("French - French"),
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodLongName(desc));
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc = GetDesc("xkb:be::fra", "be", "fr", "");
244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("French - Belgian"),
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodLongName(desc));
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc = GetDesc("xkb:de::ger", "de", "de", "");
249a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("German - German"),
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodLongName(desc));
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc = GetDesc("xkb:be::ger", "be", "de", "");
254a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("German - Belgian"),
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodLongName(desc));
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    InputMethodDescriptor desc = GetDesc("invalid-id", "us", "xx", "");
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // You can safely ignore the "Resouce ID is not found for: invalid-id"
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // error.
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(ASCIIToUTF16("invalid-id"),
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              util_.GetInputMethodLongName(desc));
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestIsValidInputMethodId) {
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(util_.IsValidInputMethodId(Id("xkb:us:colemak:eng")));
26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_TRUE(util_.IsValidInputMethodId(Id(pinyin_ime_id)));
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(util_.IsValidInputMethodId("unsupported-input-method"));
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestIsKeyboardLayout) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(InputMethodUtil::IsKeyboardLayout("xkb:us::eng"));
27546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(InputMethodUtil::IsKeyboardLayout(Id(pinyin_ime_id)));
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestGetKeyboardLayoutName) {
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unsupported case.
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", util_.GetKeyboardLayoutName("UNSUPPORTED_ID"));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Supported cases (samples).
28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ("us", util_.GetKeyboardLayoutName(Id(pinyin_ime_id)));
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("es", util_.GetKeyboardLayoutName(Id("xkb:es::spa")));
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("es(cat)", util_.GetKeyboardLayoutName(Id("xkb:es:cat:cat")));
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("gb(extd)", util_.GetKeyboardLayoutName(Id("xkb:gb:extd:eng")));
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("us", util_.GetKeyboardLayoutName(Id("xkb:us::eng")));
288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("us(dvorak)", util_.GetKeyboardLayoutName(Id("xkb:us:dvorak:eng")));
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("us(colemak)",
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            util_.GetKeyboardLayoutName(Id("xkb:us:colemak:eng")));
291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ("de(neo)", util_.GetKeyboardLayoutName(Id("xkb:de:neo:ger")));
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestGetInputMethodDisplayNameFromId) {
295a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  EXPECT_EQ("US",
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            util_.GetInputMethodDisplayNameFromId("xkb:us::eng"));
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("", util_.GetInputMethodDisplayNameFromId("nonexistent"));
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestGetInputMethodDescriptorFromId) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(NULL, util_.GetInputMethodDescriptorFromId("non_existent"));
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const InputMethodDescriptor* descriptor =
30446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      util_.GetInputMethodDescriptorFromId(Id(pinyin_ime_id));
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != descriptor);  // ASSERT_NE doesn't compile.
30646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(Id(pinyin_ime_id), descriptor->id());
307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("us", descriptor->GetPreferredKeyboardLayout());
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This used to be "zh" but now we have "zh-CN" in input_methods.h,
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hence this should be zh-CN now.
3107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ASSERT_TRUE(!descriptor->language_codes().empty());
3117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  EXPECT_EQ("zh-CN", descriptor->language_codes().at(0));
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestGetInputMethodIdsForLanguageCode) {
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::multimap<std::string, std::string> language_code_to_ids_map;
316eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  language_code_to_ids_map.insert(std::make_pair("ja", pinyin_ime_id));
317eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  language_code_to_ids_map.insert(std::make_pair("ja", pinyin_ime_id));
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  language_code_to_ids_map.insert(std::make_pair("ja", "xkb:jp:jpn"));
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  language_code_to_ids_map.insert(std::make_pair("fr", "xkb:fr:fra"));
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> result;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(util_.GetInputMethodIdsFromLanguageCodeInternal(
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      language_code_to_ids_map, "ja", kAllInputMethods, &result));
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(3U, result.size());
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(util_.GetInputMethodIdsFromLanguageCodeInternal(
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      language_code_to_ids_map, "ja", kKeyboardLayoutsOnly, &result));
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, result.size());
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:jp:jpn", result[0]);
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(util_.GetInputMethodIdsFromLanguageCodeInternal(
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      language_code_to_ids_map, "fr", kAllInputMethods, &result));
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, result.size());
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:fr:fra", result[0]);
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(util_.GetInputMethodIdsFromLanguageCodeInternal(
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      language_code_to_ids_map, "fr", kKeyboardLayoutsOnly, &result));
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, result.size());
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("xkb:fr:fra", result[0]);
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(util_.GetInputMethodIdsFromLanguageCodeInternal(
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      language_code_to_ids_map, "invalid_lang", kAllInputMethods, &result));
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(util_.GetInputMethodIdsFromLanguageCodeInternal(
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      language_code_to_ids_map, "invalid_lang", kKeyboardLayoutsOnly, &result));
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// US keyboard + English US UI = US keyboard only.
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestGetFirstLoginInputMethodIds_Us_And_EnUs) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const InputMethodDescriptor* descriptor =
348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      util_.GetInputMethodDescriptorFromId(Id("xkb:us::eng"));  // US keyboard.
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != descriptor);  // ASSERT_NE doesn't compile.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> input_method_ids;
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  util_.GetFirstLoginInputMethodIds("en-US", *descriptor, &input_method_ids);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1U, input_method_ids.size());
353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(Id("xkb:us::eng"), input_method_ids[0]);
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
356c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// US keyboard + Chinese UI = US keyboard + Pinyin IME.
357c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(InputMethodUtilTest, TestGetFirstLoginInputMethodIds_Us_And_Zh) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const InputMethodDescriptor* descriptor =
359cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      util_.GetInputMethodDescriptorFromId(Id("xkb:us::eng"));  // US keyboard.
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != descriptor);  // ASSERT_NE doesn't compile.
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> input_method_ids;
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  util_.GetFirstLoginInputMethodIds("zh-CN", *descriptor, &input_method_ids);
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, input_method_ids.size());
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(Id("xkb:us::eng"), input_method_ids[0]);
36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(Id(pinyin_ime_id), input_method_ids[1]);  // Pinyin for US keybaord.
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// US keyboard + Russian UI = US keyboard + Russsian keyboard
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestGetFirstLoginInputMethodIds_Us_And_Ru) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const InputMethodDescriptor* descriptor =
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      util_.GetInputMethodDescriptorFromId(Id("xkb:us::eng"));  // US keyboard.
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != descriptor);  // ASSERT_NE doesn't compile.
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> input_method_ids;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  util_.GetFirstLoginInputMethodIds("ru", *descriptor, &input_method_ids);
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, input_method_ids.size());
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(Id("xkb:us::eng"), input_method_ids[0]);
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(Id("xkb:ru::rus"), input_method_ids[1]);  // Russian keyboard.
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
380ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch// US keyboard + Traditional Chinese = US keyboard + chewing.
381ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben MurdochTEST_F(InputMethodUtilTest, TestGetFirstLoginInputMethodIds_Us_And_ZhTw) {
382ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  const InputMethodDescriptor* descriptor =
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      util_.GetInputMethodDescriptorFromId(Id("xkb:us::eng"));  // US keyboard.
384ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_TRUE(NULL != descriptor);  // ASSERT_NE doesn't compile.
385ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  std::vector<std::string> input_method_ids;
386ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  util_.GetFirstLoginInputMethodIds("zh-TW", *descriptor, &input_method_ids);
387ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  ASSERT_EQ(2U, input_method_ids.size());
388cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(Id("xkb:us::eng"), input_method_ids[0]);
38946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(Id(zhuyin_ime_id), input_method_ids[1]);  // Chewing.
390ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}
391ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// US keyboard + Thai = US keyboard + kesmanee.
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestGetFirstLoginInputMethodIds_Us_And_Th) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const InputMethodDescriptor* descriptor =
395cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      util_.GetInputMethodDescriptorFromId(Id("xkb:us::eng"));  // US keyboard.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != descriptor);  // ASSERT_NE doesn't compile.
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> input_method_ids;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  util_.GetFirstLoginInputMethodIds("th", *descriptor, &input_method_ids);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, input_method_ids.size());
400cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(Id("xkb:us::eng"), input_method_ids[0]);
40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(Id("vkd_th"), input_method_ids[1]);  // Kesmanee.
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// US keyboard + Vietnamese = US keyboard + TCVN6064.
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestGetFirstLoginInputMethodIds_Us_And_Vi) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const InputMethodDescriptor* descriptor =
407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      util_.GetInputMethodDescriptorFromId(Id("xkb:us::eng"));  // US keyboard.
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_TRUE(NULL != descriptor);  // ASSERT_NE doesn't compile.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> input_method_ids;
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  util_.GetFirstLoginInputMethodIds("vi", *descriptor, &input_method_ids);
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2U, input_method_ids.size());
412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_EQ(Id("xkb:us::eng"), input_method_ids[0]);
41346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(Id("vkd_vi_tcvn"), input_method_ids[1]);  // TCVN6064.
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestGetLanguageCodesFromInputMethodIds) {
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> input_method_ids;
418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  input_method_ids.push_back(Id("xkb:us::eng"));        // English US.
419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  input_method_ids.push_back(Id("xkb:us:dvorak:eng"));  // English US Dvorak.
42046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  input_method_ids.push_back(Id(pinyin_ime_id));        // Pinyin
421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  input_method_ids.push_back(Id("xkb:fr::fra"));        // French France.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<std::string> language_codes;
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  util_.GetLanguageCodesFromInputMethodIds(input_method_ids, &language_codes);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(3U, language_codes.size());
42546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ("en", language_codes[0]);
426c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  EXPECT_EQ("zh-CN", language_codes[1]);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ("fr", language_codes[2]);
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Test all supported descriptors to detect a typo in input_methods.txt.
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(InputMethodUtilTest, TestIBusInputMethodText) {
43246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const std::map<std::string, InputMethodDescriptor>& id_to_descriptor =
43346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      util_.GetIdToDesciptorMapForTesting();
43446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  for (std::map<std::string, InputMethodDescriptor>::const_iterator it =
43546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)       id_to_descriptor.begin(); it != id_to_descriptor.end(); ++it) {
43646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    const std::string language_code = it->second.language_codes().at(0);
437a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16 display_name =
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        l10n_util::GetDisplayNameForLocale(language_code, "en", false);
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Only two formats, like "fr" (lower case) and "en-US" (lower-upper), are
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // allowed. See the text file for details.
44146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_TRUE(language_code == "fil" || language_code.length() == 2 ||
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                (language_code.length() == 5 && language_code[2] == '-'))
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Invalid language code " << language_code;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_TRUE(l10n_util::IsValidLocaleSyntax(language_code))
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Invalid language code " << language_code;
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_FALSE(display_name.empty())
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Invalid language code " << language_code;
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // On error, GetDisplayNameForLocale() returns the |language_code| as-is.
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    EXPECT_NE(language_code, base::UTF16ToUTF8(display_name))
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        << "Invalid language code " << language_code;
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Test the input method ID migration.
4551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(InputMethodUtilTest, TestInputMethodIDMigration) {
4561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  const char* const migration_cases[][2] = {
4571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {"ime:zh:pinyin", "zh-t-i0-pinyin"},
4581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {"ime:zh-t:zhuyin", "zh-hant-t-i0-und"},
4591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {"ime:zh-t:quick", "zh-hant-t-i0-cangjie-1987-x-m0-simplified"},
4601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {"ime:jp:mozc_us", "nacl_mozc_us"},
4611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {"ime:ko:hangul", "hangul_2set"},
4621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {"m17n:deva_phone", "vkd_deva_phone"},
4631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {"m17n:ar", "vkd_ar"},
4641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {"t13n:hi", "hi-t-i0-und"},
4651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      {"unknown", "unknown"},
4661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  };
4671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  std::vector<std::string> input_method_ids;
4681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < arraysize(migration_cases); ++i)
4691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    input_method_ids.push_back(migration_cases[i][0]);
4701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Duplicated hangul_2set.
4711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  input_method_ids.push_back("ime:ko:hangul_2set");
4721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  util_.MigrateInputMethods(&input_method_ids);
4741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  EXPECT_EQ(arraysize(migration_cases), input_method_ids.size());
4761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  for (size_t i = 0; i < arraysize(migration_cases); ++i) {
4771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    EXPECT_EQ(
4781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        extension_ime_util::GetInputMethodIDByEngineID(migration_cases[i][1]),
4791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        input_method_ids[i]);
4801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
4811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace input_method
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace chromeos
485