Skip to content

Commit

Permalink
Temporal: Improve coverage of relativeto-string-limits tests
Browse files Browse the repository at this point in the history
These tests did not fully cover Temporal.Duration.prototype.round and
Temporal.Duration.prototype.total because they called those methods on a
blank duration (all components zero), for which there is an early return
in round() and total().

This meant that we missed an assertion that would be hit after the early
return.

This makes sure to test both blank and non-blank Durations with these
relativeTo strings, and expect some strings to fail at different steps
with the two cases.

See: tc39/proposal-temporal#3015
  • Loading branch information
ptomato committed Dec 5, 2024
1 parent 42d8327 commit ad9e6c6
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ description: ISO strings at the edges of the representable range
features: [Temporal]
---*/

const instance = new Temporal.Duration();
const instance = new Temporal.Duration(0, 0, 0, 0, 0, /* minutes = */ 5);
const blankInstance = new Temporal.Duration();

const validStrings = [
"-271821-04-20T00:00Z[UTC]",
Expand All @@ -21,7 +22,7 @@ const validStrings = [
];

for (const relativeTo of validStrings) {
Temporal.Duration.compare(instance, instance, { relativeTo });
Temporal.Duration.compare(instance, blankInstance, { relativeTo });
}

const invalidStrings = [
Expand All @@ -42,7 +43,7 @@ const invalidStrings = [
for (const relativeTo of invalidStrings) {
assert.throws(
RangeError,
() => Temporal.Duration.compare(instance, instance, { relativeTo }),
() => Temporal.Duration.compare(instance, blankInstance, { relativeTo }),
`"${relativeTo}" is outside the representable range for a relativeTo parameter`
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,34 @@ description: ISO strings at the edges of the representable range
features: [Temporal]
---*/

const instance = new Temporal.Duration();
const instance = new Temporal.Duration(0, 0, 0, 0, 0, /* minutes = */ 5);
const blankInstance = new Temporal.Duration();

const validStrings = [
"-271821-04-20T00:00Z[UTC]",
"+275760-09-13T00:00Z[UTC]",
"+275760-09-13T01:00+01:00[+01:00]",
"+275760-09-13T23:59+23:59[+23:59]",
"-271821-04-19",
"-271821-04-19T01:00",
"+275760-09-13",
"+275760-09-13T23:00",
];

for (const relativeTo of validStrings) {
instance.round({ smallestUnit: "minutes", relativeTo });
blankInstance.round({ smallestUnit: "minutes", relativeTo });
}

const validStringsThatFailAfterEarlyReturn = [
"+275760-09-13T00:00Z[UTC]",
"+275760-09-13T01:00+01:00[+01:00]",
"+275760-09-13T23:59+23:59[+23:59]",
"-271821-04-19",
"-271821-04-19T01:00",
];
for (const relativeTo of validStringsThatFailAfterEarlyReturn) {
blankInstance.round({ smallestUnit: "minutes", relativeTo });
assert.throws(
RangeError,
() => instance.round({ smallestUnit: "minutes", relativeTo }),
`"${relativeTo}" is outside the representable range for a relativeTo parameter after conversion to DateTime`
);
}

const invalidStrings = [
Expand All @@ -45,4 +58,9 @@ for (const relativeTo of invalidStrings) {
() => instance.round({ smallestUnit: "minutes", relativeTo }),
`"${relativeTo}" is outside the representable range for a relativeTo parameter`
);
assert.throws(
RangeError,
() => blankInstance.round({ smallestUnit: "minutes", relativeTo }),
`"${relativeTo}" is outside the representable range for a relativeTo parameter`
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,34 @@ description: ISO strings at the edges of the representable range
features: [Temporal]
---*/

const instance = new Temporal.Duration();
const instance = new Temporal.Duration(0, 0, 0, 0, 0, /* minutes = */ 5);
const blankInstance = new Temporal.Duration();

const validStrings = [
"-271821-04-20T00:00Z[UTC]",
"+275760-09-13T00:00Z[UTC]",
"+275760-09-13T01:00+01:00[+01:00]",
"+275760-09-13T23:59+23:59[+23:59]",
"-271821-04-19",
"-271821-04-19T01:00",
"+275760-09-13",
"+275760-09-13T23:00",
];

for (const relativeTo of validStrings) {
instance.total({ unit: "minutes", relativeTo });
blankInstance.total({ unit: "minutes", relativeTo });
}

const validStringsThatFailAfterEarlyReturn = [
"+275760-09-13T00:00Z[UTC]",
"+275760-09-13T01:00+01:00[+01:00]",
"+275760-09-13T23:59+23:59[+23:59]",
"-271821-04-19",
"-271821-04-19T01:00",
];
for (const relativeTo of validStringsThatFailAfterEarlyReturn) {
blankInstance.total({ unit: "minutes", relativeTo });
assert.throws(
RangeError,
() => instance.total({ unit: "minutes", relativeTo }),
`"${relativeTo}" is outside the representable range for a relativeTo parameter after conversion to DateTime`
);
}

const invalidStrings = [
Expand All @@ -45,4 +58,9 @@ for (const relativeTo of invalidStrings) {
() => instance.total({ unit: "minutes", relativeTo }),
`"${relativeTo}" is outside the representable range for a relativeTo parameter`
);
assert.throws(
RangeError,
() => blankInstance.total({ unit: "minutes", relativeTo }),
`"${relativeTo}" is outside the representable range for a relativeTo parameter`
);
}

0 comments on commit ad9e6c6

Please sign in to comment.