tor-browser

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

TestDisplayNames.cpp (22868B)


      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 "TestBuffer.h"
      7 #include "mozilla/intl/DisplayNames.h"
      8 
      9 namespace mozilla::intl {
     10 
     11 TEST(IntlDisplayNames, Script)
     12 {
     13  TestBuffer<char16_t> buffer;
     14 
     15  DisplayNames::Options options{};
     16  options.style = DisplayNames::Style::Long;
     17 
     18  {
     19    auto result = DisplayNames::TryCreate("en-US", options);
     20    ASSERT_TRUE(result.isOk());
     21    auto displayNames = result.unwrap();
     22 
     23    ASSERT_TRUE(displayNames->GetScript(buffer, MakeStringSpan("Hans")).isOk());
     24    ASSERT_TRUE(buffer.verboseMatches(u"Simplified Han"));
     25 
     26    buffer.clear();
     27    {
     28      // The code is too long here.
     29      auto err =
     30          displayNames->GetScript(buffer, MakeStringSpan("ThisIsTooLong"));
     31      ASSERT_TRUE(err.isErr());
     32      ASSERT_EQ(err.unwrapErr(), DisplayNamesError::InvalidOption);
     33      ASSERT_TRUE(buffer.verboseMatches(u""));
     34    }
     35 
     36    // Test fallbacking for unknown scripts.
     37 
     38    buffer.clear();
     39    ASSERT_TRUE(displayNames
     40                    ->GetScript(buffer, MakeStringSpan("Fake"),
     41                                DisplayNames::Fallback::None)
     42                    .isOk());
     43    ASSERT_TRUE(buffer.verboseMatches(u""));
     44 
     45    buffer.clear();
     46    ASSERT_TRUE(displayNames
     47                    ->GetScript(buffer, MakeStringSpan("Fake"),
     48                                DisplayNames::Fallback::Code)
     49                    .isOk());
     50    ASSERT_TRUE(buffer.verboseMatches(u"Fake"));
     51  }
     52 
     53  {
     54    auto result = DisplayNames::TryCreate("es-ES", options);
     55    ASSERT_TRUE(result.isOk());
     56    auto displayNames = result.unwrap();
     57 
     58    buffer.clear();
     59    ASSERT_TRUE(displayNames->GetScript(buffer, MakeStringSpan("Hans")).isOk());
     60    ASSERT_TRUE(buffer.verboseMatches(u"han simplificado"));
     61  }
     62 
     63  options.style = DisplayNames::Style::Short;
     64  {
     65    auto result = DisplayNames::TryCreate("en-US", options);
     66    ASSERT_TRUE(result.isOk());
     67    auto displayNames = result.unwrap();
     68 
     69    buffer.clear();
     70    ASSERT_TRUE(displayNames->GetScript(buffer, MakeStringSpan("Hans")).isOk());
     71    ASSERT_TRUE(buffer.verboseMatches(u"Simplified"));
     72 
     73    // Test fallbacking for unknown scripts.
     74    buffer.clear();
     75    ASSERT_TRUE(displayNames
     76                    ->GetScript(buffer, MakeStringSpan("Fake"),
     77                                DisplayNames::Fallback::None)
     78                    .isOk());
     79    ASSERT_TRUE(buffer.verboseMatches(u""));
     80 
     81    buffer.clear();
     82    ASSERT_TRUE(displayNames
     83                    ->GetScript(buffer, MakeStringSpan("Fake"),
     84                                DisplayNames::Fallback::Code)
     85                    .isOk());
     86    ASSERT_TRUE(buffer.verboseMatches(u"Fake"));
     87  }
     88 
     89  {
     90    auto result = DisplayNames::TryCreate("es-ES", options);
     91    ASSERT_TRUE(result.isOk());
     92    auto displayNames = result.unwrap();
     93 
     94    buffer.clear();
     95    ASSERT_TRUE(displayNames->GetScript(buffer, MakeStringSpan("Hans")).isOk());
     96    ASSERT_TRUE(buffer.verboseMatches(u"simplificado"));
     97  }
     98 }
     99 
    100 TEST(IntlDisplayNames, Language)
    101 {
    102  TestBuffer<char16_t> buffer;
    103  DisplayNames::Options options{};
    104 
    105  {
    106    auto result = DisplayNames::TryCreate("en-US", options);
    107    ASSERT_TRUE(result.isOk());
    108    auto displayNames = result.unwrap();
    109 
    110    ASSERT_TRUE(
    111        displayNames->GetLanguage(buffer, MakeStringSpan("es-ES")).isOk());
    112    ASSERT_TRUE(buffer.verboseMatches(u"Spanish (Spain)"));
    113 
    114    buffer.clear();
    115    ASSERT_TRUE(
    116        displayNames->GetLanguage(buffer, MakeStringSpan("zh-Hant")).isOk());
    117    ASSERT_TRUE(buffer.verboseMatches(u"Chinese (Traditional)"));
    118 
    119    // The undefined locale returns an empty string.
    120    buffer.clear();
    121    ASSERT_TRUE(
    122        displayNames->GetLanguage(buffer, MakeStringSpan("und")).isOk());
    123    ASSERT_TRUE(buffer.get_string_view().empty());
    124 
    125    // Invalid locales are an error.
    126    buffer.clear();
    127    ASSERT_EQ(
    128        displayNames->GetLanguage(buffer, MakeStringSpan("asdf")).unwrapErr(),
    129        DisplayNamesError::InvalidOption);
    130    ASSERT_TRUE(buffer.get_string_view().empty());
    131 
    132    // Unknown locales return an empty string.
    133    buffer.clear();
    134    ASSERT_TRUE(displayNames
    135                    ->GetLanguage(buffer, MakeStringSpan("zz"),
    136                                  DisplayNames::Fallback::None)
    137                    .isOk());
    138    ASSERT_TRUE(buffer.verboseMatches(u""));
    139 
    140    // Unknown locales can fallback to the language code.
    141    buffer.clear();
    142    ASSERT_TRUE(displayNames
    143                    ->GetLanguage(buffer, MakeStringSpan("zz-US"),
    144                                  DisplayNames::Fallback::Code)
    145                    .isOk());
    146    ASSERT_TRUE(buffer.verboseMatches(u"zz-US"));
    147 
    148    // Unknown locales with a unicode extension error. Is this correct?
    149    buffer.clear();
    150    ASSERT_TRUE(displayNames
    151                    ->GetLanguage(buffer, MakeStringSpan("zz-US-u-ca-chinese"),
    152                                  DisplayNames::Fallback::Code)
    153                    .isErr());
    154    ASSERT_TRUE(buffer.verboseMatches(u""));
    155  }
    156  {
    157    auto result = DisplayNames::TryCreate("es-ES", options);
    158    ASSERT_TRUE(result.isOk());
    159    auto displayNames = result.unwrap();
    160 
    161    buffer.clear();
    162    ASSERT_TRUE(
    163        displayNames->GetLanguage(buffer, MakeStringSpan("es-ES")).isOk());
    164    ASSERT_TRUE(buffer.verboseMatches(u"español (España)"));
    165 
    166    buffer.clear();
    167    ASSERT_TRUE(
    168        displayNames->GetLanguage(buffer, MakeStringSpan("zh-Hant")).isOk());
    169    ASSERT_TRUE(buffer.verboseMatches(u"chino (tradicional)"));
    170  }
    171 }
    172 
    173 TEST(IntlDisplayNames, Region)
    174 {
    175  TestBuffer<char16_t> buffer;
    176 
    177  DisplayNames::Options options{};
    178  options.style = DisplayNames::Style::Long;
    179 
    180  {
    181    auto result = DisplayNames::TryCreate("en-US", options);
    182    ASSERT_TRUE(result.isOk());
    183    auto displayNames = result.unwrap();
    184 
    185    ASSERT_TRUE(displayNames->GetRegion(buffer, MakeStringSpan("US")).isOk());
    186    ASSERT_TRUE(buffer.verboseMatches(u"United States"));
    187 
    188    ASSERT_TRUE(displayNames->GetRegion(buffer, MakeStringSpan("ES")).isOk());
    189    ASSERT_TRUE(buffer.verboseMatches(u"Spain"));
    190 
    191    ASSERT_TRUE(displayNames
    192                    ->GetRegion(buffer, MakeStringSpan("ZX"),
    193                                DisplayNames::Fallback::None)
    194                    .isOk());
    195    ASSERT_TRUE(buffer.verboseMatches(u""));
    196 
    197    ASSERT_TRUE(displayNames
    198                    ->GetRegion(buffer, MakeStringSpan("ZX"),
    199                                DisplayNames::Fallback::Code)
    200                    .isOk());
    201    ASSERT_TRUE(buffer.verboseMatches(u"ZX"));
    202  }
    203  {
    204    auto result = DisplayNames::TryCreate("es-ES", options);
    205    ASSERT_TRUE(result.isOk());
    206    auto displayNames = result.unwrap();
    207 
    208    ASSERT_TRUE(displayNames->GetRegion(buffer, MakeStringSpan("US")).isOk());
    209    ASSERT_TRUE(buffer.verboseMatches(u"Estados Unidos"));
    210 
    211    ASSERT_TRUE(displayNames->GetRegion(buffer, MakeStringSpan("ES")).isOk());
    212    ASSERT_TRUE(buffer.verboseMatches(u"España"));
    213  }
    214 }
    215 
    216 TEST(IntlDisplayNames, Currency)
    217 {
    218  TestBuffer<char16_t> buffer;
    219 
    220  DisplayNames::Options options{};
    221  options.style = DisplayNames::Style::Long;
    222 
    223  auto result = DisplayNames::TryCreate("en-US", options);
    224  ASSERT_TRUE(result.isOk());
    225  auto displayNames = result.unwrap();
    226  ASSERT_TRUE(displayNames->GetCurrency(buffer, MakeStringSpan("EUR")).isOk());
    227  ASSERT_TRUE(buffer.verboseMatches(u"Euro"));
    228 
    229  ASSERT_TRUE(displayNames->GetCurrency(buffer, MakeStringSpan("USD")).isOk());
    230  ASSERT_TRUE(buffer.verboseMatches(u"US Dollar"));
    231 
    232  ASSERT_TRUE(displayNames
    233                  ->GetCurrency(buffer, MakeStringSpan("moz"),
    234                                DisplayNames::Fallback::None)
    235                  .isOk());
    236  ASSERT_TRUE(buffer.verboseMatches(u""));
    237 
    238  ASSERT_TRUE(displayNames
    239                  ->GetCurrency(buffer, MakeStringSpan("moz"),
    240                                DisplayNames::Fallback::Code)
    241                  .isOk());
    242  ASSERT_TRUE(buffer.verboseMatches(u"MOZ"));
    243 
    244  // Invalid options.
    245  {
    246    // Code with fewer than 3 characters.
    247    auto err = displayNames->GetCurrency(buffer, MakeStringSpan("US"));
    248    ASSERT_TRUE(err.isErr());
    249    ASSERT_EQ(err.unwrapErr(), DisplayNamesError::InvalidOption);
    250  }
    251  {
    252    // Code with more than 3 characters.
    253    auto err = displayNames->GetCurrency(buffer, MakeStringSpan("USDDDDDDD"));
    254    ASSERT_TRUE(err.isErr());
    255    ASSERT_EQ(err.unwrapErr(), DisplayNamesError::InvalidOption);
    256  }
    257  {
    258    // Code with non-ascii alpha letters/
    259    auto err = displayNames->GetCurrency(buffer, MakeStringSpan("US1"));
    260    ASSERT_TRUE(err.isErr());
    261    ASSERT_EQ(err.unwrapErr(), DisplayNamesError::InvalidOption);
    262  }
    263 }
    264 
    265 TEST(IntlDisplayNames, Calendar)
    266 {
    267  TestBuffer<char16_t> buffer;
    268 
    269  DisplayNames::Options options{};
    270  auto result = DisplayNames::TryCreate("en-US", options);
    271  ASSERT_TRUE(result.isOk());
    272  auto displayNames = result.unwrap();
    273 
    274  ASSERT_TRUE(
    275      displayNames->GetCalendar(buffer, MakeStringSpan("buddhist")).isOk());
    276  ASSERT_TRUE(buffer.verboseMatches(u"Buddhist Calendar"));
    277 
    278  ASSERT_TRUE(
    279      displayNames->GetCalendar(buffer, MakeStringSpan("gregory")).isOk());
    280  ASSERT_TRUE(buffer.verboseMatches(u"Gregorian Calendar"));
    281 
    282  ASSERT_TRUE(
    283      displayNames->GetCalendar(buffer, MakeStringSpan("GREGORY")).isOk());
    284  ASSERT_TRUE(buffer.verboseMatches(u"Gregorian Calendar"));
    285 
    286  {
    287    // Code with non-ascii alpha letters.
    288    auto err =
    289        displayNames->GetCalendar(buffer, MakeStringSpan("🥸 not ascii"));
    290    ASSERT_TRUE(err.isErr());
    291    ASSERT_EQ(err.unwrapErr(), DisplayNamesError::InvalidOption);
    292  }
    293  {
    294    // Empty string.
    295    auto err = displayNames->GetCalendar(buffer, MakeStringSpan(""));
    296    ASSERT_TRUE(err.isErr());
    297    ASSERT_EQ(err.unwrapErr(), DisplayNamesError::InvalidOption);
    298  }
    299  {
    300    // Non-valid ascii.
    301    auto err = displayNames->GetCalendar(
    302        buffer, MakeStringSpan("ascii-but_not(valid)1234"));
    303    ASSERT_TRUE(err.isErr());
    304    ASSERT_EQ(err.unwrapErr(), DisplayNamesError::InvalidOption);
    305  }
    306 
    307  // Test fallbacking.
    308 
    309  ASSERT_TRUE(displayNames
    310                  ->GetCalendar(buffer, MakeStringSpan("moz"),
    311                                DisplayNames::Fallback::None)
    312                  .isOk());
    313  ASSERT_TRUE(buffer.verboseMatches(u""));
    314 
    315  ASSERT_TRUE(displayNames
    316                  ->GetCalendar(buffer, MakeStringSpan("moz"),
    317                                DisplayNames::Fallback::Code)
    318                  .isOk());
    319  ASSERT_TRUE(buffer.verboseMatches(u"moz"));
    320 
    321  ASSERT_TRUE(displayNames
    322                  ->GetCalendar(buffer, MakeStringSpan("MOZ"),
    323                                DisplayNames::Fallback::Code)
    324                  .isOk());
    325  ASSERT_TRUE(buffer.verboseMatches(u"moz"));
    326 }
    327 
    328 TEST(IntlDisplayNames, Weekday)
    329 {
    330  TestBuffer<char16_t> buffer;
    331 
    332  DisplayNames::Options options{};
    333  Span<const char> calendar{};
    334  auto result = DisplayNames::TryCreate("en-US", options);
    335  ASSERT_TRUE(result.isOk());
    336  auto displayNames = result.unwrap();
    337 
    338  ASSERT_TRUE(
    339      displayNames->GetWeekday(buffer, Weekday::Monday, calendar).isOk());
    340  ASSERT_TRUE(buffer.verboseMatches(u"Monday"));
    341  ASSERT_TRUE(
    342      displayNames->GetWeekday(buffer, Weekday::Tuesday, calendar).isOk());
    343  ASSERT_TRUE(buffer.verboseMatches(u"Tuesday"));
    344  ASSERT_TRUE(
    345      displayNames->GetWeekday(buffer, Weekday::Wednesday, calendar).isOk());
    346  ASSERT_TRUE(buffer.verboseMatches(u"Wednesday"));
    347  ASSERT_TRUE(
    348      displayNames->GetWeekday(buffer, Weekday::Thursday, calendar).isOk());
    349  ASSERT_TRUE(buffer.verboseMatches(u"Thursday"));
    350  ASSERT_TRUE(
    351      displayNames->GetWeekday(buffer, Weekday::Friday, calendar).isOk());
    352  ASSERT_TRUE(buffer.verboseMatches(u"Friday"));
    353  ASSERT_TRUE(
    354      displayNames->GetWeekday(buffer, Weekday::Saturday, calendar).isOk());
    355  ASSERT_TRUE(buffer.verboseMatches(u"Saturday"));
    356  ASSERT_TRUE(
    357      displayNames->GetWeekday(buffer, Weekday::Sunday, calendar).isOk());
    358  ASSERT_TRUE(buffer.verboseMatches(u"Sunday"));
    359 }
    360 
    361 TEST(IntlDisplayNames, WeekdaySpanish)
    362 {
    363  TestBuffer<char16_t> buffer;
    364 
    365  DisplayNames::Options options{};
    366  Span<const char> calendar{};
    367  auto result = DisplayNames::TryCreate("es-ES", options);
    368  ASSERT_TRUE(result.isOk());
    369  auto displayNames = result.unwrap();
    370 
    371  ASSERT_TRUE(
    372      displayNames->GetWeekday(buffer, Weekday::Monday, calendar).isOk());
    373  ASSERT_TRUE(buffer.verboseMatches(u"lunes"));
    374  ASSERT_TRUE(
    375      displayNames->GetWeekday(buffer, Weekday::Tuesday, calendar).isOk());
    376  ASSERT_TRUE(buffer.verboseMatches(u"martes"));
    377  ASSERT_TRUE(
    378      displayNames->GetWeekday(buffer, Weekday::Wednesday, calendar).isOk());
    379  ASSERT_TRUE(buffer.verboseMatches(u"miércoles"));
    380  ASSERT_TRUE(
    381      displayNames->GetWeekday(buffer, Weekday::Thursday, calendar).isOk());
    382  ASSERT_TRUE(buffer.verboseMatches(u"jueves"));
    383  ASSERT_TRUE(
    384      displayNames->GetWeekday(buffer, Weekday::Friday, calendar).isOk());
    385  ASSERT_TRUE(buffer.verboseMatches(u"viernes"));
    386  ASSERT_TRUE(
    387      displayNames->GetWeekday(buffer, Weekday::Saturday, calendar).isOk());
    388  ASSERT_TRUE(buffer.verboseMatches(u"sábado"));
    389  ASSERT_TRUE(
    390      displayNames->GetWeekday(buffer, Weekday::Sunday, calendar).isOk());
    391  ASSERT_TRUE(buffer.verboseMatches(u"domingo"));
    392 }
    393 
    394 TEST(IntlDisplayNames, Month)
    395 {
    396  TestBuffer<char16_t> buffer;
    397 
    398  DisplayNames::Options options{};
    399  Span<const char> calendar{};
    400  auto result = DisplayNames::TryCreate("en-US", options);
    401  ASSERT_TRUE(result.isOk());
    402  auto displayNames = result.unwrap();
    403 
    404  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::January, calendar).isOk());
    405  ASSERT_TRUE(buffer.verboseMatches(u"January"));
    406  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::February, calendar).isOk());
    407  ASSERT_TRUE(buffer.verboseMatches(u"February"));
    408  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::March, calendar).isOk());
    409  ASSERT_TRUE(buffer.verboseMatches(u"March"));
    410  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::April, calendar).isOk());
    411  ASSERT_TRUE(buffer.verboseMatches(u"April"));
    412  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::May, calendar).isOk());
    413  ASSERT_TRUE(buffer.verboseMatches(u"May"));
    414  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::June, calendar).isOk());
    415  ASSERT_TRUE(buffer.verboseMatches(u"June"));
    416  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::July, calendar).isOk());
    417  ASSERT_TRUE(buffer.verboseMatches(u"July"));
    418  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::August, calendar).isOk());
    419  ASSERT_TRUE(buffer.verboseMatches(u"August"));
    420  ASSERT_TRUE(
    421      displayNames->GetMonth(buffer, Month::September, calendar).isOk());
    422  ASSERT_TRUE(buffer.verboseMatches(u"September"));
    423  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::October, calendar).isOk());
    424  ASSERT_TRUE(buffer.verboseMatches(u"October"));
    425  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::November, calendar).isOk());
    426  ASSERT_TRUE(buffer.verboseMatches(u"November"));
    427  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::December, calendar).isOk());
    428  ASSERT_TRUE(buffer.verboseMatches(u"December"));
    429  ASSERT_TRUE(
    430      displayNames->GetMonth(buffer, Month::Undecimber, calendar).isOk());
    431  ASSERT_TRUE(buffer.verboseMatches(u""));
    432 }
    433 
    434 TEST(IntlDisplayNames, MonthHebrew)
    435 {
    436  TestBuffer<char16_t> buffer;
    437 
    438  DisplayNames::Options options{};
    439  Span<const char> calendar{};
    440  auto result = DisplayNames::TryCreate("en-u-ca-hebrew", options);
    441  ASSERT_TRUE(result.isOk());
    442  auto displayNames = result.unwrap();
    443 
    444  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::January, calendar).isOk());
    445  ASSERT_TRUE(buffer.verboseMatches(u"Tishri"));
    446  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::February, calendar).isOk());
    447  ASSERT_TRUE(buffer.verboseMatches(u"Heshvan"));
    448  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::March, calendar).isOk());
    449  ASSERT_TRUE(buffer.verboseMatches(u"Kislev"));
    450  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::April, calendar).isOk());
    451  ASSERT_TRUE(buffer.verboseMatches(u"Tevet"));
    452  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::May, calendar).isOk());
    453  ASSERT_TRUE(buffer.verboseMatches(u"Shevat"));
    454  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::June, calendar).isOk());
    455  ASSERT_TRUE(buffer.verboseMatches(u"Adar I"));
    456  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::July, calendar).isOk());
    457  ASSERT_TRUE(buffer.verboseMatches(u"Adar"));
    458  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::August, calendar).isOk());
    459  ASSERT_TRUE(buffer.verboseMatches(u"Nisan"));
    460  ASSERT_TRUE(
    461      displayNames->GetMonth(buffer, Month::September, calendar).isOk());
    462  ASSERT_TRUE(buffer.verboseMatches(u"Iyar"));
    463  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::October, calendar).isOk());
    464  ASSERT_TRUE(buffer.verboseMatches(u"Sivan"));
    465  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::November, calendar).isOk());
    466  ASSERT_TRUE(buffer.verboseMatches(u"Tamuz"));
    467  ASSERT_TRUE(displayNames->GetMonth(buffer, Month::December, calendar).isOk());
    468  ASSERT_TRUE(buffer.verboseMatches(u"Av"));
    469  ASSERT_TRUE(
    470      displayNames->GetMonth(buffer, Month::Undecimber, calendar).isOk());
    471  ASSERT_TRUE(buffer.verboseMatches(u"Elul"));
    472 }
    473 
    474 TEST(IntlDisplayNames, MonthCalendarOption)
    475 {
    476  TestBuffer<char16_t> buffer;
    477 
    478  {
    479    // No calendar.
    480    DisplayNames::Options options{};
    481    Span<const char> calendar{};
    482    auto result = DisplayNames::TryCreate("en", options);
    483    ASSERT_TRUE(result.isOk());
    484    auto displayNames = result.unwrap();
    485 
    486    ASSERT_TRUE(
    487        displayNames->GetMonth(buffer, Month::January, calendar).isOk());
    488    ASSERT_TRUE(buffer.verboseMatches(u"January"));
    489  }
    490  {
    491    // Switch to hebrew.
    492    DisplayNames::Options options{};
    493    Span<const char> calendar = MakeStringSpan("hebrew");
    494    auto result = DisplayNames::TryCreate("en", options);
    495    ASSERT_TRUE(result.isOk());
    496    auto displayNames = result.unwrap();
    497 
    498    ASSERT_TRUE(
    499        displayNames->GetMonth(buffer, Month::January, calendar).isOk());
    500    ASSERT_TRUE(buffer.verboseMatches(u"Tishri"));
    501  }
    502  {
    503    // Conflicting tags.
    504    DisplayNames::Options options{};
    505    Span<const char> calendar = MakeStringSpan("hebrew");
    506    auto result = DisplayNames::TryCreate("en-u-ca-gregory", options);
    507    ASSERT_TRUE(result.isOk());
    508    auto displayNames = result.unwrap();
    509 
    510    ASSERT_TRUE(
    511        displayNames->GetMonth(buffer, Month::January, calendar).isOk());
    512    ASSERT_TRUE(buffer.verboseMatches(u"Tishri"));
    513  }
    514  {
    515    // Conflicting tags.
    516    DisplayNames::Options options{};
    517    Span<const char> calendar = MakeStringSpan("gregory");
    518    auto result = DisplayNames::TryCreate("en-u-ca-hebrew", options);
    519    ASSERT_TRUE(result.isOk());
    520    auto displayNames = result.unwrap();
    521 
    522    ASSERT_TRUE(
    523        displayNames->GetMonth(buffer, Month::January, calendar).isOk());
    524    ASSERT_TRUE(buffer.verboseMatches(u"January"));
    525  }
    526 }
    527 
    528 TEST(IntlDisplayNames, Quarter)
    529 {
    530  TestBuffer<char16_t> buffer;
    531 
    532  DisplayNames::Options options{};
    533  Span<const char> calendar{};
    534  auto result = DisplayNames::TryCreate("en-US", options);
    535  ASSERT_TRUE(result.isOk());
    536  auto displayNames = result.unwrap();
    537 
    538  ASSERT_TRUE(displayNames->GetQuarter(buffer, Quarter::Q1, calendar).isOk());
    539  ASSERT_TRUE(buffer.verboseMatches(u"1st quarter"));
    540  ASSERT_TRUE(displayNames->GetQuarter(buffer, Quarter::Q2, calendar).isOk());
    541  ASSERT_TRUE(buffer.verboseMatches(u"2nd quarter"));
    542  ASSERT_TRUE(displayNames->GetQuarter(buffer, Quarter::Q3, calendar).isOk());
    543  ASSERT_TRUE(buffer.verboseMatches(u"3rd quarter"));
    544  ASSERT_TRUE(displayNames->GetQuarter(buffer, Quarter::Q4, calendar).isOk());
    545  ASSERT_TRUE(buffer.verboseMatches(u"4th quarter"));
    546 }
    547 
    548 TEST(IntlDisplayNames, DayPeriod_en_US)
    549 {
    550  TestBuffer<char16_t> buffer;
    551 
    552  DisplayNames::Options options{};
    553  Span<const char> calendar{};
    554  auto result = DisplayNames::TryCreate("en-US", options);
    555  ASSERT_TRUE(result.isOk());
    556  auto displayNames = result.unwrap();
    557 
    558  ASSERT_TRUE(
    559      displayNames->GetDayPeriod(buffer, DayPeriod::AM, calendar).isOk());
    560  ASSERT_TRUE(buffer.verboseMatches(u"AM"));
    561  ASSERT_TRUE(
    562      displayNames->GetDayPeriod(buffer, DayPeriod::PM, calendar).isOk());
    563  ASSERT_TRUE(buffer.verboseMatches(u"PM"));
    564 }
    565 
    566 TEST(IntlDisplayNames, DayPeriod_ar)
    567 {
    568  TestBuffer<char16_t> buffer;
    569  DisplayNames::Options options{};
    570  Span<const char> calendar{};
    571  auto result = DisplayNames::TryCreate("ar", options);
    572  ASSERT_TRUE(result.isOk());
    573  auto displayNames = result.unwrap();
    574 
    575  ASSERT_TRUE(
    576      displayNames->GetDayPeriod(buffer, DayPeriod::AM, calendar).isOk());
    577  ASSERT_TRUE(buffer.verboseMatches(u"ص"));
    578  ASSERT_TRUE(
    579      displayNames->GetDayPeriod(buffer, DayPeriod::PM, calendar).isOk());
    580  ASSERT_TRUE(buffer.verboseMatches(u"م"));
    581 }
    582 
    583 TEST(IntlDisplayNames, DateTimeField)
    584 {
    585  TestBuffer<char16_t> buffer;
    586 
    587  DisplayNames::Options options{};
    588  Span<const char> locale = MakeStringSpan("en-US");
    589  auto result = DisplayNames::TryCreate(locale.data(), options);
    590  ASSERT_TRUE(result.isOk());
    591  auto displayNames = result.unwrap();
    592  auto gen = DateTimePatternGenerator::TryCreate(locale.data()).unwrap();
    593 
    594  ASSERT_TRUE(
    595      displayNames->GetDateTimeField(buffer, DateTimeField::Year, *gen).isOk());
    596  ASSERT_TRUE(buffer.verboseMatches(u"year"));
    597  ASSERT_TRUE(
    598      displayNames->GetDateTimeField(buffer, DateTimeField::Quarter, *gen)
    599          .isOk());
    600  ASSERT_TRUE(buffer.verboseMatches(u"quarter"));
    601  ASSERT_TRUE(displayNames->GetDateTimeField(buffer, DateTimeField::Month, *gen)
    602                  .isOk());
    603  ASSERT_TRUE(buffer.verboseMatches(u"month"));
    604  ASSERT_TRUE(
    605      displayNames->GetDateTimeField(buffer, DateTimeField::WeekOfYear, *gen)
    606          .isOk());
    607  ASSERT_TRUE(buffer.verboseMatches(u"week"));
    608  ASSERT_TRUE(
    609      displayNames->GetDateTimeField(buffer, DateTimeField::Weekday, *gen)
    610          .isOk());
    611  ASSERT_TRUE(buffer.verboseMatches(u"day of the week"));
    612  ASSERT_TRUE(
    613      displayNames->GetDateTimeField(buffer, DateTimeField::Day, *gen).isOk());
    614  ASSERT_TRUE(buffer.verboseMatches(u"day"));
    615  ASSERT_TRUE(
    616      displayNames->GetDateTimeField(buffer, DateTimeField::DayPeriod, *gen)
    617          .isOk());
    618  ASSERT_TRUE(buffer.verboseMatches(u"AM/PM"));
    619  ASSERT_TRUE(
    620      displayNames->GetDateTimeField(buffer, DateTimeField::Hour, *gen).isOk());
    621  ASSERT_TRUE(buffer.verboseMatches(u"hour"));
    622  ASSERT_TRUE(
    623      displayNames->GetDateTimeField(buffer, DateTimeField::Minute, *gen)
    624          .isOk());
    625  ASSERT_TRUE(buffer.verboseMatches(u"minute"));
    626  ASSERT_TRUE(
    627      displayNames->GetDateTimeField(buffer, DateTimeField::Second, *gen)
    628          .isOk());
    629  ASSERT_TRUE(buffer.verboseMatches(u"second"));
    630  ASSERT_TRUE(
    631      displayNames->GetDateTimeField(buffer, DateTimeField::TimeZoneName, *gen)
    632          .isOk());
    633  ASSERT_TRUE(buffer.verboseMatches(u"time zone"));
    634 }
    635 
    636 }  // namespace mozilla::intl