diff --git a/test/built-ins/Temporal/PlainDate/from/monthcode-invalid.js b/test/built-ins/Temporal/PlainDate/from/monthcode-invalid.js new file mode 100644 index 0000000000..c42c69018d --- /dev/null +++ b/test/built-ins/Temporal/PlainDate/from/monthcode-invalid.js @@ -0,0 +1,33 @@ +// 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.from +description: Validation of monthCode +features: [Temporal] +---*/ + +["m1", "M1", "m01"].forEach((monthCode) => { + assert.throws(RangeError, () => Temporal.PlainDate.from({ year: 2021, monthCode, day: 17 }), + `monthCode '${monthCode}' is not well-formed`); +}); + +assert.throws(RangeError, () => Temporal.PlainDate.from({ year: 2021, month: 12, monthCode: "M11", day: 17 }), + "monthCode and month conflict"); + +["M00", "M19", "M99", "M13", "M00L", "M05L", "M13L"].forEach((monthCode) => { + assert.throws(RangeError, () => Temporal.PlainDate.from({ year: 2021, monthCode, day: 17 }), + `monthCode '${monthCode}' is not valid for ISO 8601 calendar`); +}); + +assert.throws( + RangeError, + () => Temporal.PlainDate.from({ day: 1, monthCode: "L99M", year: Symbol() }), + "Month code syntax is validated before year type is validated" +); + +assert.throws( + TypeError, + () => Temporal.PlainDate.from({ day: 1, monthCode: "M99L", year: Symbol() }), + "Month code suitability is validated after year type is validated" +); diff --git a/test/built-ins/Temporal/PlainDateTime/from/monthcode-invalid.js b/test/built-ins/Temporal/PlainDateTime/from/monthcode-invalid.js new file mode 100644 index 0000000000..2cc9a67cef --- /dev/null +++ b/test/built-ins/Temporal/PlainDateTime/from/monthcode-invalid.js @@ -0,0 +1,33 @@ +// 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.from +description: Validation of monthCode +features: [Temporal] +---*/ + +["m1", "M1", "m01"].forEach((monthCode) => { + assert.throws(RangeError, () => Temporal.PlainDateTime.from({ year: 2021, monthCode, day: 17 }), + `monthCode '${monthCode}' is not well-formed`); +}); + +assert.throws(RangeError, () => Temporal.PlainDateTime.from({ year: 2021, month: 12, monthCode: "M11", day: 17 }), + "monthCode and month conflict"); + +["M00", "M19", "M99", "M13", "M00L", "M05L", "M13L"].forEach((monthCode) => { + assert.throws(RangeError, () => Temporal.PlainDateTime.from({ year: 2021, monthCode, day: 17 }), + `monthCode '${monthCode}' is not valid for ISO 8601 calendar`); +}); + +assert.throws( + RangeError, + () => Temporal.PlainDateTime.from({ day: 1, monthCode: "L99M", year: Symbol() }), + "Month code syntax is validated before year type is validated" +); + +assert.throws( + TypeError, + () => Temporal.PlainDateTime.from({ day: 1, monthCode: "M99L", year: Symbol() }), + "Month code suitability is validated after year type is validated" +); diff --git a/test/built-ins/Temporal/PlainMonthDay/from/monthcode-invalid.js b/test/built-ins/Temporal/PlainMonthDay/from/monthcode-invalid.js index 4957e52178..8685df78a2 100644 --- a/test/built-ins/Temporal/PlainMonthDay/from/monthcode-invalid.js +++ b/test/built-ins/Temporal/PlainMonthDay/from/monthcode-invalid.js @@ -15,7 +15,19 @@ features: [Temporal] assert.throws(RangeError, () => Temporal.PlainMonthDay.from({ year: 2021, month: 12, monthCode: "M11", day: 17 }), "monthCode and month conflict"); -["M00", "M19", "M99", "M13"].forEach((monthCode) => { +["M00", "M19", "M99", "M13", "M00L", "M05L", "M13L"].forEach((monthCode) => { assert.throws(RangeError, () => Temporal.PlainMonthDay.from({ monthCode, day: 17 }), `monthCode '${monthCode}' is not valid for ISO 8601 calendar`); }); + +assert.throws( + RangeError, + () => Temporal.PlainMonthDay.from({ day: 1, monthCode: "L99M", year: Symbol() }), + "Month code syntax is validated before year type is validated" +); + +assert.throws( + TypeError, + () => Temporal.PlainMonthDay.from({ day: 1, monthCode: "M99L", year: Symbol() }), + "Month code suitability is validated after year type is validated" +); diff --git a/test/built-ins/Temporal/PlainYearMonth/from/monthcode-invalid.js b/test/built-ins/Temporal/PlainYearMonth/from/monthcode-invalid.js index 84357f8890..b52a7f3d29 100644 --- a/test/built-ins/Temporal/PlainYearMonth/from/monthcode-invalid.js +++ b/test/built-ins/Temporal/PlainYearMonth/from/monthcode-invalid.js @@ -15,7 +15,19 @@ features: [Temporal] assert.throws(RangeError, () => Temporal.PlainYearMonth.from({ year: 2021, month: 12, monthCode: "M11" }), "monthCode and month conflict"); -["M00", "M19", "M99", "M13"].forEach((monthCode) => { +["M00", "M19", "M99", "M13", "M00L", "M05L", "M13L"].forEach((monthCode) => { assert.throws(RangeError, () => Temporal.PlainYearMonth.from({ year: 2021, monthCode }), - `monthCode '${monthCode}' is not valid for year 2021`); + `monthCode '${monthCode}' is not valid for year 2021 in ISO 8601 calendar`); }); + +assert.throws( + RangeError, + () => Temporal.PlainYearMonth.from({ monthCode: "L99M", year: Symbol() }), + "Month code syntax is validated before year type is validated" +); + +assert.throws( + TypeError, + () => Temporal.PlainYearMonth.from({ monthCode: "M99L", year: Symbol() }), + "Month code suitability is validated after year type is validated" +); diff --git a/test/built-ins/Temporal/ZonedDateTime/from/monthcode-invalid.js b/test/built-ins/Temporal/ZonedDateTime/from/monthcode-invalid.js new file mode 100644 index 0000000000..92e30d43ad --- /dev/null +++ b/test/built-ins/Temporal/ZonedDateTime/from/monthcode-invalid.js @@ -0,0 +1,33 @@ +// 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.zoneddatetime.from +description: Validation of monthCode +features: [Temporal] +---*/ + +["m1", "M1", "m01"].forEach((monthCode) => { + assert.throws(RangeError, () => Temporal.ZonedDateTime.from({ year: 2021, monthCode, day: 17, timeZone: "UTC" }), + `monthCode '${monthCode}' is not well-formed`); +}); + +assert.throws(RangeError, () => Temporal.ZonedDateTime.from({ year: 2021, month: 12, monthCode: "M11", day: 17, timeZone: "UTC" }), + "monthCode and month conflict"); + +["M00", "M19", "M99", "M13", "M00L", "M05L", "M13L"].forEach((monthCode) => { + assert.throws(RangeError, () => Temporal.ZonedDateTime.from({ year: 2021, monthCode, day: 17, timeZone: "UTC" }), + `monthCode '${monthCode}' is not valid for ISO 8601 calendar`); +}); + +assert.throws( + RangeError, + () => Temporal.ZonedDateTime.from({ day: 1, monthCode: "L99M", year: Symbol(), timeZone: "UTC" }), + "Month code syntax is validated before year type is validated" +); + +assert.throws( + TypeError, + () => Temporal.ZonedDateTime.from({ day: 1, monthCode: "M99L", year: Symbol(), timeZone: "UTC" }), + "Month code suitability is validated after year type is validated" +);