• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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