TestDateIntervalFormat.cpp (7348B)
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/DateIntervalFormat.h" 7 #include "mozilla/intl/DateTimeFormat.h" 8 #include "mozilla/intl/DateTimePart.h" 9 #include "mozilla/Span.h" 10 11 #include "unicode/uformattedvalue.h" 12 13 #include "TestBuffer.h" 14 15 namespace mozilla::intl { 16 17 const double DATE201901030000GMT = 1546473600000.0; 18 const double DATE201901050000GMT = 1546646400000.0; 19 20 TEST(IntlDateIntervalFormat, TryFormatDateTime) 21 { 22 UniquePtr<DateIntervalFormat> dif = 23 DateIntervalFormat::TryCreate(MakeStringSpan("en-US"), 24 MakeStringSpan(u"MMddHHmm"), 25 MakeStringSpan(u"GMT")) 26 .unwrap(); 27 28 AutoFormattedDateInterval formatted; 29 30 // Pass two same Date time, 'equal' should be true. 31 bool equal; 32 auto result = dif->TryFormatDateTime(DATE201901030000GMT, DATE201901030000GMT, 33 formatted, &equal); 34 ASSERT_TRUE(result.isOk()); 35 ASSERT_TRUE(equal); 36 37 auto spanResult = formatted.ToSpan(); 38 ASSERT_TRUE(spanResult.isOk()); 39 40 ASSERT_EQ(spanResult.unwrap(), MakeStringSpan(u"01/03, 00:00")); 41 42 result = dif->TryFormatDateTime(DATE201901030000GMT, DATE201901050000GMT, 43 formatted, &equal); 44 ASSERT_TRUE(result.isOk()); 45 ASSERT_FALSE(equal); 46 47 spanResult = formatted.ToSpan(); 48 ASSERT_TRUE(spanResult.isOk()); 49 ASSERT_EQ(spanResult.unwrap(), 50 MakeStringSpan(u"01/03, 00:00 – 01/05, 00:00")); 51 } 52 53 TEST(IntlDateIntervalFormat, TryFormatCalendar) 54 { 55 auto dateTimePatternGenerator = 56 DateTimePatternGenerator::TryCreate("en").unwrap(); 57 58 DateTimeFormat::ComponentsBag components; 59 components.year = Some(DateTimeFormat::Numeric::Numeric); 60 components.month = Some(DateTimeFormat::Month::TwoDigit); 61 components.day = Some(DateTimeFormat::Numeric::TwoDigit); 62 components.hour = Some(DateTimeFormat::Numeric::TwoDigit); 63 components.minute = Some(DateTimeFormat::Numeric::TwoDigit); 64 components.hour12 = Some(false); 65 66 UniquePtr<DateTimeFormat> dtFormat = 67 DateTimeFormat::TryCreateFromComponents( 68 MakeStringSpan("en-US"), components, dateTimePatternGenerator.get(), 69 Some(MakeStringSpan(u"GMT"))) 70 .unwrap(); 71 72 UniquePtr<DateIntervalFormat> dif = 73 DateIntervalFormat::TryCreate(MakeStringSpan("en-US"), 74 MakeStringSpan(u"MMddHHmm"), 75 MakeStringSpan(u"GMT")) 76 .unwrap(); 77 78 AutoFormattedDateInterval formatted; 79 80 // Two Calendar objects with the same date time. 81 auto sameCal = dtFormat->CloneCalendar(DATE201901030000GMT); 82 ASSERT_TRUE(sameCal.isOk()); 83 84 auto cal = sameCal.unwrap(); 85 bool equal; 86 auto result = dif->TryFormatCalendar(*cal, *cal, formatted, &equal); 87 ASSERT_TRUE(result.isOk()); 88 ASSERT_TRUE(equal); 89 90 auto spanResult = formatted.ToSpan(); 91 ASSERT_TRUE(spanResult.isOk()); 92 ASSERT_EQ(spanResult.unwrap(), MakeStringSpan(u"01/03, 00:00")); 93 94 auto startCal = dtFormat->CloneCalendar(DATE201901030000GMT); 95 ASSERT_TRUE(startCal.isOk()); 96 auto endCal = dtFormat->CloneCalendar(DATE201901050000GMT); 97 ASSERT_TRUE(endCal.isOk()); 98 99 result = dif->TryFormatCalendar(*startCal.unwrap(), *endCal.unwrap(), 100 formatted, &equal); 101 ASSERT_TRUE(result.isOk()); 102 ASSERT_FALSE(equal); 103 104 spanResult = formatted.ToSpan(); 105 ASSERT_TRUE(spanResult.isOk()); 106 ASSERT_EQ(spanResult.unwrap(), 107 MakeStringSpan(u"01/03, 00:00 – 01/05, 00:00")); 108 } 109 110 TEST(IntlDateIntervalFormat, TryFormattedToParts) 111 { 112 UniquePtr<DateIntervalFormat> dif = 113 DateIntervalFormat::TryCreate(MakeStringSpan("en-US"), 114 MakeStringSpan(u"MMddHHmm"), 115 MakeStringSpan(u"GMT")) 116 .unwrap(); 117 118 AutoFormattedDateInterval formatted; 119 bool equal; 120 auto result = dif->TryFormatDateTime(DATE201901030000GMT, DATE201901050000GMT, 121 formatted, &equal); 122 ASSERT_TRUE(result.isOk()); 123 ASSERT_FALSE(equal); 124 125 Span<const char16_t> formattedSpan = formatted.ToSpan().unwrap(); 126 ASSERT_EQ(formattedSpan, MakeStringSpan(u"01/03, 00:00 – 01/05, 00:00")); 127 128 mozilla::intl::DateTimePartVector parts; 129 result = dif->TryFormattedToParts(formatted, parts); 130 ASSERT_TRUE(result.isOk()); 131 132 auto getSubSpan = [formattedSpan, &parts](size_t index) { 133 size_t start = index == 0 ? 0 : parts[index - 1].mEndIndex; 134 size_t end = parts[index].mEndIndex; 135 return formattedSpan.FromTo(start, end); 136 }; 137 138 ASSERT_EQ(parts[0].mType, DateTimePartType::Month); 139 ASSERT_EQ(getSubSpan(0), MakeStringSpan(u"01")); 140 ASSERT_EQ(parts[0].mSource, DateTimePartSource::StartRange); 141 142 ASSERT_EQ(parts[1].mType, DateTimePartType::Literal); 143 ASSERT_EQ(getSubSpan(1), MakeStringSpan(u"/")); 144 ASSERT_EQ(parts[1].mSource, DateTimePartSource::StartRange); 145 146 ASSERT_EQ(parts[2].mType, DateTimePartType::Day); 147 ASSERT_EQ(getSubSpan(2), MakeStringSpan(u"03")); 148 ASSERT_EQ(parts[2].mSource, DateTimePartSource::StartRange); 149 150 ASSERT_EQ(parts[3].mType, DateTimePartType::Literal); 151 ASSERT_EQ(getSubSpan(3), MakeStringSpan(u", ")); 152 ASSERT_EQ(parts[3].mSource, DateTimePartSource::StartRange); 153 154 ASSERT_EQ(parts[4].mType, DateTimePartType::Hour); 155 ASSERT_EQ(getSubSpan(4), MakeStringSpan(u"00")); 156 ASSERT_EQ(parts[4].mSource, DateTimePartSource::StartRange); 157 158 ASSERT_EQ(parts[5].mType, DateTimePartType::Literal); 159 ASSERT_EQ(getSubSpan(5), MakeStringSpan(u":")); 160 ASSERT_EQ(parts[5].mSource, DateTimePartSource::StartRange); 161 162 ASSERT_EQ(parts[6].mType, DateTimePartType::Minute); 163 ASSERT_EQ(getSubSpan(6), MakeStringSpan(u"00")); 164 ASSERT_EQ(parts[6].mSource, DateTimePartSource::StartRange); 165 166 ASSERT_EQ(parts[7].mType, DateTimePartType::Literal); 167 ASSERT_EQ(getSubSpan(7), MakeStringSpan(u" – ")); 168 ASSERT_EQ(parts[7].mSource, DateTimePartSource::Shared); 169 170 ASSERT_EQ(parts[8].mType, DateTimePartType::Month); 171 ASSERT_EQ(getSubSpan(8), MakeStringSpan(u"01")); 172 ASSERT_EQ(parts[8].mSource, DateTimePartSource::EndRange); 173 174 ASSERT_EQ(parts[9].mType, DateTimePartType::Literal); 175 ASSERT_EQ(getSubSpan(9), MakeStringSpan(u"/")); 176 ASSERT_EQ(parts[9].mSource, DateTimePartSource::EndRange); 177 178 ASSERT_EQ(parts[10].mType, DateTimePartType::Day); 179 ASSERT_EQ(getSubSpan(10), MakeStringSpan(u"05")); 180 ASSERT_EQ(parts[10].mSource, DateTimePartSource::EndRange); 181 182 ASSERT_EQ(parts[11].mType, DateTimePartType::Literal); 183 ASSERT_EQ(getSubSpan(11), MakeStringSpan(u", ")); 184 ASSERT_EQ(parts[11].mSource, DateTimePartSource::EndRange); 185 186 ASSERT_EQ(parts[12].mType, DateTimePartType::Hour); 187 ASSERT_EQ(getSubSpan(12), MakeStringSpan(u"00")); 188 ASSERT_EQ(parts[12].mSource, DateTimePartSource::EndRange); 189 190 ASSERT_EQ(parts[13].mType, DateTimePartType::Literal); 191 ASSERT_EQ(getSubSpan(13), MakeStringSpan(u":")); 192 ASSERT_EQ(parts[13].mSource, DateTimePartSource::EndRange); 193 194 ASSERT_EQ(parts[14].mType, DateTimePartType::Minute); 195 ASSERT_EQ(getSubSpan(14), MakeStringSpan(u"00")); 196 ASSERT_EQ(parts[14].mSource, DateTimePartSource::EndRange); 197 198 ASSERT_EQ(parts.length(), 15u); 199 } 200 } // namespace mozilla::intl