1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 09:17:35 +00:00

LibJS Date: Added "Invalid Date".

Setting an invalid value on a Date object now makes it invalid.
Setting it again but with correct values makes it valid again.
This commit is contained in:
Petróczi Zoltán 2021-03-16 15:02:16 +01:00 committed by Andreas Kling
parent d231c5e65b
commit ca49f96b78
29 changed files with 490 additions and 89 deletions

View file

@ -24,6 +24,13 @@ test("timestamp constructor", () => {
expect(date.getSeconds()).toBe(1);
expect(date.getFullYear()).toBe(1970);
expect(date.getMonth()).toBe(1); // Feb
date = new Date(NaN);
expect(date.getTime()).toBe(NaN);
date = new Date(undefined);
expect(date.getTime()).toBe(NaN);
date = new Date("");
expect(date.getTime()).toBe(NaN);
});
test("tuple constructor", () => {
@ -52,6 +59,11 @@ test("tuple constructor", () => {
let timestamp_upper_bound = 1577750400000; // 2019-12-31T00:00:00Z
expect(date.getTime()).toBeGreaterThan(timestamp_lower_bound);
expect(date.getTime()).toBeLessThan(timestamp_upper_bound);
date = new Date(NaN, 11, 15, 9, 16, 14, 123);
expect(date.getTime()).toBe(NaN);
date = new Date(2021, 11, 15, 9, 16, 14, undefined);
expect(date.getTime()).toBe(NaN);
});
test("tuple constructor overflow", () => {
@ -65,7 +77,7 @@ test("tuple constructor overflow", () => {
expect(date.getMilliseconds()).toBe(345);
expect(date.getDay()).toBe(4);
let date = new Date(2019, -13, -33, -30, -70, -80, -2345);
date = new Date(2019, -13, -33, -30, -70, -80, -2345);
expect(date.getFullYear()).toBe(2017);
expect(date.getMonth()).toBe(9);
expect(date.getDate()).toBe(26);

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getDate()).not.toBeNaN();
expect(d.getDate()).toBeGreaterThanOrEqual(1);
expect(d.getDate()).toBeLessThanOrEqual(31);
expect(new Date(NaN).getDate()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getDay()).not.toBeNaN();
expect(d.getDay()).toBeGreaterThanOrEqual(0);
expect(d.getDay()).toBeLessThanOrEqual(6);
expect(new Date(NaN).getDay()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getFullYear()).not.toBeNaN();
expect(d.getFullYear()).toBe(d.getFullYear());
expect(d.getFullYear()).toBeGreaterThanOrEqual(2020);
expect(new Date(NaN).getFullYear()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getHours()).not.toBeNaN();
expect(d.getHours()).toBeGreaterThanOrEqual(0);
expect(d.getHours()).toBeLessThanOrEqual(23);
expect(new Date(NaN).getHours()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getMilliseconds()).not.toBeNaN();
expect(d.getMilliseconds()).toBeGreaterThanOrEqual(0);
expect(d.getMilliseconds()).toBeLessThanOrEqual(999);
expect(new Date(NaN).getMilliseconds()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getMinutes()).not.toBeNaN();
expect(d.getMinutes()).toBeGreaterThanOrEqual(0);
expect(d.getMinutes()).toBeLessThanOrEqual(59);
expect(new Date(NaN).getMinutes()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getMonth()).not.toBeNaN();
expect(d.getMonth()).toBeGreaterThanOrEqual(0);
expect(d.getMonth()).toBeLessThanOrEqual(11);
expect(new Date(NaN).getMonth()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getSeconds()).not.toBeNaN();
expect(d.getSeconds()).toBeGreaterThanOrEqual(0);
expect(d.getSeconds()).toBeLessThanOrEqual(59);
expect(new Date(NaN).getSeconds()).toBe(NaN);
});

View file

@ -3,4 +3,5 @@ test("basic functionality", () => {
expect(d.getTime()).toBe(d.getTime());
expect(d.getTime()).not.toBeNaN();
expect(d.getTime()).toBeGreaterThanOrEqual(1580000000000);
expect(new Date(NaN).getTime()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getUTCDate()).not.toBeNaN();
expect(d.getUTCDate()).toBeGreaterThanOrEqual(1);
expect(d.getUTCDate()).toBeLessThanOrEqual(31);
expect(new Date(NaN).getUTCDate()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getUTCDay()).not.toBeNaN();
expect(d.getUTCDay()).toBeGreaterThanOrEqual(0);
expect(d.getUTCDay()).toBeLessThanOrEqual(6);
expect(new Date(NaN).getUTCDay()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getUTCFullYear()).not.toBeNaN();
expect(d.getUTCFullYear()).toBe(d.getUTCFullYear());
expect(d.getUTCFullYear()).toBeGreaterThanOrEqual(2020);
expect(new Date(NaN).getUTCFullYear()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getUTCHours()).not.toBeNaN();
expect(d.getUTCHours()).toBeGreaterThanOrEqual(0);
expect(d.getUTCHours()).toBeLessThanOrEqual(23);
expect(new Date(NaN).getUTCHours()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getUTCMilliseconds()).not.toBeNaN();
expect(d.getUTCMilliseconds()).toBeGreaterThanOrEqual(0);
expect(d.getUTCMilliseconds()).toBeLessThanOrEqual(999);
expect(new Date(NaN).getUTCMilliseconds()).toBe(NaN);
});

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getUTCMinutes()).not.toBeNaN();
expect(d.getUTCMinutes()).toBeGreaterThanOrEqual(0);
expect(d.getUTCMinutes()).toBeLessThanOrEqual(59);
expect(new Date(NaN).getUTCMinutes()).toBe(NaN);
});

