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/language_usage_metrics/language_usage_metrics.h"
6
7#include "testing/gtest/include/gtest/gtest.h"
8
9namespace language_usage_metrics {
10
11TEST(LanguageUsageMetricsTest, ParseAcceptLanguages) {
12  std::set<int> language_set;
13  std::set<int>::const_iterator it;
14
15  const int ENGLISH = 25966;
16  const int SPANISH = 25971;
17  const int JAPANESE = 27233;
18
19  // Basic single language case.
20  LanguageUsageMetrics::ParseAcceptLanguages("ja", &language_set);
21  EXPECT_EQ(1U, language_set.size());
22  EXPECT_EQ(JAPANESE, *language_set.begin());
23
24  // Empty language.
25  LanguageUsageMetrics::ParseAcceptLanguages(std::string(), &language_set);
26  EXPECT_EQ(0U, language_set.size());
27
28  // Country code is ignored.
29  LanguageUsageMetrics::ParseAcceptLanguages("ja-JP", &language_set);
30  EXPECT_EQ(1U, language_set.size());
31  EXPECT_EQ(JAPANESE, *language_set.begin());
32
33  // Case is ignored.
34  LanguageUsageMetrics::ParseAcceptLanguages("Ja-jP", &language_set);
35  EXPECT_EQ(1U, language_set.size());
36  EXPECT_EQ(JAPANESE, *language_set.begin());
37
38  // Underscore as the separator.
39  LanguageUsageMetrics::ParseAcceptLanguages("ja_JP", &language_set);
40  EXPECT_EQ(1U, language_set.size());
41  EXPECT_EQ(JAPANESE, *language_set.begin());
42
43  // The result contains a same language code only once.
44  LanguageUsageMetrics::ParseAcceptLanguages("ja-JP,ja", &language_set);
45  EXPECT_EQ(1U, language_set.size());
46  EXPECT_EQ(JAPANESE, *language_set.begin());
47
48  // Basic two languages case.
49  LanguageUsageMetrics::ParseAcceptLanguages("en,ja", &language_set);
50  EXPECT_EQ(2U, language_set.size());
51  it = language_set.begin();
52  EXPECT_EQ(ENGLISH, *it);
53  EXPECT_EQ(JAPANESE, *++it);
54
55  // Multiple languages.
56  LanguageUsageMetrics::ParseAcceptLanguages("ja-JP,en,es,ja,en-US",
57                                             &language_set);
58  EXPECT_EQ(3U, language_set.size());
59  it = language_set.begin();
60  EXPECT_EQ(ENGLISH, *it);
61  EXPECT_EQ(SPANISH, *++it);
62  EXPECT_EQ(JAPANESE, *++it);
63
64  // Two empty languages.
65  LanguageUsageMetrics::ParseAcceptLanguages(",", &language_set);
66  EXPECT_EQ(0U, language_set.size());
67
68  // Trailing comma.
69  LanguageUsageMetrics::ParseAcceptLanguages("ja,", &language_set);
70  EXPECT_EQ(1U, language_set.size());
71  EXPECT_EQ(JAPANESE, *language_set.begin());
72
73  // Leading comma.
74  LanguageUsageMetrics::ParseAcceptLanguages(",es", &language_set);
75  EXPECT_EQ(1U, language_set.size());
76  EXPECT_EQ(SPANISH, *language_set.begin());
77
78  // Combination of invalid and valid.
79  LanguageUsageMetrics::ParseAcceptLanguages("1234,en", &language_set);
80  EXPECT_EQ(1U, language_set.size());
81  it = language_set.begin();
82  EXPECT_EQ(ENGLISH, *it);
83}
84
85TEST(LanguageUsageMetricsTest, ToLanguageCode) {
86  const int SPANISH = 25971;
87  const int JAPANESE = 27233;
88
89  // Basic case.
90  EXPECT_EQ(JAPANESE, LanguageUsageMetrics::ToLanguageCode("ja"));
91
92  // Case is ignored.
93  EXPECT_EQ(SPANISH, LanguageUsageMetrics::ToLanguageCode("Es"));
94
95  // Coutry code is ignored.
96  EXPECT_EQ(JAPANESE, LanguageUsageMetrics::ToLanguageCode("ja-JP"));
97
98  // Invalid locales are considered as unknown language.
99  EXPECT_EQ(0, LanguageUsageMetrics::ToLanguageCode(std::string()));
100  EXPECT_EQ(0, LanguageUsageMetrics::ToLanguageCode("1234"));
101
102  // "xx" is not acceptable because it doesn't exist in ISO 639-1 table.
103  // However, LanguageUsageMetrics doesn't tell what code is valid.
104  EXPECT_EQ(30840, LanguageUsageMetrics::ToLanguageCode("xx"));
105}
106
107}  // namespace language_usage_metrics
108