diff --git a/test/built-ins/Temporal/PlainYearMonth/prototype/add/end-of-month-out-of-range.js b/test/built-ins/Temporal/PlainYearMonth/prototype/add/end-of-month-out-of-range.js new file mode 100644 index 0000000000..bdae83c18b --- /dev/null +++ b/test/built-ins/Temporal/PlainYearMonth/prototype/add/end-of-month-out-of-range.js @@ -0,0 +1,30 @@ +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainyearmonth.prototype.add +description: RangeError thrown when adding negative duration and end of month is out of range +features: [Temporal] +info: | + AddDurationToOrSubtractDurationFromPlainYearMonth: + 12. If _sign_ < 0, then + a. Let _oneMonthDuration_ be ! CreateTemporalDuration(0, 1, 0, 0, 0, 0, 0, 0, 0, 0). + b. Let _nextMonth_ be ? CalendarDateAdd(_calendar_, _intermediateDate_, _oneMonthDuration_, *undefined*, _dateAdd_). + c. Let _endOfMonthISO_ be ! AddISODate(_nextMonth_.[[ISOYear]], _nextMonth_.[[ISOMonth]], _nextMonth_.[[ISODay]], 0, 0, 0, -1, *"constrain"*). + d. Let _endOfMonth_ be ? CreateTemporalDate(_endOfMonthISO_.[[Year]], _endOfMonthISO_.[[Month]], _endOfMonthISO_.[[Day]], _calendar_). +---*/ + +// Based on a test case by André Bargull + +const duration = new Temporal.Duration(0, 0, 0, -1); + +// Calendar addition result is out of range +assert.throws(RangeError, () => new Temporal.PlainYearMonth(275760, 9).add(duration), "Addition of 1 month to receiver out of range"); + +// Calendar addition succeeds, but subtracting 1 day gives out of range result +const cal = new class extends Temporal.Calendar { + dateAdd() { + return new Temporal.PlainDate(-271821, 4, 19); + } +}("iso8601"); +assert.throws(RangeError, () => new Temporal.PlainYearMonth(2000, 1, cal).add(duration), "Subtraction of 1 day from next month out of range"); diff --git a/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/end-of-month-out-of-range.js b/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/end-of-month-out-of-range.js new file mode 100644 index 0000000000..36117a5b45 --- /dev/null +++ b/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/end-of-month-out-of-range.js @@ -0,0 +1,30 @@ +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plainyearmonth.prototype.subtract +description: RangeError thrown when subtracting positive duration and end of month is out of range +features: [Temporal] +info: | + AddDurationToOrSubtractDurationFromPlainYearMonth: + 12. If _sign_ < 0, then + a. Let _oneMonthDuration_ be ! CreateTemporalDuration(0, 1, 0, 0, 0, 0, 0, 0, 0, 0). + b. Let _nextMonth_ be ? CalendarDateAdd(_calendar_, _intermediateDate_, _oneMonthDuration_, *undefined*, _dateAdd_). + c. Let _endOfMonthISO_ be ! AddISODate(_nextMonth_.[[ISOYear]], _nextMonth_.[[ISOMonth]], _nextMonth_.[[ISODay]], 0, 0, 0, -1, *"constrain"*). + d. Let _endOfMonth_ be ? CreateTemporalDate(_endOfMonthISO_.[[Year]], _endOfMonthISO_.[[Month]], _endOfMonthISO_.[[Day]], _calendar_). +---*/ + +// Based on a test case by André Bargull + +const duration = new Temporal.Duration(0, 0, 0, 1); + +// Calendar addition result is out of range +assert.throws(RangeError, () => new Temporal.PlainYearMonth(275760, 9).subtract(duration), "Addition of 1 month to receiver out of range"); + +// Calendar addition succeeds, but subtracting 1 day gives out of range result +const cal = new class extends Temporal.Calendar { + dateAdd() { + return new Temporal.PlainDate(-271821, 4, 19); + } +}("iso8601"); +assert.throws(RangeError, () => new Temporal.PlainYearMonth(2000, 1, cal).subtract(duration), "Subtraction of 1 day from next month out of range");