Temporal: Update duration tests to cover the largest possible ms, µs, and ns values

This commit is contained in:
Tim Chevalier 2025-12-03 14:06:11 -08:00 committed by Ms2ger
parent 8a879d7a6f
commit 45e9824a32
4 changed files with 98 additions and 18 deletions

View File

@ -8,9 +8,26 @@ description: >
features: [Temporal]
---*/
// Largest temporal unit is "second".
const duration = Temporal.Duration.from({seconds: Number.MAX_SAFE_INTEGER});
const maxSec = Number.MAX_SAFE_INTEGER;
const maxMs = 9_007_199_254_740_991_487;
const maxUs = 9_007_199_254_740_991_475_711;
const maxNs = 9_007_199_254_740_991_463_129_087;
const durations = [
Temporal.Duration.from({seconds: maxSec}),
Temporal.Duration.from({milliseconds: maxMs}),
Temporal.Duration.from({microseconds: maxUs}),
Temporal.Duration.from({nanoseconds: maxNs}),
Temporal.Duration.from({seconds: -maxSec}),
Temporal.Duration.from({milliseconds: -maxMs}),
Temporal.Duration.from({microseconds: -maxUs}),
Temporal.Duration.from({nanoseconds: -maxNs}),
]
for (let duration of durations) {
assert.throws(RangeError, () => {
duration.add(duration);
});
}
assert.throws(RangeError, () => {
duration.add(duration);
});

View File

@ -9,8 +9,44 @@ description: >
features: [Temporal]
---*/
const d = new Temporal.Duration(0, 0, 0, 0, 0, 0, /* s = */ Number.MAX_SAFE_INTEGER, 0, 0, /* ns = */ 999_999_999);
assert.throws(RangeError, () => d.round({
/*
const maxMs = 9_007_199_254_740_991_487;
const maxUs = 9_007_199_254_740_991_475_711;
const maxNs = 9_007_199_254_740_991_463_129_087;
*/
const ms = new Temporal.Duration(0, 0, 0, 0, 0, 0, /* s = */ Number.MAX_SAFE_INTEGER, /* ms = */ 488, 0, 0);
assert.throws(RangeError, () => ms.round({
largestUnit: "nanoseconds",
roundingIncrement: 1,
}), "nanoseconds component after balancing as a float64-representable integer is out of range");
}), "nanoseconds component after balancing as a float64-representable integer is out of range (maximum milliseconds)");
const us = new Temporal.Duration(0, 0, 0, 0, 0, 0, /* s = */ Number.MAX_SAFE_INTEGER, 0, /* us = */ 475_712, 0);
assert.throws(RangeError, () => ms.round({
largestUnit: "nanoseconds",
roundingIncrement: 1,
}), "nanoseconds component after balancing as a float64-representable integer is out of range (maximum microseconds)");
const ns = new Temporal.Duration(0, 0, 0, 0, 0, 0, /* s = */ Number.MAX_SAFE_INTEGER, 0, 0, /* ns = */ 463_129_088);
assert.throws(RangeError, () => ns.round({
largestUnit: "nanoseconds",
roundingIncrement: 1,
}), "nanoseconds component after balancing as a float64-representable integer is out of range (maximum nanoseconds)");
const msMin = new Temporal.Duration(0, 0, 0, 0, 0, 0, /* s = */ -Number.MAX_SAFE_INTEGER, /* ms = */ -487, 0, 0);
assert.throws(RangeError, () => msMin.round({
largestUnit: "nanoseconds",
roundingIncrement: 1,
}), "nanoseconds component after balancing as a float64-representable integer is out of range (minimum milliseconds)");
const usMin = new Temporal.Duration(0, 0, 0, 0, 0, 0, /* s = */ -Number.MAX_SAFE_INTEGER, 0, /* us = */ -475_711, 0);
assert.throws(RangeError, () => usMin.round({
largestUnit: "nanoseconds",
roundingIncrement: 1,
}), "nanoseconds component after balancing as a float64-representable integer is out of range (minimum microseconds)");
const nsMin = new Temporal.Duration(0, 0, 0, 0, 0, 0, /* s = */ -Number.MAX_SAFE_INTEGER, 0, 0, /* ns = */ -463_129_088);
assert.throws(RangeError, () => nsMin.round({
largestUnit: "nanoseconds",
roundingIncrement: 1,
}), "nanoseconds component after balancing as a float64-representable integer is out of range (minimum nanoseconds)");

View File

@ -8,9 +8,20 @@ description: >
features: [Temporal]
---*/
var duration = Temporal.Duration.from({
seconds: Number.MAX_SAFE_INTEGER,
});
const maxMs = 9_007_199_254_740_991_487;
const maxUs = 9_007_199_254_740_991_475_711;
const maxNs = 9_007_199_254_740_991_463_129_087;
const durations = [
Temporal.Duration.from({ seconds: Number.MAX_SAFE_INTEGER }),
Temporal.Duration.from({ milliseconds: maxMs }),
Temporal.Duration.from({ microseconds: maxUs }),
Temporal.Duration.from({ nanoseconds: maxNs }),
Temporal.Duration.from({ seconds: -Number.MAX_SAFE_INTEGER }),
Temporal.Duration.from({ milliseconds: -maxMs }),
Temporal.Duration.from({ microseconds: -maxUs }),
Temporal.Duration.from({ nanoseconds: -maxNs }),
];
var zonedDateTime = new Temporal.ZonedDateTime(0n, "UTC");
@ -20,4 +31,6 @@ var options = {
relativeTo: zonedDateTime,
};
assert.throws(RangeError, () => duration.round(options));
for (let duration of durations) {
assert.throws(RangeError, () => duration.round(options));
}

View File

@ -8,10 +8,24 @@ description: >
features: [Temporal]
---*/
// Largest temporal unit is "second".
const duration1 = Temporal.Duration.from({seconds: Number.MAX_SAFE_INTEGER});
const duration2 = Temporal.Duration.from({seconds: -Number.MAX_SAFE_INTEGER});
const maxSec = Number.MAX_SAFE_INTEGER;
const maxMs = 9_007_199_254_740_991_487;
const maxUs = 9_007_199_254_740_991_475_711;
const maxNs = 9_007_199_254_740_991_463_129_087;
assert.throws(RangeError, () => {
duration1.subtract(duration2);
});
const durations = [
Temporal.Duration.from({seconds: maxSec}),
Temporal.Duration.from({milliseconds: maxMs}),
Temporal.Duration.from({microseconds: maxUs}),
Temporal.Duration.from({nanoseconds: maxNs}),
Temporal.Duration.from({seconds: -maxSec}),
Temporal.Duration.from({milliseconds: -maxMs}),
Temporal.Duration.from({microseconds: -maxUs}),
Temporal.Duration.from({nanoseconds: -maxNs}),
];
for (let duration of durations) {
assert.throws(RangeError, () => {
duration.subtract(duration.negated());
}, `subtracting the negation of a large duration from the duration is out of bounds: ${duration}`);
}