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