1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "chrome/browser/chromeos/language_preferences.h"
6
7 #include <cstring>
8 #include <set>
9
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace chromeos {
13 namespace language_prefs {
14
15 namespace {
16
17 // Compares |a| and |b| and returns true if a is equal to b. The second one is a
18 // specialized function for LanguageMultipleChoicePreference<const char*>.
19 template <typename T>
Compare(T a,T b)20 bool Compare(T a, T b) {
21 return a == b;
22 }
23 template <>
Compare(const char * a,const char * b)24 bool Compare<const char*>(const char* a, const char* b) {
25 return !std::strcmp(a, b);
26 }
27
28 // Returns false if one or more prefs have a bad |default_pref_value|.
29 // C++ template is used here since LanguageMultipleChoicePreference is a class
30 // template.
31 template <typename T>
CheckDefaultValueOfMultipleChoicePrefs(const LanguageMultipleChoicePreference<T> * prefs,size_t prefs_len)32 bool CheckDefaultValueOfMultipleChoicePrefs(
33 const LanguageMultipleChoicePreference<T>* prefs, size_t prefs_len) {
34 const size_t kMaxItems = LanguageMultipleChoicePreference<T>::kMaxItems;
35 for (size_t i = 0; i < prefs_len; ++i) {
36 bool default_value_is_valid = false;
37 for (size_t j = 0; j < kMaxItems; ++j) {
38 const LanguageMultipleChoicePreference<T>& pref = prefs[i];
39 if (pref.values_and_ids[j].item_message_id == 0) {
40 break;
41 }
42 if (Compare(pref.default_pref_value,
43 pref.values_and_ids[j].ibus_config_value)) {
44 default_value_is_valid = true;
45 }
46 }
47 if (!default_value_is_valid) {
48 return false;
49 }
50 }
51 return true;
52 }
53
54 // Returns false if |prefs| has duplicated |ibus_config_value| or
55 // |item_message_id|.
56 template <typename T>
CheckDuplicationOfMultipleChoicePrefs(const LanguageMultipleChoicePreference<T> * prefs,size_t prefs_len)57 bool CheckDuplicationOfMultipleChoicePrefs(
58 const LanguageMultipleChoicePreference<T>* prefs, size_t prefs_len) {
59 const size_t kMaxItems = LanguageMultipleChoicePreference<T>::kMaxItems;
60 for (size_t i = 0; i < prefs_len; ++i) {
61 std::set<T> ibus_config_value_set;
62 std::set<int> item_message_id_set;
63 for (size_t j = 0; j < kMaxItems; ++j) {
64 const LanguageMultipleChoicePreference<T>& pref = prefs[i];
65 if (pref.values_and_ids[j].item_message_id == 0) {
66 break;
67 }
68 const T ibus_config_value = pref.values_and_ids[j].ibus_config_value;
69 if (!ibus_config_value_set.insert(ibus_config_value).second) {
70 // |ibus_config_value| is already in the set.
71 return false;
72 }
73 const int item_message_id = pref.values_and_ids[j].item_message_id;
74 if (!item_message_id_set.insert(item_message_id).second) {
75 // |item_message_id| is already in the set.
76 return false;
77 }
78 }
79 }
80 return true;
81 }
82
83 // Returns false if one or more prefs have an out-of-range |default_pref_value|.
CheckDefaultValueOfIntegerRangePrefs(const LanguageIntegerRangePreference * prefs,size_t prefs_len)84 bool CheckDefaultValueOfIntegerRangePrefs(
85 const LanguageIntegerRangePreference* prefs, size_t prefs_len) {
86 for (size_t i = 0; i < prefs_len; ++i) {
87 const LanguageIntegerRangePreference& pref = prefs[i];
88 if (pref.default_pref_value < pref.min_pref_value) {
89 return false;
90 }
91 if (pref.default_pref_value > pref.max_pref_value) {
92 return false;
93 }
94 }
95 return true;
96 }
97
98 } // namespace
99
100 // Checks |default_pref_value| in LanguageMultipleChoicePreference prefs.
TEST(LanguagePreferencesTest,TestDefaultValuesOfMultipleChoicePrefs)101 TEST(LanguagePreferencesTest, TestDefaultValuesOfMultipleChoicePrefs) {
102 EXPECT_TRUE(CheckDefaultValueOfMultipleChoicePrefs(
103 kChewingMultipleChoicePrefs, kNumChewingMultipleChoicePrefs));
104 EXPECT_TRUE(CheckDefaultValueOfMultipleChoicePrefs(
105 &kXkbModifierMultipleChoicePrefs, 1));
106 EXPECT_TRUE(CheckDefaultValueOfMultipleChoicePrefs(
107 &kChewingHsuSelKeyType, 1));
108 EXPECT_TRUE(CheckDefaultValueOfMultipleChoicePrefs(
109 &kPinyinDoublePinyinSchema, 1));
110 EXPECT_TRUE(CheckDefaultValueOfMultipleChoicePrefs(
111 kMozcMultipleChoicePrefs, kNumMozcMultipleChoicePrefs));
112 }
113
114 // Checks |ibus_config_value| and |item_message_id| duplications in
115 // LanguageMultipleChoicePreference prefs.
TEST(LanguagePreferencesTest,TestDuplicationOfMultipleChoicePrefs)116 TEST(LanguagePreferencesTest, TestDuplicationOfMultipleChoicePrefs) {
117 EXPECT_TRUE(CheckDuplicationOfMultipleChoicePrefs(
118 kChewingMultipleChoicePrefs, kNumChewingMultipleChoicePrefs));
119 EXPECT_TRUE(CheckDuplicationOfMultipleChoicePrefs(
120 &kXkbModifierMultipleChoicePrefs, 1));
121 EXPECT_TRUE(CheckDuplicationOfMultipleChoicePrefs(
122 &kChewingHsuSelKeyType, 1));
123 EXPECT_TRUE(CheckDuplicationOfMultipleChoicePrefs(
124 &kPinyinDoublePinyinSchema, 1));
125 EXPECT_TRUE(CheckDuplicationOfMultipleChoicePrefs(
126 kMozcMultipleChoicePrefs, kNumMozcMultipleChoicePrefs));
127 }
128
129 // Checks |default_pref_value| in LanguageIntegerRangePreference prefs.
TEST(LanguagePreferencesTest,TestDefaultValuesOfIntegerRangePrefs)130 TEST(LanguagePreferencesTest, TestDefaultValuesOfIntegerRangePrefs) {
131 EXPECT_TRUE(CheckDefaultValueOfIntegerRangePrefs(
132 kChewingIntegerPrefs, kNumChewingIntegerPrefs));
133 EXPECT_TRUE(CheckDefaultValueOfIntegerRangePrefs(
134 kMozcIntegerPrefs, kNumMozcIntegerPrefs));
135 }
136
137 } // namespace language_prefs
138 } // namespace chromeos
139