tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

TestLocale.cpp (5282B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 #include "gtest/gtest.h"
      5 
      6 #include "mozilla/intl/Locale.h"
      7 #include "mozilla/Span.h"
      8 
      9 #include "TestBuffer.h"
     10 
     11 namespace mozilla::intl {
     12 
     13 TEST(IntlLocale, LocaleSettersAndGetters)
     14 {
     15  Locale locale;
     16  locale.SetLanguage("fr");
     17  locale.SetRegion("CA");
     18  locale.SetScript("Latn");
     19  Locale::VariantsVector variants;
     20  ASSERT_TRUE(variants.append(VariantSubtag{MakeStringSpan("fonipa")}));
     21  locale.SetVariants(std::move(variants));
     22  ASSERT_TRUE(
     23      locale.SetUnicodeExtension(MakeStringSpan("u-ca-gregory")).isOk());
     24  ASSERT_TRUE(locale.Language().EqualTo("fr"));
     25  ASSERT_TRUE(locale.Region().EqualTo("CA"));
     26  ASSERT_TRUE(locale.Script().EqualTo("Latn"));
     27  ASSERT_EQ(locale.Variants().length(), 1UL);
     28  ASSERT_EQ(locale.Variants()[0], MakeStringSpan("fonipa"));
     29  ASSERT_EQ(locale.GetUnicodeExtension().value(),
     30            MakeStringSpan("u-ca-gregory"));
     31 
     32  TestBuffer<char> buffer;
     33  ASSERT_TRUE(locale.ToString(buffer).isOk());
     34  ASSERT_TRUE(buffer.verboseMatches("fr-Latn-CA-fonipa-u-ca-gregory"));
     35 
     36  locale.ClearVariants();
     37  ASSERT_EQ(locale.Variants().length(), 0UL);
     38 
     39  // No setters for other extensions...
     40  Locale locale2;
     41  ASSERT_TRUE(
     42      LocaleParser::TryParse(MakeStringSpan("fr-CA-t-es-AR-h0-hybrid"), locale2)
     43          .isOk());
     44  ASSERT_EQ(locale2.Extensions()[0], MakeStringSpan("t-es-AR-h0-hybrid"));
     45 }
     46 
     47 TEST(IntlLocale, LocaleMove)
     48 {
     49  Locale locale;
     50  ASSERT_TRUE(
     51      LocaleParser::TryParse(
     52          MakeStringSpan(
     53              "fr-Latn-CA-fonipa-u-ca-gregory-t-es-AR-h0-hybrid-x-private"),
     54          locale)
     55          .isOk());
     56 
     57  ASSERT_TRUE(locale.Language().EqualTo("fr"));
     58  ASSERT_TRUE(locale.Script().EqualTo("Latn"));
     59  ASSERT_TRUE(locale.Region().EqualTo("CA"));
     60  ASSERT_EQ(locale.Variants()[0], MakeStringSpan("fonipa"));
     61  ASSERT_EQ(locale.Extensions()[0], MakeStringSpan("u-ca-gregory"));
     62  ASSERT_EQ(locale.Extensions()[1], MakeStringSpan("t-es-AR-h0-hybrid"));
     63  ASSERT_EQ(locale.GetUnicodeExtension().value(),
     64            MakeStringSpan("u-ca-gregory"));
     65  ASSERT_EQ(locale.PrivateUse().value(), MakeStringSpan("x-private"));
     66 
     67  Locale locale2 = std::move(locale);
     68 
     69  ASSERT_TRUE(locale2.Language().EqualTo("fr"));
     70  ASSERT_TRUE(locale2.Script().EqualTo("Latn"));
     71  ASSERT_TRUE(locale2.Region().EqualTo("CA"));
     72  ASSERT_EQ(locale2.Variants()[0], MakeStringSpan("fonipa"));
     73  ASSERT_EQ(locale2.Extensions()[0], MakeStringSpan("u-ca-gregory"));
     74  ASSERT_EQ(locale2.Extensions()[1], MakeStringSpan("t-es-AR-h0-hybrid"));
     75  ASSERT_EQ(locale2.GetUnicodeExtension().value(),
     76            MakeStringSpan("u-ca-gregory"));
     77  ASSERT_EQ(locale2.PrivateUse().value(), MakeStringSpan("x-private"));
     78 }
     79 
     80 TEST(IntlLocale, LocaleParser)
     81 {
     82  const char* tags[] = {
     83      "en-US",       "en-GB",       "es-AR",      "it",         "zh-Hans-CN",
     84      "de-AT",       "pl",          "fr-FR",      "de-AT",      "sr-Cyrl-SR",
     85      "nb-NO",       "fr-FR",       "mk",         "uk",         "und-PL",
     86      "und-Latn-AM", "ug-Cyrl",     "sr-ME",      "mn-Mong",    "lif-Limb",
     87      "gan",         "zh-Hant",     "yue-Hans",   "unr",        "unr-Deva",
     88      "und-Thai-CN", "ug-Cyrl",     "en-Latn-DE", "pl-FR",      "de-CH",
     89      "tuq",         "sr-ME",       "ng",         "klx",        "kk-Arab",
     90      "en-Cyrl",     "und-Cyrl-UK", "und-Arab",   "und-Arab-FO"};
     91 
     92  for (const auto* tag : tags) {
     93    Locale locale;
     94    ASSERT_TRUE(LocaleParser::TryParse(MakeStringSpan(tag), locale).isOk());
     95  }
     96 }
     97 
     98 TEST(IntlLocale, LikelySubtags)
     99 {
    100  Locale locale;
    101  ASSERT_TRUE(LocaleParser::TryParse(MakeStringSpan("zh"), locale).isOk());
    102  ASSERT_TRUE(locale.AddLikelySubtags().isOk());
    103  TestBuffer<char> buffer;
    104  ASSERT_TRUE(locale.ToString(buffer).isOk());
    105  ASSERT_TRUE(buffer.verboseMatches("zh-Hans-CN"));
    106  ASSERT_TRUE(locale.RemoveLikelySubtags().isOk());
    107  buffer.clear();
    108  ASSERT_TRUE(locale.ToString(buffer).isOk());
    109  ASSERT_TRUE(buffer.verboseMatches("zh"));
    110 }
    111 
    112 TEST(IntlLocale, Canonicalize)
    113 {
    114  Locale locale;
    115  ASSERT_TRUE(
    116      LocaleParser::TryParse(MakeStringSpan("nob-bokmal"), locale).isOk());
    117  ASSERT_TRUE(locale.Canonicalize().isOk());
    118  TestBuffer<char> buffer;
    119  ASSERT_TRUE(locale.ToString(buffer).isOk());
    120  ASSERT_TRUE(buffer.verboseMatches("nb"));
    121 }
    122 
    123 // These tests are dependent on the machine that this test is being run on.
    124 TEST(IntlLocale, SystemDependentTests)
    125 {
    126  // e.g. "en_US"
    127  const char* locale = Locale::GetDefaultLocale();
    128  ASSERT_TRUE(locale != nullptr);
    129 }
    130 
    131 TEST(IntlLocale, GetAvailableLocales)
    132 {
    133  using namespace std::literals;
    134 
    135  int32_t english = 0;
    136  int32_t german = 0;
    137  int32_t chinese = 0;
    138 
    139  // Since this list is dependent on ICU, and may change between upgrades, only
    140  // test a subset of the available locales.
    141  for (const char* locale : Locale::GetAvailableLocales()) {
    142    if (locale == "en"sv) {
    143      english++;
    144    } else if (locale == "de"sv) {
    145      german++;
    146    } else if (locale == "zh"sv) {
    147      chinese++;
    148    }
    149  }
    150 
    151  // Each locale should be found exactly once.
    152  ASSERT_EQ(english, 1);
    153  ASSERT_EQ(german, 1);
    154  ASSERT_EQ(chinese, 1);
    155 }
    156 
    157 }  // namespace mozilla::intl