Skip to content

Commit 2ea91c0

Browse files
anbaptomato
authored andcommitted
Temporal: Coverage for Temporal.Duration
1 parent 4aa9379 commit 2ea91c0

14 files changed

+603
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (C) 2024 André Bargull. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-temporal.duration.compare
6+
description: >
7+
Throws RangeError when adding duration to ZonedDateTime relativeTo fails.
8+
info: |
9+
Temporal.Duration.compare ( one, two [ , options ] )
10+
11+
12. If zonedRelativeTo is not undefined, and either TemporalUnitCategory(largestUnit1)
12+
or TemporalUnitCategory(largestUnit2) is date, then
13+
...
14+
c. Let after1 be ? AddZonedDateTime(zonedRelativeTo.[[EpochNanoseconds]], timeZone,
15+
calendar, duration1, constrain).
16+
d. Let after2 be ? AddZonedDateTime(zonedRelativeTo.[[EpochNanoseconds]], timeZone,
17+
calendar, duration2, constrain).
18+
...
19+
features: [Temporal]
20+
---*/
21+
22+
var blank = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
23+
var oneDay = new Temporal.Duration(0, 0, 0, 1);
24+
25+
var relativeTo = new Temporal.ZonedDateTime(864n * 10n**19n, "UTC");
26+
27+
var options = {
28+
relativeTo
29+
};
30+
31+
assert.throws(RangeError, () => Temporal.Duration.compare(oneDay, blank, options));
32+
assert.throws(RangeError, () => Temporal.Duration.compare(blank, oneDay, options));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Copyright (C) 2024 André Bargull. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-temporal.duration.from
6+
description: >
7+
Throws RangeError when when any duration component is Infinity.
8+
info: |
9+
Temporal.Duration.from ( item )
10+
11+
1. Return ? ToTemporalDuration(item).
12+
13+
ToTemporalDuration ( item )
14+
15+
...
16+
2. If item is not an Object, then
17+
...
18+
b. Return ? ParseTemporalDurationString(item).
19+
...
20+
21+
ParseTemporalDurationString ( isoString )
22+
23+
...
24+
44. Return ? CreateTemporalDuration(yearsMV, monthsMV, weeksMV, daysMV, hoursMV,
25+
minutesMV, secondsMV, millisecondsMV, microsecondsMV, nanosecondsMV).
26+
27+
28+
CreateTemporalDuration ( years, months, weeks, days, hours, minutes, seconds,
29+
milliseconds, microseconds, nanoseconds [ , newTarget ] )
30+
31+
1. If IsValidDuration(years, months, weeks, days, hours, minutes, seconds, milliseconds,
32+
microseconds, nanoseconds) is false, throw a RangeError exception.
33+
...
34+
35+
IsValidDuration ( years, months, weeks, days, hours, minutes, seconds, milliseconds,
36+
microseconds, nanoseconds )
37+
38+
...
39+
2. For each value v of « years, months, weeks, days, hours, minutes, seconds,
40+
milliseconds, microseconds, nanoseconds », do
41+
a. If 𝔽(v) is not finite, return false.
42+
...
43+
features: [Temporal]
44+
---*/
45+
46+
var inf = "9".repeat(1000);
47+
48+
assert.throws(RangeError, () => Temporal.Duration.from(`P${inf}Y`));
49+
assert.throws(RangeError, () => Temporal.Duration.from(`P${inf}M`));
50+
assert.throws(RangeError, () => Temporal.Duration.from(`P${inf}W`));
51+
assert.throws(RangeError, () => Temporal.Duration.from(`P${inf}D`));
52+
assert.throws(RangeError, () => Temporal.Duration.from(`PT${inf}H`));
53+
assert.throws(RangeError, () => Temporal.Duration.from(`PT${inf}M`));
54+
assert.throws(RangeError, () => Temporal.Duration.from(`PT${inf}S`));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
// Copyright (C) 2024 André Bargull. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-temporal.duration.from
6+
description: >
7+
ToNumber conversion throws.
8+
info: |
9+
Temporal.Duration.from ( item )
10+
11+
1. Return ? ToTemporalDuration(item).
12+
13+
ToTemporalDuration ( item )
14+
15+
...
16+
4. Let partial be ? ToTemporalPartialDurationRecord(item).
17+
...
18+
19+
ToTemporalPartialDurationRecord ( temporalDurationLike )
20+
21+
...
22+
4. Let days be ? Get(temporalDurationLike, "days").
23+
...
24+
6. Let hours be ? Get(temporalDurationLike, "hours").
25+
...
26+
8. Let microseconds be ? Get(temporalDurationLike, "microseconds").
27+
...
28+
10. Let milliseconds be ? Get(temporalDurationLike, "milliseconds").
29+
11....
30+
12. Let minutes be ? Get(temporalDurationLike, "minutes").
31+
...
32+
14. Let months be ? Get(temporalDurationLike, "months").
33+
...
34+
16. Let nanoseconds be ? Get(temporalDurationLike, "nanoseconds").
35+
...
36+
18. Let seconds be ? Get(temporalDurationLike, "seconds").
37+
...
38+
20. Let weeks be ? Get(temporalDurationLike, "weeks").
39+
...
40+
22. Let years be ? Get(temporalDurationLike, "years").
41+
...
42+
43+
ToIntegerIfIntegral ( argument )
44+
45+
1. Let number be ? ToNumber(argument).
46+
...
47+
features: [Temporal]
48+
---*/
49+
50+
for (var name of [
51+
"years",
52+
"months",
53+
"weeks",
54+
"days",
55+
"hours",
56+
"minutes",
57+
"seconds",
58+
"milliseconds",
59+
"microseconds",
60+
"nanoseconds",
61+
]) {
62+
var item = {
63+
get [name]() {
64+
throw new Test262Error();
65+
}
66+
};
67+
assert.throws(
68+
Test262Error,
69+
() => Temporal.Duration.from(item),
70+
`name = ${name}`
71+
);
72+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Copyright (C) 2024 André Bargull. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-temporal.duration.from
6+
description: >
7+
ToNumber conversion throws.
8+
info: |
9+
Temporal.Duration.from ( item )
10+
11+
1. Return ? ToTemporalDuration(item).
12+
13+
ToTemporalDuration ( item )
14+
15+
...
16+
4. Let partial be ? ToTemporalPartialDurationRecord(item).
17+
...
18+
19+
ToTemporalPartialDurationRecord ( temporalDurationLike )
20+
21+
...
22+
5. If days is not undefined, set result.[[Days]] to ? ToIntegerIfIntegral(days).
23+
...
24+
7. If hours is not undefined, set result.[[Hours]] to ? ToIntegerIfIntegral(hours).
25+
...
26+
9. If microseconds is not undefined, set result.[[Microseconds]] to ? ToIntegerIfIntegral(microseconds).
27+
...
28+
11. If milliseconds is not undefined, set result.[[Milliseconds]] to ? ToIntegerIfIntegral(milliseconds).
29+
...
30+
13. If minutes is not undefined, set result.[[Minutes]] to ? ToIntegerIfIntegral(minutes).
31+
...
32+
15. If months is not undefined, set result.[[Months]] to ? ToIntegerIfIntegral(months).
33+
...
34+
17. If nanoseconds is not undefined, set result.[[Nanoseconds]] to ? ToIntegerIfIntegral(nanoseconds).
35+
...
36+
19. If seconds is not undefined, set result.[[Seconds]] to ? ToIntegerIfIntegral(seconds).
37+
...
38+
21. If weeks is not undefined, set result.[[Weeks]] to ? ToIntegerIfIntegral(weeks).
39+
...
40+
23. If years is not undefined, set result.[[Years]] to ? ToIntegerIfIntegral(years).
41+
...
42+
43+
ToIntegerIfIntegral ( argument )
44+
45+
1. Let number be ? ToNumber(argument).
46+
...
47+
features: [Temporal]
48+
---*/
49+
50+
for (var invalid of [Symbol(), 0n]) {
51+
for (var name of [
52+
"years",
53+
"months",
54+
"weeks",
55+
"days",
56+
"hours",
57+
"minutes",
58+
"seconds",
59+
"milliseconds",
60+
"microseconds",
61+
"nanoseconds",
62+
]) {
63+
var item = {[name]: invalid};
64+
assert.throws(
65+
TypeError,
66+
() => Temporal.Duration.from(item),
67+
`name = ${name}, value = ${String(invalid)}`
68+
);
69+
}
70+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
// Copyright (C) 2024 André Bargull. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-temporal.instant
6+
description: >
7+
OrdinaryCreateFromConstructor returns with an abrupt completion.
8+
info: |
9+
CreateTemporalDuration ( years, months, weeks, days, hours, minutes, seconds,
10+
milliseconds, microseconds, nanoseconds [ , newTarget ] )
11+
12+
...
13+
3. Let object be ? OrdinaryCreateFromConstructor(newTarget, "%Temporal.Duration.prototype%",
14+
« [[InitializedTemporalDuration]], [[Years]], [[Months]], [[Weeks]], [[Days]], [[Hours]],
15+
[[Minutes]], [[Seconds]], [[Milliseconds]], [[Microseconds]], [[Nanoseconds]] »).
16+
...
17+
18+
OrdinaryCreateFromConstructor ( constructor, intrinsicDefaultProto [ , internalSlotsList ] )
19+
20+
...
21+
2. Let proto be ? GetPrototypeFromConstructor(constructor, intrinsicDefaultProto).
22+
...
23+
24+
GetPrototypeFromConstructor ( constructor, intrinsicDefaultProto )
25+
26+
...
27+
2. Let proto be ? Get(constructor, "prototype").
28+
...
29+
30+
features: [Temporal]
31+
---*/
32+
33+
var newTarget = Object.defineProperty(function(){}.bind(), "prototype", {
34+
get() {
35+
throw new Test262Error();
36+
}
37+
});
38+
39+
assert.throws(Test262Error, function() {
40+
Reflect.construct(Temporal.Duration, [], newTarget)
41+
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright (C) 2024 André Bargull. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-temporal.duration
6+
description: >
7+
ToNumber conversion throws.
8+
info: |
9+
Temporal.Duration ( [ years [ , months [ , weeks [ , days [ , hours [ ,
10+
minutes [ , seconds [ , milliseconds [ , microseconds [ ,
11+
nanoseconds ] ] ] ] ] ] ] ] ] ] )
12+
13+
...
14+
2. If years is undefined, let y be 0; else let y be ? ToIntegerIfIntegral(years).
15+
3. If months is undefined, let mo be 0; else let mo be ? ToIntegerIfIntegral(months).
16+
4. If weeks is undefined, let w be 0; else let w be ? ToIntegerIfIntegral(weeks).
17+
5. If days is undefined, let d be 0; else let d be ? ToIntegerIfIntegral(days).
18+
6. If hours is undefined, let h be 0; else let h be ? ToIntegerIfIntegral(hours).
19+
7. If minutes is undefined, let m be 0; else let m be ? ToIntegerIfIntegral(minutes).
20+
8. If seconds is undefined, let s be 0; else let s be ? ToIntegerIfIntegral(seconds).
21+
9. If milliseconds is undefined, let ms be 0; else let ms be ? ToIntegerIfIntegral(milliseconds).
22+
10. If microseconds is undefined, let mis be 0; else let mis be ? ToIntegerIfIntegral(microseconds).
23+
11. If nanoseconds is undefined, let ns be 0; else let ns be ? ToIntegerIfIntegral(nanoseconds).
24+
...
25+
26+
ToIntegerIfIntegral ( argument )
27+
28+
1. Let number be ? ToNumber(argument).
29+
...
30+
features: [Temporal]
31+
---*/
32+
33+
for (var invalid of [Symbol(), 0n]) {
34+
assert.throws(TypeError, () => new Temporal.Duration(invalid));
35+
assert.throws(TypeError, () => new Temporal.Duration(0, invalid));
36+
assert.throws(TypeError, () => new Temporal.Duration(0, 0, invalid));
37+
assert.throws(TypeError, () => new Temporal.Duration(0, 0, 0, invalid));
38+
assert.throws(TypeError, () => new Temporal.Duration(0, 0, 0, 0, invalid));
39+
assert.throws(TypeError, () => new Temporal.Duration(0, 0, 0, 0, 0, invalid));
40+
assert.throws(TypeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, invalid));
41+
assert.throws(TypeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, invalid));
42+
assert.throws(TypeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, invalid));
43+
assert.throws(TypeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, invalid));
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright (C) 2024 André Bargull. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-temporal.duration
6+
description: >
7+
Throws RangeError when any duration component is a too large finite number.
8+
features: [Temporal]
9+
---*/
10+
11+
assert.throws(RangeError, () => new Temporal.Duration(Number.MAX_VALUE));
12+
assert.throws(RangeError, () => new Temporal.Duration(0, Number.MAX_VALUE));
13+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, Number.MAX_VALUE));
14+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, Number.MAX_VALUE));
15+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, Number.MAX_VALUE));
16+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, 0, Number.MAX_VALUE));
17+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, Number.MAX_VALUE));
18+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, Number.MAX_VALUE));
19+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, Number.MAX_VALUE));
20+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, Number.MAX_VALUE));
21+
22+
assert.throws(RangeError, () => new Temporal.Duration(-Number.MAX_VALUE));
23+
assert.throws(RangeError, () => new Temporal.Duration(0, -Number.MAX_VALUE));
24+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, -Number.MAX_VALUE));
25+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, -Number.MAX_VALUE));
26+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, -Number.MAX_VALUE));
27+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, 0, -Number.MAX_VALUE));
28+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, -Number.MAX_VALUE));
29+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -Number.MAX_VALUE));
30+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -Number.MAX_VALUE));
31+
assert.throws(RangeError, () => new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -Number.MAX_VALUE));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright (C) 2024 André Bargull. All rights reserved.
2+
// This code is governed by the BSD license found in the LICENSE file.
3+
4+
/*---
5+
esid: sec-temporal.duration.prototype.add
6+
description: >
7+
TemporalDurationFromInternal throws a RangeError when the result is too large.
8+
info: |
9+
TemporalDurationFromInternal ( internalDuration, largestUnit )
10+
11+
...
12+
9. Else if largestUnit is microsecond, then
13+
a. Set microseconds to floor(nanoseconds / 1000).
14+
b. Set nanoseconds to nanoseconds modulo 1000.
15+
...
16+
12. Return ? CreateTemporalDuration(internalDuration.[[Date]].[[Years]],
17+
internalDuration.[[Date]].[[Months]], internalDuration.[[Date]].[[Weeks]],
18+
internalDuration.[[Date]].[[Days]] + days × sign, hours × sign, minutes × sign,
19+
seconds × sign, milliseconds × sign, microseconds × sign, nanoseconds × sign).
20+
features: [Temporal]
21+
---*/
22+
23+
var one = Temporal.Duration.from({nanoseconds: 9.007199254740991e+24});
24+
var two = Temporal.Duration.from({microseconds: 1_000_000});
25+
26+
// TemporalDurationFromInternal is called with:
27+
// internalDuration.[[Time]] = 9,007,199,254,740,991,926,258,176.
28+
//
29+
// |microseconds| is 9,007,199,254,740,991,926,258, which rounds up to
30+
// 9,007,199,254,740,992,000,000. This exceeds the maximum allowed duration.
31+
assert.throws(RangeError, () => one.add(two));

0 commit comments

Comments
 (0)