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