Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/**
* Tests DateNormalizationUtils object.
*/
"use strict";
const { DateNormalizationUtils } = ChromeUtils.importESModule(
"resource://gre/modules/DateNormalizationUtils.sys.mjs"
);
add_task(function test_normalizeMonth() {
Assert.equal(DateNormalizationUtils.normalizeMonth("01"), 1);
Assert.equal(DateNormalizationUtils.normalizeMonth(12), 12);
Assert.equal(DateNormalizationUtils.normalizeMonth("13"), undefined);
Assert.equal(DateNormalizationUtils.normalizeMonth("0"), undefined);
Assert.equal(DateNormalizationUtils.normalizeMonth(""), undefined);
Assert.equal(DateNormalizationUtils.normalizeMonth("ab"), undefined);
});
add_task(function test_normalizeDay() {
Assert.equal(DateNormalizationUtils.normalizeDay("1"), 1);
Assert.equal(DateNormalizationUtils.normalizeDay(31), 31);
Assert.equal(DateNormalizationUtils.normalizeDay("32"), undefined);
Assert.equal(DateNormalizationUtils.normalizeDay("0"), undefined);
Assert.equal(DateNormalizationUtils.normalizeDay("nope"), undefined);
});
add_task(function test_normalizeYear() {
Assert.equal(DateNormalizationUtils.normalizeYear("2030"), 2030);
// A 2-digit year is shifted into the 2000s.
Assert.equal(DateNormalizationUtils.normalizeYear("30"), 2030);
Assert.equal(DateNormalizationUtils.normalizeYear("0"), undefined);
Assert.equal(DateNormalizationUtils.normalizeYear("-1"), undefined);
Assert.equal(DateNormalizationUtils.normalizeYear(""), undefined);
});
add_task(function test_parseISODate() {
Assert.deepEqual(DateNormalizationUtils.parseISODate("2030-05-09"), {
year: "2030",
month: "05",
day: "09",
});
Assert.deepEqual(DateNormalizationUtils.parseISODate("2030-5-9"), {
year: "2030",
month: "5",
day: "9",
});
Assert.deepEqual(
DateNormalizationUtils.parseISODate(" 2030-05-09 "),
{ year: "2030", month: "05", day: "09" },
"leading/trailing whitespace is trimmed"
);
Assert.deepEqual(DateNormalizationUtils.parseISODate("2030/05/09"), {});
Assert.deepEqual(DateNormalizationUtils.parseISODate("2030-05"), {});
Assert.deepEqual(DateNormalizationUtils.parseISODate("garbage"), {});
});
add_task(function test_formatISODate() {
Assert.equal(
DateNormalizationUtils.formatISODate({ year: 2030, month: 5, day: 9 }),
"2030-05-09",
"month and day are zero-padded; year is not"
);
Assert.equal(
DateNormalizationUtils.formatISODate({
year: "2030",
month: "12",
day: "31",
}),
"2030-12-31"
);
Assert.equal(
DateNormalizationUtils.formatISODate({ year: 2030, month: 5 }),
"",
"missing a component yields an empty string"
);
});
add_task(function test_normalizeComponents_orchestration() {
const parts = ["month", "day", "year"];
// All components present: the string is never consulted.
Assert.deepEqual(
DateNormalizationUtils.normalizeComponents({
string: "2099-01-02",
month: 5,
day: 1,
year: 2030,
parts,
}),
{ month: 5, day: 1, year: 2030 }
);
// A missing component is backfilled from the combined string.
Assert.deepEqual(
DateNormalizationUtils.normalizeComponents({
string: "2030-12-09",
parts,
}),
{ month: 12, day: 9, year: 2030 }
);
// Out-of-range components are dropped to undefined.
Assert.deepEqual(
DateNormalizationUtils.normalizeComponents({
month: 13,
day: 40,
year: -3,
parts,
}),
{ month: undefined, day: undefined, year: undefined }
);
});
add_task(function test_normalizeComponents_parts_subset() {
// A credit-card-shaped caller requests only month/year; no day is returned.
const result = DateNormalizationUtils.normalizeComponents({
month: 5,
year: "30",
parts: ["month", "year"],
});
Assert.deepEqual(result, { month: 5, year: 2030 });
Assert.ok(!("day" in result), "day is not included when not requested");
});
add_task(function test_parseMonthYearString() {
// The parser returns the raw year; the 2-digit shift happens in normalizeYear.
Assert.deepEqual(DateNormalizationUtils.parseMonthYearString("05/26"), {
month: 5,
year: 26,
});
Assert.deepEqual(DateNormalizationUtils.parseMonthYearString("2028-09"), {
month: 9,
year: 2028,
});
Assert.deepEqual(DateNormalizationUtils.parseMonthYearString(" 06 / 27 "), {
month: 6,
year: 27,
});
Assert.deepEqual(DateNormalizationUtils.parseMonthYearString("nope"), {
month: undefined,
year: undefined,
});
});
add_task(function test_normalizeComponents_parserByParts() {
// month/year parts (no "day") use the lenient multi-format parser, while
// day-bearing parts use the strict ISO parser.
Assert.deepEqual(
DateNormalizationUtils.normalizeComponents({
string: "06/27",
parts: ["month", "year"],
}),
{ month: 6, year: 2027 }
);
Assert.deepEqual(
DateNormalizationUtils.normalizeComponents({
string: "2030-05-09",
parts: ["month", "day", "year"],
}),
{ month: 5, day: 9, year: 2030 }
);
});
add_task(function test_normalizeComponents_numericZeroComponent() {
// A numeric 0 component is falsy, so it counts as missing and the string
// backfills it (preserving the historical `||` precedence behavior).
Assert.deepEqual(
DateNormalizationUtils.normalizeComponents({
string: "2030-05-09",
month: 0,
day: 0,
year: 0,
parts: ["month", "day", "year"],
}),
{ month: 5, day: 9, year: 2030 }
);
});