1// Copyright 2014 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 "components/translate/core/browser/translate_prefs.h"
6
7#include <algorithm>
8#include <string>
9#include <vector>
10
11#include "components/translate/core/browser/translate_download_manager.h"
12#include "testing/gtest/include/gtest/gtest.h"
13
14namespace translate {
15
16TEST(TranslatePrefsTest, CreateBlockedLanguages) {
17  TranslateDownloadManager::GetInstance()->set_application_locale("en");
18  std::vector<std::string> blacklisted_languages;
19  blacklisted_languages.push_back("en");
20  blacklisted_languages.push_back("fr");
21  // Hebrew: synonym to 'he'
22  blacklisted_languages.push_back("iw");
23  // Haitian is not used as Accept-Language
24  blacklisted_languages.push_back("ht");
25
26  std::vector<std::string> accept_languages;
27  accept_languages.push_back("en");
28  // The subcode (IT) will be ignored when merging, except for Chinese.
29  accept_languages.push_back("it-IT");
30  accept_languages.push_back("ja");
31  // Filippino: synonym to 'tl'
32  accept_languages.push_back("fil");
33  // General Chinese is not used as Translate language, but not filtered
34  // when merging.
35  accept_languages.push_back("zh");
36  // Chinese with a sub code is acceptable for the blocked-language list.
37  accept_languages.push_back("zh-TW");
38
39  std::vector<std::string> blocked_languages;
40
41  TranslatePrefs::CreateBlockedLanguages(&blocked_languages,
42                                         blacklisted_languages,
43                                         accept_languages);
44
45  // The order of the elements cannot be determined.
46  std::vector<std::string> expected;
47  expected.push_back("en");
48  expected.push_back("fr");
49  expected.push_back("iw");
50  expected.push_back("ht");
51  expected.push_back("it");
52  expected.push_back("ja");
53  expected.push_back("tl");
54  expected.push_back("zh");
55  expected.push_back("zh-TW");
56
57  EXPECT_EQ(expected.size(), blocked_languages.size());
58  for (std::vector<std::string>::const_iterator it = expected.begin();
59       it != expected.end(); ++it) {
60    EXPECT_NE(blocked_languages.end(),
61              std::find(blocked_languages.begin(),
62                        blocked_languages.end(),
63                        *it));
64  }
65}
66
67TEST(TranslatePrefsTest, CreateBlockedLanguagesNonEnglishUI) {
68  std::vector<std::string> blacklisted_languages;
69  blacklisted_languages.push_back("fr");
70
71  std::vector<std::string> accept_languages;
72  accept_languages.push_back("en");
73  accept_languages.push_back("ja");
74  accept_languages.push_back("zh");
75
76  // Run in an English locale.
77  {
78    TranslateDownloadManager::GetInstance()->set_application_locale("en");
79    std::vector<std::string> blocked_languages;
80    TranslatePrefs::CreateBlockedLanguages(&blocked_languages,
81                                           blacklisted_languages,
82                                           accept_languages);
83    std::vector<std::string> expected;
84    expected.push_back("en");
85    expected.push_back("fr");
86    expected.push_back("ja");
87    expected.push_back("zh");
88
89    EXPECT_EQ(expected.size(), blocked_languages.size());
90    for (std::vector<std::string>::const_iterator it = expected.begin();
91         it != expected.end(); ++it) {
92      EXPECT_NE(blocked_languages.end(),
93                std::find(blocked_languages.begin(),
94                          blocked_languages.end(),
95                          *it));
96    }
97  }
98
99  // Run in a Japanese locale.
100  // English should not be included in the result even though Accept Languages
101  // has English because the UI is not English.
102  {
103    TranslateDownloadManager::GetInstance()->set_application_locale("ja");
104    std::vector<std::string> blocked_languages;
105    TranslatePrefs::CreateBlockedLanguages(&blocked_languages,
106                                           blacklisted_languages,
107                                           accept_languages);
108    std::vector<std::string> expected;
109    expected.push_back("fr");
110    expected.push_back("ja");
111    expected.push_back("zh");
112
113    EXPECT_EQ(expected.size(), blocked_languages.size());
114    for (std::vector<std::string>::const_iterator it = expected.begin();
115         it != expected.end(); ++it) {
116      EXPECT_NE(blocked_languages.end(),
117                std::find(blocked_languages.begin(),
118                          blocked_languages.end(),
119                          *it));
120    }
121  }
122}
123
124}  // namespace translate
125