tor-browser

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

remapping-era.js (4134B)


      1 // |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally
      2 // Copyright (C) 2025 Igalia, S.L. All rights reserved.
      3 // This code is governed by the BSD license found in the LICENSE file.
      4 
      5 /*---
      6 esid: sec-temporal.plaindate.from
      7 description: Test remapping behaviour of regnal eras
      8 info: |
      9  CalendarDateFromFields:
     10  1. Perform ? CalendarResolveFields(_calendar_, _fields_, _date_).
     11  2. Let result be ? CalendarDateToISO(_calendar_, _fields_, _overflow_).
     12 
     13  CalendarResolveFields:
     14  When the fields of _fields_ are inconsistent with respect to a non-unset
     15  _fields_.[[Era]], it is recommended that _fields_.[[Era]] and
     16  _fields_.[[EraYear]] be updated to resolve the inconsistency by lenient
     17  interpretation of out-of-bounds values (rather than throwing a *RangeError*),
     18  which is particularly useful for consistent interpretation of dates in
     19  calendars with regnal eras.
     20 
     21 includes: [temporalHelpers.js]
     22 features: [Temporal, Intl.Era-monthcode]
     23 ---*/
     24 
     25 // Based on a test originally by André Bargull <andre.bargull@gmail.com>
     26 
     27 // Notes:
     28 // - "heisei" era started January 8, 1989.
     29 // - "reiwa" era started May 1, 2019.
     30 
     31 for (const overflow of ["constrain", "reject"]) {
     32  function test(fields) {
     33    return Temporal.PlainDate.from({ ...fields, calendar: "japanese" }, { overflow });
     34  }
     35 
     36  // Reiwa era started in month 5 of the year, so the era of month 1 is remapped
     37  // to be the correct one for the month.
     38  TemporalHelpers.assertPlainDate(
     39    test({ era: "reiwa", eraYear: 1, monthCode: "M01", day: 24 }),
     40    2019, 1, "M01", 24,
     41    "Reiwa 1 before May is mapped to Heisei 31",
     42    "heisei", 31
     43  );
     44 
     45  // Reiwa era started on the first day of the month, so day 1 does not need
     46  // remapping.
     47  TemporalHelpers.assertPlainDate(
     48    test({ era: "reiwa", eraYear: 1, monthCode: "M05", day: 1 }),
     49    2019, 5, "M05", 1,
     50    "05-01 Reiwa 1 is not remapped",
     51    "reiwa", 1
     52  );
     53 
     54  // Heisei era started on the eighth day of the month. So on previous days the
     55  // era is remapped to be the correct one for the day.
     56  TemporalHelpers.assertPlainDate(
     57    test({ era: "heisei", eraYear: 1, monthCode: "M01", day: 4 }),
     58    1989, 1, "M01", 4,
     59    "01-04 Heisei 1 is remapped to 01-04 Showa 64",
     60    "showa", 64
     61  );
     62 
     63  // Era year past the end of the Heisei era is remapped to Reiwa era
     64  TemporalHelpers.assertPlainDate(
     65    test({ era: "heisei", eraYear: 37, monthCode: "M04", day: 25 }),
     66    2025, 4, "M04", 25,
     67    "Heisei 37 is remapped to Reiwa 7",
     68    "reiwa", 7
     69  );
     70 
     71  // Zero year in a 1-based era is remapped to the previous era
     72  TemporalHelpers.assertPlainDate(
     73    test({ era: "reiwa", eraYear: 0, monthCode: "M04", day: 25 }),
     74    2018, 4, "M04", 25,
     75    "Reiwa 0 is remapped to Heisei 30",
     76    "heisei", 30
     77  );
     78 
     79  // Negative year in a forward-counting era is remapped to the previous era
     80  TemporalHelpers.assertPlainDate(
     81    test({ era: "reiwa", eraYear: -20, monthCode: "M04", day: 25 }),
     82    1998, 4, "M04", 25,
     83    "Reiwa -20 is remapped to Heisei 10",
     84    "heisei", 10
     85  );
     86 
     87  // Test the last two things for Gregorian eras as well
     88  function testGregorian(fields) {
     89    return Temporal.PlainDate.from({ ...fields, calendar: "gregory" }, { overflow });
     90  }
     91  TemporalHelpers.assertPlainDate(
     92    testGregorian({ era: "ce", eraYear: 0, monthCode: "M04", day: 25 }),
     93    0, 4, "M04", 25,
     94    "0 CE is remapped to 1 BCE",
     95    "bce", 1
     96  );
     97  TemporalHelpers.assertPlainDate(
     98    testGregorian({ era: "ce", eraYear: -20, monthCode: "M04", day: 25 }),
     99    -20, 4, "M04", 25,
    100    "-20 CE is remapped to 21 BCE",
    101    "bce", 21
    102  );
    103 
    104  // Zero year in a backwards-counting era is remapped to the next era
    105  TemporalHelpers.assertPlainDate(
    106    testGregorian({ era: "bce", eraYear: 0, monthCode: "M04", day: 25 }),
    107    1, 4, "M04", 25,
    108    "0 BCE is remapped to 1 CE",
    109    "ce", 1
    110  );
    111 
    112  // Negative year in a backwards-counting era is remapped to the next era
    113  TemporalHelpers.assertPlainDate(
    114    testGregorian({ era: "bce", eraYear: -20, monthCode: "M04", day: 25 }),
    115    21, 4, "M04", 25,
    116    "-20 BCE is remapped to 21 CE",
    117    "ce", 21
    118  );
    119 }
    120 
    121 reportCompare(0, 0);