summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/Date/parse-dashed-numeric-date.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/tests/non262/Date/parse-dashed-numeric-date.js')
-rw-r--r--js/src/tests/non262/Date/parse-dashed-numeric-date.js133
1 files changed, 133 insertions, 0 deletions
diff --git a/js/src/tests/non262/Date/parse-dashed-numeric-date.js b/js/src/tests/non262/Date/parse-dashed-numeric-date.js
new file mode 100644
index 0000000000..b0bd1a35ec
--- /dev/null
+++ b/js/src/tests/non262/Date/parse-dashed-numeric-date.js
@@ -0,0 +1,133 @@
+// |reftest| skip-if(xulRuntime.OS=="WINNT") -- Windows doesn't accept IANA names for the TZ env variable
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+inTimeZone("MST", () => {
+ // The upper limit is from the TimeClip algorithm:
+ // https://tc39.es/ecma262/#sec-timeclip
+ // https://tc39.es/ecma262/#sec-utc-t
+ //
+ // The result is in localtime but the limit is processed in GMT, which
+ // is why these are offset from the actual limit of 275760-09-13T00:00:00
+ // (in this case by 7h, because we're testing in MST)
+ const accepted = {
+ "19999-09-12": new Date(19999, Month.September, 12),
+ "19999-9-1": new Date(19999, Month.September, 1),
+ "19999-9-1 ": new Date(19999, Month.September, 1),
+ "275760-09-12": new Date(275760, Month.September, 12),
+ "275760-09-12 17:00:00": new Date(275760, Month.September, 12, 17),
+ "19999-09-12 (comment) 23:00:00": new Date(19999, Month.September, 12, 23),
+ "19999-09-12 22:00:00 GMT-0800": new Date(19999, Month.September, 12, 23),
+
+ // Single digit mon or mday
+ "2021-09-1": new Date(2021, Month.September, 1),
+ "2021-9-01": new Date(2021, Month.September, 1),
+ "2021-9-1": new Date(2021, Month.September, 1),
+
+ // 1-12 for first number should be month
+ "1-09-12": new Date(2012, Month.January, 9),
+ "1-09-2012": new Date(2012, Month.January, 9),
+ "12-09-12": new Date(2012, Month.December, 9),
+
+ // 32-99 for first number is the year...
+ // 32-49 are 2032-2049, 50-99 are 1950-1999
+ "32-09-12": new Date(2032, Month.September, 12),
+ "49-09-12": new Date(2049, Month.September, 12),
+ "50-09-12": new Date(1950, Month.September, 12),
+ "99-09-12": new Date(1999, Month.September, 12),
+
+ // Year 0 is 2000
+ "0-9-12": new Date(2000, Month.September, 12),
+ "9-12-0": new Date(2000, Month.September, 12),
+
+ // 3-digit year is also fine
+ "999-09-12": new Date(999, Month.September, 12),
+
+ // Bug 1617258 (result is -7 hours)
+ "2020-03-24 12:54:40 AM +00:00": new Date(2020, Month.March, 23, 17, 54, 40),
+
+ // Oddball time formats for Chrome parity
+ "9999-09-12 :00:01": new Date(9999, Month.September, 12, 0, 1),
+ // TODO: This one still does not have parity- bug 1858595
+ "9999-09-12 01::01": new Date(9999, Month.September, 12, 1, 1, 0),
+
+ // mday > # of days in mon rolls over to the next month
+ // as long as mday <= 31 (2022 is not a leap year)
+ // These are processed as ISO dates, therefore are in GMT
+ "2022-02-29": new Date(2022, Month.February, 28, 17),
+ "2022-02-30": new Date(2022, Month.March, 1, 17),
+ "2022-02-31": new Date(2022, Month.March, 2, 17),
+
+ // No space before time zone
+ "19999-9-1MST": new Date(19999, Month.September, 1),
+ "19999-9-1GMT-07": new Date(19999, Month.September, 1),
+
+ // Delimiter other than space after prefix
+ "19999-9-1.10:13:14": new Date(19999, Month.September, 1, 10, 13, 14),
+ "19999-9-1,10:13:14": new Date(19999, Month.September, 1, 10, 13, 14),
+ "19999-9-1-10:13:14": new Date(19999, Month.September, 1, 10, 13, 14),
+ "19999-9-1-4:30": new Date(19999, Month.September, 1, 4, 30),
+ "19999-9-1/10:13:14": new Date(19999, Month.September, 1, 10, 13, 14),
+ "19999-9-1()10:13:14": new Date(19999, Month.September, 1, 10, 13, 14),
+ // Open paren only comments out the time
+ "19999-9-1(10:13:14": new Date(19999, Month.September, 1),
+ };
+ const rejected = [
+ "275760-09-12 17:00:01",
+ "275760-09-13",
+
+ // Rejected delimiters after prefix
+ "19999-09-12T00:00:00",
+ "19999-09-12:00:00:00",
+ "19999-09-12^00:00:00",
+ "19999-09-12|00:00:00",
+ "19999-09-12~00:00:00",
+ "19999-09-12+00:00:00",
+ "19999-09-12=00:00:00",
+ "19999-09-12?00:00:00",
+
+ // 13-31 for first number is invalid (after 31 can be parsed as YY-MM-DD),
+ // but 32 is still no good if the last number is a YYYY
+ "13-09-12",
+ "13-09-2012",
+ "31-09-12",
+ "31-09-2012",
+ "32-09-2012",
+
+ // mday > 31 is invalid, does not roll over to the next month
+ "2022-02-32",
+ // month > 12
+ "2022-13-30",
+
+ // 00 for mon or mday
+ "0000-00-00",
+ "0000-01-00",
+ "0000-00-01",
+ ];
+
+ for (const [test, dateObject] of Object.entries(accepted)) {
+ const testDate = new Date(test);
+
+ assertEq(
+ false, isNaN(testDate),
+ `${test} should be accepted.`
+ );
+
+ assertEq(
+ testDate.getTime(), dateObject.getTime(),
+ `"${test}" should be ${dateObject} (got ${testDate}).`
+ );
+ }
+
+ for (const reject of rejected) {
+ assertEq(
+ true, isNaN(new Date(reject)),
+ `"${reject}" should be rejected.`
+ );
+ }
+});
+
+if (typeof reportCompare === "function")
+ reportCompare(true, true);