1// Copyright (c) 2012 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 <string>
6#include <vector>
7
8#include "chrome/installer/util/language_selector.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11namespace {
12
13const wchar_t* const kExactMatchCandidates[] = {
14  L"am", L"ar", L"bg", L"bn", L"ca", L"cs", L"da", L"de", L"el", L"en-gb",
15  L"en-us", L"es", L"es-419", L"et", L"fa", L"fi", L"fil", L"fr", L"gu", L"hi",
16  L"hr", L"hu", L"id", L"it", L"iw", L"ja", L"kn", L"ko", L"lt", L"lv", L"ml",
17  L"mr", L"nl", L"no", L"pl", L"pt-br", L"pt-pt", L"ro", L"ru", L"sk", L"sl",
18  L"sr", L"sv", L"sw", L"ta", L"te", L"th", L"tr", L"uk", L"vi", L"zh-cn",
19  L"zh-tw"
20};
21
22const wchar_t* const kAliasMatchCandidates[] = {
23  L"he", L"nb", L"tl", L"zh-chs",  L"zh-cht", L"zh-hans", L"zh-hant", L"zh-hk",
24  L"zh-mo"
25};
26
27const wchar_t* const kWildcardMatchCandidates[] = {
28  L"en-AU",
29  L"es-CO", L"pt-AB", L"zh-SG"
30};
31
32}  // namespace
33
34// Test that a language is selected from the system.
35TEST(LanguageSelectorTest, DefaultSelection) {
36  installer::LanguageSelector instance;
37  EXPECT_FALSE(instance.matched_candidate().empty());
38}
39
40// Test some hypothetical candidate sets.
41TEST(LanguageSelectorTest, AssortedSelections) {
42  {
43    std::wstring candidates[] = {
44      L"fr-BE", L"fr", L"en"
45    };
46    installer::LanguageSelector instance(
47        std::vector<std::wstring>(&candidates[0],
48                                  &candidates[arraysize(candidates)]));
49    // Expect the exact match to win.
50    EXPECT_EQ(L"fr", instance.matched_candidate());
51  }
52  {
53    std::wstring candidates[] = {
54      L"xx-YY", L"cc-Ssss-RR"
55    };
56    installer::LanguageSelector instance(
57      std::vector<std::wstring>(&candidates[0],
58      &candidates[arraysize(candidates)]));
59    // Expect the fallback to win.
60    EXPECT_EQ(L"en-us", instance.matched_candidate());
61  }
62  {
63    std::wstring candidates[] = {
64      L"zh-SG", L"en-GB"
65    };
66    installer::LanguageSelector instance(
67      std::vector<std::wstring>(&candidates[0],
68      &candidates[arraysize(candidates)]));
69    // Expect the alias match to win.
70    EXPECT_EQ(L"zh-SG", instance.matched_candidate());
71  }
72}
73
74// A fixture for testing sets of single-candidate selections.
75class LanguageSelectorMatchCandidateTest
76    : public ::testing::TestWithParam<const wchar_t*> {
77};
78
79TEST_P(LanguageSelectorMatchCandidateTest, TestMatchCandidate) {
80  installer::LanguageSelector instance(
81    std::vector<std::wstring>(1, std::wstring(GetParam())));
82  EXPECT_EQ(GetParam(), instance.matched_candidate());
83}
84
85// Test that all existing translations can be found by exact match.
86INSTANTIATE_TEST_CASE_P(
87    TestExactMatches,
88    LanguageSelectorMatchCandidateTest,
89    ::testing::ValuesIn(
90        &kExactMatchCandidates[0],
91        &kExactMatchCandidates[arraysize(kExactMatchCandidates)]));
92
93// Test the alias matches.
94INSTANTIATE_TEST_CASE_P(
95    TestAliasMatches,
96    LanguageSelectorMatchCandidateTest,
97    ::testing::ValuesIn(
98        &kAliasMatchCandidates[0],
99        &kAliasMatchCandidates[arraysize(kAliasMatchCandidates)]));
100
101// Test a few wildcard matches.
102INSTANTIATE_TEST_CASE_P(
103    TestWildcardMatches,
104    LanguageSelectorMatchCandidateTest,
105    ::testing::ValuesIn(
106        &kWildcardMatchCandidates[0],
107        &kWildcardMatchCandidates[arraysize(kWildcardMatchCandidates)]));
108
109// A fixture for testing aliases that match to an expected translation.  The
110// first member of the tuple is the expected translation, the second is a
111// candidate that should be aliased to the expectation.
112class LanguageSelectorAliasTest
113    : public ::testing::TestWithParam< std::tr1::tuple<const wchar_t*,
114                                                       const wchar_t*> > {
115};
116
117// Test that the candidate language maps to the aliased translation.
118TEST_P(LanguageSelectorAliasTest, AliasesMatch) {
119  installer::LanguageSelector instance(
120      std::vector<std::wstring>(1, std::tr1::get<1>(GetParam())));
121  EXPECT_EQ(std::tr1::get<0>(GetParam()), instance.selected_translation());
122}
123
124INSTANTIATE_TEST_CASE_P(
125    EnGbAliases,
126    LanguageSelectorAliasTest,
127    ::testing::Combine(
128        ::testing::Values(L"en-gb"),
129        ::testing::Values(L"en-au", L"en-ca", L"en-nz", L"en-za")));
130
131INSTANTIATE_TEST_CASE_P(
132    IwAliases,
133    LanguageSelectorAliasTest,
134    ::testing::Combine(
135        ::testing::Values(L"iw"),
136        ::testing::Values(L"he")));
137
138INSTANTIATE_TEST_CASE_P(
139    NoAliases,
140    LanguageSelectorAliasTest,
141    ::testing::Combine(
142        ::testing::Values(L"no"),
143        ::testing::Values(L"nb")));
144
145INSTANTIATE_TEST_CASE_P(
146    FilAliases,
147    LanguageSelectorAliasTest,
148    ::testing::Combine(
149        ::testing::Values(L"fil"),
150        ::testing::Values(L"tl")));
151
152INSTANTIATE_TEST_CASE_P(
153    ZhCnAliases,
154    LanguageSelectorAliasTest,
155    ::testing::Combine(
156        ::testing::Values(L"zh-cn"),
157        ::testing::Values(L"zh-chs", L"zh-hans", L"zh-sg")));
158
159INSTANTIATE_TEST_CASE_P(
160    ZhTwAliases,
161    LanguageSelectorAliasTest,
162    ::testing::Combine(
163        ::testing::Values(L"zh-tw"),
164        ::testing::Values(L"zh-cht", L"zh-hant", L"zh-hk", L"zh-mo")));
165
166// Test that we can get the name of the default language.
167TEST(LanguageSelectorTest, DefaultLanguageName) {
168  installer::LanguageSelector instance;
169  EXPECT_FALSE(instance.GetLanguageName(instance.offset()).empty());
170}
171
172