1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/webui/options/language_options_handler.h" 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "base/values.h" 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/input_method_configuration.h" 11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/input_method/mock_input_method_manager.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/webui/options/chromeos/cros_language_options_handler.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chromeos/ime/input_method_descriptor.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using chromeos::input_method::InputMethodDescriptor; 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using chromeos::input_method::InputMethodDescriptors; 18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using chromeos::input_method::MockInputMethodManager; 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace { 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class CrosLanguageOptionsHandlerTest : public testing::Test { 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CrosLanguageOptionsHandlerTest() { 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::input_method::InitializeForTesting(new MockInputMethodManager); 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual ~CrosLanguageOptionsHandlerTest() { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::input_method::Shutdown(); 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InputMethodDescriptors CreateInputMethodDescriptors() { 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InputMethodDescriptors descriptors; 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) descriptors.push_back(GetDesc("xkb:us::eng", "us", "en-US")); 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) descriptors.push_back(GetDesc("xkb:fr::fra", "fr", "fr")); 36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) descriptors.push_back(GetDesc("xkb:be::fra", "be", "fr")); 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) descriptors.push_back(GetDesc("xkb:is::ice", "is", "is")); 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) descriptors.push_back(GetDesc("mozc", "us", "ja")); 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return descriptors; 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InputMethodDescriptor GetDesc(const std::string& id, 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& raw_layout, 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& language_code) { 46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::vector<std::string> layouts; 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layouts.push_back(raw_layout); 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) std::vector<std::string> languages; 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) languages.push_back(language_code); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InputMethodDescriptor(id, 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) "", // name 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) layouts, 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) languages, 54a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) GURL()); // options page url 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(CrosLanguageOptionsHandlerTest, GetInputMethodList) { 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InputMethodDescriptors descriptors = CreateInputMethodDescriptors(); 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ListValue> list( 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::options::CrosLanguageOptionsHandler::GetInputMethodList( 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) descriptors)); 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_EQ(5U, list->GetSize()); 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DictionaryValue* entry = NULL; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DictionaryValue *language_code_set = NULL; 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string input_method_id; 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string display_name; 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string language_code; 72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // As shown below, the list should be input method ids should appear in 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // the same order of the descriptors. 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(list->GetDictionary(0, &entry)); 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetString("id", &input_method_id)); 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetString("displayName", &display_name)); 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetDictionary("languageCodeSet", &language_code_set)); 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("xkb:us::eng", input_method_id); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commented out as it depends on translation in generated_resources.grd 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // (i.e. makes the test fragile). 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // EXPECT_EQ("English (USA) keyboard layout", display_name); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(language_code_set->HasKey("en-US")); 84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(language_code_set->HasKey("id")); // From kExtraLanguages. 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(language_code_set->HasKey("fil")); // From kExtraLanguages. 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(list->GetDictionary(1, &entry)); 88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetString("id", &input_method_id)); 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetString("displayName", &display_name)); 90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetDictionary("languageCodeSet", &language_code_set)); 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("xkb:fr::fra", input_method_id); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commented out. See above. 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // EXPECT_EQ("French keyboard layout", display_name); 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(language_code_set->HasKey("fr")); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(list->GetDictionary(2, &entry)); 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetString("id", &input_method_id)); 98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetString("displayName", &display_name)); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetDictionary("languageCodeSet", &language_code_set)); 100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("xkb:be::fra", input_method_id); 101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commented out. See above. 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // EXPECT_EQ("Belgian keyboard layout", display_name); 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(language_code_set->HasKey("fr")); 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(list->GetDictionary(3, &entry)); 106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetString("id", &input_method_id)); 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetString("displayName", &display_name)); 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetDictionary("languageCodeSet", &language_code_set)); 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("xkb:is::ice", input_method_id); 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commented out. See above. 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // EXPECT_EQ("Japanese input method (for US keyboard)", display_name); 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(language_code_set->HasKey("is")); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(list->GetDictionary(4, &entry)); 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetString("id", &input_method_id)); 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetString("displayName", &display_name)); 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(entry->GetDictionary("languageCodeSet", &language_code_set)); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("mozc", input_method_id); 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Commented out. See above. 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // EXPECT_EQ("Japanese input method (for US keyboard)", display_name); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(language_code_set->HasKey("ja")); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(CrosLanguageOptionsHandlerTest, GetUILanguageList) { 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) InputMethodDescriptors descriptors = CreateInputMethodDescriptors(); 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<ListValue> list( 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) chromeos::options::CrosLanguageOptionsHandler::GetUILanguageList( 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) descriptors)); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < list->GetSize(); ++i) { 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) base::DictionaryValue* dict; 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(list->GetDictionary(i, &dict)); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string code; 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(dict->GetString("code", &code)); 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_NE("is", code) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << "Icelandic is an example language which has input method " 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) << "but can't use it as UI language."; 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 140