OLD | NEW |
| (Empty) |
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> | |
20 bool Compare(T a, T b) { | |
21 return a == b; | |
22 } | |
23 template <> | |
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> | |
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> | |
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|. | |
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. | |
101 TEST(LanguagePreferencesTest, TestDefaultValuesOfMultipleChoicePrefs) { | |
102 EXPECT_TRUE(CheckDefaultValueOfMultipleChoicePrefs( | |
103 kChewingMultipleChoicePrefs, kNumChewingMultipleChoicePrefs)); | |
104 EXPECT_TRUE(CheckDefaultValueOfMultipleChoicePrefs( | |
105 &kChewingHsuSelKeyType, 1)); | |
106 EXPECT_TRUE(CheckDefaultValueOfMultipleChoicePrefs( | |
107 &kPinyinDoublePinyinSchema, 1)); | |
108 EXPECT_TRUE(CheckDefaultValueOfMultipleChoicePrefs( | |
109 kMozcMultipleChoicePrefs, kNumMozcMultipleChoicePrefs)); | |
110 } | |
111 | |
112 // Checks |ibus_config_value| and |item_message_id| duplications in | |
113 // LanguageMultipleChoicePreference prefs. | |
114 TEST(LanguagePreferencesTest, TestDuplicationOfMultipleChoicePrefs) { | |
115 EXPECT_TRUE(CheckDuplicationOfMultipleChoicePrefs( | |
116 kChewingMultipleChoicePrefs, kNumChewingMultipleChoicePrefs)); | |
117 EXPECT_TRUE(CheckDuplicationOfMultipleChoicePrefs( | |
118 &kChewingHsuSelKeyType, 1)); | |
119 EXPECT_TRUE(CheckDuplicationOfMultipleChoicePrefs( | |
120 &kPinyinDoublePinyinSchema, 1)); | |
121 EXPECT_TRUE(CheckDuplicationOfMultipleChoicePrefs( | |
122 kMozcMultipleChoicePrefs, kNumMozcMultipleChoicePrefs)); | |
123 } | |
124 | |
125 // Checks |default_pref_value| in LanguageIntegerRangePreference prefs. | |
126 TEST(LanguagePreferencesTest, TestDefaultValuesOfIntegerRangePrefs) { | |
127 EXPECT_TRUE(CheckDefaultValueOfIntegerRangePrefs( | |
128 kChewingIntegerPrefs, kNumChewingIntegerPrefs)); | |
129 EXPECT_TRUE(CheckDefaultValueOfIntegerRangePrefs( | |
130 kMozcIntegerPrefs, kNumMozcIntegerPrefs)); | |
131 } | |
132 | |
133 } // namespace language_prefs | |
134 } // namespace chromeos | |
OLD | NEW |