Files
thunderbird-send-later-mirror/test/datetime_handling_tests.js
Jonathan Kamens 8c85e9eb2e Prettier updates
2025-06-28 23:50:55 -04:00

538 lines
15 KiB
JavaScript

exports.init = function () {
// // Example
// SLTests.AddTest("Test name", (input, expected) => {
// const result = input+"foobar";
// return (result === expected) ||`Expected "${expected}", got "${result}"`;
// }, ['arg1','arg1foobar']);
function testParseableDateTimeFormat(name, input, output) {
SLTests.AddTest(name, () => {
const result = SLTools.parseableDateTimeFormat(new Date(input));
return result == output || `Expected "${output}", got "${result}"`;
}, []);
}
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 1",
"Jan 1 1998 04:03",
"Thu, 1 Jan 1998 04:03:00 -0800",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 2",
"Sun Feb 29 2000 15:03:00 GMT+2",
"Tue, 29 Feb 2000 05:03:00 -0800",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 3",
"Sun Mar 01 1998 15:03:00 GMT+2",
"Sun, 1 Mar 1998 05:03:00 -0800",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 4",
"Wed Apr 01 1998 15:03:00 GMT+2",
"Wed, 1 Apr 1998 05:03:00 -0800",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 5",
"May 1 1998 04:03",
"Fri, 1 May 1998 04:03:00 -0700",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 6",
"June 1 1998 04:03",
"Mon, 1 Jun 1998 04:03:00 -0700",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 7",
"July 1 1998 04:03",
"Wed, 1 Jul 1998 04:03:00 -0700",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 8",
"August 1 1998 04:03",
"Sat, 1 Aug 1998 04:03:00 -0700",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 9",
"September 1 1998 04:03",
"Tue, 1 Sep 1998 04:03:00 -0700",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 10",
"Oct 1 1998 04:03",
"Thu, 1 Oct 1998 04:03:00 -0700",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 11",
"Nov 1 1998 04:03",
"Sun, 1 Nov 1998 04:03:00 -0800",
);
testParseableDateTimeFormat(
"Test parseableDateTimeFormat (raw) 12",
"Dec 1 2098 04:03",
"Mon, 1 Dec 2098 04:03:00 -0800",
);
SLTests.AddTest(
"Test parseableDateTimeFormat (half-hour tz)",
() => {
let d = new Date('"Mon, 6 Sep 2021 07:28:10 -0700"');
d.getTimezoneOffset = () => -570;
let expected = "Mon, 6 Sep 2021 07:28:10 +0930";
let result = SLTools.RFC5322.format(d);
return result == expected || `Expected "${expected}", got "${result}"`;
},
[],
);
SLTests.AddTest(
"Test parseableDateTimeFormat (quarter-hour tz)",
() => {
let d = new Date('"Mon, 6 Sep 2021 07:28:10 -0700"');
d.getTimezoneOffset = () => 555;
let expected = "Mon, 6 Sep 2021 07:28:10 -0915";
let result = SLTools.RFC5322.format(d);
return result == expected || `Expected "${expected}", got "${result}"`;
},
[],
);
SLTests.AddTest(
"Timezone offset UTC +0000",
() => {
let d = new Date();
d.getTimezoneOffset = () => 0;
let result = SLTools.RFC5322.tz(d);
return result === "+0000" || `Expected "+0000", got "${result}"`;
},
[],
);
SLTests.AddTest(
"Local timezone offset comparison",
() => {
let d = new Date();
let rfc = SLTools.RFC5322.tz(d);
let match = d.toString().match(/[+-]\d\d\d\d/);
if (!match) return `Unable to parse date string: ${d.toString()}`;
else
return (
rfc === match[0] ||
`Timezone offset does not match: "${rfc}" != "${match[0]}"`
);
},
[],
);
SLTests.AddTest(
"Timezone offset positive/negative",
() => {
for (let m = 1; m < 12 * 60; m += 1) {
let d = new Date();
d.getTimezoneOffset = () => m;
let tz = SLTools.RFC5322.tz(d);
let sign = tz.substr(0, 1);
let hr = tz.substr(1, 2) | 0;
let min = tz.substr(3, 2) | 0;
if (sign != "-") return `Incorrect sign: ${tz}`;
if (hr < 0 || hr > 12) return `Invalid hour: ${tz}`;
if (min < 0 || min > 59) return `Invalid minute: ${tz}`;
if (m != hr * 60 + min)
return `Invalid timezone offset: ${tz} (${m} minutes)`;
d.getTimezoneOffset = () => -m;
let tz2 = SLTools.RFC5322.tz(d);
if (tz2 != "+" + tz.substr(1))
return `Invalid tz comparison: ${tz} vs ${tz2}`;
}
return true;
},
[],
);
SLTests.AddTest(
"RFC5322 short weekday names",
() => {
let d = new Date();
let days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
for (let wd = 0; wd < days.length; wd++) {
d.getDay = () => wd;
let result = SLTools.RFC5322.dayOfWeek(d);
if (result !== days[wd])
return `Incorrect day of week. Expected "${days[wd]}", got "${result}"`;
}
return true;
},
[],
);
SLTests.AddTest(
"RFC5322 short month names",
() => {
let d = new Date();
let months = [
"Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
"Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec",
];
for (let mo = 0; mo < months.length; mo++) {
d.getMonth = () => mo;
let result = SLTools.RFC5322.month(d);
if (result !== months[mo])
return `Incorrect weekday. Expected "${months[mo]}", got "${result}"`;
}
return true;
},
[],
);
SLTests.AddTest(
"Test parseableDateTimeFormat (current time fallback)",
() => {
const result = SLTools.parseableDateTimeFormat();
const expected = SLTools.parseableDateTimeFormat(Date.now());
return (
SLTools.compareDateTimes(result, "==", expected, 100) ||
`Expected "${expected}", got "${result}"`
);
},
[],
);
SLTests.AddTest(
"Test parseableDateTimeFormat (relative time string)",
() => {
const result = SLTools.parseableDateTimeFormat("1 minute from now");
const expected = SLTools.parseableDateTimeFormat(
new Date(Date.now() + 60000),
);
return (
SLTools.compareDateTimes(result, "==", expected, 100) ||
`Expected "${expected}", got "${result}"`
);
},
[],
);
SLTests.AddTest(
"Test humanDateTimeFormat",
(input, expected) => {
const result = SLTools.humanDateTimeFormat(new Date(input));
return result == expected || `Expected "${expected}", got "${result}"`;
},
["Sun Feb 01 1998 15:03:00 GMT+2", "Sun, Feb 1, 1998, 5:03 AM"],
);
SLTests.AddTest(
"Test shortHumanDateTimeFormat",
(input, expected) => {
const result = SLTools.shortHumanDateTimeFormat(new Date(input));
return result == expected || `Expected "${expected}", got "${result}"`;
},
["Sun Feb 01 1998 15:03:00 GMT+2", "2/1/1998, 5:03 AM"],
);
SLTests.AddTest(
"Test customHumanDateTimeFormat",
(input, expected) => {
const result = SLTools.customHumanDateTimeFormat(
new Date(input[0]),
input[1],
);
return result == expected || `Expected "${expected}", got "${result}"`;
},
[["Sun Feb 01 1998 15:03:00 GMT+2", "%Y-%m-%d %H:%M"], "1998-02-01 05:03"],
);
SLTests.AddTest(
"Test getWkdayName Sunday",
(input, expected) => {
const result = SLTools.getWkdayName(input[0], input[1]);
return result == expected || `Expected "${expected}", got "${result}"`;
},
[[0, null], "Sunday"],
);
SLTests.AddTest(
"Test getWkdayName Tuesday long",
(input, expected) => {
const result = SLTools.getWkdayName(input[0], input[1]);
return result == expected || `Expected "${expected}", got "${result}"`;
},
[[2, "long"], "Tuesday"],
);
SLTests.AddTest(
"Test getWkdayName Wednesday short",
(input, expected) => {
const result = SLTools.getWkdayName(input[0], input[1]);
return result == expected || `Expected "${expected}", got "${result}"`;
},
[[3, "short"], "Wed"],
);
SLTests.AddTest(
"Test formatTime from number",
(input, expected) => {
const result = SLTools.formatTime(input[0], input[1]);
return result == expected || `Expected "${expected}", got "${result}"`;
},
[[new Date(2020, 5, 3, 6, 55).getTime(), true], "0655"],
);
SLTests.AddTest(
"Test formatTime from date",
(input, expected) => {
const result = SLTools.formatTime(input[0], input[1]);
return result == expected || `Expected "${expected}", got "${result}"`;
},
[[new Date(2020, 5, 3, 6, 5), false], "605"],
);
SLTests.AddTest(
"Test formatTime from string",
(input, expected) => {
const result = SLTools.formatTime(input[0], input[1]);
return result == expected || `Expected "${expected}", got "${result}"`;
},
[["4:02", true], "0402"],
);
function TestComparison(func, a, comparison, b, ignoreSec, expected) {
a = new Date(a);
b = new Date(b);
const result = func(a, comparison, b, ignoreSec);
return result === expected || `Expected "${expected}", got "${result}"`;
}
SLTests.AddTest("Test compareTimes a < b", TestComparison, [
SLTools.compareTimes,
"8/31/2020, 05:00:00 AM",
"<",
"8/30/2020, 07:00:00 AM",
false,
true,
]);
SLTests.AddTest("Test compareTimes a >= b", TestComparison, [
SLTools.compareTimes,
"8/31/2020, 05:00:00 AM",
"<=",
"8/30/2020, 05:00:00 AM",
false,
true,
]);
SLTests.AddTest("Test compareTimes a > b", TestComparison, [
SLTools.compareTimes,
"8/31/2020, 05:15:00 PM",
">",
"8/30/2020, 05:00:00 AM",
false,
true,
]);
SLTests.AddTest("Test compareTimes a >= b", TestComparison, [
SLTools.compareTimes,
"8/31/2020, 05:15:00 PM",
">=",
"8/30/2020, 05:15:00 AM",
false,
true,
]);
SLTests.AddTest("Test compareTimes a === b", TestComparison, [
SLTools.compareTimes,
"8/31/2019, 05:01:00 PM",
"===",
"8/30/2020, 05:01:00 PM",
false,
true,
]);
SLTests.AddTest("Test compareDates a < b differentmonth", TestComparison, [
SLTools.compareDates,
"7/31/2020, 09:01:00 AM",
"<",
"8/01/2020, 05:01:00 AM",
null,
true,
]);
SLTests.AddTest("Test compareDates ! a == b false", TestComparison, [
SLTools.compareDates,
"7/31/2020, 09:01:00 AM",
"==",
"8/01/2020, 05:01:00 AM",
null,
false,
]);
SLTests.AddTest("Test compareDates a == b false", TestComparison, [
SLTools.compareDates,
"7/31/2020, 09:01:00 AM",
"==",
"7/31/2020, 05:01:00 AM",
null,
true,
]);
SLTests.AddTest("Test compareDateTimes a === b !ignoreSec", TestComparison, [
SLTools.compareDateTimes,
"7/31/2020, 09:00:00 AM",
"===",
"7/31/2020, 09:00:20 AM",
false,
false,
]);
SLTests.AddTest("Test compareDateTimes a === b ignoreSec", TestComparison, [
SLTools.compareDateTimes,
"7/31/2020, 09:00:00 AM",
"===",
"7/31/2020, 09:00:20 AM",
true,
true,
]);
SLTests.AddTest(
"Test compareDateTimes a < b differentmonth",
TestComparison,
[
SLTools.compareDateTimes,
"7/31/2020, 09:01:00 AM",
"<",
"8/01/2020, 05:01:00 AM",
false,
true,
],
);
SLTests.AddTest(
"Test parseDateTime",
(dstr, tstr, expected) => {
const result = SLTools.parseDateTime(dstr, tstr);
return (
result.getTime() === expected.getTime() ||
`Expected "${expected}", got "${result}"`
);
},
["2015/01/17", "0130", new Date(2015, 0, 17, 1, 30)],
);
SLTests.AddTest(
"Test parseDateTime (time only)",
(input, expected) => {
const result = SLTools.parseDateTime(null, input);
return (
result.getTime() === expected.getTime() ||
`Expected "${expected}", got "${result}"`
);
},
["1:30", new Date(0, 0, 0, 1, 30)],
);
SLTests.AddTest(
"Test convertDate (text string relative)",
(input, expected) => {
const result = SLTools.convertDate(input, false);
return (
SLTools.compareDateTimes(result, "==", expected, 100) ||
`Expected "${expected.getTime()}", got "${result.getTime()}"`
);
},
["in 1 minute", new Date(Date.now() + 60000)],
);
SLTests.AddTest(
"Test convertDate (text string absolute)",
(input, expected) => {
const result = SLTools.convertDate(input);
return (
SLTools.compareDateTimes(result, "==", expected, 100) ||
`Expected "${expected.getTime()}", got "${result.getTime()}"`
);
},
["8/01/2020, 05:01:00 AM", new Date("8/01/2020, 05:01:00 AM")],
);
SLTests.AddTest(
"Test convertDate (number)",
(input, expected) => {
const result = SLTools.convertDate(input);
return (
SLTools.compareDateTimes(result, "==", expected, 100) ||
`Expected "${expected}", got "${result}"`
);
},
[Date.now(), new Date()],
);
SLTests.AddTest(
"Test convertDate (Date)",
(input, expected) => {
const result = SLTools.convertDate(input);
return (
SLTools.compareDateTimes(result, "==", expected, 100) ||
`Expected "${expected}", got "${result}"`
);
},
[new Date(), new Date()],
);
function compareRelativeTime(dateTime, relativeTo, expected) {
const result = SLTools.formatRelative(dateTime, relativeTo);
return result === expected || `Expected "${expected}", got "${result}"`;
}
SLTests.AddTest(
"Test relativeDateFormat '1 hour ago'",
compareRelativeTime,
[new Date(Date.now() - 3600 * 1000), null, "1 hour ago"],
);
SLTests.AddTest(
"Test relativeDateFormat '1 hour from now'",
compareRelativeTime,
[new Date(Date.now() + 3600 * 1000), null, "1 hour from now"],
);
SLTests.AddTest("Test relativeDateFormat '1 day ago'", compareRelativeTime, [
new Date(Date.now() - 3600 * 24 * 1000),
null,
"1 day ago",
]);
SLTests.AddTest(
"Test relativeDateFormat '7.5 hours from now'",
compareRelativeTime,
[new Date(Date.now() + 3600 * 7.5 * 1000), null, "7.5 hours from now"],
);
SLTests.AddTest(
"Test relativeDateFormat '0 seconds from now'",
compareRelativeTime,
[new Date(Date.now()), null, "0 seconds from now"],
);
SLTests.AddTest(
"Test relativeDateFormat '364 days from now'",
compareRelativeTime,
[new Date(Date.now() + 364 * 24 * 3600 * 1000), null, "364 days from now"],
);
SLTests.AddTest(
"Test relativeDateFormat (364.5 days) -> '1 year from now'",
compareRelativeTime,
[new Date(Date.now() + 364.5 * 24 * 3600 * 1000), null, "1 year from now"],
);
SLTests.AddTest(
"Test relativeDateFormat (90 seconds) -> '1.5 minutes from now'",
compareRelativeTime,
[new Date(Date.now() + 90 * 1000), null, "1.5 minutes from now"],
);
};