//@ requireOptions("--useTemporal=1") function shouldBe(actual, expected) { if (actual !== expected) throw new Error(`expected ${expected} but got ${actual}`); } function shouldThrow(func, errorType, message) { let error; try { func(); } catch (e) { error = e; } if (!(error instanceof errorType)) throw new Error(`Expected ${errorType.name}!`); if (message !== undefined) shouldBe(String(error), message); } shouldBe(Temporal.PlainDate instanceof Function, true); shouldBe(Temporal.PlainDate.length, 0); shouldBe(Object.getOwnPropertyDescriptor(Temporal.PlainDate, 'prototype').writable, false); shouldBe(Object.getOwnPropertyDescriptor(Temporal.PlainDate, 'prototype').enumerable, false); shouldBe(Object.getOwnPropertyDescriptor(Temporal.PlainDate, 'prototype').configurable, false); shouldBe(Temporal.PlainDate.prototype.constructor, Temporal.PlainDate); { let date = new Temporal.PlainDate(1, 2, 3); shouldBe(String(date), `0001-02-03`); shouldBe(date.year, 1); shouldBe(date.month, 2); shouldBe(date.day, 3); } { let date = new Temporal.PlainDate(2007, 1, 9); shouldBe(String(date), `2007-01-09`); shouldBe(date.year, 2007); shouldBe(date.month, 1); shouldBe(date.day, 9); } shouldBe(String(Temporal.PlainDate.from('2007-01-09')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09t03:24:30')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+20:20:59')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30-20:20:59')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30\u221220:20:59')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+10')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+1020')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+102030')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+10:20:30.05')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+10:20:30.123456789')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[Europe/Brussels]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[Europe/Brussels]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[UNKNOWN]')), `2007-01-09`); // TimeZone error should be ignored. shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[.hey]')), `2007-01-09`); // TimeZone error should be ignored. shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[_]')), `2007-01-09`); // TimeZone error should be ignored. shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[_-]')), `2007-01-09`); // TimeZone error should be ignored. shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[_/_]')), `2007-01-09`); // TimeZone error should be ignored. shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[_-./_-.]')), `2007-01-09`); // TimeZone error should be ignored. shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[_../_..]')), `2007-01-09`); // TimeZone error should be ignored. shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[_./_.]')), `2007-01-09`); // TimeZone error should be ignored. shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[Etc/GMT+20]')), `2007-01-09`); // TimeZone error should be ignored. shouldBe(String(Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[Etc/GMT-20]')), `2007-01-09`); // TimeZone error should be ignored. shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[+01]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[+01:00]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[+01:00:00]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[+01:00:00.123]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[+01:00:00.12345]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[+01:00:00.12345678]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[+01:00:00.123456789]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[-01:00]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[\u221201:00]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[u-ca=japanese]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09 03:24:30+01:00[Europe/Brussels][u-ca=japanese]')), `2007-01-09`); shouldBe(String(Temporal.PlainDate.from('2007-01-09[u-ca=japanese]')), `2007-01-09`); { let date = Temporal.PlainDate.from('2007-01-09T03:24:30+01:00[Europe/Brussels]') shouldBe(date === Temporal.PlainDate.from(date), false); } // FIXME: from(object) is note yet implemented. // { // let date = Temporal.PlainDate.from({ // year: 2007, // month: 1, // day: 9 // }); // shouldBe(String(date), `2007-01-09`); // } shouldThrow(() => { Temporal.PlainDate.from({ year: 2007, month: 1, day: 9 }); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(-1); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(2007); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(2007, 1); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(2007, 13, 1); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(2007, 2, 30); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(Infinity, 1, 1); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(-Infinity, 1, 1); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(2007, Infinity, 1); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(2007, -Infinity, 1); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(2007, 1, Infinity); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(2007, 1, -Infinity); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(0x43530, 9, 14); }, RangeError); shouldBe(String(new Temporal.PlainDate(0x43530, 9, 13)), `275760-09-13`); shouldThrow(() => { new Temporal.PlainDate(-0x425cd, 4, 19); }, RangeError); shouldBe(String(new Temporal.PlainDate(-0x425cd, 4, 20)), `-271821-04-20`); shouldThrow(() => { new Temporal.PlainDate(0x80000000, 1, 1); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(-0x80000000, 1, 1); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(0x7fffffff, 1, 1); }, RangeError); shouldThrow(() => { new Temporal.PlainDate(-0x7fffffff, 1, 1); }, RangeError); let failures = [ "", "23:59:61.999999999", "1995-1207T03:24:30", "199512-07T03:24:30", "2007-01-09T03:24:30+20:20:60", "2007-01-09T03:24:30+20:2050", "2007-01-09T03:24:30+:", "2007-01-09T03:24:30+2:50", "2007-01-09T03:24:30+01:00[/]", "2007-01-09T03:24:30+01:00[///]", "2007-01-09T03:24:30+01:00[Hey/Hello", "2007-01-09T03:24:30+01:00[]", "2007-01-09T03:24:30+01:00[Hey/]", "2007-01-09T03:24:30+01:00[..]", "2007-01-09T03:24:30+01:00[.]", "2007-01-09T03:24:30+01:00[./.]", "2007-01-09T03:24:30+01:00[../..]", "2007-01-09T03:24:30+01:00[-Hey/Hello]", "2007-01-09T03:24:30+01:00[-]", "2007-01-09T03:24:30+01:00[-/_]", "2007-01-09T03:24:30+01:00[_/-]", "2007-01-09T03:24:30+01:00[CocoaCappuccinoMatcha]", "2007-01-09T03:24:30+01:00[Etc/GMT+50]", "2007-01-09T03:24:30+01:00[Etc/GMT+0]", "2007-01-09T03:24:30+01:00[Etc/GMT0]", "2007-01-09T03:24:30+10:20:30.0123456789", "2007-01-09 03:24:30+01:00[Etc/GMT\u221201]", "2007-01-09 03:24:30+01:00[+02:00:00.0123456789]", "2007-01-09 03:24:30+01:00[02:00:00.123456789]", "2007-01-09 03:24:30+01:00[02:0000.123456789]", "2007-01-09 03:24:30+01:00[0200:00.123456789]", "2007-01-09 03:24:30+01:00[02:00:60.123456789]", "2007-01-09T03:24:30Z", // UTCDesignator "2007-01-09 03:24:30[u-ca=japanese][Europe/Brussels]", "2007-01-09 03:24:30+01:00[u-ca=japanese][Europe/Brussels]", ]; for (let text of failures) { shouldThrow(() => { print(String(Temporal.PlainDate.from(text))); }, RangeError); } { let one = Temporal.PlainDate.from('1001-01-01'); let two = Temporal.PlainDate.from('1002-01-01'); let three = Temporal.PlainDate.from('1000-02-02'); let four = Temporal.PlainDate.from('1001-01-02'); let five = Temporal.PlainDate.from('1001-02-01'); let sorted = [one, two, three, four, five].sort(Temporal.PlainDate.compare); shouldBe(sorted.join(' '), `1000-02-02 1001-01-01 1001-01-02 1001-02-01 1002-01-01`); } { for (let i = 0; i < 12; ++i) { let dt = new Temporal.PlainDate(1995, 1 + i, 11 + i); shouldBe(dt.monthCode, `M${String(1 + i).padStart(2, '0')}`); } } { let week = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN']; for (let i = 0; i < 7; ++i) { let dt = new Temporal.PlainDate(1995, 12, 11 + i); shouldBe(week[dt.dayOfWeek - 1], week[i]); } } { shouldBe(Temporal.PlainDate.from('1995-12-07').dayOfWeek, 4); shouldBe(Temporal.PlainDate.from('1995-12-08').dayOfWeek, 5); shouldBe(Temporal.PlainDate.from('1995-12-09').dayOfWeek, 6); shouldBe(Temporal.PlainDate.from('1995-12-10').dayOfWeek, 7); shouldBe(Temporal.PlainDate.from('1995-12-11').dayOfWeek, 1); shouldBe(Temporal.PlainDate.from('1995-12-12').dayOfWeek, 2); shouldBe(Temporal.PlainDate.from('1995-12-13').dayOfWeek, 3); shouldBe(Temporal.PlainDate.from('1995-12-14').dayOfWeek, 4); } { let tests = [ [ '1995-01-01', 1 ], [ '1995-12-07', 341 ], [ '1995-12-31', 365 ], [ '2000-01-01', 1 ], [ '2000-12-07', 342 ], [ '2000-12-31', 366 ], [ '2004-01-01', 1 ], [ '2004-12-07', 342 ], [ '2004-12-31', 366 ], [ '2100-01-01', 1 ], [ '2100-12-07', 341 ], [ '2100-12-31', 365 ], ]; for (let test of tests) { let dt = Temporal.PlainDate.from(test[0]); shouldBe(dt.dayOfYear, test[1]); } } { shouldBe(Temporal.PlainDate.from('1996-12-31').weekOfYear, 1); shouldBe(Temporal.PlainDate.from('1997-12-31').weekOfYear, 1); shouldBe(Temporal.PlainDate.from('1998-12-27').weekOfYear, 52); shouldBe(Temporal.PlainDate.from('1998-12-31').weekOfYear, 53); shouldBe(Temporal.PlainDate.from('1999-12-31').weekOfYear, 52); shouldBe(Temporal.PlainDate.from('2000-12-31').weekOfYear, 52); shouldBe(Temporal.PlainDate.from('1995-12-07').weekOfYear, 49); shouldBe(Temporal.PlainDate.from('1995-12-08').weekOfYear, 49); shouldBe(Temporal.PlainDate.from('1995-12-09').weekOfYear, 49); shouldBe(Temporal.PlainDate.from('1995-12-10').weekOfYear, 49); shouldBe(Temporal.PlainDate.from('1995-12-11').weekOfYear, 50); shouldBe(Temporal.PlainDate.from('1995-12-31').weekOfYear, 52); shouldBe(Temporal.PlainDate.from('1995-01-20').weekOfYear, 3); shouldBe(Temporal.PlainDate.from('1995-01-02').weekOfYear, 1); shouldBe(Temporal.PlainDate.from('1995-01-03').weekOfYear, 1); shouldBe(Temporal.PlainDate.from('1995-01-04').weekOfYear, 1); shouldBe(Temporal.PlainDate.from('1995-01-05').weekOfYear, 1); shouldBe(Temporal.PlainDate.from('1995-01-06').weekOfYear, 1); shouldBe(Temporal.PlainDate.from('1995-01-07').weekOfYear, 1); shouldBe(Temporal.PlainDate.from('1995-01-08').weekOfYear, 1); shouldBe(Temporal.PlainDate.from('1995-01-09').weekOfYear, 2); shouldBe(Temporal.PlainDate.from('1994-12-25').weekOfYear, 51); // Thursday shouldBe(Temporal.PlainDate.from('1994-12-26').weekOfYear, 52); // Friday shouldBe(Temporal.PlainDate.from('1994-12-27').weekOfYear, 52); // Saturday shouldBe(Temporal.PlainDate.from('1994-12-28').weekOfYear, 52); // Sunday shouldBe(Temporal.PlainDate.from('1994-12-29').weekOfYear, 52); // Monday shouldBe(Temporal.PlainDate.from('1994-12-30').weekOfYear, 52); // Tuesday shouldBe(Temporal.PlainDate.from('1994-12-31').weekOfYear, 52); // Wednesday shouldBe(Temporal.PlainDate.from('1995-01-01').weekOfYear, 52); // Thursday } { shouldBe(Temporal.PlainDate.from('1995-12-07').daysInWeek, 7); shouldBe(Temporal.PlainDate.from('2001-12-07').daysInWeek, 7); shouldBe(Temporal.PlainDate.from('2000-12-07').daysInWeek, 7); shouldBe(Temporal.PlainDate.from('2004-12-07').daysInWeek, 7); shouldBe(Temporal.PlainDate.from('2100-12-07').daysInWeek, 7); } { let days = [ [ 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ], [ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ], ]; for (let i = 0; i < 12; ++i) { let dt = new Temporal.PlainDate(1995, 1 + i, 11 + i); shouldBe(dt.daysInMonth, days[0][i]); } for (let i = 0; i < 12; ++i) { let dt = new Temporal.PlainDate(2004, 1 + i, 11 + i); shouldBe(dt.daysInMonth, days[1][i]); } } { shouldBe(Temporal.PlainDate.from('1995-12-07').daysInYear, 365); shouldBe(Temporal.PlainDate.from('2001-12-07').daysInYear, 365); shouldBe(Temporal.PlainDate.from('2000-12-07').daysInYear, 366); shouldBe(Temporal.PlainDate.from('2004-12-07').daysInYear, 366); shouldBe(Temporal.PlainDate.from('2100-12-07').daysInYear, 365); } { shouldBe(Temporal.PlainDate.from('1995-12-07').monthsInYear, 12); shouldBe(Temporal.PlainDate.from('2001-12-07').monthsInYear, 12); shouldBe(Temporal.PlainDate.from('2000-12-07').monthsInYear, 12); shouldBe(Temporal.PlainDate.from('2004-12-07').monthsInYear, 12); shouldBe(Temporal.PlainDate.from('2100-12-07').monthsInYear, 12); } { shouldBe(Temporal.PlainDate.from('1995-12-07').inLeapYear, false); shouldBe(Temporal.PlainDate.from('2001-12-07').inLeapYear, false); shouldBe(Temporal.PlainDate.from('2000-12-07').inLeapYear, true); shouldBe(Temporal.PlainDate.from('2004-12-07').inLeapYear, true); shouldBe(Temporal.PlainDate.from('2100-12-07').inLeapYear, false); } { let getterNames = [ "year", "month", "monthCode", "day", "dayOfWeek", "dayOfYear", "weekOfYear", "daysInWeek", "daysInMonth", "daysInYear", "monthsInYear", "inLeapYear", ]; for (let getterName of getterNames) { let getter = Reflect.getOwnPropertyDescriptor(Temporal.PlainDate.prototype, getterName).get; shouldBe(typeof getter, 'function'); shouldThrow(() => { getter.call({}); }, TypeError); } }