Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(112)

Side by Side Diff: chrome/common/l10n_util_unittest.cc

Issue 109043: Move l10n_util to app/ (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « chrome/common/l10n_util_posix.cc ('k') | chrome/common/l10n_util_win.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2006-2008 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 "build/build_config.h"
6
7 #include "base/basictypes.h"
8 #include "base/file_util.h"
9 #include "base/path_service.h"
10 #include "base/stl_util-inl.h"
11 #include "base/string_util.h"
12 #if defined(OS_WIN)
13 #include "base/win_util.h"
14 #endif
15 #include "chrome/common/chrome_paths.h"
16 #include "chrome/common/l10n_util.h"
17 #if !defined(OS_MACOSX)
18 #include "chrome/test/data/resource.h"
19 #endif
20 #include "testing/gtest/include/gtest/gtest.h"
21 #include "testing/platform_test.h"
22 #include "unicode/locid.h"
23
24 namespace {
25
26 class StringWrapper {
27 public:
28 explicit StringWrapper(const std::wstring& string) : string_(string) {}
29 const std::wstring& string() const { return string_; }
30
31 private:
32 std::wstring string_;
33
34 DISALLOW_COPY_AND_ASSIGN(StringWrapper);
35 };
36
37 l10n_util::TextDirection GetTextDirection(const char* locale_name) {
38 return l10n_util::GetTextDirectionForLocale(locale_name);
39 }
40
41 } // namespace
42
43 class L10nUtilTest : public PlatformTest {
44 };
45
46 #if defined(OS_WIN)
47 TEST_F(L10nUtilTest, GetString) {
48 std::wstring s = l10n_util::GetString(IDS_SIMPLE);
49 EXPECT_EQ(std::wstring(L"Hello World!"), s);
50
51 s = l10n_util::GetStringF(IDS_PLACEHOLDERS, L"chrome", L"10");
52 EXPECT_EQ(std::wstring(L"Hello, chrome. Your number is 10."), s);
53
54 s = l10n_util::GetStringF(IDS_PLACEHOLDERS_2, 20);
55 EXPECT_EQ(std::wstring(L"You owe me $20."), s);
56 }
57 #endif // defined(OS_WIN)
58
59 TEST_F(L10nUtilTest, TruncateString) {
60 std::wstring string(L"foooooey bxxxar baz");
61
62 // Make sure it doesn't modify the string if length > string length.
63 EXPECT_EQ(string, l10n_util::TruncateString(string, 100));
64
65 // Test no characters.
66 EXPECT_EQ(L"", l10n_util::TruncateString(string, 0));
67
68 // Test 1 character.
69 EXPECT_EQ(L"\x2026", l10n_util::TruncateString(string, 1));
70
71 // Test adds ... at right spot when there is enough room to break at a
72 // word boundary.
73 EXPECT_EQ(L"foooooey\x2026", l10n_util::TruncateString(string, 14));
74
75 // Test adds ... at right spot when there is not enough space in first word.
76 EXPECT_EQ(L"f\x2026", l10n_util::TruncateString(string, 2));
77
78 // Test adds ... at right spot when there is not enough room to break at a
79 // word boundary.
80 EXPECT_EQ(L"foooooey\x2026", l10n_util::TruncateString(string, 11));
81
82 // Test completely truncates string if break is on initial whitespace.
83 EXPECT_EQ(L"\x2026", l10n_util::TruncateString(L" ", 2));
84 }
85
86 void SetICUDefaultLocale(const std::wstring& locale_string) {
87 Locale locale(WideToASCII(locale_string).c_str());
88 UErrorCode error_code = U_ZERO_ERROR;
89 Locale::setDefault(locale, error_code);
90 EXPECT_TRUE(U_SUCCESS(error_code));
91 }
92
93 #if defined(OS_WIN) || defined(OS_LINUX)
94 // We are disabling this test on MacOS because GetApplicationLocale() as an
95 // API isn't something that we'll easily be able to unit test in this manner.
96 // The meaning of that API, on the Mac, is "the locale used by Cocoa's main
97 // nib file", which clearly can't be stubbed by a test app that doesn't use
98 // Cocoa.
99 TEST_F(L10nUtilTest, GetAppLocale) {
100 // Use a temporary locale dir so we don't have to actually build the locale
101 // dlls for this test.
102 FilePath orig_locale_dir;
103 PathService::Get(chrome::DIR_LOCALES, &orig_locale_dir);
104 FilePath new_locale_dir;
105 EXPECT_TRUE(file_util::CreateNewTempDirectory(
106 FILE_PATH_LITERAL("l10n_util_test"),
107 &new_locale_dir));
108 PathService::Override(chrome::DIR_LOCALES, new_locale_dir.ToWStringHack());
109 // Make fake locale files.
110 std::string filenames[] = {
111 "en-US",
112 "en-GB",
113 "fr",
114 "es-419",
115 "es",
116 "zh-TW",
117 "zh-CN",
118 "he",
119 "fil",
120 "nb",
121 "or",
122 };
123
124 #if defined(OS_WIN)
125 static const char kLocaleFileExtension[] = ".dll";
126 #elif defined(OS_POSIX)
127 static const char kLocaleFileExtension[] = ".pak";
128 #endif
129 for (size_t i = 0; i < arraysize(filenames); ++i) {
130 FilePath filename = new_locale_dir.AppendASCII(
131 filenames[i] + kLocaleFileExtension);
132 file_util::WriteFile(filename, "", 0);
133 }
134
135 // Keep a copy of ICU's default locale before we overwrite it.
136 Locale locale = Locale::getDefault();
137
138 SetICUDefaultLocale(L"en-US");
139 EXPECT_EQ(L"en-US", l10n_util::GetApplicationLocale(L""));
140
141 SetICUDefaultLocale(L"en-GB");
142 EXPECT_EQ(L"en-GB", l10n_util::GetApplicationLocale(L""));
143
144 SetICUDefaultLocale(L"fr-CA");
145 EXPECT_EQ(L"fr", l10n_util::GetApplicationLocale(L""));
146
147 SetICUDefaultLocale(L"xx");
148 EXPECT_EQ(L"en-US", l10n_util::GetApplicationLocale(L""));
149
150 SetICUDefaultLocale(L"en-US");
151 EXPECT_EQ(L"fr", l10n_util::GetApplicationLocale(L"fr"));
152 EXPECT_EQ(L"fr", l10n_util::GetApplicationLocale(L"fr-CA"));
153
154 SetICUDefaultLocale(L"en-US");
155 // Aliases iw, no, tl to he, nb, fil.
156 EXPECT_EQ(L"he", l10n_util::GetApplicationLocale(L"iw"));
157 EXPECT_EQ(L"nb", l10n_util::GetApplicationLocale(L"no"));
158 EXPECT_EQ(L"fil", l10n_util::GetApplicationLocale(L"tl"));
159 // es-419 and es-XX (where XX is not Spain) should be
160 // mapped to es-419 (Latin American Spanish).
161 EXPECT_EQ(L"es-419", l10n_util::GetApplicationLocale(L"es-419"));
162 EXPECT_EQ(L"es", l10n_util::GetApplicationLocale(L"es-ES"));
163 EXPECT_EQ(L"es-419", l10n_util::GetApplicationLocale(L"es-AR"));
164
165 SetICUDefaultLocale(L"es-MX");
166 EXPECT_EQ(L"es-419", l10n_util::GetApplicationLocale(L""));
167
168 SetICUDefaultLocale(L"es-AR");
169 EXPECT_EQ(L"es-419", l10n_util::GetApplicationLocale(L""));
170 EXPECT_EQ(L"es", l10n_util::GetApplicationLocale(L"es"));
171
172 SetICUDefaultLocale(L"es-ES");
173 EXPECT_EQ(L"es", l10n_util::GetApplicationLocale(L""));
174
175 SetICUDefaultLocale(L"es");
176 EXPECT_EQ(L"es", l10n_util::GetApplicationLocale(L""));
177
178 SetICUDefaultLocale(L"zh-HK");
179 EXPECT_EQ(L"zh-TW", l10n_util::GetApplicationLocale(L""));
180 EXPECT_EQ(L"zh-CN", l10n_util::GetApplicationLocale(L"zh-CN"));
181
182 SetICUDefaultLocale(L"zh-MK");
183 EXPECT_EQ(L"zh-TW", l10n_util::GetApplicationLocale(L""));
184
185 SetICUDefaultLocale(L"zh-SG");
186 EXPECT_EQ(L"zh-CN", l10n_util::GetApplicationLocale(L""));
187
188 SetICUDefaultLocale(L"he");
189 EXPECT_EQ(L"en-US", l10n_util::GetApplicationLocale(L"en"));
190
191 #if defined(OS_WIN)
192 // Oriya should be blocked unless OS is Vista or newer.
193 if (win_util::GetWinVersion() < win_util::WINVERSION_VISTA) {
194 SetICUDefaultLocale(L"or");
195 EXPECT_EQ(L"en-US", l10n_util::GetApplicationLocale(L""));
196 SetICUDefaultLocale(L"en-GB");
197 EXPECT_EQ(L"en-GB", l10n_util::GetApplicationLocale(L"or"));
198 } else {
199 SetICUDefaultLocale(L"or");
200 EXPECT_EQ(L"or", l10n_util::GetApplicationLocale(L""));
201 SetICUDefaultLocale(L"en-GB");
202 EXPECT_EQ(L"or", l10n_util::GetApplicationLocale(L"or"));
203 }
204 #endif
205
206 // Clean up.
207 PathService::Override(chrome::DIR_LOCALES, orig_locale_dir.ToWStringHack());
208 file_util::Delete(new_locale_dir, true);
209 UErrorCode error_code = U_ZERO_ERROR;
210 Locale::setDefault(locale, error_code);
211 }
212 #endif
213
214 TEST_F(L10nUtilTest, SortStringsUsingFunction) {
215 std::vector<StringWrapper*> strings;
216 strings.push_back(new StringWrapper(L"C"));
217 strings.push_back(new StringWrapper(L"d"));
218 strings.push_back(new StringWrapper(L"b"));
219 strings.push_back(new StringWrapper(L"a"));
220 l10n_util::SortStringsUsingMethod(L"en-US", &strings, &StringWrapper::string);
221 ASSERT_TRUE(L"a" == strings[0]->string());
222 ASSERT_TRUE(L"b" == strings[1]->string());
223 ASSERT_TRUE(L"C" == strings[2]->string());
224 ASSERT_TRUE(L"d" == strings[3]->string());
225 STLDeleteElements(&strings);
226 }
227
228 TEST_F(L10nUtilTest, GetFirstStrongCharacterDirection) {
229 // Test pure LTR string.
230 std::wstring string(L"foo bar");
231 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT,
232 l10n_util::GetFirstStrongCharacterDirection(string));
233
234 // Test bidi string in which the first character with strong directionality
235 // is a character with type L.
236 string.assign(L"foo \x05d0 bar");
237 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT,
238 l10n_util::GetFirstStrongCharacterDirection(string));
239
240 // Test bidi string in which the first character with strong directionality
241 // is a character with type R.
242 string.assign(L"\x05d0 foo bar");
243 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT,
244 l10n_util::GetFirstStrongCharacterDirection(string));
245
246 // Test bidi string which starts with a character with weak directionality
247 // and in which the first character with strong directionality is a character
248 // with type L.
249 string.assign(L"!foo \x05d0 bar");
250 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT,
251 l10n_util::GetFirstStrongCharacterDirection(string));
252
253 // Test bidi string which starts with a character with weak directionality
254 // and in which the first character with strong directionality is a character
255 // with type R.
256 string.assign(L",\x05d0 foo bar");
257 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT,
258 l10n_util::GetFirstStrongCharacterDirection(string));
259
260 // Test bidi string in which the first character with strong directionality
261 // is a character with type LRE.
262 string.assign(L"\x202a \x05d0 foo bar");
263 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT,
264 l10n_util::GetFirstStrongCharacterDirection(string));
265
266 // Test bidi string in which the first character with strong directionality
267 // is a character with type LRO.
268 string.assign(L"\x202d \x05d0 foo bar");
269 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT,
270 l10n_util::GetFirstStrongCharacterDirection(string));
271
272 // Test bidi string in which the first character with strong directionality
273 // is a character with type RLE.
274 string.assign(L"\x202b foo \x05d0 bar");
275 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT,
276 l10n_util::GetFirstStrongCharacterDirection(string));
277
278 // Test bidi string in which the first character with strong directionality
279 // is a character with type RLO.
280 string.assign(L"\x202e foo \x05d0 bar");
281 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT,
282 l10n_util::GetFirstStrongCharacterDirection(string));
283
284 // Test bidi string in which the first character with strong directionality
285 // is a character with type AL.
286 string.assign(L"\x0622 foo \x05d0 bar");
287 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT,
288 l10n_util::GetFirstStrongCharacterDirection(string));
289
290 // Test a string without strong directionality characters.
291 string.assign(L",!.{}");
292 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT,
293 l10n_util::GetFirstStrongCharacterDirection(string));
294
295 // Test empty string.
296 string.assign(L"");
297 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT,
298 l10n_util::GetFirstStrongCharacterDirection(string));
299
300 // Test characters in non-BMP (e.g. Phoenician letters. Please refer to
301 // http://demo.icu-project.org/icu-bin/ubrowse?scr=151&b=10910 for more
302 // information).
303 #if defined(WCHAR_T_IS_UTF32)
304 string.assign(L" ! \x10910" L"abc 123");
305 #elif defined(WCHAR_T_IS_UTF16)
306 string.assign(L" ! \xd802\xdd10" L"abc 123");
307 #else
308 #error wchar_t should be either UTF-16 or UTF-32
309 #endif
310 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT,
311 l10n_util::GetFirstStrongCharacterDirection(string));
312
313 #if defined(WCHAR_T_IS_UTF32)
314 string.assign(L" ! \x10401" L"abc 123");
315 #elif defined(WCHAR_T_IS_UTF16)
316 string.assign(L" ! \xd801\xdc01" L"abc 123");
317 #else
318 #error wchar_t should be either UTF-16 or UTF-32
319 #endif
320 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT,
321 l10n_util::GetFirstStrongCharacterDirection(string));
322 }
323
324 typedef struct {
325 std::wstring path;
326 std::wstring wrapped_path;
327 } PathAndWrappedPath;
328
329 TEST_F(L10nUtilTest, WrapPathWithLTRFormatting) {
330 std::wstring kSeparator;
331 kSeparator.push_back(static_cast<wchar_t>(FilePath::kSeparators[0]));
332 const PathAndWrappedPath test_data[] = {
333 // Test common path, such as "c:\foo\bar".
334 { L"c:" + kSeparator + L"foo" + kSeparator + L"bar",
335 L"\x202a"L"c:" + kSeparator + L"foo" + kSeparator +
336 L"bar\x202c"
337 },
338 // Test path with file name, such as "c:\foo\bar\test.jpg".
339 { L"c:" + kSeparator + L"foo" + kSeparator + L"bar" + kSeparator +
340 L"test.jpg",
341 L"\x202a"L"c:" + kSeparator + L"foo" + kSeparator +
342 L"bar" + kSeparator + L"test.jpg\x202c"
343 },
344 // Test path ending with punctuation, such as "c:\(foo)\bar.".
345 { L"c:" + kSeparator + L"(foo)" + kSeparator + L"bar.",
346 L"\x202a"L"c:" + kSeparator + L"(foo)" + kSeparator +
347 L"bar.\x202c"
348 },
349 // Test path ending with separator, such as "c:\foo\bar\".
350 { L"c:" + kSeparator + L"foo" + kSeparator + L"bar" + kSeparator,
351 L"\x202a"L"c:" + kSeparator + L"foo" + kSeparator +
352 L"bar" + kSeparator + L"\x202c",
353 },
354 // Test path with RTL character.
355 { L"c:" + kSeparator + L"\x05d0",
356 L"\x202a"L"c:" + kSeparator + L"\x05d0\x202c",
357 },
358 // Test path with 2 level RTL directory names.
359 { L"c:" + kSeparator + L"\x05d0" + kSeparator + L"\x0622",
360 L"\x202a"L"c:" + kSeparator + L"\x05d0" + kSeparator +
361 L"\x0622\x202c",
362 },
363 // Test path with mixed RTL/LTR directory names and ending with punctuation.
364 { L"c:" + kSeparator + L"\x05d0" + kSeparator + L"\x0622" + kSeparator +
365 L"(foo)" + kSeparator + L"b.a.r.",
366 L"\x202a"L"c:" + kSeparator + L"\x05d0" + kSeparator +
367 L"\x0622" + kSeparator + L"(foo)" + kSeparator +
368 L"b.a.r.\x202c",
369 },
370 // Test path without driver name, such as "/foo/bar/test/jpg".
371 { kSeparator + L"foo" + kSeparator + L"bar" + kSeparator + L"test.jpg",
372 L"\x202a" + kSeparator + L"foo" + kSeparator + L"bar" +
373 kSeparator + L"test.jpg" + L"\x202c"
374 },
375 // Test path start with current directory, such as "./foo".
376 { L"." + kSeparator + L"foo",
377 L"\x202a"L"." + kSeparator + L"foo" + L"\x202c"
378 },
379 // Test path start with parent directory, such as "../foo/bar.jpg".
380 { L".." + kSeparator + L"foo" + kSeparator + L"bar.jpg",
381 L"\x202a"L".." + kSeparator + L"foo" + kSeparator +
382 L"bar.jpg" + L"\x202c"
383 },
384 // Test absolute path, such as "//foo/bar.jpg".
385 { kSeparator + kSeparator + L"foo" + kSeparator + L"bar.jpg",
386 L"\x202a" + kSeparator + kSeparator + L"foo" + kSeparator +
387 L"bar.jpg" + L"\x202c"
388 },
389 // Test path with mixed RTL/LTR directory names.
390 { L"c:" + kSeparator + L"foo" + kSeparator + L"\x05d0" + kSeparator +
391 L"\x0622" + kSeparator + L"\x05d1.jpg",
392 L"\x202a"L"c:" + kSeparator + L"foo" + kSeparator + L"\x05d0" +
393 kSeparator + L"\x0622" + kSeparator + L"\x05d1.jpg" + L"\x202c",
394 },
395 // Test empty path.
396 { L"",
397 L"\x202a\x202c"
398 }
399 };
400 for (unsigned int i = 0; i < arraysize(test_data); ++i) {
401 string16 localized_file_path_string;
402 FilePath path = FilePath::FromWStringHack(test_data[i].path);
403 l10n_util::WrapPathWithLTRFormatting(path, &localized_file_path_string);
404 std::wstring wrapped_path = UTF16ToWide(localized_file_path_string);
405 EXPECT_EQ(wrapped_path, test_data[i].wrapped_path);
406 }
407 }
408
409 TEST_F(L10nUtilTest, GetTextDirection) {
410 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT, GetTextDirection("ar"));
411 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT, GetTextDirection("ar_EG"));
412 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT, GetTextDirection("he"));
413 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT, GetTextDirection("he_IL"));
414 // iw is an obsolete code for Hebrew.
415 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT, GetTextDirection("iw"));
416 #if 0
417 // Enable these when we localize to Farsi, Urdu, Azerbaijani
418 // written in Arabic and Dhivehi. At the moment, our copy of
419 // ICU data does not have entry for them.
420 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT, GetTextDirection("fa"));
421 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT, GetTextDirection("ur"));
422 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT, GetTextDirection("az_Arab"));
423 // Dhivehi that uses Thaana script.
424 EXPECT_EQ(l10n_util::RIGHT_TO_LEFT, GetTextDirection("dv"));
425 #endif
426 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT, GetTextDirection("en"));
427 // Chinese in China with '-'.
428 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT, GetTextDirection("zh-CN"));
429 // Filipino : 3-letter code
430 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT, GetTextDirection("fil"));
431 // Russian
432 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT, GetTextDirection("ru"));
433 // Japanese that uses multiple scripts
434 EXPECT_EQ(l10n_util::LEFT_TO_RIGHT, GetTextDirection("ja"));
435 }
OLDNEW
« no previous file with comments | « chrome/common/l10n_util_posix.cc ('k') | chrome/common/l10n_util_win.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698