Chromium Code Reviews| Index: chrome/common/plural_formatter_unittest.cc |
| diff --git a/chrome/common/plural_formatter_unittest.cc b/chrome/common/plural_formatter_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..71d1189724d7a0a4057dfb6bb585869afc8fe2c8 |
| --- /dev/null |
| +++ b/chrome/common/plural_formatter_unittest.cc |
| @@ -0,0 +1,335 @@ |
| +// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "base/basictypes.h" |
| +#include "base/string16.h" |
| +#include "base/utf_string_conversions.h" |
| +#include "chrome/common/plural_formatter.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| +#include "testing/platform_test.h" |
| +#include "ui/base/l10n/l10n_util.h" |
| + |
| +namespace { |
| + |
| +enum MsgId { |
| + MSG_ZERO = 0, |
| + MSG_ONE, |
| + MSG_TWO, |
| + MSG_FEW, |
| + MSG_MANY, |
| + MSG_OTHER |
| +}; |
| + |
| +struct MsgCode { |
| + int id; |
| + int test_value; |
| + const char *format; |
| + const char *expected_string; |
| +}; |
| + |
| +const int message_ids[] = { |
| + MSG_ZERO, |
| + MSG_ONE, |
| + MSG_TWO, |
| + MSG_FEW, |
| + MSG_MANY, |
| + MSG_OTHER |
| +}; |
| + |
| +const MsgCode codes[] = { |
| + { MSG_ZERO, 0, "zero = # is zero", "zero = 0 is zero" }, |
| + { MSG_ONE, 1, "one = # is one", "one = 1 is one" }, |
| + { MSG_TWO, 2, "two = # is a pair", "two = 2 is a pair" }, |
| + { MSG_FEW, 3, "few = # is a few", "few = 3 is a few" }, |
| + { MSG_MANY, 15, "many = # is many", "many = 15 is many" }, |
| + { MSG_OTHER, 123, "number = # is a lot", "number = 123 is a lot" } |
| +}; |
| + |
| +std::string GetTestString(int msg_id) { |
| + return codes[msg_id].format; |
| +} |
| + |
| +std::string GetExpectedString(int msg_id) { |
| + return codes[msg_id].expected_string; |
| +} |
| + |
| +} // namespace |
| + |
| +// Icu could be doing some platform-specific things, so we make this a |
| +// platform test. |
| +class PluralFormatterTest : public PlatformTest { |
| + protected: |
| + virtual void SetUp() { |
| + PlatformTest::SetUp(); |
| + PluralFormatter::SetOverrideLocale("en"); |
| + PluralFormatter::SetStringSource(GetTestString); |
| + } |
| + |
| + virtual void TearDown() { |
| + PluralFormatter::SetOverrideLocale(NULL); |
| + PluralFormatter::SetStringSource(l10n_util::GetStringUTF8); |
| + PlatformTest::TearDown(); |
| + } |
| +}; |
| + |
| +#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.
|
| +{ \ |
| + std::string result = UTF16ToUTF8( \ |
| + formatter.GetPluralString(codes[msg].test_value)); \ |
| + std::string expected = GetExpectedString(msg); \ |
| + EXPECT_STREQ(expected.c_str(), result.c_str()); \ |
| +} |
| + |
| +#define TEST_MESSAGE_NOT_USED(msg) \ |
| +{ \ |
| + std::string result = UTF16ToUTF8( \ |
| + formatter.GetPluralString(codes[msg].test_value)); \ |
| + std::string expected = GetExpectedString(msg); \ |
| + EXPECT_STRNE(expected.c_str(), result.c_str()); \ |
| +} |
| + |
| +TEST_F(PluralFormatterTest, Basic) { |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| +} |
| + |
| +// Testing the following locales: en fr ar cs ga hr ja kn ko lt lv pl ro ru |
| +// sk sl tr uk vi zh_CN zh_TW |
| +// |
| +// Most of these are locales that have interesting rules regarding |
| +// plurals (and I threw in en and fr just to make sure nothing's wonky |
| +// with simpler locales). |
| + |
| +TEST_F(PluralFormatterTest, TestLocales) { |
| + { |
| + PluralFormatter::SetOverrideLocale("en"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("fr"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("ar"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_USED(MSG_TWO); |
| + TEST_MESSAGE_USED(MSG_FEW); |
| + TEST_MESSAGE_USED(MSG_MANY); |
| + TEST_MESSAGE_NOT_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("cs"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("ga"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("hr"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_USED(MSG_FEW); |
| + TEST_MESSAGE_USED(MSG_MANY); |
| + TEST_MESSAGE_NOT_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("ja"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_NOT_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("kn"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_NOT_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("ko"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_NOT_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("lt"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_NOT_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("lv"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("pl"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_USED(MSG_FEW); |
| + TEST_MESSAGE_USED(MSG_MANY); |
| + TEST_MESSAGE_NOT_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("ro"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("ru"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_USED(MSG_FEW); |
| + TEST_MESSAGE_USED(MSG_MANY); |
| + TEST_MESSAGE_NOT_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("sk"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("sl"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_USED(MSG_TWO); |
| + TEST_MESSAGE_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("tr"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_NOT_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("uk"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_USED(MSG_FEW); |
| + TEST_MESSAGE_USED(MSG_MANY); |
| + TEST_MESSAGE_NOT_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("vi"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_NOT_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("zh_CN"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_NOT_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| + |
| + { |
| + PluralFormatter::SetOverrideLocale("zh_TW"); |
| + PluralFormatter formatter(message_ids); |
| + TEST_MESSAGE_NOT_USED(MSG_ZERO); |
| + TEST_MESSAGE_NOT_USED(MSG_ONE); |
| + TEST_MESSAGE_NOT_USED(MSG_TWO); |
| + TEST_MESSAGE_NOT_USED(MSG_FEW); |
| + TEST_MESSAGE_NOT_USED(MSG_MANY); |
| + TEST_MESSAGE_USED(MSG_OTHER); |
| + } |
| +} |