From aa5c2adb7cfb37da97d15c43a088df16cfc85631 Mon Sep 17 00:00:00 2001 From: Mike Pennisi Date: Fri, 10 Sep 2021 17:54:39 -0400 Subject: [PATCH] Improve coverage: zonedDateTime & zonedDateTimeISO --- .../Now/zonedDateTime/calendar-function.js | 47 ++++++++++++ .../calendar-object-fail-call-tostring.js | 20 +++++ .../calendar-object-fail-get-calendar.js | 17 +++++ .../calendar-object-fail-has-calendar.js | 20 +++++ ...alendar-object-fail-has-nested-calendar.js | 21 ++++++ .../Now/zonedDateTime/calendar-object.js | 73 ++++++++++++++++++ .../Temporal/Now/zonedDateTime/extensible.js | 12 +++ .../Temporal/Now/zonedDateTime/name.js | 20 +++++ .../Now/zonedDateTime/not-a-constructor.js | 14 ++++ .../Temporal/Now/zonedDateTime/prop-desc.js | 14 ++++ .../timezone-object-fail-call-tostring.js | 20 +++++ .../timezone-object-fail-get-timezone.js | 17 +++++ ...imezone-object-fail-has-nested-timezone.js | 21 ++++++ .../timezone-object-fail-has-timezone.js | 19 +++++ .../Now/zonedDateTime/timezone-object.js | 75 +++++++++++++++++++ .../Now/zonedDateTimeISO/extensible.js | 12 +++ .../Temporal/Now/zonedDateTimeISO/name.js | 20 +++++ .../Now/zonedDateTimeISO/not-a-constructor.js | 14 ++++ .../Now/zonedDateTimeISO/prop-desc.js | 14 ++++ .../timezone-object-fail-call-tostring.js | 20 +++++ .../timezone-object-fail-get-timezone.js | 17 +++++ ...imezone-object-fail-has-nested-timezone.js | 21 ++++++ .../timezone-object-fail-has-timezone.js | 19 +++++ .../Now/zonedDateTimeISO/timezone-object.js | 75 +++++++++++++++++++ 24 files changed, 622 insertions(+) create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/calendar-function.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-call-tostring.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-get-calendar.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-has-calendar.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-has-nested-calendar.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/calendar-object.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/extensible.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/name.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/not-a-constructor.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/prop-desc.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-call-tostring.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-get-timezone.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-has-nested-timezone.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-has-timezone.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTime/timezone-object.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTimeISO/extensible.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTimeISO/name.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTimeISO/not-a-constructor.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTimeISO/prop-desc.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-call-tostring.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-get-timezone.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-has-nested-timezone.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-has-timezone.js create mode 100644 test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object.js diff --git a/test/built-ins/Temporal/Now/zonedDateTime/calendar-function.js b/test/built-ins/Temporal/Now/zonedDateTime/calendar-function.js new file mode 100644 index 0000000000..e2092c9d94 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/calendar-function.js @@ -0,0 +1,47 @@ +// Copyright (C) 2020 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Behavior when provided calendar value is a function +includes: [compareArray.js] +features: [BigInt, Proxy, Temporal] +---*/ +const actual = []; + +const expected = [ + 'has timeZone.timeZone' +]; + +const calendar = function() {}; + +const timeZone = new Proxy({ + getOffsetNanosecondsFor(instant) { + actual.push('call timeZone.getOffsetNanosecondsFor'); + return -Number(instant.epochNanoseconds % 86400000000000n); + } +}, { + has(target, property) { + actual.push(`has timeZone.${property}`); + return property in target; + }, + + get(target, property) { + actual.push(`get timeZone.${property}`); + return target[property]; + } +}); + +Object.defineProperty(Temporal.Calendar, 'from', { + get() { + actual.push('get Temporal.Calendar.from'); + return undefined; + } +}); + +const result = Temporal.Now.zonedDateTime(calendar, timeZone); + +assert.compareArray(actual, expected, 'The value of actual is expected to equal the value of expected'); + +for (const property of ['hour', 'minute', 'second', 'millisecond', 'microsecond', 'nanosecond']) { + assert.sameValue(result[property], 0, 'The value of result[property] is expected to be 0'); +} diff --git a/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-call-tostring.js b/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-call-tostring.js new file mode 100644 index 0000000000..84551f311c --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-call-tostring.js @@ -0,0 +1,20 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Forwards error thrown by invoking "toString" property +features: [Temporal] +---*/ + +var calendar = { + calendar: { + calendar: true, + toString: function() { + throw new Test262Error(); + }, + } +}; + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTime(calendar); +}, 'Temporal.Now.zonedDateTime(calendar) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-get-calendar.js b/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-get-calendar.js new file mode 100644 index 0000000000..e85e358ccc --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-get-calendar.js @@ -0,0 +1,17 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Forwards error thrown by retrieving value of "calendar" property +features: [Temporal] +---*/ + +var calendar = { + get calendar() { + throw new Test262Error(); + }, +}; + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTime(calendar); +}, 'Temporal.Now.zonedDateTime(calendar) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-has-calendar.js b/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-has-calendar.js new file mode 100644 index 0000000000..f92915646a --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-has-calendar.js @@ -0,0 +1,20 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.now.zoneddatetime +description: Forwards error thrown by checking presence of "calendar" property +features: [Proxy, Temporal] +---*/ + +var calendar = new Proxy({}, { + has: function(target, property) { + if (property === 'calendar') { + throw new Test262Error(); + } + }, +}); + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTime(calendar); +}, 'Temporal.Now.zonedDateTime(calendar) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-has-nested-calendar.js b/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-has-nested-calendar.js new file mode 100644 index 0000000000..2a5ccfe092 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/calendar-object-fail-has-nested-calendar.js @@ -0,0 +1,21 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Forwards error thrown by checking presence of nested "calendar" property +features: [Proxy, Temporal] +---*/ + +var calendar = { + calendar: new Proxy({}, { + has: function(target, property) { + if (property === 'calendar') { + throw new Test262Error(); + } + }, + }) +}; + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTime(calendar); +}, 'Temporal.Now.zonedDateTime(calendar) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/calendar-object.js b/test/built-ins/Temporal/Now/zonedDateTime/calendar-object.js new file mode 100644 index 0000000000..f913a18022 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/calendar-object.js @@ -0,0 +1,73 @@ +// Copyright (C) 2020 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-temporal.now.zoneddatetime +description: Observable interactions with the provided calendar-like object +includes: [compareArray.js] +features: [Proxy, Temporal] +---*/ + +const actual = []; +const expectedWithout = [ + 'has calendar.calendar', + 'get calendar.calendar', + 'has nestedCalendar.calendar' +]; +const expectedWith = [ + 'has calendar.calendar', + 'get calendar.calendar', + 'has nestedCalendar.calendar', + 'get nestedCalendar.Symbol(Symbol.toPrimitive)', + 'get nestedCalendar.toString', + 'call nestedCalendar.toString' +]; +const nestedCalendar = new Proxy({ + toString: function() { + actual.push('call nestedCalendar.toString'); + return 'iso8601'; + } +}, { + has(target, property) { + actual.push(`has nestedCalendar.${String(property)}`); + return property in target; + }, + get(target, property) { + actual.push(`get nestedCalendar.${String(property)}`); + return target[property]; + }, +}); +const calendar = new Proxy({ + calendar: nestedCalendar, + toString: function() { + actual.push('call calendar.toString'); + return 'iso8601'; + }, +}, { + has(target, property) { + actual.push(`has calendar.${String(property)}`); + return property in target; + }, + get(target, property) { + actual.push(`get calendar.${String(property)}`); + return target[property]; + }, +}); + +Object.defineProperty(Temporal.Calendar, 'from', { + get() { + actual.push('get Temporal.Calendar.from'); + return undefined; + }, +}); + +Temporal.Now.zonedDateTime(calendar); + +assert.compareArray(actual, expectedWithout, 'Observable interactions without `calendar` property'); + +actual.length = 0; +nestedCalendar.calendar = null; + +Temporal.Now.zonedDateTime(calendar); + +assert.compareArray(actual, expectedWith, 'Observable interactions with `calendar` property'); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/extensible.js b/test/built-ins/Temporal/Now/zonedDateTime/extensible.js new file mode 100644 index 0000000000..a9008c9235 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/extensible.js @@ -0,0 +1,12 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Temporal.Now.zonedDateTime is extensible. +features: [Temporal] +---*/ + +assert( + Object.isExtensible(Temporal.Now.zonedDateTime), + 'Object.isExtensible(Temporal.Now.zonedDateTime) must return true' +); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/name.js b/test/built-ins/Temporal/Now/zonedDateTime/name.js new file mode 100644 index 0000000000..b538ef32e3 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/name.js @@ -0,0 +1,20 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Temporal.Now.zonedDateTime.name is "zonedDateTime". +includes: [propertyHelper.js] +features: [Temporal] +---*/ + +assert.sameValue( + Temporal.Now.zonedDateTime.name, + 'zonedDateTime', + 'The value of Temporal.Now.zonedDateTime.name is expected to be "zonedDateTime"' +); + +verifyProperty(Temporal.Now.zonedDateTime, 'name', { + enumerable: false, + writable: false, + configurable: true +}); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/not-a-constructor.js b/test/built-ins/Temporal/Now/zonedDateTime/not-a-constructor.js new file mode 100644 index 0000000000..3a329b5fec --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/not-a-constructor.js @@ -0,0 +1,14 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Temporal.Now.zonedDateTime does not implement [[Construct]] +includes: [isConstructor.js] +features: [Reflect.construct, Temporal, arrow-function] +---*/ + +assert.sameValue(isConstructor(Temporal.Now.zonedDateTime), false, 'isConstructor(Temporal.Now.zonedDateTime) must return false'); + +assert.throws(TypeError, () => { + new Temporal.Now.zonedDateTime(); +}, 'new Temporal.Now.zonedDateTime() throws a TypeError exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/prop-desc.js b/test/built-ins/Temporal/Now/zonedDateTime/prop-desc.js new file mode 100644 index 0000000000..0ea12835cd --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/prop-desc.js @@ -0,0 +1,14 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: The "zonedDateTime" property of Temporal.Now +includes: [propertyHelper.js] +features: [Temporal] +---*/ + +verifyProperty(Temporal.Now, 'zonedDateTime', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-call-tostring.js b/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-call-tostring.js new file mode 100644 index 0000000000..0f469eb4a5 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-call-tostring.js @@ -0,0 +1,20 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Forwards error thrown by invoking "toString" property +features: [Temporal] +---*/ + +var timeZone = { + timeZone: { + timeZone: true, + toString: function() { + throw new Test262Error(); + }, + } +}; + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTime("iso8601", timeZone); +}, 'Temporal.Now.zonedDateTime("iso8601", timeZone) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-get-timezone.js b/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-get-timezone.js new file mode 100644 index 0000000000..630536cefb --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-get-timezone.js @@ -0,0 +1,17 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Forwards error thrown by retrieving value of "timeZone" property +features: [Temporal] +---*/ + +var timeZone = { + get timeZone() { + throw new Test262Error(); + }, +}; + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTime("iso8601", timeZone); +}, 'Temporal.Now.zonedDateTime("iso8601", timeZone) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-has-nested-timezone.js b/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-has-nested-timezone.js new file mode 100644 index 0000000000..470ff62da0 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-has-nested-timezone.js @@ -0,0 +1,21 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Forwards error thrown by checking presence of nested "timeZone" property +features: [Proxy, Temporal] +---*/ + +var timeZone = { + timeZone: new Proxy({}, { + has: function(target, property) { + if (property === 'timeZone') { + throw new Test262Error(); + } + }, + }) +}; + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTime("iso8601", timeZone); +}, 'Temporal.Now.zonedDateTime("iso8601", timeZone) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-has-timezone.js b/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-has-timezone.js new file mode 100644 index 0000000000..7e1d997ca0 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/timezone-object-fail-has-timezone.js @@ -0,0 +1,19 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Forwards error thrown by checking presence of "timeZone" property +features: [Proxy, Temporal] +---*/ + +var timeZone = new Proxy({}, { + has: function(target, property) { + if (property === 'timeZone') { + throw new Test262Error(); + } + }, +}); + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTime("iso8601", timeZone); +}, 'Temporal.Now.zonedDateTime("iso8601", timeZone) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTime/timezone-object.js b/test/built-ins/Temporal/Now/zonedDateTime/timezone-object.js new file mode 100644 index 0000000000..15260a3852 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTime/timezone-object.js @@ -0,0 +1,75 @@ +// Copyright (C) 2020 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Observable interactions with the provided timezone-like object +includes: [compareArray.js] +features: [BigInt, Proxy, Temporal] +---*/ +const actual = []; + +const expected = [ + 'has timeZone.timeZone', + 'get timeZone.timeZone', + 'has nestedTimeZone.timeZone' +]; + +const nestedTimeZone = new Proxy({ + getOffsetNanosecondsFor(instant) { + actual.push('call nestedTimeZone.getOffsetNanosecondsFor'); + + assert.sameValue( + instant instanceof Temporal.Instant, + true, + 'The result of evaluating (instant instanceof Temporal.Instant) is expected to be true' + ); + + return -Number(instant.epochNanoseconds % 86400000000000n); + } +}, { + has(target, property) { + actual.push(`has nestedTimeZone.${String(property)}`); + return property in target; + }, + + get(target, property) { + actual.push(`get nestedTimeZone.${String(property)}`); + return target[property]; + } +}); + +const timeZone = new Proxy({ + timeZone: nestedTimeZone, + + getOffsetNanosecondsFor(instant) { + actual.push('call timeZone.getOffsetNanosecondsFor'); + + assert.sameValue( + instant instanceof Temporal.Instant, + true, + 'The result of evaluating (instant instanceof Temporal.Instant) is expected to be true' + ); + + return -Number(instant.epochNanoseconds % 86400000000000n); + } +}, { + has(target, property) { + actual.push(`has timeZone.${property}`); + return property in target; + }, + + get(target, property) { + actual.push(`get timeZone.${property}`); + return target[property]; + } +}); + +Object.defineProperty(Temporal.TimeZone, 'from', { + get() { + actual.push('get Temporal.TimeZone.from'); + return undefined; + } +}); + +Temporal.Now.zonedDateTime('iso8601', timeZone); +assert.compareArray(actual, expected, 'The value of actual is expected to equal the value of expected'); diff --git a/test/built-ins/Temporal/Now/zonedDateTimeISO/extensible.js b/test/built-ins/Temporal/Now/zonedDateTimeISO/extensible.js new file mode 100644 index 0000000000..d7a93f4459 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTimeISO/extensible.js @@ -0,0 +1,12 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetimeiso +description: Temporal.Now.zonedDateTimeISO is extensible. +features: [Temporal] +---*/ + +assert( + Object.isExtensible(Temporal.Now.zonedDateTimeISO), + 'Object.isExtensible(Temporal.Now.zonedDateTimeISO) must return true' +); diff --git a/test/built-ins/Temporal/Now/zonedDateTimeISO/name.js b/test/built-ins/Temporal/Now/zonedDateTimeISO/name.js new file mode 100644 index 0000000000..136330dc33 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTimeISO/name.js @@ -0,0 +1,20 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetimeiso +description: Temporal.Now.zonedDateTimeISO.name is "zonedDateTimeISO". +includes: [propertyHelper.js] +features: [Temporal] +---*/ + +assert.sameValue( + Temporal.Now.zonedDateTimeISO.name, + 'zonedDateTimeISO', + 'The value of Temporal.Now.zonedDateTimeISO.name is expected to be "zonedDateTimeISO"' +); + +verifyProperty(Temporal.Now.zonedDateTimeISO, 'name', { + enumerable: false, + writable: false, + configurable: true +}); diff --git a/test/built-ins/Temporal/Now/zonedDateTimeISO/not-a-constructor.js b/test/built-ins/Temporal/Now/zonedDateTimeISO/not-a-constructor.js new file mode 100644 index 0000000000..809c36559e --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTimeISO/not-a-constructor.js @@ -0,0 +1,14 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetimeiso +description: Temporal.Now.zonedDateTimeISO does not implement [[Construct]] +includes: [isConstructor.js] +features: [Reflect.construct, Temporal, arrow-function] +---*/ + +assert.sameValue(isConstructor(Temporal.Now.zonedDateTimeISO), false, 'isConstructor(Temporal.Now.zonedDateTimeISO) must return false'); + +assert.throws(TypeError, () => { + new Temporal.Now.zonedDateTimeISO(); +}, 'new Temporal.Now.zonedDateTimeISO() throws a TypeError exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTimeISO/prop-desc.js b/test/built-ins/Temporal/Now/zonedDateTimeISO/prop-desc.js new file mode 100644 index 0000000000..ecb2bcb0b0 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTimeISO/prop-desc.js @@ -0,0 +1,14 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetimeiso +description: The "zonedDateTimeISO" property of Temporal.Now +includes: [propertyHelper.js] +features: [Temporal] +---*/ + +verifyProperty(Temporal.Now, 'zonedDateTimeISO', { + enumerable: false, + writable: true, + configurable: true +}); diff --git a/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-call-tostring.js b/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-call-tostring.js new file mode 100644 index 0000000000..3fd409a786 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-call-tostring.js @@ -0,0 +1,20 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetimeiso +description: Forwards error thrown by invoking "toString" property +features: [Temporal] +---*/ + +var timeZone = { + timeZone: { + timeZone: true, + toString: function() { + throw new Test262Error(); + }, + } +}; + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTimeISO(timeZone); +}, 'Temporal.Now.zonedDateTimeISO(timeZone) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-get-timezone.js b/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-get-timezone.js new file mode 100644 index 0000000000..a060e85b74 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-get-timezone.js @@ -0,0 +1,17 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetimeiso +description: Forwards error thrown by retrieving value of "timeZone" property +features: [Temporal] +---*/ + +var timeZone = { + get timeZone() { + throw new Test262Error(); + }, +}; + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTimeISO(timeZone); +}, 'Temporal.Now.zonedDateTimeISO(timeZone) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-has-nested-timezone.js b/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-has-nested-timezone.js new file mode 100644 index 0000000000..70fac1c67a --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-has-nested-timezone.js @@ -0,0 +1,21 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetimeiso +description: Forwards error thrown by checking presence of nested "timeZone" property +features: [Proxy, Temporal] +---*/ + +var timeZone = { + timeZone: new Proxy({}, { + has: function(target, property) { + if (property === 'timeZone') { + throw new Test262Error(); + } + }, + }) +}; + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTimeISO(timeZone); +}, 'Temporal.Now.zonedDateTimeISO(timeZone) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-has-timezone.js b/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-has-timezone.js new file mode 100644 index 0000000000..19227d7333 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object-fail-has-timezone.js @@ -0,0 +1,19 @@ +// Copyright (C) 2021 the V8 project authors. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetimeiso +description: Forwards error thrown by checking presence of "timeZone" property +features: [Proxy, Temporal] +---*/ + +var timeZone = new Proxy({}, { + has: function(target, property) { + if (property === 'timeZone') { + throw new Test262Error(); + } + }, +}); + +assert.throws(Test262Error, function() { + Temporal.Now.zonedDateTimeISO(timeZone); +}, 'Temporal.Now.zonedDateTimeISO(timeZone) throws a Test262Error exception'); diff --git a/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object.js b/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object.js new file mode 100644 index 0000000000..2a10e4ab00 --- /dev/null +++ b/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-object.js @@ -0,0 +1,75 @@ +// Copyright (C) 2020 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.now.zoneddatetime +description: Observable interactions with the provided timezone-like object +includes: [compareArray.js] +features: [BigInt, Proxy, Temporal] +---*/ +const actual = []; + +const expected = [ + 'has timeZone.timeZone', + 'get timeZone.timeZone', + 'has nestedTimeZone.timeZone' +]; + +const nestedTimeZone = new Proxy({ + getOffsetNanosecondsFor(instant) { + actual.push('call nestedTimeZone.getOffsetNanosecondsFor'); + + assert.sameValue( + instant instanceof Temporal.Instant, + true, + 'The result of evaluating (instant instanceof Temporal.Instant) is expected to be true' + ); + + return -Number(instant.epochNanoseconds % 86400000000000n); + } +}, { + has(target, property) { + actual.push(`has nestedTimeZone.${String(property)}`); + return property in target; + }, + + get(target, property) { + actual.push(`get nestedTimeZone.${String(property)}`); + return target[property]; + } +}); + +const timeZone = new Proxy({ + timeZone: nestedTimeZone, + + getOffsetNanosecondsFor(instant) { + actual.push('call timeZone.getOffsetNanosecondsFor'); + + assert.sameValue( + instant instanceof Temporal.Instant, + true, + 'The result of evaluating (instant instanceof Temporal.Instant) is expected to be true' + ); + + return -Number(instant.epochNanoseconds % 86400000000000n); + } +}, { + has(target, property) { + actual.push(`has timeZone.${property}`); + return property in target; + }, + + get(target, property) { + actual.push(`get timeZone.${property}`); + return target[property]; + } +}); + +Object.defineProperty(Temporal.TimeZone, 'from', { + get() { + actual.push('get Temporal.TimeZone.from'); + return undefined; + } +}); + +Temporal.Now.zonedDateTimeISO(timeZone); +assert.compareArray(actual, expected, 'The value of actual is expected to equal the value of expected');