TestRelativeTimeFormat.cpp (6216B)
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/RelativeTimeFormat.h" 7 #include "TestBuffer.h" 8 9 namespace mozilla::intl { 10 11 TEST(IntlRelativeTimeFormat, Basic) 12 { 13 RelativeTimeFormatOptions options = {}; 14 Result<UniquePtr<RelativeTimeFormat>, ICUError> res = 15 RelativeTimeFormat::TryCreate("en-US", options); 16 ASSERT_TRUE(res.isOk()); 17 UniquePtr<RelativeTimeFormat> rtf = res.unwrap(); 18 TestBuffer<char> buf8; 19 ASSERT_TRUE( 20 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Day, buf8).isOk()); 21 ASSERT_EQ(buf8.get_string_view(), "in 1.2 days"); 22 23 TestBuffer<char16_t> buf16; 24 ASSERT_TRUE( 25 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Day, buf16).isOk()); 26 ASSERT_EQ(buf16.get_string_view(), u"in 1.2 days"); 27 28 res = RelativeTimeFormat::TryCreate("es-AR", options); 29 ASSERT_TRUE(res.isOk()); 30 rtf = res.unwrap(); 31 buf8.clear(); 32 ASSERT_TRUE( 33 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Day, buf8).isOk()); 34 ASSERT_EQ(buf8.get_string_view(), "dentro de 1,2 días"); 35 36 buf16.clear(); 37 ASSERT_TRUE( 38 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Day, buf16).isOk()); 39 ASSERT_EQ(buf16.get_string_view(), u"dentro de 1,2 días"); 40 41 res = RelativeTimeFormat::TryCreate("ar-EG", options); 42 ASSERT_TRUE(res.isOk()); 43 rtf = res.unwrap(); 44 buf8.clear(); 45 ASSERT_TRUE( 46 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Day, buf8).isOk()); 47 ASSERT_EQ(buf8.get_string_view(), "خلال ١٫٢ يوم"); 48 49 buf16.clear(); 50 ASSERT_TRUE( 51 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Day, buf16).isOk()); 52 ASSERT_EQ(buf16.get_string_view(), u"خلال ١٫٢ يوم"); 53 } 54 55 TEST(IntlRelativeTimeFormat, Options) 56 { 57 RelativeTimeFormatOptions options = { 58 RelativeTimeFormatOptions::Style::Short, 59 RelativeTimeFormatOptions::Numeric::Auto}; 60 Result<UniquePtr<RelativeTimeFormat>, ICUError> res = 61 RelativeTimeFormat::TryCreate("fr", options); 62 ASSERT_TRUE(res.isOk()); 63 UniquePtr<RelativeTimeFormat> rtf = res.unwrap(); 64 TestBuffer<char> buf8; 65 ASSERT_TRUE( 66 rtf->format(-3.14, RelativeTimeFormat::FormatUnit::Year, buf8).isOk()); 67 ASSERT_EQ(buf8.get_string_view(), "il y a 3,14 a"); 68 69 options = {RelativeTimeFormatOptions::Style::Narrow, 70 RelativeTimeFormatOptions::Numeric::Auto}; 71 res = RelativeTimeFormat::TryCreate("fr", options); 72 ASSERT_TRUE(res.isOk()); 73 rtf = res.unwrap(); 74 buf8.clear(); 75 ASSERT_TRUE( 76 rtf->format(-3.14, RelativeTimeFormat::FormatUnit::Year, buf8).isOk()); 77 ASSERT_EQ(buf8.get_string_view(), "-3,14 a"); 78 79 options = {RelativeTimeFormatOptions::Style::Long, 80 RelativeTimeFormatOptions::Numeric::Auto}; 81 res = RelativeTimeFormat::TryCreate("fr", options); 82 ASSERT_TRUE(res.isOk()); 83 rtf = res.unwrap(); 84 buf8.clear(); 85 ASSERT_TRUE( 86 rtf->format(-3.14, RelativeTimeFormat::FormatUnit::Year, buf8).isOk()); 87 ASSERT_EQ(buf8.get_string_view(), "il y a 3,14 ans"); 88 89 options = {RelativeTimeFormatOptions::Style::Long, 90 RelativeTimeFormatOptions::Numeric::Auto}; 91 res = RelativeTimeFormat::TryCreate("fr", options); 92 ASSERT_TRUE(res.isOk()); 93 rtf = res.unwrap(); 94 buf8.clear(); 95 ASSERT_TRUE( 96 rtf->format(-1, RelativeTimeFormat::FormatUnit::Year, buf8).isOk()); 97 ASSERT_EQ(buf8.get_string_view(), "l’année dernière"); 98 } 99 100 TEST(IntlRelativeTimeFormat, Units) 101 { 102 RelativeTimeFormatOptions options = {}; 103 Result<UniquePtr<RelativeTimeFormat>, ICUError> res = 104 RelativeTimeFormat::TryCreate("en-US", options); 105 ASSERT_TRUE(res.isOk()); 106 UniquePtr<RelativeTimeFormat> rtf = res.unwrap(); 107 TestBuffer<char> buf8; 108 ASSERT_TRUE( 109 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Second, buf8).isOk()); 110 ASSERT_EQ(buf8.get_string_view(), "in 1.2 seconds"); 111 ASSERT_TRUE( 112 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Minute, buf8).isOk()); 113 ASSERT_EQ(buf8.get_string_view(), "in 1.2 minutes"); 114 ASSERT_TRUE( 115 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Hour, buf8).isOk()); 116 ASSERT_EQ(buf8.get_string_view(), "in 1.2 hours"); 117 ASSERT_TRUE( 118 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Day, buf8).isOk()); 119 ASSERT_EQ(buf8.get_string_view(), "in 1.2 days"); 120 ASSERT_TRUE( 121 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Week, buf8).isOk()); 122 ASSERT_EQ(buf8.get_string_view(), "in 1.2 weeks"); 123 ASSERT_TRUE( 124 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Month, buf8).isOk()); 125 ASSERT_EQ(buf8.get_string_view(), "in 1.2 months"); 126 ASSERT_TRUE( 127 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Quarter, buf8).isOk()); 128 ASSERT_EQ(buf8.get_string_view(), "in 1.2 quarters"); 129 ASSERT_TRUE( 130 rtf->format(1.2, RelativeTimeFormat::FormatUnit::Year, buf8).isOk()); 131 ASSERT_EQ(buf8.get_string_view(), "in 1.2 years"); 132 } 133 134 TEST(IntlRelativeTimeFormat, FormatToParts) 135 { 136 RelativeTimeFormatOptions options = { 137 RelativeTimeFormatOptions::Style::Long, 138 RelativeTimeFormatOptions::Numeric::Auto}; 139 Result<UniquePtr<RelativeTimeFormat>, ICUError> res = 140 RelativeTimeFormat::TryCreate("es-AR", options); 141 ASSERT_TRUE(res.isOk()); 142 UniquePtr<RelativeTimeFormat> rtf = res.unwrap(); 143 NumberPartVector parts; 144 Result<Span<const char16_t>, ICUError> strRes = 145 rtf->formatToParts(-1.2, RelativeTimeFormat::FormatUnit::Year, parts); 146 ASSERT_TRUE(strRes.isOk()); 147 ASSERT_EQ(strRes.unwrap(), MakeStringSpan(u"hace 1,2 años")); 148 ASSERT_EQ(parts.length(), 5U); 149 ASSERT_EQ(parts[0], 150 (NumberPart{NumberPartType::Literal, NumberPartSource::Shared, 5})); 151 ASSERT_EQ(parts[1], 152 (NumberPart{NumberPartType::Integer, NumberPartSource::Shared, 6})); 153 ASSERT_EQ(parts[2], 154 (NumberPart{NumberPartType::Decimal, NumberPartSource::Shared, 7})); 155 ASSERT_EQ(parts[3], (NumberPart{NumberPartType::Fraction, 156 NumberPartSource::Shared, 8})); 157 ASSERT_EQ(parts[4], (NumberPart{NumberPartType::Literal, 158 NumberPartSource::Shared, 13})); 159 } 160 161 } // namespace mozilla::intl