From c35ae2099d507365c3227d8c7a6084d4399b1692 Mon Sep 17 00:00:00 2001 From: Ms2ger Date: Wed, 13 Apr 2022 18:31:57 +0200 Subject: [PATCH] Temporal: Some more tests for PlainDateTime#with. (#3481) --- .../prototype/with/argument-not-object.js | 22 +++++++++++++ .../prototype/with/calendar-options.js | 27 +++++++++++++++ .../with/calendar-temporal-object-throws.js | 33 +++++++++++++++++++ .../prototype/with/order-of-operations.js | 14 +++++++- 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 test/built-ins/Temporal/PlainDateTime/prototype/with/argument-not-object.js create mode 100644 test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-options.js create mode 100644 test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws.js diff --git a/test/built-ins/Temporal/PlainDateTime/prototype/with/argument-not-object.js b/test/built-ins/Temporal/PlainDateTime/prototype/with/argument-not-object.js new file mode 100644 index 00000000000..65c474da538 --- /dev/null +++ b/test/built-ins/Temporal/PlainDateTime/prototype/with/argument-not-object.js @@ -0,0 +1,22 @@ +// Copyright (C) 2022 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.prototype.with +description: Non-object arguments throw. +features: [Temporal] +---*/ + +const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); +const args = [ + undefined, + null, + true, + "2020-01-12T10:20:30", + Symbol(), + 2020, + 2020n, +]; +for (const argument of args) { + assert.throws(TypeError, () => instance.with(argument), `Does not support ${typeof argument}`); +} diff --git a/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-options.js b/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-options.js new file mode 100644 index 00000000000..935c1333d12 --- /dev/null +++ b/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-options.js @@ -0,0 +1,27 @@ +// Copyright (C) 2022 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.prototype.with +description: The options argument is passed through to Calendar#dateFromFields as-is. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const options = {}; +let calledDateFromFields = 0; +class Calendar extends Temporal.Calendar { + constructor() { + super("iso8601"); + } + dateFromFields(fields, optionsArg) { + ++calledDateFromFields; + assert.sameValue(optionsArg, options, "should pass options object through"); + return super.dateFromFields(fields, optionsArg); + } +}; +const calendar = new Calendar(); +const plaindatetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321, calendar); +const result = plaindatetime.with({ year: 2005 }, options); +TemporalHelpers.assertPlainDateTime(result, 2005, 5, "M05", 2, 12, 34, 56, 987, 654, 321); +assert.sameValue(calledDateFromFields, 1, "should have called overridden dateFromFields once"); diff --git a/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws.js b/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws.js new file mode 100644 index 00000000000..ae6887e31a1 --- /dev/null +++ b/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws.js @@ -0,0 +1,33 @@ +// Copyright (C) 2022 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +description: Throws if a Temporal object with a calendar is supplied +esid: sec-temporal.plaindatetime.prototype.with +features: [Temporal] +---*/ + +const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); + +const values = [ + Temporal.PlainDate.from("2022-04-12"), + Temporal.PlainDateTime.from("2022-04-12T15:19:45"), + Temporal.PlainMonthDay.from("04-12"), + Temporal.PlainTime.from("15:19:45"), + Temporal.PlainYearMonth.from("2022-04"), + Temporal.ZonedDateTime.from("2022-04-12T15:19:45[UTC]"), +]; + +for (const value of values) { + Object.defineProperty(value, "calendar", { + get() { throw new Test262Error("should not get calendar property") } + }); + Object.defineProperty(value, "timeZone", { + get() { throw new Test262Error("should not get timeZone property") } + }); + assert.throws( + TypeError, + () => datetime.with(value), + "throws with temporal object" + ); +} diff --git a/test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js b/test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js index be6e0797b83..ce2bc34b9c6 100644 --- a/test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js +++ b/test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js @@ -42,6 +42,12 @@ const expected = [ "get year", "get year.valueOf", "call year.valueOf", + "get options.overflow", + "get options.overflow.toString", + "call options.overflow.toString", + "get options.overflow", + "get options.overflow.toString", + "call options.overflow.toString", ]; const actual = []; const fields = { @@ -70,7 +76,13 @@ const argument = new Proxy(fields, { return key in target; }, }); -const result = instance.with(argument); +const options = { + get overflow() { + actual.push("get options.overflow"); + return TemporalHelpers.toPrimitiveObserver(actual, "constrain", "options.overflow"); + } +}; +const result = instance.with(argument, options); TemporalHelpers.assertPlainDateTime(result, 1, 1, "M01", 1, 1, 1, 1, 1, 1, 1); assert.sameValue(result.calendar.id, "iso8601", "calendar result"); assert.compareArray(actual, expected, "order of operations");