TestNumberRangeFormat.cpp (4417B)
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 <string_view> 7 8 #include "mozilla/intl/NumberRangeFormat.h" 9 #include "./TestBuffer.h" 10 11 namespace mozilla { 12 namespace intl { 13 14 using namespace std::literals; 15 16 TEST(IntlNumberRangeFormat, Basic) 17 { 18 NumberRangeFormatOptions options; 19 UniquePtr<NumberRangeFormat> nf = 20 NumberRangeFormat::TryCreate("en-US", options).unwrap(); 21 22 const char16_t* res16 = nf->format(1234.56, 1234.56).unwrap().data(); 23 ASSERT_TRUE(res16 != nullptr); 24 ASSERT_EQ(res16, u"1,234.56"sv); 25 26 options.mRangeIdentityFallback = NumberRangeFormatOptions::Approximately; 27 nf = std::move(NumberRangeFormat::TryCreate("en-US", options).unwrap()); 28 29 res16 = nf->format("1234.56", "1234.56").unwrap().data(); 30 ASSERT_TRUE(res16 != nullptr); 31 ASSERT_EQ(res16, u"~1,234.56"sv); 32 33 res16 = nf->format("1234.56", "2999.89").unwrap().data(); 34 ASSERT_TRUE(res16 != nullptr); 35 ASSERT_EQ(res16, u"1,234.56–2,999.89"sv); 36 37 nf = std::move(NumberRangeFormat::TryCreate("ar", options).unwrap()); 38 39 res16 = nfAr->format(1234.56, 1234.56).unwrap().data(); 40 ASSERT_TRUE(res16 != nullptr); 41 ASSERT_EQ(res16, u"~١٬٢٣٤٫٥٦"sv); 42 43 res16 = nfAr->format(1234.56, 2999.89).unwrap().data(); 44 ASSERT_TRUE(res16 != nullptr); 45 ASSERT_EQ(res16, u"١٬٢٣٤٫٥٦–٢٬٩٩٩٫٨٩"sv); 46 } 47 48 TEST(IntlNumberRangeFormat, Currency) 49 { 50 NumberRangeFormatOptions options; 51 options.mCurrency = Some( 52 std::make_pair("MXN", NumberRangeFormatOptions::CurrencyDisplay::Symbol)); 53 UniquePtr<NumberRangeFormat> nf = 54 NumberRangeFormat::TryCreate("es-MX", options).unwrap(); 55 56 const char16_t* res = nf->format(123456.789, 299999.89).unwrap().data(); 57 ASSERT_TRUE(res != nullptr); 58 ASSERT_EQ(std::u16string_view(res), u"$123,456.79 - $299,999.89"sv); 59 60 options.mCurrency = Some( 61 std::make_pair("EUR", NumberRangeFormatOptions::CurrencyDisplay::Symbol)); 62 nf = std::move(NumberRangeFormat::TryCreate("fr", options).unwrap()); 63 64 res = nf->format(123456.789, 299999.89).unwrap().data(); 65 ASSERT_TRUE(res != nullptr); 66 ASSERT_EQ(std::u16string_view(res), u"123 456,79–299 999,89 €"sv); 67 } 68 69 TEST(IntlNumberRangeFormat, Unit) 70 { 71 NumberRangeFormatOptions options; 72 options.mUnit = Some(std::make_pair( 73 "meter-per-second", NumberRangeFormatOptions::UnitDisplay::Long)); 74 UniquePtr<NumberRangeFormat> nf = 75 NumberRangeFormat::TryCreate("es-MX", options).unwrap(); 76 77 const char16_t* res = nf->format(12.34, 56.78).unwrap().data(); 78 ASSERT_TRUE(res != nullptr); 79 ASSERT_EQ(std::u16string_view(res), u"12.34-56.78 metros por segundo"); 80 } 81 82 TEST(IntlNumberRangeFormat, FormatToParts) 83 { 84 NumberRangeFormatOptions options; 85 UniquePtr<NumberRangeFormat> nf = 86 NumberRangeFormat::TryCreate("es-ES", options).unwrap(); 87 NumberPartVector parts; 88 const char16_t* res = 89 nf->formatToParts(123456.789, 299999.89, parts).unwrap().data(); 90 ASSERT_TRUE(res != nullptr); 91 ASSERT_EQ(std::u16string_view(res), u"123.456,789-299.999,89"sv); 92 ASSERT_EQ(parts.length(), 11U); 93 ASSERT_EQ(parts[0], 94 (NumberPart{NumberPartType::Integer, NumberPartSource::Start, 3})); 95 ASSERT_EQ(parts[1], 96 (NumberPart{NumberPartType::Group, NumberPartSource::Start, 4})); 97 ASSERT_EQ(parts[2], 98 (NumberPart{NumberPartType::Integer, NumberPartSource::Start, 7})); 99 ASSERT_EQ(parts[3], 100 (NumberPart{NumberPartType::Decimal, NumberPartSource::Start, 8})); 101 ASSERT_EQ(parts[4], (NumberPart{NumberPartType::Fraction, 102 NumberPartSource::Start, 11})); 103 ASSERT_EQ(parts[5], (NumberPart{NumberPartType::Fraction, 104 NumberPartSource::Shared, 12})); 105 ASSERT_EQ(parts[6], 106 (NumberPart{NumberPartType::Integer, NumberPartSource::End, 15})); 107 ASSERT_EQ(parts[7], 108 (NumberPart{NumberPartType::Group, NumberPartSource::End, 16})); 109 ASSERT_EQ(parts[8], 110 (NumberPart{NumberPartType::Integer, NumberPartSource::End, 19})); 111 ASSERT_EQ(parts[9], 112 (NumberPart{NumberPartType::Decimal, NumberPartSource::End, 20})); 113 ASSERT_EQ(parts[10], 114 (NumberPart{NumberPartType::Fraction, NumberPartSource::End, 23})); 115 } 116 117 } // namespace intl 118 } // namespace mozilla