Skip to content

Commit 09b54c1

Browse files
committed
Temporal: Add coverage for another large-subseconds addition bug
Bug observed in the proposal-temporal reference code, caused by improper implementation of AddTime (https://tc39.es/proposal-temporal/#sec-temporal-addtime) where the advice in Step 2 was not followed correctly. See tc39/proposal-temporal#3173
1 parent 76d3e77 commit 09b54c1

File tree

8 files changed

+112
-8
lines changed

8 files changed

+112
-8
lines changed

test/built-ins/Temporal/Instant/prototype/add/add-large-subseconds.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,21 @@ assert.throws(RangeError, () => i1.add(Temporal.Duration.from({milliseconds: Num
2525
assert.throws(RangeError, () => i1.add(Temporal.Duration.from({seconds: Number.MAX_SAFE_INTEGER})));
2626
assert.throws(RangeError, () => i1.add(Temporal.Duration.from({seconds: Number.MIN_SAFE_INTEGER})));
2727

28-
const i2 = new Temporal.Instant(0n);
2928
const bigNumber = 9007199254740990976;
3029

30+
assert.sameValue(i1.add(Temporal.Duration.from({nanoseconds: bigNumber})).epochNanoseconds,
31+
10590165902488603554n);
32+
assert.sameValue(i1.add(Temporal.Duration.from({nanoseconds: -bigNumber})).epochNanoseconds,
33+
-7424232606993378398n);
34+
35+
assert.throws(RangeError, () => i1.add(Temporal.Duration.from({milliseconds: bigNumber})));
36+
assert.throws(RangeError, () => i1.add(Temporal.Duration.from({milliseconds: -bigNumber})));
37+
38+
assert.throws(RangeError, () => i1.add(Temporal.Duration.from({microseconds: bigNumber})));
39+
assert.throws(RangeError, () => i1.add(Temporal.Duration.from({microseconds: -bigNumber})));
40+
41+
const i2 = new Temporal.Instant(0n);
42+
3143
assert.sameValue(i2.add(Temporal.Duration.from({nanoseconds: bigNumber})).epochNanoseconds,
3244
9007199254740990976n);
3345
assert.sameValue(i2.add(Temporal.Duration.from({nanoseconds: -bigNumber})).epochNanoseconds,

test/built-ins/Temporal/Instant/prototype/subtract/subtract-large-subseconds.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,21 @@ assert.throws(RangeError, () => i1.subtract(Temporal.Duration.from({milliseconds
2525
assert.throws(RangeError, () => i1.subtract(Temporal.Duration.from({seconds: Number.MAX_SAFE_INTEGER})));
2626
assert.throws(RangeError, () => i1.subtract(Temporal.Duration.from({seconds: Number.MIN_SAFE_INTEGER})));
2727

28-
const i2 = new Temporal.Instant(0n);
2928
const bigNumber = 9007199254740990976;
3029

30+
assert.sameValue(i1.subtract(Temporal.Duration.from({nanoseconds: bigNumber})).epochNanoseconds,
31+
-7424232606993378398n);
32+
assert.sameValue(i1.subtract(Temporal.Duration.from({nanoseconds: -bigNumber})).epochNanoseconds,
33+
10590165902488603554n);
34+
35+
assert.throws(RangeError, () => i1.subtract(Temporal.Duration.from({microseconds: bigNumber})));
36+
assert.throws(RangeError, () => i1.subtract(Temporal.Duration.from({microseconds: -bigNumber})));
37+
38+
assert.throws(RangeError, () => i1.subtract(Temporal.Duration.from({milliseconds: bigNumber})));
39+
assert.throws(RangeError, () => i1.subtract(Temporal.Duration.from({milliseconds: -bigNumber})));
40+
41+
const i2 = new Temporal.Instant(0n);
42+
3143
assert.sameValue(i2.subtract(Temporal.Duration.from({nanoseconds: bigNumber})).epochNanoseconds,
3244
-9007199254740990976n);
3345
assert.sameValue(i2.subtract(Temporal.Duration.from({nanoseconds: -bigNumber})).epochNanoseconds,

test/built-ins/Temporal/PlainDateTime/prototype/add/add-large-subseconds.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,21 @@ assert.throws(RangeError, () => pdt1.add(Temporal.Duration.from({milliseconds: N
2626
assert.throws(RangeError, () => pdt1.add(Temporal.Duration.from({seconds: Number.MAX_SAFE_INTEGER})));
2727
assert.throws(RangeError, () => pdt1.add(Temporal.Duration.from({seconds: Number.MIN_SAFE_INTEGER})));
2828

29-
const pdt2 = new Temporal.PlainDateTime(0, 1, 1);
3029
const bigNumber = 9007199254740990976;
3130

31+
TemporalHelpers.assertPlainDateTime(pdt1.add(Temporal.Duration.from({nanoseconds: bigNumber})),
32+
2305, 8, "M08", 4, 0, 45, 2, 488, 603, 554);
33+
TemporalHelpers.assertPlainDateTime(pdt1.add(Temporal.Duration.from({nanoseconds: -bigNumber})),
34+
1734, 9, "M09", 26, 1, 9, 53, 6, 621, 602);
35+
36+
assert.throws(RangeError, () => pdt1.add(Temporal.Duration.from({microseconds: bigNumber})));
37+
assert.throws(RangeError, () => pdt1.add(Temporal.Duration.from({microseconds: -bigNumber})));
38+
39+
assert.throws(RangeError, () => pdt1.add(Temporal.Duration.from({milliseconds: bigNumber})));
40+
assert.throws(RangeError, () => pdt1.add(Temporal.Duration.from({milliseconds: -bigNumber})));
41+
42+
const pdt2 = new Temporal.PlainDateTime(0, 1, 1);
43+
3244
TemporalHelpers.assertPlainDateTime(pdt2.add(Temporal.Duration.from({nanoseconds: bigNumber})),
3345
285, 6, "M06", 4, 23, 47, 34, 740, 990, 976);
3446
TemporalHelpers.assertPlainDateTime(pdt2.add(Temporal.Duration.from({nanoseconds: -bigNumber})),

test/built-ins/Temporal/PlainDateTime/prototype/subtract/subtract-large-subseconds.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,21 @@ assert.throws(RangeError, () => pdt1.subtract(Temporal.Duration.from({millisecon
2626
assert.throws(RangeError, () => pdt1.subtract(Temporal.Duration.from({seconds: Number.MAX_SAFE_INTEGER})));
2727
assert.throws(RangeError, () => pdt1.subtract(Temporal.Duration.from({seconds: Number.MIN_SAFE_INTEGER})));
2828

29-
const pdt2 = new Temporal.PlainDateTime(0, 1, 1);
3029
const bigNumber = 9007199254740990976;
3130

31+
TemporalHelpers.assertPlainDateTime(pdt1.subtract(Temporal.Duration.from({nanoseconds: bigNumber})),
32+
1734, 9, "M09", 26, 1, 9, 53, 6, 621, 602);
33+
TemporalHelpers.assertPlainDateTime(pdt1.subtract(Temporal.Duration.from({nanoseconds: -bigNumber})),
34+
2305, 8, "M08", 4, 0, 45, 2, 488, 603, 554);
35+
36+
assert.throws(RangeError, () => pdt1.subtract(Temporal.Duration.from({microseconds: bigNumber})));
37+
assert.throws(RangeError, () => pdt1.subtract(Temporal.Duration.from({microseconds: -bigNumber})));
38+
39+
assert.throws(RangeError, () => pdt1.subtract(Temporal.Duration.from({milliseconds: bigNumber})));
40+
assert.throws(RangeError, () => pdt1.subtract(Temporal.Duration.from({milliseconds: -bigNumber})));
41+
42+
const pdt2 = new Temporal.PlainDateTime(0, 1, 1);
43+
3244
TemporalHelpers.assertPlainDateTime(pdt2.subtract(Temporal.Duration.from({nanoseconds: bigNumber})),
3345
-286, 7, "M07", 29, 0, 12, 25, 259, 9, 24);
3446
TemporalHelpers.assertPlainDateTime(pdt2.subtract(Temporal.Duration.from({nanoseconds: -bigNumber})),

test/built-ins/Temporal/PlainTime/prototype/add/add-large-subseconds.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,25 @@ TemporalHelpers.assertPlainTime(t1.add(Temporal.Duration.from({seconds: Number.M
3030
TemporalHelpers.assertPlainTime(t1.add(Temporal.Duration.from({seconds: Number.MIN_SAFE_INTEGER})),
3131
17, 20, 56, 747, 612, 578);
3232

33-
const t2 = new Temporal.PlainTime(0);
3433
const bigNumber = 9007199254740990976;
3534

35+
TemporalHelpers.assertPlainTime(t1.add(Temporal.Duration.from({nanoseconds: bigNumber})),
36+
0, 45, 2, 488, 603, 554);
37+
TemporalHelpers.assertPlainTime(t1.add(Temporal.Duration.from({nanoseconds: -bigNumber})),
38+
1, 9, 53, 6, 621, 602);
39+
40+
TemporalHelpers.assertPlainTime(t1.add(Temporal.Duration.from({microseconds: bigNumber})),
41+
9, 56, 28, 738, 588, 578);
42+
TemporalHelpers.assertPlainTime(t1.add(Temporal.Duration.from({microseconds: -bigNumber})),
43+
15, 58, 26, 756, 636, 578);
44+
45+
TemporalHelpers.assertPlainTime(t1.add(Temporal.Duration.from({milliseconds: bigNumber})),
46+
8, 33, 58, 723, 612, 578);
47+
TemporalHelpers.assertPlainTime(t1.add(Temporal.Duration.from({milliseconds: -bigNumber})),
48+
17, 20, 56, 771, 612, 578);
49+
50+
const t2 = new Temporal.PlainTime(0);
51+
3652
TemporalHelpers.assertPlainTime(t2.add(Temporal.Duration.from({nanoseconds: bigNumber})),
3753
23, 47, 34, 740, 990, 976);
3854
TemporalHelpers.assertPlainTime(t2.add(Temporal.Duration.from({nanoseconds: -bigNumber})),

test/built-ins/Temporal/PlainTime/prototype/subtract/subtract-large-subseconds.js

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,25 @@ TemporalHelpers.assertPlainTime(t1.subtract(Temporal.Duration.from({seconds: Num
3030
TemporalHelpers.assertPlainTime(t1.subtract(Temporal.Duration.from({seconds: Number.MIN_SAFE_INTEGER})),
3131
8, 33, 58, 747, 612, 578);
3232

33-
const t2 = new Temporal.PlainTime(0);
3433
const bigNumber = 9007199254740990976;
3534

35+
TemporalHelpers.assertPlainTime(t1.subtract(Temporal.Duration.from({nanoseconds: bigNumber})),
36+
1, 9, 53, 6, 621, 602);
37+
TemporalHelpers.assertPlainTime(t1.subtract(Temporal.Duration.from({nanoseconds: -bigNumber})),
38+
0, 45, 2, 488, 603, 554);
39+
40+
TemporalHelpers.assertPlainTime(t1.subtract(Temporal.Duration.from({microseconds: bigNumber})),
41+
15, 58, 26, 756, 636, 578);
42+
TemporalHelpers.assertPlainTime(t1.subtract(Temporal.Duration.from({microseconds: -bigNumber})),
43+
9, 56, 28, 738, 588, 578);
44+
45+
TemporalHelpers.assertPlainTime(t1.subtract(Temporal.Duration.from({milliseconds: bigNumber})),
46+
17, 20, 56, 771, 612, 578);
47+
TemporalHelpers.assertPlainTime(t1.subtract(Temporal.Duration.from({milliseconds: -bigNumber})),
48+
8, 33, 58, 723, 612, 578);
49+
50+
const t2 = new Temporal.PlainTime(0);
51+
3652
TemporalHelpers.assertPlainTime(t2.subtract(Temporal.Duration.from({nanoseconds: bigNumber})),
3753
0, 12, 25, 259, 9, 24);
3854
TemporalHelpers.assertPlainTime(t2.subtract(Temporal.Duration.from({nanoseconds: -bigNumber})),

test/built-ins/Temporal/ZonedDateTime/prototype/add/add-large-subseconds.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,21 @@ assert.throws(RangeError, () => zdt1.add(Temporal.Duration.from({milliseconds: N
2626
assert.throws(RangeError, () => zdt1.add(Temporal.Duration.from({seconds: Number.MAX_SAFE_INTEGER})));
2727
assert.throws(RangeError, () => zdt1.add(Temporal.Duration.from({seconds: Number.MIN_SAFE_INTEGER})));
2828

29-
const zdt2 = new Temporal.ZonedDateTime(0n, "UTC");
3029
const bigNumber = 9007199254740990976;
3130

31+
assert.sameValue(zdt1.add(Temporal.Duration.from({nanoseconds: bigNumber})).epochNanoseconds,
32+
10590165902488603554n);
33+
assert.sameValue(zdt1.add(Temporal.Duration.from({nanoseconds: -bigNumber})).epochNanoseconds,
34+
-7424232606993378398n);
35+
36+
assert.throws(RangeError, () => zdt1.add(Temporal.Duration.from({milliseconds: bigNumber})));
37+
assert.throws(RangeError, () => zdt1.add(Temporal.Duration.from({milliseconds: -bigNumber})));
38+
39+
assert.throws(RangeError, () => zdt1.add(Temporal.Duration.from({microseconds: bigNumber})));
40+
assert.throws(RangeError, () => zdt1.add(Temporal.Duration.from({microseconds: -bigNumber})));
41+
42+
const zdt2 = new Temporal.ZonedDateTime(0n, "UTC");
43+
3244
assert.sameValue(zdt2.add(Temporal.Duration.from({nanoseconds: bigNumber})).epochNanoseconds,
3345
9007199254740990976n);
3446
assert.sameValue(zdt2.add(Temporal.Duration.from({nanoseconds: -bigNumber})).epochNanoseconds,

test/built-ins/Temporal/ZonedDateTime/prototype/subtract/subtract-large-subseconds.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,21 @@ assert.throws(RangeError, () => zdt1.subtract(Temporal.Duration.from({millisecon
2626
assert.throws(RangeError, () => zdt1.subtract(Temporal.Duration.from({seconds: Number.MAX_SAFE_INTEGER})));
2727
assert.throws(RangeError, () => zdt1.subtract(Temporal.Duration.from({seconds: Number.MIN_SAFE_INTEGER})));
2828

29-
const zdt2 = new Temporal.ZonedDateTime(0n, "UTC");
3029
const bigNumber = 9007199254740990976;
3130

31+
assert.sameValue(zdt1.subtract(Temporal.Duration.from({nanoseconds: bigNumber})).epochNanoseconds,
32+
-7424232606993378398n);
33+
assert.sameValue(zdt1.subtract(Temporal.Duration.from({nanoseconds: -bigNumber})).epochNanoseconds,
34+
10590165902488603554n);
35+
36+
assert.throws(RangeError, () => zdt1.subtract(Temporal.Duration.from({microseconds: bigNumber})));
37+
assert.throws(RangeError, () => zdt1.subtract(Temporal.Duration.from({microseconds: -bigNumber})));
38+
39+
assert.throws(RangeError, () => zdt1.subtract(Temporal.Duration.from({milliseconds: bigNumber})));
40+
assert.throws(RangeError, () => zdt1.subtract(Temporal.Duration.from({milliseconds: -bigNumber})));
41+
42+
const zdt2 = new Temporal.ZonedDateTime(0n, "UTC");
43+
3244
assert.sameValue(zdt2.subtract(Temporal.Duration.from({nanoseconds: bigNumber})).epochNanoseconds,
3345
-9007199254740990976n);
3446
assert.sameValue(zdt2.subtract(Temporal.Duration.from({nanoseconds: -bigNumber})).epochNanoseconds,

0 commit comments

Comments
 (0)