tor-browser

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

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