View file

@ -6,6 +6,7 @@ test("basic functionality", () => {
expect(d.getUTCMonth()).toBeLessThanOrEqual(11);
expect(new Date(Date.UTC(2020, 11)).getUTCMonth()).toBe(11);
expect(new Date(NaN).getUTCMonth()).toBe(NaN);
});
test("leap years", () => {

View file

@ -4,4 +4,5 @@ test("basic functionality", () => {
expect(d.getUTCSeconds()).not.toBeNaN();
expect(d.getUTCSeconds()).toBeGreaterThanOrEqual(0);
expect(d.getUTCSeconds()).toBeLessThanOrEqual(59);
expect(new Date(NaN).getUTCSeconds()).toBe(NaN);
});

View file

@ -0,0 +1,112 @@
test("no arguments", () => {
let date = new Date(2021, 0, 1);
date.setFullYear();
expect(date.getTime()).toBe(NaN);
});
test("NaN or undefined as only argument", () => {
let date = new Date(2021, 0, 1);
date.setFullYear(NaN);
expect(date.getTime()).toBe(NaN);
date = new Date(2021, 0, 1);
date.setFullYear(undefined);
expect(date.getTime()).toBe(NaN);
date = new Date(2021, 0, 1);
date.setFullYear("");
expect(date.getFullYear()).toBe(0);
date = new Date(2021, 0, 1);
date.setFullYear("a");
expect(date.getTime()).toBe(NaN);
});
test("Only year as argument", () => {
let date = new Date(2021, 0, 1);
date.setFullYear(1992);
expect(date.getFullYear()).toBe(1992);
expect(date.getMonth()).toBe(0);
expect(date.getDate()).toBe(1);
expect(date.getHours()).toBe(0);
expect(date.getMinutes()).toBe(0);
expect(date.getSeconds()).toBe(0);
expect(date.getMilliseconds()).toBe(0);
});
test("Year and month as arguments", () => {
let date = new Date(2021, 0, 1);
date.setFullYear(2021, 3);
expect(date.getFullYear()).toBe(2021);
expect(date.getMonth()).toBe(2);
expect(date.getDate()).toBe(1);
expect(date.getHours()).toBe(0);
expect(date.getMinutes()).toBe(0);
expect(date.getSeconds()).toBe(0);
expect(date.getMilliseconds()).toBe(0);
});
test("Year, month, and day as arguments", () => {
let date = new Date(2021, 0, 1);
date.setFullYear(2021, 3, 16);
expect(date.getFullYear()).toBe(2021);
expect(date.getMonth()).toBe(2);
expect(date.getDate()).toBe(16);
expect(date.getHours()).toBe(0);
expect(date.getMinutes()).toBe(0);
expect(date.getSeconds()).toBe(0);
expect(date.getMilliseconds()).toBe(0);
});
test("NaN or undefined in any arguments", () => {
let date = new Date(2021, 0, 1);
date.setFullYear(NaN, 3, 16);
expect(date.getTime()).toBe(NaN);
date = new Date(2021, 0, 1);
date.setFullYear(2021, NaN, 16);
expect(date.getTime()).toBe(NaN);
date = new Date(2021, 0, 1);
date.setFullYear(2021, 3, NaN);
expect(date.getTime()).toBe(NaN);
date = new Date(2021, 0, 1);
date.setFullYear(undefined, 3, 16);
expect(date.getTime()).toBe(NaN);
date = new Date(2021, 0, 1);
date.setFullYear(2021, undefined, 16);
expect(date.getTime()).toBe(NaN);
date = new Date(2021, 0, 1);
date.setFullYear(2021, 3, undefined);
expect(date.getTime()).toBe(NaN);
date.setFullYear(2021, 3, 16);
expect(date.getFullYear()).toBe(2021);
expect(date.getMonth()).toBe(2);
expect(date.getDate()).toBe(16);
expect(date.getHours()).toBe(0);
expect(date.getMinutes()).toBe(0);
expect(date.getSeconds()).toBe(0);
expect(date.getMilliseconds()).toBe(0);
});
test("Make Invalid Date valid again", () => {
let date = new Date(2021, 0, 1);
date.setFullYear(NaN, 3, 16);
expect(date.getTime()).toBe(NaN);
date.setFullYear(2021, 3, 16);
expect(date.getFullYear()).toBe(2021);
expect(date.getMonth()).toBe(2);
expect(date.getDate()).toBe(16);
expect(date.getHours()).toBe(0);
expect(date.getMinutes()).toBe(0);
expect(date.getSeconds()).toBe(0);
expect(date.getMilliseconds()).toBe(0);
});

View file

@ -18,4 +18,10 @@ test("basic functionality", () => {
expect(d.getMinutes()).toBe(30);
expect(d.getSeconds()).toBe(50);
expect(d.getMilliseconds()).toBe(600);
d.setHours("");
expect(d.getHours()).toBe(0);
d.setHours("a");
expect(d.getHours()).toBe(NaN);
});

View file

@ -3,4 +3,10 @@ test("basic functionality", () => {
d.setMilliseconds(600);
expect(d.getMilliseconds()).toBe(600);
d.setMilliseconds("");
expect(d.getMilliseconds()).toBe(0);
d.setMilliseconds("a");
expect(d.getMilliseconds()).toBe(NaN);
});

View file

@ -12,4 +12,10 @@ test("basic functionality", () => {
expect(d.getMinutes()).toBe(30);
expect(d.getSeconds()).toBe(50);
expect(d.getMilliseconds()).toBe(600);
d.setMinutes("");
expect(d.getMinutes()).toBe(0);
d.setMinutes("a");
expect(d.getMinutes()).toBe(NaN);
});

View file

@ -7,4 +7,10 @@ test("basic functionality", () => {
d.setSeconds(50, 600);
expect(d.getSeconds()).toBe(50);
expect(d.getMilliseconds()).toBe(600);
d.setSeconds("");
expect(d.getSeconds()).toBe(0);
d.setSeconds("a");
expect(d.getSeconds()).toBe(NaN);
});

View file

@ -4,4 +4,8 @@ test("basic functionality", () => {
expect(new Date(Date.UTC(1950)).toISOString()).toBe("1950-01-01T00:00:00.000Z");
expect(new Date(Date.UTC(1800)).toISOString()).toBe("1800-01-01T00:00:00.000Z");
expect(new Date(Date.UTC(-100)).toISOString()).toBe("-000100-01-01T00:00:00.000Z");
expect(() => {
new Date(NaN).toISOString();
}).toThrowWithMessage(RangeError, "Invalid time value");
});