OLD | NEW |
---|---|
(Empty) | |
1 // Copyright (c) 2011 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 "base/basictypes.h" | |
6 #include "base/string16.h" | |
7 #include "base/utf_string_conversions.h" | |
8 #include "chrome/common/plural_formatter.h" | |
9 #include "testing/gtest/include/gtest/gtest.h" | |
10 #include "testing/platform_test.h" | |
11 #include "ui/base/l10n/l10n_util.h" | |
12 | |
13 namespace { | |
14 | |
15 enum MsgId { | |
16 MSG_ZERO = 0, | |
17 MSG_ONE, | |
18 MSG_TWO, | |
19 MSG_FEW, | |
20 MSG_MANY, | |
21 MSG_OTHER | |
22 }; | |
23 | |
24 struct MsgCode { | |
25 int id; | |
26 int test_value; | |
27 const char *format; | |
28 const char *expected_string; | |
29 }; | |
30 | |
31 const int message_ids[] = { | |
32 MSG_ZERO, | |
33 MSG_ONE, | |
34 MSG_TWO, | |
35 MSG_FEW, | |
36 MSG_MANY, | |
37 MSG_OTHER | |
38 }; | |
39 | |
40 const MsgCode codes[] = { | |
41 { MSG_ZERO, 0, "zero = # is zero", "zero = 0 is zero" }, | |
42 { MSG_ONE, 1, "one = # is one", "one = 1 is one" }, | |
43 { MSG_TWO, 2, "two = # is a pair", "two = 2 is a pair" }, | |
44 { MSG_FEW, 3, "few = # is a few", "few = 3 is a few" }, | |
45 { MSG_MANY, 15, "many = # is many", "many = 15 is many" }, | |
46 { MSG_OTHER, 123, "number = # is a lot", "number = 123 is a lot" } | |
47 }; | |
48 | |
49 std::string GetTestString(int msg_id) { | |
50 return codes[msg_id].format; | |
51 } | |
52 | |
53 std::string GetExpectedString(int msg_id) { | |
54 return codes[msg_id].expected_string; | |
55 } | |
56 | |
57 } // namespace | |
58 | |
59 // Icu could be doing some platform-specific things, so we make this a | |
60 // platform test. | |
61 class PluralFormatterTest : public PlatformTest { | |
62 protected: | |
63 virtual void SetUp() { | |
64 PlatformTest::SetUp(); | |
65 PluralFormatter::SetOverrideLocale("en"); | |
66 PluralFormatter::SetStringSource(GetTestString); | |
67 } | |
68 | |
69 virtual void TearDown() { | |
70 PluralFormatter::SetOverrideLocale(NULL); | |
71 PluralFormatter::SetStringSource(l10n_util::GetStringUTF8); | |
72 PlatformTest::TearDown(); | |
73 } | |
74 }; | |
75 | |
76 #define TEST_MESSAGE_USED(msg) \ | |
Paweł Hajdan Jr.
2011/03/25 09:32:19
Do we really need to have macros for those? How ab
Greg Spencer (Chromium)
2011/03/25 23:05:31
Good point! Done.
| |
77 { \ | |
78 std::string result = UTF16ToUTF8( \ | |
79 formatter.GetPluralString(codes[msg].test_value)); \ | |
80 std::string expected = GetExpectedString(msg); \ | |
81 EXPECT_STREQ(expected.c_str(), result.c_str()); \ | |
82 } | |
83 | |
84 #define TEST_MESSAGE_NOT_USED(msg) \ | |
85 { \ | |
86 std::string result = UTF16ToUTF8( \ | |
87 formatter.GetPluralString(codes[msg].test_value)); \ | |
88 std::string expected = GetExpectedString(msg); \ | |
89 EXPECT_STRNE(expected.c_str(), result.c_str()); \ | |
90 } | |
91 | |
92 TEST_F(PluralFormatterTest, Basic) { | |
93 PluralFormatter formatter(message_ids); | |
94 TEST_MESSAGE_USED(MSG_OTHER); | |
95 } | |
96 | |
97 // Testing the following locales: en fr ar cs ga hr ja kn ko lt lv pl ro ru | |
98 // sk sl tr uk vi zh_CN zh_TW | |
99 // | |
100 // Most of these are locales that have interesting rules regarding | |
101 // plurals (and I threw in en and fr just to make sure nothing's wonky | |
102 // with simpler locales). | |
103 | |
104 TEST_F(PluralFormatterTest, TestLocales) { | |
105 { | |
106 PluralFormatter::SetOverrideLocale("en"); | |
107 PluralFormatter formatter(message_ids); | |
108 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
109 TEST_MESSAGE_USED(MSG_ONE); | |
110 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
111 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
112 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
113 TEST_MESSAGE_USED(MSG_OTHER); | |
114 } | |
115 | |
116 { | |
117 PluralFormatter::SetOverrideLocale("fr"); | |
118 PluralFormatter formatter(message_ids); | |
119 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
120 TEST_MESSAGE_USED(MSG_ONE); | |
121 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
122 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
123 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
124 TEST_MESSAGE_USED(MSG_OTHER); | |
125 } | |
126 | |
127 { | |
128 PluralFormatter::SetOverrideLocale("ar"); | |
129 PluralFormatter formatter(message_ids); | |
130 TEST_MESSAGE_USED(MSG_ZERO); | |
131 TEST_MESSAGE_USED(MSG_ONE); | |
132 TEST_MESSAGE_USED(MSG_TWO); | |
133 TEST_MESSAGE_USED(MSG_FEW); | |
134 TEST_MESSAGE_USED(MSG_MANY); | |
135 TEST_MESSAGE_NOT_USED(MSG_OTHER); | |
136 } | |
137 | |
138 { | |
139 PluralFormatter::SetOverrideLocale("cs"); | |
140 PluralFormatter formatter(message_ids); | |
141 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
142 TEST_MESSAGE_USED(MSG_ONE); | |
143 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
144 TEST_MESSAGE_USED(MSG_FEW); | |
145 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
146 TEST_MESSAGE_USED(MSG_OTHER); | |
147 } | |
148 | |
149 { | |
150 PluralFormatter::SetOverrideLocale("ga"); | |
151 PluralFormatter formatter(message_ids); | |
152 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
153 TEST_MESSAGE_USED(MSG_ONE); | |
154 TEST_MESSAGE_USED(MSG_TWO); | |
155 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
156 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
157 TEST_MESSAGE_USED(MSG_OTHER); | |
158 } | |
159 | |
160 { | |
161 PluralFormatter::SetOverrideLocale("hr"); | |
162 PluralFormatter formatter(message_ids); | |
163 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
164 TEST_MESSAGE_USED(MSG_ONE); | |
165 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
166 TEST_MESSAGE_USED(MSG_FEW); | |
167 TEST_MESSAGE_USED(MSG_MANY); | |
168 TEST_MESSAGE_NOT_USED(MSG_OTHER); | |
169 } | |
170 | |
171 { | |
172 PluralFormatter::SetOverrideLocale("ja"); | |
173 PluralFormatter formatter(message_ids); | |
174 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
175 TEST_MESSAGE_NOT_USED(MSG_ONE); | |
176 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
177 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
178 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
179 TEST_MESSAGE_USED(MSG_OTHER); | |
180 } | |
181 | |
182 { | |
183 PluralFormatter::SetOverrideLocale("kn"); | |
184 PluralFormatter formatter(message_ids); | |
185 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
186 TEST_MESSAGE_NOT_USED(MSG_ONE); | |
187 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
188 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
189 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
190 TEST_MESSAGE_USED(MSG_OTHER); | |
191 } | |
192 | |
193 { | |
194 PluralFormatter::SetOverrideLocale("ko"); | |
195 PluralFormatter formatter(message_ids); | |
196 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
197 TEST_MESSAGE_NOT_USED(MSG_ONE); | |
198 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
199 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
200 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
201 TEST_MESSAGE_USED(MSG_OTHER); | |
202 } | |
203 | |
204 { | |
205 PluralFormatter::SetOverrideLocale("lt"); | |
206 PluralFormatter formatter(message_ids); | |
207 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
208 TEST_MESSAGE_USED(MSG_ONE); | |
209 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
210 TEST_MESSAGE_USED(MSG_FEW); | |
211 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
212 TEST_MESSAGE_NOT_USED(MSG_OTHER); | |
213 } | |
214 | |
215 { | |
216 PluralFormatter::SetOverrideLocale("lv"); | |
217 PluralFormatter formatter(message_ids); | |
218 TEST_MESSAGE_USED(MSG_ZERO); | |
219 TEST_MESSAGE_USED(MSG_ONE); | |
220 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
221 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
222 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
223 TEST_MESSAGE_USED(MSG_OTHER); | |
224 } | |
225 | |
226 { | |
227 PluralFormatter::SetOverrideLocale("pl"); | |
228 PluralFormatter formatter(message_ids); | |
229 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
230 TEST_MESSAGE_USED(MSG_ONE); | |
231 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
232 TEST_MESSAGE_USED(MSG_FEW); | |
233 TEST_MESSAGE_USED(MSG_MANY); | |
234 TEST_MESSAGE_NOT_USED(MSG_OTHER); | |
235 } | |
236 | |
237 { | |
238 PluralFormatter::SetOverrideLocale("ro"); | |
239 PluralFormatter formatter(message_ids); | |
240 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
241 TEST_MESSAGE_USED(MSG_ONE); | |
242 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
243 TEST_MESSAGE_USED(MSG_FEW); | |
244 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
245 TEST_MESSAGE_USED(MSG_OTHER); | |
246 } | |
247 | |
248 { | |
249 PluralFormatter::SetOverrideLocale("ru"); | |
250 PluralFormatter formatter(message_ids); | |
251 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
252 TEST_MESSAGE_USED(MSG_ONE); | |
253 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
254 TEST_MESSAGE_USED(MSG_FEW); | |
255 TEST_MESSAGE_USED(MSG_MANY); | |
256 TEST_MESSAGE_NOT_USED(MSG_OTHER); | |
257 } | |
258 | |
259 { | |
260 PluralFormatter::SetOverrideLocale("sk"); | |
261 PluralFormatter formatter(message_ids); | |
262 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
263 TEST_MESSAGE_USED(MSG_ONE); | |
264 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
265 TEST_MESSAGE_USED(MSG_FEW); | |
266 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
267 TEST_MESSAGE_USED(MSG_OTHER); | |
268 } | |
269 | |
270 { | |
271 PluralFormatter::SetOverrideLocale("sl"); | |
272 PluralFormatter formatter(message_ids); | |
273 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
274 TEST_MESSAGE_USED(MSG_ONE); | |
275 TEST_MESSAGE_USED(MSG_TWO); | |
276 TEST_MESSAGE_USED(MSG_FEW); | |
277 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
278 TEST_MESSAGE_USED(MSG_OTHER); | |
279 } | |
280 | |
281 { | |
282 PluralFormatter::SetOverrideLocale("tr"); | |
283 PluralFormatter formatter(message_ids); | |
284 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
285 TEST_MESSAGE_NOT_USED(MSG_ONE); | |
286 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
287 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
288 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
289 TEST_MESSAGE_USED(MSG_OTHER); | |
290 } | |
291 | |
292 { | |
293 PluralFormatter::SetOverrideLocale("uk"); | |
294 PluralFormatter formatter(message_ids); | |
295 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
296 TEST_MESSAGE_USED(MSG_ONE); | |
297 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
298 TEST_MESSAGE_USED(MSG_FEW); | |
299 TEST_MESSAGE_USED(MSG_MANY); | |
300 TEST_MESSAGE_NOT_USED(MSG_OTHER); | |
301 } | |
302 | |
303 { | |
304 PluralFormatter::SetOverrideLocale("vi"); | |
305 PluralFormatter formatter(message_ids); | |
306 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
307 TEST_MESSAGE_NOT_USED(MSG_ONE); | |
308 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
309 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
310 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
311 TEST_MESSAGE_USED(MSG_OTHER); | |
312 } | |
313 | |
314 { | |
315 PluralFormatter::SetOverrideLocale("zh_CN"); | |
316 PluralFormatter formatter(message_ids); | |
317 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
318 TEST_MESSAGE_NOT_USED(MSG_ONE); | |
319 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
320 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
321 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
322 TEST_MESSAGE_USED(MSG_OTHER); | |
323 } | |
324 | |
325 { | |
326 PluralFormatter::SetOverrideLocale("zh_TW"); | |
327 PluralFormatter formatter(message_ids); | |
328 TEST_MESSAGE_NOT_USED(MSG_ZERO); | |
329 TEST_MESSAGE_NOT_USED(MSG_ONE); | |
330 TEST_MESSAGE_NOT_USED(MSG_TWO); | |
331 TEST_MESSAGE_NOT_USED(MSG_FEW); | |
332 TEST_MESSAGE_NOT_USED(MSG_MANY); | |
333 TEST_MESSAGE_USED(MSG_OTHER); | |
334 } | |
335 } | |
OLD | NEW |