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 9 namespace language_usage_metrics { 10 11 TEST(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 85 TEST(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