From 45e9824a320fc51b15f66400bcccb014a63e75d3 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Wed, 3 Dec 2025 14:06:11 -0800 Subject: [PATCH] =?UTF-8?q?Temporal:=20Update=20duration=20tests=20to=20co?= =?UTF-8?q?ver=20the=20largest=20possible=20ms,=20=C2=B5s,=20and=20ns=20va?= =?UTF-8?q?lues?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../prototype/add/result-out-of-range-1.js | 27 +++++++++--- ...hen-converting-from-normalized-duration.js | 42 +++++++++++++++++-- ...noseconds-too-large-with-zoned-datetime.js | 21 ++++++++-- .../subtract/result-out-of-range-1.js | 26 +++++++++--- 4 files changed, 98 insertions(+), 18 deletions(-) diff --git a/test/built-ins/Temporal/Duration/prototype/add/result-out-of-range-1.js b/test/built-ins/Temporal/Duration/prototype/add/result-out-of-range-1.js index 3b2d1691e7..012ea5011b 100644 --- a/test/built-ins/Temporal/Duration/prototype/add/result-out-of-range-1.js +++ b/test/built-ins/Temporal/Duration/prototype/add/result-out-of-range-1.js @@ -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); -}); diff --git a/test/built-ins/Temporal/Duration/prototype/round/out-of-range-when-converting-from-normalized-duration.js b/test/built-ins/Temporal/Duration/prototype/round/out-of-range-when-converting-from-normalized-duration.js index bcac75e573..6b70423ebc 100644 --- a/test/built-ins/Temporal/Duration/prototype/round/out-of-range-when-converting-from-normalized-duration.js +++ b/test/built-ins/Temporal/Duration/prototype/round/out-of-range-when-converting-from-normalized-duration.js @@ -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)"); diff --git a/test/built-ins/Temporal/Duration/prototype/round/total-duration-nanoseconds-too-large-with-zoned-datetime.js b/test/built-ins/Temporal/Duration/prototype/round/total-duration-nanoseconds-too-large-with-zoned-datetime.js index 88af2e9e34..f5f2084ad1 100644 --- a/test/built-ins/Temporal/Duration/prototype/round/total-duration-nanoseconds-too-large-with-zoned-datetime.js +++ b/test/built-ins/Temporal/Duration/prototype/round/total-duration-nanoseconds-too-large-with-zoned-datetime.js @@ -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)); +} diff --git a/test/built-ins/Temporal/Duration/prototype/subtract/result-out-of-range-1.js b/test/built-ins/Temporal/Duration/prototype/subtract/result-out-of-range-1.js index 9418305760..28f1ee1842 100644 --- a/test/built-ins/Temporal/Duration/prototype/subtract/result-out-of-range-1.js +++ b/test/built-ins/Temporal/Duration/prototype/subtract/result-out-of-range-1.js @@ -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}`); +}