-
Notifications
You must be signed in to change notification settings - Fork 461
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Temporal: Tests for date difference algorithm
This adds tests specifically for every kind of case that changes due to the tweak to the date difference algorithm: differences from a longer month to a shorter month, when the months are adjacent, in the same year but not adjacent, and in different years. Also adds tests for a case that does *not* change, but would trip on an incorrectly implemented algorithm: when the intermediate months value falls at the end of February. There was incidental coverage of the change to the date difference algorithm in other tests. Those are adjusted, as well. Normative change: tc39/proposal-temporal#2759 Consensus in February 2024
- Loading branch information
Showing
8 changed files
with
711 additions
and
9 deletions.
There are no files selected for viewing
117 changes: 117 additions & 0 deletions
117
test/built-ins/Temporal/PlainDate/prototype/since/wrapping-at-end-of-month.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
// Copyright (C) 2024 Igalia, S.L. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
|
||
/*--- | ||
esid: sec-temporal.plaindate.prototype.since | ||
description: Tests balancing of days to months at end of month | ||
includes: [temporalHelpers.js] | ||
features: [Temporal] | ||
---*/ | ||
|
||
// Difference between end of longer month to end of following shorter month | ||
{ | ||
const end = new Temporal.PlainDate(1970, 2, 28); | ||
for (const largestUnit of ["years", "months"]) { | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 28).since(end, { largestUnit }), | ||
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Jan 28th to Feb 28th is one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 29).since(end, { largestUnit }), | ||
0, 0, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Jan 29th to Feb 28th is 30 days, not one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 30).since(end, { largestUnit }), | ||
0, 0, 0, -29, 0, 0, 0, 0, 0, 0, | ||
"Jan 30th to Feb 28th is 29 days, not one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 31).since(end, { largestUnit }), | ||
0, 0, 0, -28, 0, 0, 0, 0, 0, 0, | ||
"Jan 31st to Feb 28th is 28 days, not one month" | ||
); | ||
} | ||
} | ||
|
||
// Difference between end of leap-year January to end of leap-year February | ||
{ | ||
const end = new Temporal.PlainDate(1972, 2, 29); | ||
for (const largestUnit of ["years", "months"]) { | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1972, 1, 29).since(end, { largestUnit }), | ||
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Jan 29th to Feb 29th is one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1972, 1, 30).since(end, { largestUnit }), | ||
0, 0, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Jan 30th to Feb 29th is 30 days, not one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1972, 1, 31).since(end, { largestUnit }), | ||
0, 0, 0, -29, 0, 0, 0, 0, 0, 0, | ||
"Jan 31st to Feb 29th is 29 days, not one month" | ||
); | ||
} | ||
} | ||
|
||
// Difference between end of longer month to end of not-immediately-following | ||
// shorter month | ||
{ | ||
const end = new Temporal.PlainDate(1970, 11, 30); | ||
for (const largestUnit of ["years", "months"]) { | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 8, 30).since(end, { largestUnit }), | ||
0, -3, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Aug 30th to Nov 30th is 3 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 8, 31).since(end, { largestUnit }), | ||
0, -2, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Aug 31st to Nov 30th is 2 months 30 days, not 3 months" | ||
); | ||
} | ||
} | ||
|
||
// Difference between end of longer month in one year to shorter month in | ||
// later year | ||
{ | ||
const end = new Temporal.PlainDate(1973, 4, 30); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 12, 30).since(end, { largestUnit: "months" }), | ||
0, -28, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 28 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 12, 30).since(end, { largestUnit: "years" }), | ||
-2, -4, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 2 years, 4 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 12, 31).since(end, { largestUnit: "months" }), | ||
0, -27, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 27 months, 30 days, not 28 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 12, 31).since(end, { largestUnit: "years" }), | ||
-2, -3, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 2 years, 3 months, 30 days, not 2 years 4 months" | ||
); | ||
} | ||
|
||
// Difference where months passes through a month that's the same length or | ||
// shorter than either the start or end month | ||
{ | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 29).since(new Temporal.PlainDate(1970, 3, 28), { largestUnit: "months" }), | ||
0, -1, 0, -28, 0, 0, 0, 0, 0, 0, | ||
"Jan 29th to Mar 28th is 1 month 28 days, not 58 days" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 31).since(new Temporal.PlainDate(1971, 5, 30), { largestUnit: "years" }), | ||
-1, -3, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Jan 31st 1970 to May 30th 1971 is 1 year, 3 months, 30 days, not 1 year, 2 months, 60 days" | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
117 changes: 117 additions & 0 deletions
117
test/built-ins/Temporal/PlainDate/prototype/until/wrapping-at-end-of-month.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
// Copyright (C) 2024 Igalia, S.L. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
|
||
/*--- | ||
esid: sec-temporal.plaindate.prototype.until | ||
description: Tests balancing of days to months at end of month | ||
includes: [temporalHelpers.js] | ||
features: [Temporal] | ||
---*/ | ||
|
||
// Difference between end of longer month to end of following shorter month | ||
{ | ||
const end = new Temporal.PlainDate(1970, 2, 28); | ||
for (const largestUnit of ["years", "months"]) { | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 28).until(end, { largestUnit }), | ||
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Jan 28th to Feb 28th is one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 29).until(end, { largestUnit }), | ||
0, 0, 0, 30, 0, 0, 0, 0, 0, 0, | ||
"Jan 29th to Feb 28th is 30 days, not one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 30).until(end, { largestUnit }), | ||
0, 0, 0, 29, 0, 0, 0, 0, 0, 0, | ||
"Jan 30th to Feb 28th is 29 days, not one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 31).until(end, { largestUnit }), | ||
0, 0, 0, 28, 0, 0, 0, 0, 0, 0, | ||
"Jan 31st to Feb 28th is 28 days, not one month" | ||
); | ||
} | ||
} | ||
|
||
// Difference between end of leap-year January to end of leap-year February | ||
{ | ||
const end = new Temporal.PlainDate(1972, 2, 29); | ||
for (const largestUnit of ["years", "months"]) { | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1972, 1, 29).until(end, { largestUnit }), | ||
0, 1, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Jan 29th to Feb 29th is one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1972, 1, 30).until(end, { largestUnit }), | ||
0, 0, 0, 30, 0, 0, 0, 0, 0, 0, | ||
"Jan 30th to Feb 29th is 30 days, not one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1972, 1, 31).until(end, { largestUnit }), | ||
0, 0, 0, 29, 0, 0, 0, 0, 0, 0, | ||
"Jan 31st to Feb 29th is 29 days, not one month" | ||
); | ||
} | ||
} | ||
|
||
// Difference between end of longer month to end of not-immediately-following | ||
// shorter month | ||
{ | ||
const end = new Temporal.PlainDate(1970, 11, 30); | ||
for (const largestUnit of ["years", "months"]) { | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 8, 30).until(end, { largestUnit }), | ||
0, 3, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Aug 30th to Nov 30th is 3 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 8, 31).until(end, { largestUnit }), | ||
0, 2, 0, 30, 0, 0, 0, 0, 0, 0, | ||
"Aug 31st to Nov 30th is 2 months 30 days, not 3 months" | ||
); | ||
} | ||
} | ||
|
||
// Difference between end of longer month in one year to shorter month in | ||
// later year | ||
{ | ||
const end = new Temporal.PlainDate(1973, 4, 30); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 12, 30).until(end, { largestUnit: "months" }), | ||
0, 28, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 28 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 12, 30).until(end, { largestUnit: "years" }), | ||
2, 4, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 2 years, 4 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 12, 31).until(end, { largestUnit: "months" }), | ||
0, 27, 0, 30, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 27 months, 30 days, not 28 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 12, 31).until(end, { largestUnit: "years" }), | ||
2, 3, 0, 30, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 2 years, 3 months, 30 days, not 2 years 4 months" | ||
); | ||
} | ||
|
||
// Difference where months passes through a month that's the same length or | ||
// shorter than either the start or end month | ||
{ | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 29).until(new Temporal.PlainDate(1970, 3, 28), { largestUnit: "months" }), | ||
0, 1, 0, 28, 0, 0, 0, 0, 0, 0, | ||
"Jan 29th to Mar 28th is 1 month 28 days, not 58 days" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDate(1970, 1, 31).until(new Temporal.PlainDate(1971, 5, 30), { largestUnit: "years" }), | ||
1, 3, 0, 30, 0, 0, 0, 0, 0, 0, | ||
"Jan 31st 1970 to May 30th 1971 is 1 year, 3 months, 30 days, not 1 year, 2 months, 60 days" | ||
); | ||
} |
117 changes: 117 additions & 0 deletions
117
test/built-ins/Temporal/PlainDateTime/prototype/since/wrapping-at-end-of-month.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,117 @@ | ||
// Copyright (C) 2024 Igalia, S.L. All rights reserved. | ||
// This code is governed by the BSD license found in the LICENSE file. | ||
|
||
/*--- | ||
esid: sec-temporal.plaindatetime.prototype.since | ||
description: Tests balancing of days to months at end of month | ||
includes: [temporalHelpers.js] | ||
features: [Temporal] | ||
---*/ | ||
|
||
// Difference between end of longer month to end of following shorter month | ||
{ | ||
const end = new Temporal.PlainDateTime(1970, 2, 28); | ||
for (const largestUnit of ["years", "months"]) { | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 1, 28).since(end, { largestUnit }), | ||
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Jan 28th to Feb 28th is one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 1, 29).since(end, { largestUnit }), | ||
0, 0, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Jan 29th to Feb 28th is 30 days, not one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 1, 30).since(end, { largestUnit }), | ||
0, 0, 0, -29, 0, 0, 0, 0, 0, 0, | ||
"Jan 30th to Feb 28th is 29 days, not one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 1, 31).since(end, { largestUnit }), | ||
0, 0, 0, -28, 0, 0, 0, 0, 0, 0, | ||
"Jan 31st to Feb 28th is 28 days, not one month" | ||
); | ||
} | ||
} | ||
|
||
// Difference between end of leap-year January to end of leap-year February | ||
{ | ||
const end = new Temporal.PlainDateTime(1972, 2, 29); | ||
for (const largestUnit of ["years", "months"]) { | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1972, 1, 29).since(end, { largestUnit }), | ||
0, -1, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Jan 29th to Feb 29th is one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1972, 1, 30).since(end, { largestUnit }), | ||
0, 0, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Jan 30th to Feb 29th is 30 days, not one month" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1972, 1, 31).since(end, { largestUnit }), | ||
0, 0, 0, -29, 0, 0, 0, 0, 0, 0, | ||
"Jan 31st to Feb 29th is 29 days, not one month" | ||
); | ||
} | ||
} | ||
|
||
// Difference between end of longer month to end of not-immediately-following | ||
// shorter month | ||
{ | ||
const end = new Temporal.PlainDateTime(1970, 11, 30); | ||
for (const largestUnit of ["years", "months"]) { | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 8, 30).since(end, { largestUnit }), | ||
0, -3, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Aug 30th to Nov 30th is 3 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 8, 31).since(end, { largestUnit }), | ||
0, -2, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Aug 31st to Nov 30th is 2 months 30 days, not 3 months" | ||
); | ||
} | ||
} | ||
|
||
// Difference between end of longer month in one year to shorter month in | ||
// later year | ||
{ | ||
const end = new Temporal.PlainDateTime(1973, 4, 30); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 12, 30).since(end, { largestUnit: "months" }), | ||
0, -28, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 28 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 12, 30).since(end, { largestUnit: "years" }), | ||
-2, -4, 0, 0, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 2 years, 4 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 12, 31).since(end, { largestUnit: "months" }), | ||
0, -27, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 27 months, 30 days, not 28 months" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 12, 31).since(end, { largestUnit: "years" }), | ||
-2, -3, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Dec 30th 1970 to Apr 30th 1973 is 2 years, 3 months, 30 days, not 2 years 4 months" | ||
); | ||
} | ||
|
||
// Difference where months passes through a month that's the same length or | ||
// shorter than either the start or end month | ||
{ | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 1, 29).since(new Temporal.PlainDateTime(1970, 3, 28), { largestUnit: "months" }), | ||
0, -1, 0, -28, 0, 0, 0, 0, 0, 0, | ||
"Jan 29th to Mar 28th is 1 month 28 days, not 58 days" | ||
); | ||
TemporalHelpers.assertDuration( | ||
new Temporal.PlainDateTime(1970, 1, 31).since(new Temporal.PlainDateTime(1971, 5, 30), { largestUnit: "years" }), | ||
-1, -3, 0, -30, 0, 0, 0, 0, 0, 0, | ||
"Jan 31st 1970 to May 30th 1971 is 1 year, 3 months, 30 days, not 1 year, 2 months, 60 days" | ||
); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.