From 9abd522060e1cd0c15be60c9945f56f7dbb32641 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Wed, 26 Nov 2025 11:22:08 -0800 Subject: [PATCH] Temporal: Add tests for order of operations on property bag reads Add tests for order of operations on property bag reads for the following methods: * PlainDate.prototype.toPlainDateTime * PlainDateTime.prototype.withPlainTime * ZonedDateTime.prototype.getTimeZoneTransition --- .../toPlainDateTime/order-of-operations.js | 50 +++++++++++++++++++ .../withPlainTime/order-of-operations.js | 50 +++++++++++++++++++ .../order-of-operations.js | 39 +++++++++++++++ 3 files changed, 139 insertions(+) create mode 100644 test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/order-of-operations.js create mode 100644 test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/order-of-operations.js create mode 100644 test/built-ins/Temporal/ZonedDateTime/prototype/getTimeZoneTransition/order-of-operations.js diff --git a/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/order-of-operations.js b/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/order-of-operations.js new file mode 100644 index 0000000000..2f5ea50af2 --- /dev/null +++ b/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/order-of-operations.js @@ -0,0 +1,50 @@ +// Copyright (C) 2025 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindate.toplaindatetime +description: Properties on an object passed to toPlainDateTime() are accessed in the correct order +includes: [compareArray.js, temporalHelpers.js] +features: [Temporal] +---*/ + +const expected = [ + "get fields.hour", + "get fields.hour.valueOf", + "call fields.hour.valueOf", + "get fields.microsecond", + "get fields.microsecond.valueOf", + "call fields.microsecond.valueOf", + "get fields.millisecond", + "get fields.millisecond.valueOf", + "call fields.millisecond.valueOf", + "get fields.minute", + "get fields.minute.valueOf", + "call fields.minute.valueOf", + "get fields.nanosecond", + "get fields.nanosecond.valueOf", + "call fields.nanosecond.valueOf", + "get fields.second", + "get fields.second.valueOf", + "call fields.second.valueOf", +]; +const actual = []; + +const fields = TemporalHelpers.propertyBagObserver(actual, { + year: 1.7, + month: 1.7, + monthCode: "M01", + day: 1.7, + hour: 1, + microsecond: 2, + millisecond: 3, + minute: 4, + nanosecond: 5, + second: 6, + calendar: "iso8601", +}, "fields", ["calendar"]); + +const date = new Temporal.PlainDate(2025, 5, 2); + +date.toPlainDateTime(fields); +assert.compareArray(actual, expected, "order of operations"); diff --git a/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/order-of-operations.js b/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/order-of-operations.js new file mode 100644 index 0000000000..13c0ca3b28 --- /dev/null +++ b/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/order-of-operations.js @@ -0,0 +1,50 @@ +// Copyright (C) 2025 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.plaindatetime.withplaintime +description: Properties on an object passed to withPlainTime() are accessed in the correct order +includes: [compareArray.js, temporalHelpers.js] +features: [Temporal] +---*/ + +const expected = [ + "get fields.hour", + "get fields.hour.valueOf", + "call fields.hour.valueOf", + "get fields.microsecond", + "get fields.microsecond.valueOf", + "call fields.microsecond.valueOf", + "get fields.millisecond", + "get fields.millisecond.valueOf", + "call fields.millisecond.valueOf", + "get fields.minute", + "get fields.minute.valueOf", + "call fields.minute.valueOf", + "get fields.nanosecond", + "get fields.nanosecond.valueOf", + "call fields.nanosecond.valueOf", + "get fields.second", + "get fields.second.valueOf", + "call fields.second.valueOf", +]; +const actual = []; + +const fields = TemporalHelpers.propertyBagObserver(actual, { + year: 1.7, + month: 1.7, + monthCode: "M01", + day: 1.7, + hour: 1, + microsecond: 2, + millisecond: 3, + minute: 4, + nanosecond: 5, + second: 6, + calendar: "iso8601", +}, "fields", ["calendar"]); + +const pdt = new Temporal.PlainDateTime(2025, 5, 2, 0, 0, 0, 0, 0, 0); + +pdt.withPlainTime(fields); +assert.compareArray(actual, expected, "order of operations"); diff --git a/test/built-ins/Temporal/ZonedDateTime/prototype/getTimeZoneTransition/order-of-operations.js b/test/built-ins/Temporal/ZonedDateTime/prototype/getTimeZoneTransition/order-of-operations.js new file mode 100644 index 0000000000..f2d9ac7013 --- /dev/null +++ b/test/built-ins/Temporal/ZonedDateTime/prototype/getTimeZoneTransition/order-of-operations.js @@ -0,0 +1,39 @@ +// Copyright (C) 2025 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.zoneddatetime.gettimezonetransition +description: Properties on an object passed to getTimeZoneTransition() are accessed in the correct order +includes: [compareArray.js, temporalHelpers.js] +features: [Temporal] +---*/ + +const expected = [ + "get fields.direction", + "get fields.direction.toString", + "call fields.direction.toString" +]; +const actual = []; + +const fields = TemporalHelpers.propertyBagObserver(actual, { + year: 1.7, + month: 1.7, + monthCode: "M01", + day: 1.7, + hour: 1, + microsecond: 2, + millisecond: 3, + minute: 4, + nanosecond: 5, + second: 6, + overflow: "constrain", + largestUnit: "years", + smallestUnit: "months", + direction: "next", + calendar: "iso8601", +}, "fields", ["calendar"]); + +const zdt = new Temporal.ZonedDateTime(0n, "UTC"); + +zdt.getTimeZoneTransition(fields); +assert.compareArray(actual, expected, "order of operations");