From b22766f84065e2e49e0ba45be7f81d25845625ce Mon Sep 17 00:00:00 2001 From: Yury Semikhatsky Date: Fri, 13 May 2022 14:18:05 -0700 Subject: [PATCH] browser(webkit): clear extra http headers on successive calls (#14152) --- browser_patches/webkit/BUILD_NUMBER | 4 +- browser_patches/webkit/UPSTREAM_CONFIG.sh | 2 +- browser_patches/webkit/patches/bootstrap.diff | 133508 ++++++++++++++- 3 files changed, 133299 insertions(+), 215 deletions(-) diff --git a/browser_patches/webkit/BUILD_NUMBER b/browser_patches/webkit/BUILD_NUMBER index e8406ad35e..fea6fd9ac4 100644 --- a/browser_patches/webkit/BUILD_NUMBER +++ b/browser_patches/webkit/BUILD_NUMBER @@ -1,2 +1,2 @@ -1642 -Changed: dpino@igalia.com Wed May 11 06:54:33 UTC 2022 +1643 +Changed: yurys@chromium.org Fri 13 May 2022 02:10:13 PM PDT diff --git a/browser_patches/webkit/UPSTREAM_CONFIG.sh b/browser_patches/webkit/UPSTREAM_CONFIG.sh index cdde742920..62e0debff6 100644 --- a/browser_patches/webkit/UPSTREAM_CONFIG.sh +++ b/browser_patches/webkit/UPSTREAM_CONFIG.sh @@ -1,3 +1,3 @@ REMOTE_URL="https://github.com/WebKit/WebKit.git" BASE_BRANCH="main" -BASE_REVISION="38f99b1251a27027b3eeea66ae7ae4a57b4144f2" +BASE_REVISION="c2469dd6baa0034fe1ad0159788267d17f0bc7c2" diff --git a/browser_patches/webkit/patches/bootstrap.diff b/browser_patches/webkit/patches/bootstrap.diff index b586406bc1..d007ff1725 100644 --- a/browser_patches/webkit/patches/bootstrap.diff +++ b/browser_patches/webkit/patches/bootstrap.diff @@ -1,3 +1,93647 @@ +diff --git a/ChangeLog b/ChangeLog +index 20ee6020b2ac29c5abbfd603c5513d4be5d0d9d1..80c50fd021d829fa21635be05f725ffb7d199570 100644 +--- a/ChangeLog ++++ b/ChangeLog +@@ -1,3 +1,69 @@ ++2022-05-09 Ryosuke Niwa ++ ++ Introduction.md: Explain active DOM objects ++ https://bugs.webkit.org/show_bug.cgi?id=240212 ++ ++ Reviewed by Chris Dumez. ++ ++ Added an elementary description of active DOM objects to Introduction.md. ++ ++ * Introduction.md: ++ ++2022-05-08 Ryosuke Niwa ++ ++ Introduction.md: Fix typos found by mcatanzaro ++ https://bugs.webkit.org/show_bug.cgi?id=240211 ++ ++ Reviewed by Tim Nguyen. ++ ++ Fixed typos. ++ ++ * Introduction.md: ++ ++2022-05-07 Ryosuke Niwa ++ ++ Explain now node reference counting works in Introduction.md ++ https://bugs.webkit.org/show_bug.cgi?id=240202 ++ ++ Unreviewed. Fix an obvious typo. ++ ++ * Introduction.md: ++ ++2022-05-07 Ryosuke Niwa ++ ++ Explain now node reference counting works in Introduction.md ++ https://bugs.webkit.org/show_bug.cgi?id=240202 ++ ++ Reviewed by Chris Dumez. ++ ++ Added explanation on how Node reference counting works. ++ ++ * Introduction.md: ++ ++2022-05-06 Kate Cheney ++ ++ Unreviewed, add github info to contributors.json. ++ ++ * metadata/contributors.json: ++ ++2022-05-05 Per Arne Vollan ++ ++ Add GitHub user name ++ https://bugs.webkit.org/show_bug.cgi?id=240144 ++ ++ Unreviewed, add github user name to contributors.json. ++ ++ * metadata/contributors.json: ++ ++2022-05-05 Megan Gardner ++ ++ Add github info for myself to contributors.json ++ https://bugs.webkit.org/show_bug.cgi?id=240140 ++ ++ Unreviewed metadata addition. ++ ++ * metadata/contributors.json: ++ + 2022-05-02 Yijia Huang + + Update yijia's info in constributors +diff --git a/Introduction.md b/Introduction.md +index 15d68061d02ee8e7ed1362df35c2548bf19ae9b9..ec54ee22cb6ac62fc62bbfa742f26811c48e6e61 100644 +--- a/Introduction.md ++++ b/Introduction.md +@@ -882,9 +882,9 @@ and it does not conform to a specific interface or behavior. + It could have been an arbitrary integer value but `void*` is used out of convenience since pointer values of live objects are unique. + + In the case of a `StyleSheet` object, `StyleSheet`'s JavaScript wrapper tells the garbage collector that it needs to be kept alive +-because an opaque root it cares about has been encountered whenever `onwerNode` is visited by the garbage collector. ++because an opaque root it cares about has been encountered whenever `ownerNode` is visited by the garbage collector. + +-In the most simplistic model, the opaque root for this case will be the `onwerNode` itself. ++In the most simplistic model, the opaque root for this case will be the `ownerNode` itself. + However, each `Node` object also has to keep its parent, siblings, and children alive. + To this end, each `Node` designates the [root](https://dom.spec.whatwg.org/#concept-tree-root) node as its opaque root. + Both `Node` and `StyleSheet` objects use this unique opaque root as a way of communicating with the gargage collector. +@@ -932,7 +932,7 @@ Generally, using opaque roots as a way of keeping JavaScript wrappers involve tw + 1. Add opaque roots in `visitAdditionalChildren`. + 2. Return true in `isReachableFromOpaqueRoots` when relevant opaque roots are found. + +-The first step can be achieved by using the aforementioend `JSCustomMarkFunction` with `visitAdditionalChildren`. ++The first step can be achieved by using the aforementioned `JSCustomMarkFunction` with `visitAdditionalChildren`. + Alternatively and more preferably, `GenerateAddOpaqueRoot` can be added to the IDL interface to auto-generate this code. + For example, [AbortController.idl](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/AbortController.idl) + makes use of this IDL attribute as follows: +@@ -950,7 +950,7 @@ makes use of this IDL attribute as follows: + }; + ``` + +-Here, `singal` is a public member function funtion of ++Here, `signal` is a public member function funtion of + the [underlying C++ object](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/AbortController.h): + + ```cpp +@@ -1004,7 +1004,166 @@ or any function called by GenerateIsReachable cannot have thread unsafe side eff + such as incrementing or decrementing the reference count of a `RefCounted` object + or creating a new `WeakPtr` from `CanMakeWeakPtr` since these WTF classes' mutation operations are not thread safe. + +-FIXME: Discuss Active DOM objects ++## Active DOM Objects ++ ++Visit children and opaque roots are great way to express lifecycle relationships between JS wrappers ++but there are cases in which a JS wrapper needs to be kept alive without any relation to other objects. ++Consider [`XMLHttpRequest`](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest). ++In the following example, JavaScript loses all references to the `XMLHttpRequest` object and its event listener ++but when a new response gets received, an event will be dispatched on the object, ++re-introducing a new JavaScript reference to the object. ++That is, the object survives garbage collection's ++[mark and sweep cycles](https://en.wikipedia.org/wiki/Tracing_garbage_collection#Basic_algorithm) ++without having any ties to other ["root" objects](https://en.wikipedia.org/wiki/Tracing_garbage_collection#Reachability_of_an_object). ++ ++```js ++function fetchURL(url, callback) ++{ ++ const request = new XMLHttpRequest(); ++ request.addEventListener("load", callback); ++ request.open("GET", url); ++ request.send(); ++} ++``` ++ ++In WebKit, we consider such an object to have a *pending activity*. ++Expressing the presence of such a pending activity is a primary use case of ++[`ActiveDOMObject`](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/ActiveDOMObject.h). ++ ++By making an object inherit from [`ActiveDOMObject`](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/ActiveDOMObject.h) ++and [annotating IDL as such](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/xml/XMLHttpRequest.idl#L42), ++WebKit will [automatically generate `isReachableFromOpaqueRoot` function](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm#L5029) ++which returns true whenever `ActiveDOMObject::hasPendingActivity` returns true ++even though the garbage collector may not have encountered any particular opaque root to speak of in this instance. ++ ++In the case of [`XMLHttpRequest`](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/xml/XMLHttpRequest.h), ++`hasPendingActivity` [will return true](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/xml/XMLHttpRequest.cpp#L1195) ++so long as there is still an active network activity associated with the object. ++Once the resource is fully fetched or failed, it ceases to have a pending activity. ++This way, JS wrapper of `XMLHttpRequest` is kept alive so long as there is an active network activity. ++ ++There is one other related use case of active DOM objects, ++and that's when a document enters the [back-forward cache](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/history/BackForwardCache.h) ++and when the entire [page](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/page/Page.h) has to pause ++for [other reasons](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/dom/ActiveDOMObject.h#L45). ++ ++When this happens, each active DOM object associated with the document ++[gets suspended](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/dom/ActiveDOMObject.h#L70). ++Each active DOM object can use this opportunity to prepare itself to pause whatever pending activity; ++for example, `XMLHttpRequest` [will stop dispatching `progress` event](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/xml/XMLHttpRequest.cpp#L1157) ++and media elements [will stop playback](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/html/HTMLMediaElement.cpp#L6008). ++When a document gets out of the back-forward cache or resumes for other reasons, ++each active DOM object [gets resumed](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/dom/ActiveDOMObject.h#L71). ++Here, each object has the opportunity to resurrect the previously pending activity once again. ++ ++### Creating a Pending Activity ++ ++There are a few ways to create a pending activity on an [active DOM objects](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/ActiveDOMObject.h). ++ ++When the relevant Web standards says to [queue a task](https://html.spec.whatwg.org/multipage/webappapis.html#queue-a-task) to do some work, ++one of the following member functions of [`ActiveDOMObject`](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/ActiveDOMObject.h) should be used: ++ * [`queueTaskKeepingObjectAlive`](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/dom/ActiveDOMObject.h#L106) ++ * [`queueCancellableTaskKeepingObjectAlive`](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/dom/ActiveDOMObject.h#L114) ++ * [`queueTaskToDispatchEvent`](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/dom/ActiveDOMObject.h#L124) ++ * [`queueCancellableTaskToDispatchEvent`](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/dom/ActiveDOMObject.h#L130) ++These functions will automatically create a pending activity until a newly enqueued task is executed. ++ ++Alternatively, [`makePendingActivity`](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/dom/ActiveDOMObject.h#L97) ++can be used to create a [pending activity token](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/ActiveDOMObject.h#L78) ++for an active DOM object. ++This will keep a pending activity on the active DOM object until all tokens are dead. ++ ++Finally, when there is a complex condition under which a pending activity exists, ++an active DOM object can override [`virtualHasPendingActivity`](https://github.com/WebKit/WebKit/blob/64cdede660d9eaea128fd151281f4715851c4fe2/Source/WebCore/dom/ActiveDOMObject.h#L147) ++member function and return true whilst such a condition holds. ++Note that `virtualHasPendingActivity` should return true so long as there is a possibility of dispatching an event or invoke JavaScript in any way in the future. ++In other words, a pending activity should exist while an object is doing some work in C++ well before any event dispatching is scheduled. ++Anytime there is no pending activity, JS wrappers of the object can get deleted by the garbage collector. ++ ++## Reference Counting of DOM Nodes ++ ++[`Node`](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/Node.h) is a reference counted object but with a twist. ++It has a [separate boolean flag](https://github.com/WebKit/WebKit/blob/297c01a143f649b34544f0cb7a555decf6ecbbfd/Source/WebCore/dom/Node.h#L832) ++indicating whether it has a [parent](https://dom.spec.whatwg.org/#concept-tree-parent) node or not. ++A `Node` object is [not deleted](https://github.com/WebKit/WebKit/blob/297c01a143f649b34544f0cb7a555decf6ecbbfd/Source/WebCore/dom/Node.h#L801) ++so long as it has a reference count above 0 or this boolean flag is set. ++The boolean flag effectively functions as a `RefPtr` from a parent `Node` ++to each one of its [child](https://dom.spec.whatwg.org/#concept-tree-child) `Node`. ++We do this because `Node` only knows its [first child](https://dom.spec.whatwg.org/#concept-tree-first-child) ++and its [last child](https://dom.spec.whatwg.org/#concept-tree-last-child) ++and each [sibling](https://dom.spec.whatwg.org/#concept-tree-sibling) nodes are implemented ++as a [doubly linked list](https://en.wikipedia.org/wiki/Doubly_linked_list) to allow ++efficient [insertion](https://dom.spec.whatwg.org/#concept-node-insert) ++and [removal](https://dom.spec.whatwg.org/#concept-node-remove) and traversal of sibling nodes. ++ ++Conceptually, each `Node` is kept alive by its root node and external references to it, ++and we use the root node as an opaque root of each `Node`'s JS wrapper. ++Therefore the JS wrapper of each `Node` is kept alive as long as either the node itself ++or any other node which shares the same root node is visited by the garbage collector. ++ ++On the other hand, a `Node` does not keep its parent or any of its ++[shadow-including ancestor](https://dom.spec.whatwg.org/#concept-shadow-including-ancestor) `Node` alive ++either by reference counting or via the boolean flag even though the JavaScript API requires this to be the case. ++In order to implement this DOM API behavior, ++WebKit [will create](https://github.com/WebKit/WebKit/blob/297c01a143f649b34544f0cb7a555decf6ecbbfd/Source/WebCore/bindings/js/JSNodeCustom.cpp#L174) ++a JS wrapper for each `Node` which is being removed from its parent if there isn't already one. ++A `Node` which is a root node (of the newly removed [subtree](https://dom.spec.whatwg.org/#concept-tree)) is an opaque root of its JS wrapper, ++and the garbage collector will visit this opaque root if there is any JS wrapper in the removed subtree that needs to be kept alive. ++In effect, this keeps the new root node and all its [descendant](https://dom.spec.whatwg.org/#concept-tree-descendant) nodes alive ++if the newly removed subtree contains any node with a live JS wrapper, preserving the API contract. ++ ++It's important to recognize that storing a `Ref` or a `RefPtr` to another `Node` in a `Node` subclass ++or an object directly owned by the Node can create a [reference cycle](https://en.wikipedia.org/wiki/Reference_counting#Dealing_with_reference_cycles), ++or a reference that never gets cleared. ++It's not guaranteed that every node is [disconnected](https://dom.spec.whatwg.org/#connected) ++from a [`Document`](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/Document.h) at some point in the future, ++and some `Node` may always have a parent node or a child node so long as it exists. ++Only permissible circumstances in which a `Ref` or a `RefPtr` to another `Node` can be stored ++in a `Node` subclass or other data structures owned by it is if it's temporally limited. ++For example, it's okay to store a `Ref` or a `RefPtr` in ++an enqueued [event loop task](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/EventLoop.h#L69). ++In all other circumstances, `WeakPtr` should be used to reference another `Node`, ++and JS wrapper relationships such as opaque roots should be used to preserve the lifecycle ties between `Node` objects. ++ ++It's equally crucial to observe that keeping C++ Node object alive by storing `Ref` or `RefPtr` ++in an enqueued [event loop task](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/EventLoop.h#L69) ++does not keep its JS wrapper alive, and can result in the JS wrapper of a conceptually live object to be erroneously garbage collected. ++To avoid this problem, use [`GCReachableRef`](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/GCReachableRef.h) instead ++to temporarily hold a strong reference to a node over a period of time. ++For example, [`HTMLTextFormControlElement::scheduleSelectEvent()`](https://github.com/WebKit/WebKit/blob/297c01a143f649b34544f0cb7a555decf6ecbbfd/Source/WebCore/html/HTMLTextFormControlElement.cpp#L547) ++uses `GCReachableRef` to fire an event in an event loop task: ++```cpp ++void HTMLTextFormControlElement::scheduleSelectEvent() ++{ ++ document().eventLoop().queueTask(TaskSource::UserInteraction, [protectedThis = GCReachableRef { *this }] { ++ protectedThis->dispatchEvent(Event::create(eventNames().selectEvent, Event::CanBubble::Yes, Event::IsCancelable::No)); ++ }); ++} ++``` ++ ++Alternatively, we can make it inherit from an [active DOM object](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/ActiveDOMObject.h), ++and use one of the following functions to enqueue a task or an event: ++ - [`queueTaskKeepingObjectAlive`](https://github.com/WebKit/WebKit/blob/297c01a143f649b34544f0cb7a555decf6ecbbfd/Source/WebCore/dom/ActiveDOMObject.h#L107) ++ - [`queueCancellableTaskKeepingObjectAlive`](https://github.com/WebKit/WebKit/blob/297c01a143f649b34544f0cb7a555decf6ecbbfd/Source/WebCore/dom/ActiveDOMObject.h#L115) ++ - [`queueTaskToDispatchEvent`](https://github.com/WebKit/WebKit/blob/297c01a143f649b34544f0cb7a555decf6ecbbfd/Source/WebCore/dom/ActiveDOMObject.h#L124) ++ - [`queueCancellableTaskToDispatchEvent`](https://github.com/WebKit/WebKit/blob/297c01a143f649b34544f0cb7a555decf6ecbbfd/Source/WebCore/dom/ActiveDOMObject.h#L130) ++ ++[`Document`](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/Document.h) node has one more special quirk ++because every [`Node`](https://github.com/WebKit/WebKit/blob/main/Source/WebCore/dom/Node.h) can have access to a document ++via [`ownerDocument` property](https://developer.mozilla.org/en-US/docs/Web/API/Node/ownerDocument) ++whether Node is [connected](https://dom.spec.whatwg.org/#connected) to the document or not. ++Every document has a regular reference count used by external clients and ++[referencing node count](https://github.com/WebKit/WebKit/blob/297c01a143f649b34544f0cb7a555decf6ecbbfd/Source/WebCore/dom/Document.h#L2093). ++The referencing node count of a document is the total number of nodes whose `ownerDocument` is the document. ++A document is [kept alive](https://github.com/WebKit/WebKit/blob/297c01a143f649b34544f0cb7a555decf6ecbbfd/Source/WebCore/dom/Document.cpp#L749) ++so long as its reference count and node referencing count is above 0. ++In addition, when the regular reference count is to become 0, ++it clears various states including its internal references to owning Nodes to sever any reference cycles with them. ++A document is special in that sense that it can store `RefPtr` to other nodes. ++Note that whilst the referencing node count acts like `Ref` from each `Node` to its owner `Document`, ++storing a `Ref` or a `RefPtr` to the same document or any other document will create ++a [reference cycle](https://en.wikipedia.org/wiki/Reference_counting#Dealing_with_reference_cycles) ++and should be avoided unless it's temporally limited as noted above. + + ## Inserting or Removing DOM Nodes + +diff --git a/JSTests/ChangeLog b/JSTests/ChangeLog +index 247fb7cc35cccf497b5e9ad3e9d2b83728fcc93e..cf34242d1f538b6ddece945057ec3ac9aaf14d51 100644 +--- a/JSTests/ChangeLog ++++ b/JSTests/ChangeLog +@@ -1,3 +1,2300 @@ ++2022-05-09 Yusuke Suzuki ++ ++ Upstream TypedArray.prototype.fill speedup from bun ++ https://bugs.webkit.org/show_bug.cgi?id=239891 ++ ++ Reviewed by Saam Barati. ++ ++ * microbenchmarks/typed-array-fill.js: Added. ++ * stress/typed-array-fill-complicated.js: Added. ++ (shouldBe): ++ (throw.new.Error): ++ ++2022-05-09 Ross Kirsling ++ ++ Temporal round and total methods should accept string param ++ https://bugs.webkit.org/show_bug.cgi?id=240249 ++ ++ Reviewed by Yusuke Suzuki. ++ ++ * stress/temporal-duration.js: ++ * stress/temporal-instant.js: ++ * stress/temporal-plaintime.js: ++ Add test cases. ++ ++ * test262/expectations.yaml: ++ Mark 24 test cases passing. ++ (This number should be 26, but two still fail as the harness expects PlainDateTime and ZonedDateTime to exist.) ++ ++2022-05-09 Ross Kirsling ++ ++ Temporal and Date must reject expanded year -000000 ++ https://bugs.webkit.org/show_bug.cgi?id=240263 ++ ++ Reviewed by Yusuke Suzuki. ++ ++ * test262/expectations.yaml: ++ Mark 24 test cases as passing. ++ ++2022-05-09 Keith Miller ++ ++ Unreviewed test gardening. ++ ++ * test262/expectations.yaml: ++ ++2022-05-06 Ross Kirsling ++ ++ Temporal.Duration#toString should never ignore fractionalSecondDigits ++ https://bugs.webkit.org/show_bug.cgi?id=240193 ++ ++ Reviewed by Yusuke Suzuki. ++ ++ * stress/temporal-duration.js: Add a test case. ++ * test262/expectations.yaml: Mark two test cases as passing. ++ ++2022-05-06 Ross Kirsling ++ ++ ISO8601::Duration should guard against -0 ++ https://bugs.webkit.org/show_bug.cgi?id=240185 ++ ++ Reviewed by Yusuke Suzuki. ++ ++ * test262/expectations.yaml: ++ Mark 32 test cases as passing. ++ ++2022-05-05 Keith Miller ++ ++ Rebaseline icu tests to public sdk's icu ++ https://bugs.webkit.org/show_bug.cgi?id=240142 ++ ++ Reviewed by Yusuke Suzuki. ++ ++ * test262/expectations.yaml: ++ ++2022-05-04 Yusuke Suzuki ++ ++ [JSC] Intl.NumberFormat lacks some validation for rounding-increment ++ https://bugs.webkit.org/show_bug.cgi?id=240102 ++ ++ Reviewed by Ross Kirsling. ++ ++ * test262/expectations.yaml: ++ ++2022-05-04 Ross Kirsling ++ ++ Temporal.Duration constructor should throw on non-integers ++ https://bugs.webkit.org/show_bug.cgi?id=240094 ++ ++ Reviewed by Yusuke Suzuki. ++ ++ * test262/expectations.yaml: ++ Mark two test cases as passing. ++ ++2022-05-04 Yusuke Suzuki ++ ++ [JSC] Temporal.Instant since/until should not accept year / month / day / week units ++ https://bugs.webkit.org/show_bug.cgi?id=240097 ++ ++ Reviewed by Ross Kirsling. ++ ++ * stress/temporal-instant-since-and-until-with-year-month-week-day.js: Added. ++ (shouldThrow): ++ (let.smallestUnit.of.units.shouldThrow): ++ (let.largestUnit.of.units.shouldThrow): ++ ++2022-05-04 Keith Miller ++ ++ May 2022 test262 update ++ https://bugs.webkit.org/show_bug.cgi?id=240076 ++ ++ Reviewed by Yusuke Suzuki. ++ ++ * test262/harness/propertyHelper.js: ++ * test262/harness/regExpUtils.js: ++ (testPropertyEscapes): ++ * test262/harness/temporalHelpers.js: ++ (TemporalHelpers.assertPlainYearMonth): ++ (TemporalHelpers.calendarFromFieldsUndefinedOptions.CalendarFromFieldsUndefinedOptions): ++ (TemporalHelpers.calendarFromFieldsUndefinedOptions.CalendarFromFieldsUndefinedOptions.prototype.toString): ++ (TemporalHelpers.calendarFromFieldsUndefinedOptions.CalendarFromFieldsUndefinedOptions.prototype.dateFromFields): ++ (TemporalHelpers.calendarFromFieldsUndefinedOptions.CalendarFromFieldsUndefinedOptions.prototype.yearMonthFromFields): ++ (TemporalHelpers.calendarFromFieldsUndefinedOptions.CalendarFromFieldsUndefinedOptions.prototype.monthDayFromFields): ++ (TemporalHelpers.OneShiftTimeZone.prototype.getPossibleInstantsFor): ++ (TemporalHelpers.checkFractionalSecondDigitsOptionWrongType): Deleted. ++ * test262/latest-changes-summary.txt: ++ * test262/test/built-ins/Array/prototype/Symbol.unscopables/array-find-from-last.js: Added. ++ * test262/test/built-ins/Array/prototype/Symbol.unscopables/array-grouping.js: Added. ++ * test262/test/built-ins/Array/prototype/Symbol.unscopables/value.js: ++ * test262/test/built-ins/Array/prototype/concat/create-species-non-ctor.js: ++ * test262/test/built-ins/Array/prototype/filter/create-species-non-ctor.js: ++ * test262/test/built-ins/Array/prototype/map/create-species-non-ctor.js: ++ * test262/test/built-ins/Array/prototype/slice/create-species-non-ctor.js: ++ * test262/test/built-ins/Array/prototype/splice/create-species-non-ctor.js: ++ * test262/test/built-ins/Date/parse/year-zero.js: Added. ++ * test262/test/built-ins/Date/year-zero.js: Added. ++ * test262/test/built-ins/Error/constructor.js: ++ * test262/test/built-ins/Function/prototype/bind/instance-length-tointeger.js: ++ * test262/test/built-ins/Number/S15.7.1.1_A1.js: ++ * test262/test/built-ins/RegExp/prototype/toString/S15.10.6.4_A6.js: ++ * test262/test/built-ins/RegExp/prototype/toString/S15.10.6.4_A7.js: ++ * test262/test/built-ins/ShadowRealm/WrappedFunction/throws-typeerror-on-revoked-proxy.js: Added. ++ (const.fn.r.evaluate.globalThis.revocable.Proxy.revocable): ++ * test262/test/built-ins/ShadowRealm/prototype/evaluate/globalthis-ordinary-object.js: Added. ++ (catch): ++ * test262/test/built-ins/ShadowRealm/prototype/evaluate/globalthis-orginary-object.js: Removed. ++ * test262/test/built-ins/ShadowRealm/prototype/evaluate/throws-typeerror-wrap-throwing.js: Added. ++ (r.evaluate.const.revocable.Proxy.revocable): ++ (r.evaluate.const.fn): ++ * test262/test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js: ++ (i.pair.0.localeCompare): ++ (string_appeared_here.localeCompare): Deleted. ++ (else.i.pair.0.localeCompare): Deleted. ++ * test262/test/built-ins/Temporal/Calendar/from/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/from/calendar-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/from/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Calendar.from): ++ (description.of.typeErrorTests.Temporal.Calendar.from): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.Duration): ++ (description.of.typeErrorTests.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-with-utc-designator.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.Duration): ++ (description.of.typeErrorTests.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainDate): ++ (description.of.rangeErrorTests.instance.dateUntil.new.Temporal.PlainDate): ++ (description.of.typeErrorTests.new.Temporal.PlainDate): ++ (description.of.typeErrorTests.instance.dateUntil.new.Temporal.PlainDate): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainDate): ++ (description.of.rangeErrorTests.instance.dateUntil.new.Temporal.PlainDate): ++ (description.of.typeErrorTests.new.Temporal.PlainDate): ++ (description.of.typeErrorTests.instance.dateUntil.new.Temporal.PlainDate): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/day/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.day): ++ (description.of.typeErrorTests.instance.day): ++ * test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/day/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/day/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.day): ++ (description.of.typeErrorTests.instance.day): ++ * test262/test/built-ins/Temporal/Calendar/prototype/day/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/day/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/day/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.dayOfWeek): ++ (description.of.typeErrorTests.instance.dayOfWeek): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.dayOfWeek): ++ (description.of.typeErrorTests.instance.dayOfWeek): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.dayOfYear): ++ (description.of.typeErrorTests.instance.dayOfYear): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.dayOfYear): ++ (description.of.typeErrorTests.instance.dayOfYear): ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.daysInMonth): ++ (description.of.typeErrorTests.instance.daysInMonth): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.daysInMonth): ++ (description.of.typeErrorTests.instance.daysInMonth): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.daysInWeek): ++ (description.of.typeErrorTests.instance.daysInWeek): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.daysInWeek): ++ (description.of.typeErrorTests.instance.daysInWeek): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.daysInYear): ++ (description.of.typeErrorTests.instance.daysInYear): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.daysInYear): ++ (description.of.typeErrorTests.instance.daysInYear): ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.inLeapYear): ++ (description.of.typeErrorTests.instance.inLeapYear): ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.inLeapYear): ++ (description.of.typeErrorTests.instance.inLeapYear): ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/basic.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/basic.js: Added. ++ (assert.deepEqual.cal.mergeFields): ++ * test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/iso8601-calendar-month-monthCode.js: Added. ++ (assert.deepEqual.cal.mergeFields): ++ * test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/non-string-properties.js: Added. ++ (assert.deepEqual.cal.mergeFields): ++ * test262/test/built-ins/Temporal/Calendar/prototype/month/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.month): ++ (description.of.typeErrorTests.instance.month): ++ * test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/month/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/month/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.month): ++ (description.of.typeErrorTests.instance.month): ++ * test262/test/built-ins/Temporal/Calendar/prototype/month/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/month/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/month/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.monthCode): ++ (description.of.typeErrorTests.instance.monthCode): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.monthCode): ++ (description.of.typeErrorTests.instance.monthCode): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthCode/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthCode/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthCode/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/basic.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-missing-properties.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-not-object.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/monthcode-invalid.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-constrain.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-reject.js: Added. ++ (9995.forEach): ++ (999.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/reference-year-1972.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.monthsInYear): ++ (description.of.typeErrorTests.instance.monthsInYear): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.monthsInYear): ++ (description.of.typeErrorTests.instance.monthsInYear): ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/basic.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindate.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindatetime.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.weekOfYear): ++ (description.of.typeErrorTests.instance.weekOfYear): ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.weekOfYear): ++ (description.of.typeErrorTests.instance.weekOfYear): ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/year/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.year): ++ (description.of.typeErrorTests.instance.year): ++ * test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/year/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/year/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.year): ++ (description.of.typeErrorTests.instance.year): ++ * test262/test/built-ins/Temporal/Calendar/prototype/year/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/year/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/year/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/basic.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-missing-properties.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-not-object.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/monthcode-invalid.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-not-object.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-constrain.js: Added. ++ * test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-reject.js: Added. ++ (9995.forEach): ++ * test262/test/built-ins/Temporal/Duration/basic.js: Added. ++ * test262/test/built-ins/Temporal/Duration/call-builtin.js: Added. ++ (Number.isFinite): ++ (Math.sign): ++ * test262/test/built-ins/Temporal/Duration/compare/argument-cast.js: Added. ++ (assert.sameValue.Temporal.Duration.compare.new.Temporal.Duration): ++ (Temporal.Duration.compare.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/compare/basic.js: Added. ++ * test262/test/built-ins/Temporal/Duration/compare/calendar-dateadd-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Duration/compare/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Duration/compare/relativeto-hour.js: Added. ++ * test262/test/built-ins/Temporal/Duration/compare/relativeto-month.js: Added. ++ * test262/test/built-ins/Temporal/Duration/compare/relativeto-propertybag-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Duration/compare/relativeto-year.js: Added. ++ * test262/test/built-ins/Temporal/Duration/compare/timezone-string-leap-second.js: Added. ++ (new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/compare/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Duration/compare/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.Duration): ++ (description.of.typeErrorTests.new.Temporal.Duration): ++ (new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/compare/twenty-five-hour-day.js: Added. ++ * test262/test/built-ins/Temporal/Duration/days-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/from/argument-duration.js: Added. ++ * test262/test/built-ins/Temporal/Duration/from/argument-existing-object.js: ++ * test262/test/built-ins/Temporal/Duration/from/argument-object-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Duration/from/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Duration/from/argument-string.js: Added. ++ * test262/test/built-ins/Temporal/Duration/hours-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/microseconds-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/milliseconds-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/minutes-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/mixed.js: Added. ++ * test262/test/built-ins/Temporal/Duration/months-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/nanoseconds-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/abs/basic.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/abs/new-object.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/add/argument-object-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/add/argument-string.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/add/basic.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/add/options-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/add/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-leap-second.js: Added. ++ (const.result1.instance.add.new.Temporal.Duration): ++ (const.result2.instance.add.new.Temporal.Duration): ++ (const.result3.instance.add.new.Temporal.Duration): ++ (const.result4.instance.add.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-month.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-number.js: Added. ++ (const.result.instance.add.new.Temporal.Duration): ++ (const.relativeTo.of.numbers.instance.add.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-order.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-number.js: Added. ++ (const.result1.instance.add.new.Temporal.Duration): ++ (const.result2.instance.add.new.Temporal.Duration): ++ (const.calendar.of.numbers.instance.add.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.add.new.Temporal.Duration): ++ (description.of.typeErrorTests.instance.add.new.Temporal.Duration): ++ (instance.add.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-required.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.add.new.Temporal.Duration): ++ (description.of.typeErrorTests.instance.add.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-year.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/add/timezone-string-leap-second.js: Added. ++ (instance.add.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/add/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Duration/prototype/add/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.add.new.Temporal.Duration): ++ (description.of.typeErrorTests.instance.add.new.Temporal.Duration): ++ (instance.add.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/blank/basic.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/negated/basic.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/round/calendar-dateadd-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-default.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-mismatch.js: Added. ++ (largestIdx.smallestIdx.d.round): ++ * test262/test/built-ins/Temporal/Duration/prototype/round/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-number.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.round): ++ (description.of.typeErrorTests.instance.round): ++ * test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.round): ++ (description.of.typeErrorTests.instance.round): ++ * test262/test/built-ins/Temporal/Duration/prototype/round/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/round/roundto-invalid-string.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit-disallowed-units-string.js: Removed. ++ * test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit.js: Added. ++ (expected.of.Object.entries): ++ * test262/test/built-ins/Temporal/Duration/prototype/round/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/round/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Duration/prototype/round/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.round): ++ (description.of.typeErrorTests.instance.round): ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-object-invalid.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-string.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/basic.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/options-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-leap-second.js: Added. ++ (const.result1.instance.subtract.new.Temporal.Duration): ++ (const.result2.instance.subtract.new.Temporal.Duration): ++ (const.result3.instance.subtract.new.Temporal.Duration): ++ (const.result4.instance.subtract.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-month.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-number.js: Added. ++ (const.result.instance.subtract.new.Temporal.Duration): ++ (const.relativeTo.of.numbers.instance.subtract.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-order.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-number.js: Added. ++ (const.result1.instance.subtract.new.Temporal.Duration): ++ (const.result2.instance.subtract.new.Temporal.Duration): ++ (const.calendar.of.numbers.instance.subtract.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.subtract.new.Temporal.Duration): ++ (description.of.typeErrorTests.instance.subtract.new.Temporal.Duration): ++ (instance.subtract.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-required.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.subtract.new.Temporal.Duration): ++ (description.of.typeErrorTests.instance.subtract.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-year.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-leap-second.js: Added. ++ (instance.subtract.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.subtract.new.Temporal.Duration): ++ (description.of.typeErrorTests.instance.subtract.new.Temporal.Duration): ++ (instance.subtract.new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/Duration/prototype/toJSON/basic.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/toJSON/options.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/balance.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-auto.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-invalid-string.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-number.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-out-of-range.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-undefined.js: ++ (expected.of.tests.const.lambda.duration.toString): ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-wrong-type.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/negative-components.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-ceil.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-floor.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-halfExpand.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-trunc.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-fractionalseconddigits.js: Added. ++ (expected.of.tests.const.string.duration.toString.get fractionalSecondDigits): ++ (duration.toString.get fractionalSecondDigits): ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-valid-units.js: ++ (test): ++ (notValid.forEach): ++ * test262/test/built-ins/Temporal/Duration/prototype/total/calendar-dateadd-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/total/options-wrong-type.js: ++ (values.forEach): Deleted. ++ * test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-number.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.total): ++ (description.of.typeErrorTests.instance.total): ++ * test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.total): ++ (description.of.typeErrorTests.instance.total): ++ * test262/test/built-ins/Temporal/Duration/prototype/total/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/total/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Duration/prototype/total/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.total): ++ (description.of.typeErrorTests.instance.total): ++ * test262/test/built-ins/Temporal/Duration/prototype/valueOf/basic.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/with/all-negative.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/with/all-positive.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/with/argument-invalid-prop.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/with/argument-mixed-sign.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/with/argument-object-wrong-shape.js: Added. ++ (let.d.new.Temporal.Duration): ++ (forEach): ++ * test262/test/built-ins/Temporal/Duration/prototype/with/argument-sign-prop.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/with/argument-wrong-type.js: Added. ++ (forEach): ++ * test262/test/built-ins/Temporal/Duration/prototype/with/branding.js: ++ * test262/test/built-ins/Temporal/Duration/prototype/with/partial-positive.js: Added. ++ * test262/test/built-ins/Temporal/Duration/prototype/with/sign-conflict-throws-rangeerror.js: Added. ++ (fields.forEach): ++ * test262/test/built-ins/Temporal/Duration/prototype/with/sign-replace.js: Added. ++ * test262/test/built-ins/Temporal/Duration/seconds-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/weeks-undefined.js: ++ * test262/test/built-ins/Temporal/Duration/years-undefined.js: ++ * test262/test/built-ins/Temporal/Instant/compare/argument-object-tostring.js: Added. ++ (arg.toString): ++ * test262/test/built-ins/Temporal/Instant/compare/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Instant.compare): ++ (description.of.typeErrorTests.Temporal.Instant.compare): ++ * test262/test/built-ins/Temporal/Instant/compare/instant-string-sub-minute-offset.js: Added. ++ * test262/test/built-ins/Temporal/Instant/compare/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Instant/compare/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Instant/from/argument-instant.js: Added. ++ * test262/test/built-ins/Temporal/Instant/from/argument-object-tostring.js: Added. ++ (arg.toString): ++ * test262/test/built-ins/Temporal/Instant/from/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Instant.from): ++ (description.of.typeErrorTests.Temporal.Instant.from): ++ * test262/test/built-ins/Temporal/Instant/from/basic.js: Added. ++ * test262/test/built-ins/Temporal/Instant/from/instant-string-sub-minute-offset.js: Added. ++ * test262/test/built-ins/Temporal/Instant/from/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Instant/from/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Instant/prototype/add/basic.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/add/branding.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/add/disallowed-duration-units.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/add/result-out-of-range.js: ++ (fields.forEach): ++ * test262/test/built-ins/Temporal/Instant/prototype/equals/argument-object-tostring.js: Added. ++ (arg.toString): ++ * test262/test/built-ins/Temporal/Instant/prototype/equals/argument-wrong-type.js: ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/Instant/prototype/equals/instant-string-sub-minute-offset.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/equals/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/equals/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Instant/prototype/round/options-wrong-type.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/round/rounding-direction.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/round/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/round/roundto-invalid-string.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/round/smallestunit-disallowed-units.js: Removed. ++ * test262/test/built-ins/Temporal/Instant/prototype/round/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/since/argument-object-tostring.js: Added. ++ (arg.toString): ++ * test262/test/built-ins/Temporal/Instant/prototype/since/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/Instant/prototype/since/instant-string-sub-minute-offset.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/since/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/since/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/since/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/since/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/since/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/since/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Instant/prototype/subtract/basic.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/subtract/branding.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/subtract/disallowed-duration-units.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js: ++ (fields.forEach): ++ * test262/test/built-ins/Temporal/Instant/prototype/toJSON/year-format.js: Added. ++ (epochNsInYear): ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-non-integer.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-out-of-range.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js: ++ (expected.of.tests.const.lambda.instant.toString): ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-wrong-type.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/rounding-cross-midnight.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/rounding-direction.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-ceil.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-floor.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-halfExpand.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-trunc.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-fractionalseconddigits.js: Added. ++ (expected.of.tests.const.string.instant.toString.get fractionalSecondDigits): ++ (instant.toString.get fractionalSecondDigits): ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-valid-units.js: ++ (test): ++ (notValid.forEach): ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toString): ++ (description.of.typeErrorTests.instance.toString): ++ * test262/test/built-ins/Temporal/Instant/prototype/toString/year-format.js: Added. ++ (epochNsInYear): ++ * test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toZonedDateTime): ++ (description.of.typeErrorTests.instance.toZonedDateTime): ++ * test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toZonedDateTime): ++ (description.of.typeErrorTests.instance.toZonedDateTime): ++ * test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toZonedDateTimeISO): ++ (description.of.typeErrorTests.instance.toZonedDateTimeISO): ++ * test262/test/built-ins/Temporal/Instant/prototype/until/argument-object-tostring.js: Added. ++ (arg.toString): ++ * test262/test/built-ins/Temporal/Instant/prototype/until/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/Instant/prototype/until/instant-string-sub-minute-offset.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/until/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/until/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/until/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/Instant/prototype/until/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/until/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/Instant/prototype/until/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Now/plainDate/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Now/plainDate/calendar-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Now/plainDate/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Now.plainDate): ++ (description.of.typeErrorTests.Temporal.Now.plainDate): ++ * test262/test/built-ins/Temporal/Now/plainDate/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Now/plainDate/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Now/plainDate/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Now.plainDate): ++ (description.of.typeErrorTests.Temporal.Now.plainDate): ++ * test262/test/built-ins/Temporal/Now/plainDateISO/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Now/plainDateISO/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Now/plainDateISO/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Now.plainDateISO): ++ (description.of.typeErrorTests.Temporal.Now.plainDateISO): ++ * test262/test/built-ins/Temporal/Now/plainDateTime/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Now/plainDateTime/calendar-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Now/plainDateTime/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Now.plainDateTime): ++ (description.of.typeErrorTests.Temporal.Now.plainDateTime): ++ * test262/test/built-ins/Temporal/Now/plainDateTime/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Now/plainDateTime/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Now/plainDateTime/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Now.plainDateTime): ++ (description.of.typeErrorTests.Temporal.Now.plainDateTime): ++ * test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Now.plainDateTimeISO): ++ (description.of.typeErrorTests.Temporal.Now.plainDateTimeISO): ++ * test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Now.plainTimeISO): ++ (description.of.typeErrorTests.Temporal.Now.plainTimeISO): ++ * test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Now.zonedDateTime): ++ (description.of.typeErrorTests.Temporal.Now.zonedDateTime): ++ * test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Now.zonedDateTime): ++ (description.of.typeErrorTests.Temporal.Now.zonedDateTime): ++ * test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.Now.zonedDateTimeISO): ++ (description.of.typeErrorTests.Temporal.Now.zonedDateTimeISO): ++ * test262/test/built-ins/Temporal/PlainDate/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainDate): ++ (description.of.typeErrorTests.new.Temporal.PlainDate): ++ * test262/test/built-ins/Temporal/PlainDate/compare/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainDate): ++ (description.of.rangeErrorTests.Temporal.PlainDate.compare.new.Temporal.PlainDate): ++ (description.of.typeErrorTests.new.Temporal.PlainDate): ++ (description.of.typeErrorTests.Temporal.PlainDate.compare.new.Temporal.PlainDate): ++ * test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/compare/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/compare/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainDate): ++ (description.of.rangeErrorTests.Temporal.PlainDate.compare.new.Temporal.PlainDate): ++ (description.of.typeErrorTests.new.Temporal.PlainDate): ++ (description.of.typeErrorTests.Temporal.PlainDate.compare.new.Temporal.PlainDate): ++ * test262/test/built-ins/Temporal/PlainDate/compare/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/compare/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/compare/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/from/argument-number.js: ++ * test262/test/built-ins/Temporal/PlainDate/from/argument-plaindate.js: ++ * test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.PlainDate.from): ++ (description.of.typeErrorTests.Temporal.PlainDate.from): ++ * test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/from/argument-string-invalid.js: ++ (const.object.get overflow): Deleted. ++ * test262/test/built-ins/Temporal/PlainDate/from/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.PlainDate.from): ++ (description.of.typeErrorTests.Temporal.PlainDate.from): ++ * test262/test/built-ins/Temporal/PlainDate/from/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string-invalid.js: Copied from JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-invalid.js. ++ (const.object.get overflow): ++ * test262/test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string.js: Renamed from JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-overflow.js. ++ * test262/test/built-ins/Temporal/PlainDate/from/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js: ++ (validItems.forEach): Deleted. ++ * test262/test/built-ins/Temporal/PlainDate/from/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/add/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/add/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-wrong-type.js: ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/equals/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/equals/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/equals/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-default.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-higher-units.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/since/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/subtract/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toJSON/year-format.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-designator-required-for-disambiguation.js: ++ (ambiguousStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toPlainDateTime): ++ (description.of.typeErrorTests.instance.toPlainDateTime): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/limits.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/plaintime-propertybag-no-time-units.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/year-zero.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toString/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toString/year-format.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-designator-required-for-disambiguation.js: ++ (ambiguousStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toZonedDateTime): ++ (description.of.typeErrorTests.instance.toZonedDateTime): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/plaintime-propertybag-no-time-units.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toZonedDateTime): ++ (description.of.typeErrorTests.instance.toZonedDateTime): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/year-zero.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-default.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-higher-units.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/until/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDate/prototype/with/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/with/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.withCalendar): ++ (description.of.typeErrorTests.instance.withCalendar): ++ * test262/test/built-ins/Temporal/PlainDateTime/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainDateTime): ++ (description.of.typeErrorTests.new.Temporal.PlainDateTime): ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/argument-object-insufficient-data.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainDateTime): ++ (description.of.rangeErrorTests.Temporal.PlainDateTime.compare.new.Temporal.PlainDateTime): ++ (description.of.typeErrorTests.new.Temporal.PlainDateTime): ++ (description.of.typeErrorTests.Temporal.PlainDateTime.compare.new.Temporal.PlainDateTime): ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainDateTime): ++ (description.of.rangeErrorTests.Temporal.PlainDateTime.compare.new.Temporal.PlainDateTime): ++ (description.of.typeErrorTests.new.Temporal.PlainDateTime): ++ (description.of.typeErrorTests.Temporal.PlainDateTime.compare.new.Temporal.PlainDateTime): ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/calendar-ignored.js: Added. ++ (const.calendar1.toString): ++ (const.calendar2.toString): ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/cast.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/compare/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/constructor-full.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/datetime-math.js: Added. ++ (units.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-object-month.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-object.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-plaindatetime.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.PlainDateTime.from): ++ (description.of.typeErrorTests.Temporal.PlainDateTime.from): ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-comma-decimal-separator.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-invalid.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-minus-sign.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-offset.js: Added. ++ (strs.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-optional-data.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-out-of-range.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-subsecond.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-timezone.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-string.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.PlainDateTime.from): ++ (description.of.typeErrorTests.Temporal.PlainDateTime.from): ++ * test262/test/built-ins/Temporal/PlainDateTime/from/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/limits.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/from/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/overflow-default-constrain.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/overflow-invalid-string.js: ++ (validValues.forEach): Deleted. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/overflow-reject.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/from/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/hour-undefined.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/limits.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/microsecond-undefined.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/millisecond-undefined.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/minute-undefined.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/nanosecond-undefined.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/ambiguous-date.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-duration.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-object-insufficient-data.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-plain-object-mixed-signs.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/hour-overflow.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/limits.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/negative-duration.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-empty.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-invalid.js: Added. ++ (badOptions.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/add/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfWeek/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfYear/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-object-insufficient-data.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-wrong-type.js: ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/calendar-checked.js: Added. ++ (const.calendar4.toString): ++ (const.calendar5.toString): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/cast.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/monthsInYear/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/balance.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/limits.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/rounding-direction.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-divides.js: Added. ++ (12.forEach): ++ (string_appeared_here.forEach): ++ (Object.entries.nextIncrements.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-does-not-divide.js: Added. ++ (units.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-one-day.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-ceil-basic.js: Added. ++ (Object.entries.incrementOneCeil.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-floor-basic.js: Added. ++ (Object.entries.incrementOneFloor.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-basic.js: Added. ++ (Object.entries.incrementOneNearest.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-is-default.js: Added. ++ (Object.entries.units.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-trunc-basic.js: Added. ++ (Object.entries.incrementOneFloor.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundto-invalid-string.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-disallowed-units.js: Removed. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object-insufficient-data.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-no-argument.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-object.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/different-calendars-throws.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/no-unnecessary-units.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-empty.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-invalid.js: Added. ++ (badOptions.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/returns-days.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/round-relative-to-receiver.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-cleanly-divides.js: Added. ++ (12.forEach): ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-does-not-divide.js: Added. ++ (Object.entries.badIncrements.forEach): ++ (Object.entries.fullIncrements.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-ceil-basic.js: Added. ++ (incrementOneCeil.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-floor-basic.js: Added. ++ (incrementOneFloor.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-basic.js: Added. ++ (ensureUnsignedZero): ++ (incrementOneNearest.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-default-changes.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-basic.js: Added. ++ (ensureUnsignedZero): ++ (incrementOneTrunc.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-is-default.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/subseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/weeks-months-mutually-exclusive.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/since/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/ambiguous-date.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-duration.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-object-insufficient-data.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-plain-object-mixed-signs.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/hour-overflow.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/limits.js: Added. ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/negative-duration.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-empty.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-invalid.js: Added. ++ (badOptions.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toJSON/year-format.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainTime/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-always.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js: Added. ++ (const.customCal.toString): ++ (const.fakeISO8601Cal.toString): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-invalid-string.js: ++ (invalidCals.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-never.js: Added. ++ (const.cal.toString): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-non-integer.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-out-of-range.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js: ++ (expected.of.tests.const.lambda.datetime.toString): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-wrong-type.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-cross-midnight.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-direction.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-ceil.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-floor.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-halfExpand.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-trunc.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-fractionalseconddigits.js: Added. ++ (expected.of.tests.const.string.datetime.toString.get fractionalSecondDigits): ++ (datetime.toString.get fractionalSecondDigits): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-valid-units.js: ++ (test): ++ (notValid.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/year-format.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation-invalid-string.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/invalid-instant.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/multiple-instants.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-object.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toZonedDateTime): ++ (description.of.typeErrorTests.instance.toZonedDateTime): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-object.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/balance-negative-duration.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/balance.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/casts-argument.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/different-calendars-throws.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/inverse.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/no-unnecessary-units.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-empty.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-invalid.js: Added. ++ (badOptions.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/returns-days.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/round-relative-to-receiver.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-cleanly-divides.js: Added. ++ (12.forEach): ++ (string_appeared_here.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-does-not-divide.js: Added. ++ (Object.entries.nondivisibleUnits.forEach): ++ (Object.entries.equalDivisibleUnits.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-ceil-basic.js: Added. ++ (incrementOneCeil.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor-basic.js: Added. ++ (incrementOneFloor.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-basic.js: Added. ++ (ensureUnsignedZero): ++ (incrementOneNearest.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-default-changes.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-basic.js: Added. ++ (ensureUnsignedZero): ++ (incrementOneTrunc.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-is-default.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/subseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/units-changed.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/weeks-months-mutually-exclusive.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/until/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/valueOf/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/weekOfYear/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/argument-not-object.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/argument-object-insufficient-data.js: Added. ++ (units.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-options.js: Added. ++ (Calendar): ++ (Calendar.prototype.dateFromFields): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-throws.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/month-and-monthcode-must-agree.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/multiple-unrecognized-properties-ignored.js: Added. ++ (units.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-empty.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-invalid.js: Added. ++ (badOptions.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js: ++ (const.options.get overflow): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/string-throws.js: Added. ++ (baddies.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/with/timezone-throws.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/argument-string.js: Added. ++ (const.calendar.toString): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-temporal-object.js: ++ (TemporalHelpers.checkToTemporalCalendarFastPath): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.withCalendar): ++ (description.of.typeErrorTests.instance.withCalendar): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object-insufficient-data.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js: Added. ++ (const.cal.toString): ++ (const.cal.year): ++ (const.cal.month): ++ (const.cal.monthCode): ++ (const.cal.day): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js: Added. ++ (const.cal1.toString): ++ (const.cal2.toString): ++ (const.cal2.year): ++ (const.cal2.month): ++ (const.cal2.monthCode): ++ (const.cal2.day): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js: Added. ++ (const.cal.toString): ++ (const.cal.year): ++ (const.cal.month): ++ (const.cal.monthCode): ++ (const.cal.day): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js: Added. ++ (const.cal.toString): ++ (const.cal.year): ++ (const.cal.month): ++ (const.cal.monthCode): ++ (const.cal.day): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.withPlainDate): ++ (description.of.typeErrorTests.instance.withPlainDate): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js: Added. ++ (const.cal.toString): ++ (const.cal.year): ++ (const.cal.month): ++ (const.cal.monthCode): ++ (const.cal.day): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.withPlainDate): ++ (description.of.typeErrorTests.instance.withPlainDate): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/non-compatible-calendars-throw.js: Added. ++ (const.cal.toString): ++ (const.anotherCal.toString): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-object-insufficient-data.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js: ++ (ambiguousStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-without-time-designator.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-time.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.withPlainTime): ++ (description.of.typeErrorTests.instance.withPlainTime): ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/no-argument-default-to-midnight.js: Added. ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/year-zero.js: ++ * test262/test/built-ins/Temporal/PlainDateTime/second-undefined.js: ++ * test262/test/built-ins/Temporal/PlainMonthDay/calendar-always.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainMonthDay): ++ (description.of.typeErrorTests.new.Temporal.PlainMonthDay): ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/argument-plainmonthday.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.PlainMonthDay.from): ++ (description.of.typeErrorTests.Temporal.PlainMonthDay.from): ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.PlainMonthDay.from): ++ (description.of.typeErrorTests.Temporal.PlainMonthDay.from): ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/calendar-monthdayfromfields-called-with-options-undefined.js: Added. ++ (Temporal.Calendar.prototype.monthDayFromFields): ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/overflow-invalid-string.js: ++ (validValues.forEach): Deleted. ++ * test262/test/built-ins/Temporal/PlainMonthDay/from/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-wrong-type.js: ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/calendar-monthdayfromfields-called-with-options-undefined.js: Added. ++ (Temporal.Calendar.prototype.monthDayFromFields): ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/year-zero.js: ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/toJSON/year-format.js: Added. ++ (NotISO): ++ (NotISO.prototype.toString): ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-always.js: ++ (toString): ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/year-format.js: Added. ++ (NotISO): ++ (NotISO.prototype.toString): ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/compare/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/compare/argument-string-time-designator-required-for-disambiguation.js: ++ (ambiguousStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/compare/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainTime): ++ (description.of.rangeErrorTests.Temporal.PlainTime.compare.new.Temporal.PlainTime): ++ (description.of.typeErrorTests.new.Temporal.PlainTime): ++ (description.of.typeErrorTests.Temporal.PlainTime.compare.new.Temporal.PlainTime): ++ * test262/test/built-ins/Temporal/PlainTime/compare/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/compare/plaintime-propertybag-no-time-units.js: ++ * test262/test/built-ins/Temporal/PlainTime/compare/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/from/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/from/argument-object-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/from/argument-object.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/from/argument-plaintime.js: ++ * test262/test/built-ins/Temporal/PlainTime/from/argument-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/from/argument-string-time-designator-required-for-disambiguation.js: ++ (ambiguousStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/from/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.PlainTime.from): ++ (description.of.typeErrorTests.Temporal.PlainTime.from): ++ * test262/test/built-ins/Temporal/PlainTime/from/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/from/observable-get-overflow-argument-string-invalid.js: Renamed from JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-invalid.js. ++ * test262/test/built-ins/Temporal/PlainTime/from/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/from/overflow-constrain.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js: ++ (validValues.forEach): Deleted. ++ * test262/test/built-ins/Temporal/PlainTime/from/overflow-reject.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/from/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/negative-zero.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-duration.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-higher-units.js: Added. ++ (new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-object.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-designator-required-for-disambiguation.js: ++ (ambiguousStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-wrong-type.js: ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/equals/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/equals/plaintime-propertybag-no-time-units.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/equals/year-zero.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/rounding-cross-midnight.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-hours.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-invalid.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-microseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-milliseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-minutes.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-nanoseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-seconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-ceil.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-floor.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-halfExpand.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-trunc.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-undefined.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/roundto-invalid-string.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-disallowed-units.js: Removed. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-missing.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-cast.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-designator-required-for-disambiguation.js: ++ (ambiguousStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/largestunit.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/plaintime-propertybag-no-time-units.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/result-sub-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-hours.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-invalid.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-microseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-milliseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-minutes.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-nanoseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-seconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-ceil.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-floor.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-halfExpand.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-trunc.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-undefined.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/since/year-zero.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-duration.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-higher-units.js: Added. ++ (new.Temporal.Duration): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-object.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toPlainDateTime): ++ (description.of.typeErrorTests.instance.toPlainDateTime): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toPlainDateTime): ++ (description.of.typeErrorTests.instance.toPlainDateTime): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/limits.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-non-integer.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-wrong-type.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js: ++ (test): ++ (notValid.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toZonedDateTime): ++ (description.of.typeErrorTests.instance.toZonedDateTime): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-with-utc-designator.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.toZonedDateTime): ++ (description.of.typeErrorTests.instance.toZonedDateTime): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.plainDate.new.Temporal.PlainDate): ++ (description.of.typeErrorTests.plainDate.new.Temporal.PlainDate): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-cast.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-designator-required-for-disambiguation.js: ++ (ambiguousStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/basic.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/largestunit.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/plaintime-propertybag-no-time-units.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/result-sub-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-hours.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-invalid.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-microseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-milliseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-minutes.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-nanoseconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-seconds.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-ceil.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-floor.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-halfExpand.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-trunc.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-undefined.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/until/year-zero.js: ++ * test262/test/built-ins/Temporal/PlainTime/prototype/with/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/calendar-always.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainYearMonth): ++ (description.of.typeErrorTests.new.Temporal.PlainYearMonth): ++ * test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainYearMonth): ++ (description.of.rangeErrorTests.Temporal.PlainYearMonth.compare.new.Temporal.PlainYearMonth): ++ (description.of.typeErrorTests.new.Temporal.PlainYearMonth): ++ (description.of.typeErrorTests.Temporal.PlainYearMonth.compare.new.Temporal.PlainYearMonth): ++ * test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.PlainYearMonth): ++ (description.of.rangeErrorTests.Temporal.PlainYearMonth.compare.new.Temporal.PlainYearMonth): ++ (description.of.typeErrorTests.new.Temporal.PlainYearMonth): ++ (description.of.typeErrorTests.Temporal.PlainYearMonth.compare.new.Temporal.PlainYearMonth): ++ * test262/test/built-ins/Temporal/PlainYearMonth/compare/calendar-yearmonthfromfields-called-with-options-undefined.js: Added. ++ (Temporal.Calendar.prototype.yearMonthFromFields): ++ * test262/test/built-ins/Temporal/PlainYearMonth/compare/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/compare/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/argument-number.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/argument-plainyearmonth.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.PlainYearMonth.from): ++ (description.of.typeErrorTests.Temporal.PlainYearMonth.from): ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.PlainYearMonth.from): ++ (description.of.typeErrorTests.Temporal.PlainYearMonth.from): ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/calendar-yearmonthfromfields-called-with-options-undefined.js: Added. ++ (Temporal.Calendar.prototype.yearMonthFromFields): ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/overflow-invalid-string.js: ++ (validValues.forEach): Deleted. ++ * test262/test/built-ins/Temporal/PlainYearMonth/from/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainYearMonth/limits.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js: Added. ++ (CustomCalendar): ++ (CustomCalendar.prototype.year): ++ (CustomCalendar.prototype.month): ++ (CustomCalendar.prototype.monthCode): ++ (CustomCalendar.prototype.day): ++ (CustomCalendar.prototype.daysInMonth): ++ (CustomCalendar.prototype._dateFromFieldsImpl): ++ (CustomCalendar.prototype.dateFromFields): ++ (CustomCalendar.prototype.yearMonthFromFields): ++ (CustomCalendar.prototype.monthDayFromFields): ++ (CustomCalendar.prototype.dateAdd): ++ (CustomCalendar.prototype.toString): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-wrong-type.js: ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/calendar-yearmonthfromfields-called-with-options-undefined.js: Added. ++ (Temporal.Calendar.prototype.yearMonthFromFields): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/year-zero.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-yearmonthfromfields-called-with-options-undefined.js: Added. ++ (Temporal.Calendar.prototype.yearMonthFromFields): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/year-zero.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js: Added. ++ (CustomCalendar): ++ (CustomCalendar.prototype.year): ++ (CustomCalendar.prototype.month): ++ (CustomCalendar.prototype.monthCode): ++ (CustomCalendar.prototype.day): ++ (CustomCalendar.prototype.daysInMonth): ++ (CustomCalendar.prototype._dateFromFieldsImpl): ++ (CustomCalendar.prototype.dateFromFields): ++ (CustomCalendar.prototype.yearMonthFromFields): ++ (CustomCalendar.prototype.monthDayFromFields): ++ (CustomCalendar.prototype.dateAdd): ++ (CustomCalendar.prototype.toString): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/toJSON/year-format.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-always.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/year-format.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-yearmonthfromfields-called-with-options-undefined.js: Added. ++ (Temporal.Calendar.prototype.yearMonthFromFields): ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/year-zero.js: ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/options-wrong-type.js: ++ (values.forEach): Deleted. ++ * test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/TimeZone/from/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/from/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/TimeZone/from/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.TimeZone.from): ++ (description.of.typeErrorTests.Temporal.TimeZone.from): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.getInstantFor): ++ (description.of.typeErrorTests.instance.getInstantFor): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.getInstantFor): ++ (description.of.typeErrorTests.instance.getInstantFor): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-object-tostring.js: Added. ++ (arg.toString): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.getPlainDateTimeFor): ++ (description.of.typeErrorTests.instance.getPlainDateTimeFor): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.getPlainDateTimeFor.new.Temporal.Instant): ++ (description.of.typeErrorTests.instance.getPlainDateTimeFor.new.Temporal.Instant): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/instant-string-sub-minute-offset.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/limits.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.getPossibleInstantsFor): ++ (description.of.typeErrorTests.instance.getPossibleInstantsFor): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.getPossibleInstantsFor): ++ (description.of.typeErrorTests.instance.getPossibleInstantsFor): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.ZonedDateTime): ++ (description.of.typeErrorTests.new.Temporal.ZonedDateTime): ++ * test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.ZonedDateTime.compare): ++ (description.of.typeErrorTests.Temporal.ZonedDateTime.compare): ++ * test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.ZonedDateTime.compare): ++ (description.of.typeErrorTests.Temporal.ZonedDateTime.compare): ++ * test262/test/built-ins/Temporal/ZonedDateTime/compare/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.ZonedDateTime.compare): ++ (description.of.typeErrorTests.Temporal.ZonedDateTime.compare): ++ * test262/test/built-ins/Temporal/ZonedDateTime/compare/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.ZonedDateTime.from): ++ (description.of.typeErrorTests.Temporal.ZonedDateTime.from): ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.ZonedDateTime.from): ++ (description.of.typeErrorTests.Temporal.ZonedDateTime.from): ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/argument-zoneddatetime.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/overflow-invalid-string.js: ++ (validValues.forEach): Deleted. ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.Temporal.ZonedDateTime.from): ++ (description.of.typeErrorTests.Temporal.ZonedDateTime.from): ++ * test262/test/built-ins/Temporal/ZonedDateTime/from/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.equals): ++ (description.of.typeErrorTests.instance.equals): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/rounding-direction.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/roundto-invalid-string.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-disallowed-units.js: Removed. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/calendar-dateadd-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.since): ++ (description.of.typeErrorTests.instance.since): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toJSON/year-format.js: Added. ++ (epochNsInYear): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-non-integer.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-out-of-range.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js: ++ (expected.of.tests.const.lambda.datetime.toString): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-wrong-type.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-cross-midnight.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-direction.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-ceil.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-floor.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-halfExpand.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-trunc.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-fractionalseconddigits.js: Added. ++ (expected.of.tests.const.string.datetime.toString.get fractionalSecondDigits): ++ (datetime.toString.get fractionalSecondDigits): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-valid-units.js: ++ (test): ++ (notValid.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/year-format.js: Added. ++ (epochNsInYear): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/calendar-dateadd-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/largestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/smallestunit-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.until): ++ (description.of.typeErrorTests.instance.until): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/options-wrong-type.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/overflow-invalid-string.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.withCalendar): ++ (description.of.typeErrorTests.instance.withCalendar): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.withPlainDate): ++ (description.of.typeErrorTests.instance.withPlainDate): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-invalid.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.withPlainDate): ++ (description.of.typeErrorTests.instance.withPlainDate): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-number.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js: ++ (ambiguousStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.withPlainTime): ++ (description.of.typeErrorTests.instance.withPlainTime): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/year-zero.js: ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.withTimeZone): ++ (description.of.typeErrorTests.instance.withTimeZone): ++ * test262/test/built-ins/Temporal/ZonedDateTime/timezone-string-leap-second.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/timezone-string-multiple-offsets.js: Added. ++ * test262/test/built-ins/Temporal/ZonedDateTime/timezone-wrong-type.js: Added. ++ (description.of.rangeErrorTests.new.Temporal.ZonedDateTime): ++ (description.of.typeErrorTests.new.Temporal.ZonedDateTime): ++ * test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-get-src-value-throws.js: Removed. ++ * test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js: Added. ++ (testWithTypedArrayConstructors.): ++ (testWithTypedArrayConstructors.get let): ++ * test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-throws.js: Removed. ++ * test262/test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer-comparefn.js: Removed. ++ * test262/test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn-coerce.js: Removed. ++ * test262/test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn.js: Removed. ++ * test262/test/built-ins/TypedArray/prototype/sort/sort-tonumber.js: ++ (testWithTypedArrayConstructors): ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-different-type.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-same-type.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-access-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-access-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/no-species.js: Added. ++ (GrossBuffer): ++ (GrossBuffer.get Symbol): ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-different-type.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-same-type.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-access-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-null.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-undefined.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-different-type.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-same-type.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-access-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-throws.js: Removed. ++ * test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js: Removed. ++ * test262/test/built-ins/parseInt/15.1.2.2-2-1.js: ++ * test262/test/harness/temporalHelpers-one-shift-time-zone.js: Added. ++ (checkTimeZoneArithmetic): ++ * test262/test/intl402/DurationFormat/constructor-locales-invalid.js: Added. ++ (expectedError.of.getInvalidLocaleArguments): ++ * test262/test/intl402/DurationFormat/constructor-locales-valid.js: Added. ++ (name.of.tests.matchers.forEach): ++ * test262/test/intl402/DurationFormat/constructor-options-defaults.js: Added. ++ * test262/test/intl402/DurationFormat/constructor-options-fractionalDigits-invalid.js: Added. ++ * test262/test/intl402/DurationFormat/constructor-options-fractionalDigits-valid.js: Added. ++ * test262/test/intl402/DurationFormat/constructor-options-invalid.js: Added. ++ * test262/test/intl402/DurationFormat/constructor-options-localeMatcher-invalid.js: Added. ++ (const.localeMatcher.of.invalidOptions.new.Intl.DurationFormat): ++ * test262/test/intl402/DurationFormat/constructor-options-localeMatcher-valid.js: Added. ++ * test262/test/intl402/DurationFormat/constructor-options-numberingSystem-invalid.js: Added. ++ * test262/test/intl402/DurationFormat/constructor-options-numberingSystem-valid.js: Added. ++ * test262/test/intl402/DurationFormat/constructor-options-order.js: Added. ++ (const.options.get localeMatcher): ++ (const.options.get numberingSystem): ++ (const.options.get style): ++ * test262/test/intl402/DurationFormat/constructor-options-style-invalid.js: Added. ++ (const.invalidOption.of.invalidOptions.new.Intl.DurationFormat): ++ * test262/test/intl402/DurationFormat/constructor-options-style-valid.js: Added. ++ (toString): ++ * test262/test/intl402/DurationFormat/extensibility.js: Renamed from JSTests/test262/test/intl402/DurationFormat/instance/extensibility.js. ++ * test262/test/intl402/DurationFormat/length.js: Renamed from JSTests/test262/test/intl402/DurationFormat/instance/length.js. ++ * test262/test/intl402/DurationFormat/name.js: Renamed from JSTests/test262/test/intl402/DurationFormat/instance/name.js. ++ * test262/test/intl402/DurationFormat/newtarget-undefined.js: Added. ++ * test262/test/intl402/DurationFormat/prop-desc.js: Renamed from JSTests/test262/test/intl402/DurationFormat/instance/prop-desc.js. ++ * test262/test/intl402/DurationFormat/prototype.js: Renamed from JSTests/test262/test/intl402/DurationFormat/instance/prototype.js. ++ * test262/test/intl402/DurationFormat/supportedLocalesOf/basic.js: Added. ++ * test262/test/intl402/DurationFormat/supportedLocalesOf/branding.js: Added. ++ * test262/test/intl402/DurationFormat/supportedLocalesOf/length.js: Added. ++ * test262/test/intl402/DurationFormat/supportedLocalesOf/locales-empty.js: Added. ++ * test262/test/intl402/DurationFormat/supportedLocalesOf/locales-invalid.js: Added. ++ (expectedError.of.getInvalidLocaleArguments): ++ * test262/test/intl402/DurationFormat/supportedLocalesOf/locales-specific.js: Added. ++ * test262/test/intl402/DurationFormat/supportedLocalesOf/name.js: Added. ++ * test262/test/intl402/DurationFormat/supportedLocalesOf/prop-desc.js: Added. ++ * test262/test/intl402/Intl/DateTimeFormat/prototype/formatRange/fails-on-distinct-temporal-types.js: Added. ++ (Object.entries.instances.forEach): ++ * test262/test/intl402/Intl/DateTimeFormat/prototype/formatRangeToParts/fails-on-distinct-temporal-types.js: Added. ++ (Object.entries.instances.forEach): ++ * test262/test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js: ++ * test262/test/intl402/NumberFormat/constructor-roundingIncrement.js: ++ (expected.of.values.get roundingIncrement): ++ * test262/test/intl402/NumberFormat/prototype/format/format-max-min-fraction-significant-digits.js: Added. ++ (nfTestMatrix.forEach): ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-10.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-100.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-1000.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-20.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-200.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2000.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-25.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-250.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2500.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-5.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-50.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-500.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-5000.js: ++ * test262/test/intl402/NumberFormat/prototype/format/format-rounding-priority-more-precision.js: ++ * test262/test/intl402/NumberFormat/prototype/formatRange/x-greater-than-y-throws.js: ++ * test262/test/intl402/NumberFormat/prototype/formatRangeToParts/x-greater-than-y-throws.js: ++ * test262/test/intl402/Temporal/Calendar/prototype/era/argument-number.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-number.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.era): ++ (description.of.typeErrorTests.instance.era): ++ * test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/intl402/Temporal/Calendar/prototype/era/argument-string-invalid.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/era/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.era): ++ (description.of.typeErrorTests.instance.era): ++ * test262/test/intl402/Temporal/Calendar/prototype/era/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/era/leap-second.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/era/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-number.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-leap-second.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-number.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.eraYear): ++ (description.of.typeErrorTests.instance.eraYear): ++ * test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-year-zero.js: Added. ++ (invalidStrings.forEach): ++ * test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-string-invalid.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-wrong-type.js: Added. ++ (description.of.rangeErrorTests.instance.eraYear): ++ (description.of.typeErrorTests.instance.eraYear): ++ * test262/test/intl402/Temporal/Calendar/prototype/eraYear/calendar-datefromfields-called-with-options-undefined.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/eraYear/leap-second.js: Added. ++ * test262/test/intl402/Temporal/Calendar/prototype/eraYear/year-zero.js: ++ (invalidStrings.forEach): ++ * test262/test/intl402/Temporal/Duration/compare/relativeto-hour.js: Added. ++ * test262/test/intl402/Temporal/Instant/prototype/toString/timezone-offset.js: Added. ++ (test): ++ * test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-always.js: Added. ++ * test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js: Added. ++ * test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-never.js: Added. ++ * test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js: Added. ++ (const.cal.era): ++ (const.cal.eraYear): ++ (const.cal.toString): ++ (const.cal.year): ++ (const.cal.month): ++ (const.cal.monthCode): ++ (const.cal.day): ++ * test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js: Added. ++ (const.cal1.toString): ++ (const.cal2.era): ++ (const.cal2.eraYear): ++ (const.cal2.toString): ++ (const.cal2.year): ++ (const.cal2.month): ++ (const.cal2.monthCode): ++ (const.cal2.day): ++ * test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js: Added. ++ (const.cal.era): ++ (const.cal.eraYear): ++ (const.cal.toString): ++ (const.cal.year): ++ (const.cal.month): ++ (const.cal.monthCode): ++ (const.cal.day): ++ * test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js: Added. ++ (const.cal.era): ++ (const.cal.eraYear): ++ (const.cal.toString): ++ (const.cal.year): ++ (const.cal.month): ++ (const.cal.monthCode): ++ (const.cal.day): ++ * test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-calendar.js: Added. ++ * test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js: Added. ++ (const.cal.era): ++ (const.cal.eraYear): ++ (const.cal.toString): ++ (const.cal.year): ++ (const.cal.month): ++ (const.cal.monthCode): ++ (const.cal.day): ++ * test262/test/intl402/Temporal/TimeZone/etc-timezone.js: Added. ++ (14.forEach): ++ (9.forEach): ++ (12.forEach): ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-and.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-nullish.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-or.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-and.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-nullish.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-or.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-and.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-nullish.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-or.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js: Removed. ++ * test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js: Removed. ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-and.js: Added. ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-nullish.js: Added. ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-or.js: Added. ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-and.js: Added. ++ (doNotCall): ++ (C.prototype.get field): ++ (C.prototype.set field): ++ (C.prototype.compoundAssignment): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-nullish.js: Added. ++ (doNotCall): ++ (C.prototype.get field): ++ (C.prototype.set field): ++ (C.prototype.compoundAssignment): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-or.js: Added. ++ (doNotCall): ++ (C.prototype.get field): ++ (C.prototype.set field): ++ (C.prototype.compoundAssignment): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-and.js: Added. ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-nullish.js: Added. ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-or.js: Added. ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-and.js: Added. ++ (doNotCall): ++ (C.prototype.compoundAssignment): ++ (C.prototype.fieldValue): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-nullish.js: Added. ++ (doNotCall): ++ (C.prototype.compoundAssignment): ++ (C.prototype.fieldValue): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-or.js: Added. ++ (doNotCall): ++ (C.prototype.compoundAssignment): ++ (C.prototype.fieldValue): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-and.js: Added. ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-nullish.js: Added. ++ (doNotCall): ++ (C.prototype.compoundAssignment): ++ (C.prototype.getPrivateMethodFunctionObject): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-or.js: Added. ++ (doNotCall): ++ (C.prototype.compoundAssignment): ++ (C.prototype.getPrivateMethodFunctionObject): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js: Added. ++ (C.prototype.get field): ++ (C.prototype.compoundAssignment): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js: Added. ++ (C.prototype.get field): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js: Added. ++ (C.prototype.get field): ++ (C.prototype.compoundAssignment): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-and.js: Added. ++ (doNotCall): ++ (C.prototype.get field): ++ (C.prototype.compoundAssignment): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-nullish.js: Added. ++ (doNotCall): ++ (C.prototype.get field): ++ (C.prototype.compoundAssignment): ++ (C): ++ * test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-or.js: Added. ++ (doNotCall): ++ (C.prototype.get field): ++ (C.prototype.compoundAssignment): ++ (C): ++ * test262/test/language/expressions/unary-plus/S11.4.6_A3_T3.js: ++ (new.Number): ++ (isNaN): ++ * test262/test/language/statements/for-in/S12.6.4_A7_T2.js: ++ (erasator_T_1000): ++ (__accum.indexOf.string_appeared_here.1.__accum.indexOf): Deleted. ++ (__accum.indexOf): Deleted. ++ * test262/test262-Revision.txt: ++ + 2022-05-03 Angelos Oikonomopoulos + + Skip test currently failing on ARM +diff --git a/JSTests/microbenchmarks/typed-array-fill.js b/JSTests/microbenchmarks/typed-array-fill.js +new file mode 100644 +index 0000000000000000000000000000000000000000..79182c42584d6ca2bcb717968394a6131f320e7f +--- /dev/null ++++ b/JSTests/microbenchmarks/typed-array-fill.js +@@ -0,0 +1,11 @@ ++var a1 = new Uint8Array(1024 * 1024 * 1); ++var a2 = new Uint16Array(1024 * 1024 * 1); ++var a3 = new Uint32Array(1024 * 1024 * 1); ++var a4 = new Float64Array(1024 * 1024 * 1); ++ ++for (var i = 0; i < 3e2; ++i) { ++ a1.fill(99); ++ a2.fill(99); ++ a3.fill(99); ++ a4.fill(99); ++} +diff --git a/JSTests/stress/temporal-duration.js b/JSTests/stress/temporal-duration.js +index f279781fac65c79d90a77de242ac1c0fcb00962b..8310cdf94d54f2a6b55897ad2aecb7d8727333d3 100644 +--- a/JSTests/stress/temporal-duration.js ++++ b/JSTests/stress/temporal-duration.js +@@ -203,6 +203,7 @@ shouldThrow(() => Temporal.Duration.from('P1M').round({ largestUnit: 'seconds' } + shouldThrow(() => Temporal.Duration.from('P1W').round({ largestUnit: 'seconds' }), RangeError); + shouldThrow(() => Temporal.Duration.from('P1D').round({ largestUnit: 'months' }), RangeError); + shouldThrow(() => Temporal.Duration.from('P1D').round({ largestUnit: 'weeks' }), RangeError); ++shouldBe(posAbsolute.round('day').toString(), 'P1D'); + shouldBe(posAbsolute.round({ largestUnit: 'day' }).toString(), 'P1DT2H3M4.005006007S'); + shouldBe(posAbsolute.round({ largestUnit: 'auto' }).toString(), 'P1DT2H3M4.005006007S'); + shouldBe(posAbsolute.round({ smallestUnit: 'day' }).toString(), 'P1D'); +@@ -229,6 +230,7 @@ shouldThrow(() => Temporal.Duration.from('P1M').total({ unit: 'seconds' }), Rang + shouldThrow(() => Temporal.Duration.from('P1W').total({ unit: 'seconds' }), RangeError); + shouldThrow(() => Temporal.Duration.from('P1D').total({ unit: 'months' }), RangeError); + shouldThrow(() => Temporal.Duration.from('P1D').total({ unit: 'weeks' }), RangeError); ++shouldBe(posAbsolute.total('days'), 1.0854630209028588); + shouldBe(posAbsolute.total({ unit: 'days' }), 1.0854630209028588); + shouldBe(posAbsolute.total({ unit: 'hours' }), 26.051112501668612); + shouldBe(posAbsolute.total({ unit: 'minutes' }), 1563.0667501001167); +@@ -281,6 +283,7 @@ for (let i = 1; i < 10; i++) + shouldBe(pos.toString({ fractionalSecondDigits: i }), `P1Y2M3W4DT5H6M7.${decimalPart.slice(0,i)}S`); + shouldBe(pos.toString({ fractionalSecondDigits: 'auto' }), pos.toString()); + shouldBe(zero.toString({ fractionalSecondDigits: 2 }), 'PT0.00S'); ++shouldBe(new Temporal.Duration(1).toString({ fractionalSecondDigits: 2 }), 'P1YT0.00S'); + + shouldThrow(() => pos.toString({ roundingMode: 'bogus' }), RangeError); + shouldBe(pos.toString({ roundingMode: 'trunc' }), pos.toString()); +diff --git a/JSTests/stress/temporal-instant-since-and-until-with-year-month-week-day.js b/JSTests/stress/temporal-instant-since-and-until-with-year-month-week-day.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2f64a748f8e35b6bbaa5568e92952089a76f34c7 +--- /dev/null ++++ b/JSTests/stress/temporal-instant-since-and-until-with-year-month-week-day.js +@@ -0,0 +1,39 @@ ++//@ requireOptions("--useTemporal=1") ++function shouldThrow(func, errorMessage) { ++ var errorThrown = false; ++ var error = null; ++ try { ++ func(); ++ } catch (e) { ++ errorThrown = true; ++ error = e; ++ } ++ if (!errorThrown) ++ throw new Error('not thrown'); ++ if (String(error) !== errorMessage) ++ throw new Error(`bad error: ${String(error)}`); ++} ++ ++let earlier = new Temporal.Instant(1_000_000_000_000_000_000n); ++let later = new Temporal.Instant(1_000_090_061_987_654_321n); ++let units = [ "year", "month", "week", "day", ]; ++for (let smallestUnit of units) { ++ shouldThrow(() => { ++ later.since(earlier, { smallestUnit }); ++ }, `RangeError: smallestUnit is a disallowed unit`); ++} ++for (let largestUnit of units) { ++ shouldThrow(() => { ++ later.since(earlier, { largestUnit }); ++ }, `RangeError: largestUnit is a disallowed unit`); ++} ++for (let smallestUnit of units) { ++ shouldThrow(() => { ++ earlier.until(later, { smallestUnit }); ++ }, `RangeError: smallestUnit is a disallowed unit`); ++} ++for (let largestUnit of units) { ++ shouldThrow(() => { ++ earlier.until(later, { largestUnit }); ++ }, `RangeError: largestUnit is a disallowed unit`); ++} +diff --git a/JSTests/stress/temporal-instant.js b/JSTests/stress/temporal-instant.js +index e76254704b5a90c00dd69bc45e50fc8b647e53a7..149005bf95d68199d06457ad84ee92a36476e0c2 100644 +--- a/JSTests/stress/temporal-instant.js ++++ b/JSTests/stress/temporal-instant.js +@@ -229,6 +229,10 @@ shouldThrow(() => new Temporal.Instant('abc123'), SyntaxError); + // truncates to minute + [i1, i2, i3].forEach((i) => shouldBe(i.toString({ smallestUnit: 'minute' }), '1976-11-18T15:23Z')); + ++ // ...as opposed to rounding first ++ shouldBe(i3.round('minute').toString(), '1976-11-18T15:24:00Z'); ++ shouldBe(i3.round({ smallestUnit: 'minute' }).toString(), '1976-11-18T15:24:00Z'); ++ + // other smallestUnits are aliases for fractional digits + shouldBe(i3.toString({ smallestUnit: 'second' }), i3.toString({ fractionalSecondDigits: 0 })); + shouldBe(i3.toString({ smallestUnit: 'millisecond' }), i3.toString({ fractionalSecondDigits: 3 })); +diff --git a/JSTests/stress/temporal-plaintime.js b/JSTests/stress/temporal-plaintime.js +index a82bf37a2c57a013fff8e9a5370e34223751e893..0a716003c0e26e1f591a940c693c51fa732ecda2 100644 +--- a/JSTests/stress/temporal-plaintime.js ++++ b/JSTests/stress/temporal-plaintime.js +@@ -284,6 +284,7 @@ shouldBe(Temporal.PlainTime.from("20:34").calendar instanceof Temporal.Calendar, + + { + let time = Temporal.PlainTime.from('19:39:09.068346205'); ++ shouldBe(String(time.round('hour')), `20:00:00`); + shouldBe(String(time.round({ smallestUnit: 'hour' })), `20:00:00`); + shouldBe(String(time.round({ roundingIncrement: 30, smallestUnit: 'minute' })), `19:30:00`); + shouldBe(String(time.round({ roundingIncrement: 30, smallestUnit: 'minute', roundingMode: 'ceil' })), `20:00:00`); +diff --git a/JSTests/stress/typed-array-fill-complicated.js b/JSTests/stress/typed-array-fill-complicated.js +new file mode 100644 +index 0000000000000000000000000000000000000000..66030c5e86117f4a2255d2943f84f4eea39b1bda +--- /dev/null ++++ b/JSTests/stress/typed-array-fill-complicated.js +@@ -0,0 +1,22 @@ ++function shouldBe(actual, expected) { ++ if (actual !== expected) ++ throw new Error('bad value: ' + actual); ++} ++ ++{ ++ let a0 = new Uint8Array(100); ++ shouldBe(a0[3], 0); ++ shouldBe(a0[4], 0); ++ a0.fill(42, 3, 4); ++ shouldBe(a0[3], 42); ++ shouldBe(a0[4], 0); ++} ++{ ++ let a0 = new Uint8Array(4); ++ shouldBe(a0[0], 0); ++ a0.fill(42, 0, 0); ++ shouldBe(a0[0], 0); ++ a0.fill(42, 3, 0); ++ for (let i = 0; i < 4; ++i) ++ shouldBe(a0[i], 0); ++} +diff --git a/JSTests/test262/expectations.yaml b/JSTests/test262/expectations.yaml +index dcfc55408c904104cba9d73ec3cbd524a035f9c8..af6aacf58ec6c927240bf265c1777d65c6a96847 100644 +--- a/JSTests/test262/expectations.yaml ++++ b/JSTests/test262/expectations.yaml +@@ -603,7 +603,7 @@ test/annexB/language/global-code/switch-dflt-global-skip-early-err-try.js: + default: 'Test262Error: An initialized binding is not created prior to evaluation Expected a ReferenceError to be thrown but no exception was thrown at all' + test/annexB/language/global-code/switch-dflt-global-skip-early-err.js: + default: "SyntaxError: Cannot declare a function that shadows a let/const/class/function variable 'f' in strict mode." +-test/built-ins/Array/prototype/Symbol.unscopables/value.js: ++test/built-ins/Array/prototype/Symbol.unscopables/array-grouping.js: + default: 'Test262Error: `groupBy` property value Expected SameValue(«undefined», «true») to be true' + strict mode: 'Test262Error: `groupBy` property value Expected SameValue(«undefined», «true») to be true' + test/built-ins/Date/UTC/fp-evaluation-order.js: +@@ -822,147 +822,255 @@ test/built-ins/RegExp/prototype/exec/u-lastindex-adv.js: + test/built-ins/RegExp/quantifier-integer-limit.js: + default: 'SyntaxError: Invalid regular expression: number too large in {} quantifier' + strict mode: 'SyntaxError: Invalid regular expression: number too large in {} quantifier' ++test/built-ins/ShadowRealm/prototype/evaluate/throws-typeerror-wrap-throwing.js: ++ default: 'Test262Error: TypeError on wrapping a callable proxy with throwing getOwnPropertyDescriptor trap Expected a TypeError to be thrown but no exception was thrown at all' ++ strict mode: 'Test262Error: TypeError on wrapping a callable proxy with throwing getOwnPropertyDescriptor trap Expected a TypeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/Duration/compare/basic.js: ++ default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/compare/calendar-dateadd-called-with-options-undefined.js: ++ default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone, calendar)')" ++ strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone, calendar)')" + test/built-ins/Temporal/Duration/compare/calendar-dateadd-called-with-plaindate-instance.js: + default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' + strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' + test/built-ins/Temporal/Duration/compare/calendar-possibly-required.js: + default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' + strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/compare/options-wrong-type.js: ++ default: 'Test262Error: TypeError on wrong options type object Expected a TypeError to be thrown but no exception was thrown at all' ++ strict mode: 'Test262Error: TypeError on wrong options type object Expected a TypeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/Duration/compare/relativeto-hour.js: ++ default: 'TypeError: Right side of assignment cannot be destructured' ++ strict mode: 'TypeError: Right side of assignment cannot be destructured' ++test/built-ins/Temporal/Duration/compare/relativeto-month.js: ++ default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/compare/relativeto-propertybag-invalid.js: ++ default: 'Test262Error: missing year Expected a TypeError to be thrown but no exception was thrown at all' ++ strict mode: 'Test262Error: missing year Expected a TypeError to be thrown but no exception was thrown at all' + test/built-ins/Temporal/Duration/compare/relativeto-propertybag-timezone-getoffsetnanosecondsfor-not-callable.js: + default: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError but got a RangeError' + strict mode: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError but got a RangeError' ++test/built-ins/Temporal/Duration/compare/relativeto-year.js: ++ default: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot compare a duration of years, months, or weeks without a relativeTo option' + test/built-ins/Temporal/Duration/compare/relativeto-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" +-test/built-ins/Temporal/Duration/fractional-throws-rangeerror.js: +- default: 'Test262Error: Duration constructor throws RangeError with fractional value in the years position Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: Duration constructor throws RangeError with fractional value in the years position Expected a RangeError to be thrown but no exception was thrown at all' +-test/built-ins/Temporal/Duration/prototype/add/argument-string-fractional-units-rounding-mode.js: +- default: 'Test262Error: negative fractional units rounded with correct rounding mode microseconds result Expected SameValue(«-0», «0») to be true' +- strict mode: 'Test262Error: negative fractional units rounded with correct rounding mode microseconds result Expected SameValue(«-0», «0») to be true' ++test/built-ins/Temporal/Duration/compare/timezone-string-leap-second.js: ++ default: 'Test262Error: leap second in time zone name not valid Expected a RangeError to be thrown but no exception was thrown at all' ++ strict mode: 'Test262Error: leap second in time zone name not valid Expected a RangeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/Duration/compare/timezone-string-year-zero.js: ++ default: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' ++ strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/Duration/compare/timezone-wrong-type.js: ++ default: 'Test262Error: null does not convert to a valid ISO string Expected a RangeError to be thrown but no exception was thrown at all' ++ strict mode: 'Test262Error: null does not convert to a valid ISO string Expected a RangeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/Duration/compare/twenty-five-hour-day.js: ++ default: 'TypeError: Right side of assignment cannot be destructured' ++ strict mode: 'TypeError: Right side of assignment cannot be destructured' + test/built-ins/Temporal/Duration/prototype/add/calendar-dateadd-called-with-plaindate-instance.js: + default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' + strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/add/options-wrong-type.js: ++ default: 'Test262Error: TypeError on wrong options type object Expected a TypeError to be thrown but no exception was thrown at all' ++ strict mode: 'Test262Error: TypeError on wrong options type object Expected a TypeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/Duration/prototype/add/relativeto-leap-second.js: ++ default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/add/relativeto-month.js: ++ default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/add/relativeto-number.js: ++ default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/add/relativeto-order.js: ++ default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-number.js: ++ default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-wrong-type.js: ++ default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" ++ strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" + test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-timezone-getoffsetnanosecondsfor-not-callable.js: + default: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError but got a RangeError' + strict mode: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError but got a RangeError' ++test/built-ins/Temporal/Duration/prototype/add/relativeto-required.js: ++ default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/add/relativeto-wrong-type.js: ++ default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" ++ strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" ++test/built-ins/Temporal/Duration/prototype/add/relativeto-year.js: ++ default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' + test/built-ins/Temporal/Duration/prototype/add/relativeto-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" ++test/built-ins/Temporal/Duration/prototype/add/timezone-string-leap-second.js: ++ default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/add/timezone-wrong-type.js: ++ default: 'Test262Error: symbol is not a valid object and does not convert to a string Expected a TypeError but got a RangeError' ++ strict mode: 'Test262Error: symbol is not a valid object and does not convert to a string Expected a TypeError but got a RangeError' ++test/built-ins/Temporal/Duration/prototype/round/calendar-dateadd-called-with-options-undefined.js: ++ default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone, calendar)')" ++ strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone, calendar)')" + test/built-ins/Temporal/Duration/prototype/round/calendar-dateadd-called-with-plaindate-instance.js: + default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' + strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' + test/built-ins/Temporal/Duration/prototype/round/calendar-possibly-required.js: + default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' + strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' ++test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-default.js: ++ default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' ++ strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' ++test/built-ins/Temporal/Duration/prototype/round/relativeto-leap-second.js: ++ default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' ++ strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' ++test/built-ins/Temporal/Duration/prototype/round/relativeto-number.js: ++ default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' ++ strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' ++test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-number.js: ++ default: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' ++ strict mode: 'Error: FIXME: years, months, or weeks rounding with relativeTo not implemented yet' ++test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-wrong-type.js: ++ default: 'Test262Error: null does not convert to a valid ISO string Expected a RangeError but got a Error' ++ strict mode: 'Test262Error: null does not convert to a valid ISO string Expected a RangeError but got a Error' + test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-timezone-getoffsetnanosecondsfor-not-callable.js: + default: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError but got a Error' + strict mode: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError but got a Error' ++test/built-ins/Temporal/Duration/prototype/round/relativeto-wrong-type.js: ++ default: 'Test262Error: undefined does not convert to a valid ISO string Expected a RangeError but got a Error' ++ strict mode: 'Test262Error: undefined does not convert to a valid ISO string Expected a RangeError but got a Error' + test/built-ins/Temporal/Duration/prototype/round/relativeto-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" +-test/built-ins/Temporal/Duration/prototype/round/smallestunit-disallowed-units-string.js: +- default: 'Test262Error: "era" should not be allowed as an argument to round Expected a RangeError but got a TypeError' +- strict mode: 'Test262Error: "era" should not be allowed as an argument to round Expected a RangeError but got a TypeError' +-test/built-ins/Temporal/Duration/prototype/round/smallestunit-plurals-accepted-string.js: +- default: 'TypeError: options argument is not an object or undefined' +- strict mode: 'TypeError: options argument is not an object or undefined' +-test/built-ins/Temporal/Duration/prototype/round/smallestunit-string-shorthand-string.js: +- default: 'TypeError: options argument is not an object or undefined' +- strict mode: 'TypeError: options argument is not an object or undefined' ++test/built-ins/Temporal/Duration/prototype/round/timezone-string-leap-second.js: ++ default: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot round a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/round/timezone-wrong-type.js: ++ default: 'Test262Error: symbol is not a valid object and does not convert to a string Expected a TypeError but got a RangeError' ++ strict mode: 'Test262Error: symbol is not a valid object and does not convert to a string Expected a TypeError but got a RangeError' + test/built-ins/Temporal/Duration/prototype/round/year-zero.js: + default: 'Test262Error: reject minus zero as extended year Expected a RangeError but got a Error' + strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError but got a Error' +-test/built-ins/Temporal/Duration/prototype/subtract/argument-string-fractional-units-rounding-mode.js: +- default: 'Test262Error: positive fractional units rounded with correct rounding mode microseconds result Expected SameValue(«-0», «0») to be true' +- strict mode: 'Test262Error: positive fractional units rounded with correct rounding mode microseconds result Expected SameValue(«-0», «0») to be true' + test/built-ins/Temporal/Duration/prototype/subtract/calendar-dateadd-called-with-plaindate-instance.js: + default: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' + strict mode: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/subtract/options-wrong-type.js: ++ default: 'Test262Error: TypeError on wrong options type object Expected a TypeError to be thrown but no exception was thrown at all' ++ strict mode: 'Test262Error: TypeError on wrong options type object Expected a TypeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/Duration/prototype/subtract/relativeto-leap-second.js: ++ default: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/subtract/relativeto-month.js: ++ default: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/subtract/relativeto-number.js: ++ default: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/subtract/relativeto-order.js: ++ default: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-number.js: ++ default: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-wrong-type.js: ++ default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" ++ strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" + test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-timezone-getoffsetnanosecondsfor-not-callable.js: + default: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError but got a RangeError' + strict mode: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError but got a RangeError' ++test/built-ins/Temporal/Duration/prototype/subtract/relativeto-required.js: ++ default: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/subtract/relativeto-wrong-type.js: ++ default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" ++ strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" ++test/built-ins/Temporal/Duration/prototype/subtract/relativeto-year.js: ++ default: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' + test/built-ins/Temporal/Duration/prototype/subtract/relativeto-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" +-test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-exact-number-of-digits.js: +- default: 'Test262Error: Expected SameValue(«P3Y», «P3YT0S») to be true' +- strict mode: 'Test262Error: Expected SameValue(«P3Y», «P3YT0S») to be true' ++test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-leap-second.js: ++ default: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot subtract a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/subtract/timezone-wrong-type.js: ++ default: 'Test262Error: symbol is not a valid object and does not convert to a string Expected a TypeError but got a RangeError' ++ strict mode: 'Test262Error: symbol is not a valid object and does not convert to a string Expected a TypeError but got a RangeError' ++test/built-ins/Temporal/Duration/prototype/total/calendar-dateadd-called-with-options-undefined.js: ++ default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone, calendar)')" ++ strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(0n, timeZone, calendar)')" + test/built-ins/Temporal/Duration/prototype/total/calendar-dateadd-called-with-plaindate-instance.js: + default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' + strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' + test/built-ins/Temporal/Duration/prototype/total/calendar-possibly-required.js: + default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' + strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/total/relativeto-leap-second.js: ++ default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/total/relativeto-number.js: ++ default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-number.js: ++ default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-wrong-type.js: ++ default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" ++ strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" + test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-timezone-getoffsetnanosecondsfor-not-callable.js: + default: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError but got a RangeError' + strict mode: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError but got a RangeError' +-test/built-ins/Temporal/Duration/prototype/total/relativeto-undefined-throw-on-calendar-units.js: +- default: 'TypeError: options argument is not an object or undefined' +- strict mode: 'TypeError: options argument is not an object or undefined' ++test/built-ins/Temporal/Duration/prototype/total/relativeto-wrong-type.js: ++ default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" ++ strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.prototype')" + test/built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" +-test/built-ins/Temporal/Duration/prototype/total/unit-disallowed-units-string.js: +- default: 'Test262Error: "era" should not be allowed as an argument to total Expected a RangeError but got a TypeError' +- strict mode: 'Test262Error: "era" should not be allowed as an argument to total Expected a RangeError but got a TypeError' ++test/built-ins/Temporal/Duration/prototype/total/timezone-string-leap-second.js: ++ default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' ++ strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' ++test/built-ins/Temporal/Duration/prototype/total/timezone-wrong-type.js: ++ default: 'Test262Error: symbol is not a valid object and does not convert to a string Expected a TypeError but got a RangeError' ++ strict mode: 'Test262Error: symbol is not a valid object and does not convert to a string Expected a TypeError but got a RangeError' + test/built-ins/Temporal/Duration/prototype/total/unit-plurals-accepted-string.js: +- default: 'TypeError: options argument is not an object or undefined' +- strict mode: 'TypeError: options argument is not an object or undefined' +-test/built-ins/Temporal/Duration/prototype/total/unit-string-shorthand-string.js: +- default: 'TypeError: options argument is not an object or undefined' +- strict mode: 'TypeError: options argument is not an object or undefined' +-test/built-ins/Temporal/Instant/compare/year-zero.js: +- default: 'Test262Error: minus zero is invalid extended year (first argument) Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: minus zero is invalid extended year (first argument) Expected a RangeError to be thrown but no exception was thrown at all' +-test/built-ins/Temporal/Instant/from/year-zero.js: +- default: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +-test/built-ins/Temporal/Instant/prototype/equals/year-zero.js: +- default: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +-test/built-ins/Temporal/Instant/prototype/round/smallestunit-disallowed-units.js: +- default: 'Test262Error: "era" should not be allowed as an argument to round Expected a RangeError but got a TypeError' +- strict mode: 'Test262Error: "era" should not be allowed as an argument to round Expected a RangeError but got a TypeError' +-test/built-ins/Temporal/Instant/prototype/round/smallestunit-plurals-accepted.js: +- default: 'TypeError: options argument is not an object or undefined' +- strict mode: 'TypeError: options argument is not an object or undefined' +-test/built-ins/Temporal/Instant/prototype/round/smallestunit-string-shorthand.js: +- default: 'TypeError: options argument is not an object or undefined' +- strict mode: 'TypeError: options argument is not an object or undefined' +-test/built-ins/Temporal/Instant/prototype/since/largestunit-invalid-string.js: +- default: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' ++ default: 'TypeError: Right hand side of instanceof is not an object' ++ strict mode: 'TypeError: Right hand side of instanceof is not an object' ++test/built-ins/Temporal/Instant/prototype/round/rounding-direction.js: ++ default: 'Test262Error: Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode trunc) Expected SameValue(«-65261246399000000000», «-65261246400000000000») to be true' ++ strict mode: 'Test262Error: Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode trunc) Expected SameValue(«-65261246399000000000», «-65261246400000000000») to be true' + test/built-ins/Temporal/Instant/prototype/since/largestunit.js: + default: 'Test262Error: does not include higher units than necessary (largest unit unspecified) nanoseconds result Expected SameValue(«40», «101») to be true' + strict mode: 'Test262Error: does not include higher units than necessary (largest unit unspecified) nanoseconds result Expected SameValue(«40», «101») to be true' +-test/built-ins/Temporal/Instant/prototype/since/smallestunit-invalid-string.js: +- default: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' +-test/built-ins/Temporal/Instant/prototype/since/year-zero.js: +- default: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' + test/built-ins/Temporal/Instant/prototype/toJSON/timezone-getoffsetnanosecondsfor-not-callable.js: + default: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/Instant/prototype/toJSON/year-format.js: ++ default: 'Test262Error: year 0 formatted as 4-digit Expected SameValue(«+000000-07-01T21:30:36Z», «0000-07-01T21:30:36Z») to be true' ++ strict mode: 'Test262Error: year 0 formatted as 4-digit Expected SameValue(«+000000-07-01T21:30:36Z», «0000-07-01T21:30:36Z») to be true' ++test/built-ins/Temporal/Instant/prototype/toString/rounding-direction.js: ++ default: 'Test262Error: Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode trunc) Expected SameValue(«-000099-12-15T12:00:01Z», «-000099-12-15T12:00:00Z») to be true' ++ strict mode: 'Test262Error: Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode trunc) Expected SameValue(«-000099-12-15T12:00:01Z», «-000099-12-15T12:00:00Z») to be true' + test/built-ins/Temporal/Instant/prototype/toString/timezone-getoffsetnanosecondsfor-not-callable.js: + default: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: Uncallable undefined getOffsetNanosecondsFor should throw TypeError Expected a TypeError to be thrown but no exception was thrown at all' + test/built-ins/Temporal/Instant/prototype/toString/timezone-offset.js: + default: 'Test262Error: offset of UTC is +00:00 Expected SameValue(«1970-01-01T00:00:00Z», «1970-01-01T00:00:00+00:00») to be true' + strict mode: 'Test262Error: offset of UTC is +00:00 Expected SameValue(«1970-01-01T00:00:00Z», «1970-01-01T00:00:00+00:00») to be true' ++test/built-ins/Temporal/Instant/prototype/toString/timezone-string-leap-second.js: ++ default: 'RangeError: argument needs to be UTC offset string, TimeZone identifier, or temporal Instant string' ++ strict mode: 'RangeError: argument needs to be UTC offset string, TimeZone identifier, or temporal Instant string' + test/built-ins/Temporal/Instant/prototype/toString/timezone-string-multiple-offsets.js: + default: 'RangeError: argument needs to be UTC offset string, TimeZone identifier, or temporal Instant string' + strict mode: 'RangeError: argument needs to be UTC offset string, TimeZone identifier, or temporal Instant string' +-test/built-ins/Temporal/Instant/prototype/until/largestunit-invalid-string.js: +- default: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' +-test/built-ins/Temporal/Instant/prototype/until/smallestunit-invalid-string.js: +- default: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: Expected a RangeError to be thrown but no exception was thrown at all' +-test/built-ins/Temporal/Instant/prototype/until/year-zero.js: +- default: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/Instant/prototype/toString/year-format.js: ++ default: 'Test262Error: year 0 formatted as 4-digit Expected SameValue(«+000000-07-01T21:30:36Z», «0000-07-01T21:30:36Z») to be true' ++ strict mode: 'Test262Error: year 0 formatted as 4-digit Expected SameValue(«+000000-07-01T21:30:36Z», «0000-07-01T21:30:36Z») to be true' + test/built-ins/Temporal/PlainTime/compare/argument-cast.js: + default: 'TypeError: "microsecond" field is missing' + strict mode: 'TypeError: "microsecond" field is missing' +@@ -972,12 +1080,18 @@ test/built-ins/Temporal/PlainTime/compare/argument-string-time-designator-requir + test/built-ins/Temporal/PlainTime/compare/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" ++test/built-ins/Temporal/PlainTime/compare/leap-second.js: ++ default: 'TypeError: "microsecond" field is missing' ++ strict mode: 'TypeError: "microsecond" field is missing' + test/built-ins/Temporal/PlainTime/compare/plaintime-propertybag-no-time-units.js: + default: 'TypeError: "hour" field is missing' + strict mode: 'TypeError: "hour" field is missing' +-test/built-ins/Temporal/PlainTime/compare/year-zero.js: +- default: 'Test262Error: Cannot use minus zero as extended year (first argument) Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: Cannot use minus zero as extended year (first argument) Expected a RangeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/PlainTime/from/argument-object-leap-second.js: ++ default: 'TypeError: "microsecond" field is missing' ++ strict mode: 'TypeError: "microsecond" field is missing' ++test/built-ins/Temporal/PlainTime/from/argument-object.js: ++ default: 'TypeError: "microsecond" field is missing' ++ strict mode: 'TypeError: "microsecond" field is missing' + test/built-ins/Temporal/PlainTime/from/argument-plaindatetime.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321, calendar)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321, calendar)')" +@@ -990,9 +1104,18 @@ test/built-ins/Temporal/PlainTime/from/argument-string-with-calendar.js: + test/built-ins/Temporal/PlainTime/from/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" ++test/built-ins/Temporal/PlainTime/from/leap-second.js: ++ default: 'TypeError: "microsecond" field is missing' ++ strict mode: 'TypeError: "microsecond" field is missing' + test/built-ins/Temporal/PlainTime/from/options-undefined.js: + default: 'TypeError: "microsecond" field is missing' + strict mode: 'TypeError: "microsecond" field is missing' ++test/built-ins/Temporal/PlainTime/from/overflow-constrain.js: ++ default: 'TypeError: "microsecond" field is missing' ++ strict mode: 'TypeError: "microsecond" field is missing' ++test/built-ins/Temporal/PlainTime/from/overflow-reject.js: ++ default: 'Test262Error: Expected a RangeError but got a TypeError' ++ strict mode: 'Test262Error: Expected a RangeError but got a TypeError' + test/built-ins/Temporal/PlainTime/from/overflow-undefined.js: + default: 'TypeError: "microsecond" field is missing' + strict mode: 'TypeError: "microsecond" field is missing' +@@ -1002,63 +1125,72 @@ test/built-ins/Temporal/PlainTime/from/overflow-wrong-type.js: + test/built-ins/Temporal/PlainTime/from/plaintime-propertybag-no-time-units.js: + default: 'TypeError: "hour" field is missing' + strict mode: 'TypeError: "hour" field is missing' +-test/built-ins/Temporal/PlainTime/from/year-zero.js: +- default: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' + test/built-ins/Temporal/PlainTime/prototype/equals/argument-cast.js: + default: 'TypeError: "microsecond" field is missing' + strict mode: 'TypeError: "microsecond" field is missing' + test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-designator-required-for-disambiguation.js: + default: 'Test262Error: 2021-12 is ambiguous and requires T prefix Expected a RangeError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: 2021-12 is ambiguous and requires T prefix Expected a RangeError to be thrown but no exception was thrown at all' +-test/built-ins/Temporal/PlainTime/prototype/equals/argument-wrong-type.js: +- default: 'TypeError: "hour" field is missing' +- strict mode: 'TypeError: "hour" field is missing' + test/built-ins/Temporal/PlainTime/prototype/equals/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" ++test/built-ins/Temporal/PlainTime/prototype/equals/leap-second.js: ++ default: 'TypeError: "microsecond" field is missing' ++ strict mode: 'TypeError: "microsecond" field is missing' + test/built-ins/Temporal/PlainTime/prototype/equals/plaintime-propertybag-no-time-units.js: + default: 'TypeError: "hour" field is missing' + strict mode: 'TypeError: "hour" field is missing' +-test/built-ins/Temporal/PlainTime/prototype/equals/year-zero.js: +- default: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +-test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-disallowed-units.js: +- default: 'Test262Error: "era" should not be allowed as an argument to round Expected a RangeError but got a TypeError' +- strict mode: 'Test262Error: "era" should not be allowed as an argument to round Expected a RangeError but got a TypeError' +-test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-string-shorthand.js: +- default: 'TypeError: options argument is not an object or undefined' +- strict mode: 'TypeError: options argument is not an object or undefined' ++test/built-ins/Temporal/PlainTime/prototype/since/argument-cast.js: ++ default: 'TypeError: "microsecond" field is missing' ++ strict mode: 'TypeError: "microsecond" field is missing' + test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-designator-required-for-disambiguation.js: + default: 'Test262Error: 2021-12 is ambiguous and requires T prefix Expected a RangeError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: 2021-12 is ambiguous and requires T prefix Expected a RangeError to be thrown but no exception was thrown at all' + test/built-ins/Temporal/PlainTime/prototype/since/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" ++test/built-ins/Temporal/PlainTime/prototype/since/leap-second.js: ++ default: 'TypeError: "microsecond" field is missing' ++ strict mode: 'TypeError: "microsecond" field is missing' + test/built-ins/Temporal/PlainTime/prototype/since/plaintime-propertybag-no-time-units.js: + default: 'TypeError: "hour" field is missing' + strict mode: 'TypeError: "hour" field is missing' +-test/built-ins/Temporal/PlainTime/prototype/since/year-zero.js: +- default: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' ++test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-ceil.js: ++ default: 'Test262Error: hours hours result Expected SameValue(«4», «5») to be true' ++ strict mode: 'Test262Error: hours hours result Expected SameValue(«4», «5») to be true' ++test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-floor.js: ++ default: 'Test262Error: hours hours result Expected SameValue(«5», «4») to be true' ++ strict mode: 'Test262Error: hours hours result Expected SameValue(«5», «4») to be true' ++test/built-ins/Temporal/PlainTime/prototype/until/argument-cast.js: ++ default: 'TypeError: "microsecond" field is missing' ++ strict mode: 'TypeError: "microsecond" field is missing' + test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-designator-required-for-disambiguation.js: + default: 'Test262Error: 2021-12 is ambiguous and requires T prefix Expected a RangeError to be thrown but no exception was thrown at all' + strict mode: 'Test262Error: 2021-12 is ambiguous and requires T prefix Expected a RangeError to be thrown but no exception was thrown at all' +-test/built-ins/Temporal/PlainTime/prototype/until/argument-string-with-time-designator.js: +- default: 'Test262Error: T prefix is accepted: T00:30 hours result Expected SameValue(«-0», «0») to be true' +- strict mode: 'Test262Error: T prefix is accepted: T00:30 hours result Expected SameValue(«-0», «0») to be true' + test/built-ins/Temporal/PlainTime/prototype/until/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, timeZone)')" ++test/built-ins/Temporal/PlainTime/prototype/until/leap-second.js: ++ default: 'TypeError: "microsecond" field is missing' ++ strict mode: 'TypeError: "microsecond" field is missing' + test/built-ins/Temporal/PlainTime/prototype/until/plaintime-propertybag-no-time-units.js: + default: 'TypeError: "hour" field is missing' + strict mode: 'TypeError: "hour" field is missing' +-test/built-ins/Temporal/PlainTime/prototype/until/year-zero.js: +- default: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: reject minus zero as extended year Expected a RangeError to be thrown but no exception was thrown at all' + test/built-ins/Temporal/getOwnPropertyNames.js: + default: 'Test262Error: PlainDateTime' + strict mode: 'Test262Error: PlainDateTime' ++test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js: ++ default: 'TypeError: Underlying ArrayBuffer has been detached from the view (Testing with Float64Array.)' ++ strict mode: 'TypeError: Underlying ArrayBuffer has been detached from the view (Testing with Float64Array.)' ++test/built-ins/TypedArray/prototype/sort/sort-tonumber.js: ++ default: 'TypeError: Underlying ArrayBuffer has been detached from the view (Testing with Float64Array.)' ++ strict mode: 'TypeError: Underlying ArrayBuffer has been detached from the view (Testing with Float64Array.)' ++test/built-ins/TypedArrayConstructors/ctors/no-species.js: ++ default: 'Test262Error: unreachable' ++ strict mode: 'Test262Error: unreachable' ++test/harness/temporalHelpers-one-shift-time-zone.js: ++ default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.PlainDateTime(2021, 3, 28, 1)')" ++ strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.PlainDateTime(2021, 3, 28, 1)')" + test/intl402/DateTimeFormat/prototype/format/temporal-objects-timezone-getoffsetnanosecondsfor-not-callable.js: + default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.PlainDateTime(2021, 8, 4, 0, 30, 45, 123, 456, 789)')" + strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.PlainDateTime(2021, 8, 4, 0, 30, 45, 123, 456, 789)')" +@@ -1080,12 +1212,18 @@ test/intl402/DateTimeFormat/prototype/formatToParts/temporal-objects-timezone-ge + test/intl402/DateTimeFormat/prototype/resolvedOptions/hourCycle-default.js: + default: 'Test262Error: Expected SameValue(«h24», «h23») to be true' + strict mode: 'Test262Error: Expected SameValue(«h24», «h23») to be true' ++test/intl402/Intl/DateTimeFormat/prototype/formatRange/fails-on-distinct-temporal-types.js: ++ default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321)')" ++ strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321)')" ++test/intl402/Intl/DateTimeFormat/prototype/formatRangeToParts/fails-on-distinct-temporal-types.js: ++ default: "TypeError: undefined is not a constructor (evaluating 'new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321)')" ++ strict mode: "TypeError: undefined is not a constructor (evaluating 'new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321)')" + test/intl402/Intl/getCanonicalLocales/non-iana-canon.js: + default: 'Test262Error: The value of Intl.getCanonicalLocales(tag)[0] equals the value of `canonical` Expected SameValue(«en-US-u-va-posix», «posix») to be true' + strict mode: 'Test262Error: The value of Intl.getCanonicalLocales(tag)[0] equals the value of `canonical` Expected SameValue(«en-US-u-va-posix», «posix») to be true' + test/intl402/Intl/getCanonicalLocales/preferred-grandfathered.js: +- default: 'Test262Error: Expected SameValue(«xtg-x-cel-gaulish», «xtg») to be true' +- strict mode: 'Test262Error: Expected SameValue(«xtg-x-cel-gaulish», «xtg») to be true' ++ default: 'Test262Error: Expected SameValue(«cel-gaulish», «xtg») to be true' ++ strict mode: 'Test262Error: Expected SameValue(«cel-gaulish», «xtg») to be true' + test/intl402/Intl/getCanonicalLocales/transformed-ext-canonical.js: + default: 'Test262Error: Expected SameValue(«sl-t-sl-rozaj-biske-1994», «sl-t-sl-1994-biske-rozaj») to be true' + strict mode: 'Test262Error: Expected SameValue(«sl-t-sl-rozaj-biske-1994», «sl-t-sl-1994-biske-rozaj») to be true' +@@ -1096,95 +1234,26 @@ test/intl402/Intl/getCanonicalLocales/unicode-ext-canonicalize-subdivision.js: + default: 'Test262Error: Expected SameValue(«und-NO-u-sd-no23», «und-NO-u-sd-no50») to be true' + strict mode: 'Test262Error: Expected SameValue(«und-NO-u-sd-no23», «und-NO-u-sd-no50») to be true' + test/intl402/Locale/extensions-grandfathered.js: +- default: 'Test262Error: Expected SameValue(«fr-Cyrl-FR-u-nu-latn-x-cel-gaulish», «fr-Cyrl-FR-u-nu-latn») to be true' +- strict mode: 'Test262Error: Expected SameValue(«fr-Cyrl-FR-u-nu-latn-x-cel-gaulish», «fr-Cyrl-FR-u-nu-latn») to be true' ++ default: 'Test262Error: Expected SameValue(«fr-Cyrl-FR-gaulish-u-nu-latn», «fr-Cyrl-FR-u-nu-latn») to be true' ++ strict mode: 'Test262Error: Expected SameValue(«fr-Cyrl-FR-gaulish-u-nu-latn», «fr-Cyrl-FR-u-nu-latn») to be true' ++test/intl402/Locale/getters-grandfathered.js: ++ default: 'Test262Error: Expected SameValue(«cel-gaulish», «xtg») to be true' ++ strict mode: 'Test262Error: Expected SameValue(«cel-gaulish», «xtg») to be true' + test/intl402/Locale/likely-subtags-grandfathered.js: +- default: 'Test262Error: Expected SameValue(«xtg-x-cel-gaulish», «xtg») to be true' +- strict mode: 'Test262Error: Expected SameValue(«xtg-x-cel-gaulish», «xtg») to be true' ++ default: 'Test262Error: Expected SameValue(«cel-gaulish», «xtg») to be true' ++ strict mode: 'Test262Error: Expected SameValue(«cel-gaulish», «xtg») to be true' + test/intl402/Locale/prototype/minimize/removing-likely-subtags-first-adds-likely-subtags.js: + default: 'Test262Error: "und".minimize() should be "en" Expected SameValue(«en-u-va-posix», «en») to be true' + strict mode: 'Test262Error: "und".minimize() should be "en" Expected SameValue(«en-u-va-posix», «en») to be true' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-10.js: +- default: 'Test262Error: Formatted value for 1.100, en-US-u-nu-arab and options {"roundingIncrement":10,"maximumFractionDigits":2} is ١٫١٠; expected ١٫١.' +- strict mode: 'Test262Error: Formatted value for 1.100, en-US-u-nu-arab and options {"roundingIncrement":10,"maximumFractionDigits":2} is ١٫١٠; expected ١٫١.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-100.js: +- default: 'Test262Error: Formatted value for 1.100, en-US-u-nu-arab and options {"roundingIncrement":100,"maximumFractionDigits":3} is ١٫١٠٠; expected ١٫١.' +- strict mode: 'Test262Error: Formatted value for 1.100, en-US-u-nu-arab and options {"roundingIncrement":100,"maximumFractionDigits":3} is ١٫١٠٠; expected ١٫١.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-1000.js: +- default: 'Test262Error: Formatted value for 1.100, en-US-u-nu-arab and options {"roundingIncrement":1000,"maximumFractionDigits":4} is ١٫١٠٠٠; expected ١٫١.' +- strict mode: 'Test262Error: Formatted value for 1.100, en-US-u-nu-arab and options {"roundingIncrement":1000,"maximumFractionDigits":4} is ١٫١٠٠٠; expected ١٫١.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-20.js: +- default: 'Test262Error: Formatted value for 1.20, en-US-u-nu-arab and options {"roundingIncrement":20,"maximumFractionDigits":2} is ١٫٢٠; expected ١٫٢.' +- strict mode: 'Test262Error: Formatted value for 1.20, en-US-u-nu-arab and options {"roundingIncrement":20,"maximumFractionDigits":2} is ١٫٢٠; expected ١٫٢.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-200.js: +- default: 'Test262Error: Formatted value for 1.20, en-US-u-nu-arab and options {"roundingIncrement":200,"maximumFractionDigits":3} is ١٫٢٠٠; expected ١٫٢.' +- strict mode: 'Test262Error: Formatted value for 1.20, en-US-u-nu-arab and options {"roundingIncrement":200,"maximumFractionDigits":3} is ١٫٢٠٠; expected ١٫٢.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-2000.js: +- default: 'Test262Error: Formatted value for 1.20, en-US-u-nu-arab and options {"roundingIncrement":2000,"maximumFractionDigits":4} is ١٫٢٠٠٠; expected ١٫٢.' +- strict mode: 'Test262Error: Formatted value for 1.20, en-US-u-nu-arab and options {"roundingIncrement":2000,"maximumFractionDigits":4} is ١٫٢٠٠٠; expected ١٫٢.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-25.js: +- default: 'Test262Error: Formatted value for 1.3750, en-US-u-nu-arab and options {"roundingIncrement":25,"maximumFractionDigits":2,"minimumFractionDigits":1} is ١٫٥٠; expected ١٫٥.' +- strict mode: 'Test262Error: Formatted value for 1.3750, en-US-u-nu-arab and options {"roundingIncrement":25,"maximumFractionDigits":2,"minimumFractionDigits":1} is ١٫٥٠; expected ١٫٥.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-250.js: +- default: 'Test262Error: Formatted value for 1.2500, en-US-u-nu-arab and options {"roundingIncrement":250,"maximumFractionDigits":3,"minimumFractionDigits":1} is ١٫٢٥٠; expected ١٫٢٥.' +- strict mode: 'Test262Error: Formatted value for 1.2500, en-US-u-nu-arab and options {"roundingIncrement":250,"maximumFractionDigits":3,"minimumFractionDigits":1} is ١٫٢٥٠; expected ١٫٢٥.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-2500.js: +- default: 'Test262Error: Formatted value for 1.2500, en-US-u-nu-arab and options {"roundingIncrement":2500,"maximumFractionDigits":4,"minimumFractionDigits":1} is ١٫٢٥٠٠; expected ١٫٢٥.' +- strict mode: 'Test262Error: Formatted value for 1.2500, en-US-u-nu-arab and options {"roundingIncrement":2500,"maximumFractionDigits":4,"minimumFractionDigits":1} is ١٫٢٥٠٠; expected ١٫٢٥.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-5.js: +- default: 'Test262Error: Formatted value for 1.0750, en-US-u-nu-arab and options {"roundingIncrement":5,"maximumFractionDigits":2} is ١٫١٠; expected ١٫١.' +- strict mode: 'Test262Error: Formatted value for 1.0750, en-US-u-nu-arab and options {"roundingIncrement":5,"maximumFractionDigits":2} is ١٫١٠; expected ١٫١.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-50.js: +- default: 'Test262Error: Formatted value for 1.500, en-US-u-nu-arab and options {"roundingIncrement":50,"maximumFractionDigits":2,"minimumFractionDigits":1} is ١٫٥٠; expected ١٫٥.' +- strict mode: 'Test262Error: Formatted value for 1.500, en-US-u-nu-arab and options {"roundingIncrement":50,"maximumFractionDigits":2,"minimumFractionDigits":1} is ١٫٥٠; expected ١٫٥.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-500.js: +- default: 'Test262Error: Formatted value for 1.500, en-US-u-nu-arab and options {"roundingIncrement":500,"maximumFractionDigits":3,"minimumFractionDigits":1} is ١٫٥٠٠; expected ١٫٥.' +- strict mode: 'Test262Error: Formatted value for 1.500, en-US-u-nu-arab and options {"roundingIncrement":500,"maximumFractionDigits":3,"minimumFractionDigits":1} is ١٫٥٠٠; expected ١٫٥.' +-test/intl402/NumberFormat/prototype/format/format-rounding-increment-5000.js: +- default: 'Test262Error: Formatted value for 1.500, en-US-u-nu-arab and options {"roundingIncrement":5000,"maximumFractionDigits":4,"minimumFractionDigits":1} is ١٫٥٠٠٠; expected ١٫٥.' +- strict mode: 'Test262Error: Formatted value for 1.500, en-US-u-nu-arab and options {"roundingIncrement":5000,"maximumFractionDigits":4,"minimumFractionDigits":1} is ١٫٥٠٠٠; expected ١٫٥.' +-test/intl402/NumberFormat/prototype/format/format-rounding-mode-half-ceil.js: +- default: 'Test262Error: Formatted value for -1.15, en-US-u-nu-arab and options {"useGrouping":false,"roundingMode":"halfCeil","maximumSignificantDigits":2} is ؜-١٫٢; expected ؜-١٫١.' +- strict mode: 'Test262Error: Formatted value for -1.15, en-US-u-nu-arab and options {"useGrouping":false,"roundingMode":"halfCeil","maximumSignificantDigits":2} is ؜-١٫٢; expected ؜-١٫١.' +-test/intl402/NumberFormat/prototype/format/format-rounding-mode-half-floor.js: +- default: 'Test262Error: Formatted value for 1.15, en-US-u-nu-arab and options {"useGrouping":false,"roundingMode":"halfFloor","maximumSignificantDigits":2} is ١٫٢; expected ١٫١.' +- strict mode: 'Test262Error: Formatted value for 1.15, en-US-u-nu-arab and options {"useGrouping":false,"roundingMode":"halfFloor","maximumSignificantDigits":2} is ١٫٢; expected ١٫١.' ++test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js: ++ default: 'Test262Error: "maximumFractionDigits" is not equal to "minimumFractionDigits" Expected a RangeError to be thrown but no exception was thrown at all' ++ strict mode: 'Test262Error: "maximumFractionDigits" is not equal to "minimumFractionDigits" Expected a RangeError to be thrown but no exception was thrown at all' + test/intl402/NumberFormat/prototype/format/format-rounding-priority-less-precision.js: +- default: 'Test262Error: Formatted value for 1, en-US-u-nu-arab and options {"useGrouping":false,"roundingPriority":"lessPrecision","minimumSignificantDigits":2,"minimumFractionDigits":2} is ١; expected ١٫٠٠.' +- strict mode: 'Test262Error: Formatted value for 1, en-US-u-nu-arab and options {"useGrouping":false,"roundingPriority":"lessPrecision","minimumSignificantDigits":2,"minimumFractionDigits":2} is ١; expected ١٫٠٠.' ++ default: 'Test262Error: Formatted value for 1, en-US-u-nu-arab and options {"useGrouping":false,"roundingPriority":"lessPrecision","minimumSignificantDigits":3,"minimumFractionDigits":1} is ١٫٠٠; expected ١٫٠.' ++ strict mode: 'Test262Error: Formatted value for 1, en-US-u-nu-arab and options {"useGrouping":false,"roundingPriority":"lessPrecision","minimumSignificantDigits":3,"minimumFractionDigits":1} is ١٫٠٠; expected ١٫٠.' + test/intl402/NumberFormat/prototype/format/format-rounding-priority-more-precision.js: +- default: 'Test262Error: Formatted value for 1, en-US-u-nu-arab and options {"useGrouping":false,"roundingPriority":"morePrecision","minimumSignificantDigits":2,"minimumFractionDigits":2} is ١; expected ١٫٠٠.' +- strict mode: 'Test262Error: Formatted value for 1, en-US-u-nu-arab and options {"useGrouping":false,"roundingPriority":"morePrecision","minimumSignificantDigits":2,"minimumFractionDigits":2} is ١; expected ١٫٠٠.' +-test/intl402/NumberFormat/prototype/format/signDisplay-negative-currency-de-DE.js: +- default: 'Test262Error: Expected SameValue(«-0,00 $», «0,00 $») to be true' +- strict mode: 'Test262Error: Expected SameValue(«-0,00 $», «0,00 $») to be true' +-test/intl402/NumberFormat/prototype/format/signDisplay-negative-currency-en-US.js: +- default: 'Test262Error: Expected SameValue(«-$987.00», «($987.00)») to be true' +- strict mode: 'Test262Error: Expected SameValue(«-$987.00», «($987.00)») to be true' +-test/intl402/NumberFormat/prototype/format/signDisplay-negative-currency-ja-JP.js: +- default: 'Test262Error: Expected SameValue(«-$987.00», «($987.00)») to be true' +- strict mode: 'Test262Error: Expected SameValue(«-$987.00», «($987.00)») to be true' +-test/intl402/NumberFormat/prototype/format/signDisplay-negative-currency-ko-KR.js: +- default: 'Test262Error: Expected SameValue(«-US$987.00», «(US$987.00)») to be true' +- strict mode: 'Test262Error: Expected SameValue(«-US$987.00», «(US$987.00)») to be true' +-test/intl402/NumberFormat/prototype/format/signDisplay-negative-currency-zh-TW.js: +- default: 'Test262Error: Expected SameValue(«-US$987.00», «(US$987.00)») to be true' +- strict mode: 'Test262Error: Expected SameValue(«-US$987.00», «(US$987.00)») to be true' +-test/intl402/NumberFormat/prototype/format/signDisplay-negative-de-DE.js: +- default: 'Test262Error: -0.0001 Expected SameValue(«-0», «0») to be true' +- strict mode: 'Test262Error: -0.0001 Expected SameValue(«-0», «0») to be true' +-test/intl402/NumberFormat/prototype/format/signDisplay-negative-en-US.js: +- default: 'Test262Error: -0.0001 Expected SameValue(«-0», «0») to be true' +- strict mode: 'Test262Error: -0.0001 Expected SameValue(«-0», «0») to be true' +-test/intl402/NumberFormat/prototype/format/signDisplay-negative-ja-JP.js: +- default: 'Test262Error: -0.0001 Expected SameValue(«-0», «0») to be true' +- strict mode: 'Test262Error: -0.0001 Expected SameValue(«-0», «0») to be true' +-test/intl402/NumberFormat/prototype/format/signDisplay-negative-ko-KR.js: +- default: 'Test262Error: -0.0001 Expected SameValue(«-0», «0») to be true' +- strict mode: 'Test262Error: -0.0001 Expected SameValue(«-0», «0») to be true' +-test/intl402/NumberFormat/prototype/format/signDisplay-negative-zh-TW.js: +- default: 'Test262Error: -0.0001 Expected SameValue(«-0», «0») to be true' +- strict mode: 'Test262Error: -0.0001 Expected SameValue(«-0», «0») to be true' ++ default: 'Test262Error: Formatted value for 1, en-US-u-nu-arab and options {"useGrouping":false,"roundingPriority":"morePrecision","minimumSignificantDigits":2,"minimumFractionDigits":2} is ١٫٠٠; expected ١٫٠.' ++ strict mode: 'Test262Error: Formatted value for 1, en-US-u-nu-arab and options {"useGrouping":false,"roundingPriority":"morePrecision","minimumSignificantDigits":2,"minimumFractionDigits":2} is ١٫٠٠; expected ١٫٠.' + test/intl402/NumberFormat/prototype/format/useGrouping-extended-en-IN.js: + default: 'Test262Error: notation: "compact" Expected SameValue(«1K», «1T») to be true' + strict mode: 'Test262Error: notation: "compact" Expected SameValue(«1K», «1T») to be true' +@@ -1242,36 +1311,6 @@ test/intl402/NumberFormat/prototype/formatRangeToParts/prop-desc.js: + test/intl402/NumberFormat/prototype/formatRangeToParts/x-greater-than-y-throws.js: + default: 'Test262Error: Expected a RangeError but got a TypeError' + strict mode: 'Test262Error: Expected a RangeError but got a TypeError' +-test/intl402/NumberFormat/prototype/formatToParts/signDisplay-negative-currency-de-DE.js: +- default: 'Test262Error: negativeNearZero: length Expected SameValue(«6», «5») to be true' +- strict mode: 'Test262Error: negativeNearZero: length Expected SameValue(«6», «5») to be true' +-test/intl402/NumberFormat/prototype/formatToParts/signDisplay-negative-currency-en-US.js: +- default: 'Test262Error: negative: length Expected SameValue(«5», «6») to be true' +- strict mode: 'Test262Error: negative: length Expected SameValue(«5», «6») to be true' +-test/intl402/NumberFormat/prototype/formatToParts/signDisplay-negative-currency-ja-JP.js: +- default: 'Test262Error: negative: length Expected SameValue(«5», «6») to be true' +- strict mode: 'Test262Error: negative: length Expected SameValue(«5», «6») to be true' +-test/intl402/NumberFormat/prototype/formatToParts/signDisplay-negative-currency-ko-KR.js: +- default: 'Test262Error: negative: length Expected SameValue(«5», «6») to be true' +- strict mode: 'Test262Error: negative: length Expected SameValue(«5», «6») to be true' +-test/intl402/NumberFormat/prototype/formatToParts/signDisplay-negative-currency-zh-TW.js: +- default: 'Test262Error: negative: length Expected SameValue(«5», «6») to be true' +- strict mode: 'Test262Error: negative: length Expected SameValue(«5», «6») to be true' +-test/intl402/NumberFormat/prototype/formatToParts/signDisplay-negative-de-DE.js: +- default: 'Test262Error: -0.0001 (negative): length Expected SameValue(«2», «1») to be true' +- strict mode: 'Test262Error: -0.0001 (negative): length Expected SameValue(«2», «1») to be true' +-test/intl402/NumberFormat/prototype/formatToParts/signDisplay-negative-en-US.js: +- default: 'Test262Error: -0.0001 (negative): length Expected SameValue(«2», «1») to be true' +- strict mode: 'Test262Error: -0.0001 (negative): length Expected SameValue(«2», «1») to be true' +-test/intl402/NumberFormat/prototype/formatToParts/signDisplay-negative-ja-JP.js: +- default: 'Test262Error: -0.0001 (negative): length Expected SameValue(«2», «1») to be true' +- strict mode: 'Test262Error: -0.0001 (negative): length Expected SameValue(«2», «1») to be true' +-test/intl402/NumberFormat/prototype/formatToParts/signDisplay-negative-ko-KR.js: +- default: 'Test262Error: -0.0001 (negative): length Expected SameValue(«2», «1») to be true' +- strict mode: 'Test262Error: -0.0001 (negative): length Expected SameValue(«2», «1») to be true' +-test/intl402/NumberFormat/prototype/formatToParts/signDisplay-negative-zh-TW.js: +- default: 'Test262Error: -0.0001 (negative): length Expected SameValue(«2», «1») to be true' +- strict mode: 'Test262Error: -0.0001 (negative): length Expected SameValue(«2», «1») to be true' + test/intl402/PluralRules/prototype/selectRange/default-en-us.js: + default: "TypeError: pr.selectRange is not a function. (In 'pr.selectRange(102, 201)', 'pr.selectRange' is undefined)" + strict mode: "TypeError: pr.selectRange is not a function. (In 'pr.selectRange(102, 201)', 'pr.selectRange' is undefined)" +@@ -1293,6 +1332,9 @@ test/intl402/PluralRules/prototype/selectRange/prop-desc.js: + test/intl402/PluralRules/prototype/selectRange/x-greater-than-y-throws.js: + default: 'Test262Error: Expected a RangeError but got a TypeError' + strict mode: 'Test262Error: Expected a RangeError but got a TypeError' ++test/intl402/Temporal/Duration/compare/relativeto-hour.js: ++ default: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" ++ strict mode: "TypeError: undefined is not an object (evaluating 'Temporal.ZonedDateTime.from')" + test/intl402/Temporal/Duration/prototype/add/relativeto-string-datetime.js: + default: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' + strict mode: 'RangeError: Cannot add a duration of years, months, or weeks without a relativeTo option' +@@ -1305,6 +1347,9 @@ test/intl402/Temporal/Duration/prototype/subtract/relativeto-string-datetime.js: + test/intl402/Temporal/Duration/prototype/total/relativeto-string-datetime.js: + default: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' + strict mode: 'RangeError: Cannot total a duration of years, months, or weeks without a relativeTo option' ++test/intl402/Temporal/Instant/prototype/toString/timezone-offset.js: ++ default: 'Test262Error: positive offset Expected SameValue(«1970-01-01T00:00:00Z», «1970-01-01T01:00:00+01:00») to be true' ++ strict mode: 'Test262Error: positive offset Expected SameValue(«1970-01-01T00:00:00Z», «1970-01-01T01:00:00+01:00») to be true' + test/intl402/Temporal/Instant/prototype/toString/timezone-string-datetime.js: + default: 'RangeError: argument needs to be UTC offset string, TimeZone identifier, or temporal Instant string' + strict mode: 'RangeError: argument needs to be UTC offset string, TimeZone identifier, or temporal Instant string' +@@ -1948,18 +1993,6 @@ test/language/expressions/compound-assignment/S11.13.2_A7.8_T4.js: + test/language/expressions/compound-assignment/S11.13.2_A7.9_T4.js: + default: 'Test262Error: Expected true but got false' + strict mode: 'Test262Error: Expected true but got false' +-test/language/expressions/compound-assignment/left-hand-side-private-reference-method-nullish.js: +- default: 'Test262Error: PutValue throws when storing the result in a method private reference Expected a TypeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: PutValue throws when storing the result in a method private reference Expected a TypeError to be thrown but no exception was thrown at all' +-test/language/expressions/compound-assignment/left-hand-side-private-reference-method-or.js: +- default: 'Test262Error: PutValue throws when storing the result in a method private reference Expected a TypeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: PutValue throws when storing the result in a method private reference Expected a TypeError to be thrown but no exception was thrown at all' +-test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js: +- default: 'Test262Error: PutValue throws when storing the result if no setter Expected a TypeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: PutValue throws when storing the result if no setter Expected a TypeError to be thrown but no exception was thrown at all' +-test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js: +- default: 'Test262Error: PutValue throws when storing the result if no setter Expected a TypeError to be thrown but no exception was thrown at all' +- strict mode: 'Test262Error: PutValue throws when storing the result if no setter Expected a TypeError to be thrown but no exception was thrown at all' + test/language/expressions/dynamic-import/catch/nested-async-gen-await-eval-script-code-target.js: + module: 'Test262:AsyncTestFailure:Test262Error: [object Object]' + test/language/expressions/dynamic-import/catch/nested-async-gen-return-await-eval-script-code-target.js: +@@ -2047,30 +2080,6 @@ test/language/global-code/script-decl-var-err.js: + strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all' + test/language/identifier-resolution/assign-to-global-undefined.js: + strict mode: Expected uncaught exception with name 'ReferenceError' but none was thrown +-test/language/identifiers/part-unicode-14.0.0-class-escaped.js: +- default: "SyntaxError: Invalid unicode escape in identifier: '#_\\u0898'" +- strict mode: "SyntaxError: Invalid unicode escape in identifier: '#_\\u0898'" +-test/language/identifiers/part-unicode-14.0.0-class.js: +- default: "SyntaxError: Invalid character '\\u0898'" +- strict mode: "SyntaxError: Invalid character '\\u0898'" +-test/language/identifiers/part-unicode-14.0.0-escaped.js: +- default: "SyntaxError: Invalid unicode escape in identifier: '_\\u0898'" +- strict mode: "SyntaxError: Invalid unicode escape in identifier: '_\\u0898'" +-test/language/identifiers/part-unicode-14.0.0.js: +- default: "SyntaxError: Invalid character '\\u0898'" +- strict mode: "SyntaxError: Invalid character '\\u0898'" +-test/language/identifiers/start-unicode-14.0.0-class-escaped.js: +- default: "SyntaxError: Invalid unicode escape in identifier: '#\\u0870'" +- strict mode: "SyntaxError: Invalid unicode escape in identifier: '#\\u0870'" +-test/language/identifiers/start-unicode-14.0.0-class.js: +- default: "SyntaxError: Invalid character: '#'" +- strict mode: "SyntaxError: Invalid character: '#'" +-test/language/identifiers/start-unicode-14.0.0-escaped.js: +- default: "SyntaxError: Invalid unicode escape in identifier: '\\u0870'" +- strict mode: "SyntaxError: Invalid unicode escape in identifier: '\\u0870'" +-test/language/identifiers/start-unicode-14.0.0.js: +- default: "SyntaxError: Invalid character '\\u0870'" +- strict mode: "SyntaxError: Invalid character '\\u0870'" + test/language/literals/regexp/u-astral-char-class-invert.js: + default: 'Test262Error: Expected SameValue(«�», «null») to be true' + strict mode: 'Test262Error: Expected SameValue(«�», «null») to be true' +diff --git a/JSTests/test262/harness/propertyHelper.js b/JSTests/test262/harness/propertyHelper.js +index 0ee7e21a92825d1e00e9545702c7e6e7c64279cc..7068f2560ccb2229ce340a12f139c03750f32bca 100644 +--- a/JSTests/test262/harness/propertyHelper.js ++++ b/JSTests/test262/harness/propertyHelper.js +@@ -6,13 +6,13 @@ description: | + property descriptors. + defines: + - verifyProperty +- - verifyEqualTo +- - verifyWritable +- - verifyNotWritable +- - verifyEnumerable +- - verifyNotEnumerable +- - verifyConfigurable +- - verifyNotConfigurable ++ - verifyEqualTo # deprecated ++ - verifyWritable # deprecated ++ - verifyNotWritable # deprecated ++ - verifyEnumerable # deprecated ++ - verifyNotEnumerable # deprecated ++ - verifyConfigurable # deprecated ++ - verifyNotConfigurable # deprecated + ---*/ + + // @ts-check +@@ -173,6 +173,9 @@ function isWritable(obj, name, verifyProp, value) { + return writeSucceeded; + } + ++/** ++ * Deprecated; please use `verifyProperty` in new tests. ++ */ + function verifyEqualTo(obj, name, value) { + if (!isSameValue(obj[name], value)) { + throw new Test262Error("Expected obj[" + String(name) + "] to equal " + value + +@@ -180,6 +183,9 @@ function verifyEqualTo(obj, name, value) { + } + } + ++/** ++ * Deprecated; please use `verifyProperty` in new tests. ++ */ + function verifyWritable(obj, name, verifyProp, value) { + if (!verifyProp) { + assert(Object.getOwnPropertyDescriptor(obj, name).writable, +@@ -190,6 +196,9 @@ function verifyWritable(obj, name, verifyProp, value) { + } + } + ++/** ++ * Deprecated; please use `verifyProperty` in new tests. ++ */ + function verifyNotWritable(obj, name, verifyProp, value) { + if (!verifyProp) { + assert(!Object.getOwnPropertyDescriptor(obj, name).writable, +@@ -200,6 +209,9 @@ function verifyNotWritable(obj, name, verifyProp, value) { + } + } + ++/** ++ * Deprecated; please use `verifyProperty` in new tests. ++ */ + function verifyEnumerable(obj, name) { + assert(Object.getOwnPropertyDescriptor(obj, name).enumerable, + "Expected obj[" + String(name) + "] to have enumerable:true."); +@@ -208,6 +220,9 @@ function verifyEnumerable(obj, name) { + } + } + ++/** ++ * Deprecated; please use `verifyProperty` in new tests. ++ */ + function verifyNotEnumerable(obj, name) { + assert(!Object.getOwnPropertyDescriptor(obj, name).enumerable, + "Expected obj[" + String(name) + "] to have enumerable:false."); +@@ -216,6 +231,9 @@ function verifyNotEnumerable(obj, name) { + } + } + ++/** ++ * Deprecated; please use `verifyProperty` in new tests. ++ */ + function verifyConfigurable(obj, name) { + assert(Object.getOwnPropertyDescriptor(obj, name).configurable, + "Expected obj[" + String(name) + "] to have configurable:true."); +@@ -224,6 +242,9 @@ function verifyConfigurable(obj, name) { + } + } + ++/** ++ * Deprecated; please use `verifyProperty` in new tests. ++ */ + function verifyNotConfigurable(obj, name) { + assert(!Object.getOwnPropertyDescriptor(obj, name).configurable, + "Expected obj[" + String(name) + "] to have configurable:false."); +diff --git a/JSTests/test262/harness/regExpUtils.js b/JSTests/test262/harness/regExpUtils.js +index e57e196a0540ada331475e38567317c85c35faeb..9b4c58ae1d2a82548485143c74e0590df2f1ff40 100644 +--- a/JSTests/test262/harness/regExpUtils.js ++++ b/JSTests/test262/harness/regExpUtils.js +@@ -51,7 +51,7 @@ function printStringCodePoints(string) { + function testPropertyEscapes(regExp, string, expression) { + if (!regExp.test(string)) { + for (const symbol of string) { +- printCodePoint(symbol.codePointAt(0)); ++ const hex = printCodePoint(symbol.codePointAt(0)); + assert( + regExp.test(symbol), + `\`${ expression }\` should match U+${ hex } (\`${ symbol }\`)` +diff --git a/JSTests/test262/harness/temporalHelpers.js b/JSTests/test262/harness/temporalHelpers.js +index 3a2ed5e4d45618c94fccb1290fee801549e6dc69..963498b909a90f5e1ee58316311b1b4594367d14 100644 +--- a/JSTests/test262/harness/temporalHelpers.js ++++ b/JSTests/test262/harness/temporalHelpers.js +@@ -151,20 +151,21 @@ var TemporalHelpers = { + }, + + /* +- * assertPlainYearMonth(yearMonth, year, month, monthCode[, description[, era, eraYear]]): ++ * assertPlainYearMonth(yearMonth, year, month, monthCode[, description[, era, eraYear, referenceISODay]]): + * + * Shorthand for asserting that each field of a Temporal.PlainYearMonth is + * equal to an expected value. (Except the `calendar` property, since callers + * may want to assert either object equality with an object they put in there, + * or the result of yearMonth.calendar.toString().) + */ +- assertPlainYearMonth(yearMonth, year, month, monthCode, description = "", era = undefined, eraYear = undefined) { ++ assertPlainYearMonth(yearMonth, year, month, monthCode, description = "", era = undefined, eraYear = undefined, referenceISODay = 1) { + assert(yearMonth instanceof Temporal.PlainYearMonth, `${description} instanceof`); + assert.sameValue(yearMonth.era, era, `${description} era result`); + assert.sameValue(yearMonth.eraYear, eraYear, `${description} eraYear result`); + assert.sameValue(yearMonth.year, year, `${description} year result`); + assert.sameValue(yearMonth.month, month, `${description} month result`); + assert.sameValue(yearMonth.monthCode, monthCode, `${description} monthCode result`); ++ assert.sameValue(yearMonth.getISOFields().isoDay, referenceISODay, `${description} referenceISODay result`); + }, + + /* +@@ -238,39 +239,6 @@ var TemporalHelpers = { + }); + }, + +- /* +- * checkFractionalSecondDigitsOptionWrongType(temporalObject): +- * +- * Checks the string-or-number type handling of the fractionalSecondDigits +- * option to the various types' toString() methods. temporalObject is an +- * instance of the Temporal type under test. +- */ +- checkFractionalSecondDigitsOptionWrongType(temporalObject) { +- // null is not a number, and converts to the string "null", which is an invalid string value +- assert.throws(RangeError, () => temporalObject.toString({ fractionalSecondDigits: null }), "null"); +- // Booleans are not numbers, and convert to the strings "true" or "false", which are invalid +- assert.throws(RangeError, () => temporalObject.toString({ fractionalSecondDigits: true }), "true"); +- assert.throws(RangeError, () => temporalObject.toString({ fractionalSecondDigits: false }), "false"); +- // Symbols are not numbers and cannot convert to strings +- assert.throws(TypeError, () => temporalObject.toString({ fractionalSecondDigits: Symbol() }), "symbol"); +- // BigInts are not numbers and convert to strings which are invalid +- assert.throws(RangeError, () => temporalObject.toString({ fractionalSecondDigits: 2n }), "bigint"); +- +- // Objects are not numbers and prefer their toString() methods when converting to a string +- assert.throws(RangeError, () => temporalObject.toString({ fractionalSecondDigits: {} }), "plain object"); +- +- const toStringExpected = temporalObject.toString({ fractionalSecondDigits: 'auto' }); +- const expected = [ +- "get fractionalSecondDigits.toString", +- "call fractionalSecondDigits.toString", +- ]; +- const actual = []; +- const observer = TemporalHelpers.toPrimitiveObserver(actual, "auto", "fractionalSecondDigits"); +- const result = temporalObject.toString({ fractionalSecondDigits: observer }); +- assert.sameValue(result, toStringExpected, "object with toString"); +- assert.compareArray(actual, expected, "order of operations"); +- }, +- + /* + * checkPlainDateTimeConversionFastPath(func): + * +@@ -1034,6 +1002,44 @@ var TemporalHelpers = { + return new CalendarFieldsIterable(); + }, + ++ /* ++ * A custom calendar that asserts its ...FromFields() methods are called with ++ * the options parameter having the value undefined. ++ */ ++ calendarFromFieldsUndefinedOptions() { ++ class CalendarFromFieldsUndefinedOptions extends Temporal.Calendar { ++ constructor() { ++ super("iso8601"); ++ this.dateFromFieldsCallCount = 0; ++ this.monthDayFromFieldsCallCount = 0; ++ this.yearMonthFromFieldsCallCount = 0; ++ } ++ ++ toString() { ++ return "from-fields-undef-options"; ++ } ++ ++ dateFromFields(fields, options) { ++ this.dateFromFieldsCallCount++; ++ assert.sameValue(options, undefined, "dateFromFields shouldn't be called with options"); ++ return super.dateFromFields(fields, options); ++ } ++ ++ yearMonthFromFields(fields, options) { ++ this.yearMonthFromFieldsCallCount++; ++ assert.sameValue(options, undefined, "yearMonthFromFields shouldn't be called with options"); ++ return super.yearMonthFromFields(fields, options); ++ } ++ ++ monthDayFromFields(fields, options) { ++ this.monthDayFromFieldsCallCount++; ++ assert.sameValue(options, undefined, "monthDayFromFields shouldn't be called with options"); ++ return super.monthDayFromFields(fields, options); ++ } ++ } ++ return new CalendarFromFieldsUndefinedOptions(); ++ }, ++ + /* + * A custom calendar that modifies the fields object passed in to + * dateFromFields, sabotaging its time properties. +@@ -1312,10 +1318,10 @@ var TemporalHelpers = { + if (this._shiftNanoseconds > 0) { + if (this._isBeforeShift(instant)) return [instant]; + if (instant.epochNanoseconds < this._epoch2) return []; +- return [instant.add(this._shift)]; ++ return [instant.subtract(this._shift)]; + } + if (instant.epochNanoseconds < this._epoch2) return [instant]; +- const shifted = instant.add(this._shift); ++ const shifted = instant.subtract(this._shift); + if (this._isBeforeShift(instant)) return [instant, shifted]; + return [shifted]; + } +diff --git a/JSTests/test262/latest-changes-summary.txt b/JSTests/test262/latest-changes-summary.txt +index 98346984e6b64f9a10b257c0c31bf00bb411979d..2bd51c9d3d2db52ae818d2e70043f890b6a46367 100644 +--- a/JSTests/test262/latest-changes-summary.txt ++++ b/JSTests/test262/latest-changes-summary.txt +@@ -1,544 +1,1367 @@ ++M harness/propertyHelper.js ++M harness/regExpUtils.js + M harness/temporalHelpers.js ++A test/built-ins/Array/prototype/Symbol.unscopables/array-find-from-last.js ++A test/built-ins/Array/prototype/Symbol.unscopables/array-grouping.js + M test/built-ins/Array/prototype/Symbol.unscopables/value.js +-A test/built-ins/Array/prototype/pop/set-length-array-is-frozen.js +-A test/built-ins/Array/prototype/pop/set-length-array-length-is-non-writable.js +-A test/built-ins/Array/prototype/pop/set-length-zero-array-is-frozen.js +-A test/built-ins/Array/prototype/pop/set-length-zero-array-length-is-non-writable.js +-A test/built-ins/Array/prototype/push/set-length-array-is-frozen.js +-A test/built-ins/Array/prototype/push/set-length-array-length-is-non-writable.js +-A test/built-ins/Array/prototype/push/set-length-zero-array-is-frozen.js +-A test/built-ins/Array/prototype/push/set-length-zero-array-length-is-non-writable.js +-A test/built-ins/Array/prototype/shift/set-length-array-is-frozen.js +-A test/built-ins/Array/prototype/shift/set-length-array-length-is-non-writable.js +-A test/built-ins/Array/prototype/shift/set-length-zero-array-is-frozen.js +-A test/built-ins/Array/prototype/shift/set-length-zero-array-length-is-non-writable.js +-A test/built-ins/Array/prototype/unshift/set-length-array-is-frozen.js +-A test/built-ins/Array/prototype/unshift/set-length-array-length-is-non-writable.js +-A test/built-ins/Array/prototype/unshift/set-length-zero-array-is-frozen.js +-A test/built-ins/Array/prototype/unshift/set-length-zero-array-length-is-non-writable.js +-A test/built-ins/ShadowRealm/WrappedFunction/length-throws-typeerror.js +-A test/built-ins/ShadowRealm/WrappedFunction/length.js +-A test/built-ins/ShadowRealm/WrappedFunction/name-throws-typeerror.js +-A test/built-ins/ShadowRealm/WrappedFunction/name.js +-A test/built-ins/Temporal/Calendar/prototype/dateAdd/year-zero.js +-M test/built-ins/Temporal/Calendar/prototype/dateUntil/throws-range-error-ToLargestTemporalUnit.js +-A test/built-ins/Temporal/Calendar/prototype/dateUntil/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/day/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/dayOfYear/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/daysInMonth/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/daysInWeek/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/daysInYear/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/id/branding.js +-A test/built-ins/Temporal/Calendar/prototype/inLeapYear/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/month/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/monthCode/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/monthsInYear/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/toJSON/branding.js +-A test/built-ins/Temporal/Calendar/prototype/weekOfYear/year-zero.js +-A test/built-ins/Temporal/Calendar/prototype/year/year-zero.js +-A test/built-ins/Temporal/Duration/compare/argument-string-fractional-units-rounding-mode.js +-A test/built-ins/Temporal/Duration/compare/calendar-possibly-required.js +-M test/built-ins/Temporal/Duration/compare/timezone-string-datetime.js +-A test/built-ins/Temporal/Duration/compare/year-zero.js +-A test/built-ins/Temporal/Duration/from/argument-string-fractional-units-rounding-mode.js +-A test/built-ins/Temporal/Duration/prototype/add/argument-string-fractional-units-rounding-mode.js +-M test/built-ins/Temporal/Duration/prototype/add/relativeto-string-datetime.js +-M test/built-ins/Temporal/Duration/prototype/add/relativeto-string-zoneddatetime-wrong-offset.js +-M test/built-ins/Temporal/Duration/prototype/add/timezone-string-datetime.js +-A test/built-ins/Temporal/Duration/prototype/add/year-zero.js +-A test/built-ins/Temporal/Duration/prototype/round/calendar-possibly-required.js +-M test/built-ins/Temporal/Duration/prototype/round/relativeto-string-datetime.js +-M test/built-ins/Temporal/Duration/prototype/round/relativeto-string-zoneddatetime-wrong-offset.js +-M test/built-ins/Temporal/Duration/prototype/round/timezone-string-datetime.js +-A test/built-ins/Temporal/Duration/prototype/round/year-zero.js +-A test/built-ins/Temporal/Duration/prototype/subtract/argument-string-fractional-units-rounding-mode.js +-M test/built-ins/Temporal/Duration/prototype/subtract/relativeto-string-datetime.js +-M test/built-ins/Temporal/Duration/prototype/subtract/relativeto-string-zoneddatetime-wrong-offset.js +-M test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-datetime.js +-A test/built-ins/Temporal/Duration/prototype/subtract/year-zero.js +-A test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-exact-number-of-digits.js +-A test/built-ins/Temporal/Duration/prototype/total/calendar-possibly-required.js +-M test/built-ins/Temporal/Duration/prototype/total/relativeto-string-datetime.js +-M test/built-ins/Temporal/Duration/prototype/total/relativeto-string-zoneddatetime-wrong-offset.js +-M test/built-ins/Temporal/Duration/prototype/total/timezone-string-datetime.js +-A test/built-ins/Temporal/Duration/prototype/total/year-zero.js +-A test/built-ins/Temporal/Duration/prototype/with/copy-properties-not-undefined.js +-M test/built-ins/Temporal/Instant/compare/instant-string.js +-A test/built-ins/Temporal/Instant/compare/year-zero.js +-M test/built-ins/Temporal/Instant/from/instant-string.js +-A test/built-ins/Temporal/Instant/from/year-zero.js +-A test/built-ins/Temporal/Instant/prototype/add/argument-string-fractional-units-rounding-mode.js +-M test/built-ins/Temporal/Instant/prototype/equals/instant-string.js +-A test/built-ins/Temporal/Instant/prototype/equals/year-zero.js +-M test/built-ins/Temporal/Instant/prototype/since/instant-string.js ++M test/built-ins/Array/prototype/concat/create-species-non-ctor.js ++M test/built-ins/Array/prototype/filter/create-species-non-ctor.js ++M test/built-ins/Array/prototype/map/create-species-non-ctor.js ++M test/built-ins/Array/prototype/slice/create-species-non-ctor.js ++M test/built-ins/Array/prototype/splice/create-species-non-ctor.js ++A test/built-ins/Date/parse/year-zero.js ++A test/built-ins/Date/year-zero.js ++M test/built-ins/Error/constructor.js ++M test/built-ins/Function/prototype/bind/instance-length-tointeger.js ++M test/built-ins/Number/S15.7.1.1_A1.js ++M test/built-ins/RegExp/prototype/toString/S15.10.6.4_A6.js ++M test/built-ins/RegExp/prototype/toString/S15.10.6.4_A7.js ++A test/built-ins/ShadowRealm/WrappedFunction/throws-typeerror-on-revoked-proxy.js ++R081 test/built-ins/ShadowRealm/prototype/evaluate/globalthis-orginary-object.js test/built-ins/ShadowRealm/prototype/evaluate/globalthis-ordinary-object.js ++A test/built-ins/ShadowRealm/prototype/evaluate/throws-typeerror-wrap-throwing.js ++M test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js ++A test/built-ins/Temporal/Calendar/from/calendar-number.js ++A test/built-ins/Temporal/Calendar/from/calendar-string-leap-second.js ++A test/built-ins/Temporal/Calendar/from/calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-invalid.js ++M test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-with-utc-designator.js ++A test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/dateAdd/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/dateAdd/leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/dateAdd/options-wrong-type.js ++M test/built-ins/Temporal/Calendar/prototype/dateAdd/overflow-invalid-string.js ++M test/built-ins/Temporal/Calendar/prototype/dateAdd/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/dateFromFields/options-wrong-type.js ++M test/built-ins/Temporal/Calendar/prototype/dateFromFields/overflow-invalid-string.js ++A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/dateUntil/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/dateUntil/leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/dateUntil/options-wrong-type.js ++M test/built-ins/Temporal/Calendar/prototype/dateUntil/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/day/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/day/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/day/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/day/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/day/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/day/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfWeek/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/dayOfWeek/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfYear/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/dayOfYear/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/dayOfYear/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/daysInMonth/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/daysInMonth/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/daysInMonth/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/daysInWeek/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/daysInWeek/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/daysInWeek/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/daysInYear/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/daysInYear/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/daysInYear/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string.js ++A test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-wrong-type.js ++M test/built-ins/Temporal/Calendar/prototype/inLeapYear/basic.js ++M test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js ++A test/built-ins/Temporal/Calendar/prototype/inLeapYear/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/inLeapYear/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/inLeapYear/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/mergeFields/basic.js ++A test/built-ins/Temporal/Calendar/prototype/mergeFields/iso8601-calendar-month-monthCode.js ++A test/built-ins/Temporal/Calendar/prototype/mergeFields/non-string-properties.js ++A test/built-ins/Temporal/Calendar/prototype/month/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/month/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/month/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/month/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/month/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/month/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/monthCode/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/monthCode/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/monthCode/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/monthCode/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/basic.js ++A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-missing-properties.js ++M test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-not-object.js ++A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/monthcode-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/options-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-constrain.js ++M test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-invalid-string.js ++A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-reject.js ++A test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/reference-year-1972.js ++A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string.js ++A test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-wrong-type.js ++M test/built-ins/Temporal/Calendar/prototype/monthsInYear/basic.js ++M test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js ++A test/built-ins/Temporal/Calendar/prototype/monthsInYear/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/monthsInYear/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/monthsInYear/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindate.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindatetime.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-wrong-type.js ++M test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/weekOfYear/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/weekOfYear/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/year/argument-number.js ++A test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/year/argument-string-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/year/argument-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/year/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/Calendar/prototype/year/leap-second.js ++M test/built-ins/Temporal/Calendar/prototype/year/year-zero.js ++A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/basic.js ++M test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js ++A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-missing-properties.js ++M test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-not-object.js ++A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/monthcode-invalid.js ++A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-not-object.js ++A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-wrong-type.js ++A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-constrain.js ++M test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-invalid-string.js ++A test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-reject.js ++A test/built-ins/Temporal/Duration/basic.js ++A test/built-ins/Temporal/Duration/call-builtin.js ++A test/built-ins/Temporal/Duration/compare/argument-cast.js ++A test/built-ins/Temporal/Duration/compare/basic.js ++A test/built-ins/Temporal/Duration/compare/calendar-dateadd-called-with-options-undefined.js ++A test/built-ins/Temporal/Duration/compare/options-wrong-type.js ++A test/built-ins/Temporal/Duration/compare/relativeto-hour.js ++A test/built-ins/Temporal/Duration/compare/relativeto-month.js ++A test/built-ins/Temporal/Duration/compare/relativeto-propertybag-invalid.js ++A test/built-ins/Temporal/Duration/compare/relativeto-year.js ++A test/built-ins/Temporal/Duration/compare/timezone-string-leap-second.js ++A test/built-ins/Temporal/Duration/compare/timezone-string-year-zero.js ++A test/built-ins/Temporal/Duration/compare/timezone-wrong-type.js ++A test/built-ins/Temporal/Duration/compare/twenty-five-hour-day.js ++M test/built-ins/Temporal/Duration/days-undefined.js ++A test/built-ins/Temporal/Duration/from/argument-duration.js ++M test/built-ins/Temporal/Duration/from/argument-existing-object.js ++A test/built-ins/Temporal/Duration/from/argument-object-invalid.js ++A test/built-ins/Temporal/Duration/from/argument-string-invalid.js ++A test/built-ins/Temporal/Duration/from/argument-string.js ++M test/built-ins/Temporal/Duration/hours-undefined.js ++M test/built-ins/Temporal/Duration/microseconds-undefined.js ++M test/built-ins/Temporal/Duration/milliseconds-undefined.js ++M test/built-ins/Temporal/Duration/minutes-undefined.js ++A test/built-ins/Temporal/Duration/mixed.js ++M test/built-ins/Temporal/Duration/months-undefined.js ++M test/built-ins/Temporal/Duration/nanoseconds-undefined.js ++A test/built-ins/Temporal/Duration/prototype/abs/basic.js ++A test/built-ins/Temporal/Duration/prototype/abs/new-object.js ++A test/built-ins/Temporal/Duration/prototype/add/argument-object-invalid.js ++A test/built-ins/Temporal/Duration/prototype/add/argument-string.js ++A test/built-ins/Temporal/Duration/prototype/add/basic.js ++M test/built-ins/Temporal/Duration/prototype/add/options-undefined.js ++A test/built-ins/Temporal/Duration/prototype/add/options-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/add/relativeto-leap-second.js ++A test/built-ins/Temporal/Duration/prototype/add/relativeto-month.js ++A test/built-ins/Temporal/Duration/prototype/add/relativeto-number.js ++A test/built-ins/Temporal/Duration/prototype/add/relativeto-order.js ++A test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-number.js ++A test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/add/relativeto-required.js ++A test/built-ins/Temporal/Duration/prototype/add/relativeto-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/add/relativeto-year.js ++A test/built-ins/Temporal/Duration/prototype/add/timezone-string-leap-second.js ++A test/built-ins/Temporal/Duration/prototype/add/timezone-string-year-zero.js ++A test/built-ins/Temporal/Duration/prototype/add/timezone-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/blank/basic.js ++A test/built-ins/Temporal/Duration/prototype/negated/basic.js ++A test/built-ins/Temporal/Duration/prototype/round/calendar-dateadd-called-with-options-undefined.js ++A test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-default.js ++A test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-mismatch.js ++A test/built-ins/Temporal/Duration/prototype/round/options-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/round/relativeto-leap-second.js ++A test/built-ins/Temporal/Duration/prototype/round/relativeto-number.js ++A test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-number.js ++A test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/round/relativeto-wrong-type.js ++M test/built-ins/Temporal/Duration/prototype/round/roundingmode-invalid-string.js ++A test/built-ins/Temporal/Duration/prototype/round/roundto-invalid-string.js ++D test/built-ins/Temporal/Duration/prototype/round/smallestunit-disallowed-units-string.js ++M test/built-ins/Temporal/Duration/prototype/round/smallestunit-invalid-string.js ++A test/built-ins/Temporal/Duration/prototype/round/smallestunit.js ++A test/built-ins/Temporal/Duration/prototype/round/timezone-string-leap-second.js ++A test/built-ins/Temporal/Duration/prototype/round/timezone-string-year-zero.js ++A test/built-ins/Temporal/Duration/prototype/round/timezone-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/subtract/argument-object-invalid.js ++A test/built-ins/Temporal/Duration/prototype/subtract/argument-string.js ++A test/built-ins/Temporal/Duration/prototype/subtract/basic.js ++M test/built-ins/Temporal/Duration/prototype/subtract/options-undefined.js ++A test/built-ins/Temporal/Duration/prototype/subtract/options-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-leap-second.js ++A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-month.js ++A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-number.js ++A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-order.js ++A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-number.js ++A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-required.js ++A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/subtract/relativeto-year.js ++A test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-leap-second.js ++A test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-year-zero.js ++A test/built-ins/Temporal/Duration/prototype/subtract/timezone-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/toJSON/basic.js ++A test/built-ins/Temporal/Duration/prototype/toJSON/options.js ++A test/built-ins/Temporal/Duration/prototype/toString/balance.js ++A test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-auto.js ++M test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-invalid-string.js ++A test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-number.js ++M test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-out-of-range.js ++M test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-undefined.js ++M test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-wrong-type.js ++M test/built-ins/Temporal/Duration/prototype/toString/negative-components.js ++A test/built-ins/Temporal/Duration/prototype/toString/options-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/toString/roundingmode-ceil.js ++A test/built-ins/Temporal/Duration/prototype/toString/roundingmode-floor.js ++A test/built-ins/Temporal/Duration/prototype/toString/roundingmode-halfExpand.js ++M test/built-ins/Temporal/Duration/prototype/toString/roundingmode-invalid-string.js ++A test/built-ins/Temporal/Duration/prototype/toString/roundingmode-trunc.js ++A test/built-ins/Temporal/Duration/prototype/toString/smallestunit-fractionalseconddigits.js ++M test/built-ins/Temporal/Duration/prototype/toString/smallestunit-invalid-string.js ++M test/built-ins/Temporal/Duration/prototype/toString/smallestunit-valid-units.js ++A test/built-ins/Temporal/Duration/prototype/total/calendar-dateadd-called-with-options-undefined.js ++M test/built-ins/Temporal/Duration/prototype/total/options-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/total/relativeto-leap-second.js ++A test/built-ins/Temporal/Duration/prototype/total/relativeto-number.js ++A test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-number.js ++A test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/total/relativeto-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/total/timezone-string-leap-second.js ++A test/built-ins/Temporal/Duration/prototype/total/timezone-string-year-zero.js ++A test/built-ins/Temporal/Duration/prototype/total/timezone-wrong-type.js ++A test/built-ins/Temporal/Duration/prototype/valueOf/basic.js ++A test/built-ins/Temporal/Duration/prototype/with/all-negative.js ++A test/built-ins/Temporal/Duration/prototype/with/all-positive.js ++A test/built-ins/Temporal/Duration/prototype/with/argument-invalid-prop.js ++A test/built-ins/Temporal/Duration/prototype/with/argument-mixed-sign.js ++A test/built-ins/Temporal/Duration/prototype/with/argument-object-wrong-shape.js ++A test/built-ins/Temporal/Duration/prototype/with/argument-sign-prop.js ++A test/built-ins/Temporal/Duration/prototype/with/argument-wrong-type.js ++M test/built-ins/Temporal/Duration/prototype/with/branding.js ++A test/built-ins/Temporal/Duration/prototype/with/partial-positive.js ++A test/built-ins/Temporal/Duration/prototype/with/sign-conflict-throws-rangeerror.js ++A test/built-ins/Temporal/Duration/prototype/with/sign-replace.js ++M test/built-ins/Temporal/Duration/seconds-undefined.js ++M test/built-ins/Temporal/Duration/weeks-undefined.js ++M test/built-ins/Temporal/Duration/years-undefined.js ++A test/built-ins/Temporal/Instant/compare/argument-object-tostring.js ++A test/built-ins/Temporal/Instant/compare/argument-wrong-type.js ++A test/built-ins/Temporal/Instant/compare/instant-string-sub-minute-offset.js ++A test/built-ins/Temporal/Instant/compare/leap-second.js ++M test/built-ins/Temporal/Instant/compare/year-zero.js ++A test/built-ins/Temporal/Instant/from/argument-instant.js ++A test/built-ins/Temporal/Instant/from/argument-object-tostring.js ++A test/built-ins/Temporal/Instant/from/argument-wrong-type.js ++A test/built-ins/Temporal/Instant/from/basic.js ++A test/built-ins/Temporal/Instant/from/instant-string-sub-minute-offset.js ++A test/built-ins/Temporal/Instant/from/leap-second.js ++M test/built-ins/Temporal/Instant/from/year-zero.js ++A test/built-ins/Temporal/Instant/prototype/add/basic.js ++M test/built-ins/Temporal/Instant/prototype/add/branding.js ++A test/built-ins/Temporal/Instant/prototype/add/disallowed-duration-units.js ++M test/built-ins/Temporal/Instant/prototype/add/result-out-of-range.js ++A test/built-ins/Temporal/Instant/prototype/equals/argument-object-tostring.js ++M test/built-ins/Temporal/Instant/prototype/equals/argument-wrong-type.js ++A test/built-ins/Temporal/Instant/prototype/equals/instant-string-sub-minute-offset.js ++A test/built-ins/Temporal/Instant/prototype/equals/leap-second.js ++M test/built-ins/Temporal/Instant/prototype/equals/year-zero.js ++M test/built-ins/Temporal/Instant/prototype/round/options-wrong-type.js ++A test/built-ins/Temporal/Instant/prototype/round/rounding-direction.js ++M test/built-ins/Temporal/Instant/prototype/round/roundingmode-invalid-string.js ++A test/built-ins/Temporal/Instant/prototype/round/roundto-invalid-string.js ++D test/built-ins/Temporal/Instant/prototype/round/smallestunit-disallowed-units.js ++M test/built-ins/Temporal/Instant/prototype/round/smallestunit-invalid-string.js ++A test/built-ins/Temporal/Instant/prototype/since/argument-object-tostring.js ++A test/built-ins/Temporal/Instant/prototype/since/argument-wrong-type.js ++A test/built-ins/Temporal/Instant/prototype/since/instant-string-sub-minute-offset.js + M test/built-ins/Temporal/Instant/prototype/since/largestunit-invalid-string.js +-A test/built-ins/Temporal/Instant/prototype/since/largestunit-smallestunit-mismatch.js ++A test/built-ins/Temporal/Instant/prototype/since/leap-second.js ++A test/built-ins/Temporal/Instant/prototype/since/options-wrong-type.js ++M test/built-ins/Temporal/Instant/prototype/since/roundingmode-invalid-string.js + M test/built-ins/Temporal/Instant/prototype/since/smallestunit-invalid-string.js +-A test/built-ins/Temporal/Instant/prototype/since/year-zero.js +-A test/built-ins/Temporal/Instant/prototype/subtract/argument-string-fractional-units-rounding-mode.js +-M test/built-ins/Temporal/Instant/prototype/toString/timezone-string-datetime.js +-M test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-datetime.js +-M test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-datetime.js +-M test/built-ins/Temporal/Instant/prototype/until/instant-string.js ++M test/built-ins/Temporal/Instant/prototype/since/year-zero.js ++A test/built-ins/Temporal/Instant/prototype/subtract/basic.js ++M test/built-ins/Temporal/Instant/prototype/subtract/branding.js ++A test/built-ins/Temporal/Instant/prototype/subtract/disallowed-duration-units.js ++M test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js ++A test/built-ins/Temporal/Instant/prototype/toJSON/year-format.js ++A test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js ++M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-invalid-string.js ++M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-non-integer.js ++A test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.js ++M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-out-of-range.js ++M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js ++M test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-wrong-type.js ++A test/built-ins/Temporal/Instant/prototype/toString/options-wrong-type.js ++A test/built-ins/Temporal/Instant/prototype/toString/rounding-cross-midnight.js ++A test/built-ins/Temporal/Instant/prototype/toString/rounding-direction.js ++A test/built-ins/Temporal/Instant/prototype/toString/roundingmode-ceil.js ++A test/built-ins/Temporal/Instant/prototype/toString/roundingmode-floor.js ++A test/built-ins/Temporal/Instant/prototype/toString/roundingmode-halfExpand.js ++M test/built-ins/Temporal/Instant/prototype/toString/roundingmode-invalid-string.js ++A test/built-ins/Temporal/Instant/prototype/toString/roundingmode-trunc.js ++A test/built-ins/Temporal/Instant/prototype/toString/smallestunit-fractionalseconddigits.js ++M test/built-ins/Temporal/Instant/prototype/toString/smallestunit-invalid-string.js ++M test/built-ins/Temporal/Instant/prototype/toString/smallestunit-valid-units.js ++A test/built-ins/Temporal/Instant/prototype/toString/timezone-string-leap-second.js ++A test/built-ins/Temporal/Instant/prototype/toString/timezone-string-year-zero.js ++A test/built-ins/Temporal/Instant/prototype/toString/timezone-wrong-type.js ++A test/built-ins/Temporal/Instant/prototype/toString/year-format.js ++A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-number.js ++A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-string-leap-second.js ++A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-wrong-type.js ++A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-leap-second.js ++A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-year-zero.js ++A test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-wrong-type.js ++A test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-leap-second.js ++A test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-year-zero.js ++A test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-wrong-type.js ++A test/built-ins/Temporal/Instant/prototype/until/argument-object-tostring.js ++A test/built-ins/Temporal/Instant/prototype/until/argument-wrong-type.js ++A test/built-ins/Temporal/Instant/prototype/until/instant-string-sub-minute-offset.js + M test/built-ins/Temporal/Instant/prototype/until/largestunit-invalid-string.js +-A test/built-ins/Temporal/Instant/prototype/until/largestunit-smallestunit-mismatch.js ++A test/built-ins/Temporal/Instant/prototype/until/leap-second.js ++A test/built-ins/Temporal/Instant/prototype/until/options-wrong-type.js ++M test/built-ins/Temporal/Instant/prototype/until/roundingmode-invalid-string.js + M test/built-ins/Temporal/Instant/prototype/until/smallestunit-invalid-string.js +-A test/built-ins/Temporal/Instant/prototype/until/year-zero.js +-A test/built-ins/Temporal/Now/builtin.js +-M test/built-ins/Temporal/Now/instant/prop-desc.js +-A test/built-ins/Temporal/Now/instant/return-value-instance.js +-A test/built-ins/Temporal/Now/plainDate/calendar-undefined.js +-A test/built-ins/Temporal/Now/plainDate/prop-desc.js +-M test/built-ins/Temporal/Now/plainDate/timezone-string-datetime.js +-A test/built-ins/Temporal/Now/plainDateISO/prop-desc.js +-A test/built-ins/Temporal/Now/plainDateISO/return-value.js +-M test/built-ins/Temporal/Now/plainDateISO/timezone-string-datetime.js +-A test/built-ins/Temporal/Now/plainDateTime/calendar-undefined.js +-M test/built-ins/Temporal/Now/plainDateTime/prop-desc.js +-M test/built-ins/Temporal/Now/plainDateTime/timezone-string-datetime.js +-M test/built-ins/Temporal/Now/plainDateTimeISO/prop-desc.js +-A test/built-ins/Temporal/Now/plainDateTimeISO/return-value-calendar.js +-M test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-datetime.js +-A test/built-ins/Temporal/Now/plainTimeISO/prop-desc.js +-A test/built-ins/Temporal/Now/plainTimeISO/return-value.js +-M test/built-ins/Temporal/Now/plainTimeISO/timezone-string-datetime.js +-A test/built-ins/Temporal/Now/prop-desc.js +-M test/built-ins/Temporal/Now/timeZone/prop-desc.js +-A test/built-ins/Temporal/Now/zonedDateTime/calendar-undefined.js +-M test/built-ins/Temporal/Now/zonedDateTime/prop-desc.js +-M test/built-ins/Temporal/Now/zonedDateTimeISO/prop-desc.js +-A test/built-ins/Temporal/Now/zonedDateTimeISO/return-value.js +-A test/built-ins/Temporal/PlainDate/compare/year-zero.js +-A test/built-ins/Temporal/PlainDate/from/argument-number.js +-R050 test/built-ins/Temporal/PlainDate/from/argument-object.js test/built-ins/Temporal/PlainDate/from/argument-object-invalid.js +-A test/built-ins/Temporal/PlainDate/from/argument-object-valid.js +-A test/built-ins/Temporal/PlainDate/from/argument-string-overflow.js +-A test/built-ins/Temporal/PlainDate/from/argument-string-trailing-junk.js +-M test/built-ins/Temporal/PlainDate/from/argument-string.js +-M test/built-ins/Temporal/PlainDate/from/options-invalid.js +-M test/built-ins/Temporal/PlainDate/from/overflow-undefined.js +-A test/built-ins/Temporal/PlainDate/from/year-zero.js +-A test/built-ins/Temporal/PlainDate/prototype/add/argument-invalid-duration.js +-A test/built-ins/Temporal/PlainDate/prototype/add/argument-missing-properties.js +-A test/built-ins/Temporal/PlainDate/prototype/add/argument-singular-units.js +-A test/built-ins/Temporal/PlainDate/prototype/add/balance-smaller-units-basic.js +-A test/built-ins/Temporal/PlainDate/prototype/add/basic.js +-A test/built-ins/Temporal/PlainDate/prototype/add/overflow-constrain.js ++M test/built-ins/Temporal/Instant/prototype/until/year-zero.js ++A test/built-ins/Temporal/Now/plainDate/calendar-number.js ++A test/built-ins/Temporal/Now/plainDate/calendar-string-leap-second.js ++A test/built-ins/Temporal/Now/plainDate/calendar-wrong-type.js ++A test/built-ins/Temporal/Now/plainDate/timezone-string-leap-second.js ++A test/built-ins/Temporal/Now/plainDate/timezone-string-year-zero.js ++A test/built-ins/Temporal/Now/plainDate/timezone-wrong-type.js ++A test/built-ins/Temporal/Now/plainDateISO/timezone-string-leap-second.js ++A test/built-ins/Temporal/Now/plainDateISO/timezone-string-year-zero.js ++A test/built-ins/Temporal/Now/plainDateISO/timezone-wrong-type.js ++A test/built-ins/Temporal/Now/plainDateTime/calendar-number.js ++A test/built-ins/Temporal/Now/plainDateTime/calendar-string-leap-second.js ++A test/built-ins/Temporal/Now/plainDateTime/calendar-wrong-type.js ++A test/built-ins/Temporal/Now/plainDateTime/timezone-string-leap-second.js ++A test/built-ins/Temporal/Now/plainDateTime/timezone-string-year-zero.js ++A test/built-ins/Temporal/Now/plainDateTime/timezone-wrong-type.js ++A test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-leap-second.js ++A test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-year-zero.js ++A test/built-ins/Temporal/Now/plainDateTimeISO/timezone-wrong-type.js ++A test/built-ins/Temporal/Now/plainTimeISO/timezone-string-leap-second.js ++A test/built-ins/Temporal/Now/plainTimeISO/timezone-string-year-zero.js ++A test/built-ins/Temporal/Now/plainTimeISO/timezone-wrong-type.js ++A test/built-ins/Temporal/Now/zonedDateTime/calendar-number.js ++A test/built-ins/Temporal/Now/zonedDateTime/calendar-string-leap-second.js ++A test/built-ins/Temporal/Now/zonedDateTime/calendar-wrong-type.js ++A test/built-ins/Temporal/Now/zonedDateTime/timezone-string-leap-second.js ++A test/built-ins/Temporal/Now/zonedDateTime/timezone-string-year-zero.js ++A test/built-ins/Temporal/Now/zonedDateTime/timezone-wrong-type.js ++A test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-leap-second.js ++A test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-year-zero.js ++A test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-wrong-type.js ++A test/built-ins/Temporal/PlainDate/calendar-number.js ++A test/built-ins/Temporal/PlainDate/calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDate/compare/argument-number.js ++A test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainDate/compare/argument-string-invalid.js ++A test/built-ins/Temporal/PlainDate/compare/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDate/compare/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainDate/compare/leap-second.js ++M test/built-ins/Temporal/PlainDate/compare/year-zero.js ++M test/built-ins/Temporal/PlainDate/from/argument-number.js ++M test/built-ins/Temporal/PlainDate/from/argument-plaindate.js ++A test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-year-zero.js ++M test/built-ins/Temporal/PlainDate/from/argument-string-invalid.js ++A test/built-ins/Temporal/PlainDate/from/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDate/from/leap-second.js ++A test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string-invalid.js ++R100 test/built-ins/Temporal/PlainDate/from/argument-string-overflow.js test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string.js ++A test/built-ins/Temporal/PlainDate/from/options-wrong-type.js ++M test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js ++M test/built-ins/Temporal/PlainDate/from/year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/add/options-wrong-type.js + M test/built-ins/Temporal/PlainDate/prototype/add/overflow-invalid-string.js +-A test/built-ins/Temporal/PlainDate/prototype/add/overflow-reject.js +-M test/built-ins/Temporal/PlainDate/prototype/add/overflow-undefined.js +-A test/built-ins/Temporal/PlainDate/prototype/equals/year-zero.js +-A test/built-ins/Temporal/PlainDate/prototype/since/days-in-month.js +-A test/built-ins/Temporal/PlainDate/prototype/since/days-in-year.js ++A test/built-ins/Temporal/PlainDate/prototype/equals/argument-number.js ++A test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-invalid.js ++M test/built-ins/Temporal/PlainDate/prototype/equals/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDate/prototype/equals/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainDate/prototype/equals/leap-second.js ++M test/built-ins/Temporal/PlainDate/prototype/equals/year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/since/argument-number.js ++A test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/since/argument-string-invalid.js ++A test/built-ins/Temporal/PlainDate/prototype/since/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDate/prototype/since/calendar-datefromfields-called-with-options-undefined.js ++M test/built-ins/Temporal/PlainDate/prototype/since/largestunit-default.js ++M test/built-ins/Temporal/PlainDate/prototype/since/largestunit-higher-units.js + M test/built-ins/Temporal/PlainDate/prototype/since/largestunit-invalid-string.js +-M test/built-ins/Temporal/PlainDate/prototype/since/largestunit-smallestunit-mismatch.js +-A test/built-ins/Temporal/PlainDate/prototype/since/largestunit-undefined.js +-A test/built-ins/Temporal/PlainDate/prototype/since/rounding-relative.js +-A test/built-ins/Temporal/PlainDate/prototype/since/roundingincrement.js +-A test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-ceil.js +-A test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-floor.js +-A test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-halfExpand.js +-A test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-trunc.js +-A test/built-ins/Temporal/PlainDate/prototype/since/smallestunit-higher-units.js ++A test/built-ins/Temporal/PlainDate/prototype/since/leap-second.js ++A test/built-ins/Temporal/PlainDate/prototype/since/options-wrong-type.js ++M test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-invalid-string.js + M test/built-ins/Temporal/PlainDate/prototype/since/smallestunit-invalid-string.js +-A test/built-ins/Temporal/PlainDate/prototype/since/weeks-months.js +-A test/built-ins/Temporal/PlainDate/prototype/since/year-zero.js +-A test/built-ins/Temporal/PlainDate/prototype/subtract/argument-invalid-duration.js +-A test/built-ins/Temporal/PlainDate/prototype/subtract/argument-missing-properties.js +-A test/built-ins/Temporal/PlainDate/prototype/subtract/argument-singular-units.js +-A test/built-ins/Temporal/PlainDate/prototype/subtract/balance-smaller-units-basic.js +-A test/built-ins/Temporal/PlainDate/prototype/subtract/basic.js +-A test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-constrain.js ++M test/built-ins/Temporal/PlainDate/prototype/since/year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/subtract/options-wrong-type.js + M test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-invalid-string.js +-A test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-reject.js +-M test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-undefined.js +-A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-no-implicit-midnight.js +-A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-designator-required-for-disambiguation.js +-A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-with-time-designator.js +-A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/year-zero.js +-A test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/limits.js +-A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-no-implicit-midnight.js +-A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-designator-required-for-disambiguation.js +-A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-with-time-designator.js +-M test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/basic.js +-M test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-datetime.js +-A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/toJSON/year-format.js ++A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-number.js ++M test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-designator-required-for-disambiguation.js ++A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/leap-second.js ++A test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/limits.js ++M test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/plaintime-propertybag-no-time-units.js ++M test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainDate/prototype/toString/options-wrong-type.js ++A test/built-ins/Temporal/PlainDate/prototype/toString/year-format.js ++A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-number.js ++M test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-designator-required-for-disambiguation.js ++A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/leap-second.js ++M test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/plaintime-propertybag-no-time-units.js ++A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-leap-second.js ++A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-wrong-type.js ++M test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/until/argument-number.js ++A test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/until/argument-string-invalid.js ++A test/built-ins/Temporal/PlainDate/prototype/until/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDate/prototype/until/calendar-datefromfields-called-with-options-undefined.js ++M test/built-ins/Temporal/PlainDate/prototype/until/largestunit-default.js ++M test/built-ins/Temporal/PlainDate/prototype/until/largestunit-higher-units.js + M test/built-ins/Temporal/PlainDate/prototype/until/largestunit-invalid-string.js +-M test/built-ins/Temporal/PlainDate/prototype/until/largestunit-smallestunit-mismatch.js +-A test/built-ins/Temporal/PlainDate/prototype/until/largestunit-undefined.js +-A test/built-ins/Temporal/PlainDate/prototype/until/rounding-relative.js +-A test/built-ins/Temporal/PlainDate/prototype/until/roundingincrement.js +-A test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-ceil.js +-A test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-floor.js +-A test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-halfExpand.js +-A test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-trunc.js +-A test/built-ins/Temporal/PlainDate/prototype/until/smallestunit-higher-units.js ++A test/built-ins/Temporal/PlainDate/prototype/until/leap-second.js ++A test/built-ins/Temporal/PlainDate/prototype/until/options-wrong-type.js ++M test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-invalid-string.js + M test/built-ins/Temporal/PlainDate/prototype/until/smallestunit-invalid-string.js +-A test/built-ins/Temporal/PlainDate/prototype/until/year-zero.js +-A test/built-ins/Temporal/PlainDate/prototype/with/copy-properties-not-undefined.js +-A test/built-ins/Temporal/PlainDateTime/compare/year-zero.js +-A test/built-ins/Temporal/PlainDateTime/from/year-zero.js +-A test/built-ins/Temporal/PlainDateTime/prototype/add/argument-string-fractional-units-rounding-mode.js +-A test/built-ins/Temporal/PlainDateTime/prototype/equals/year-zero.js ++M test/built-ins/Temporal/PlainDate/prototype/until/year-zero.js ++A test/built-ins/Temporal/PlainDate/prototype/with/options-wrong-type.js ++M test/built-ins/Temporal/PlainDate/prototype/with/overflow-invalid-string.js ++A test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-number.js ++A test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-string-leap-second.js ++A test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/calendar-number.js ++A test/built-ins/Temporal/PlainDateTime/calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/compare/argument-number.js ++A test/built-ins/Temporal/PlainDateTime/compare/argument-object-insufficient-data.js ++A test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainDateTime/compare/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/compare/basic.js ++A test/built-ins/Temporal/PlainDateTime/compare/calendar-ignored.js ++A test/built-ins/Temporal/PlainDateTime/compare/cast.js ++A test/built-ins/Temporal/PlainDateTime/compare/leap-second.js ++M test/built-ins/Temporal/PlainDateTime/compare/year-zero.js ++A test/built-ins/Temporal/PlainDateTime/constructor-full.js ++A test/built-ins/Temporal/PlainDateTime/datetime-math.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-number.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-object-month.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-object.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-plaindatetime.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-string-comma-decimal-separator.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-string-invalid.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-string-minus-sign.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-string-offset.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-string-optional-data.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-string-out-of-range.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-string-subsecond.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-string-timezone.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-string.js ++A test/built-ins/Temporal/PlainDateTime/from/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/from/leap-second.js ++A test/built-ins/Temporal/PlainDateTime/from/limits.js ++A test/built-ins/Temporal/PlainDateTime/from/options-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/from/overflow-default-constrain.js ++M test/built-ins/Temporal/PlainDateTime/from/overflow-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/from/overflow-reject.js ++M test/built-ins/Temporal/PlainDateTime/from/year-zero.js ++M test/built-ins/Temporal/PlainDateTime/hour-undefined.js ++A test/built-ins/Temporal/PlainDateTime/limits.js ++M test/built-ins/Temporal/PlainDateTime/microsecond-undefined.js ++M test/built-ins/Temporal/PlainDateTime/millisecond-undefined.js ++M test/built-ins/Temporal/PlainDateTime/minute-undefined.js ++M test/built-ins/Temporal/PlainDateTime/nanosecond-undefined.js ++A test/built-ins/Temporal/PlainDateTime/prototype/add/ambiguous-date.js ++A test/built-ins/Temporal/PlainDateTime/prototype/add/argument-duration.js ++A test/built-ins/Temporal/PlainDateTime/prototype/add/argument-object-insufficient-data.js ++A test/built-ins/Temporal/PlainDateTime/prototype/add/argument-plain-object-mixed-signs.js ++A test/built-ins/Temporal/PlainDateTime/prototype/add/hour-overflow.js ++A test/built-ins/Temporal/PlainDateTime/prototype/add/limits.js ++A test/built-ins/Temporal/PlainDateTime/prototype/add/negative-duration.js ++A test/built-ins/Temporal/PlainDateTime/prototype/add/options-empty.js ++A test/built-ins/Temporal/PlainDateTime/prototype/add/options-invalid.js ++A test/built-ins/Temporal/PlainDateTime/prototype/add/options-wrong-type.js ++M test/built-ins/Temporal/PlainDateTime/prototype/add/overflow-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/dayOfWeek/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/dayOfYear/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-number.js ++A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-object-insufficient-data.js ++A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js ++M test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/equals/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/equals/calendar-checked.js ++A test/built-ins/Temporal/PlainDateTime/prototype/equals/cast.js ++A test/built-ins/Temporal/PlainDateTime/prototype/equals/leap-second.js ++M test/built-ins/Temporal/PlainDateTime/prototype/equals/year-zero.js ++A test/built-ins/Temporal/PlainDateTime/prototype/monthsInYear/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/balance.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/limits.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/options-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/rounding-direction.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-divides.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-does-not-divide.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-one-day.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-ceil-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-floor-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-is-default.js ++M test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-trunc-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/roundto-invalid-string.js ++D test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-disallowed-units.js ++M test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object-insufficient-data.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/throws-no-argument.js ++A test/built-ins/Temporal/PlainDateTime/prototype/round/throws-undefined.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-number.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-object.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/different-calendars-throws.js + M test/built-ins/Temporal/PlainDateTime/prototype/since/largestunit-invalid-string.js +-A test/built-ins/Temporal/PlainDateTime/prototype/since/largestunit-smallestunit-mismatch.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/leap-second.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/no-unnecessary-units.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/options-empty.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/options-invalid.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/options-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/returns-days.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/round-relative-to-receiver.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-cleanly-divides.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-does-not-divide.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-ceil-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-floor-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-default-changes.js ++M test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-is-default.js + M test/built-ins/Temporal/PlainDateTime/prototype/since/smallestunit-invalid-string.js +-A test/built-ins/Temporal/PlainDateTime/prototype/since/year-zero.js +-A test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-string-fractional-units-rounding-mode.js +-M test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-datetime.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/subseconds.js ++A test/built-ins/Temporal/PlainDateTime/prototype/since/weeks-months-mutually-exclusive.js ++M test/built-ins/Temporal/PlainDateTime/prototype/since/year-zero.js ++A test/built-ins/Temporal/PlainDateTime/prototype/subtract/ambiguous-date.js ++A test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-duration.js ++A test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-object-insufficient-data.js ++A test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-plain-object-mixed-signs.js ++A test/built-ins/Temporal/PlainDateTime/prototype/subtract/hour-overflow.js ++A test/built-ins/Temporal/PlainDateTime/prototype/subtract/limits.js ++A test/built-ins/Temporal/PlainDateTime/prototype/subtract/negative-duration.js ++A test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-empty.js ++A test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-invalid.js ++A test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-wrong-type.js ++M test/built-ins/Temporal/PlainDateTime/prototype/subtract/overflow-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toJSON/year-format.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toPlainTime/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-always.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js ++M test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-never.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js ++M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-invalid-string.js ++M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-non-integer.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.js ++M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-out-of-range.js ++M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js ++M test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/options-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-cross-midnight.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-direction.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-ceil.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-floor.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-halfExpand.js ++M test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-trunc.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-fractionalseconddigits.js ++M test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-invalid-string.js ++M test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-valid-units.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toString/year-format.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/basic.js ++M test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/invalid-instant.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/multiple-instants.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-object.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-leap-second.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-year-zero.js ++A test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-number.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-object.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/argument-wrong-type.js ++M test/built-ins/Temporal/PlainDateTime/prototype/until/balance-negative-duration.js ++M test/built-ins/Temporal/PlainDateTime/prototype/until/balance.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/casts-argument.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/different-calendars-throws.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/inverse.js + M test/built-ins/Temporal/PlainDateTime/prototype/until/largestunit-invalid-string.js +-A test/built-ins/Temporal/PlainDateTime/prototype/until/largestunit-smallestunit-mismatch.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/leap-second.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/no-unnecessary-units.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/options-empty.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/options-invalid.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/options-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/returns-days.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/round-relative-to-receiver.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-cleanly-divides.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-does-not-divide.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-ceil-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-default-changes.js ++M test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-is-default.js + M test/built-ins/Temporal/PlainDateTime/prototype/until/smallestunit-invalid-string.js +-A test/built-ins/Temporal/PlainDateTime/prototype/until/year-zero.js +-A test/built-ins/Temporal/PlainDateTime/prototype/with/copy-properties-not-undefined.js +-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/year-zero.js +-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-no-implicit-midnight.js +-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js +-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-with-time-designator.js +-A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/year-zero.js +-A test/built-ins/Temporal/PlainMonthDay/from/year-zero.js +-A test/built-ins/Temporal/PlainMonthDay/prototype/equals/year-zero.js +-A test/built-ins/Temporal/PlainMonthDay/prototype/with/copy-properties-not-undefined.js +-A test/built-ins/Temporal/PlainTime/compare/argument-cast.js +-A test/built-ins/Temporal/PlainTime/compare/argument-string-no-implicit-midnight.js +-A test/built-ins/Temporal/PlainTime/compare/argument-string-time-designator-required-for-disambiguation.js +-A test/built-ins/Temporal/PlainTime/compare/argument-string-with-time-designator.js +-A test/built-ins/Temporal/PlainTime/compare/basic.js +-A test/built-ins/Temporal/PlainTime/compare/year-zero.js +-A test/built-ins/Temporal/PlainTime/from/argument-plaindatetime.js +-A test/built-ins/Temporal/PlainTime/from/argument-plaintime.js +-A test/built-ins/Temporal/PlainTime/from/argument-string-invalid.js +-A test/built-ins/Temporal/PlainTime/from/argument-string-no-implicit-midnight.js +-A test/built-ins/Temporal/PlainTime/from/argument-string-time-designator-required-for-disambiguation.js +-A test/built-ins/Temporal/PlainTime/from/argument-string-trailing-junk.js +-A test/built-ins/Temporal/PlainTime/from/argument-string-with-time-designator.js +-A test/built-ins/Temporal/PlainTime/from/argument-string.js +-A test/built-ins/Temporal/PlainTime/from/options-invalid.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/subseconds.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/units-changed.js ++A test/built-ins/Temporal/PlainDateTime/prototype/until/weeks-months-mutually-exclusive.js ++M test/built-ins/Temporal/PlainDateTime/prototype/until/year-zero.js ++A test/built-ins/Temporal/PlainDateTime/prototype/valueOf/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/weekOfYear/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/argument-not-object.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/argument-object-insufficient-data.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-options.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-throws.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/month-and-monthcode-must-agree.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/multiple-unrecognized-properties-ignored.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/options-empty.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/options-invalid.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/options-wrong-type.js ++M test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js ++M test/built-ins/Temporal/PlainDateTime/prototype/with/overflow-invalid-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/string-throws.js ++A test/built-ins/Temporal/PlainDateTime/prototype/with/timezone-throws.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/argument-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/basic.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-number.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-string-leap-second.js ++M test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-temporal-object.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-number.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object-insufficient-data.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-invalid.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/leap-second.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/non-compatible-calendars-throw.js ++M test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/year-zero.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-number.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-object-insufficient-data.js ++M test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-without-time-designator.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-time.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-wrong-type.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/leap-second.js ++A test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/no-argument-default-to-midnight.js ++M test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js ++M test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/year-zero.js ++M test/built-ins/Temporal/PlainDateTime/second-undefined.js ++A test/built-ins/Temporal/PlainMonthDay/calendar-always.js ++A test/built-ins/Temporal/PlainMonthDay/calendar-number.js ++A test/built-ins/Temporal/PlainMonthDay/calendar-wrong-type.js ++A test/built-ins/Temporal/PlainMonthDay/from/argument-number.js ++A test/built-ins/Temporal/PlainMonthDay/from/argument-plainmonthday.js ++A test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainMonthDay/from/argument-wrong-type.js ++A test/built-ins/Temporal/PlainMonthDay/from/calendar-monthdayfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainMonthDay/from/leap-second.js ++A test/built-ins/Temporal/PlainMonthDay/from/options-wrong-type.js ++M test/built-ins/Temporal/PlainMonthDay/from/overflow-invalid-string.js ++M test/built-ins/Temporal/PlainMonthDay/from/year-zero.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-number.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-year-zero.js ++M test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-wrong-type.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/equals/calendar-monthdayfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/equals/leap-second.js ++M test/built-ins/Temporal/PlainMonthDay/prototype/equals/year-zero.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/toJSON/year-format.js ++M test/built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-always.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/toString/options-wrong-type.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/toString/year-format.js ++A test/built-ins/Temporal/PlainMonthDay/prototype/with/options-wrong-type.js ++M test/built-ins/Temporal/PlainMonthDay/prototype/with/overflow-invalid-string.js ++A test/built-ins/Temporal/PlainTime/compare/argument-number.js ++M test/built-ins/Temporal/PlainTime/compare/argument-string-time-designator-required-for-disambiguation.js ++A test/built-ins/Temporal/PlainTime/compare/argument-wrong-type.js ++A test/built-ins/Temporal/PlainTime/compare/leap-second.js ++M test/built-ins/Temporal/PlainTime/compare/plaintime-propertybag-no-time-units.js ++M test/built-ins/Temporal/PlainTime/compare/year-zero.js ++A test/built-ins/Temporal/PlainTime/from/argument-number.js ++A test/built-ins/Temporal/PlainTime/from/argument-object-leap-second.js ++A test/built-ins/Temporal/PlainTime/from/argument-object.js ++M test/built-ins/Temporal/PlainTime/from/argument-plaintime.js ++A test/built-ins/Temporal/PlainTime/from/argument-string-leap-second.js ++M test/built-ins/Temporal/PlainTime/from/argument-string-time-designator-required-for-disambiguation.js ++A test/built-ins/Temporal/PlainTime/from/argument-wrong-type.js ++A test/built-ins/Temporal/PlainTime/from/leap-second.js ++R100 test/built-ins/Temporal/PlainTime/from/argument-string-invalid.js test/built-ins/Temporal/PlainTime/from/observable-get-overflow-argument-string-invalid.js ++A test/built-ins/Temporal/PlainTime/from/options-wrong-type.js ++A test/built-ins/Temporal/PlainTime/from/overflow-constrain.js + M test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js +-M test/built-ins/Temporal/PlainTime/from/overflow-undefined.js +-A test/built-ins/Temporal/PlainTime/from/year-zero.js +-A test/built-ins/Temporal/PlainTime/prototype/add/argument-object-invalid.js +-A test/built-ins/Temporal/PlainTime/prototype/add/argument-string-fractional-units-rounding-mode.js +-A test/built-ins/Temporal/PlainTime/prototype/add/options-ignored.js +-A test/built-ins/Temporal/PlainTime/prototype/equals/argument-cast.js +-A test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-no-implicit-midnight.js +-A test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-designator-required-for-disambiguation.js +-A test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-with-time-designator.js +-A test/built-ins/Temporal/PlainTime/prototype/equals/basic.js +-A test/built-ins/Temporal/PlainTime/prototype/equals/year-zero.js ++A test/built-ins/Temporal/PlainTime/from/overflow-reject.js ++M test/built-ins/Temporal/PlainTime/from/year-zero.js ++A test/built-ins/Temporal/PlainTime/negative-zero.js ++A test/built-ins/Temporal/PlainTime/prototype/add/argument-duration.js ++A test/built-ins/Temporal/PlainTime/prototype/add/argument-higher-units.js ++A test/built-ins/Temporal/PlainTime/prototype/add/argument-object.js ++A test/built-ins/Temporal/PlainTime/prototype/equals/argument-number.js ++M test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-designator-required-for-disambiguation.js ++M test/built-ins/Temporal/PlainTime/prototype/equals/argument-wrong-type.js ++A test/built-ins/Temporal/PlainTime/prototype/equals/leap-second.js ++M test/built-ins/Temporal/PlainTime/prototype/equals/plaintime-propertybag-no-time-units.js ++M test/built-ins/Temporal/PlainTime/prototype/equals/year-zero.js ++A test/built-ins/Temporal/PlainTime/prototype/round/options-wrong-type.js ++A test/built-ins/Temporal/PlainTime/prototype/round/rounding-cross-midnight.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-hours.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-invalid.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-microseconds.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-milliseconds.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-minutes.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-nanoseconds.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-seconds.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-ceil.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-floor.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-halfExpand.js + M test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js +-A test/built-ins/Temporal/PlainTime/prototype/since/argument-string-no-implicit-midnight.js +-A test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-designator-required-for-disambiguation.js +-A test/built-ins/Temporal/PlainTime/prototype/since/argument-string-with-time-designator.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-trunc.js ++M test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-undefined.js ++A test/built-ins/Temporal/PlainTime/prototype/round/roundto-invalid-string.js ++D test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-disallowed-units.js ++M test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-invalid-string.js ++A test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-missing.js ++A test/built-ins/Temporal/PlainTime/prototype/since/argument-cast.js ++A test/built-ins/Temporal/PlainTime/prototype/since/argument-number.js ++M test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-designator-required-for-disambiguation.js ++A test/built-ins/Temporal/PlainTime/prototype/since/argument-wrong-type.js ++A test/built-ins/Temporal/PlainTime/prototype/since/basic.js + M test/built-ins/Temporal/PlainTime/prototype/since/largestunit-invalid-string.js +-A test/built-ins/Temporal/PlainTime/prototype/since/largestunit-smallestunit-mismatch.js +-A test/built-ins/Temporal/PlainTime/prototype/since/options-invalid.js ++M test/built-ins/Temporal/PlainTime/prototype/since/largestunit.js ++A test/built-ins/Temporal/PlainTime/prototype/since/leap-second.js ++A test/built-ins/Temporal/PlainTime/prototype/since/options-wrong-type.js ++M test/built-ins/Temporal/PlainTime/prototype/since/plaintime-propertybag-no-time-units.js ++A test/built-ins/Temporal/PlainTime/prototype/since/result-sub-second.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-hours.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-invalid.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-microseconds.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-milliseconds.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-minutes.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-nanoseconds.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-seconds.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-ceil.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-floor.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-halfExpand.js + M test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js ++A test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-trunc.js ++M test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-undefined.js + M test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-invalid-string.js +-M test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-undefined.js +-A test/built-ins/Temporal/PlainTime/prototype/since/year-zero.js +-A test/built-ins/Temporal/PlainTime/prototype/subtract/argument-object-invalid.js +-A test/built-ins/Temporal/PlainTime/prototype/subtract/argument-string-fractional-units-rounding-mode.js +-A test/built-ins/Temporal/PlainTime/prototype/subtract/options-ignored.js +-A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/year-zero.js +-A test/built-ins/Temporal/PlainTime/prototype/toString/basic.js +-A test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js ++M test/built-ins/Temporal/PlainTime/prototype/since/year-zero.js ++A test/built-ins/Temporal/PlainTime/prototype/subtract/argument-duration.js ++A test/built-ins/Temporal/PlainTime/prototype/subtract/argument-higher-units.js ++A test/built-ins/Temporal/PlainTime/prototype/subtract/argument-object.js ++A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-number.js ++A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-string-invalid.js ++A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-wrong-type.js ++A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/leap-second.js ++A test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/limits.js ++M test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/year-zero.js ++M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js + M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js +-A test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js ++M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-non-integer.js ++M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js + M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js + M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js +-A test/built-ins/Temporal/PlainTime/prototype/toString/options-invalid.js +-M test/built-ins/Temporal/PlainTime/prototype/toString/options-undefined.js +-A test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js +-A test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js +-A test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js +-A test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js ++M test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-wrong-type.js ++A test/built-ins/Temporal/PlainTime/prototype/toString/options-wrong-type.js ++M test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js ++M test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js ++M test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js ++M test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js + M test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js +-A test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js +-A test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js ++M test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js ++M test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js + M test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js + M test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js +-M test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/basic.js +-M test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-datetime.js +-A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/year-zero.js +-A test/built-ins/Temporal/PlainTime/prototype/until/argument-string-no-implicit-midnight.js +-A test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-designator-required-for-disambiguation.js +-A test/built-ins/Temporal/PlainTime/prototype/until/argument-string-with-time-designator.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-number.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-invalid.js ++M test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-with-utc-designator.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-wrong-type.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/leap-second.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-leap-second.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-year-zero.js ++A test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-wrong-type.js ++M test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/year-zero.js ++A test/built-ins/Temporal/PlainTime/prototype/until/argument-cast.js ++A test/built-ins/Temporal/PlainTime/prototype/until/argument-number.js ++M test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-designator-required-for-disambiguation.js ++A test/built-ins/Temporal/PlainTime/prototype/until/argument-wrong-type.js ++A test/built-ins/Temporal/PlainTime/prototype/until/basic.js + M test/built-ins/Temporal/PlainTime/prototype/until/largestunit-invalid-string.js +-A test/built-ins/Temporal/PlainTime/prototype/until/largestunit-smallestunit-mismatch.js +-A test/built-ins/Temporal/PlainTime/prototype/until/options-invalid.js +-M test/built-ins/Temporal/PlainTime/prototype/until/options-undefined.js ++A test/built-ins/Temporal/PlainTime/prototype/until/largestunit.js ++A test/built-ins/Temporal/PlainTime/prototype/until/leap-second.js ++A test/built-ins/Temporal/PlainTime/prototype/until/options-wrong-type.js ++M test/built-ins/Temporal/PlainTime/prototype/until/plaintime-propertybag-no-time-units.js ++A test/built-ins/Temporal/PlainTime/prototype/until/result-sub-second.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-hours.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-invalid.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-microseconds.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-milliseconds.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-minutes.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-nanoseconds.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-seconds.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-ceil.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-floor.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-halfExpand.js + M test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js ++A test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-trunc.js ++M test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-undefined.js + M test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-invalid-string.js +-M test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-undefined.js +-A test/built-ins/Temporal/PlainTime/prototype/until/year-zero.js +-A test/built-ins/Temporal/PlainTime/prototype/valueOf/basic.js +-A test/built-ins/Temporal/PlainTime/prototype/with/copy-properties-not-undefined.js +-A test/built-ins/Temporal/PlainYearMonth/basic.js +-A test/built-ins/Temporal/PlainYearMonth/compare/argument-cast.js +-A test/built-ins/Temporal/PlainYearMonth/compare/basic.js +-A test/built-ins/Temporal/PlainYearMonth/compare/compare-calendar.js +-A test/built-ins/Temporal/PlainYearMonth/compare/compare-reference-day.js +-M test/built-ins/Temporal/PlainYearMonth/compare/use-internal-slots.js +-A test/built-ins/Temporal/PlainYearMonth/compare/year-zero.js +-M test/built-ins/Temporal/PlainYearMonth/constructor.js +-A test/built-ins/Temporal/PlainYearMonth/from/argument-number.js +-A test/built-ins/Temporal/PlainYearMonth/from/argument-object.js +-A test/built-ins/Temporal/PlainYearMonth/from/argument-plaindate.js +-A test/built-ins/Temporal/PlainYearMonth/from/argument-plainyearmonth.js +-A test/built-ins/Temporal/PlainYearMonth/from/argument-string-invalid.js +-A test/built-ins/Temporal/PlainYearMonth/from/argument-string-trailing-junk.js +-M test/built-ins/Temporal/PlainYearMonth/from/argument-string.js +-A test/built-ins/Temporal/PlainYearMonth/from/limits.js +-A test/built-ins/Temporal/PlainYearMonth/from/options-invalid.js +-A test/built-ins/Temporal/PlainYearMonth/from/overflow-constrain.js ++M test/built-ins/Temporal/PlainTime/prototype/until/year-zero.js ++A test/built-ins/Temporal/PlainTime/prototype/with/options-wrong-type.js ++M test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js ++A test/built-ins/Temporal/PlainYearMonth/calendar-always.js ++A test/built-ins/Temporal/PlainYearMonth/calendar-number.js ++A test/built-ins/Temporal/PlainYearMonth/calendar-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/compare/argument-number.js ++A test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainYearMonth/compare/argument-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/compare/calendar-yearmonthfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainYearMonth/compare/leap-second.js ++M test/built-ins/Temporal/PlainYearMonth/compare/year-zero.js ++M test/built-ins/Temporal/PlainYearMonth/from/argument-number.js ++M test/built-ins/Temporal/PlainYearMonth/from/argument-plainyearmonth.js ++A test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainYearMonth/from/argument-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/from/calendar-yearmonthfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainYearMonth/from/leap-second.js ++A test/built-ins/Temporal/PlainYearMonth/from/options-wrong-type.js + M test/built-ins/Temporal/PlainYearMonth/from/overflow-invalid-string.js +-A test/built-ins/Temporal/PlainYearMonth/from/overflow-reject.js +-M test/built-ins/Temporal/PlainYearMonth/from/overflow-undefined.js +-A test/built-ins/Temporal/PlainYearMonth/from/year-zero.js +-A test/built-ins/Temporal/PlainYearMonth/limits.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/add/argument-duration-object.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/add/argument-lower-units.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/add/argument-object-invalid.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/add/argument-object-plural.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/add/argument-object.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/add/limits.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/add/month-length.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/add/options-invalid.js ++M test/built-ins/Temporal/PlainYearMonth/from/year-zero.js ++M test/built-ins/Temporal/PlainYearMonth/limits.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/add/options-wrong-type.js + M test/built-ins/Temporal/PlainYearMonth/prototype/add/overflow-invalid-string.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/add/overflow-undefined.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/add/overflow-wrong-type.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/daysInMonth/basic.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/daysInYear/basic.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-cast.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/basic.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/compare-calendar.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/compare-reference-day.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/use-internal-slots.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/equals/year-zero.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/monthsInYear/basic.js +-R100 test/built-ins/Temporal/PlainYearMonth/prototype/since/arguments-casting.js test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-casting.js +-D test/built-ins/Temporal/PlainYearMonth/prototype/since/basic.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-auto.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-number.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-year-zero.js ++M test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/equals/calendar-yearmonthfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/equals/leap-second.js ++M test/built-ins/Temporal/PlainYearMonth/prototype/equals/year-zero.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-number.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-yearmonthfromfields-called-with-options-undefined.js + M test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-invalid-string.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-months.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-smallestunit-mismatch.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-undefined.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-years.js +-D test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit.js +-D test/built-ins/Temporal/PlainYearMonth/prototype/since/negation.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/since/options-undefined.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingincrement-as-expected.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-ceil.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-floor.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-halfExpand.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-trunc.js +-D test/built-ins/Temporal/PlainYearMonth/prototype/since/smallestunit-disallowed-units.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/since/leap-second.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/since/options-wrong-type.js ++M test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-invalid-string.js + M test/built-ins/Temporal/PlainYearMonth/prototype/since/smallestunit-invalid-string.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/since/year-zero.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/argument-duration-object.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/argument-lower-units.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/argument-object-invalid.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/argument-object-plural.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/argument-object.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/limits.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/month-length.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/options-invalid.js ++M test/built-ins/Temporal/PlainYearMonth/prototype/since/year-zero.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/subtract/options-wrong-type.js + M test/built-ins/Temporal/PlainYearMonth/prototype/subtract/overflow-invalid-string.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/subtract/overflow-undefined.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/subtract/overflow-wrong-type.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/basic.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-always.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-auto.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-invalid-string.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-never.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-casting.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/arguments-missing-throws.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-auto.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-disallowed-units.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/toJSON/year-format.js ++M test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-always.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/toString/options-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/toString/year-format.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-number.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-wrong-type.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-yearmonthfromfields-called-with-options-undefined.js + M test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-invalid-string.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-months.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-smallestunit-mismatch.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-undefined.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-years.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/mixed-calendar-invalid.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/options-invalid.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/until/options-undefined.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingincrement-as-expected.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-ceil.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-floor.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-halfExpand.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-trunc.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/until/leap-second.js ++A test/built-ins/Temporal/PlainYearMonth/prototype/until/options-wrong-type.js ++M test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-invalid-string.js + M test/built-ins/Temporal/PlainYearMonth/prototype/until/smallestunit-invalid-string.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/until/year-zero.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/valueOf/basic.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/with/argument-calendar-field.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/with/argument-missing-fields.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/with/argument-timezone-field.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/with/basic.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/with/copy-properties-not-undefined.js +-A test/built-ins/Temporal/PlainYearMonth/prototype/with/options-wrong-type.js ++M test/built-ins/Temporal/PlainYearMonth/prototype/until/year-zero.js ++M test/built-ins/Temporal/PlainYearMonth/prototype/with/options-wrong-type.js + M test/built-ins/Temporal/PlainYearMonth/prototype/with/overflow-invalid-string.js +-M test/built-ins/Temporal/PlainYearMonth/prototype/with/overflow-undefined.js +-M test/built-ins/Temporal/TimeZone/from/argument-primitive.js +-M test/built-ins/Temporal/TimeZone/from/timezone-string-datetime.js +-A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/year-zero.js +-A test/built-ins/Temporal/TimeZone/prototype/getNextTransition/year-zero.js +-A test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/year-zero.js +-A test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/year-zero.js +-A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/branding.js +-M test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/custom-timezone.js +-M test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/instant-string.js +-A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/year-zero.js +-A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/year-zero.js +-A test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/year-zero.js +-A test/built-ins/Temporal/TimeZone/prototype/id/branding.js +-A test/built-ins/Temporal/TimeZone/prototype/id/custom-timezone.js +-M test/built-ins/Temporal/TimeZone/prototype/id/no-toString.js +-D test/built-ins/Temporal/TimeZone/prototype/id/plain-custom-timezone.js +-A test/built-ins/Temporal/TimeZone/prototype/toJSON/branding.js +-M test/built-ins/Temporal/TimeZone/prototype/toJSON/tostring-call.js +-M test/built-ins/Temporal/TimeZone/prototype/toJSON/tostring-undefined-custom.js +-A test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-offset-not-agreeing-with-timezone.js +-M test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-datetime.js +-A test/built-ins/Temporal/ZonedDateTime/compare/year-zero.js +-M test/built-ins/Temporal/ZonedDateTime/compare/zoneddatetime-string.js +-A test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-offset-not-agreeing-with-timezone.js +-M test/built-ins/Temporal/ZonedDateTime/from/timezone-string-datetime.js +-A test/built-ins/Temporal/ZonedDateTime/from/year-zero.js +-M test/built-ins/Temporal/ZonedDateTime/from/zoneddatetime-string.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/add/argument-string-fractional-units-rounding-mode.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-offset-not-agreeing-with-timezone.js +-M test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-datetime.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/equals/year-zero.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-offset-not-agreeing-with-timezone.js ++A test/built-ins/Temporal/TimeZone/from/timezone-string-leap-second.js ++A test/built-ins/Temporal/TimeZone/from/timezone-string-year-zero.js ++A test/built-ins/Temporal/TimeZone/from/timezone-wrong-type.js ++A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-number.js ++A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-wrong-type.js ++A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/leap-second.js ++A test/built-ins/Temporal/TimeZone/prototype/getInstantFor/options-wrong-type.js ++M test/built-ins/Temporal/TimeZone/prototype/getInstantFor/year-zero.js ++A test/built-ins/Temporal/TimeZone/prototype/getNextTransition/leap-second.js ++M test/built-ins/Temporal/TimeZone/prototype/getNextTransition/year-zero.js ++A test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/leap-second.js ++M test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/year-zero.js ++A test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/leap-second.js ++M test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/year-zero.js ++A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-object-tostring.js ++A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-wrong-type.js ++A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-number.js ++A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-string-leap-second.js ++A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-wrong-type.js ++A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/instant-string-sub-minute-offset.js ++A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/leap-second.js ++A test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/limits.js ++M test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/year-zero.js ++A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-number.js ++A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-wrong-type.js ++A test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/leap-second.js ++M test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/year-zero.js ++A test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/leap-second.js ++M test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/calendar-number.js ++A test/built-ins/Temporal/ZonedDateTime/calendar-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/compare/argument-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/compare/leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/compare/timezone-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/compare/year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/from/argument-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/from/argument-zoneddatetime.js ++A test/built-ins/Temporal/ZonedDateTime/from/leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/from/options-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/from/overflow-invalid-string.js ++A test/built-ins/Temporal/ZonedDateTime/from/timezone-string-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/from/timezone-string-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/from/timezone-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/from/year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/add/options-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/add/overflow-invalid-string.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/equals/leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/equals/year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/round/options-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/round/rounding-direction.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/round/roundingmode-invalid-string.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/round/roundto-invalid-string.js ++D test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-disallowed-units.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-invalid-string.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/calendar-dateadd-called-with-options-undefined.js + M test/built-ins/Temporal/ZonedDateTime/prototype/since/largestunit-invalid-string.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/since/largestunit-smallestunit-mismatch.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/options-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-invalid-string.js + M test/built-ins/Temporal/ZonedDateTime/prototype/since/smallestunit-invalid-string.js +-M test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-datetime.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/since/year-zero.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/subtract/argument-string-fractional-units-rounding-mode.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-offset-not-agreeing-with-timezone.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/since/year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/subtract/options-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/subtract/overflow-invalid-string.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toJSON/year-format.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-invalid-string.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-non-integer.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-out-of-range.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/options-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-cross-midnight.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-direction.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-ceil.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-floor.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-halfExpand.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-invalid-string.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-trunc.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-fractionalseconddigits.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-invalid-string.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-valid-units.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/toString/year-format.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/calendar-dateadd-called-with-options-undefined.js + M test/built-ins/Temporal/ZonedDateTime/prototype/until/largestunit-invalid-string.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/until/largestunit-smallestunit-mismatch.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/options-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-invalid-string.js + M test/built-ins/Temporal/ZonedDateTime/prototype/until/smallestunit-invalid-string.js +-M test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-datetime.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/until/year-zero.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/with/copy-properties-not-undefined.js +-M test/built-ins/Temporal/ZonedDateTime/prototype/with/offset-undefined.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/year-zero.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-no-implicit-midnight.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-with-time-designator.js +-A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/year-zero.js +-M test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-datetime.js +-M test/built-ins/Temporal/ZonedDateTime/timezone-string-datetime.js +-A test/intl402/DurationFormat/instance/extensibility.js +-A test/intl402/DurationFormat/instance/length.js +-A test/intl402/DurationFormat/instance/name.js +-A test/intl402/DurationFormat/instance/prop-desc.js +-A test/intl402/DurationFormat/instance/prototype.js +-A test/intl402/DurationFormat/prototype/constructor/prop-desc.js +-A test/intl402/DurationFormat/prototype/constructor/value.js +-A test/intl402/DurationFormat/prototype/format/length.js +-A test/intl402/DurationFormat/prototype/format/name.js +-A test/intl402/DurationFormat/prototype/format/prop-desc.js +-A test/intl402/DurationFormat/prototype/format/throw-invoked-as-func.js +-A test/intl402/DurationFormat/prototype/formatToParts/length.js +-A test/intl402/DurationFormat/prototype/formatToParts/name.js +-A test/intl402/DurationFormat/prototype/formatToParts/prop-desc.js +-A test/intl402/DurationFormat/prototype/formatToParts/throw-invoked-as-func.js +-A test/intl402/DurationFormat/prototype/resolvedOptions/length.js +-A test/intl402/DurationFormat/prototype/resolvedOptions/name.js +-A test/intl402/DurationFormat/prototype/resolvedOptions/prop-desc.js +-A test/intl402/DurationFormat/prototype/resolvedOptions/throw-invoked-as-func.js +-A test/intl402/DurationFormat/prototype/toStringTag/toString.js +-R070 test/intl402/DurationFormat/prototype/toStringTag.js test/intl402/DurationFormat/prototype/toStringTag/toStringTag.js +-M test/intl402/NumberFormat/prototype/resolvedOptions/basic.js +-M test/intl402/NumberFormat/test-option-useGrouping.js +-A test/intl402/Temporal/Calendar/prototype/era/year-zero.js +-A test/intl402/Temporal/Calendar/prototype/eraYear/year-zero.js +-A test/intl402/Temporal/Duration/prototype/add/relativeto-string-datetime.js +-A test/intl402/Temporal/Duration/prototype/round/relativeto-string-datetime.js +-A test/intl402/Temporal/Duration/prototype/subtract/relativeto-string-datetime.js +-A test/intl402/Temporal/Duration/prototype/total/relativeto-string-datetime.js +-A test/intl402/Temporal/Instant/prototype/toString/timezone-string-datetime.js +-A test/intl402/Temporal/Instant/prototype/toZonedDateTime/timezone-string-datetime.js +-A test/intl402/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-datetime.js +-A test/intl402/Temporal/Now/plainDate/calendar-string.js +-A test/intl402/Temporal/Now/plainDateTime/calendar-string.js +-A test/intl402/Temporal/Now/zonedDateTime/calendar-string.js +-A test/intl402/Temporal/Now/zonedDateTime/calendar-timezone-string.js +-M test/intl402/Temporal/Now/zonedDateTime/timezone-string-datetime.js +-M test/intl402/Temporal/Now/zonedDateTimeISO/timezone-string-datetime.js +-A test/intl402/Temporal/Now/zonedDateTimeISO/timezone-string.js +-A test/intl402/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-datetime.js +-A test/intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-datetime.js +-A test/intl402/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-datetime.js +-A test/intl402/Temporal/PlainYearMonth/from/argument-object.js +-A test/intl402/Temporal/TimeZone/from/timezone-string-datetime.js +-A test/intl402/Temporal/ZonedDateTime/from/timezone-string-datetime.js +-A test/intl402/Temporal/ZonedDateTime/prototype/equals/timezone-string-datetime.js +-A test/intl402/Temporal/ZonedDateTime/prototype/since/timezone-string-datetime.js +-A test/intl402/Temporal/ZonedDateTime/prototype/until/timezone-string-datetime.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-add.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-and.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-bitand.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-bitor.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-bitxor.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-div.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-exp.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-lshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-mod.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-mult.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-nullish.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-or.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-rshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-srshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-sub.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-add.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-and.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-bitand.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-bitor.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-bitxor.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-div.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-exp.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-lshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-mod.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-mult.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-nullish.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-or.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-rshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-srshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-sub.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-add.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-and.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-bitand.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-bitor.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-bitxor.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-div.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-exp.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-lshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-mod.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-mult.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-nullish.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-or.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-rshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-srshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-method-sub.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-add.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-bitand.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-bitor.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-bitxor.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-div.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-exp.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-lshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-mod.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-mult.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-rshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-srshift.js +-A test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-sub.js +\ No newline at end of file ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/until/year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/with/options-wrong-type.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/with/overflow-invalid-string.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-number.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-string-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-number.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-invalid.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/leap-second.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-number.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/leap-second.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js ++M test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-year-zero.js ++A test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-wrong-type.js ++A test/built-ins/Temporal/ZonedDateTime/timezone-string-leap-second.js ++A test/built-ins/Temporal/ZonedDateTime/timezone-string-multiple-offsets.js ++A test/built-ins/Temporal/ZonedDateTime/timezone-wrong-type.js ++D test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-get-src-value-throws.js ++A test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js ++D test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-throws.js ++D test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer-comparefn.js ++D test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn-coerce.js ++D test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn.js ++M test/built-ins/TypedArray/prototype/sort/sort-tonumber.js ++A test/built-ins/TypedArrayConstructors/ctors/no-species.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-different-type.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-same-type.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-access-throws.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-null.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-undefined.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-different-type.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-same-type.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-access-throws.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-throws.js ++D test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-different-type.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-same-type.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-access-throws.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-access-throws.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-throws.js ++D test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js ++M test/built-ins/parseInt/15.1.2.2-2-1.js ++A test/harness/temporalHelpers-one-shift-time-zone.js ++A test/intl402/DurationFormat/constructor-locales-invalid.js ++A test/intl402/DurationFormat/constructor-locales-valid.js ++A test/intl402/DurationFormat/constructor-options-defaults.js ++A test/intl402/DurationFormat/constructor-options-fractionalDigits-invalid.js ++A test/intl402/DurationFormat/constructor-options-fractionalDigits-valid.js ++A test/intl402/DurationFormat/constructor-options-invalid.js ++A test/intl402/DurationFormat/constructor-options-localeMatcher-invalid.js ++A test/intl402/DurationFormat/constructor-options-localeMatcher-valid.js ++A test/intl402/DurationFormat/constructor-options-numberingSystem-invalid.js ++A test/intl402/DurationFormat/constructor-options-numberingSystem-valid.js ++A test/intl402/DurationFormat/constructor-options-order.js ++A test/intl402/DurationFormat/constructor-options-style-invalid.js ++A test/intl402/DurationFormat/constructor-options-style-valid.js ++R100 test/intl402/DurationFormat/instance/extensibility.js test/intl402/DurationFormat/extensibility.js ++R100 test/intl402/DurationFormat/instance/length.js test/intl402/DurationFormat/length.js ++R100 test/intl402/DurationFormat/instance/name.js test/intl402/DurationFormat/name.js ++A test/intl402/DurationFormat/newtarget-undefined.js ++R100 test/intl402/DurationFormat/instance/prop-desc.js test/intl402/DurationFormat/prop-desc.js ++R100 test/intl402/DurationFormat/instance/prototype.js test/intl402/DurationFormat/prototype.js ++A test/intl402/DurationFormat/supportedLocalesOf/basic.js ++A test/intl402/DurationFormat/supportedLocalesOf/branding.js ++A test/intl402/DurationFormat/supportedLocalesOf/length.js ++A test/intl402/DurationFormat/supportedLocalesOf/locales-empty.js ++A test/intl402/DurationFormat/supportedLocalesOf/locales-invalid.js ++A test/intl402/DurationFormat/supportedLocalesOf/locales-specific.js ++A test/intl402/DurationFormat/supportedLocalesOf/name.js ++A test/intl402/DurationFormat/supportedLocalesOf/prop-desc.js ++A test/intl402/Intl/DateTimeFormat/prototype/formatRange/fails-on-distinct-temporal-types.js ++A test/intl402/Intl/DateTimeFormat/prototype/formatRangeToParts/fails-on-distinct-temporal-types.js ++M test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js ++M test/intl402/NumberFormat/constructor-roundingIncrement.js ++A test/intl402/NumberFormat/prototype/format/format-max-min-fraction-significant-digits.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-10.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-100.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-1000.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-2.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-20.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-200.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-2000.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-25.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-250.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-2500.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-5.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-50.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-500.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-increment-5000.js ++M test/intl402/NumberFormat/prototype/format/format-rounding-priority-more-precision.js ++M test/intl402/NumberFormat/prototype/formatRange/x-greater-than-y-throws.js ++M test/intl402/NumberFormat/prototype/formatRangeToParts/x-greater-than-y-throws.js ++A test/intl402/Temporal/Calendar/prototype/era/argument-number.js ++A test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-leap-second.js ++A test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-number.js ++A test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-wrong-type.js ++A test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-year-zero.js ++A test/intl402/Temporal/Calendar/prototype/era/argument-string-invalid.js ++A test/intl402/Temporal/Calendar/prototype/era/argument-wrong-type.js ++A test/intl402/Temporal/Calendar/prototype/era/calendar-datefromfields-called-with-options-undefined.js ++A test/intl402/Temporal/Calendar/prototype/era/leap-second.js ++M test/intl402/Temporal/Calendar/prototype/era/year-zero.js ++A test/intl402/Temporal/Calendar/prototype/eraYear/argument-number.js ++A test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-leap-second.js ++A test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-number.js ++A test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-wrong-type.js ++A test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-year-zero.js ++A test/intl402/Temporal/Calendar/prototype/eraYear/argument-string-invalid.js ++A test/intl402/Temporal/Calendar/prototype/eraYear/argument-wrong-type.js ++A test/intl402/Temporal/Calendar/prototype/eraYear/calendar-datefromfields-called-with-options-undefined.js ++A test/intl402/Temporal/Calendar/prototype/eraYear/leap-second.js ++M test/intl402/Temporal/Calendar/prototype/eraYear/year-zero.js ++A test/intl402/Temporal/Duration/compare/relativeto-hour.js ++A test/intl402/Temporal/Instant/prototype/toString/timezone-offset.js ++A test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-always.js ++A test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js ++A test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-never.js ++A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js ++A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js ++A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js ++A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js ++A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-calendar.js ++A test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js ++A test/intl402/Temporal/TimeZone/etc-timezone.js ++R074 test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-and.js test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-and.js ++R075 test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-nullish.js test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-nullish.js ++R075 test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-or.js test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-or.js ++A test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-and.js ++A test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-nullish.js ++A test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-or.js ++R073 test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-and.js test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-and.js ++R073 test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-nullish.js test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-nullish.js ++R073 test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-or.js test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-or.js ++A test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-and.js ++A test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-nullish.js ++A test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-or.js ++R072 test/language/expressions/compound-assignment/left-hand-side-private-reference-method-and.js test/language/expressions/logical-assignment/left-hand-side-private-reference-method-and.js ++R056 test/language/expressions/compound-assignment/left-hand-side-private-reference-method-nullish.js test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-nullish.js ++R055 test/language/expressions/compound-assignment/left-hand-side-private-reference-method-or.js test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-or.js ++R069 test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js ++R071 test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js ++R069 test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js ++A test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-and.js ++A test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-nullish.js ++A test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-or.js ++M test/language/expressions/unary-plus/S11.4.6_A3_T3.js ++M test/language/statements/for-in/S12.6.4_A7_T2.js +\ No newline at end of file +diff --git a/JSTests/test262/test/built-ins/Array/prototype/Symbol.unscopables/array-find-from-last.js b/JSTests/test262/test/built-ins/Array/prototype/Symbol.unscopables/array-find-from-last.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ba304c4ca3b60660cbbfc69f71d95206d914de0c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Array/prototype/Symbol.unscopables/array-find-from-last.js +@@ -0,0 +1,31 @@ ++// Copyright (C) 2022 Microsoft. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++/*--- ++esid: sec-array.prototype-@@unscopables ++description: > ++ Initial value of `Symbol.unscopables` property ++info: | ++ 22.1.3.32 Array.prototype [ @@unscopables ] ++ ++ ... ++ 7. Perform CreateDataProperty(unscopableList, "findLast", true). ++ 8. Perform CreateDataProperty(unscopableList, "findLastIndex", true). ++ ... ++ ++includes: [propertyHelper.js] ++features: [Symbol.unscopables, array-find-from-last] ++---*/ ++ ++var unscopables = Array.prototype[Symbol.unscopables]; ++ ++assert.sameValue(Object.getPrototypeOf(unscopables), null); ++ ++assert.sameValue(unscopables.findLast, true, '`findLast` property value'); ++verifyEnumerable(unscopables, 'findLast'); ++verifyWritable(unscopables, 'findLast'); ++verifyConfigurable(unscopables, 'findLast'); ++ ++assert.sameValue(unscopables.findLastIndex, true, '`findLastIndex` property value'); ++verifyEnumerable(unscopables, 'findLastIndex'); ++verifyWritable(unscopables, 'findLastIndex'); ++verifyConfigurable(unscopables, 'findLastIndex'); +diff --git a/JSTests/test262/test/built-ins/Array/prototype/Symbol.unscopables/array-grouping.js b/JSTests/test262/test/built-ins/Array/prototype/Symbol.unscopables/array-grouping.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4e58eb711aaf2dc998ae985c6cbca06ab168128e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Array/prototype/Symbol.unscopables/array-grouping.js +@@ -0,0 +1,31 @@ ++// Copyright (C) 2022 Chengzhong Wu. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++/*--- ++esid: sec-array.prototype-@@unscopables ++description: > ++ Initial value of `Symbol.unscopables` property ++info: | ++ 22.1.3.32 Array.prototype [ @@unscopables ] ++ ++ ... ++ 10. Perform ! CreateDataPropertyOrThrow(unscopableList, "groupBy", true). ++ 11. Perform ! CreateDataPropertyOrThrow(unscopableList, "groupByToMap", true). ++ ... ++ ++includes: [propertyHelper.js] ++features: [Symbol.unscopables, array-grouping] ++---*/ ++ ++var unscopables = Array.prototype[Symbol.unscopables]; ++ ++assert.sameValue(Object.getPrototypeOf(unscopables), null); ++ ++assert.sameValue(unscopables.groupBy, true, '`groupBy` property value'); ++verifyEnumerable(unscopables, 'groupBy'); ++verifyWritable(unscopables, 'groupBy'); ++verifyConfigurable(unscopables, 'groupBy'); ++ ++assert.sameValue(unscopables.groupByToMap, true, '`groupByToMap` property value'); ++verifyEnumerable(unscopables, 'groupByToMap'); ++verifyWritable(unscopables, 'groupByToMap'); ++verifyConfigurable(unscopables, 'groupByToMap'); +diff --git a/JSTests/test262/test/built-ins/Array/prototype/Symbol.unscopables/value.js b/JSTests/test262/test/built-ins/Array/prototype/Symbol.unscopables/value.js +index 526cf8b877a28b265c0936c97252100e842a4354..a3c4f5fd1a117ba14ea46af679f6c34698db66e6 100644 +--- a/JSTests/test262/test/built-ins/Array/prototype/Symbol.unscopables/value.js ++++ b/JSTests/test262/test/built-ins/Array/prototype/Symbol.unscopables/value.js +@@ -13,19 +13,16 @@ info: | + 4. Perform CreateDataProperty(unscopableList, "fill", true). + 5. Perform CreateDataProperty(unscopableList, "find", true). + 6. Perform CreateDataProperty(unscopableList, "findIndex", true). +- 7. Perform CreateDataProperty(unscopableList, "findLast", true). +- 8. Perform CreateDataProperty(unscopableList, "findLastIndex", true). +- 9. Perform CreateDataProperty(unscopableList, "flat", true). +- 10. Perform CreateDataProperty(unscopableList, "flatMap", true). +- 11. Perform ! CreateDataPropertyOrThrow(unscopableList, "groupBy", true). +- 12. Perform ! CreateDataPropertyOrThrow(unscopableList, "groupByToMap", true). +- 13. Perform CreateDataProperty(unscopableList, "includes", true). +- 14. Perform CreateDataProperty(unscopableList, "keys", true). +- 15. Perform CreateDataProperty(unscopableList, "values", true). +- 16. Assert: Each of the above calls returns true. +- 17. Return unscopableList. ++ 7. Perform CreateDataProperty(unscopableList, "flat", true). ++ 8. Perform CreateDataProperty(unscopableList, "flatMap", true). ++ 9. Perform CreateDataProperty(unscopableList, "includes", true). ++ 10. Perform CreateDataProperty(unscopableList, "keys", true). ++ 11. Perform CreateDataProperty(unscopableList, "values", true). ++ 12. Assert: Each of the above calls returns true. ++ 13. Return unscopableList. ++ + includes: [propertyHelper.js] +-features: [Symbol.unscopables, array-find-from-last] ++features: [Symbol.unscopables] + ---*/ + + var unscopables = Array.prototype[Symbol.unscopables]; +@@ -57,17 +54,6 @@ verifyEnumerable(unscopables, 'findIndex'); + verifyWritable(unscopables, 'findIndex'); + verifyConfigurable(unscopables, 'findIndex'); + +- +-assert.sameValue(unscopables.findLast, true, '`findLast` property value'); +-verifyEnumerable(unscopables, 'findLast'); +-verifyWritable(unscopables, 'findLast'); +-verifyConfigurable(unscopables, 'findLast'); +- +-assert.sameValue(unscopables.findLastIndex, true, '`findLastIndex` property value'); +-verifyEnumerable(unscopables, 'findLastIndex'); +-verifyWritable(unscopables, 'findLastIndex'); +-verifyConfigurable(unscopables, 'findLastIndex'); +- + assert.sameValue(unscopables.flat, true, '`flat` property value'); + verifyEnumerable(unscopables, 'flat'); + verifyWritable(unscopables, 'flat'); +@@ -78,16 +64,6 @@ verifyEnumerable(unscopables, 'flatMap'); + verifyWritable(unscopables, 'flatMap'); + verifyConfigurable(unscopables, 'flatMap'); + +-assert.sameValue(unscopables.groupBy, true, '`groupBy` property value'); +-verifyEnumerable(unscopables, 'groupBy'); +-verifyWritable(unscopables, 'groupBy'); +-verifyConfigurable(unscopables, 'groupBy'); +- +-assert.sameValue(unscopables.groupByToMap, true, '`groupByToMap` property value'); +-verifyEnumerable(unscopables, 'groupByToMap'); +-verifyWritable(unscopables, 'groupByToMap'); +-verifyConfigurable(unscopables, 'groupByToMap'); +- + assert.sameValue(unscopables.includes, true, '`includes` property value'); + verifyEnumerable(unscopables, 'includes'); + verifyWritable(unscopables, 'includes'); +diff --git a/JSTests/test262/test/built-ins/Array/prototype/concat/create-species-non-ctor.js b/JSTests/test262/test/built-ins/Array/prototype/concat/create-species-non-ctor.js +index 1095078be4493dc7aac1c0966bc9504a3149fb5f..53a9e2a1993935b0d625c9801a8789b408c28cce 100644 +--- a/JSTests/test262/test/built-ins/Array/prototype/concat/create-species-non-ctor.js ++++ b/JSTests/test262/test/built-ins/Array/prototype/concat/create-species-non-ctor.js +@@ -18,9 +18,16 @@ info: | + b. If C is null, let C be undefined. + [...] + 9. If IsConstructor(C) is false, throw a TypeError exception. +-features: [Symbol.species] ++includes: [isConstructor.js] ++features: [Symbol.species, Reflect.construct] + ---*/ + ++assert.sameValue( ++ isConstructor(parseInt), ++ false, ++ 'precondition: isConstructor(parseInt) must return false' ++); ++ + var a = []; + + a.constructor = {}; +diff --git a/JSTests/test262/test/built-ins/Array/prototype/filter/create-species-non-ctor.js b/JSTests/test262/test/built-ins/Array/prototype/filter/create-species-non-ctor.js +index 067c43399384caac7ffa63098bc951a6b5c5de7e..aa3b529fb0984ff53b9b0f747406f493c1ee9802 100644 +--- a/JSTests/test262/test/built-ins/Array/prototype/filter/create-species-non-ctor.js ++++ b/JSTests/test262/test/built-ins/Array/prototype/filter/create-species-non-ctor.js +@@ -19,9 +19,16 @@ info: | + b. If C is null, let C be undefined. + [...] + 9. If IsConstructor(C) is false, throw a TypeError exception. +-features: [Symbol.species] ++includes: [isConstructor.js] ++features: [Symbol.species, Reflect.construct] + ---*/ + ++assert.sameValue( ++ isConstructor(parseInt), ++ false, ++ 'precondition: isConstructor(parseInt) must return false' ++); ++ + var a = []; + var callCount = 0; + var cb = function() { +@@ -33,5 +40,5 @@ a.constructor[Symbol.species] = parseInt; + + assert.throws(TypeError, function() { + a.filter(cb); +-}); ++}, 'a.filter(cb) throws a TypeError exception'); + assert.sameValue(callCount, 0); +diff --git a/JSTests/test262/test/built-ins/Array/prototype/map/create-species-non-ctor.js b/JSTests/test262/test/built-ins/Array/prototype/map/create-species-non-ctor.js +index d448b4ebb84a171efd7a40fc65f7a7316c0aeaf6..1f55d4522e1b26183fa0fe03e29275215680a8d8 100644 +--- a/JSTests/test262/test/built-ins/Array/prototype/map/create-species-non-ctor.js ++++ b/JSTests/test262/test/built-ins/Array/prototype/map/create-species-non-ctor.js +@@ -19,9 +19,16 @@ info: | + b. If C is null, let C be undefined. + [...] + 9. If IsConstructor(C) is false, throw a TypeError exception. +-features: [Symbol.species] ++includes: [isConstructor.js] ++features: [Symbol.species, Reflect.construct] + ---*/ + ++assert.sameValue( ++ isConstructor(parseInt), ++ false, ++ 'precondition: isConstructor(parseInt) must return false' ++); ++ + var a = []; + var callCount = 0; + var cb = function() { +@@ -33,5 +40,5 @@ a.constructor[Symbol.species] = parseInt; + + assert.throws(TypeError, function() { + a.map(cb); +-}); ++}, 'a.map(cb) throws a TypeError exception'); + assert.sameValue(callCount, 0); +diff --git a/JSTests/test262/test/built-ins/Array/prototype/slice/create-species-non-ctor.js b/JSTests/test262/test/built-ins/Array/prototype/slice/create-species-non-ctor.js +index 598368184a5eacef2ac71cf1a39955ede17742a6..4972bb8d1aaeeddf79727a552303d4ab09759061 100644 +--- a/JSTests/test262/test/built-ins/Array/prototype/slice/create-species-non-ctor.js ++++ b/JSTests/test262/test/built-ins/Array/prototype/slice/create-species-non-ctor.js +@@ -19,9 +19,16 @@ info: | + b. If C is null, let C be undefined. + [...] + 9. If IsConstructor(C) is false, throw a TypeError exception. +-features: [Symbol.species] ++includes: [isConstructor.js] ++features: [Symbol.species, Reflect.construct] + ---*/ + ++assert.sameValue( ++ isConstructor(parseInt), ++ false, ++ 'precondition: isConstructor(parseInt) must return false' ++); ++ + var a = []; + + a.constructor = {}; +@@ -29,4 +36,4 @@ a.constructor[Symbol.species] = parseInt; + + assert.throws(TypeError, function() { + a.slice(); +-}); ++}, 'a.slice() throws a TypeError exception'); +diff --git a/JSTests/test262/test/built-ins/Array/prototype/splice/create-species-non-ctor.js b/JSTests/test262/test/built-ins/Array/prototype/splice/create-species-non-ctor.js +index 0d5ff35bfedf03263222d05b14d2e3873e2b934b..dd949216e1983f8a12a88d76da76978ebb036aee 100644 +--- a/JSTests/test262/test/built-ins/Array/prototype/splice/create-species-non-ctor.js ++++ b/JSTests/test262/test/built-ins/Array/prototype/splice/create-species-non-ctor.js +@@ -19,9 +19,16 @@ info: | + b. If C is null, let C be undefined. + [...] + 9. If IsConstructor(C) is false, throw a TypeError exception. +-features: [Symbol.species] ++includes: [isConstructor.js] ++features: [Symbol.species, Reflect.construct] + ---*/ + ++assert.sameValue( ++ isConstructor(parseInt), ++ false, ++ 'precondition: isConstructor(parseInt) must return false' ++); ++ + var a = []; + + a.constructor = {}; +@@ -29,4 +36,4 @@ a.constructor[Symbol.species] = parseInt; + + assert.throws(TypeError, function() { + a.splice(); +-}); ++}, 'a.splice() throws a TypeError exception'); +diff --git a/JSTests/test262/test/built-ins/Date/parse/year-zero.js b/JSTests/test262/test/built-ins/Date/parse/year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9b0aea84c79f85c21af9baa8e8e924e36d40be73 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Date/parse/year-zero.js +@@ -0,0 +1,20 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-expanded-years ++description: Negative zero, as an extended year, is rejected ++info: | ++ The year 0 is considered positive and must be prefixed with a + sign. The ++ representation of the year 0 as -000000 is invalid. ++---*/ ++ ++const invalidStrings = [ ++ "-000000-03-31T00:45Z", ++ "-000000-03-31T01:45", ++ "-000000-03-31T01:45:00+01:00" ++]; ++ ++for (const str of invalidStrings) { ++ assert.sameValue(Date.parse(str), NaN, "reject minus zero as extended year"); ++} +diff --git a/JSTests/test262/test/built-ins/Date/year-zero.js b/JSTests/test262/test/built-ins/Date/year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0d645cf6d2e49038c87c7217783e0bf92e5ad489 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Date/year-zero.js +@@ -0,0 +1,20 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-expanded-years ++description: Negative zero, as an extended year, is rejected ++info: | ++ The year 0 is considered positive and must be prefixed with a + sign. The ++ representation of the year 0 as -000000 is invalid. ++---*/ ++ ++const invalidStrings = [ ++ "-000000-03-31T00:45Z", ++ "-000000-03-31T01:45", ++ "-000000-03-31T01:45:00+01:00" ++]; ++ ++for (const str of invalidStrings) { ++ assert.sameValue(+new Date(str), NaN, "reject minus zero as extended year"); ++} +diff --git a/JSTests/test262/test/built-ins/Error/constructor.js b/JSTests/test262/test/built-ins/Error/constructor.js +index 072eee66f9854e3897897abf4a9e1ccd028787fd..efccd74ba6582f9198becd49b91ce1979cd28e4b 100644 +--- a/JSTests/test262/test/built-ins/Error/constructor.js ++++ b/JSTests/test262/test/built-ins/Error/constructor.js +@@ -12,7 +12,7 @@ info: | + + esid: sec-error-message + features: [error-cause] +-includes: [deepEqual.js] ++includes: [compareArray.js] + ---*/ + + var message = "my-message"; +@@ -34,4 +34,4 @@ new Error( + }, + ); + +-assert.deepEqual(sequence, [ "toString", "cause" ], "accessing own properties on sequence"); ++assert.compareArray(sequence, [ "toString", "cause" ], "accessing own properties on sequence"); +diff --git a/JSTests/test262/test/built-ins/Function/prototype/bind/instance-length-tointeger.js b/JSTests/test262/test/built-ins/Function/prototype/bind/instance-length-tointeger.js +index 876ed47b516e2b474ec0e1778dc936257eae2cd6..92aaf1a3160b3919887359348bc3d678fec6a91b 100644 +--- a/JSTests/test262/test/built-ins/Function/prototype/bind/instance-length-tointeger.js ++++ b/JSTests/test262/test/built-ins/Function/prototype/bind/instance-length-tointeger.js +@@ -13,12 +13,15 @@ info: | + 5. Let targetHasLength be ? HasOwnProperty(Target, "length"). + 6. If targetHasLength is true, then + a. Let targetLen be ? Get(Target, "length"). +- b. If Type(targetLen) is not Number, let L be 0. +- c. Else, +- i. Set targetLen to ! ToInteger(targetLen). +- ii. Let L be the larger of 0 and the result of targetLen minus the number of elements of args. +- 7. Else, let L be 0. +- 8. Perform ! SetFunctionLength(F, L). ++ b. If Type(targetLen) is Number, then ++ i. If targetLen is +∞𝔽, set L to +∞. ++ ii. Else if targetLen is -∞𝔽, set L to 0. ++ iii. Else, ++ 1. Let targetLenAsInt be ! ToIntegerOrInfinity(targetLen). ++ 2. Assert: targetLenAsInt is finite. ++ 3. Let argCount be the number of elements in args. ++ 4. Set L to max(targetLenAsInt - argCount, 0). ++ 7. Perform ! SetFunctionLength(F, L). + [...] + + ToInteger ( argument ) +@@ -40,10 +43,12 @@ Object.defineProperty(fn, "length", {value: -0}); + assert.sameValue(fn.bind().length, 0); + + Object.defineProperty(fn, "length", {value: Infinity}); +-assert.sameValue(fn.bind().length, Infinity); ++assert.sameValue(fn.bind().length, Infinity, "target length of infinity, zero bound arguments"); ++assert.sameValue(fn.bind(0, 0).length, Infinity, "target length of infinity, one bound argument"); + + Object.defineProperty(fn, "length", {value: -Infinity}); +-assert.sameValue(fn.bind().length, 0); ++assert.sameValue(fn.bind().length, 0, "target length of negative infinity, zero bound arguments"); ++assert.sameValue(fn.bind(0, 0).length, 0, "target length of negative infinity, one bound argument"); + + Object.defineProperty(fn, "length", {value: 3.66}); + assert.sameValue(fn.bind().length, 3); +diff --git a/JSTests/test262/test/built-ins/Number/S15.7.1.1_A1.js b/JSTests/test262/test/built-ins/Number/S15.7.1.1_A1.js +index 3ccfaf32ae311c50f629f13e414062a16eaefd43..adf4f19515e1676142a5dcb82483b23d60486ec0 100644 +--- a/JSTests/test262/test/built-ins/Number/S15.7.1.1_A1.js ++++ b/JSTests/test262/test/built-ins/Number/S15.7.1.1_A1.js +@@ -24,3 +24,5 @@ assert.sameValue( + ); + + assert.sameValue(Number("abc"), NaN, 'Number("abc") returns NaN'); ++assert.sameValue(Number("INFINITY"), NaN, 'Number("INFINITY") returns NaN'); ++assert.sameValue(Number("infinity"), NaN, 'Number("infinity") returns NaN'); +diff --git a/JSTests/test262/test/built-ins/RegExp/prototype/toString/S15.10.6.4_A6.js b/JSTests/test262/test/built-ins/RegExp/prototype/toString/S15.10.6.4_A6.js +index 4cdfe4ca8224c2aa6c8119085aae3bd8955794d2..2dd4ef4018df067c7784c16cf61000c18222e65f 100644 +--- a/JSTests/test262/test/built-ins/RegExp/prototype/toString/S15.10.6.4_A6.js ++++ b/JSTests/test262/test/built-ins/RegExp/prototype/toString/S15.10.6.4_A6.js +@@ -5,9 +5,17 @@ + info: RegExp.prototype.toString has not prototype property + es5id: 15.10.6.4_A6 + description: Checking RegExp.prototype.toString.prototype ++includes: [isConstructor.js] ++features: [Reflect.construct] + ---*/ + assert.sameValue( + RegExp.prototype.toString.prototype, + undefined, + 'The value of RegExp.prototype.toString.prototype is expected to equal undefined' + ); ++ ++assert.sameValue( ++ isConstructor(RegExp.prototype.toString), ++ false, ++ 'isConstructor(RegExp.prototype.toString) must return false' ++); +diff --git a/JSTests/test262/test/built-ins/RegExp/prototype/toString/S15.10.6.4_A7.js b/JSTests/test262/test/built-ins/RegExp/prototype/toString/S15.10.6.4_A7.js +index faeddca853f3736b079e7155289d16490b20a5e3..ec818f615e16814664cf08432082a2e12bee593c 100644 +--- a/JSTests/test262/test/built-ins/RegExp/prototype/toString/S15.10.6.4_A7.js ++++ b/JSTests/test262/test/built-ins/RegExp/prototype/toString/S15.10.6.4_A7.js +@@ -5,6 +5,8 @@ + info: RegExp.prototype.toString can't be used as constructor + es5id: 15.10.6.4_A7 + description: Checking if creating the RegExp.prototype.toString object fails ++includes: [isConstructor.js] ++features: [Reflect.construct] + ---*/ + + var __FACTORY = RegExp.prototype.toString; +@@ -20,4 +22,10 @@ try { + ); + } + ++assert.sameValue( ++ isConstructor(RegExp.prototype.toString), ++ false, ++ 'isConstructor(RegExp.prototype.toString) must return false' ++); ++ + // TODO: Convert to assert.throws() format. +diff --git a/JSTests/test262/test/built-ins/ShadowRealm/WrappedFunction/throws-typeerror-on-revoked-proxy.js b/JSTests/test262/test/built-ins/ShadowRealm/WrappedFunction/throws-typeerror-on-revoked-proxy.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ee964823a24b55176b84d402a12ada9dd949856f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/ShadowRealm/WrappedFunction/throws-typeerror-on-revoked-proxy.js +@@ -0,0 +1,40 @@ ++// Copyright (C) 2022 Chengzhong Wu. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++/*--- ++esid: sec-wrapped-function-exotic-objects-call-thisargument-argumentslist ++description: > ++ WrappedFunctionCreate throws a TypeError the target is a revoked proxy. ++ ++info: | ++ WrappedFunctionCreate ( callerRealm: a Realm Record, Target: a function object, ) ++ 1. Let target be F.[[WrappedTargetFunction]]. ++ 2. Assert: IsCallable(target) is true. ++ 3. Let callerRealm be F.[[Realm]]. ++ 4. NOTE: Any exception objects produced after this point are associated with callerRealm. ++ 5. Let targetRealm be ? GetFunctionRealm(target). ++ ... ++ ++ GetFunctionRealm ( obj ) ++ ... ++ 3. If obj is a Proxy exotic object, then ++ a. If obj.[[ProxyHandler]] is null, throw a TypeError exception. ++ ... ++ ++features: [ShadowRealm] ++---*/ ++ ++assert.sameValue( ++ typeof ShadowRealm.prototype.evaluate, ++ 'function', ++ 'This test must fail if ShadowRealm.prototype.evaluate is not a function' ++); ++ ++const r = new ShadowRealm(); ++ ++const fn = r.evaluate(` ++globalThis.revocable = Proxy.revocable(() => {}, {}); ++ ++globalThis.revocable.proxy; ++`); ++r.evaluate('revocable.revoke()'); ++assert.throws(TypeError, () => fn()); +diff --git a/JSTests/test262/test/built-ins/ShadowRealm/prototype/evaluate/globalthis-ordinary-object.js b/JSTests/test262/test/built-ins/ShadowRealm/prototype/evaluate/globalthis-ordinary-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d59e77078d145e7da92a47aef6ff153d466bbc03 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/ShadowRealm/prototype/evaluate/globalthis-ordinary-object.js +@@ -0,0 +1,90 @@ ++// Copyright (C) 2021 Leo Balter. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++/*--- ++esid: sec-shadowrealm.prototype.evaluate ++description: > ++ The globalThis must be an ordinary object from OrdinaryObjectCreate ++info: | ++ ShadowRealm ( ) ++ ++ ... ++ 3. Let realmRec be CreateRealm(). ++ 4. Set O.[[ShadowRealm]] to realmRec. ++ ... ++ 10. Perform ? SetRealmGlobalObject(realmRec, undefined, undefined). ++ 11. Perform ? SetDefaultGlobalBindings(O.[[ShadowRealm]]). ++ 12. Perform ? HostInitializeShadowRealm(O.[[ShadowRealm]]). ++ ++ SetRealmGlobalObject ( realmRec, globalObj, thisValue ) ++ ++ 1. If globalObj is undefined, then ++ a. Let intrinsics be realmRec.[[Intrinsics]]. ++ b. Set globalObj to ! OrdinaryObjectCreate(intrinsics.[[%Object.prototype%]]). ++ 2. Assert: Type(globalObj) is Object. ++ 3. If thisValue is undefined, set thisValue to globalObj. ++ ... ++ ++ OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] ) ++ ++ 1. Let internalSlotsList be « [[Prototype]], [[Extensible]] ». ++ 2. If additionalInternalSlotsList is present, append each of its elements to internalSlotsList. ++ 3. Let O be ! MakeBasicObject(internalSlotsList). ++ 4. Set O.[[Prototype]] to proto. ++ 5. Return O. ++ ++ MakeBasicObject ( internalSlotsList ) ++ ++ ... ++ 5. If internalSlotsList contains [[Extensible]], set obj.[[Extensible]] to true. ++features: [ShadowRealm] ++---*/ ++ ++assert.sameValue( ++ typeof ShadowRealm.prototype.evaluate, ++ 'function', ++ 'This test must fail if ShadowRealm.prototype.evaluate is not a function' ++); ++ ++const r = new ShadowRealm(); ++ ++assert.sameValue( ++ r.evaluate('Object.getPrototypeOf(globalThis) === Object.prototype'), ++ true, ++ 'The [[Prototype]] of globalThis is Object.prototype' ++); ++ ++assert.sameValue( ++ r.evaluate('Object.isExtensible(globalThis)'), ++ true, ++ 'globalThis is extensible' ++); ++ ++assert.sameValue( ++ r.evaluate('globalThis.constructor === Object'), ++ true, ++ 'globalThis.constructor is Object' ++); ++ ++assert.sameValue( ++ r.evaluate(` ++ let result; ++ try { ++ globalThis.__proto__ = {x: 2}; ++ result = true; ++ } catch (e) { ++ result = false; ++ } ++ result; ++ `), ++ true, ++ 'Can assign to globalThis.__proto__ directly' ++); ++ ++assert.sameValue( ++ r.evaluate(` ++ Reflect.set(globalThis, '__proto__', {x: 1}) && ++ Reflect.setPrototypeOf(globalThis.__proto__, {x: 2}); ++ `), ++ true, ++ 'Can set an ordinary globalThis.__proto__' ++); +diff --git a/JSTests/test262/test/built-ins/ShadowRealm/prototype/evaluate/globalthis-orginary-object.js b/JSTests/test262/test/built-ins/ShadowRealm/prototype/evaluate/globalthis-orginary-object.js +deleted file mode 100644 +index fd71e9102689c7ff18cdabf4f0f05f412bfafeea..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/ShadowRealm/prototype/evaluate/globalthis-orginary-object.js ++++ /dev/null +@@ -1,66 +0,0 @@ +-// Copyright (C) 2021 Leo Balter. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-shadowrealm.prototype.evaluate +-description: > +- The globalThis must be an ordinary object from OrdinaryObjectCreate +-info: | +- ShadowRealm ( ) +- +- ... +- 3. Let realmRec be CreateRealm(). +- 4. Set O.[[ShadowRealm]] to realmRec. +- ... +- 10. Perform ? SetRealmGlobalObject(realmRec, undefined, undefined). +- 11. Perform ? SetDefaultGlobalBindings(O.[[ShadowRealm]]). +- 12. Perform ? HostInitializeShadowRealm(O.[[ShadowRealm]]). +- +- SetRealmGlobalObject ( realmRec, globalObj, thisValue ) +- +- 1. If globalObj is undefined, then +- a. Let intrinsics be realmRec.[[Intrinsics]]. +- b. Set globalObj to ! OrdinaryObjectCreate(intrinsics.[[%Object.prototype%]]). +- 2. Assert: Type(globalObj) is Object. +- 3. If thisValue is undefined, set thisValue to globalObj. +- ... +- +- OrdinaryObjectCreate ( proto [ , additionalInternalSlotsList ] ) +- +- 1. Let internalSlotsList be « [[Prototype]], [[Extensible]] ». +- 2. If additionalInternalSlotsList is present, append each of its elements to internalSlotsList. +- 3. Let O be ! MakeBasicObject(internalSlotsList). +- 4. Set O.[[Prototype]] to proto. +- 5. Return O. +- +- MakeBasicObject ( internalSlotsList ) +- +- ... +- 5. If internalSlotsList contains [[Extensible]], set obj.[[Extensible]] to true. +-features: [ShadowRealm] +----*/ +- +-assert.sameValue( +- typeof ShadowRealm.prototype.evaluate, +- 'function', +- 'This test must fail if ShadowRealm.prototype.evaluate is not a function' +-); +- +-const r = new ShadowRealm(); +- +-assert.sameValue( +- r.evaluate('Object.getPrototypeOf(globalThis) === Object.prototype'), +- true, +- 'The [[Prototype]] of globalThis is Object.prototype' +-); +- +-assert.sameValue( +- r.evaluate('Object.isExtensible(globalThis)'), +- true, +- 'globalThis is extensible' +-); +- +-assert.sameValue( +- r.evaluate('globalThis.constructor === Object'), +- true, +- 'globalThis.constructor is Object' +-); +diff --git a/JSTests/test262/test/built-ins/ShadowRealm/prototype/evaluate/throws-typeerror-wrap-throwing.js b/JSTests/test262/test/built-ins/ShadowRealm/prototype/evaluate/throws-typeerror-wrap-throwing.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b3cec5b115e010036ec92c35a347b9f0d16a244a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/ShadowRealm/prototype/evaluate/throws-typeerror-wrap-throwing.js +@@ -0,0 +1,70 @@ ++// Copyright (C) 2022 Chengzhong Wu. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++/*--- ++esid: sec-wrappedfunctioncreate ++description: > ++ WrappedFunctionCreate throws a TypeError if the accessing target's property may throw. ++ ++info: | ++ WrappedFunctionCreate ( callerRealm: a Realm Record, Target: a function object, ) ++ ... ++ 7. Let result be CopyNameAndLength(wrapped, Target). ++ ... ++ ++ CopyNameAndLength ( F: a function object, Target: a function object, optional prefix: a String, optional argCount: a Number, ) ++ ... ++ 3. Let targetHasLength be ? HasOwnProperty(Target, "length"). ++ 4. If targetHasLength is true, then ++ a. Let targetLen be ? Get(Target, "length"). ++ ... ++ 6. Let targetName be ? Get(Target, "name"). ++ ++features: [ShadowRealm] ++---*/ ++ ++assert.sameValue( ++ typeof ShadowRealm.prototype.evaluate, ++ 'function', ++ 'This test must fail if ShadowRealm.prototype.evaluate is not a function' ++); ++ ++const r = new ShadowRealm(); ++ ++assert.throws(TypeError, () => r.evaluate(` ++const revocable = Proxy.revocable(() => {}, {}); ++revocable.revoke(); ++ ++revocable.proxy; ++`), 'TypeError on wrapping a revoked callable proxy'); ++ ++assert.throws(TypeError, () => r.evaluate(` ++const fn = () => {}; ++Object.defineProperty(fn, 'name', { ++ get() { ++ throw new Error(); ++ }, ++}); ++ ++fn; ++`), 'TypeError on wrapping a fn with throwing name accessor'); ++ ++assert.throws(TypeError, () => r.evaluate(` ++const fn = () => {}; ++Object.defineProperty(fn, 'length', { ++ get() { ++ throw new Error(); ++ }, ++}); ++ ++fn; ++`), 'TypeError on wrapping a fn with throwing length accessor'); ++ ++assert.throws(TypeError, () => r.evaluate(` ++const proxy = new Proxy(() => {}, { ++ getOwnPropertyDescriptor(target, key) { ++ throw new Error(); ++ }, ++}); ++ ++proxy; ++`), 'TypeError on wrapping a callable proxy with throwing getOwnPropertyDescriptor trap'); +diff --git a/JSTests/test262/test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js b/JSTests/test262/test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js +index 06d9453fa109ef23b4f511ea61b64a1a4f16b73e..55fd38f54b0203ac9da782236265b37783e79567 100644 +--- a/JSTests/test262/test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js ++++ b/JSTests/test262/test/built-ins/String/prototype/localeCompare/15.5.4.9_CE.js +@@ -1,15 +1,21 @@ + // Copyright 2012 Norbert Lindenberg. All rights reserved. + // Copyright 2012 Mozilla Corporation. All rights reserved. + // Copyright 2013 Microsoft Corporation. All rights reserved. ++// Copyright (C) 2022 Richard Gibson. All rights reserved. + // This code is governed by the license found in the LICENSE file. + + /*--- +-es5id: 15.5.4.9_CE + description: > +- Tests that String.prototype.localeCompare returns 0 when +- comparing Strings that are considered canonically equivalent by +- the Unicode standard. +-author: Norbert Lindenberg ++ String.prototype.localeCompare must return 0 when ++ comparing Strings that are considered canonically equivalent by ++ the Unicode Standard. ++esid: sec-string.prototype.localecompare ++info: | ++ String.prototype.localeCompare ( _that_ [ , _reserved1_ [ , _reserved2_ ] ] ) ++ ++ This function must treat Strings that are canonically equivalent ++ according to the Unicode standard as identical and must return `0` ++ when comparing Strings that are considered canonically equivalent. + ---*/ + + // pairs with characters not in Unicode 3.0 are commented out +@@ -49,26 +55,12 @@ var pairs = [ + // ["\uD87E\uDC2B", "北"] + ]; + +-// Detect whether we are using locale-sensitive comparisons or a bitwise comparison +-if ("a".localeCompare("Z") < 0) { +- // We are using locale-sensitive comparison, so all pairs should be canonically equivalent +- var i; +- for (i = 0; i < pairs.length; i++) { +- var pair = pairs[i]; +- if (pair[0].localeCompare(pair[1]) !== 0) { +- throw new Test262Error("String.prototype.localeCompare considers " + pair[0] + " (" + toU(pair[0]) + +- ") ≠ " + pair[1] + " (" + toU(pair[1]) + ")."); +- } +- } +-} else { +- // We are using bitwise comparison, so all pairs should not be equivalent +- var i; +- for (i = 0; i < pairs.length; i++) { +- var pair = pairs[i]; +- if (pair[0].localeCompare(pair[1]) === 0) { +- throw new Test262Error("String.prototype.localeCompare considers " + pair[0] + " (" + toU(pair[0]) + +- ") = " + pair[1] + " (" + toU(pair[1]) + ")."); +- } ++var i; ++for (i = 0; i < pairs.length; i++) { ++ var pair = pairs[i]; ++ if (pair[0].localeCompare(pair[1]) !== 0) { ++ throw new Test262Error("String.prototype.localeCompare considers " + pair[0] + " (" + toU(pair[0]) + ++ ") ≠ " + pair[1] + " (" + toU(pair[1]) + ")."); + } + } + +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/from/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/from/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b6977f2f5ac5bca53e3ffa5a9f651283345fccd0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/from/calendar-number.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.calendar.from ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const arg = 19761118; ++ ++const result = Temporal.Calendar.from(arg); ++assert.sameValue(result.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.Calendar.from(arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/from/calendar-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/from/calendar-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..88ec4b5ac8d7c69c7f837481c5de644d603d3898 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/from/calendar-string-leap-second.js +@@ -0,0 +1,24 @@ ++// 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.calendar.from ++description: Leap second is a valid ISO string for Calendar ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = Temporal.Calendar.from(arg); ++assert.sameValue( ++ result1.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar" ++); ++ ++arg = { calendar: "2016-12-31T23:59:60" }; ++const result2 = Temporal.Calendar.from(arg); ++assert.sameValue( ++ result2.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/from/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/from/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ce7a471809de0704be5342f5842f87d05e8eb029 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/from/calendar-wrong-type.js +@@ -0,0 +1,30 @@ ++// 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.calendar.from ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Calendar.from(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Calendar.from(arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d1ff94276db090dc455581e74052ad0172f234a2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.calendar.prototype.dateadd ++description: A number is converted to a string, then to Temporal.PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.dateAdd(arg, new Temporal.Duration()); ++TemporalHelpers.assertPlainDate(result, 1976, 11, "M11", 18, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.dateAdd(arg, new Temporal.Duration()), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e310aaeac9f107871a26ec14d4393b68f055da9b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.dateadd ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.dateAdd(arg, new Temporal.Duration()); ++TemporalHelpers.assertPlainDate( ++ result1, ++ 1976, 11, "M11", 18, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.dateAdd(arg, new Temporal.Duration()); ++TemporalHelpers.assertPlainDate( ++ result2, ++ 1976, 11, "M11", 18, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4d585142dcec4ef767e33176441739efa407d696 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.calendar.prototype.dateadd ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.dateAdd(arg, new Temporal.Duration()); ++TemporalHelpers.assertPlainDate(result1, 1976, 11, "M11", 18, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.dateAdd(arg, new Temporal.Duration()); ++TemporalHelpers.assertPlainDate(result2, 1976, 11, "M11", 18, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.dateAdd(arg, new Temporal.Duration()), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.dateAdd(arg, new Temporal.Duration()), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a868f5578c65e70cd2383cfb6686265eec344122 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.dateadd ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.dateAdd(arg, new Temporal.Duration()), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.dateAdd(arg, new Temporal.Duration()), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.dateAdd(arg, new Temporal.Duration()), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.dateAdd(arg, new Temporal.Duration()), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.dateAdd(arg, new Temporal.Duration()), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e5d004cb0b65d34b7dc5465d921e85e1e528b600 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.dateadd ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.dateAdd(arg, new Temporal.Duration()), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..44c78a9ee5896023e90cc555371b5b36731ac05a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.dateadd ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.dateAdd(arg, new Temporal.Duration()), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-with-utc-designator.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-with-utc-designator.js +index 6c60a8c4b8aa846bfd843f86a4e652f1b3141d71..3d8fdc484a1825175caa7f148635a2795ff0d965 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-with-utc-designator.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-string-with-utc-designator.js +@@ -15,7 +15,7 @@ const instance = new Temporal.Calendar("iso8601"); + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => instance.dateAdd(arg), ++ () => instance.dateAdd(arg, new Temporal.Duration()), + "String with UTC designator should not be valid as a PlainDate" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..adde5eb0eafa20b9b34a055aa1cdecc6bf40a6eb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.dateadd ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.dateAdd(arg, new Temporal.Duration()), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.dateAdd(arg, new Temporal.Duration()), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b76329860a7568f8626bba91dd23eef248b7a202 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.dateadd ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.dateAdd({ year: 2000, month: 5, day: 2, calendar }, new Temporal.Duration(1)); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c1bf52aa358ef3484eb5f0d53036259a7d19a9fe +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/leap-second.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.calendar.prototype.dateadd ++description: Leap second is a valid ISO string for PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.dateAdd(arg, new Temporal.Duration()); ++TemporalHelpers.assertPlainDate( ++ result1, ++ 2016, 12, "M12", 31, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.dateAdd(arg, new Temporal.Duration()); ++TemporalHelpers.assertPlainDate( ++ result2, ++ 2016, 12, "M12", 31, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8f135256c93ce9c9830993a6c07567e4057034e9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.calendar.prototype.dateadd ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Calendar("iso8601"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.dateAdd(new Temporal.PlainDate(1976, 11, 18), new Temporal.Duration(1), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/overflow-invalid-string.js +index 3197c54007cd081ad88890d86ce0802694e3c5da..df173c933f7e51e3acceed4f0d9a29207dacc68a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/overflow-invalid-string.js +@@ -17,6 +17,11 @@ features: [Temporal, arrow-function] + const calendar = new Temporal.Calendar("iso8601"); + const date = new Temporal.PlainDate(2000, 5, 2, calendar); + const duration = new Temporal.Duration(3, 3, 0, 3); +-assert.throws(RangeError, +- () => calendar.dateAdd(date, duration, { overflow: "other string" }), +- "Value for overflow not one of the allowed string values"); ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => calendar.dateAdd(date, duration, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/year-zero.js +index 91e4a0a1ddc491e2a3f09617d40062a4ec6ed10b..8e1513b841c33d1fbd768854d77504ebdda081c3 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateAdd/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.dateAdd(arg); }, ++ () => instance.dateAdd(arg, new Temporal.Duration()), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..011851c75508dd3309a5646c3634742b15bcd97c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.calendar.prototype.datefromfields ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Calendar("iso8601"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.dateFromFields({ year: 1976, month: 11, day: 18 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/overflow-invalid-string.js +index 6cc0d01724dcaaf828b49933eae78f30554ff08d..28e81de7ceb47536a260a8d1c950ca63031a7d0d 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateFromFields/overflow-invalid-string.js +@@ -17,6 +17,12 @@ features: [Temporal, arrow-function] + ---*/ + + const calendar = new Temporal.Calendar("iso8601"); +-assert.throws(RangeError, () => calendar.dateFromFields({ year: 2000, month: 5, day: 2 }, +- { overflow: "other string" }), +- "Value for overflow not one of the allowed string values"); ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => calendar.dateFromFields({ year: 2000, month: 5, day: 2 }, ++ { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..343b06553b439d4dd7bcf1e44d783d1403edd467 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-number.js +@@ -0,0 +1,37 @@ ++// 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.calendar.prototype.dateuntil ++description: A number is converted to a string, then to Temporal.PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result1 = instance.dateUntil(arg, new Temporal.PlainDate(1976, 11, 19)); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "19761118 is a valid ISO string for PlainDate (first argument)"); ++const result2 = instance.dateUntil(new Temporal.PlainDate(1976, 11, 19), arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, "19761118 is a valid ISO string for PlainDate (second argument)"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 18)), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 18), arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate (second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ba6e4372f1f5e21d00e90cda453c5ed214df86d8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,25 @@ ++// 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.calendar.prototype.dateuntil ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.dateUntil(arg, new Temporal.PlainDate(1976, 11, 19)); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "leap second is a valid ISO string for calendar (first argument)"); ++const result2 = instance.dateUntil(new Temporal.PlainDate(1976, 11, 19), arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, "leap second is a valid ISO string for calendar (second argument)"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result3 = instance.dateUntil(arg, new Temporal.PlainDate(1976, 11, 19)); ++TemporalHelpers.assertDuration(result3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "leap second is a valid ISO string for calendar (nested property, first argument)"); ++const result4 = instance.dateUntil(new Temporal.PlainDate(1976, 11, 19), arg); ++TemporalHelpers.assertDuration(result4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, "leap second is a valid ISO string for calendar (nested property, second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a9fd223616341add6142e7b63d6c2bdcf759ca42 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-number.js +@@ -0,0 +1,56 @@ ++// 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.calendar.prototype.dateuntil ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.dateUntil(arg, new Temporal.PlainDate(1976, 11, 19)); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (first argument)"); ++const result2 = instance.dateUntil(new Temporal.PlainDate(1976, 11, 19), arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (second argument)"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result3 = instance.dateUntil(arg, new Temporal.PlainDate(1976, 11, 19)); ++TemporalHelpers.assertDuration(result3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property, first argument)"); ++const result4 = instance.dateUntil(new Temporal.PlainDate(1976, 11, 19), arg); ++TemporalHelpers.assertDuration(result4, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property, second argument)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19)), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (second argument)` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19)), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property, first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property, second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f23d15c3e58c0f6d1a00a66cacfd2bbbb40b5d23 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,52 @@ ++// 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.calendar.prototype.dateuntil ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19)), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg), `${description} does not convert to a valid ISO string (second argument)`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19)), `${description} does not convert to a valid ISO string (nested property, first argument)`); ++ assert.throws(RangeError, () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg), `${description} does not convert to a valid ISO string (nested property, second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19)), `${description} is not a valid property bag and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19)), `${description} is not a valid property bag and does not convert to a string (nested property, first argument)`); ++ assert.throws(TypeError, () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg), `${description} is not a valid property bag and does not convert to a string (nested property, second argument)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19)), `nested undefined calendar property is always a RangeError (first argument)`); ++assert.throws(RangeError, () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg), `nested undefined calendar property is always a RangeError (second argument)`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..773fe54515fc21982d8f5c0e2488288d469d80ce +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.dateuntil ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19)), ++ "reject minus zero as extended year (first argument)" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg), ++ "reject minus zero as extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a3ecc5814d1e8a397fae2ba2063638933359ac08 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-string-invalid.js +@@ -0,0 +1,67 @@ ++// 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.calendar.prototype.dateuntil ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a %%%conversion_target%%% ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++const other = new Temporal.PlainDate(2020, 1, 1, instance); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.dateUntil(arg, other), ++ `"${arg}" should not be a valid ISO string for a PlainDate (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.dateUntil(other, arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate (second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..425b3007f9f0715c81ffdf6749cd3c11e673814f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/argument-wrong-type.js +@@ -0,0 +1,39 @@ ++// 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.calendar.prototype.dateuntil ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19)), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg), `${description} does not convert to a valid ISO string (first argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19)), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++ assert.throws(TypeError, () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..419334f252e27c5e5322f0ff58a4796b8b792149 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.dateuntil ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.dateUntil({ year: 2000, month: 5, day: 2, calendar }, { year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 2); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f28efbb20ab4c0b609741cabc6ea64199a906187 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/leap-second.js +@@ -0,0 +1,23 @@ ++// 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.calendar.prototype.dateuntil ++description: Leap second is a valid ISO string for PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++let result = instance.dateUntil(arg, new Temporal.PlainDate(2017, 1, 1)); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "leap second is a valid ISO string for PlainDate (first argument)"); ++result = instance.dateUntil(new Temporal.PlainDate(2017, 1, 1), arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, "leap second is a valid ISO string for PlainDate (second argument)"); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++result = instance.dateUntil(arg, new Temporal.PlainDate(2017, 1, 1)); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "second: 60 is ignored in property bag for PlainDate (first argument)"); ++result = instance.dateUntil(new Temporal.PlainDate(2017, 1, 1), arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, "second: 60 is ignored in property bag for PlainDate (second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1191edf29fe4014df99967f029af07a720e3c25b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.calendar.prototype.dateuntil ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Calendar("iso8601"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.dateUntil(new Temporal.PlainDate(1976, 11, 18), new Temporal.PlainDate(1984, 5, 31), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/year-zero.js +index effb46112b56e9d48bc44c5fd943c644d361d4cc..b6c4ea0415a369e0ab76dcb9ec2ce6ac1b607c5f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dateUntil/year-zero.js +@@ -9,16 +9,23 @@ features: [Temporal] + + const calendar = new Temporal.Calendar("iso8601"); + const date = new Temporal.PlainDate(2000, 5, 2); +-const bad = "-000000-03-14"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + +-assert.throws( +- RangeError, +- () => calendar.dateUntil(bad, date), +- "cannot use minus zero as extended date (first argument)" +-); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => calendar.dateUntil(arg, date), ++ "cannot use minus zero as extended date (first argument)" ++ ); + +-assert.throws( +- RangeError, +- () => calendar.dateUntil(date, bad), +- "cannot use minus zero as extended date (second argument)" +-); ++ assert.throws( ++ RangeError, ++ () => calendar.dateUntil(date, arg), ++ "cannot use minus zero as extended date (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..61562a4da60fdb25f274939f616ab2fdacf82a71 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.day ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.day(arg); ++assert.sameValue(result, 18, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.day(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2bf759b8a513c7c980783ce3413db384a73811d5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.day ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.day(arg); ++assert.sameValue( ++ result1, ++ 18, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.day(arg); ++assert.sameValue( ++ result2, ++ 18, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..403ca7f06d54b0f668be83787b9ee1dc626359a2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.day ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.day(arg); ++assert.sameValue(result1, 18, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.day(arg); ++assert.sameValue(result2, 18, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.day(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.day(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..57c21e0ad9a960c1d683b2d7d02f114e73fee90d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.day ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.day(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.day(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.day(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.day(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.day(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cf64d454b0e3b9c5774a985c903fa43692b960a8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.day ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.day(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..95a33903b797f277918e8f13e0e67040b5c8737e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.day ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.day(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..78e120896ee6751340713357847e46931f87eae2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.day ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.day(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.day(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..80cd4dae2e15c3d22d655e40569eaf21424b4646 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.day ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.day({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..38c3e724ea69e49161fae09bc0bace9bf860483f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.day ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.day(arg); ++assert.sameValue( ++ result1, ++ 31, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.day(arg); ++assert.sameValue( ++ result2, ++ 31, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/year-zero.js +index 555a3f62c0f8730500c1e39d245b66f7e5d59f82..91daa874762f7d93aa0cc12ee0c778401745b95f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/day/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.day(arg); }, ++ () => instance.day(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..026642fdee44c3b8a9f99c9c2d38ddec9b4f23a7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.dayofweek ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.dayOfWeek(arg); ++assert.sameValue(result, 4, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.dayOfWeek(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fcd0ca2d74d644553dda7a8afa8dfa30ab061b6b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.dayofweek ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.dayOfWeek(arg); ++assert.sameValue( ++ result1, ++ 4, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.dayOfWeek(arg); ++assert.sameValue( ++ result2, ++ 4, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bc4d21ea1c3e58e58ab99fb8f4e08deaf720d9ee +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.dayofweek ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.dayOfWeek(arg); ++assert.sameValue(result1, 4, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.dayOfWeek(arg); ++assert.sameValue(result2, 4, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.dayOfWeek(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.dayOfWeek(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..03f9f143440fe0230f0144da5647d421fdc7c8e5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.dayofweek ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.dayOfWeek(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.dayOfWeek(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.dayOfWeek(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.dayOfWeek(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.dayOfWeek(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..871fd744633bfd90f8ac6ac937f676baa9c2099b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.dayofweek ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.dayOfWeek(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..77d600bffdeba429f60feaedb8a4d21d626ced42 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.dayofweek ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.dayOfWeek(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d44886ea32de3db4ea569faaf941d5c4a2e64fcb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.dayofweek ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.dayOfWeek(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.dayOfWeek(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e67d34fdcc09d555ca5fc41706c16fd6e07d4c10 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.dayofweek ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.dayOfWeek({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4d78c15bbc2b4d6da6544d363555a2ea131fa0ef +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.dayofweek ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.dayOfWeek(arg); ++assert.sameValue( ++ result1, ++ 6, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.dayOfWeek(arg); ++assert.sameValue( ++ result2, ++ 6, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/year-zero.js +index 18ab7a6827b4eb1281d3f995fa60ac34c8a75902..0d887a397803b55dbdf0934415159f80d5949e79 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfWeek/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.dayOfWeek(arg); }, ++ () => instance.dayOfWeek(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0794df0f4c0a1f242c49412b9bc654fcc2a33af4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.dayofyear ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.dayOfYear(arg); ++assert.sameValue(result, 323, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.dayOfYear(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d51b2c0dcb5107bd8aa59ed393455eba297cb0b6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.dayofyear ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.dayOfYear(arg); ++assert.sameValue( ++ result1, ++ 323, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.dayOfYear(arg); ++assert.sameValue( ++ result2, ++ 323, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f0447e0c1ce651133efbd4cfcd33b9910b83ab6b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.dayofyear ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.dayOfYear(arg); ++assert.sameValue(result1, 323, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.dayOfYear(arg); ++assert.sameValue(result2, 323, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.dayOfYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.dayOfYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f7ecf1684eb01b0b517b832d2ff81b2a4a7fb422 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.dayofyear ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.dayOfYear(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.dayOfYear(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.dayOfYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.dayOfYear(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.dayOfYear(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7335b890c4d19b68097e44539d3b5d487c22bc56 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.dayofyear ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.dayOfYear(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8768faa638164a09a92df4c421b99dadf2d55eab +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.dayofyear ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.dayOfYear(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e906d79bee0192ea2604a7767731afb432df7c52 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.dayofyear ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.dayOfYear(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.dayOfYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2ebc1c96f3044cfb6d3353a0b2bd465e67bafe29 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.dayofyear ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.dayOfYear({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f41dfb5f7361b0fb62ae898fdacf9759b284e08d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.dayofyear ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.dayOfYear(arg); ++assert.sameValue( ++ result1, ++ 366, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.dayOfYear(arg); ++assert.sameValue( ++ result2, ++ 366, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/year-zero.js +index e31b214116910cf98dd92ff7c71f56c57f179f24..6fec20e46916ea88d761be7f17d5032c0fac46bb 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/dayOfYear/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.dayOfYear(arg); }, ++ () => instance.dayOfYear(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5020046bf4ff6dc367770773bb04fef4f5a60283 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.daysinmonth ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.daysInMonth(arg); ++assert.sameValue(result, 30, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.daysInMonth(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..763ae9c73ddf0ece8a8cc50e2e2e670a4f57f9f1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.daysinmonth ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.daysInMonth(arg); ++assert.sameValue( ++ result1, ++ 30, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.daysInMonth(arg); ++assert.sameValue( ++ result2, ++ 30, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2987dc0b11de8d8d60700044667858693597e983 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.daysinmonth ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.daysInMonth(arg); ++assert.sameValue(result1, 30, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.daysInMonth(arg); ++assert.sameValue(result2, 30, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.daysInMonth(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.daysInMonth(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9876bb18a9ccc259973869c6a809299aed5dc970 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.daysinmonth ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.daysInMonth(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.daysInMonth(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.daysInMonth(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.daysInMonth(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.daysInMonth(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1f273d6d431f2c1cb812b4f1e84bbd4b122eccc8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.daysinmonth ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.daysInMonth(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..97ecac0fa8f1456ca7547fb7f7194f3f9ce82495 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.daysinmonth ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.daysInMonth(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..33ad7cc3b82c4f1c6927a87eac9623c6483d456f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.daysinmonth ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.daysInMonth(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.daysInMonth(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..86e25eb109a33cd7f02e751ae17764809cfec2aa +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.daysinmonth ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.daysInMonth({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3274f449169d566ff175d0a7a9b8dc4dfda665b9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.daysinmonth ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.daysInMonth(arg); ++assert.sameValue( ++ result1, ++ 31, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.daysInMonth(arg); ++assert.sameValue( ++ result2, ++ 31, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/year-zero.js +index c2c6204ed693896a9cf3af2a084e19cec2424ee9..d4a5d70149b83eb646dfc3a8b2a3c1f6a64d2c77 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInMonth/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.daysInMonth(arg); }, ++ () => instance.daysInMonth(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..889f44f8ba9c7f2101b0f0129ea0f590c49196d0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.daysinweek ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.daysInWeek(arg); ++assert.sameValue(result, 7, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.daysInWeek(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4d6d407a78ada5b3eed5ed7c3f4451f0f48ec2c2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.daysinweek ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.daysInWeek(arg); ++assert.sameValue( ++ result1, ++ 7, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.daysInWeek(arg); ++assert.sameValue( ++ result2, ++ 7, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..473cd6a4333f375f16b0bf95085b290b0b92a4e8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.daysinweek ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.daysInWeek(arg); ++assert.sameValue(result1, 7, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.daysInWeek(arg); ++assert.sameValue(result2, 7, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.daysInWeek(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.daysInWeek(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a0179adc03915257ab362a21b04918902a315135 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.daysinweek ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.daysInWeek(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.daysInWeek(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.daysInWeek(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.daysInWeek(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.daysInWeek(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0c27c02bfaa119cd7a71b4e5650d33c98823c0ad +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.daysinweek ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.daysInWeek(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9c98bd32957214d3d61fad41564d8b8d28471259 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.daysinweek ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.daysInWeek(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c08d2bf1330c9bb3355447186376a4af04671c45 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.daysinweek ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.daysInWeek(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.daysInWeek(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..68e86ffc1e568221abcf2d92211b51435771a181 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.daysinweek ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.daysInWeek({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b88af835e500b05d993ed98264b2e9230e1e5e7f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.daysinweek ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.daysInWeek(arg); ++assert.sameValue( ++ result1, ++ 7, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.daysInWeek(arg); ++assert.sameValue( ++ result2, ++ 7, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/year-zero.js +index b852ef7814074e422bb92f182106bfc01dbe6222..67caad3a5e654a75d4ae2ce2c4a6e0b2cea33df7 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInWeek/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.daysInWeek(arg); }, ++ () => instance.daysInWeek(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..84492ddf2bf7c1dbef4342e103ebb5950181a926 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.daysinyear ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.daysInYear(arg); ++assert.sameValue(result, 366, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.daysInYear(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..027cf9da24438e4d86187c0eaf2191504ce8d18e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.daysinyear ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.daysInYear(arg); ++assert.sameValue( ++ result1, ++ 366, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.daysInYear(arg); ++assert.sameValue( ++ result2, ++ 366, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..de1bdcfccd4cdae6d9e8f45a86d422da6bc28431 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.daysinyear ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.daysInYear(arg); ++assert.sameValue(result1, 366, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.daysInYear(arg); ++assert.sameValue(result2, 366, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.daysInYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.daysInYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..97283c0b3ffbc5e8dcbfe77bf634bd66561a58c5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.daysinyear ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.daysInYear(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.daysInYear(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.daysInYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.daysInYear(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.daysInYear(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..62a9e6d18e945798250936a67b1a864d3f30c8de +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.daysinyear ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.daysInYear(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8d92ef970d0d62c1eb9a329e23942144bf62f9a7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.daysinyear ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.daysInYear(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c57754bcbfeeb5c67c449a59d968e6a82e5cd86e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.daysinyear ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.daysInYear(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.daysInYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..20b64607d61e1d493445c488d2bc60f7b982f92e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.daysinyear ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.daysInYear({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ab2f0fb25b53e74317b3eda687bf889a48ca720a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.daysinyear ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.daysInYear(arg); ++assert.sameValue( ++ result1, ++ 366, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.daysInYear(arg); ++assert.sameValue( ++ result2, ++ 366, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/year-zero.js +index 4c226015b2203fcac0cbc116da12fd12855e3b6b..9bb94a19d3ceefbeb736403f24994195edbec8db 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/daysInYear/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.daysInYear(arg); }, ++ () => instance.daysInYear(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1b9f0dde66aa777edf0c1d400c3b39cf195e0b0f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.inleapyear ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.inLeapYear(arg); ++assert.sameValue(result, true, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.inLeapYear(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a776948093e4d8488a3724a5b14ab7f408144f2e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.inleapyear ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.inLeapYear(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.inLeapYear(arg); ++assert.sameValue( ++ result2, ++ true, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f3ba12a322c0313f4135c2b757226129c41779c3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.inleapyear ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.inLeapYear(arg); ++assert.sameValue(result1, true, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.inLeapYear(arg); ++assert.sameValue(result2, true, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.inLeapYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.inLeapYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7993e2e1bfa18316b05ab02ef851b7db5e98c41e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.inleapyear ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.inLeapYear(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.inLeapYear(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.inLeapYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.inLeapYear(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.inLeapYear(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4a5b92aea81b32a768f6bd5eeba913367cfde0b5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.inleapyear ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.inLeapYear(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6a1c1d5d6b70c0016fd0b1d28a1b9ffde9d3af95 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.inleapyear ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.inLeapYear(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1c4272fbd72f849fd4bc8e4b1388b9a546e86f98 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-string.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.inleapyear ++description: An ISO 8601 date string should be converted as input ++info: | ++ 4. If Type(temporalDateLike) is not Object or temporalDateLike does not have an [[InitializedTemporalDate]] or [[InitializedTemporalYearMonth]] internal slot, then ++ a. Set temporalDateLike to ? ToTemporalDate(temporalDateLike). ++ 5. Return ! IsISOLeapYear(temporalDateLike.[[ISOYear]]). ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++assert.sameValue(cal.inLeapYear("2019-03-18"), false); ++assert.sameValue(cal.inLeapYear("2020-03-18"), true); ++ ++assert.sameValue(cal.inLeapYear("+002023-03-18"), false); ++assert.sameValue(cal.inLeapYear("+002024-03-18"), true); ++ ++assert.sameValue(cal.inLeapYear("2019-03-18T13:00:00+00:00[UTC]"), false); ++assert.sameValue(cal.inLeapYear("2020-12-31T23:59:59+00:00[UTC]"), true); ++ ++assert.sameValue(cal.inLeapYear("+002023-03-18T13:00:00+00:00[UTC]"), false); ++assert.sameValue(cal.inLeapYear("+002024-03-18T13:00:00+00:00[UTC]"), true); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..02c8477cbf185ec24f18316232e4b769925aa86e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.inleapyear ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.inLeapYear(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.inLeapYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/basic.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/basic.js +index 4359c4c8d44bc7714b3c9f08b91ccbf54259bdfb..7e8d3cf048be2cc4081c2df673328539d4b2fe4f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/basic.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/basic.js +@@ -8,10 +8,19 @@ features: [Temporal] + ---*/ + + const iso = Temporal.Calendar.from("iso8601"); +-const res = false; +-assert.sameValue(iso.inLeapYear(Temporal.PlainDate.from("1994-11-05")), res, "PlainDate"); +-assert.sameValue(iso.inLeapYear(Temporal.PlainDateTime.from("1994-11-05T08:15:30")), res, "PlainDateTime"); +-assert.sameValue(iso.inLeapYear(Temporal.PlainYearMonth.from("1994-11")), res, "PlainYearMonth"); ++let res = false; ++ ++assert.sameValue(iso.inLeapYear(new Temporal.PlainDate(1994, 11, 5)), res, "PlainDate"); ++assert.sameValue(iso.inLeapYear(new Temporal.PlainDateTime(1994, 11, 5, 8, 15, 30)), res, "PlainDateTime"); ++assert.sameValue(iso.inLeapYear(new Temporal.PlainYearMonth(1994, 11)), res, "PlainYearMonth"); + assert.sameValue(iso.inLeapYear({ year: 1994, month: 11, day: 5 }), res, "property bag"); + assert.sameValue(iso.inLeapYear("1994-11-05"), res, "string"); ++ ++res = true; ++assert.sameValue(iso.inLeapYear(new Temporal.PlainDate(1996, 7, 15)), res, "PlainDate in leap year"); ++assert.sameValue(iso.inLeapYear(new Temporal.PlainDateTime(1996, 7, 15, 5, 30, 13)), res, "PlainDateTime in leap year"); ++assert.sameValue(iso.inLeapYear(new Temporal.PlainYearMonth(1996, 7)), res, "PlainYearMonth in leap year"); ++assert.sameValue(iso.inLeapYear({ year: 1996, month: 7, day: 15 }), res, "property bag in leap year"); ++assert.sameValue(iso.inLeapYear("1996-07-15"), res, "string in leap year"); ++ + assert.throws(TypeError, () => iso.inLeapYear({ year: 2000 }), "property bag with missing properties"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js +index 8b3e5de8a2f51beb0c45316d0973d84c350424d4..003cf490ab024bec9e2f1a6dfc97d2e31803707d 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/branding.js +@@ -11,12 +11,14 @@ const inLeapYear = Temporal.Calendar.prototype.inLeapYear; + + assert.sameValue(typeof inLeapYear, "function"); + +-assert.throws(TypeError, () => inLeapYear.call(undefined), "undefined"); +-assert.throws(TypeError, () => inLeapYear.call(null), "null"); +-assert.throws(TypeError, () => inLeapYear.call(true), "true"); +-assert.throws(TypeError, () => inLeapYear.call(""), "empty string"); +-assert.throws(TypeError, () => inLeapYear.call(Symbol()), "symbol"); +-assert.throws(TypeError, () => inLeapYear.call(1), "1"); +-assert.throws(TypeError, () => inLeapYear.call({}), "plain object"); +-assert.throws(TypeError, () => inLeapYear.call(Temporal.Calendar), "Temporal.Calendar"); +-assert.throws(TypeError, () => inLeapYear.call(Temporal.Calendar.prototype), "Temporal.Calendar.prototype"); ++const arg = new Temporal.PlainDate(2021, 3, 4); ++ ++assert.throws(TypeError, () => inLeapYear.call(undefined, arg), "undefined"); ++assert.throws(TypeError, () => inLeapYear.call(null, arg), "null"); ++assert.throws(TypeError, () => inLeapYear.call(true, arg), "true"); ++assert.throws(TypeError, () => inLeapYear.call("", arg), "empty string"); ++assert.throws(TypeError, () => inLeapYear.call(Symbol(), arg), "symbol"); ++assert.throws(TypeError, () => inLeapYear.call(1, arg), "1"); ++assert.throws(TypeError, () => inLeapYear.call({}, arg), "plain object"); ++assert.throws(TypeError, () => inLeapYear.call(Temporal.Calendar, arg), "Temporal.Calendar"); ++assert.throws(TypeError, () => inLeapYear.call(Temporal.Calendar.prototype, arg), "Temporal.Calendar.prototype"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2b89a6b531aff8aba93e5c87735c0ba264066470 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.inleapyear ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.inLeapYear({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e64bef3048b9088fe538ca39828ff9644d1de94c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.inleapyear ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.inLeapYear(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.inLeapYear(arg); ++assert.sameValue( ++ result2, ++ true, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/year-zero.js +index 8aeb7c2a7618e6d5f5402c9ebde413f443d38c23..f96bac46a4b6b9e1b7df4d360d716279623b4e5e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/inLeapYear/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.inLeapYear(arg); }, ++ () => instance.inLeapYear(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/basic.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..72483362e8b8fa040a45d9b21f329247cef73ba3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/basic.js +@@ -0,0 +1,33 @@ ++// Copyright (C) 2021 the V8 project authors. All rights reserved. ++// 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.calendar.prototype.mergefields ++description: > ++ Temporal.Calendar.prototype.mergeFields will merge own data properties on its ++ arguments ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. Set fields to ? ToObject(fields). ++ 5. Set additionalFields to ? ToObject(additionalFields). ++ 6. Return ? DefaultMergeFields(fields, additionalFields). ++features: [Temporal] ++includes: [deepEqual.js] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2 }, { c: 3, d: 4 }), ++ { a: 1, b: 2, c: 3, d: 4 }, ++ "properties are merged" ++); ++ ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2 }, { b: 3, c: 4 }), ++ { a: 1, b: 3, c: 4 }, ++ "property in additionalFields should overwrite one in fields" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/iso8601-calendar-month-monthCode.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/iso8601-calendar-month-monthCode.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e322a791e13d2ef5375b2cd91eb6ae95e34fb6bc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/iso8601-calendar-month-monthCode.js +@@ -0,0 +1,99 @@ ++// 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.calendar.prototype.mergefields ++description: > ++ The default mergeFields algorithm from the ISO 8601 calendar should correctly ++ merge the month and monthCode properties ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. Set fields to ? ToObject(fields). ++ 5. Set additionalFields to ? ToObject(additionalFields). ++ 6. Return ? DefaultMergeFields(fields, additionalFields). ++features: [Temporal] ++includes: [deepEqual.js] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, month: 7 }, { b: 3, c: 4 }), ++ { a: 1, b: 3, c: 4, month: 7 }, ++ "month is copied from fields" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, monthCode: "M08" }, { b: 3, c: 4 }), ++ { a: 1, b: 3, c: 4, monthCode: "M08" }, ++ "monthCode is copied from fields" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, month: 7, monthCode: "M08" }, { b: 3, c: 4 }), ++ { a: 1, b: 3, c: 4, month: 7, monthCode: "M08" }, ++ "both month and monthCode are copied from fields, no validation is performed" ++); ++ ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2 }, { b: 3, c: 4, month: 5 }), ++ { a: 1, b: 3, c: 4, month: 5 }, ++ "month is copied from additionalFields" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2 }, { b: 3, c: 4, monthCode: "M06" }), ++ { a: 1, b: 3, c: 4, monthCode: "M06" }, ++ "monthCode is copied from additionalFields" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2 }, { b: 3, c: 4, month: 5, monthCode: "M06" }), ++ { a: 1, b: 3, c: 4, month: 5, monthCode: "M06" }, ++ "both month and monthCode are copied from additionalFields, no validation is performed" ++); ++ ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, month: 7 }, { b: 3, c: 4, month: 5 }), ++ { a: 1, b: 3, c: 4, month: 5 }, ++ "month from additionalFields overrides month from fields" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, monthCode: "M07" }, { b: 3, c: 4, monthCode: "M05" }), ++ { a: 1, b: 3, c: 4, monthCode: "M05" }, ++ "monthCode from additionalFields overrides monthCode from fields" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, monthCode: "M07" }, { b: 3, c: 4, month: 6 }), ++ { a: 1, b: 3, c: 4, month: 6 }, ++ "month's presence on additionalFields blocks monthCode from fields" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, month: 7 }, { b: 3, c: 4, monthCode: "M06" }), ++ { a: 1, b: 3, c: 4, monthCode: "M06"}, ++ "monthCode's presence on additionalFields blocks month from fields" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, month: 7, monthCode: "M08" },{ b: 3, c: 4, month: 5 }), ++ { a: 1, b: 3, c: 4, month: 5 }, ++ "month's presence on additionalFields blocks both month and monthCode from fields" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, month: 7, monthCode: "M08" }, { b: 3, c: 4, monthCode: "M06" }), ++ { a: 1, b: 3, c: 4, monthCode: "M06" }, ++ "monthCode's presence on additionalFields blocks both month and monthCode from fields" ++); ++ ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, month: 7 }, { b: 3, c: 4, month: 5, monthCode: "M06" }), ++ { a: 1, b: 3, c: 4, month: 5, monthCode: "M06" }, ++ "both month and monthCode are copied from additionalFields even when fields has month" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, monthCode: "M07" }, { b: 3, c: 4, month: 5, monthCode: "M06" }), ++ { a: 1, b: 3, c: 4, month: 5, monthCode: "M06" }, ++ "both month and monthCode are copied from additionalFields even when fields has monthCode" ++); ++assert.deepEqual( ++ cal.mergeFields({ a: 1, b: 2, month: 7, monthCode: "M08" }, { b: 3, c: 4, month: 5, monthCode: "M06" }), ++ { a: 1, b: 3, c: 4, month: 5, monthCode: "M06" }, ++ "both month and monthCode are copied from additionalFields even when fields has both month and monthCode" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/non-string-properties.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/non-string-properties.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2908be90ba81c443ceeda5823ae96813d994540c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/mergeFields/non-string-properties.js +@@ -0,0 +1,34 @@ ++// Copyright (C) 2021 the V8 project authors. All rights reserved. ++// 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.calendar.prototype.mergefields ++description: Only string keys from the arguments are merged ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. Set fields to ? ToObject(fields). ++ 5. Set additionalFields to ? ToObject(additionalFields). ++ 6. Return ? DefaultMergeFields(fields, additionalFields). ++features: [Temporal] ++includes: [deepEqual.js] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++assert.deepEqual( ++ cal.mergeFields({ 1: 2 }, { 3: 4 }), ++ { "1": 2, "3": 4 }, ++ "number keys are actually string keys and are merged as such" ++); ++assert.deepEqual( ++ cal.mergeFields({ 1n: 2 }, { 2n: 4 }), ++ { "1": 2, "2": 4 }, ++ "bigint keys are actually string keys and are merged as such" ++); ++ ++const foo = Symbol("foo"); ++const bar = Symbol("bar"); ++assert.deepEqual(cal.mergeFields({ [foo]: 1 }, { [bar]: 2 }), {}, "symbol keys are not merged"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f63c215e3d25d0b73ef15f7ddffbd233f72689c7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.month ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.month(arg); ++assert.sameValue(result, 11, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.month(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..313b31f512fde0c16758e418771e448de41b2659 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.month ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.month(arg); ++assert.sameValue( ++ result1, ++ 11, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.month(arg); ++assert.sameValue( ++ result2, ++ 11, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1d8351bc8d33e0cda22cd9899e7c4f86611b4a86 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.month ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.month(arg); ++assert.sameValue(result1, 11, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.month(arg); ++assert.sameValue(result2, 11, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.month(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.month(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1d5ac9c40f124cf4af68d15752519e874798f331 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.month ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.month(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.month(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.month(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.month(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.month(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1d41054f50a6bfdd1b2887be485e19b373cebb72 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.month ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.month(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e314a1d01e3b899c52e3d46d3da21c912c588dfd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.month ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.month(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..deede47c06b1ec86aebbfc288765e6c5c22bc8ff +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.month ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.month(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.month(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..77c6e75f82942daf6ac47b35ec0ac43e4bc8a2eb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.month ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.month({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..61198fe9f4f14ba2e2b825f080086295bb7c17c9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.month ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.month(arg); ++assert.sameValue( ++ result1, ++ 12, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.month(arg); ++assert.sameValue( ++ result2, ++ 12, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/year-zero.js +index f42751175addb13f466b22566c79f55d9b71c676..b54957b1c106febd5ff3783abb3e125958e4af37 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/month/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.month(arg); }, ++ () => instance.month(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..dfd779c38bc47aa2a0da8d66635b57e0227e952b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.monthcode ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.monthCode(arg); ++assert.sameValue(result, "M11", "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.monthCode(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7c8eb3e6cfb17145ce8a43c5e80a599315a14a29 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.monthcode ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.monthCode(arg); ++assert.sameValue( ++ result1, ++ "M11", ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.monthCode(arg); ++assert.sameValue( ++ result2, ++ "M11", ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d7ac6bebdc880757e98d949589932065c251d45b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.monthcode ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.monthCode(arg); ++assert.sameValue(result1, "M11", "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.monthCode(arg); ++assert.sameValue(result2, "M11", "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.monthCode(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.monthCode(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ffdeeb4269ff60f8c544e76ef5dd4966f8cc3bba +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.monthcode ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.monthCode(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.monthCode(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.monthCode(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.monthCode(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.monthCode(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1f385c2203e00aad6e89a5659260948210d0f584 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.monthcode ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.monthCode(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3994dee3bc9341488cc62d9c7a440ab6915be735 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.monthcode ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.monthCode(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..939933db94412df0f74aa10e2fb3cccbed8e6584 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.monthcode ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.monthCode(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.monthCode(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..18111f2f165f586390e8ac201eca3b315fd3be77 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.monthcode ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.monthCode({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..69c34c942be330398a672705f9df414613543be6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.monthcode ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.monthCode(arg); ++assert.sameValue( ++ result1, ++ "M12", ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.monthCode(arg); ++assert.sameValue( ++ result2, ++ "M12", ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/year-zero.js +index fc81c5348e26d8021722741d17cbbdad79398d16..5ad4d0dde748616b3ba6651bcfd9d96b31978ed9 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthCode/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.monthCode(arg); }, ++ () => instance.monthCode(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/basic.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e79389fe36e011a64457581148dbd760c75f75cf +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/basic.js +@@ -0,0 +1,40 @@ ++// 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.calendar.prototype.monthdayfromfields ++description: Temporal.Calendar.prototype.monthDayFromFields will return correctly with valid data. ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. If Type(fields) is not Object, throw a TypeError exception. ++ 5. Set options to ? GetOptionsObject(options). ++ 6. Let result be ? ISOMonthDayFromFields(fields, options). ++ 7. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, result.[[ReferenceISOYear]]). ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++let result = cal.monthDayFromFields({ year: 2021, month: 7, day: 3 }); ++TemporalHelpers.assertPlainMonthDay(result, "M07", 3, "month 7, day 3, with year"); ++result = cal.monthDayFromFields({ year: 2021, month: 12, day: 31 }); ++TemporalHelpers.assertPlainMonthDay(result, "M12", 31, "month 12, day 31, with year"); ++result = cal.monthDayFromFields({ monthCode: "M07", day: 3 }); ++TemporalHelpers.assertPlainMonthDay(result, "M07", 3, "monthCode M07, day 3"); ++result = cal.monthDayFromFields({ monthCode: "M12", day: 31 }); ++TemporalHelpers.assertPlainMonthDay(result, "M12", 31, "monthCode M12, day 31"); ++ ++["constrain", "reject"].forEach(function (overflow) { ++ const opt = { overflow }; ++ result = cal.monthDayFromFields({ year: 2021, month: 7, day: 3 }, opt); ++ TemporalHelpers.assertPlainMonthDay(result, "M07", 3, "month 7, day 3, with year"); ++ result = cal.monthDayFromFields({ year: 2021, month: 12, day: 31 }, opt); ++ TemporalHelpers.assertPlainMonthDay(result, "M12", 31, "month 12, day 31, with year"); ++ result = cal.monthDayFromFields({ monthCode: "M07", day: 3 }, opt); ++ TemporalHelpers.assertPlainMonthDay(result, "M07", 3, "monthCode M07, day 3"); ++ result = cal.monthDayFromFields({ monthCode: "M12", day: 31 }, opt); ++ TemporalHelpers.assertPlainMonthDay(result, "M12", 31, "monthCode M12, day 31"); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-missing-properties.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-missing-properties.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d642ab4302e2a2400425c58b7f951a1919d0f022 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-missing-properties.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.monthdayfromfields ++description: Temporal.Calendar.prototype.monthDayFromFields will throw TypeError with incorrect input data type. ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. If Type(fields) is not Object, throw a TypeError exception. ++ 5. Set options to ? GetOptionsObject(options). ++ 6. Let result be ? ISOMonthDayFromFields(fields, options). ++ 7. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, result.[[ReferenceISOYear]]). ++features: [Temporal] ++---*/ ++ ++let cal = new Temporal.Calendar("iso8601") ++ ++assert.throws(TypeError, () => cal.monthDayFromFields({}), "at least one correctly spelled property is required"); ++assert.throws(TypeError, () => cal.monthDayFromFields({ monthCode: "M12" }), "day is required with monthCode"); ++assert.throws(TypeError, () => cal.monthDayFromFields({ year: 2021, month: 12 }), "day is required with year and month"); ++assert.throws(TypeError, () => cal.monthDayFromFields({ month: 1, day: 17 }), "year is required if month is present"); ++assert.throws(TypeError, () => cal.monthDayFromFields({ year: 2021, day: 17 }), "either month or monthCode is required"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-not-object.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-not-object.js +index f8400f718544e72263951b8e53e254114ac53d23..88c229f074c9c7e8a3b89b20ecb74037199adbf6 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-not-object.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/fields-not-object.js +@@ -7,7 +7,7 @@ description: Throw a TypeError if the fields is not an object + features: [Symbol, Temporal] + ---*/ + +-const tests = [undefined, null, false, "string", Symbol("sym"), Math.PI, 42n]; ++const tests = [undefined, null, true, false, "string", Symbol("sym"), Math.PI, Infinity, NaN, 42n]; + const iso = Temporal.Calendar.from("iso8601"); + for (const fields of tests) { + assert.throws(TypeError, () => iso.monthDayFromFields(fields, {})); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/monthcode-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/monthcode-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..29e5c4f0984d78d362fa0993780becb57d4e0b81 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/monthcode-invalid.js +@@ -0,0 +1,31 @@ ++// 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.calendar.prototype.monthdayfromfields ++description: Throw RangeError for an out-of-range, conflicting, or ill-formed monthCode ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. If Type(fields) is not Object, throw a TypeError exception. ++ 5. Set options to ? GetOptionsObject(options). ++ 6. Let result be ? ISOMonthDayFromFields(fields, options). ++ 7. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, result.[[ReferenceISOYear]]). ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++["m1", "M1", "m01"].forEach((monthCode) => { ++ assert.throws(RangeError, () => cal.monthDayFromFields({ monthCode, day: 17 }), ++ `monthCode '${monthCode}' is not well-formed`); ++}); ++ ++assert.throws(RangeError, () => cal.monthDayFromFields({ year: 2021, month: 12, monthCode: "M11", day: 17 }), ++ "monthCode and month conflict"); ++ ++["M00", "M19", "M99", "M13"].forEach((monthCode) => { ++ assert.throws(RangeError, () => cal.monthDayFromFields({ monthCode, day: 17 }), ++ `monthCode '${monthCode}' is not valid for ISO 8601 calendar`); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f19f381f5d0b3a861788d98ef9e1bb6024e12108 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.calendar.prototype.monthdayfromfields ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Calendar("iso8601"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.monthDayFromFields({ monthCode: "M12", day: 15 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-constrain.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-constrain.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0ad71fe6d07af2b0097fe23762bfecde4efeec1e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-constrain.js +@@ -0,0 +1,91 @@ ++// 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.calendar.prototype.monthdayfromfields ++description: Temporal.Calendar.prototype.monthDayFromFields will return correctly with data and overflow set to 'constrain'. ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. If Type(fields) is not Object, throw a TypeError exception. ++ 5. Set options to ? GetOptionsObject(options). ++ 6. Let result be ? ISOMonthDayFromFields(fields, options). ++ 7. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, result.[[ReferenceISOYear]]). ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++const opt = { overflow: "constrain" }; ++ ++let result = cal.monthDayFromFields({ year: 2021, month: 1, day: 133 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M01", 31, "day is constrained to 31 in month 1"); ++result = cal.monthDayFromFields({ year: 2021, month: 2, day: 133 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M02", 28, "day is constrained to 28 in month 2 (year 2021)"); ++result = cal.monthDayFromFields({ year: 2021, month: 3, day: 9033 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M03", 31, "day is constrained to 31 in month 3"); ++result = cal.monthDayFromFields({ year: 2021, month: 4, day: 50 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M04", 30, "day is constrained to 30 in month 4"); ++result = cal.monthDayFromFields({ year: 2021, month: 5, day: 77 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M05", 31, "day is constrained to 31 in month 5"); ++result = cal.monthDayFromFields({ year: 2021, month: 6, day: 33 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M06", 30, "day is constrained to 30 in month 6"); ++result = cal.monthDayFromFields({ year: 2021, month: 7, day: 33 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M07", 31, "day is constrained to 31 in month 7"); ++result = cal.monthDayFromFields({ year: 2021, month: 8, day: 300 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M08", 31, "day is constrained to 31 in month 8"); ++result = cal.monthDayFromFields({ year: 2021, month: 9, day: 400 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M09", 30, "day is constrained to 30 in month 9"); ++result = cal.monthDayFromFields({ year: 2021, month: 10, day: 400 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M10", 31, "day is constrained to 31 in month 10"); ++result = cal.monthDayFromFields({ year: 2021, month: 11, day: 400 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M11", 30, "day is constrained to 30 in month 11"); ++result = cal.monthDayFromFields({ year: 2021, month: 12, day: 500 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M12", 31, "day is constrained to 31 in month 12"); ++ ++assert.throws( ++ RangeError, ++ () => cal.monthDayFromFields({ year: 2021, month: -99999, day: 1 }, opt), ++ "negative month -99999 is out of range even with overflow constrain" ++) ++assert.throws( ++ RangeError, ++ () => cal.monthDayFromFields({ year: 2021, month: -1, day: 1 }, opt), ++ "negative month -1 is out of range even with overflow constrain" ++) ++assert.throws( ++ RangeError, ++ () => cal.monthDayFromFields({ year: 2021, month: 0, day: 1 }, opt), ++ "month zero is out of range even with overflow constrain" ++) ++ ++result = cal.monthDayFromFields({ year: 2021, month: 13, day: 1 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M12", 1, "month 13 is constrained to 12"); ++result = cal.monthDayFromFields({ year: 2021, month: 999999, day: 500 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M12", 31, "month 999999 is constrained to 12 and day constrained to 31"); ++ ++result = cal.monthDayFromFields({ monthCode: "M01", day: 133 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M01", 31, "day is constrained to 31 in monthCode M01"); ++result = cal.monthDayFromFields({ monthCode: "M02", day: 133 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M02", 29, "day is constrained to 29 in monthCode M02"); ++result = cal.monthDayFromFields({ monthCode: "M03", day: 9033 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M03", 31, "day is constrained to 31 in monthCode M03"); ++result = cal.monthDayFromFields({ monthCode: "M04", day: 50 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M04", 30, "day is constrained to 30 in monthCode M04"); ++result = cal.monthDayFromFields({ monthCode: "M05", day: 77 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M05", 31, "day is constrained to 31 in monthCode M05"); ++result = cal.monthDayFromFields({ monthCode: "M06", day: 33 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M06", 30, "day is constrained to 30 in monthCode M06"); ++result = cal.monthDayFromFields({ monthCode: "M07", day: 33 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M07", 31, "day is constrained to 31 in monthCode M07"); ++result = cal.monthDayFromFields({ monthCode: "M08", day: 300 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M08", 31, "day is constrained to 31 in monthCode M08"); ++result = cal.monthDayFromFields({ monthCode: "M09", day: 400 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M09", 30, "day is constrained to 30 in monthCode M09"); ++result = cal.monthDayFromFields({ monthCode: "M10", day: 400 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M10", 31, "day is constrained to 31 in monthCode M10"); ++result = cal.monthDayFromFields({ monthCode: "M11", day: 400 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M11", 30, "day is constrained to 30 in monthCode M11"); ++result = cal.monthDayFromFields({ monthCode: "M12", day: 500 }, opt); ++TemporalHelpers.assertPlainMonthDay(result, "M12", 31, "day is constrained to 31 in monthCode M12"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-invalid-string.js +index 2e87dc1a67aa942c3ddc8758e26bd8e326bcfb8b..6844c7e3d2bbbd40a5c0bddb6763dfc69b101726 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-invalid-string.js +@@ -17,4 +17,11 @@ features: [Temporal] + ---*/ + + const calendar = new Temporal.Calendar("iso8601"); +-assert.throws(RangeError, () => calendar.monthDayFromFields({ year: 2000, month: 5, day: 2 }, { overflow: "other string" })); ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => calendar.monthDayFromFields({ year: 2000, month: 5, day: 2 }, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-reject.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-reject.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5db608b3359bab403ded023022d9d5ce3116ee91 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/overflow-reject.js +@@ -0,0 +1,64 @@ ++// 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.calendar.prototype.monthdayfromfields ++description: Throw RangeError for input data out of range with overflow reject ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. If Type(fields) is not Object, throw a TypeError exception. ++ 5. Set options to ? GetOptionsObject(options). ++ 6. Let result be ? ISOMonthDayFromFields(fields, options). ++ 7. Return ? CreateTemporalMonthDay(result.[[Month]], result.[[Day]], calendar, result.[[ReferenceISOYear]]). ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++[-1, 0, 13, 9995].forEach((month) => { ++ assert.throws( ++ RangeError, ++ () => cal.monthDayFromFields({year: 2021, month, day: 5}, { overflow: "reject" }), ++ `Month ${month} is out of range for 2021 with overflow: reject` ++ ); ++}); ++ ++[-1, 0, 32, 999].forEach((day) => { ++ assert.throws( ++ RangeError, ++ () => cal.monthDayFromFields({ year: 2021, month: 12, day }, { overflow: "reject" }), ++ `Day ${day} is out of range for 2021-12 with overflow: reject` ++ ); ++ assert.throws( ++ RangeError, ++ () => cal.monthDayFromFields({ monthCode: "M12", day }, { overflow: "reject" }), ++ `Day ${day} is out of range for 2021-M12 with overflow: reject` ++ ); ++}); ++ ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M01", day: 32 }, { overflow: "reject" }), "Day 32 is out of range for monthCode M01"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M02", day: 30 }, { overflow: "reject" }), "Day 30 is out of range for monthCode M02"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M03", day: 32 }, { overflow: "reject" }), "Day 32 is out of range for monthCode M03"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M04", day: 31 }, { overflow: "reject" }), "Day 31 is out of range for monthCode M04"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M05", day: 32 }, { overflow: "reject" }), "Day 32 is out of range for monthCode M05"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M06", day: 31 }, { overflow: "reject" }), "Day 31 is out of range for monthCode M06"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M07", day: 32 }, { overflow: "reject" }), "Day 32 is out of range for monthCode M07"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M08", day: 32 }, { overflow: "reject" }), "Day 32 is out of range for monthCode M08"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M09", day: 31 }, { overflow: "reject" }), "Day 31 is out of range for monthCode M09"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M10", day: 32 }, { overflow: "reject" }), "Day 32 is out of range for monthCode M10"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M11", day: 31 }, { overflow: "reject" }), "Day 31 is out of range for monthCode M11"); ++assert.throws(RangeError, () => cal.monthDayFromFields( ++ { monthCode: "M12", day: 32 }, { overflow: "reject" }), "Day 32 is out of range for monthCode M12"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/reference-year-1972.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/reference-year-1972.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e0b942007d6efd2896fefb3b546f46b628441ac4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthDayFromFields/reference-year-1972.js +@@ -0,0 +1,23 @@ ++// 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.calendar.prototype.monthdayfromfields ++description: Use a leap year as the reference year if monthCode is given ++info: | ++ sec-temporal-isomonthdayfromfields: ++ 12. If _monthCode_ is *undefined*, then ++ a. Let _result_ be ? RegulateISODate(_year_, _month_, _day_, _overflow_). ++ 13. Else, ++ a. Let _result_ be ? RegulateISODate(_referenceISOYear_, _month_, _day_, _overflow_). ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++let result = cal.monthDayFromFields({ year: 2021, monthCode: "M02", day: 29 }); ++TemporalHelpers.assertPlainMonthDay(result, "M02", 29, "year is ignored and reference year should be a leap year if monthCode is given"); ++ ++result = cal.monthDayFromFields({ year: 2021, month: 2, day: 29 }, { overflow: "constrain" }); ++TemporalHelpers.assertPlainMonthDay(result, "M02", 28, "year should not be ignored if monthCode is not given"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9e2513cc767316378df15ebc473171065214ae11 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.monthsinyear ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.monthsInYear(arg); ++assert.sameValue(result, 12, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.monthsInYear(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..001b3cde215adedf5265f4b79eac9ec38aa1208b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.monthsinyear ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.monthsInYear(arg); ++assert.sameValue( ++ result1, ++ 12, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.monthsInYear(arg); ++assert.sameValue( ++ result2, ++ 12, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b2ce9cd8d5604750977f3e9e687457b695b9ae04 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.monthsinyear ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.monthsInYear(arg); ++assert.sameValue(result1, 12, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.monthsInYear(arg); ++assert.sameValue(result2, 12, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.monthsInYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.monthsInYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..00d73115d29d823b53c00adcdf9ac93ca016f431 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.monthsinyear ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.monthsInYear(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.monthsInYear(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.monthsInYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.monthsInYear(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.monthsInYear(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1d4af99f7ba72b6c5a7b652334ed30bcabe0c35e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.monthsinyear ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.monthsInYear(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..811a6e00cb30deadd50277426f5c9767268c3f0c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.monthsinyear ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.monthsInYear(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9a8748d8771030167f4c3fa9c7f45605c814bb68 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-string.js +@@ -0,0 +1,18 @@ ++// 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.calendar.prototype.monthsinyear ++description: An ISO 8601 date string should be converted as input ++info: | ++ a. Perform ? ToTemporalDate(temporalDateLike). ++ 5. Return 12𝔽. ++features: [Temporal] ++---*/ ++ ++let cal = new Temporal.Calendar("iso8601"); ++ ++assert.sameValue(cal.monthsInYear("3456-12-20"), 12); ++assert.sameValue(cal.monthsInYear("+000998-01-28"), 12); ++assert.sameValue(cal.monthsInYear("3456-12-20T03:04:05+00:00[UTC]"), 12); ++assert.sameValue(cal.monthsInYear("+000998-01-28T03:04:05+00:00[UTC]"), 12); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..827b460413bc5935a28dc6f6ef7cd921383531f1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.monthsinyear ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.monthsInYear(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.monthsInYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/basic.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/basic.js +index fcf4e35084ad90d83734bd6708188b357a230faf..9edcee174571b4e54af32ea4e1a94354eeaab987 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/basic.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/basic.js +@@ -9,9 +9,9 @@ features: [Temporal] + + const iso = Temporal.Calendar.from("iso8601"); + const res = 12; +-assert.sameValue(iso.monthsInYear(Temporal.PlainDate.from("1994-11-05")), res, "PlainDate"); +-assert.sameValue(iso.monthsInYear(Temporal.PlainDateTime.from("1994-11-05T08:15:30")), res, "PlainDateTime"); +-assert.sameValue(iso.monthsInYear(Temporal.PlainYearMonth.from("1994-11")), res, "PlainYearMonth"); ++assert.sameValue(iso.monthsInYear(new Temporal.PlainDate(1994, 11, 5)), res, "PlainDate"); ++assert.sameValue(iso.monthsInYear(new Temporal.PlainDateTime(1994, 11, 5, 8, 15, 30)), res, "PlainDateTime"); ++assert.sameValue(iso.monthsInYear(new Temporal.PlainYearMonth(1994, 11)), res, "PlainYearMonth"); + assert.sameValue(iso.monthsInYear({ year: 1994, month: 11, day: 5 }), res, "property bag"); + assert.sameValue(iso.monthsInYear("1994-11-05"), res, "string"); + assert.throws(TypeError, () => iso.monthsInYear({ year: 2000 }), "property bag with missing properties"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js +index e86c5f50e222e21ac18c0958342b2d036d2ffaf8..4d16a00078628d1cbd0e7463d5628f4adc8f0422 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/branding.js +@@ -11,12 +11,14 @@ const monthsInYear = Temporal.Calendar.prototype.monthsInYear; + + assert.sameValue(typeof monthsInYear, "function"); + +-assert.throws(TypeError, () => monthsInYear.call(undefined), "undefined"); +-assert.throws(TypeError, () => monthsInYear.call(null), "null"); +-assert.throws(TypeError, () => monthsInYear.call(true), "true"); +-assert.throws(TypeError, () => monthsInYear.call(""), "empty string"); +-assert.throws(TypeError, () => monthsInYear.call(Symbol()), "symbol"); +-assert.throws(TypeError, () => monthsInYear.call(1), "1"); +-assert.throws(TypeError, () => monthsInYear.call({}), "plain object"); +-assert.throws(TypeError, () => monthsInYear.call(Temporal.Calendar), "Temporal.Calendar"); +-assert.throws(TypeError, () => monthsInYear.call(Temporal.Calendar.prototype), "Temporal.Calendar.prototype"); ++const arg = new Temporal.PlainDate(2021, 3, 4); ++ ++assert.throws(TypeError, () => monthsInYear.call(undefined, arg), "undefined"); ++assert.throws(TypeError, () => monthsInYear.call(null, arg), "null"); ++assert.throws(TypeError, () => monthsInYear.call(true, arg), "true"); ++assert.throws(TypeError, () => monthsInYear.call("", arg), "empty string"); ++assert.throws(TypeError, () => monthsInYear.call(Symbol(), arg), "symbol"); ++assert.throws(TypeError, () => monthsInYear.call(1, arg), "1"); ++assert.throws(TypeError, () => monthsInYear.call({}, arg), "plain object"); ++assert.throws(TypeError, () => monthsInYear.call(Temporal.Calendar, arg), "Temporal.Calendar"); ++assert.throws(TypeError, () => monthsInYear.call(Temporal.Calendar.prototype, arg), "Temporal.Calendar.prototype"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..838aff96f6fac3156597630816f3b8fe62bb6854 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.monthsinyear ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.monthsInYear({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7a80b2990e80469699c0c01278f8e7ce3fd1bf25 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.monthsinyear ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.monthsInYear(arg); ++assert.sameValue( ++ result1, ++ 12, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.monthsInYear(arg); ++assert.sameValue( ++ result2, ++ 12, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/year-zero.js +index 0451a6655996c1fc87752b189123fe2653884faa..6e3e0b960e5a300de356056bb66e96a98138d379 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/monthsInYear/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.monthsInYear(arg); }, ++ () => instance.monthsInYear(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d0259e9038c2645fd813f49d77ce80cb04ecd77a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.weekofyear ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.weekOfYear(arg); ++assert.sameValue(result, 47, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.weekOfYear(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindate.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindate.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5f9f4da0d499d9963b4ffe718c054468a478deab +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindate.js +@@ -0,0 +1,76 @@ ++// 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.calendar.prototype.weekofyear ++description: > ++ Temporal.Calendar.prototype.weekOfYear will take Temporal.PlainDate object ++ and return the week of year of that date. ++info: | ++ 4. Let temporalDate be ? ToTemporalDate(temporalDateLike). ++ 5. Return 𝔽(! ToISOWeekOfYear(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]])). ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++// The following week numbers are taken from the table "Examples of contemporary ++// dates around New Year's Day" from ++// https://en.wikipedia.org/wiki/ISO_week_date#Relation_with_the_Gregorian_calendar ++ ++let d = new Temporal.PlainDate(1977, 1, 1); ++assert.sameValue(cal.weekOfYear(d), 53, "1977-01-01 is in w53"); ++ ++d = new Temporal.PlainDate(1977, 1, 2); ++assert.sameValue(cal.weekOfYear(d), 53, "1977-01-02 is in w53"); ++ ++d = new Temporal.PlainDate(1977, 12, 31); ++assert.sameValue(cal.weekOfYear(d), 52, "1977-12-31 is in w52"); ++ ++d = new Temporal.PlainDate(1978, 1, 1); ++assert.sameValue(cal.weekOfYear(d), 52, "1978-01-01 is in w52"); ++ ++d = new Temporal.PlainDate(1978, 1, 2); ++assert.sameValue(cal.weekOfYear(d), 1, "1978-01-02 is in w01"); ++ ++d = new Temporal.PlainDate(1978, 12, 31); ++assert.sameValue(cal.weekOfYear(d), 52, "1978-12-31 is in w52"); ++ ++d = new Temporal.PlainDate(1979, 1, 1); ++assert.sameValue(cal.weekOfYear(d), 1, "1979-01-01 is in w01"); ++ ++d = new Temporal.PlainDate(1979, 12, 30); ++assert.sameValue(cal.weekOfYear(d), 52, "1979-12-30 is in w52"); ++ ++d = new Temporal.PlainDate(1979, 12, 31); ++assert.sameValue(cal.weekOfYear(d), 1, "1979-12-31 is in w01"); ++ ++d = new Temporal.PlainDate(1980, 1, 1); ++assert.sameValue(cal.weekOfYear(d), 1, "1980-01-01 is in w01"); ++ ++d = new Temporal.PlainDate(1980, 12, 28); ++assert.sameValue(cal.weekOfYear(d), 52, "1980-12-28 is in w52"); ++ ++d = new Temporal.PlainDate(1980, 12, 29); ++assert.sameValue(cal.weekOfYear(d), 1, "1980-12-29 is in w01"); ++ ++d = new Temporal.PlainDate(1980, 12, 30); ++assert.sameValue(cal.weekOfYear(d), 1, "1980-12-30 is in w01"); ++ ++d = new Temporal.PlainDate(1980, 12, 31); ++assert.sameValue(cal.weekOfYear(d), 1, "1980-12-31 is in w01"); ++ ++d = new Temporal.PlainDate(1981, 1, 1); ++assert.sameValue(cal.weekOfYear(d), 1, "1981-01-01 is in w01"); ++ ++d = new Temporal.PlainDate(1981, 12, 31); ++assert.sameValue(cal.weekOfYear(d), 53, "1981-12-31 is in w53"); ++ ++d = new Temporal.PlainDate(1982, 1, 1); ++assert.sameValue(cal.weekOfYear(d), 53, "1982-01-01 is in w53"); ++ ++d = new Temporal.PlainDate(1982, 1, 2); ++assert.sameValue(cal.weekOfYear(d), 53, "1982-01-02 is in w53"); ++ ++d = new Temporal.PlainDate(1982, 1, 3); ++assert.sameValue(cal.weekOfYear(d), 53, "1982-01-03 is in w53"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindatetime.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindatetime.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e7546bb71195159e41ed5dd3239251625afc4f3d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-plaindatetime.js +@@ -0,0 +1,76 @@ ++// 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.calendar.prototype.weekofyear ++description: > ++ Temporal.Calendar.prototype.weekOfYear will take Temporal.PlainDateTime object ++ and return the week of year of that date. ++info: | ++ 4. Let temporalDate be ? ToTemporalDate(temporalDateLike). ++ 5. Return 𝔽(! ToISOWeekOfYear(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]])). ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++// The following week numbers are taken from the table "Examples of contemporary ++// dates around New Year's Day" from ++// https://en.wikipedia.org/wiki/ISO_week_date#Relation_with_the_Gregorian_calendar ++ ++let dt = new Temporal.PlainDateTime(1977, 1, 1, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 53, "1977-01-01 is in w53"); ++ ++dt = new Temporal.PlainDateTime(1977, 1, 2, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 53, "1977-01-02 is in w53"); ++ ++dt = new Temporal.PlainDateTime(1977, 12, 31, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 52, "1977-12-31 is in w52"); ++ ++dt = new Temporal.PlainDateTime(1978, 1, 1, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 52, "1978-01-01 is in w52"); ++ ++dt = new Temporal.PlainDateTime(1978, 1, 2, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 1, "1978-01-02 is in w01"); ++ ++dt = new Temporal.PlainDateTime(1978, 12, 31, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 52, "1978-12-31 is in w52"); ++ ++dt = new Temporal.PlainDateTime(1979, 1, 1, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 1, "1979-01-01 is in w01"); ++ ++dt = new Temporal.PlainDateTime(1979, 12, 30, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 52, "1979-12-30 is in w52"); ++ ++dt = new Temporal.PlainDateTime(1979, 12, 31, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 1, "1979-12-31 is in w01"); ++ ++dt = new Temporal.PlainDateTime(1980, 1, 1, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 1, "1980-01-01 is in w01"); ++ ++dt = new Temporal.PlainDateTime(1980, 12, 28, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 52, "1980-12-28 is in w52"); ++ ++dt = new Temporal.PlainDateTime(1980, 12, 29, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 1, "1980-12-29 is in w01"); ++ ++dt = new Temporal.PlainDateTime(1980, 12, 30, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 1, "1980-12-30 is in w01"); ++ ++dt = new Temporal.PlainDateTime(1980, 12, 31, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 1, "1980-12-31 is in w01"); ++ ++dt = new Temporal.PlainDateTime(1981, 1, 1, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 1, "1981-01-01 is in w01"); ++ ++dt = new Temporal.PlainDateTime(1981, 12, 31, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 53, "1981-12-31 is in w53"); ++ ++dt = new Temporal.PlainDateTime(1982, 1, 1, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 53, "1982-01-01 is in w53"); ++ ++dt = new Temporal.PlainDateTime(1982, 1, 2, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 53, "1982-01-02 is in w53"); ++ ++dt = new Temporal.PlainDateTime(1982, 1, 3, 9, 8); ++assert.sameValue(cal.weekOfYear(dt), 53, "1982-01-03 is in w53"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ba100b2b8c59afbe43bf505787e392b1bad4c173 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.weekofyear ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.weekOfYear(arg); ++assert.sameValue( ++ result1, ++ 47, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.weekOfYear(arg); ++assert.sameValue( ++ result2, ++ 47, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cd5069188c7282c3130d54230e0baec8316c8d29 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.weekofyear ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.weekOfYear(arg); ++assert.sameValue(result1, 47, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.weekOfYear(arg); ++assert.sameValue(result2, 47, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.weekOfYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.weekOfYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7dbc1319376898535bfcc489984574a5ea0c1d18 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.weekofyear ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.weekOfYear(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.weekOfYear(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.weekOfYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.weekOfYear(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.weekOfYear(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5f8dcccc9867315ee6469aad187e0e2e0cda5686 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.weekofyear ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.weekOfYear(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7b8e721b7e366e3c1c4198057b195dcd289d71d9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.weekofyear ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.weekOfYear(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f031d0469001b36d893c4e6d0c44f0bdf8de3f25 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-string.js +@@ -0,0 +1,39 @@ ++// 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.calendar.prototype.weekofyear ++description: > ++ Temporal.Calendar.prototype.weekOfYear will take an ISO 8601 date string and ++ return the week of year of that date. ++info: | ++ 4. Let temporalDate be ? ToTemporalDate(temporalDateLike). ++ 5. Return 𝔽(! ToISOWeekOfYear(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]])). ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++// The following week numbers are taken from the table "Examples of contemporary ++// dates around New Year's Day" from ++// https://en.wikipedia.org/wiki/ISO_week_date#Relation_with_the_Gregorian_calendar ++ ++assert.sameValue(cal.weekOfYear("1977-01-01"), 53, "1977-01-01 is in w53"); ++assert.sameValue(cal.weekOfYear("1977-01-02"), 53, "1977-01-02 is in w53"); ++assert.sameValue(cal.weekOfYear("1977-12-31"), 52, "1977-12-31 is in w52"); ++assert.sameValue(cal.weekOfYear("1978-01-01"), 52, "1978-01-01 is in w52"); ++assert.sameValue(cal.weekOfYear("1978-01-02"), 1, "1978-01-02 is in w01"); ++assert.sameValue(cal.weekOfYear("1978-12-31"), 52, "1978-12-31 is in w52"); ++assert.sameValue(cal.weekOfYear("1979-01-01"), 1, "1979-01-01 is in w01"); ++assert.sameValue(cal.weekOfYear("1979-12-30"), 52, "1979-12-30 is in w52"); ++assert.sameValue(cal.weekOfYear("1979-12-31"), 1, "1979-12-31 is in w01"); ++assert.sameValue(cal.weekOfYear("1980-01-01"), 1, "1980-01-01 is in w01"); ++assert.sameValue(cal.weekOfYear("1980-12-28"), 52, "1980-12-28 is in w52"); ++assert.sameValue(cal.weekOfYear("1980-12-29"), 1, "1980-12-29 is in w01"); ++assert.sameValue(cal.weekOfYear("1980-12-30"), 1, "1980-12-30 is in w01"); ++assert.sameValue(cal.weekOfYear("1980-12-31"), 1, "1980-12-31 is in w01"); ++assert.sameValue(cal.weekOfYear("1981-01-01"), 1, "1981-01-01 is in w01"); ++assert.sameValue(cal.weekOfYear("1981-12-31"), 53, "1981-12-31 is in w53"); ++assert.sameValue(cal.weekOfYear("1982-01-01"), 53, "1982-01-01 is in w53"); ++assert.sameValue(cal.weekOfYear("1982-01-02"), 53, "1982-01-02 is in w53"); ++assert.sameValue(cal.weekOfYear("1982-01-03"), 53, "1982-01-03 is in w53"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a801e6aec598809f8e0aa813886c5c278bc8e6c9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.weekofyear ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.weekOfYear(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.weekOfYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js +index 82f80e27c74b1beda8dd0c3b63a93438c689cc66..d6b5a0f0cf12ff530e95ae51a924d7d931e07679 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/branding.js +@@ -11,12 +11,14 @@ const weekOfYear = Temporal.Calendar.prototype.weekOfYear; + + assert.sameValue(typeof weekOfYear, "function"); + +-assert.throws(TypeError, () => weekOfYear.call(undefined), "undefined"); +-assert.throws(TypeError, () => weekOfYear.call(null), "null"); +-assert.throws(TypeError, () => weekOfYear.call(true), "true"); +-assert.throws(TypeError, () => weekOfYear.call(""), "empty string"); +-assert.throws(TypeError, () => weekOfYear.call(Symbol()), "symbol"); +-assert.throws(TypeError, () => weekOfYear.call(1), "1"); +-assert.throws(TypeError, () => weekOfYear.call({}), "plain object"); +-assert.throws(TypeError, () => weekOfYear.call(Temporal.Calendar), "Temporal.Calendar"); +-assert.throws(TypeError, () => weekOfYear.call(Temporal.Calendar.prototype), "Temporal.Calendar.prototype"); ++const arg = new Temporal.PlainDate(2021, 7, 20); ++ ++assert.throws(TypeError, () => weekOfYear.call(undefined, arg), "undefined"); ++assert.throws(TypeError, () => weekOfYear.call(null, arg), "null"); ++assert.throws(TypeError, () => weekOfYear.call(true, arg), "true"); ++assert.throws(TypeError, () => weekOfYear.call("", arg), "empty string"); ++assert.throws(TypeError, () => weekOfYear.call(Symbol(), arg), "symbol"); ++assert.throws(TypeError, () => weekOfYear.call(1, arg), "1"); ++assert.throws(TypeError, () => weekOfYear.call({}, arg), "plain object"); ++assert.throws(TypeError, () => weekOfYear.call(Temporal.Calendar, arg), "Temporal.Calendar"); ++assert.throws(TypeError, () => weekOfYear.call(Temporal.Calendar.prototype, arg), "Temporal.Calendar.prototype"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c75c1d52145411548b0e07a598f22cda77e2f60d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.weekofyear ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.weekOfYear({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6d9e9695245f5f6a7c80bbb69d2dfcdb44d1ef76 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.weekofyear ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.weekOfYear(arg); ++assert.sameValue( ++ result1, ++ 52, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.weekOfYear(arg); ++assert.sameValue( ++ result2, ++ 52, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/year-zero.js +index 44eeabb321835c65787bd3cb313c17df2c917bd7..0a2cdc66e2787a70e1479b135cce4e6654548672 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/weekOfYear/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.weekOfYear(arg); }, ++ () => instance.weekOfYear(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..212c2ac82e56155c9ebcb9dd5e3274e6c27c86a2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.year ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.year(arg); ++assert.sameValue(result, 1976, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.year(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d821211c537d2f3890ff61c72a574c853fc2d3b3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.year ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.year(arg); ++assert.sameValue( ++ result1, ++ 1976, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.year(arg); ++assert.sameValue( ++ result2, ++ 1976, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3030c5ed268c520040c65794115fa66d947bdba1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.year ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.year(arg); ++assert.sameValue(result1, 1976, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.year(arg); ++assert.sameValue(result2, 1976, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.year(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.year(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b3cec2bd4da35bdb93ce43ec29432ccafa603ba7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.year ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.year(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.year(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.year(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.year(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.year(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6f68cf3e847aca14528c4df7028cee88bb7f8780 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.year ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.year(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e186a2321f8cb2e241e20460ee7cc7d4ab66d27c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.year ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.year(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3ffcb6becc3745adfec4f3fa80a08b07d7d493d2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.year ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.year(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.year(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..31549636a4459ce9d94a3b17410c9ce4a2514025 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.year ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.year({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7520460dedb610193188070e990115f2ac3ccb1e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.year ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.year(arg); ++assert.sameValue( ++ result1, ++ 2016, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.year(arg); ++assert.sameValue( ++ result2, ++ 2016, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/year-zero.js +index 6221b7db9258da9f2c59966e849dde232a8b9b72..dc7f72566aede65498ea18b44202270728ca8f54 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/year/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.year(arg); }, ++ () => instance.year(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/basic.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2624bc7b651cf2b31a17aa33dda738fd614cb151 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/basic.js +@@ -0,0 +1,40 @@ ++// 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.calendar.prototype.yearmonthfromfields ++description: Temporal.Calendar.prototype.yearMonthFromFields return correctly with valid data. ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. If Type(fields) is not Object, throw a TypeError exception. ++ 5. Set options to ? GetOptionsObject(options). ++ 6. Let result be ? ISOYearMonthFromFields(fields, options). ++ 7. Return ? CreateTemporalYearMonth(result.[[Year]], result.[[Month]], calendar, result.[[ReferenceISODay]]). ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601") ++ ++let result = cal.yearMonthFromFields({ year: 2021, month: 7 }); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 7, "M07", "year 2021, month 7"); ++result = cal.yearMonthFromFields({ year: 2021, month: 12 }); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 12, "M12", "year 2021, month 12"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M07" }); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 7, "M07", "year 2021, monthCode M07"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M12" }); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 12, "M12", "year 2021, monthCode M12"); ++ ++["constrain", "reject"].forEach((overflow) => { ++ const opt = { overflow }; ++ result = cal.yearMonthFromFields({ year: 2021, month: 7 }, opt); ++ TemporalHelpers.assertPlainYearMonth(result, 2021, 7, "M07", `year 2021, month 7, overflow ${overflow}`); ++ result = cal.yearMonthFromFields({ year: 2021, month: 12 }, opt); ++ TemporalHelpers.assertPlainYearMonth(result, 2021, 12, "M12", `year 2021, month 12, overflow ${overflow}`); ++ result = cal.yearMonthFromFields({ year: 2021, monthCode: "M07" }, opt); ++ TemporalHelpers.assertPlainYearMonth(result, 2021, 7, "M07", `year 2021, monthCode M07, overflow ${overflow}`); ++ result = cal.yearMonthFromFields({ year: 2021, monthCode: "M12" }, opt); ++ TemporalHelpers.assertPlainYearMonth(result, 2021, 12, "M12", `year 2021, monthCode M12, overflow ${overflow}`); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js +index 0839394ca968abefa2b61adcab981d1b6ae330b6..7212b7f1d6cdd4addc2ba1eac348d8496a57dd99 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/branding.js +@@ -11,12 +11,14 @@ const yearMonthFromFields = Temporal.Calendar.prototype.yearMonthFromFields; + + assert.sameValue(typeof yearMonthFromFields, "function"); + +-assert.throws(TypeError, () => yearMonthFromFields.call(undefined), "undefined"); +-assert.throws(TypeError, () => yearMonthFromFields.call(null), "null"); +-assert.throws(TypeError, () => yearMonthFromFields.call(true), "true"); +-assert.throws(TypeError, () => yearMonthFromFields.call(""), "empty string"); +-assert.throws(TypeError, () => yearMonthFromFields.call(Symbol()), "symbol"); +-assert.throws(TypeError, () => yearMonthFromFields.call(1), "1"); +-assert.throws(TypeError, () => yearMonthFromFields.call({}), "plain object"); +-assert.throws(TypeError, () => yearMonthFromFields.call(Temporal.Calendar), "Temporal.Calendar"); +-assert.throws(TypeError, () => yearMonthFromFields.call(Temporal.Calendar.prototype), "Temporal.Calendar.prototype"); ++const arg = { year: 2021, month: 1 }; ++ ++assert.throws(TypeError, () => yearMonthFromFields.call(undefined, arg), "undefined"); ++assert.throws(TypeError, () => yearMonthFromFields.call(null, arg), "null"); ++assert.throws(TypeError, () => yearMonthFromFields.call(true, arg), "true"); ++assert.throws(TypeError, () => yearMonthFromFields.call("", arg), "empty string"); ++assert.throws(TypeError, () => yearMonthFromFields.call(Symbol(), arg), "symbol"); ++assert.throws(TypeError, () => yearMonthFromFields.call(1, arg), "1"); ++assert.throws(TypeError, () => yearMonthFromFields.call({}, arg), "plain object"); ++assert.throws(TypeError, () => yearMonthFromFields.call(Temporal.Calendar, arg), "Temporal.Calendar"); ++assert.throws(TypeError, () => yearMonthFromFields.call(Temporal.Calendar.prototype, arg), "Temporal.Calendar.prototype"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-missing-properties.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-missing-properties.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c63d8f39e6c2245e1032a79ab7d3b8e49f05046d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-missing-properties.js +@@ -0,0 +1,22 @@ ++// 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.calendar.prototype.yearmonthfromfields ++description: Temporal.Calendar.prototype.yearMonthFromFields will throw TypeError with incorrect input data type. ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. If Type(fields) is not Object, throw a TypeError exception. ++ 5. Set options to ? GetOptionsObject(options). ++ 6. Let result be ? ISOYearMonthFromFields(fields, options). ++ 7. Return ? CreateTemporalYearMonth(result.[[Year]], result.[[Month]], calendar, result.[[ReferenceISODay]]). ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601") ++ ++assert.throws(TypeError, () => cal.yearMonthFromFields({}), "at least one correctly spelled property is required"); ++assert.throws(TypeError, () => cal.yearMonthFromFields({ month: 1 }), "year is required"); ++assert.throws(TypeError, () => cal.yearMonthFromFields({ year: 2021 }), "month or monthCode is required"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-not-object.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-not-object.js +index 7969ba6e441a4ee5de2b038891b4bdcb3d061109..e04972b2dde939977df9e05ec215e7068cb6b1d6 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-not-object.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/fields-not-object.js +@@ -7,7 +7,7 @@ description: Throw a TypeError if the fields is not an object + features: [Symbol, Temporal] + ---*/ + +-const tests = [undefined, null, false, "string", Symbol("sym"), Math.PI, 42n]; ++const tests = [undefined, null, true, false, "string", Symbol("sym"), Math.PI, Infinity, NaN, 42n]; + const iso = Temporal.Calendar.from("iso8601"); + for (const fields of tests) { + assert.throws(TypeError, () => iso.yearMonthFromFields(fields, {})); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/monthcode-invalid.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/monthcode-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0b01bf85a751e09460154b9292fd169a6293f53a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/monthcode-invalid.js +@@ -0,0 +1,31 @@ ++// 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.calendar.prototype.yearmonthfromfields ++description: Throw RangeError for an out-of-range, conflicting, or ill-formed monthCode ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. If Type(fields) is not Object, throw a TypeError exception. ++ 5. Set options to ? GetOptionsObject(options). ++ 6. Let result be ? ISOYearMonthFromFields(fields, options). ++ 7. Return ? CreateTemporalYearMonth(result.[[Year]], result.[[Month]], calendar, result.[[ReferenceISODay]]). ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++["m1", "M1", "m01"].forEach((monthCode) => { ++ assert.throws(RangeError, () => cal.yearMonthFromFields({ year: 2021, monthCode }), ++ `monthCode '${monthCode}' is not well-formed`); ++}); ++ ++assert.throws(RangeError, () => cal.yearMonthFromFields({ year: 2021, month: 12, monthCode: "M11" }), ++ "monthCode and month conflict"); ++ ++["M00", "M19", "M99", "M13"].forEach((monthCode) => { ++ assert.throws(RangeError, () => cal.yearMonthFromFields({ year: 2021, monthCode }), ++ `monthCode '${monthCode}' is not valid for year 2021`); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-not-object.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-not-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0246e70bbcc5627dae60df92d0f0ca0c8e7679f7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-not-object.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.calendar.prototype.yearmonthfromfields ++description: Throw a TypeError if options is not an object or undefined ++info: | ++ 5. Set options to ? GetOptionsObject(options). ++features: [Symbol, Temporal] ++---*/ ++ ++const tests = [null, true, false, "string", Symbol("sym"), Math.PI, Infinity, NaN, 42n]; ++const iso = new Temporal.Calendar("iso8601"); ++for (const options of tests) { ++ assert.throws(TypeError, () => iso.yearMonthFromFields({ year: 2021, month: 7 }, options), ++ "options is not object"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..625fcec62a5ec29cdb922bcea4c795dfaa6a45eb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.calendar.prototype.yearmonthfromfields ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Calendar("iso8601"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.yearMonthFromFields({ year: 2000, monthCode: "M05" }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-constrain.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-constrain.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6384d42a2851eba0ac4509154aef8fedcdf0df37 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-constrain.js +@@ -0,0 +1,91 @@ ++// 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.calendar.prototype.yearmonthfromfields ++description: Temporal.Calendar.prototype.yearMonthFromFields will return correctly with data and overflow set to 'constrain'. ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. If Type(fields) is not Object, throw a TypeError exception. ++ 5. Set options to ? GetOptionsObject(options). ++ 6. Let result be ? ISOYearMonthFromFields(fields, options). ++ 7. Return ? CreateTemporalYearMonth(result.[[Year]], result.[[Month]], calendar, result.[[ReferenceISODay]]). ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601") ++const opt = { overflow: "constrain" }; ++ ++let result = cal.yearMonthFromFields({ year: 2021, month: 1 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 1, "M01", "month 1 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 2 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 2, "M02", "month 2 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 3 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 3, "M03", "month 3 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 4 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 4, "M04", "month 4 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 5 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 5, "M05", "month 5 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 6 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 6, "M06", "month 6 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 7 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 7, "M07", "month 7 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 8 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 8, "M08", "month 8 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 9 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 9, "M09", "month 9 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 10 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 10, "M10", "month 10 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 11 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 11, "M11", "month 11 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, month: 12 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 12, "M12", "month 12 with overflow constrain"); ++ ++assert.throws( ++ RangeError, ++ () => cal.yearMonthFromFields({ year: 2021, month: -99999 }, opt), ++ "negative month -99999 is out of range even with overflow constrain" ++) ++assert.throws( ++ RangeError, ++ () => cal.yearMonthFromFields({ year: 2021, month: -1 }, opt), ++ "negative month -1 is out of range even with overflow constrain" ++) ++assert.throws( ++ RangeError, ++ () => cal.yearMonthFromFields({ year: 2021, month: 0 }, opt), ++ "month zero is out of range even with overflow constrain" ++) ++ ++result = cal.yearMonthFromFields({ year: 2021, month: 13 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 12, "M12", "month 13 is constrained to 12"); ++result = cal.yearMonthFromFields({ year: 2021, month: 99999 }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 12, "M12", "month 99999 is constrained to 12"); ++ ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M01" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 1, "M01", "monthCode M01 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M02" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 2, "M02", "monthCode M02 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M03" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 3, "M03", "monthCode M03 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M04" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 4, "M04", "monthCode M04 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M05" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 5, "M05", "monthCode M05 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M06" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 6, "M06", "monthCode M06 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M07" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 7, "M07", "monthCode M07 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M08" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 8, "M08", "monthCode M08 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M09" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 9, "M09", "monthCode M09 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M10" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 10, "M10", "monthCode M10 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M11" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 11, "M11", "monthCode M11 with overflow constrain"); ++result = cal.yearMonthFromFields({ year: 2021, monthCode: "M12" }, opt); ++TemporalHelpers.assertPlainYearMonth(result, 2021, 12, "M12", "monthCode M12 with overflow constrain"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-invalid-string.js +index 99ffe6af27760a798bc1903e5288c5008611304a..77c1414109779cef6c0d6cabf5c695b2a4bd444c 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-invalid-string.js +@@ -17,4 +17,11 @@ features: [Temporal] + ---*/ + + const calendar = new Temporal.Calendar("iso8601"); +-assert.throws(RangeError, () => calendar.yearMonthFromFields({ year: 2000, month: 5 }, { overflow: "other string" })); ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => calendar.yearMonthFromFields({ year: 2000, month: 5 }, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-reject.js b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-reject.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d0d475d9e7b0decdd6e4629943a70f3e71e2c78b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Calendar/prototype/yearMonthFromFields/overflow-reject.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.yearmonthfromfields ++description: Throw RangeError for input data out of range with overflow reject ++info: | ++ 1. Let calendar be the this value. ++ 2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]). ++ 3. Assert: calendar.[[Identifier]] is "iso8601". ++ 4. If Type(fields) is not Object, throw a TypeError exception. ++ 5. Set options to ? GetOptionsObject(options). ++ 6. Let result be ? ISOYearMonthFromFields(fields, options). ++ 7. Return ? CreateTemporalYearMonth(result.[[Year]], result.[[Month]], calendar, result.[[ReferenceISODay]]). ++features: [Temporal] ++---*/ ++ ++const cal = new Temporal.Calendar("iso8601"); ++ ++[-1, 0, 13, 9995].forEach((month) => { ++ assert.throws( ++ RangeError, ++ () => cal.yearMonthFromFields({year: 2021, month, day: 5}, { overflow: "reject" }), ++ `Month ${month} is out of range for 2021 with overflow: reject` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/basic.js b/JSTests/test262/test/built-ins/Temporal/Duration/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..69cea7447c232652c037bc61e8d1c027199f59d9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/basic.js +@@ -0,0 +1,16 @@ ++// 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.duration ++description: Basic constructor tests. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++TemporalHelpers.assertDuration(new Temporal.Duration(5, 5, 5, 5, 5, 5, 5, 5, 5, 0), ++ 5, 5, 5, 5, 5, 5, 5, 5, 5, 0, "positive"); ++TemporalHelpers.assertDuration(new Temporal.Duration(-5, -5, -5, -5, -5, -5, -5, -5, -5, 0), ++ -5, -5, -5, -5, -5, -5, -5, -5, -5, 0, "negative"); ++TemporalHelpers.assertDuration(new Temporal.Duration(-0, -0, -0, -0, -0, -0, -0, -0, -0, -0), ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "negative zero"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/call-builtin.js b/JSTests/test262/test/built-ins/Temporal/Duration/call-builtin.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1050ec967292afebf4adfce0dceae2af90c5459d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/call-builtin.js +@@ -0,0 +1,15 @@ ++// 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.duration ++description: Constructor should not call built-in functions. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++Number.isFinite = () => { throw new Test262Error("should not call Number.isFinite") }; ++Math.sign = () => { throw new Test262Error("should not call Math.sign") }; ++ ++const duration = new Temporal.Duration(1, 1); ++TemporalHelpers.assertDuration(duration, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/argument-cast.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/argument-cast.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5d2262bf0ee3fc8b2e018c218610319992eb830e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/argument-cast.js +@@ -0,0 +1,26 @@ ++// 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.duration.compare ++description: Strings and objects are supported arguments. ++features: [Temporal] ++---*/ ++ ++assert.sameValue(Temporal.Duration.compare("PT12H", new Temporal.Duration()), 1, ++ "first argument string"); ++assert.sameValue(Temporal.Duration.compare({ hours: 12 }, new Temporal.Duration()), 1, ++ "first argument object"); ++assert.throws(TypeError, () => Temporal.Duration.compare({ hour: 12 }, new Temporal.Duration()), ++ "first argument missing property"); ++ ++assert.sameValue(Temporal.Duration.compare(new Temporal.Duration(), "PT12H"), -1, ++ "second argument string"); ++assert.sameValue(Temporal.Duration.compare(new Temporal.Duration(), { hours: 12 }), -1, ++ "second argument object"); ++assert.throws(TypeError, () => Temporal.Duration.compare(new Temporal.Duration(), { hour: 12 }), ++ "second argument missing property"); ++ ++assert.sameValue(Temporal.Duration.compare({ hours: 12, minute: 5 }, { hours: 12, day: 5 }), 0, ++ "ignores incorrect properties"); ++ +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/basic.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bcc7fadfdd1d7c34c3387c517f56b8e5e9015e46 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/basic.js +@@ -0,0 +1,53 @@ ++// 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.duration.compare ++description: Basic comparisons. ++features: [Temporal] ++---*/ ++ ++const td1pos = new Temporal.Duration(0, 0, 0, 0, 5, 5, 5, 5, 5, 5); ++const td2pos = new Temporal.Duration(0, 0, 0, 0, 5, 4, 5, 5, 5, 5); ++const td1neg = new Temporal.Duration(0, 0, 0, 0, -5, -5, -5, -5, -5, -5); ++const td2neg = new Temporal.Duration(0, 0, 0, 0, -5, -4, -5, -5, -5, -5); ++assert.sameValue(Temporal.Duration.compare(td1pos, td1pos), 0, ++ "time units: equal"); ++assert.sameValue(Temporal.Duration.compare(td2pos, td1pos), -1, ++ "time units: smaller/larger"); ++assert.sameValue(Temporal.Duration.compare(td1pos, td2pos), 1, ++ "time units: larger/smaller"); ++assert.sameValue(Temporal.Duration.compare(td1neg, td1neg), 0, ++ "time units: negative/negative equal"); ++assert.sameValue(Temporal.Duration.compare(td2neg, td1neg), 1, ++ "time units: negative/negative smaller/larger"); ++assert.sameValue(Temporal.Duration.compare(td1neg, td2neg), -1, ++ "time units: negative/negative larger/smaller"); ++assert.sameValue(Temporal.Duration.compare(td1neg, td2pos), -1, ++ "time units: negative/positive"); ++assert.sameValue(Temporal.Duration.compare(td1pos, td2neg), 1, ++ "time units: positive/negative"); ++ ++const dd1pos = new Temporal.Duration(5, 5, 5, 5, 5, 5, 5, 5, 5, 5); ++const dd2pos = new Temporal.Duration(5, 5, 5, 5, 5, 4, 5, 5, 5, 5); ++const dd1neg = new Temporal.Duration(-5, -5, -5, -5, -5, -5, -5, -5, -5, -5); ++const dd2neg = new Temporal.Duration(-5, -5, -5, -5, -5, -4, -5, -5, -5, -5); ++const relativeTo = Temporal.PlainDate.from("2017-01-01"); ++assert.throws(RangeError, () => Temporal.Duration.compare(dd1pos, dd2pos), ++ "date units: relativeTo is required"); ++assert.sameValue(Temporal.Duration.compare(dd1pos, dd1pos, { relativeTo }), 0, ++ "date units: equal"); ++assert.sameValue(Temporal.Duration.compare(dd2pos, dd1pos, { relativeTo }), -1, ++ "date units: smaller/larger"); ++assert.sameValue(Temporal.Duration.compare(dd1pos, dd2pos, { relativeTo }), 1, ++ "date units: larger/smaller"); ++assert.sameValue(Temporal.Duration.compare(dd1neg, dd1neg, { relativeTo }), 0, ++ "date units: negative/negative equal"); ++assert.sameValue(Temporal.Duration.compare(dd2neg, dd1neg, { relativeTo }), 1, ++ "date units: negative/negative smaller/larger"); ++assert.sameValue(Temporal.Duration.compare(dd1neg, dd2neg, { relativeTo }), -1, ++ "date units: negative/negative larger/smaller"); ++assert.sameValue(Temporal.Duration.compare(dd1neg, dd2pos, { relativeTo }), -1, ++ "date units: negative/positive"); ++assert.sameValue(Temporal.Duration.compare(dd1pos, dd2neg, { relativeTo }), 1, ++ "date units: positive/negative"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/calendar-dateadd-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/calendar-dateadd-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c2169e338a3fa941e205e94f08a259cd0b38fe6e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/calendar-dateadd-called-with-options-undefined.js +@@ -0,0 +1,22 @@ ++// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-temporal.duration.compare ++description: > ++ BuiltinTimeZoneGetInstantFor calls Calendar.dateAdd with undefined as the ++ options value ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarDateAddUndefinedOptions(); ++const timeZone = TemporalHelpers.oneShiftTimeZone(new Temporal.Instant(0n), 3600e9); ++const relativeTo = new Temporal.ZonedDateTime(0n, timeZone, calendar); ++ ++const duration1 = new Temporal.Duration(0, 0, 1); ++const duration2 = new Temporal.Duration(0, 0, 1); ++Temporal.Duration.compare(duration1, duration2, { relativeTo }); ++assert.sameValue(calendar.dateAddCallCount, 4); ++// one call in CalculateOffsetShift for each duration argument, plus one in ++// UnbalanceDurationRelative for each duration argument +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..427dd9fee8c5a70f91977e794a4e5275b4476140 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/options-wrong-type.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.duration.compare ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++for (const value of badOptions) { ++ assert.throws(TypeError, () => Temporal.Duration.compare({ hours: 1 }, { minutes: 60 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-hour.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-hour.js +new file mode 100644 +index 0000000000000000000000000000000000000000..876d865cdf56d5d103da6780a29341a501f47ea4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-hour.js +@@ -0,0 +1,41 @@ ++// 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.duration.compare ++description: relativeTo with hours. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const oneDay = new Temporal.Duration(0, 0, 0, 1); ++const hours24 = new Temporal.Duration(0, 0, 0, 0, 24); ++assert.sameValue(Temporal.Duration.compare(oneDay, hours24), ++ 0, ++ "relativeTo not required for days"); ++assert.sameValue( ++ Temporal.Duration.compare(oneDay, hours24, { relativeTo: Temporal.PlainDate.from("2017-01-01") }), ++ 0, ++ "relativeTo does not affect days if PlainDate"); ++assert.sameValue(Temporal.Duration.compare(oneDay, hours24, { relativeTo: "2019-11-03" }), ++ 0, ++ "casts relativeTo to PlainDate from string"); ++assert.sameValue(Temporal.Duration.compare(oneDay, hours24, { relativeTo: { year: 2019, month: 11, day: 3 } }), ++ 0, ++ "casts relativeTo to PlainDate from object"); ++ ++const timeZone = TemporalHelpers.springForwardFallBackTimeZone(); ++assert.sameValue( ++ Temporal.Duration.compare(oneDay, hours24, { relativeTo: new Temporal.ZonedDateTime(0n, timeZone) }), ++ 0, ++ 'relativeTo does not affect days if ZonedDateTime, and duration encompasses no DST change'); ++assert.sameValue( ++ Temporal.Duration.compare(oneDay, hours24, { relativeTo: new Temporal.ZonedDateTime(972802800_000_000_000n, timeZone) }), ++ 1, ++ 'relativeTo does affect days if ZonedDateTime, and duration encompasses DST change'); ++assert.sameValue( ++ Temporal.Duration.compare(oneDay, hours24, { ++ relativeTo: { year: 2000, month: 10, day: 29, timeZone } ++ }), ++ 1, ++ 'casts relativeTo to ZonedDateTime from object'); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-month.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-month.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cb0df5606d2332685bd489312d25efafe3fee422 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-month.js +@@ -0,0 +1,17 @@ ++// 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.duration.compare ++description: relativeTo with months. ++features: [Temporal] ++---*/ ++ ++const oneMonth = new Temporal.Duration(0, 1); ++const days30 = new Temporal.Duration(0, 0, 0, 30); ++assert.sameValue( ++ Temporal.Duration.compare(oneMonth, days30, { relativeTo: Temporal.PlainDate.from("2018-04-01") }), 0); ++assert.sameValue( ++ Temporal.Duration.compare(oneMonth, days30, { relativeTo: Temporal.PlainDate.from("2018-03-01") }), 1); ++assert.sameValue( ++ Temporal.Duration.compare(oneMonth, days30, { relativeTo: Temporal.PlainDate.from("2018-02-01") }), -1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-propertybag-invalid.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-propertybag-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0e940ade567b59807ab6c38a0a7c6882788da538 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-propertybag-invalid.js +@@ -0,0 +1,14 @@ ++// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-temporal.duration.compare ++description: Throws if a value in the relativeTo property bag is missing. ++features: [Temporal] ++---*/ ++ ++const oneDay = new Temporal.Duration(0, 0, 0, 1); ++const hours24 = new Temporal.Duration(0, 0, 0, 0, 24); ++assert.throws(TypeError, () => Temporal.Duration.compare(oneDay, hours24, { relativeTo: { month: 11, day: 3 } }), "missing year"); ++assert.throws(TypeError, () => Temporal.Duration.compare(oneDay, hours24, { relativeTo: { year: 2019, month: 11 } }), "missing day"); ++assert.throws(TypeError, () => Temporal.Duration.compare(oneDay, hours24, { relativeTo: { year: 2019, day: 3 } }), "missing month"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-year.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-year.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7700d0f3dbdb7a1cfb4ec8b32f230753ae85fbff +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/relativeto-year.js +@@ -0,0 +1,15 @@ ++// 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.duration.compare ++description: relativeTo with years. ++features: [Temporal] ++---*/ ++ ++const oneYear = new Temporal.Duration(1); ++const days365 = new Temporal.Duration(0, 0, 0, 365); ++assert.sameValue( ++ Temporal.Duration.compare(oneYear, days365, { relativeTo: Temporal.PlainDate.from("2017-01-01") }), 0); ++assert.sameValue( ++ Temporal.Duration.compare(oneYear, days365, { relativeTo: Temporal.PlainDate.from("2016-01-01") }), 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..02368982a38c3e1690f15fed8de3e7f04bb94d45 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.duration.compare ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// A string with a leap second is a valid ISO string, so the following two ++// operations should not throw ++ ++Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }); ++Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0c8d50f0e26e3e00fc56bf979706e05525e77d36 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/timezone-string-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.duration.compare ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..78d245fe4807fec68e8344d5f2595aba28811488 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.duration.compare ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.Duration.compare(new Temporal.Duration(), new Temporal.Duration(), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/compare/twenty-five-hour-day.js b/JSTests/test262/test/built-ins/Temporal/Duration/compare/twenty-five-hour-day.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9aeee2d44b522cc7988fa5f940f268baf03ec6fd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/compare/twenty-five-hour-day.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. ++ ++/*--- ++esid: sec-temporal.duration.compare ++description: Unbalancing handles DST days with more than 24 hours ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const tz = TemporalHelpers.springForwardFallBackTimeZone(); ++ ++// 2000-10-29 is a 25-hour day according to this time zone... ++ ++const relativeTo = new Temporal.ZonedDateTime(941187600_000_000_000n, tz); ++ ++// confirm that we have rewound one year and one day: ++assert.sameValue('1999-10-29T01:00:00-08:00[Custom/Spring_Fall]', relativeTo.toString()); ++ ++const d1 = new Temporal.Duration(1, 0, 0, 1); ++const d2 = new Temporal.Duration(1, 0, 0, 0, 25); ++ ++// ...so the durations should be equal relative to relativeTo: ++ ++assert.sameValue(0, ++ Temporal.Duration.compare(d1, d2, { relativeTo }), ++ "2000-10-29 is a 25-hour day" ++); ++ ++assert.sameValue(1, ++ Temporal.Duration.compare(d1, { years: 1, hours: 24 }, { relativeTo }), ++ "2020-10-29 has more than 24 hours" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/days-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/days-undefined.js +index 716ad626f5a6e36ce9947414e8f8bcdd55208db2..f4072e0470b23871b5077eeb4f4dccff333a9424 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/days-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/days-undefined.js +@@ -4,13 +4,14 @@ + /*--- + esid: sec-temporal.duration + description: Undefined arguments should be treated as zero. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const args = [1, 1, 1]; + + const explicit = new Temporal.Duration(...args, undefined); +-assert.sameValue(explicit.days, 0, "days default argument"); ++TemporalHelpers.assertDuration(explicit, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, "explicit"); + + const implicit = new Temporal.Duration(...args); +-assert.sameValue(implicit.days, 0, "days default argument"); ++TemporalHelpers.assertDuration(implicit, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, "implicit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-duration.js b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-duration.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b55a43a08554920070c9044c84a795d933e7d68a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-duration.js +@@ -0,0 +1,24 @@ ++// 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.duration.from ++description: A Duration object is copied, not returned directly ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const orig = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 987, 654, 321); ++const result = Temporal.Duration.from(orig); ++ ++TemporalHelpers.assertDuration( ++ result, ++ 1, 2, 3, 4, 5, 6, 7, 987, 654, 321, ++ "Duration is copied" ++); ++ ++assert.notSameValue( ++ result, ++ orig, ++ "When a Duration is given, the returned value is not the original Duration" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-existing-object.js b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-existing-object.js +index 8173f7c96cd49648f1fc13a0c9ee6d220ec4524a..7d0cb175023237dc29f108c38dc1773c46950062 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-existing-object.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-existing-object.js +@@ -4,16 +4,14 @@ + /*--- + esid: sec-temporal.duration.from + description: Property bag is converted to Duration; Duration is copied ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const d1 = Temporal.Duration.from({ milliseconds: 1000 }); +-assert.sameValue(d1.seconds, 0); +-assert.sameValue(d1.milliseconds, 1000); ++const d1 = Temporal.Duration.from({ milliseconds: 1000, month: 1 }); ++TemporalHelpers.assertDuration(d1, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0); + + const d2 = Temporal.Duration.from(d1); + assert.notSameValue(d1, d2); +-assert.sameValue(d1.seconds, 0); +-assert.sameValue(d1.milliseconds, 1000); +-assert.sameValue(d2.seconds, 0); +-assert.sameValue(d2.milliseconds, 1000); ++TemporalHelpers.assertDuration(d1, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0); ++TemporalHelpers.assertDuration(d2, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-object-invalid.js b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-object-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..31818010fc91ddd8fabe950baf8a99031db9f822 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-object-invalid.js +@@ -0,0 +1,26 @@ ++// 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.duration.from ++description: Invalid object arguments. ++features: [Temporal] ++---*/ ++ ++const tests = [ ++ { years: 0.5 }, ++ { months: 0.5 }, ++ { weeks: 0.5 }, ++ { days: 0.5 }, ++ { hours: 0.5, minutes: 20 }, ++ { hours: 0.5, seconds: 15 }, ++ { minutes: 10.7, nanoseconds: 400 }, ++ { hours: 1, minutes: -30 }, ++]; ++ ++for (const input of tests) { ++ assert.throws(RangeError, () => Temporal.Duration.from(input)); ++} ++ ++assert.throws(TypeError, () => Temporal.Duration.from({})); ++assert.throws(TypeError, () => Temporal.Duration.from({ month: 12 })); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..62708e2939b2dde084dbd8e78fba379d418a2331 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-string-invalid.js +@@ -0,0 +1,32 @@ ++// 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.duration.from ++description: Invalid string arguments. ++features: [Temporal] ++---*/ ++ ++const tests = [ ++ "P1Y1M1W1DT1H1M1.123456789123S", ++ "P0.5Y", ++ "P1Y0,5M", ++ "P1Y1M0.5W", ++ "P1Y1M1W0,5D", ++ "P1Y1M1W1DT0.5H5S", ++ "P1Y1M1W1DT1.5H0,5M", ++ "P1Y1M1W1DT1H0.5M0.5S", ++ "P", ++ "PT", ++ "-P", ++ "-PT", ++ "+P", ++ "+PT", ++ "P1Y1M1W1DT1H1M1.01Sjunk", ++ "P-1Y1M", ++ "P1Y-1M" ++]; ++ ++for (const input of tests) { ++ assert.throws(RangeError, () => Temporal.Duration.from(input)); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-string.js b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e41100b3d69f0988243b077a32bcb9bf4d81a0be +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/from/argument-string.js +@@ -0,0 +1,48 @@ ++// 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.duration.from ++description: Basic string arguments. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1D"), ++ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("p1y1m1dt1h1m1s"), ++ 1, 1, 0, 1, 1, 1, 1, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1Y1M1W1DT1H1M1.1S"), ++ 1, 1, 1, 1, 1, 1, 1, 100, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1Y1M1W1DT1H1M1.12S"), ++ 1, 1, 1, 1, 1, 1, 1, 120, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1Y1M1W1DT1H1M1.123S"), ++ 1, 1, 1, 1, 1, 1, 1, 123, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1Y1M1W1DT1H1M1.1234S"), ++ 1, 1, 1, 1, 1, 1, 1, 123, 400, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1Y1M1W1DT1H1M1.12345S"), ++ 1, 1, 1, 1, 1, 1, 1, 123, 450, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1Y1M1W1DT1H1M1.123456S"), ++ 1, 1, 1, 1, 1, 1, 1, 123, 456, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1Y1M1W1DT1H1M1.1234567S"), ++ 1, 1, 1, 1, 1, 1, 1, 123, 456, 700); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1Y1M1W1DT1H1M1.12345678S"), ++ 1, 1, 1, 1, 1, 1, 1, 123, 456, 780); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1Y1M1W1DT1H1M1.123456789S"), ++ 1, 1, 1, 1, 1, 1, 1, 123, 456, 789); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1Y1M1W1DT1H1M1,12S"), ++ 1, 1, 1, 1, 1, 1, 1, 120, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1DT0.5M"), ++ 0, 0, 0, 1, 0, 0, 30, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1DT0,5H"), ++ 0, 0, 0, 1, 0, 30, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("+P1D"), ++ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("-P1D"), ++ 0, 0, 0, -1, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("\u2212P1D"), ++ 0, 0, 0, -1, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from("-P1Y1M1W1DT1H1M1.123456789S"), ++ -1, -1, -1, -1, -1, -1, -1, -123, -456, -789); ++TemporalHelpers.assertDuration(Temporal.Duration.from("PT100M"), ++ 0, 0, 0, 0, 0, 100, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/hours-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/hours-undefined.js +index 266965693824dd217bc0cc2c99cf10b209afc2d6..e068dee12c31f4616eede7cdb8c808c154533887 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/hours-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/hours-undefined.js +@@ -4,13 +4,14 @@ + /*--- + esid: sec-temporal.duration + description: Undefined arguments should be treated as zero. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const args = [1, 1, 1, 1]; + + const explicit = new Temporal.Duration(...args, undefined); +-assert.sameValue(explicit.hours, 0, "hours default argument"); ++TemporalHelpers.assertDuration(explicit, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, "explicit"); + + const implicit = new Temporal.Duration(...args); +-assert.sameValue(implicit.hours, 0, "hours default argument"); ++TemporalHelpers.assertDuration(implicit, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, "implicit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/microseconds-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/microseconds-undefined.js +index e0f92cb967c5c9de921620db8e9aefe1cd74c0e4..1537ff7545891811f1ddf94cdaeb56c33042bc25 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/microseconds-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/microseconds-undefined.js +@@ -4,13 +4,14 @@ + /*--- + esid: sec-temporal.duration + description: Undefined arguments should be treated as zero. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const args = [1, 1, 1, 1, 1, 1, 1, 1]; + + const explicit = new Temporal.Duration(...args, undefined); +-assert.sameValue(explicit.microseconds, 0, "microseconds default argument"); ++TemporalHelpers.assertDuration(explicit, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, "explicit"); + + const implicit = new Temporal.Duration(...args); +-assert.sameValue(implicit.microseconds, 0, "microseconds default argument"); ++TemporalHelpers.assertDuration(implicit, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, "implicit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/milliseconds-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/milliseconds-undefined.js +index c460c6a06ee61b99b3e1f3ef4d4327552cf23e0c..cee28885684fd5e4b288a99e8272104556b5ed8c 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/milliseconds-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/milliseconds-undefined.js +@@ -4,13 +4,14 @@ + /*--- + esid: sec-temporal.duration + description: Undefined arguments should be treated as zero. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const args = [1, 1, 1, 1, 1, 1, 1]; + + const explicit = new Temporal.Duration(...args, undefined); +-assert.sameValue(explicit.milliseconds, 0, "milliseconds default argument"); ++TemporalHelpers.assertDuration(explicit, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, "explicit"); + + const implicit = new Temporal.Duration(...args); +-assert.sameValue(implicit.milliseconds, 0, "milliseconds default argument"); ++TemporalHelpers.assertDuration(implicit, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, "implicit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/minutes-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/minutes-undefined.js +index 265bd4fbc6bb3250305e31846887382fd4b0a86c..562622ef7aad175dffed482ee559f10ab3e3c1e0 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/minutes-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/minutes-undefined.js +@@ -4,13 +4,14 @@ + /*--- + esid: sec-temporal.duration + description: Undefined arguments should be treated as zero. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const args = [1, 1, 1, 1, 1]; + + const explicit = new Temporal.Duration(...args, undefined); +-assert.sameValue(explicit.minutes, 0, "minutes default argument"); ++TemporalHelpers.assertDuration(explicit, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, "explicit"); + + const implicit = new Temporal.Duration(...args); +-assert.sameValue(implicit.minutes, 0, "minutes default argument"); ++TemporalHelpers.assertDuration(implicit, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, "implicit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/mixed.js b/JSTests/test262/test/built-ins/Temporal/Duration/mixed.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5ba8517cf6f2828f947608ca6fb7b92c7ee38eae +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/mixed.js +@@ -0,0 +1,19 @@ ++// 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.duration ++description: Constructor with mixed signs. ++features: [Temporal] ++---*/ ++ ++assert.throws(RangeError, () => new Temporal.Duration(-1, 1, 1, 1, 1, 1, 1, 1, 1, 1)); ++assert.throws(RangeError, () => new Temporal.Duration(1, -1, 1, 1, 1, 1, 1, 1, 1, 1)); ++assert.throws(RangeError, () => new Temporal.Duration(1, 1, -1, 1, 1, 1, 1, 1, 1, 1)); ++assert.throws(RangeError, () => new Temporal.Duration(1, 1, 1, -1, 1, 1, 1, 1, 1, 1)); ++assert.throws(RangeError, () => new Temporal.Duration(1, 1, 1, 1, -1, 1, 1, 1, 1, 1)); ++assert.throws(RangeError, () => new Temporal.Duration(1, 1, 1, 1, 1, -1, 1, 1, 1, 1)); ++assert.throws(RangeError, () => new Temporal.Duration(1, 1, 1, 1, 1, 1, -1, 1, 1, 1)); ++assert.throws(RangeError, () => new Temporal.Duration(1, 1, 1, 1, 1, 1, 1, -1, 1, 1)); ++assert.throws(RangeError, () => new Temporal.Duration(1, 1, 1, 1, 1, 1, 1, 1, -1, 1)); ++assert.throws(RangeError, () => new Temporal.Duration(1, 1, 1, 1, 1, 1, 1, 1, 1, -1)); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/months-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/months-undefined.js +index f9cad3f216cf83a90ecd6ec43e513c6211f5c62a..8ad0734831da91ad41485cffc66c18f20120037c 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/months-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/months-undefined.js +@@ -4,13 +4,14 @@ + /*--- + esid: sec-temporal.duration + description: Undefined arguments should be treated as zero. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const years = 1; ++const args = [1]; + +-const explicit = new Temporal.Duration(years, undefined); +-assert.sameValue(explicit.months, 0, "months default argument"); ++const explicit = new Temporal.Duration(...args, undefined); ++TemporalHelpers.assertDuration(explicit, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "explicit"); + +-const implicit = new Temporal.Duration(years); +-assert.sameValue(implicit.months, 0, "months default argument"); ++const implicit = new Temporal.Duration(...args); ++TemporalHelpers.assertDuration(implicit, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/nanoseconds-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/nanoseconds-undefined.js +index 2d4de39199c8c809df5ce0e77176be46e035de08..ec1d1518bbaad5e20be6764e32d5ee0fd876a5ef 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/nanoseconds-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/nanoseconds-undefined.js +@@ -4,13 +4,14 @@ + /*--- + esid: sec-temporal.duration + description: Undefined arguments should be treated as zero. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const args = [1, 1, 1, 1, 1, 1, 1, 1, 1]; + + const explicit = new Temporal.Duration(...args, undefined); +-assert.sameValue(explicit.nanoseconds, 0, "nanoseconds default argument"); ++TemporalHelpers.assertDuration(explicit, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, "explicit"); + + const implicit = new Temporal.Duration(...args); +-assert.sameValue(implicit.nanoseconds, 0, "nanoseconds default argument"); ++TemporalHelpers.assertDuration(implicit, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, "implicit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/abs/basic.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/abs/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ecc2ecf18a206248c83421dd57849aa449e0e413 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/abs/basic.js +@@ -0,0 +1,39 @@ ++// 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.duration.prototype.abs ++description: Temporal.Duration.prototype.abs will return absolute value of the input duration. ++info: | ++ 1. Let duration be the this value. ++ 2. Perform ? RequireInternalSlot(duration, [[InitializedTemporalDuration]]). ++ 3. Return ? CreateTemporalDuration(abs(duration.[[Years]]), abs(duration.[[Months]]), abs(duration.[[Weeks]]), abs(duration.[[Days]]), abs(duration.[[Hours]]), abs(duration.[[Minutes]]), abs(duration.[[Seconds]]), abs(duration.[[Milliseconds]]), abs(duration.[[Microseconds]]), abs(duration.[[Nanoseconds]])). ++ ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++let d1 = new Temporal.Duration(); ++TemporalHelpers.assertDuration( ++ d1.abs(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "empty"); ++ ++let d2 = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ++TemporalHelpers.assertDuration( ++ d2.abs(), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "positive"); ++ ++let d3 = new Temporal.Duration(1e5, 2e5, 3e5, 4e5, 5e5, 6e5, 7e5, 8e5, 9e5, 10e5); ++TemporalHelpers.assertDuration( ++ d3.abs(), 1e5, 2e5, 3e5, 4e5, 5e5, 6e5, 7e5, 8e5, 9e5, 10e5, "large positive"); ++ ++let d4 = new Temporal.Duration(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10); ++TemporalHelpers.assertDuration( ++ d4.abs(), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, "negative"); ++ ++// Test with some zeros ++let d5 = new Temporal.Duration(1, 0, 3, 0, 5, 0, 7, 0, 9, 0); ++TemporalHelpers.assertDuration( ++ d5.abs(), 1, 0, 3, 0, 5, 0, 7, 0, 9, 0, "some zeros"); ++ ++let d6 = new Temporal.Duration(0, 2, 0, 4, 0, 6, 0, 8, 0, 10); ++TemporalHelpers.assertDuration( ++ d6.abs(), 0, 2, 0, 4, 0, 6, 0, 8, 0, 10, "other zeros"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/abs/new-object.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/abs/new-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6f10880b7caf918c8e586e8039fb9d5f3a7b0a98 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/abs/new-object.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.duration.prototype.abs ++description: Temporal.Duration.prototype.abs returns a new object. ++features: [Temporal] ++---*/ ++ ++let d1 = new Temporal.Duration(); ++assert.notSameValue(d1.abs(), d1); ++ ++let d2 = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ++assert.notSameValue(d2.abs(), d2); ++ ++let d3 = new Temporal.Duration(1e5, 2e5, 3e5, 4e5, 5e5, 6e5, 7e5, 8e5, 9e5, 10e5); ++assert.notSameValue(d3.abs(), d3); ++ ++let d4 = new Temporal.Duration(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10); ++assert.notSameValue(d4.abs(), d4); ++ ++// Test with some zeros ++let d5 = new Temporal.Duration(1, 0, 3, 0, 5, 0, 7, 0, 9, 0); ++assert.notSameValue(d5.abs(), d5); ++ ++let d6 = new Temporal.Duration(0, 2, 0, 4, 0, 6, 0, 8, 0, 10); ++assert.notSameValue(d6.abs(), d6); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/argument-object-invalid.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/argument-object-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ed5b5873a34479ce43e5bb73261cf0a949626c18 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/argument-object-invalid.js +@@ -0,0 +1,13 @@ ++// 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.duration.prototype.add ++description: Mixed positive and negative values or missing properties always throw ++features: [Temporal] ++---*/ ++ ++const duration = Temporal.Duration.from({ days: 1, minutes: 5 }); ++assert.throws(RangeError, () => duration.add({ hours: 1, minutes: -30 }), "mixed signs"); ++assert.throws(TypeError, () => duration.add({}), "no properties"); ++assert.throws(TypeError, () => duration.add({ month: 12 }), "only singular 'month' property"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/argument-string.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6e129e842e90ee1ce90c6bd6b697375efce38ca0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/argument-string.js +@@ -0,0 +1,14 @@ ++// 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.duration.prototype.add ++description: String arguments are supported. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const duration = Temporal.Duration.from({ days: 1, minutes: 5 }); ++const result = duration.add("P2DT5M"); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 3, 0, 10, 0, 0, 0, 0, "String argument should be supported"); ++assert.throws(RangeError, () => duration.add("2DT5M"), "Invalid string argument should throw"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/basic.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bcbea9aa422e6fdb603147036a55223799bdcaa3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/basic.js +@@ -0,0 +1,31 @@ ++// 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.duration.prototype.add ++description: Basic behavior ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const duration1 = Temporal.Duration.from({ days: 1, minutes: 5 }); ++TemporalHelpers.assertDuration(duration1.add({ days: 2, minutes: 5 }), ++ 0, 0, 0, 3, 0, 10, 0, 0, 0, 0, "positive same units"); ++TemporalHelpers.assertDuration(duration1.add({ hours: 12, seconds: 30 }), ++ 0, 0, 0, 1, 12, 5, 30, 0, 0, 0, "positive different units"); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P3DT10M").add({ days: -2, minutes: -5 }), ++ 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, "negative same units"); ++TemporalHelpers.assertDuration(Temporal.Duration.from("P1DT12H5M30S").add({ hours: -12, seconds: -30 }), ++ 0, 0, 0, 1, 0, 5, 0, 0, 0, 0, "negative different units"); ++const duration2 = Temporal.Duration.from("P50DT50H50M50.500500500S"); ++TemporalHelpers.assertDuration(duration2.add(duration2), ++ 0, 0, 0, 104, 5, 41, 41, 1, 1, 0, "balancing positive"); ++const duration3 = Temporal.Duration.from({ hours: -1, seconds: -60 }); ++TemporalHelpers.assertDuration(duration3.add({ minutes: 122 }), ++ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, "balancing flipped sign 1"); ++const duration4 = Temporal.Duration.from({ hours: -1, seconds: -3721 }); ++TemporalHelpers.assertDuration(duration4.add({ minutes: 61, nanoseconds: 3722000000001 }), ++ 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, "balancing flipped sign 2"); ++TemporalHelpers.assertDuration(duration1.add({ month: 1, days: 1 }), ++ 0, 0, 0, 2, 0, 5, 0, 0, 0, 0, ++ "incorrectly-spelled properties are ignored"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/options-undefined.js +index ef9717d9ac28072f9b829ff683729371ae550f84..1b58ed054c53a177c07e473c8d0250dc38513253 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/options-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/options-undefined.js +@@ -4,10 +4,29 @@ + /*--- + esid: sec-temporal.duration.prototype.add + description: Verify that undefined options are handled correctly. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const duration1 = new Temporal.Duration(1); + const duration2 = new Temporal.Duration(0, 12); +-assert.throws(RangeError, () => duration1.add(duration2), "default relativeTo is undefined"); +-assert.throws(RangeError, () => duration1.add(duration2, undefined), "default relativeTo is undefined"); ++const duration3 = new Temporal.Duration(0, 0, 0, 1); ++const duration4 = new Temporal.Duration(0, 0, 0, 0, 24); ++ ++assert.throws(RangeError, () => duration1.add(duration2), "no options with years"); ++TemporalHelpers.assertDuration(duration3.add(duration4), ++ 0, 0, 0, /* days = */ 2, 0, 0, 0, 0, 0, 0, ++ "no options with days"); ++ ++const optionValues = [ ++ [undefined, "undefined"], ++ [{}, "plain object"], ++ [() => {}, "lambda"], ++]; ++for (const [options, description] of optionValues) { ++ assert.throws(RangeError, () => duration1.add(duration2, options), ++ `options ${description} with years`); ++ TemporalHelpers.assertDuration(duration3.add(duration4, options), ++ 0, 0, 0, /* days = */ 2, 0, 0, 0, 0, 0, 0, ++ `options ${description} with days`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..37500a0214baba41fd4a66bdf5af5741b5f1bd1d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.duration.prototype.add ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Duration(0, 0, 0, 0, 1); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.add({ hours: 1 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8e392f0e9caa2f602ba24b553a54875dfee78309 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-leap-second.js +@@ -0,0 +1,43 @@ ++// 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.duration.prototype.add ++description: Leap second is constrained in both an ISO string and a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 1); ++ ++let relativeTo = "2016-12-31T23:59:60"; ++const result1 = instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }); ++TemporalHelpers.assertDuration( ++ result1, ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainDate relativeTo" ++); ++ ++relativeTo = "2016-12-31T23:59:60+00:00[UTC]"; ++const result2 = instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }); ++TemporalHelpers.assertDuration( ++ result2, ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for ZonedDateTime relativeTo" ++); ++ ++relativeTo = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result3 = instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }); ++TemporalHelpers.assertDuration( ++ result3, ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is valid in a property bag for PlainDate relativeTo" ++); ++ ++relativeTo = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60, timeZone: "UTC" }; ++const result4 = instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }); ++TemporalHelpers.assertDuration( ++ result4, ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is valid in a property bag for ZonedDateTime relativeTo" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-month.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-month.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5523adcf709ebc536bd28d47f657a91c7e0064a1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-month.js +@@ -0,0 +1,18 @@ ++// 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.duration.prototype.add ++description: relativeTo with months. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const oneMonth = new Temporal.Duration(0, 1); ++const days30 = new Temporal.Duration(0, 0, 0, 30); ++TemporalHelpers.assertDuration(oneMonth.add(days30, { relativeTo: Temporal.PlainDate.from('2018-01-01') }), ++ 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, "January"); ++TemporalHelpers.assertDuration(oneMonth.add(days30, { relativeTo: Temporal.PlainDate.from('2018-02-01') }), ++ 0, 1, 0, 30, 0, 0, 0, 0, 0, 0, "February"); ++TemporalHelpers.assertDuration(oneMonth.add(days30, { relativeTo: Temporal.PlainDate.from('2018-03-01') }), ++ 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, "March"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-number.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ecdce2d3eb63cab57661935486edc33f819e5529 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-number.js +@@ -0,0 +1,30 @@ ++// 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.duration.prototype.add ++description: A number as relativeTo option is converted to a string, then to Temporal.PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 1); ++ ++const relativeTo = 20191101; ++ ++const result = instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }); ++TemporalHelpers.assertDuration(result, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "20191101 is a valid ISO string for relativeTo"); ++ ++const numbers = [ ++ 1, ++ -20191101, ++ 1234567890, ++]; ++ ++for (const relativeTo of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }), ++ `Number ${relativeTo} does not convert to a valid ISO string for relativeTo` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-order.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-order.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3a00bd00e9a0c42f048982c0138147991c40d638 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-order.js +@@ -0,0 +1,16 @@ ++// 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.duration.prototype.add ++description: relativeTo with years. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const d1 = new Temporal.Duration(0, 1, 0, 0); ++const d2 = new Temporal.Duration(0, 0, 0, 30); ++const relativeTo = new Temporal.PlainDate(2000, 1, 1); ++TemporalHelpers.assertDuration(d1.add(d2, { relativeTo }), ++ 0, 2, 0, 1, 0, 0, 0, 0, 0, 0, ++ "first this is resolved against relativeTo, then the argument against relativeTo + this"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b2ff180cb5872618500807462f0fd74a9cd0b6f7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.duration.prototype.add ++description: A number as calendar in relativeTo property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 1); ++ ++const calendar = 19970327; ++ ++let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++const result1 = instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }); ++TemporalHelpers.assertDuration(result1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for relativeTo.calendar"); ++ ++relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++const result2 = instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }); ++TemporalHelpers.assertDuration(result2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for relativeTo.calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }), ++ `Number ${calendar} does not convert to a valid ISO string for relativeTo.calendar` ++ ); ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }), ++ `Number ${calendar} does not convert to a valid ISO string for relativeTo.calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ca4b0dd243c6f8efde92d15338d6d5e67f31be1a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-propertybag-calendar-wrong-type.js +@@ -0,0 +1,49 @@ ++// 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.duration.prototype.add ++description: > ++ Appropriate error thrown when relativeTo.calendar cannot be converted to a ++ calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Duration(1, 0, 0, 1); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }), `${description} does not convert to a valid ISO string`); ++ ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }), `${description} is not a valid property bag and does not convert to a string`); ++ ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-required.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-required.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ae171e0f144cefd31334822161eb1f4a2c42ee81 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-required.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. ++ ++/*--- ++esid: sec-temporal.duration.prototype.add ++description: relativeTo is required if the largest unit is at least weeks. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const d = Temporal.Duration.from({ hours: 1 }); ++const dy = Temporal.Duration.from({ years: 1 }); ++const dm = Temporal.Duration.from({ months: 1 }); ++const dw = Temporal.Duration.from({ weeks: 1 }); ++assert.throws(RangeError, () => d.add(dy)); ++assert.throws(RangeError, () => d.add(dm)); ++assert.throws(RangeError, () => d.add(dw)); ++assert.throws(RangeError, () => dy.add(d)); ++assert.throws(RangeError, () => dm.add(d)); ++assert.throws(RangeError, () => dw.add(d)); ++const relativeTo = Temporal.PlainDate.from("2000-01-01"); ++TemporalHelpers.assertDuration(d.add(dy, { relativeTo }), ++ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(d.add(dm, { relativeTo }), ++ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(d.add(dw, { relativeTo }), ++ 0, 0, 1, 0, 1, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(dy.add(d, { relativeTo }), ++ 1, 0, 0, 0, 1, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(dm.add(d, { relativeTo }), ++ 0, 1, 0, 0, 1, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(dw.add(d, { relativeTo }), ++ 0, 0, 1, 0, 1, 0, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bead251d02d3ad94d94b971d85facc0ff38d9072 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-wrong-type.js +@@ -0,0 +1,39 @@ ++// 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.duration.prototype.add ++description: > ++ Appropriate error thrown when relativeTo cannot be converted to a valid ++ relativeTo string or property bag ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Duration(1, 0, 0, 1); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [relativeTo, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [relativeTo, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo }), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-year.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-year.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1c59f3dff7d0de806913316f1826b39d639c7f32 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/relativeto-year.js +@@ -0,0 +1,16 @@ ++// 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.duration.prototype.add ++description: relativeTo with years. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const oneYear = new Temporal.Duration(1); ++const days365 = new Temporal.Duration(0, 0, 0, 365); ++TemporalHelpers.assertDuration(oneYear.add(days365, { relativeTo: Temporal.PlainDate.from("2016-01-01") }), ++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, "non-leap year"); ++TemporalHelpers.assertDuration(oneYear.add(days365, { relativeTo: Temporal.PlainDate.from("2015-01-01") }), ++ 1, 11, 0, 30, 0, 0, 0, 0, 0, 0, "leap year"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a08b0dc14f2a3b2a5df65242fd4df52acdb0f30b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/timezone-string-leap-second.js +@@ -0,0 +1,21 @@ ++// 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.duration.prototype.add ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// A string with a leap second is a valid ISO string, so the following two ++// operations should not throw ++ ++instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }); ++instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2f09d730ba6992d83e17dc85511f8eda51e7cb3a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.duration.prototype.add ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Duration(1); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6ff8c9fb2f10799b977a1cc22d9fae9224de07d6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/add/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.duration.prototype.add ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.add(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/blank/basic.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/blank/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..10a594cb246864332fe97c9517ac5882d0c3df26 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/blank/basic.js +@@ -0,0 +1,25 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-get-temporal.duration.prototype.blank ++description: Basic tests for blank. ++features: [Temporal] ++---*/ ++ ++assert.sameValue(Temporal.Duration.from("P3DT1H").blank, false); ++assert.sameValue(Temporal.Duration.from("-PT2H20M30S").blank, false); ++assert.sameValue(Temporal.Duration.from("PT0S").blank, true); ++const zero = Temporal.Duration.from({ ++ years: 0, ++ months: 0, ++ weeks: 0, ++ days: 0, ++ hours: 0, ++ minutes: 0, ++ seconds: 0, ++ milliseconds: 0, ++ microseconds: 0, ++ nanoseconds: 0 ++}); ++assert.sameValue(zero.blank, true); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/negated/basic.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/negated/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f2bae4848a7d51b05ba031e42d788f81aa7763f8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/negated/basic.js +@@ -0,0 +1,51 @@ ++// 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.duration.prototype.negated ++description: Temporal.Duration.prototype.negated will return negated value of the input duration. ++info: | ++ 3. Return ? CreateTemporalDuration(abs(duration.[[Years]]), abs(duration.[[Months]]), abs(duration.[[Weeks]]), abs(duration.[[Days]]), abs(duration.[[Hours]]), abs(duration.[[Minutes]]), abs(duration.[[Seconds]]), abs(duration.[[Milliseconds]]), abs(duration.[[Microseconds]]), abs(duration.[[Nanoseconds]])). ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++let d1 = new Temporal.Duration(); ++TemporalHelpers.assertDuration( ++ d1.negated(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "zeros"); ++ ++let d2 = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ++TemporalHelpers.assertDuration( ++ d2.negated(), -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, ++ "positive values"); ++ ++let d3 = new Temporal.Duration(1e5, 2e5, 3e5, 4e5, 5e5, 6e5, 7e5, 8e5, 9e5, 10e5); ++TemporalHelpers.assertDuration( ++ d3.negated(), -1e5, -2e5, -3e5, -4e5, -5e5, -6e5, -7e5, -8e5, -9e5, -10e5, ++ "large positive values"); ++ ++let d4 = new Temporal.Duration(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10); ++TemporalHelpers.assertDuration( ++ d4.negated(), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ++ "negative values"); ++ ++let d5 = new Temporal.Duration(-1e5, -2e5, -3e5, -4e5, -5e5, -6e5, -7e5, -8e5, -9e5, -10e5); ++TemporalHelpers.assertDuration( ++ d5.negated(), 1e5, 2e5, 3e5, 4e5, 5e5, 6e5, 7e5, 8e5, 9e5, 10e5, ++ "large negative values"); ++ ++let d6 = new Temporal.Duration(1, 0, 3, 0, 5, 0, 7, 0, 9, 0); ++TemporalHelpers.assertDuration( ++ d6.negated(), -1, 0, -3, 0, -5, 0, -7, 0, -9, 0, ++ "some zeros with positive values"); ++ ++let d7 = new Temporal.Duration(-1, 0, -3, 0, -5, 0, -7, 0, -9, 0); ++TemporalHelpers.assertDuration( ++ d7.negated(), 1, 0, 3, 0, 5, 0, 7, 0, 9, 0, ++ "some zeros with negative values"); ++ ++let d8 = new Temporal.Duration(0, -2, 0, -4, 0, -6, 0, -8, 0, -10); ++TemporalHelpers.assertDuration( ++ d8.negated(), 0, 2, 0, 4, 0, 6, 0, 8, 0, 10, ++ "other zeros with negative values"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/calendar-dateadd-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/calendar-dateadd-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2c81eabfa02a882006c35eec797d75107720a3bd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/calendar-dateadd-called-with-options-undefined.js +@@ -0,0 +1,73 @@ ++// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-temporal.duration.prototype.round ++description: > ++ BuiltinTimeZoneGetInstantFor calls Calendar.dateAdd with undefined as the ++ options value ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarDateAddUndefinedOptions(); ++const timeZone = TemporalHelpers.oneShiftTimeZone(new Temporal.Instant(0n), 3600e9); ++const relativeTo = new Temporal.ZonedDateTime(0n, timeZone, calendar); ++ ++// Rounding with smallestUnit a calendar unit. ++// The calls come from these paths: ++// Duration.round() -> ++// RoundDuration -> ++// MoveRelativeZonedDateTime -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// BalanceDurationRelative -> ++// MoveRelativeDate -> calendar.dateAdd() (2x) ++// calendar.dateAdd() ++// MoveRelativeZonedDateTime -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// BalanceDuration -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() (2x) ++ ++const instance1 = new Temporal.Duration(1, 1, 1, 1, 1); ++instance1.round({ smallestUnit: "days", relativeTo }); ++assert.sameValue(calendar.dateAddCallCount, 9, "rounding with calendar smallestUnit"); ++ ++// Rounding with a non-default largestUnit to cover the path in ++// UnbalanceDurationRelative where larger units are converted into smaller ++// units; and with a smallestUnit larger than days to cover the path in ++// RoundDuration where days are converted into larger units. ++// The calls come from these paths: ++// Duration.round() -> ++// UnbalanceDurationRelative -> MoveRelativeDate -> calendar.dateAdd() ++// RoundDuration -> ++// MoveRelativeZonedDateTime -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// MoveRelativeDate -> calendar.dateAdd() (5x) ++// BalanceDurationRelative ++// MoveRelativeDate -> calendar.dateAdd() ++// MoveRelativeZonedDateTime -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++ ++calendar.dateAddCallCount = 0; ++ ++const instance2 = new Temporal.Duration(0, 1, 1, 1); ++instance2.round({ largestUnit: "weeks", smallestUnit: "weeks", relativeTo }); ++assert.sameValue(calendar.dateAddCallCount, 9, "rounding with non-default largestUnit and calendar smallestUnit"); ++ ++// Rounding with smallestUnit a non-calendar unit, and having the resulting time ++// difference be longer than a calendar day, covering the paths that go through ++// AdjustRoundedDurationDays. ++// The calls come from these paths: ++// Duration.round() -> ++// AdjustRoundedDurationDays -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// AddDuration -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() (2x) ++// BalanceDuration -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() (2x) ++ ++calendar.dateAddCallCount = 0; ++ ++const instance3 = new Temporal.Duration(0, 0, 0, 0, 23, 59, 59, 999, 999, 999); ++instance3.round({ largestUnit: "days", smallestUnit: "hours", roundingMode: "ceil", relativeTo }); ++assert.sameValue(calendar.dateAddCallCount, 7, "rounding with time difference exceeding calendar day"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-default.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-default.js +new file mode 100644 +index 0000000000000000000000000000000000000000..efef710a0886e4525c872aec080036e813056bd0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-default.js +@@ -0,0 +1,38 @@ ++// 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.duration.prototype.round ++description: assumes a different default for largestUnit if smallestUnit is larger than the default ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const relativeTo = Temporal.PlainDate.from("2020-01-01"); ++const almostYear = Temporal.Duration.from({ days: 364 }); ++TemporalHelpers.assertDuration(almostYear.round({ smallestUnit: "years", relativeTo }), ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "years"); ++const almostMonth = Temporal.Duration.from({ days: 27 }); ++TemporalHelpers.assertDuration(almostMonth.round({ smallestUnit: "months", relativeTo }), ++ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, "months"); ++const almostWeek = Temporal.Duration.from({ days: 6 }); ++TemporalHelpers.assertDuration(almostWeek.round({ smallestUnit: "weeks", relativeTo }), ++ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, "weeks"); ++const almostDay = Temporal.Duration.from({ seconds: 86399 }); ++TemporalHelpers.assertDuration(almostDay.round({ smallestUnit: "days" }), ++ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "days"); ++const almostHour = Temporal.Duration.from({ seconds: 3599 }); ++TemporalHelpers.assertDuration(almostHour.round({ smallestUnit: "hours" }), ++ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, "hours"); ++const almostMinute = Temporal.Duration.from({ seconds: 59 }); ++TemporalHelpers.assertDuration(almostMinute.round({ smallestUnit: "minutes" }), ++ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, "minutes"); ++const almostSecond = Temporal.Duration.from({ nanoseconds: 999999999 }); ++TemporalHelpers.assertDuration(almostSecond.round({ smallestUnit: "seconds" }), ++ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, "seconds"); ++const almostMillisecond = Temporal.Duration.from({ nanoseconds: 999999 }); ++TemporalHelpers.assertDuration(almostMillisecond.round({ smallestUnit: "milliseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, "milliseconds"); ++const almostMicrosecond = Temporal.Duration.from({ nanoseconds: 999 }); ++TemporalHelpers.assertDuration(almostMicrosecond.round({ smallestUnit: "microseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, "microseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-mismatch.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-mismatch.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7517cb336b91aac4e0d37ccd14efec0dacfc1cd8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/largestunit-smallestunit-mismatch.js +@@ -0,0 +1,20 @@ ++// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-temporal.duration.prototype.round ++description: RangeError thrown when smallestUnit is larger than largestUnit ++features: [Temporal] ++---*/ ++ ++const d = new Temporal.Duration(5, 5, 5, 5, 5, 5, 5, 5, 5, 5); ++const relativeTo = Temporal.PlainDate.from('2020-01-01'); ++const units = ["years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds"]; ++for (let largestIdx = 1; largestIdx < units.length; largestIdx++) { ++ for (let smallestIdx = 0; smallestIdx < largestIdx; smallestIdx++) { ++ const largestUnit = units[largestIdx]; ++ const smallestUnit = units[smallestIdx]; ++ assert.throws(RangeError, () => d.round({ largestUnit, smallestUnit, relativeTo }), ++ `${smallestUnit} > ${largestUnit}`); ++ } ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a224a6e737ae4d665158ef2f69b90061e106f5ad +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/options-wrong-type.js +@@ -0,0 +1,24 @@ ++// 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.duration.prototype.round ++description: TypeError thrown when options argument is missing or a non-string primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ undefined, ++ null, ++ true, ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Duration(0, 0, 0, 0, 1); ++assert.throws(TypeError, () => instance.round(), "TypeError on missing options argument"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.round(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7516624cc3e3c9ba015a5aca1c732c5ebaf15e26 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-leap-second.js +@@ -0,0 +1,43 @@ ++// 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.duration.prototype.round ++description: Leap second is constrained in both an ISO string and a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 0, 24); ++ ++let relativeTo = "2016-12-31T23:59:60"; ++const result1 = instance.round({ largestUnit: "years", relativeTo }); ++TemporalHelpers.assertDuration( ++ result1, ++ 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainDate relativeTo" ++); ++ ++relativeTo = "2016-12-31T23:59:60+00:00[UTC]"; ++const result2 = instance.round({ largestUnit: "years", relativeTo }); ++TemporalHelpers.assertDuration( ++ result2, ++ 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for ZonedDateTime relativeTo" ++); ++ ++relativeTo = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result3 = instance.round({ largestUnit: "years", relativeTo }); ++TemporalHelpers.assertDuration( ++ result3, ++ 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, ++ "second: 60 is valid in a property bag for PlainDate relativeTo" ++); ++ ++relativeTo = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60, timeZone: "UTC" }; ++const result4 = instance.round({ largestUnit: "years", relativeTo }); ++TemporalHelpers.assertDuration( ++ result4, ++ 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, ++ "second: 60 is valid in a property bag for ZonedDateTime relativeTo" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-number.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9ec36f6775f374f4588767df263c8b87c3a03076 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-number.js +@@ -0,0 +1,30 @@ ++// 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.duration.prototype.round ++description: A number as relativeTo option is converted to a string, then to Temporal.PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 0, 24); ++ ++const relativeTo = 20191101; ++ ++const result = instance.round({ largestUnit: "years", relativeTo }); ++TemporalHelpers.assertDuration(result, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, "20191101 is a valid ISO string for relativeTo"); ++ ++const numbers = [ ++ 1, ++ -20191101, ++ 1234567890, ++]; ++ ++for (const relativeTo of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.round({ largestUnit: "years", relativeTo }), ++ `Number ${relativeTo} does not convert to a valid ISO string for relativeTo` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6aee637fc195deca3aa20db57062c360e0712568 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.duration.prototype.round ++description: A number as calendar in relativeTo property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 0, 24); ++ ++const calendar = 19970327; ++ ++let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++const result1 = instance.round({ largestUnit: "years", relativeTo }); ++TemporalHelpers.assertDuration(result1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for relativeTo.calendar"); ++ ++relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++const result2 = instance.round({ largestUnit: "years", relativeTo }); ++TemporalHelpers.assertDuration(result2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for relativeTo.calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.round({ largestUnit: "years", relativeTo }), ++ `Number ${calendar} does not convert to a valid ISO string for relativeTo.calendar` ++ ); ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.round({ largestUnit: "years", relativeTo }), ++ `Number ${calendar} does not convert to a valid ISO string for relativeTo.calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2d449a74498d0e70d0754c5ebbfe452c0a2c0b8c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-propertybag-calendar-wrong-type.js +@@ -0,0 +1,49 @@ ++// 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.duration.prototype.round ++description: > ++ Appropriate error thrown when relativeTo.calendar cannot be converted to a ++ calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Duration(1, 0, 0, 0, 24); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.round({ largestUnit: "years", relativeTo }), `${description} does not convert to a valid ISO string`); ++ ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.round({ largestUnit: "years", relativeTo }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.round({ largestUnit: "years", relativeTo }), `${description} is not a valid property bag and does not convert to a string`); ++ ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.round({ largestUnit: "years", relativeTo }), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.round({ largestUnit: "years", relativeTo }), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..32fba37a5a03c5073398b8023b16ec45522503c4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/relativeto-wrong-type.js +@@ -0,0 +1,39 @@ ++// 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.duration.prototype.round ++description: > ++ Appropriate error thrown when relativeTo cannot be converted to a valid ++ relativeTo string or property bag ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Duration(1, 0, 0, 0, 24); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [relativeTo, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.round({ largestUnit: "years", relativeTo }), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [relativeTo, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.round({ largestUnit: "years", relativeTo }), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/roundingmode-invalid-string.js +index 35a9df280769de45f6c806135ba64c7356a1241e..e895dd70f02873cbebd15f815dbae5ce628f05a6 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/roundingmode-invalid-string.js +@@ -8,4 +8,6 @@ features: [Temporal] + ---*/ + + const duration = new Temporal.Duration(0, 0, 0, 0, 12, 34, 56, 123, 987, 500); +-assert.throws(RangeError, () => duration.round({ smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => duration.round({ smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/roundto-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/roundto-invalid-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3e5a43386b130ee3658db77d417a60c4b4fd2b0f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/roundto-invalid-string.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.duration.prototype.round ++description: RangeError thrown when smallestUnit option not one of the allowed string values ++features: [Temporal] ++---*/ ++ ++const duration = new Temporal.Duration(0, 0, 0, 0, 12, 34, 56, 123, 987, 500); ++const badValues = [ ++ "era", ++ "eraYear", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => duration.round(smallestUnit), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit-disallowed-units-string.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit-disallowed-units-string.js +deleted file mode 100644 +index f2cf0b0f016dbbf7141fd9b6a24a230d0bf23178..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit-disallowed-units-string.js ++++ /dev/null +@@ -1,26 +0,0 @@ +-// Copyright (C) 2021 Igalia, S.L. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +- +-/*--- +-esid: sec-temporal.duration.prototype.round +-description: Specifically disallowed units for the smallestUnit option +-features: [Temporal, arrow-function] +----*/ +- +-const instance = new Temporal.Duration(0, 0, 0, 4, 5, 6, 7, 987, 654, 321); +-const invalidUnits = [ +- "era", +- "eras", +-]; +-invalidUnits.forEach((smallestUnit) => { +- assert.throws( +- RangeError, +- () => instance.round({ smallestUnit }), +- `{ smallestUnit: "${smallestUnit}" } should not be allowed as an argument to round` +- ); +- assert.throws( +- RangeError, +- () => instance.round(smallestUnit), +- `"${smallestUnit}" should not be allowed as an argument to round` +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit-invalid-string.js +index 3d5d884b5272959cc7755aa5b2751096d83370a7..0904c0ccc849785d980f415c7177df4725f9acfa 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit-invalid-string.js +@@ -8,4 +8,20 @@ features: [Temporal] + ---*/ + + const duration = new Temporal.Duration(0, 0, 0, 0, 12, 34, 56, 123, 987, 500); +-assert.throws(RangeError, () => duration.round({ smallestUnit: "other string" })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => duration.round({ smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8f62f8928aa92d89046b260b322c43f067309814 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/smallestunit.js +@@ -0,0 +1,34 @@ ++// 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.duration.prototype.round ++description: smallestUnit should be taken into account ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const d = Temporal.Duration.from({ ++ days: 1, ++ hours: 2, ++ minutes: 3, ++ seconds: 4, ++ milliseconds: 5, ++ microseconds: 6, ++ nanoseconds: 7 ++}); ++const tests = { ++ 'day': [0, 0, 0, 1, 0, 0, 0, 0, 0, 0], ++ 'hour': [0, 0, 0, 1, 2, 0, 0, 0, 0, 0], ++ 'minute': [0, 0, 0, 1, 2, 3, 0, 0, 0, 0], ++ 'second': [0, 0, 0, 1, 2, 3, 4, 0, 0, 0], ++ 'millisecond': [0, 0, 0, 1, 2, 3, 4, 5, 0, 0], ++ 'microsecond': [0, 0, 0, 1, 2, 3, 4, 5, 6, 0], ++ 'nanosecond': [0, 0, 0, 1, 2, 3, 4, 5, 6, 7], ++}; ++for (const [smallestUnit, expected] of Object.entries(tests)) { ++ TemporalHelpers.assertDuration(d.round(smallestUnit), ...expected, ++ `"${smallestUnit}" should work as argument`); ++ TemporalHelpers.assertDuration(d.round({ smallestUnit }), ...expected, ++ `"${smallestUnit}" should work in option bag`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..73e01540e2c61d601ca83b3b3e9a29b43534f493 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/timezone-string-leap-second.js +@@ -0,0 +1,21 @@ ++// 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.duration.prototype.round ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// A string with a leap second is a valid ISO string, so the following two ++// operations should not throw ++ ++instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone } }); ++instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..290099ebed967c66eea3bb173260f211030a975a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.duration.prototype.round ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Duration(1); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9ac21ea9af663550d6cb7e3017d4faced7067405 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/round/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.duration.prototype.round ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.round({ largestUnit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-object-invalid.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-object-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8d823237faaf7fb01d51167c097a098ac25ce32a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-object-invalid.js +@@ -0,0 +1,13 @@ ++// 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.duration.prototype.subtract ++description: Mixed positive and negative values or missing properties always throw ++features: [Temporal] ++---*/ ++ ++const duration = Temporal.Duration.from({ days: 1, minutes: 5 }); ++assert.throws(RangeError, () => duration.subtract({ hours: 1, minutes: -30 }), "mixed signs"); ++assert.throws(TypeError, () => duration.subtract({}), "no properties"); ++assert.throws(TypeError, () => duration.subtract({ month: 12 }), "only singular 'month' property"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-string.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1cfa7b4a65804ce45dc69bd340263cb70deca1bb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/argument-string.js +@@ -0,0 +1,14 @@ ++// 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.duration.prototype.subtract ++description: String arguments are supported. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const duration = Temporal.Duration.from({ days: 3, hours: 1, minutes: 10 }); ++const result = duration.subtract('P1DT5M'); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 2, 1, 5, 0, 0, 0, 0, "String argument should be supported"); ++assert.throws(RangeError, () => duration.subtract("2DT5M"), "Invalid string argument should throw"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/basic.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e63c53b1c9896f4cd4cf8488f8197a3973e4bea6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/basic.js +@@ -0,0 +1,66 @@ ++// 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.duration.prototype.subtract ++description: Basic behavior ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const duration = Temporal.Duration.from({ days: 3, hours: 1, minutes: 10 }); ++TemporalHelpers.assertDuration(duration.subtract({ days: 1, minutes: 5 }), ++ 0, 0, 0, 2, 1, 5, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(duration.subtract(duration), ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(duration.subtract({ days: 3 }), ++ 0, 0, 0, 0, 1, 10, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(duration.subtract({ minutes: 10 }), ++ 0, 0, 0, 3, 1, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(duration.subtract({ minutes: 15 }), ++ 0, 0, 0, 3, 0, 55, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(duration.subtract({ seconds: 30 }), ++ 0, 0, 0, 3, 1, 9, 30, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from('P2DT1H5M').subtract({ days: -1, minutes: -5 }), ++ 0, 0, 0, 3, 1, 10, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(new Temporal.Duration().subtract({ days: -3, hours: -1, minutes: -10 }), ++ 0, 0, 0, 3, 1, 10, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from('PT1H10M').subtract({ days: -3 }), ++ 0, 0, 0, 3, 1, 10, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from('P3DT1H').subtract({ minutes: -10 }), ++ 0, 0, 0, 3, 1, 10, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from('P3DT55M').subtract({ minutes: -15 }), ++ 0, 0, 0, 3, 1, 10, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(Temporal.Duration.from('P3DT1H9M30S').subtract({ seconds: -30 }), ++ 0, 0, 0, 3, 1, 10, 0, 0, 0, 0); ++const d = Temporal.Duration.from({ ++ minutes: 100, ++ seconds: 100, ++ milliseconds: 2000, ++ microseconds: 2000, ++ nanoseconds: 2000 ++}); ++const less = Temporal.Duration.from({ ++ minutes: 10, ++ seconds: 10, ++ milliseconds: 500, ++ microseconds: 500, ++ nanoseconds: 500 ++}); ++TemporalHelpers.assertDuration(d.subtract(less), ++ 0, 0, 0, 0, 0, 91, 31, 501, 501, 500); ++const tenDays = Temporal.Duration.from('P10D'); ++const tenMinutes = Temporal.Duration.from('PT10M'); ++TemporalHelpers.assertDuration(tenDays.subtract({ days: 15 }), ++ 0, 0, 0, -5, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(tenMinutes.subtract({ minutes: 15 }), ++ 0, 0, 0, 0, 0, -5, 0, 0, 0, 0); ++const d1 = Temporal.Duration.from({ hours: 1, seconds: 60 }); ++TemporalHelpers.assertDuration(d1.subtract({ minutes: 122 }), ++ 0, 0, 0, 0, -1, -1, 0, 0, 0, 0); ++const d2 = Temporal.Duration.from({ hours: 1, seconds: 3721 }); ++TemporalHelpers.assertDuration(d2.subtract({ minutes: 61, nanoseconds: 3722000000001 }), ++ 0, 0, 0, 0, 0, -1, -1, 0, 0, -1); ++TemporalHelpers.assertDuration(duration.subtract({ month: 1, days: 1 }), ++ 0, 0, 0, 2, 1, 10, 0, 0, 0, 0, ++ "incorrectly-spelled properties are ignored"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/options-undefined.js +index 959fb77c613a317e44adc93187a22be7d28cf275..0f6e4ac0e49754d119fa67818060bc60766f23ca 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/options-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/options-undefined.js +@@ -4,10 +4,29 @@ + /*--- + esid: sec-temporal.duration.prototype.subtract + description: Verify that undefined options are handled correctly. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const duration1 = new Temporal.Duration(1); +-const duration2 = new Temporal.Duration(0, 12); +-assert.throws(RangeError, () => duration1.subtract(duration2), "default relativeTo is undefined"); +-assert.throws(RangeError, () => duration1.subtract(duration2, undefined), "default relativeTo is undefined"); ++const duration2 = new Temporal.Duration(0, 24); ++const duration3 = new Temporal.Duration(0, 0, 0, 1); ++const duration4 = new Temporal.Duration(0, 0, 0, 0, 48); ++ ++assert.throws(RangeError, () => duration1.subtract(duration2), "no options with years"); ++TemporalHelpers.assertDuration(duration3.subtract(duration4), ++ 0, 0, 0, /* days = */ -1, 0, 0, 0, 0, 0, 0, ++ "no options with days"); ++ ++const optionValues = [ ++ [undefined, "undefined"], ++ [{}, "plain object"], ++ [() => {}, "lambda"], ++]; ++for (const [options, description] of optionValues) { ++ assert.throws(RangeError, () => duration1.subtract(duration2, options), ++ `options ${description} with years`); ++ TemporalHelpers.assertDuration(duration3.subtract(duration4, options), ++ 0, 0, 0, /* days = */ -1, 0, 0, 0, 0, 0, 0, ++ `options ${description} with days`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4bb257b88b268d6108d8b0385621dc687557265f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.duration.prototype.subtract ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Duration(0, 0, 0, 0, 1); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.subtract({ hours: 1 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c9af63b33b1e8266d48c17de660f4e1c7969f000 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-leap-second.js +@@ -0,0 +1,43 @@ ++// 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.duration.prototype.subtract ++description: Leap second is constrained in both an ISO string and a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 1); ++ ++let relativeTo = "2016-12-31T23:59:60"; ++const result1 = instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }); ++TemporalHelpers.assertDuration( ++ result1, ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainDate relativeTo" ++); ++ ++relativeTo = "2016-12-31T23:59:60+00:00[UTC]"; ++const result2 = instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }); ++TemporalHelpers.assertDuration( ++ result2, ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for ZonedDateTime relativeTo" ++); ++ ++relativeTo = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result3 = instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }); ++TemporalHelpers.assertDuration( ++ result3, ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is valid in a property bag for PlainDate relativeTo" ++); ++ ++relativeTo = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60, timeZone: "UTC" }; ++const result4 = instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }); ++TemporalHelpers.assertDuration( ++ result4, ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is valid in a property bag for ZonedDateTime relativeTo" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-month.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-month.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e54edd86495c8cc4a68ce5277130b3afa52c92e1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-month.js +@@ -0,0 +1,18 @@ ++// 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.duration.prototype.subtract ++description: relativeTo with months. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const oneMonth = new Temporal.Duration(0, 1); ++const days30 = new Temporal.Duration(0, 0, 0, 30); ++TemporalHelpers.assertDuration(oneMonth.subtract(days30, { relativeTo: Temporal.PlainDate.from('2018-02-01') }), ++ 0, 0, 0, -2, 0, 0, 0, 0, 0, 0, "February"); ++TemporalHelpers.assertDuration(oneMonth.subtract(days30, { relativeTo: Temporal.PlainDate.from('2018-03-01') }), ++ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "March"); ++TemporalHelpers.assertDuration(oneMonth.subtract(days30, { relativeTo: Temporal.PlainDate.from('2018-04-01') }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "April"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-number.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..40d11706650f99c6eff7eb20ece49959c6b50737 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-number.js +@@ -0,0 +1,30 @@ ++// 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.duration.prototype.subtract ++description: A number as relativeTo option is converted to a string, then to Temporal.PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 1); ++ ++const relativeTo = 20191101; ++ ++const result = instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }); ++TemporalHelpers.assertDuration(result, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "20191101 is a valid ISO string for relativeTo"); ++ ++const numbers = [ ++ 1, ++ -20191101, ++ 1234567890, ++]; ++ ++for (const relativeTo of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }), ++ `Number ${relativeTo} does not convert to a valid ISO string for relativeTo` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-order.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-order.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cbb51076bc2ed1b15e83f9204ed8db7ef287219d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-order.js +@@ -0,0 +1,16 @@ ++// 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.duration.prototype.subtract ++description: relativeTo with years. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const d1 = new Temporal.Duration(0, 2, 1, 4); ++const d2 = new Temporal.Duration(0, 1, 1, 1); ++const relativeTo = new Temporal.PlainDate(2000, 1, 1); ++TemporalHelpers.assertDuration(d1.subtract(d2, { relativeTo }), ++ 0, 1, 0, 3, 0, 0, 0, 0, 0, 0, ++ "first this is resolved against relativeTo, then the argument against relativeTo + this"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d00e30568fce1a7ef9884348b409b5336312bc6a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.duration.prototype.subtract ++description: A number as calendar in relativeTo property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 1); ++ ++const calendar = 19970327; ++ ++let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++const result1 = instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }); ++TemporalHelpers.assertDuration(result1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for relativeTo.calendar"); ++ ++relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++const result2 = instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }); ++TemporalHelpers.assertDuration(result2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for relativeTo.calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }), ++ `Number ${calendar} does not convert to a valid ISO string for relativeTo.calendar` ++ ); ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }), ++ `Number ${calendar} does not convert to a valid ISO string for relativeTo.calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5f65a27695e296ec0ecdd87608e6edd818b3ade4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-propertybag-calendar-wrong-type.js +@@ -0,0 +1,49 @@ ++// 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.duration.prototype.subtract ++description: > ++ Appropriate error thrown when relativeTo.calendar cannot be converted to a ++ calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Duration(1, 0, 0, 1); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }), `${description} does not convert to a valid ISO string`); ++ ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }), `${description} is not a valid property bag and does not convert to a string`); ++ ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-required.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-required.js +new file mode 100644 +index 0000000000000000000000000000000000000000..893a9e11f521b48730884e644201805f8f38bbf4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-required.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. ++ ++/*--- ++esid: sec-temporal.duration.prototype.subtract ++description: relativeTo is required if the largest unit is at least weeks. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const d = Temporal.Duration.from({ hours: 1 }); ++const dy = Temporal.Duration.from({ years: 1, hours: 1 }); ++const dm = Temporal.Duration.from({ months: 1, hours: 1 }); ++const dw = Temporal.Duration.from({ weeks: 1, hours: 1 }); ++assert.throws(RangeError, () => d.subtract(dy)); ++assert.throws(RangeError, () => d.subtract(dm)); ++assert.throws(RangeError, () => d.subtract(dw)); ++assert.throws(RangeError, () => dy.subtract(d)); ++assert.throws(RangeError, () => dm.subtract(d)); ++assert.throws(RangeError, () => dw.subtract(d)); ++const relativeTo = Temporal.PlainDate.from("2000-01-01"); ++TemporalHelpers.assertDuration(d.subtract(dy, { relativeTo }), ++ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(d.subtract(dm, { relativeTo }), ++ 0, -1, 0, 0, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(d.subtract(dw, { relativeTo }), ++ 0, 0, -1, 0, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(dy.subtract(d, { relativeTo }), ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(dm.subtract(d, { relativeTo }), ++ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(dw.subtract(d, { relativeTo }), ++ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..45118c033d9b9c17e307d4e51827b0d274d1c548 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-wrong-type.js +@@ -0,0 +1,39 @@ ++// 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.duration.prototype.subtract ++description: > ++ Appropriate error thrown when relativeTo cannot be converted to a valid ++ relativeTo string or property bag ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Duration(1, 0, 0, 1); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [relativeTo, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [relativeTo, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo }), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-year.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-year.js +new file mode 100644 +index 0000000000000000000000000000000000000000..86a4090f9324736b88ccb314d007878fe7360c08 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/relativeto-year.js +@@ -0,0 +1,16 @@ ++// 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.duration.prototype.subtract ++description: relativeTo with years. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const oneYear = new Temporal.Duration(1); ++const days365 = new Temporal.Duration(0, 0, 0, 365); ++TemporalHelpers.assertDuration(oneYear.subtract(days365, { relativeTo: Temporal.PlainDate.from("2017-01-01") }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "non-leap year"); ++TemporalHelpers.assertDuration(oneYear.subtract(days365, { relativeTo: Temporal.PlainDate.from("2016-01-01") }), ++ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, "leap year"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5cd39edc248c0e254f862cd31582d1fb11701121 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-leap-second.js +@@ -0,0 +1,21 @@ ++// 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.duration.prototype.subtract ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// A string with a leap second is a valid ISO string, so the following two ++// operations should not throw ++ ++instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }); ++instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..251016b4322060b4df609d7cea7f33df0496f738 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.duration.prototype.subtract ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Duration(1); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3f6d1f020d4465ee2741434b5b81a4c6725ff1ea +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/subtract/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.duration.prototype.subtract ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(1), { relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toJSON/basic.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toJSON/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8cadc51661c8de2daebe0dcacefd21063cc7e20b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toJSON/basic.js +@@ -0,0 +1,240 @@ ++// 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.duration.prototype.tojson ++description: Temporal.Duration.prototype.toJSON will return correct iso8601 string for the given duration. ++info: | ++ 1. Let duration be the this value. ++ 2. Perform ? RequireInternalSlot(duration, [[InitializedTemporalDuration]]). ++ 3. Return ! TemporalDurationToString(duration.[[Years]], duration.[[Months]], duration.[[Weeks]], duration.[[Days]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]], "auto"). ++features: [Temporal] ++---*/ ++ ++let d = new Temporal.Duration(); ++assert.sameValue(d.toJSON(), "PT0S", "zero duration"); ++ ++d = new Temporal.Duration(1); ++assert.sameValue(d.toJSON(), "P1Y", "positive small years"); ++d = new Temporal.Duration(-1); ++assert.sameValue(d.toJSON(), "-P1Y", "negative small years"); ++d = new Temporal.Duration(1234567890); ++assert.sameValue(d.toJSON(), "P1234567890Y", "positive large years"); ++d = new Temporal.Duration(-1234567890); ++assert.sameValue(d.toJSON(), "-P1234567890Y", "negative large years"); ++ ++d = new Temporal.Duration(1, 2); ++assert.sameValue(d.toJSON(), "P1Y2M", "positive years and months"); ++d = new Temporal.Duration(-1, -2); ++assert.sameValue(d.toJSON(), "-P1Y2M", "negative years and months"); ++d = new Temporal.Duration(0, 2); ++assert.sameValue(d.toJSON(), "P2M", "positive small months"); ++d = new Temporal.Duration(0,-2); ++assert.sameValue(d.toJSON(), "-P2M", "negative small months"); ++d = new Temporal.Duration(0, 1234567890); ++assert.sameValue(d.toJSON(), "P1234567890M", "positive large months"); ++d = new Temporal.Duration(0,-1234567890); ++assert.sameValue(d.toJSON(), "-P1234567890M", "negative large months"); ++ ++d = new Temporal.Duration(1, 2, 3); ++assert.sameValue(d.toJSON(), "P1Y2M3W", "positive years, months, weeks"); ++d = new Temporal.Duration(-1, -2, -3); ++assert.sameValue(d.toJSON(), "-P1Y2M3W", "negative years, months, weeks"); ++d = new Temporal.Duration(0, 0, 3); ++assert.sameValue(d.toJSON(), "P3W", "positive small weeks"); ++d = new Temporal.Duration(0, 0, -3); ++assert.sameValue(d.toJSON(), "-P3W", "negative small weeks"); ++d = new Temporal.Duration(1, 0, 3); ++assert.sameValue(d.toJSON(), "P1Y3W", "positive years and weeks"); ++d = new Temporal.Duration(-1, 0, -3); ++assert.sameValue(d.toJSON(), "-P1Y3W", "negative years and weeks"); ++d = new Temporal.Duration(0, 2, 3); ++assert.sameValue(d.toJSON(), "P2M3W", "positive months and weeks"); ++d = new Temporal.Duration(0, -2, -3); ++assert.sameValue(d.toJSON(), "-P2M3W", "negative months and weeks"); ++d = new Temporal.Duration(0, 0, 1234567890); ++assert.sameValue(d.toJSON(), "P1234567890W", "positive large weeks"); ++d = new Temporal.Duration(0, 0, -1234567890); ++assert.sameValue(d.toJSON(), "-P1234567890W", "negative large weeks"); ++ ++d = new Temporal.Duration(1, 2, 3, 4); ++assert.sameValue(d.toJSON(), "P1Y2M3W4D", "positive years, months, weeks, days"); ++d = new Temporal.Duration(-1, -2, -3, -4); ++assert.sameValue(d.toJSON(), "-P1Y2M3W4D", "negative years, months, weeks, days"); ++d = new Temporal.Duration(0, 0, 0, 1234567890); ++assert.sameValue(d.toJSON(), "P1234567890D", "positive large days"); ++d = new Temporal.Duration(0, 0, 0, -1234567890); ++assert.sameValue(d.toJSON(), "-P1234567890D", "negative large days"); ++d = new Temporal.Duration(0, 0, 0, 4); ++assert.sameValue(d.toJSON(), "P4D", "positive small days"); ++d = new Temporal.Duration(0, 0, 0, -4); ++assert.sameValue(d.toJSON(), "-P4D", "negative small days"); ++d = new Temporal.Duration(1, 0, 0, 4); ++assert.sameValue(d.toJSON(), "P1Y4D", "positive years and days"); ++d = new Temporal.Duration(-1, 0, 0, -4); ++assert.sameValue(d.toJSON(), "-P1Y4D", "negative years and days"); ++d = new Temporal.Duration(0, 2, 0, 4); ++assert.sameValue(d.toJSON(), "P2M4D", "positive months and days"); ++d = new Temporal.Duration(0, -2, 0, -4); ++assert.sameValue(d.toJSON(), "-P2M4D", "negative months and days"); ++d = new Temporal.Duration(0, 0, 3, 4); ++assert.sameValue(d.toJSON(), "P3W4D", "positive weeks and days"); ++d = new Temporal.Duration(0, 0, -3, -4); ++assert.sameValue(d.toJSON(), "-P3W4D", "negative weeks and days"); ++ ++d = new Temporal.Duration(0, 0, 0, 0, 5); ++assert.sameValue(d.toJSON(), "PT5H", "positive hours"); ++d = new Temporal.Duration(0, 0, 0, 0, -5); ++assert.sameValue(d.toJSON(), "-PT5H", "negative hours"); ++d = new Temporal.Duration(1, 0, 0, 0, 5); ++assert.sameValue(d.toJSON(), "P1YT5H", "positive years and hours"); ++d = new Temporal.Duration(-1, 0, 0, 0, -5); ++assert.sameValue(d.toJSON(), "-P1YT5H", "negative years and hours"); ++d = new Temporal.Duration(0, 2, 0, 0, 5); ++assert.sameValue(d.toJSON(), "P2MT5H", "positive months and hours"); ++d = new Temporal.Duration(0, -2, 0, 0, -5); ++assert.sameValue(d.toJSON(), "-P2MT5H", "negative months and hours"); ++ ++d = new Temporal.Duration(0, 0, 0, 0, 0, 6); ++assert.sameValue(d.toJSON(), "PT6M", "positive minutes"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, -6); ++assert.sameValue(d.toJSON(), "-PT6M", "negative minutes"); ++d = new Temporal.Duration(0, 0, 0, 0, 5, 6); ++assert.sameValue(d.toJSON(), "PT5H6M", "positive hours and minutes"); ++d = new Temporal.Duration(0, 0, 0, 0, -5, -6); ++assert.sameValue(d.toJSON(), "-PT5H6M", "negative hours and minutes"); ++d = new Temporal.Duration(0, 0, 3, 0, 0, 6); ++assert.sameValue(d.toJSON(), "P3WT6M", "positive weeks and minutes"); ++d = new Temporal.Duration(0, 0, -3, 0, 0, -6); ++assert.sameValue(d.toJSON(), "-P3WT6M", "negative weeks and minutes"); ++d = new Temporal.Duration(0, 0, 0, 4, 0, 6); ++assert.sameValue(d.toJSON(), "P4DT6M", "positive days and minutes"); ++d = new Temporal.Duration(0, 0, 0, -4, 0, -6); ++assert.sameValue(d.toJSON(), "-P4DT6M", "negative days and minutes"); ++ ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 7); ++assert.sameValue(d.toJSON(), "PT7S", "positive seconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, -7); ++assert.sameValue(d.toJSON(), "-PT7S", "negative seconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 5, 0, 7); ++assert.sameValue(d.toJSON(), "PT5H7S", "positive hours and seconds"); ++d = new Temporal.Duration(0, 0, 0, 0, -5, 0, -7); ++assert.sameValue(d.toJSON(), "-PT5H7S", "negative hours and seconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 6, 7); ++assert.sameValue(d.toJSON(), "PT6M7S", "positive minutes and seconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, -6, -7); ++assert.sameValue(d.toJSON(), "-PT6M7S", "negative minutes and seconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 5, 6, 7); ++assert.sameValue(d.toJSON(), "PT5H6M7S", "positive hours, minutes, seconds"); ++d = new Temporal.Duration(0, 0, 0, 0, -5, -6, -7); ++assert.sameValue(d.toJSON(), "-PT5H6M7S", "negative hours, minutes, seconds"); ++d = new Temporal.Duration(1, 0, 0, 0, 5, 6, 7); ++assert.sameValue(d.toJSON(), "P1YT5H6M7S", "positive years, hours, minutes, seconds"); ++d = new Temporal.Duration(-1, 0, 0, 0, -5, -6, -7); ++assert.sameValue(d.toJSON(), "-P1YT5H6M7S", "negative years, hours, minutes, seconds"); ++ ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 8); ++assert.sameValue(d.toJSON(), "PT0.008S", "positive milliseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -8); ++assert.sameValue(d.toJSON(), "-PT0.008S", "negative milliseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 80); ++assert.sameValue(d.toJSON(), "PT0.08S", "positive milliseconds multiple of 10"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -80); ++assert.sameValue(d.toJSON(), "-PT0.08S", "negative milliseconds multiple of 10"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 87); ++assert.sameValue(d.toJSON(), "PT0.087S", "positive two-digit milliseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -87); ++assert.sameValue(d.toJSON(), "-PT0.087S", "negative two-digit milliseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 876); ++assert.sameValue(d.toJSON(), "PT0.876S", "positive three-digit milliseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -876); ++assert.sameValue(d.toJSON(), "-PT0.876S", "negative three-digit milliseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 876543); ++assert.sameValue(d.toJSON(), "PT876.543S", "positive large milliseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -876543); ++assert.sameValue(d.toJSON(), "-PT876.543S", "negative large milliseconds"); ++ ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 9); ++assert.sameValue(d.toJSON(), "PT0.000009S", "positive microseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -9); ++assert.sameValue(d.toJSON(), "-PT0.000009S", "negative microseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 90); ++assert.sameValue(d.toJSON(), "PT0.00009S", "positive microseconds multiple of 10"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -90); ++assert.sameValue(d.toJSON(), "-PT0.00009S", "negative microseconds multiple of 10"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 98); ++assert.sameValue(d.toJSON(), "PT0.000098S", "positive two-digit microseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -98); ++assert.sameValue(d.toJSON(), "-PT0.000098S", "negative two-digit microseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 900); ++assert.sameValue(d.toJSON(), "PT0.0009S", "positive microseconds multiple of 100"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -900); ++assert.sameValue(d.toJSON(), "-PT0.0009S", "negative microseconds multiple of 100"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 987); ++assert.sameValue(d.toJSON(), "PT0.000987S", "positive three-digit microseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -987); ++assert.sameValue(d.toJSON(), "-PT0.000987S", "negative three-digit microseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 987654); ++assert.sameValue(d.toJSON(), "PT0.987654S", "positive large microseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -987654); ++assert.sameValue(d.toJSON(), "-PT0.987654S", "negative large microseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 987654321); ++assert.sameValue(d.toJSON(), "PT987.654321S", "positive larger microseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, -987654321); ++assert.sameValue(d.toJSON(), "-PT987.654321S", "negative larger microseconds"); ++ ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, 1); ++assert.sameValue(d.toJSON(), "PT0.000000001S", "positive nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -1); ++assert.sameValue(d.toJSON(), "-PT0.000000001S", "negative nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, 10); ++assert.sameValue(d.toJSON(), "PT0.00000001S", "positive nanoseconds multiple of 10"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -10); ++assert.sameValue(d.toJSON(), "-PT0.00000001S", "negative nanoseconds multiple of 10"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, 12); ++assert.sameValue(d.toJSON(), "PT0.000000012S", "positive two-digit nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -12); ++assert.sameValue(d.toJSON(), "-PT0.000000012S", "negative two-digit nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, 100); ++assert.sameValue(d.toJSON(), "PT0.0000001S", "positive nanoseconds multiple of 100"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -100); ++assert.sameValue(d.toJSON(), "-PT0.0000001S", "negative nanoseconds multiple of 100"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, 123); ++assert.sameValue(d.toJSON(), "PT0.000000123S", "positive three-digit nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -123); ++assert.sameValue(d.toJSON(), "-PT0.000000123S", "negative three-digit nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, 123456); ++assert.sameValue(d.toJSON(), "PT0.000123456S", "positive large nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -123456); ++assert.sameValue(d.toJSON(), "-PT0.000123456S", "negative large nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, 123456789); ++assert.sameValue(d.toJSON(), "PT0.123456789S", "positive larger nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -123456789); ++assert.sameValue(d.toJSON(), "-PT0.123456789S", "negative larger nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, 1234567891); ++assert.sameValue(d.toJSON(), "PT1.234567891S", "positive even larger nanoseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 0, 0, -1234567891); ++assert.sameValue(d.toJSON(), "-PT1.234567891S", "negative even larger nanoseconds"); ++ ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 4, 3, 2, 1); ++assert.sameValue(d.toJSON(), "PT4.003002001S", "positive seconds and subseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, -4, -3, -2, -1); ++assert.sameValue(d.toJSON(), "-PT4.003002001S", "negative seconds and subseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 4, 3, 2, 90001); ++assert.sameValue(d.toJSON(), "PT4.003092001S", "positive seconds and large subseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, -4, -3, -2, -90001); ++assert.sameValue(d.toJSON(), "-PT4.003092001S", "negative seconds and large subseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, 4, 3, 2, 90080001); ++assert.sameValue(d.toJSON(), "PT4.093082001S", "positive seconds and larger subseconds"); ++d = new Temporal.Duration(0, 0, 0, 0, 0, 0, -4, -3, -2, -90080001); ++assert.sameValue(d.toJSON(), "-PT4.093082001S", "negative seconds and larger subseconds"); ++ ++d = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9, 1); ++assert.sameValue(d.toJSON(), "P1Y2M3W4DT5H6M7.008009001S", "all fields positive"); ++d = new Temporal.Duration(-1, -2, -3, -4, -5, -6, -7, -8, -9, -1); ++assert.sameValue(d.toJSON(), "-P1Y2M3W4DT5H6M7.008009001S", "all fields negative"); ++ ++d = new Temporal.Duration(1234, 2345, 3456, 4567, 5678, 6789, 7890, 890, 901, 123); ++assert.sameValue(d.toJSON(), "P1234Y2345M3456W4567DT5678H6789M7890.890901123S", "all fields large and positive"); ++d = new Temporal.Duration(-1234, -2345, -3456, -4567, -5678, -6789, -7890, -890, -901, -123); ++assert.sameValue(d.toJSON(), "-P1234Y2345M3456W4567DT5678H6789M7890.890901123S", "all fields large and negative"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toJSON/options.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toJSON/options.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7728dcc2e2e596d6203d44a54efaeeb3a0809112 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toJSON/options.js +@@ -0,0 +1,18 @@ ++// 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.duration.prototype.tojson ++description: Temporal.Duration.prototype.toJSON does not support options, unlike toString. ++features: [Temporal] ++---*/ ++ ++let called = 0; ++const options = new Proxy({}, { ++ get() { ++ ++called; ++ } ++}); ++const d = new Temporal.Duration(1, 2); ++assert.sameValue(d.toJSON(options), "P1Y2M"); ++assert.sameValue(called, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/balance.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/balance.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f66832a0c957d8795c93d70bd910416d8abb28b6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/balance.js +@@ -0,0 +1,24 @@ ++// 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.duration.prototype.tostring ++description: Verify that values are balanced correctly. ++features: [Temporal] ++---*/ ++ ++assert.sameValue( ++ Temporal.Duration.from({ milliseconds: 3500 }).toString(), ++ "PT3.5S"); ++assert.sameValue( ++ Temporal.Duration.from({ microseconds: 3500 }).toString(), ++ "PT0.0035S"); ++assert.sameValue( ++ Temporal.Duration.from({ nanoseconds: 3500 }).toString(), ++ "PT0.0000035S"); ++assert.sameValue( ++ new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 1111, 1111, 1111).toString(), ++ "PT1.112112111S"); ++assert.sameValue( ++ Temporal.Duration.from({ seconds: 120, milliseconds: 3500 }).toString(), ++ "PT123.5S"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-auto.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-auto.js +new file mode 100644 +index 0000000000000000000000000000000000000000..941b9dce931f2303e42ff57e5fb3d11cf8b1628d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-auto.js +@@ -0,0 +1,21 @@ ++// 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.duration.prototype.tostring ++description: auto value for fractionalSecondDigits option ++features: [Temporal] ++---*/ ++ ++const wholeSeconds = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7); ++const subSeconds = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 987, 650); ++ ++const tests = [ ++ [wholeSeconds, "P1Y2M3W4DT5H6M7S"], ++ [subSeconds, "P1Y2M3W4DT5H6M7.98765S"], ++]; ++ ++for (const [duration, expected] of tests) { ++ assert.sameValue(duration.toString(), expected, "default is to emit seconds and drop trailing zeroes"); ++ assert.sameValue(duration.toString({ fractionalSecondDigits: "auto" }), expected, "auto is the default"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-invalid-string.js +index 1cb51f820eb1e58c59bd66cf7c413f6fb56ff5d8..5af9938e232d9d8a34961ab83caf3f8c7d76b49b 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-invalid-string.js +@@ -16,4 +16,7 @@ features: [Temporal] + + const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 987, 650, 0); + +-assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: "other string" })); ++for (const fractionalSecondDigits of ["other string", "AUTO", "not-auto", "autos", "auto\0"]) { ++ assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits }), ++ `"${fractionalSecondDigits}" is not a valid value for fractionalSecondDigits`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-number.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..764986cb2e45fb4148061adf43996350186c4dfa +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-number.js +@@ -0,0 +1,28 @@ ++// 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.duration.prototype.tostring ++description: Number for fractionalSecondDigits option ++features: [Temporal] ++---*/ ++ ++const wholeSeconds = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7); ++const subSeconds = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 987, 650); ++ ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 0 }), "P1Y2M3W4DT5H6M7S", ++ "truncates 4 decimal places to 0"); ++assert.sameValue(wholeSeconds.toString({ fractionalSecondDigits: 2 }), "P1Y2M3W4DT5H6M7.00S", ++ "pads whole seconds to 2 decimal places"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 2 }), "P1Y2M3W4DT5H6M7.98S", ++ "truncates 4 decimal places to 2"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 3 }), "P1Y2M3W4DT5H6M7.987S", ++ "truncates 4 decimal places to 3"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 6 }), "P1Y2M3W4DT5H6M7.987650S", ++ "pads 4 decimal places to 6"); ++assert.sameValue(wholeSeconds.toString({ fractionalSecondDigits: 7 }), "P1Y2M3W4DT5H6M7.0000000S", ++ "pads whole seconds to 7 decimal places"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 7 }), "P1Y2M3W4DT5H6M7.9876500S", ++ "pads 4 decimal places to 7"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 9 }), "P1Y2M3W4DT5H6M7.987650000S", ++ "pads 4 decimal places to 9"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-out-of-range.js +index d9f4837d3cbc58383fa1dcfdc896a8cac6763e92..ab73ad69bd1c6c63dc2a04d2e0327618769f6178 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-out-of-range.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-out-of-range.js +@@ -16,5 +16,11 @@ features: [Temporal] + + const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 987, 650, 0); + +-assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: -1 })); +-assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: 10 })); ++assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: -Infinity }), ++ "−∞ is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: -1 }), ++ "−1 is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: 10 }), ++ "10 is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: Infinity }), ++ "∞ is out of range for fractionalSecondDigits"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-undefined.js +index 2c3af23ae926fa68270726ce22d0187927c8cf7b..292b8df300abf3a83b470b1f14e49cd41438406e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-undefined.js +@@ -16,10 +16,21 @@ info: | + features: [Temporal] + ---*/ + +-const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 987, 650, 0); ++const wholeSeconds = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7); ++const subSeconds = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 987, 650); + +-const explicit = duration.toString({ fractionalSecondDigits: undefined }); +-assert.sameValue(explicit, "P1Y2M3W4DT5H6M7.98765S", "default fractionalSecondDigits is auto"); ++const tests = [ ++ [wholeSeconds, "P1Y2M3W4DT5H6M7S"], ++ [subSeconds, "P1Y2M3W4DT5H6M7.98765S"], ++]; + +-const implicit = duration.toString({}); +-assert.sameValue(implicit, "P1Y2M3W4DT5H6M7.98765S", "default fractionalSecondDigits is auto"); ++for (const [duration, expected] of tests) { ++ const explicit = duration.toString({ fractionalSecondDigits: undefined }); ++ assert.sameValue(explicit, expected, "default fractionalSecondDigits is auto (property present but undefined)"); ++ ++ const implicit = duration.toString({}); ++ assert.sameValue(implicit, expected, "default fractionalSecondDigits is auto (property not present)"); ++ ++ const lambda = duration.toString(() => {}); ++ assert.sameValue(lambda, expected, "default fractionalSecondDigits is auto (property not present, function object)"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-wrong-type.js +index 143de7c3440c194dd145dc16b93f9f4596388179..625daaff1da98ab27eb6248d2ff4deeb7706b9e9 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-wrong-type.js +@@ -22,4 +22,26 @@ features: [Temporal] + ---*/ + + const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 987, 650, 0); +-TemporalHelpers.checkFractionalSecondDigitsOptionWrongType(duration); ++ ++assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: null }), ++ "null is not a number and converts to the string 'null' which is not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: true }), ++ "true is not a number and converts to the string 'true' which is not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: false }), ++ "false is not a number and converts to the string 'false' which is not valid for fractionalSecondDigits"); ++assert.throws(TypeError, () => duration.toString({ fractionalSecondDigits: Symbol() }), ++ "symbols are not numbers and cannot convert to strings"); ++assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: 2n }), ++ "bigints are not numbers and convert to strings which are not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => duration.toString({ fractionalSecondDigits: {} }), ++ "plain objects are not numbers and convert to strings which are not valid for fractionalSecondDigits"); ++ ++const expected = [ ++ "get fractionalSecondDigits.toString", ++ "call fractionalSecondDigits.toString", ++]; ++const actual = []; ++const observer = TemporalHelpers.toPrimitiveObserver(actual, "auto", "fractionalSecondDigits"); ++const result = duration.toString({ fractionalSecondDigits: observer }); ++assert.sameValue(result, "P1Y2M3W4DT5H6M7.98765S", "object with toString uses toString return value"); ++assert.compareArray(actual, expected, "object with toString calls toString and not valueOf"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/negative-components.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/negative-components.js +index 7bfc8232a52c6c9157ae4749309eddf6efdb66f1..2022f4bd4f44cbde57cf712cbeedfda635bc9871 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/negative-components.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/negative-components.js +@@ -6,6 +6,33 @@ esid: sec-temporal.duration.prototype.tostring + description: Temporal.Duration.toString handles negative components + features: [Temporal] + ---*/ +-const d = new Temporal.Duration(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1); +-const expected = "-P1Y1M1W1DT1H1M1.001001001S"; +-assert.sameValue(d.toString(), expected, "toString with negative components"); ++assert.sameValue( ++ new Temporal.Duration(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1).toString(), ++ "-P1Y1M1W1DT1H1M1.001001001S"); ++assert.sameValue( ++ Temporal.Duration.from({ milliseconds: -250 }).toString(), ++ "-PT0.25S"); ++assert.sameValue( ++ Temporal.Duration.from({ milliseconds: -3500 }).toString(), ++ "-PT3.5S"); ++assert.sameValue( ++ Temporal.Duration.from({ microseconds: -250 }).toString(), ++ "-PT0.00025S"); ++assert.sameValue( ++ Temporal.Duration.from({ microseconds: -3500 }).toString(), ++ "-PT0.0035S"); ++assert.sameValue( ++ Temporal.Duration.from({ nanoseconds: -250 }).toString(), ++ "-PT0.00000025S"); ++assert.sameValue( ++ Temporal.Duration.from({ nanoseconds: -3500 }).toString(), ++ "-PT0.0000035S"); ++assert.sameValue( ++ new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -1111, -1111, -1111).toString(), ++ "-PT1.112112111S"); ++assert.sameValue( ++ Temporal.Duration.from({ seconds: -120, milliseconds: -3500 }).toString(), ++ "-PT123.5S"); ++assert.sameValue( ++ Temporal.Duration.from({ weeks: -1, days: -1 }).toString(), ++ "-P1W1D"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7cd68050a11b1a7edbe656f847af1a89ec6bc8a1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.duration.prototype.tostring ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Duration(0, 0, 0, 0, 1); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.toString(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-ceil.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-ceil.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cdef0c527419ce2ce16bca2cdb7a1d991e1609e5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-ceil.js +@@ -0,0 +1,34 @@ ++// 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.duration.prototype.tostring ++description: ceil value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 123, 987, 500); ++ ++const result1 = duration.toString({ smallestUnit: "microsecond", roundingMode: "ceil" }); ++assert.sameValue(result1, "P1Y2M3W4DT5H6M7.123988S", ++ "roundingMode is ceil (with 6 digits from smallestUnit)"); ++ ++const result2 = duration.toString({ fractionalSecondDigits: 6, roundingMode: "ceil" }); ++assert.sameValue(result2, "P1Y2M3W4DT5H6M7.123988S", ++ "roundingMode is ceil (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = duration.toString({ smallestUnit: "millisecond", roundingMode: "ceil" }); ++assert.sameValue(result3, "P1Y2M3W4DT5H6M7.124S", ++ "roundingMode is ceil (with 3 digits from smallestUnit)"); ++ ++const result4 = duration.toString({ fractionalSecondDigits: 3, roundingMode: "ceil" }); ++assert.sameValue(result4, "P1Y2M3W4DT5H6M7.124S", ++ "roundingMode is ceil (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = duration.toString({ smallestUnit: "second", roundingMode: "ceil" }); ++assert.sameValue(result5, "P1Y2M3W4DT5H6M8S", ++ "roundingMode is ceil (with 0 digits from smallestUnit)"); ++ ++const result6 = duration.toString({ fractionalSecondDigits: 0, roundingMode: "ceil" }); ++assert.sameValue(result6, "P1Y2M3W4DT5H6M8S", ++ "roundingMode is ceil (with 0 digits from fractionalSecondDigits)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-floor.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-floor.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e1ee18b5c8e950eafae6cced658caef9d53ba78f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-floor.js +@@ -0,0 +1,34 @@ ++// 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.duration.prototype.tostring ++description: floor value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 123, 987, 500); ++ ++const result1 = duration.toString({ smallestUnit: "microsecond", roundingMode: "floor" }); ++assert.sameValue(result1, "P1Y2M3W4DT5H6M7.123987S", ++ "roundingMode is floor (with 6 digits from smallestUnit)"); ++ ++const result2 = duration.toString({ fractionalSecondDigits: 6, roundingMode: "floor" }); ++assert.sameValue(result2, "P1Y2M3W4DT5H6M7.123987S", ++ "roundingMode is floor (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = duration.toString({ smallestUnit: "millisecond", roundingMode: "floor" }); ++assert.sameValue(result3, "P1Y2M3W4DT5H6M7.123S", ++ "roundingMode is floor (with 3 digits from smallestUnit)"); ++ ++const result4 = duration.toString({ fractionalSecondDigits: 3, roundingMode: "floor" }); ++assert.sameValue(result4, "P1Y2M3W4DT5H6M7.123S", ++ "roundingMode is floor (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = duration.toString({ smallestUnit: "second", roundingMode: "floor" }); ++assert.sameValue(result5, "P1Y2M3W4DT5H6M7S", ++ "roundingMode is floor (with 0 digits from smallestUnit)"); ++ ++const result6 = duration.toString({ fractionalSecondDigits: 0, roundingMode: "floor" }); ++assert.sameValue(result6, "P1Y2M3W4DT5H6M7S", ++ "roundingMode is floor (with 0 digits from fractionalSecondDigits)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-halfExpand.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-halfExpand.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9a11468a1265f22f98884d8501c418682ac71801 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-halfExpand.js +@@ -0,0 +1,34 @@ ++// 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.duration.prototype.tostring ++description: halfExpand value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 123, 987, 500); ++ ++const result1 = duration.toString({ smallestUnit: "microsecond", roundingMode: "halfExpand" }); ++assert.sameValue(result1, "P1Y2M3W4DT5H6M7.123988S", ++ "roundingMode is halfExpand (with 6 digits from smallestUnit)"); ++ ++const result2 = duration.toString({ fractionalSecondDigits: 6, roundingMode: "halfExpand" }); ++assert.sameValue(result2, "P1Y2M3W4DT5H6M7.123988S", ++ "roundingMode is halfExpand (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = duration.toString({ smallestUnit: "millisecond", roundingMode: "halfExpand" }); ++assert.sameValue(result3, "P1Y2M3W4DT5H6M7.124S", ++ "roundingMode is halfExpand (with 3 digits from smallestUnit)"); ++ ++const result4 = duration.toString({ fractionalSecondDigits: 3, roundingMode: "halfExpand" }); ++assert.sameValue(result4, "P1Y2M3W4DT5H6M7.124S", ++ "roundingMode is halfExpand (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = duration.toString({ smallestUnit: "second", roundingMode: "halfExpand" }); ++assert.sameValue(result5, "P1Y2M3W4DT5H6M7S", ++ "roundingMode is halfExpand (with 0 digits from smallestUnit)"); ++ ++const result6 = duration.toString({ fractionalSecondDigits: 0, roundingMode: "halfExpand" }); ++assert.sameValue(result6, "P1Y2M3W4DT5H6M7S", ++ "roundingMode is halfExpand (with 0 digits from fractionalSecondDigits)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-invalid-string.js +index 983b9a25b6768ad1664e4a30c99e4be31daf80c9..f1015122ce927650543ed4714eacd89232320f9c 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-invalid-string.js +@@ -8,4 +8,6 @@ features: [Temporal] + ---*/ + + const duration = new Temporal.Duration(0, 0, 0, 0, 12, 34, 56, 123, 987, 500); +-assert.throws(RangeError, () => duration.toString({ smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => duration.toString({ smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-trunc.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-trunc.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3b66fb5201a3aa0e1ba604658453ac5075743bc2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/roundingmode-trunc.js +@@ -0,0 +1,34 @@ ++// 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.duration.prototype.tostring ++description: trunc value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 123, 987, 500); ++ ++const result1 = duration.toString({ smallestUnit: "microsecond", roundingMode: "trunc" }); ++assert.sameValue(result1, "P1Y2M3W4DT5H6M7.123987S", ++ "roundingMode is trunc (with 6 digits from smallestUnit)"); ++ ++const result2 = duration.toString({ fractionalSecondDigits: 6, roundingMode: "trunc" }); ++assert.sameValue(result2, "P1Y2M3W4DT5H6M7.123987S", ++ "roundingMode is trunc (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = duration.toString({ smallestUnit: "millisecond", roundingMode: "trunc" }); ++assert.sameValue(result3, "P1Y2M3W4DT5H6M7.123S", ++ "roundingMode is trunc (with 3 digits from smallestUnit)"); ++ ++const result4 = duration.toString({ fractionalSecondDigits: 3, roundingMode: "trunc" }); ++assert.sameValue(result4, "P1Y2M3W4DT5H6M7.123S", ++ "roundingMode is trunc (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = duration.toString({ smallestUnit: "second", roundingMode: "trunc" }); ++assert.sameValue(result5, "P1Y2M3W4DT5H6M7S", ++ "roundingMode is trunc (with 0 digits from smallestUnit)"); ++ ++const result6 = duration.toString({ fractionalSecondDigits: 0, roundingMode: "trunc" }); ++assert.sameValue(result6, "P1Y2M3W4DT5H6M7S", ++ "roundingMode is trunc (with 0 digits from fractionalSecondDigits)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-fractionalseconddigits.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-fractionalseconddigits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..19d105238019b99516a4a522eb5e1894ad548191 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-fractionalseconddigits.js +@@ -0,0 +1,29 @@ ++// 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.duration.prototype.tostring ++description: fractionalSecondDigits option is not used with smallestUnit present ++features: [Temporal] ++---*/ ++ ++const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 789, 999, 999); ++const tests = [ ++ ["second", "P1Y2M3W4DT5H6M7S"], ++ ["millisecond", "P1Y2M3W4DT5H6M7.789S"], ++ ["microsecond", "P1Y2M3W4DT5H6M7.789999S"], ++ ["nanosecond", "P1Y2M3W4DT5H6M7.789999999S"], ++]; ++ ++for (const [smallestUnit, expected] of tests) { ++ const string = duration.toString({ ++ smallestUnit, ++ get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") } ++ }); ++ assert.sameValue(string, expected, `smallestUnit: "${smallestUnit}" overrides fractionalSecondDigits`); ++} ++ ++assert.throws(RangeError, () => duration.toString({ ++ smallestUnit: "hour", ++ get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") } ++}), "hour is an invalid smallestUnit but still overrides fractionalSecondDigits"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-invalid-string.js +index b41620c1f4d408ef0b3af5f4b68579c71cc0fefb..5405996c5df963f78a34d84a5caee4a712be5b9b 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-invalid-string.js +@@ -8,4 +8,32 @@ features: [Temporal] + ---*/ + + const duration = new Temporal.Duration(0, 0, 0, 0, 12, 34, 56, 123, 987, 500); +-assert.throws(RangeError, () => duration.toString({ smallestUnit: "other string" })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "hour", ++ "minute", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "hours", ++ "minutes", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => duration.toString({ smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-valid-units.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-valid-units.js +index fce836b31b148133045787378226bb5724602e20..24880177e230b52772edc130176891e815458a1d 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-valid-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/toString/smallestunit-valid-units.js +@@ -9,12 +9,37 @@ features: [Temporal] + + const duration = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 987, 654, 321); + +-assert.sameValue(duration.toString({ smallestUnit: "second" }), "P1Y2M3W4DT5H6M7S"); +-assert.sameValue(duration.toString({ smallestUnit: "millisecond" }), "P1Y2M3W4DT5H6M7.987S"); +-assert.sameValue(duration.toString({ smallestUnit: "microsecond" }), "P1Y2M3W4DT5H6M7.987654S"); +-assert.sameValue(duration.toString({ smallestUnit: "nanosecond" }), "P1Y2M3W4DT5H6M7.987654321S"); ++function test(instance, expectations, description) { ++ for (const [smallestUnit, expectedResult] of expectations) { ++ assert.sameValue(instance.toString({ smallestUnit }), expectedResult, ++ `${description} with smallestUnit "${smallestUnit}"`); ++ } ++} ++ ++test( ++ duration, ++ [ ++ ["seconds", "P1Y2M3W4DT5H6M7S"], ++ ["milliseconds", "P1Y2M3W4DT5H6M7.987S"], ++ ["microseconds", "P1Y2M3W4DT5H6M7.987654S"], ++ ["nanoseconds", "P1Y2M3W4DT5H6M7.987654321S"], ++ ], ++ "subseconds toString" ++); ++ ++test( ++ new Temporal.Duration(1, 2, 3, 4, 5, 6, 7), ++ [ ++ ["seconds", "P1Y2M3W4DT5H6M7S"], ++ ["milliseconds", "P1Y2M3W4DT5H6M7.000S"], ++ ["microseconds", "P1Y2M3W4DT5H6M7.000000S"], ++ ["nanoseconds", "P1Y2M3W4DT5H6M7.000000000S"], ++ ], ++ "whole seconds toString" ++); + + const notValid = [ ++ "era", + "year", + "month", + "week", +@@ -24,5 +49,6 @@ const notValid = [ + ]; + + notValid.forEach((smallestUnit) => { +- assert.throws(RangeError, () => duration.toString({ smallestUnit }), smallestUnit); ++ assert.throws(RangeError, () => duration.toString({ smallestUnit }), ++ `"${smallestUnit}" is not a valid unit for the smallestUnit option`); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/calendar-dateadd-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/calendar-dateadd-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6ae88e1d942a79313768d7a71e006bf2f3ccdbb0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/calendar-dateadd-called-with-options-undefined.js +@@ -0,0 +1,49 @@ ++// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-temporal.duration.prototype.total ++description: > ++ BuiltinTimeZoneGetInstantFor calls Calendar.dateAdd with undefined as the ++ options value ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarDateAddUndefinedOptions(); ++const timeZone = TemporalHelpers.oneShiftTimeZone(new Temporal.Instant(0n), 3600e9); ++const relativeTo = new Temporal.ZonedDateTime(0n, timeZone, calendar); ++ ++// Total of a calendar unit where larger calendar units have to be converted ++// down, to cover the path that goes through UnbalanceDurationRelative ++// The calls come from these paths: ++// Duration.total() -> ++// UnbalanceDurationRelative -> MoveRelativeDate -> calendar.dateAdd() (3x) ++// BalanceDuration -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() (2x) ++// RoundDuration -> ++// MoveRelativeZonedDateTime -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++ ++const instance1 = new Temporal.Duration(1, 1, 1, 1, 1); ++instance1.total({ unit: "days", relativeTo }); ++assert.sameValue(calendar.dateAddCallCount, 8, "converting larger calendar units down"); ++ ++// Total of a calendar unit where smaller calendar units have to be converted ++// up, to cover the path that goes through MoveRelativeZonedDateTime ++// The calls come from these paths: ++// Duration.total() -> ++// MoveRelativeZonedDateTime -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// BalanceDuration -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() (2x) ++// RoundDuration -> ++// MoveRelativeZonedDateTime -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// MoveRelativeDate -> calendar.dateAdd() ++ ++calendar.dateAddCallCount = 0; ++ ++const instance2 = new Temporal.Duration(0, 0, 1, 1); ++instance2.total({ unit: "weeks", relativeTo }); ++assert.sameValue(calendar.dateAddCallCount, 6, "converting smaller calendar units up"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/options-wrong-type.js +index 9b92bca4836795546ae5bc93a423b5b388fbec3a..ae20fe1b49e847539c08040d095a1c6224181ce0 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/options-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/options-wrong-type.js +@@ -1,13 +1,13 @@ +-// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// 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.duration.prototype.total +-description: TypeError thrown when options argument is missing or a primitive ++description: TypeError thrown when options argument is missing or a non-string primitive + features: [BigInt, Symbol, Temporal] + ---*/ + +-const values = [ ++const badOptions = [ + undefined, + null, + true, +@@ -17,7 +17,8 @@ const values = [ + ]; + + const instance = new Temporal.Duration(0, 0, 0, 0, 1); +-assert.throws(TypeError, () => instance.total(), "TypeError on missing argument"); +-values.forEach((value) => { +- assert.throws(TypeError, () => instance.total(value), `TypeError on wrong argument type ${typeof(value)}`); +-}); ++assert.throws(TypeError, () => instance.total(), "TypeError on missing options argument"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.total(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3602203fc21fd6fdcd1df3a37ef3a425979dd405 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-leap-second.js +@@ -0,0 +1,42 @@ ++// 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.duration.prototype.total ++description: Leap second is constrained in both an ISO string and a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 0, 24); ++ ++let relativeTo = "2016-12-31T23:59:60"; ++const result1 = instance.total({ unit: "days", relativeTo }); ++assert.sameValue( ++ result1, ++ 366, ++ "leap second is a valid ISO string for PlainDate relativeTo" ++); ++ ++relativeTo = "2016-12-31T23:59:60+00:00[UTC]"; ++const result2 = instance.total({ unit: "days", relativeTo }); ++assert.sameValue( ++ result2, ++ 366, ++ "leap second is a valid ISO string for ZonedDateTime relativeTo" ++); ++ ++relativeTo = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result3 = instance.total({ unit: "days", relativeTo }); ++assert.sameValue( ++ result3, ++ 366, ++ "second: 60 is valid in a property bag for PlainDate relativeTo" ++); ++ ++relativeTo = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60, timeZone: "UTC" }; ++const result4 = instance.total({ unit: "days", relativeTo }); ++assert.sameValue( ++ result4, ++ 366, ++ "second: 60 is valid in a property bag for ZonedDateTime relativeTo" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-number.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6825c00ce438834fe067cd60d185402778285388 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-number.js +@@ -0,0 +1,29 @@ ++// 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.duration.prototype.total ++description: A number as relativeTo option is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 0, 24); ++ ++const relativeTo = 20191101; ++ ++const result = instance.total({ unit: "days", relativeTo }); ++assert.sameValue(result, 367, "20191101 is a valid ISO string for relativeTo"); ++ ++const numbers = [ ++ 1, ++ -20191101, ++ 1234567890, ++]; ++ ++for (const relativeTo of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.total({ unit: "days", relativeTo }), ++ `Number ${relativeTo} does not convert to a valid ISO string for relativeTo` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..773e2f03bbc8a83156186b29ce21b02a45dd7132 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.duration.prototype.total ++description: A number as calendar in relativeTo property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1, 0, 0, 0, 24); ++ ++const calendar = 19970327; ++ ++let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++const result1 = instance.total({ unit: "days", relativeTo }); ++assert.sameValue(result1, 367, "19970327 is a valid ISO string for relativeTo.calendar"); ++ ++relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++const result2 = instance.total({ unit: "days", relativeTo }); ++assert.sameValue(result2, 367, "19970327 is a valid ISO string for relativeTo.calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.total({ unit: "days", relativeTo }), ++ `Number ${calendar} does not convert to a valid ISO string for relativeTo.calendar` ++ ); ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.total({ unit: "days", relativeTo }), ++ `Number ${calendar} does not convert to a valid ISO string for relativeTo.calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b2b5185bc5c4eac63b99f5b1844a5f6a7fb9e301 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-wrong-type.js +@@ -0,0 +1,49 @@ ++// 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.duration.prototype.total ++description: > ++ Appropriate error thrown when relativeTo.calendar cannot be converted to a ++ calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Duration(1, 0, 0, 0, 24); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.total({ unit: "days", relativeTo }), `${description} does not convert to a valid ISO string`); ++ ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.total({ unit: "days", relativeTo }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.total({ unit: "days", relativeTo }), `${description} is not a valid property bag and does not convert to a string`); ++ ++ relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.total({ unit: "days", relativeTo }), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const relativeTo = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.total({ unit: "days", relativeTo }), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..84d4d889abf0f614ec742159972caef1a9ed31dc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/relativeto-wrong-type.js +@@ -0,0 +1,39 @@ ++// 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.duration.prototype.total ++description: > ++ Appropriate error thrown when relativeTo cannot be converted to a valid ++ relativeTo string or property bag ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Duration(1, 0, 0, 0, 24); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [relativeTo, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.total({ unit: "days", relativeTo }), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [relativeTo, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.total({ unit: "days", relativeTo }), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0167a3c6ddaaf137e477ac667522fa202ae82b54 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/timezone-string-leap-second.js +@@ -0,0 +1,21 @@ ++// 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.duration.prototype.total ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// A string with a leap second is a valid ISO string, so the following two ++// operations should not throw ++ ++instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone } }); ++instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..223a510ca997631e7a4617d1edc733c824a4efe8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.duration.prototype.total ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Duration(1); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a10581712874187a4e2753c149881f3a20adfa90 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/total/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.duration.prototype.total ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Duration(1); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone } }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.total({ unit: "months", relativeTo: { year: 2000, month: 5, day: 2, timeZone: { timeZone } } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/valueOf/basic.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/valueOf/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..95b2de9093bd68501bae5071e1f09c8f8bef711d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/valueOf/basic.js +@@ -0,0 +1,21 @@ ++// 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.duration.prototype.valueof ++description: Basic tests for valueOf(). ++features: [Temporal] ++---*/ ++ ++const d1 = Temporal.Duration.from("P3DT1H"); ++const d2 = Temporal.Duration.from("P3DT1H"); ++ ++assert.throws(TypeError, () => d1.valueOf(), "valueOf"); ++assert.throws(TypeError, () => d1 < d1, "<"); ++assert.throws(TypeError, () => d1 <= d1, "<="); ++assert.throws(TypeError, () => d1 > d1, ">"); ++assert.throws(TypeError, () => d1 >= d1, ">="); ++assert.sameValue(d1 === d1, true, "==="); ++assert.sameValue(d1 === d2, false, "==="); ++assert.sameValue(d1 !== d1, false, "!=="); ++assert.sameValue(d1 !== d2, true, "!=="); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/all-negative.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/all-negative.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e094455bb8e1757de623db06a22a832ac0c42850 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/all-negative.js +@@ -0,0 +1,93 @@ ++// 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.duration.prototype.with ++description: > ++ Returns a correctly merged object when the argument replaces the fields with ++ all negative values. ++info: | ++ 1. Let duration be the this value. ++ 2. Perform ? RequireInternalSlot(duration, [[InitializedTemporalDuration]]). ++ 3. Let temporalDurationLike be ? ToPartialDuration(temporalDurationLike). ++ 4. If temporalDurationLike.[[Years]] is not undefined, then ++ a. Let years be temporalDurationLike.[[Years]]. ++ 5. Else, ++ a. Let years be duration.[[Years]]. ++ 6. If temporalDurationLike.[[Months]] is not undefined, then ++ a. Let months be temporalDurationLike.[[Months]]. ++ 7. Else, ++ a. Let months be duration.[[Months]]. ++ 8. If temporalDurationLike.[[Weeks]] is not undefined, then ++ a. Let weeks be temporalDurationLike.[[Weeks]]. ++ 9. Else, ++ a. Let weeks be duration.[[Weeks]]. ++ 10. If temporalDurationLike.[[Days]] is not undefined, then ++ a. Let days be temporalDurationLike.[[Days]]. ++ 11. Else, ++ a. Let days be duration.[[Days]]. ++ 12. If temporalDurationLike.[[Hours]] is not undefined, then ++ a. Let hours be temporalDurationLike.[[Hours]]. ++ 13. Else, ++ a. Let hours be duration.[[Hours]]. ++ 14. If temporalDurationLike.[[Minutes]] is not undefined, then ++ a. Let minutes be temporalDurationLike.[[Minutes]]. ++ 15. Else, ++ a. Let minutes be duration.[[Minutes]]. ++ 16. If temporalDurationLike.[[Seconds]] is not undefined, then ++ a. Let seconds be temporalDurationLike.[[Seconds]]. ++ 17. Else, ++ a. Let seconds be duration.[[Seconds]]. ++ 18. If temporalDurationLike.[[Milliseconds]] is not undefined, then ++ a. Let milliseconds be temporalDurationLike.[[Milliseconds]]. ++ 19. Else, ++ a. Let milliseconds be duration.[[Milliseconds]]. ++ 20. If temporalDurationLike.[[Microseconds]] is not undefined, then ++ a. Let microseconds be temporalDurationLike.[[Microseconds]]. ++ 21. Else, ++ a. Let microseconds be duration.[[Microseconds]]. ++ 22. If temporalDurationLike.[[Nanoseconds]] is not undefined, then ++ a. Let nanoseconds be temporalDurationLike.[[Nanoseconds]]. ++ 23. Else, ++ a. Let nanoseconds be duration.[[Nanoseconds]]. ++ 24. Return ? CreateTemporalDuration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const argAllNegative = { ++ years: -9, ++ months: -8, ++ weeks: -7, ++ days: -6, ++ hours: -5, ++ minutes: -4, ++ seconds: -3, ++ milliseconds: -2, ++ microseconds: -1, ++ nanoseconds: -10, ++}; ++ ++const d1 = new Temporal.Duration(); ++TemporalHelpers.assertDuration( ++ d1.with(argAllNegative), -9, -8, -7, -6, -5, -4, -3, -2, -1, -10, ++ "replace all zeroes with all negative" ++); ++ ++const d2 = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ++TemporalHelpers.assertDuration( ++ d2.with(argAllNegative), -9, -8, -7, -6, -5, -4, -3, -2, -1, -10, ++ "replace all positive with all negative" ++); ++ ++const d3 = new Temporal.Duration(1e5, 2e5, 3e5, 4e5, 5e5, 6e5, 7e5, 8e5, 9e5, 10e5); ++TemporalHelpers.assertDuration( ++ d3.with(argAllNegative), -9, -8, -7, -6, -5, -4, -3, -2, -1, -10, ++ "replace all positive large numbers with all negative" ++); ++ ++const d4 = new Temporal.Duration(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10); ++TemporalHelpers.assertDuration( ++ d4.with(argAllNegative), -9, -8, -7, -6, -5, -4, -3, -2, -1, -10, ++ "replace all negative with all negative" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/all-positive.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/all-positive.js +new file mode 100644 +index 0000000000000000000000000000000000000000..21584232fc03eab1ada2cd30fa92ee857cdf0cfc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/all-positive.js +@@ -0,0 +1,92 @@ ++// 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.duration.prototype.with ++description: > ++ Returns a correctly merged object when the argument replaces the fields with ++ all positive values. ++info: | ++ 1. Let duration be the this value. ++ 2. Perform ? RequireInternalSlot(duration, [[InitializedTemporalDuration]]). ++ 3. Let temporalDurationLike be ? ToPartialDuration(temporalDurationLike). ++ 4. If temporalDurationLike.[[Years]] is not undefined, then ++ a. Let years be temporalDurationLike.[[Years]]. ++ 5. Else, ++ a. Let years be duration.[[Years]]. ++ 6. If temporalDurationLike.[[Months]] is not undefined, then ++ a. Let months be temporalDurationLike.[[Months]]. ++ 7. Else, ++ a. Let months be duration.[[Months]]. ++ 8. If temporalDurationLike.[[Weeks]] is not undefined, then ++ a. Let weeks be temporalDurationLike.[[Weeks]]. ++ 9. Else, ++ a. Let weeks be duration.[[Weeks]]. ++ 10. If temporalDurationLike.[[Days]] is not undefined, then ++ a. Let days be temporalDurationLike.[[Days]]. ++ 11. Else, ++ a. Let days be duration.[[Days]]. ++ 12. If temporalDurationLike.[[Hours]] is not undefined, then ++ a. Let hours be temporalDurationLike.[[Hours]]. ++ 13. Else, ++ a. Let hours be duration.[[Hours]]. ++ 14. If temporalDurationLike.[[Minutes]] is not undefined, then ++ a. Let minutes be temporalDurationLike.[[Minutes]]. ++ 15. Else, ++ a. Let minutes be duration.[[Minutes]]. ++ 16. If temporalDurationLike.[[Seconds]] is not undefined, then ++ a. Let seconds be temporalDurationLike.[[Seconds]]. ++ 17. Else, ++ a. Let seconds be duration.[[Seconds]]. ++ 18. If temporalDurationLike.[[Milliseconds]] is not undefined, then ++ a. Let milliseconds be temporalDurationLike.[[Milliseconds]]. ++ 19. Else, ++ a. Let milliseconds be duration.[[Milliseconds]]. ++ 20. If temporalDurationLike.[[Microseconds]] is not undefined, then ++ a. Let microseconds be temporalDurationLike.[[Microseconds]]. ++ 21. Else, ++ a. Let microseconds be duration.[[Microseconds]]. ++ 22. If temporalDurationLike.[[Nanoseconds]] is not undefined, then ++ a. Let nanoseconds be temporalDurationLike.[[Nanoseconds]]. ++ 23. Else, ++ a. Let nanoseconds be duration.[[Nanoseconds]]. ++ 24. Return ? CreateTemporalDuration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const argAllPositive = { ++ years: 9, ++ months: 8, ++ weeks: 7, ++ days: 6, ++ hours: 5, ++ minutes: 4, ++ seconds: 3, ++ milliseconds: 2, ++ microseconds: 1, ++ nanoseconds: 10, ++}; ++ ++const d1 = new Temporal.Duration(); ++TemporalHelpers.assertDuration( ++ d1.with(argAllPositive), 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, ++ "replace all zeroes with all positive" ++); ++ ++const d2 = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ++TemporalHelpers.assertDuration( ++ d2.with(argAllPositive), 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, ++ "replace all positive with all positive"); ++ ++const d3 = new Temporal.Duration(1e5, 2e5, 3e5, 4e5, 5e5, 6e5, 7e5, 8e5, 9e5, 10e5); ++TemporalHelpers.assertDuration( ++ d3.with(argAllPositive), 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, ++ "replace all positive large numbers with all positive" ++); ++ ++const d4 = new Temporal.Duration(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10); ++TemporalHelpers.assertDuration( ++ d4.with(argAllPositive), 9, 8, 7, 6, 5, 4, 3, 2, 1, 10, ++ "replace all negative with all positive" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-invalid-prop.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-invalid-prop.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f12c9f49dc50149140e396c53365576122eb5b31 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-invalid-prop.js +@@ -0,0 +1,13 @@ ++// 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.duration.prototype.with ++description: Singular properties are ignored. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const d = Temporal.Duration.from({ years: 5, days: 1 }); ++const d2 = d.with({ year: 1, days: 0 }); ++TemporalHelpers.assertDuration(d2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-mixed-sign.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-mixed-sign.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ca215ef33ed0e9d94fa28cd07189f4f3b686aa7e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-mixed-sign.js +@@ -0,0 +1,11 @@ ++// 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.duration.prototype.with ++description: The durationLike argument must not contain different signs. ++features: [Temporal] ++---*/ ++ ++const d = new Temporal.Duration(1, 2, 3, 4, 5); ++assert.throws(RangeError, () => d.with({ hours: 1, minutes: -1 })); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-object-wrong-shape.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-object-wrong-shape.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5c17076bec5140957ba15c10be1c5030125bf8fc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-object-wrong-shape.js +@@ -0,0 +1,31 @@ ++// 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.duration.prototype.with ++description: > ++ The durationLike argument must contain at least one correctly spelled property ++features: [Temporal] ++---*/ ++ ++let d = new Temporal.Duration(1, 2, 3, 4, 5); ++ ++[ ++ {}, ++ [], ++ () => {}, ++ // objects with only singular keys (plural is the correct spelling) ++ { year: 1 }, ++ { month: 2 }, ++ { week: 3 }, ++ { day: 4 }, ++ { hour: 5 }, ++ { minute: 6 }, ++ { second: 7 }, ++ { millisecond: 8 }, ++ { microsecond: 9 }, ++ { nanosecond: 10 }, ++].forEach((badObject) => { ++ assert.throws(TypeError, () => d.with(badObject), ++ "Throw TypeError if temporalDurationLike is not valid"); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-sign-prop.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-sign-prop.js +new file mode 100644 +index 0000000000000000000000000000000000000000..728d2f92ee2493e0aacdd0815adda94d242db6ec +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-sign-prop.js +@@ -0,0 +1,14 @@ ++// 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.duration.prototype.with ++description: Passing a sign property is not supported. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const d = Temporal.Duration.from({ years: 5, days: 1 }); ++assert.throws(TypeError, () => d.with({ sign: -1 })); ++const d2 = d.with({ sign: -1, days: 0 }); ++TemporalHelpers.assertDuration(d2, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..41163a35da6e66cc06f7b52b5d94bcb38ab3d340 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/argument-wrong-type.js +@@ -0,0 +1,27 @@ ++// 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.duration.prototype.with ++description: Throw TypeError if the temporalDurationLike argument is the wrong type ++features: [Temporal] ++---*/ ++ ++let d = new Temporal.Duration(1, 2, 3, 4, 5); ++ ++[ ++ "string", ++ "P1YT1M", ++ true, ++ false, ++ NaN, ++ Infinity, ++ undefined, ++ null, ++ 123, ++ Symbol(), ++ 456n, ++].forEach((badInput) => { ++ assert.throws(TypeError, () => d.with(badInput), ++ "Throw TypeError if temporalDurationLike is not valid"); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/branding.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/branding.js +index 2bc9af85bf8520e787bb7df7e43dea2afde18d3d..b04b2fefd603bbc85becf229c2bdfd0b38714bd2 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/branding.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/branding.js +@@ -11,12 +11,14 @@ const with_ = Temporal.Duration.prototype.with; + + assert.sameValue(typeof with_, "function"); + +-assert.throws(TypeError, () => with_.call(undefined), "undefined"); +-assert.throws(TypeError, () => with_.call(null), "null"); +-assert.throws(TypeError, () => with_.call(true), "true"); +-assert.throws(TypeError, () => with_.call(""), "empty string"); +-assert.throws(TypeError, () => with_.call(Symbol()), "symbol"); +-assert.throws(TypeError, () => with_.call(1), "1"); +-assert.throws(TypeError, () => with_.call({}), "plain object"); +-assert.throws(TypeError, () => with_.call(Temporal.Duration), "Temporal.Duration"); +-assert.throws(TypeError, () => with_.call(Temporal.Duration.prototype), "Temporal.Duration.prototype"); ++const arg = { years: 3 }; ++ ++assert.throws(TypeError, () => with_.call(undefined, arg), "undefined"); ++assert.throws(TypeError, () => with_.call(null, arg), "null"); ++assert.throws(TypeError, () => with_.call(true, arg), "true"); ++assert.throws(TypeError, () => with_.call("", arg), "empty string"); ++assert.throws(TypeError, () => with_.call(Symbol(), arg), "symbol"); ++assert.throws(TypeError, () => with_.call(1, arg), "1"); ++assert.throws(TypeError, () => with_.call({}, arg), "plain object"); ++assert.throws(TypeError, () => with_.call(Temporal.Duration, arg), "Temporal.Duration"); ++assert.throws(TypeError, () => with_.call(Temporal.Duration.prototype, arg), "Temporal.Duration.prototype"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/partial-positive.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/partial-positive.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b1425de497f956c1e7c0d3e3fb55cf8fe75172ee +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/partial-positive.js +@@ -0,0 +1,86 @@ ++// 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.duration.prototype.with ++description: > ++ Returns a correctly merged object when the argument replaces only some of the ++ fields with positive values. ++info: | ++ 1. Let duration be the this value. ++ 2. Perform ? RequireInternalSlot(duration, [[InitializedTemporalDuration]]). ++ 3. Let temporalDurationLike be ? ToPartialDuration(temporalDurationLike). ++ 4. If temporalDurationLike.[[Years]] is not undefined, then ++ a. Let years be temporalDurationLike.[[Years]]. ++ 5. Else, ++ a. Let years be duration.[[Years]]. ++ 6. If temporalDurationLike.[[Months]] is not undefined, then ++ a. Let months be temporalDurationLike.[[Months]]. ++ 7. Else, ++ a. Let months be duration.[[Months]]. ++ 8. If temporalDurationLike.[[Weeks]] is not undefined, then ++ a. Let weeks be temporalDurationLike.[[Weeks]]. ++ 9. Else, ++ a. Let weeks be duration.[[Weeks]]. ++ 10. If temporalDurationLike.[[Days]] is not undefined, then ++ a. Let days be temporalDurationLike.[[Days]]. ++ 11. Else, ++ a. Let days be duration.[[Days]]. ++ 12. If temporalDurationLike.[[Hours]] is not undefined, then ++ a. Let hours be temporalDurationLike.[[Hours]]. ++ 13. Else, ++ a. Let hours be duration.[[Hours]]. ++ 14. If temporalDurationLike.[[Minutes]] is not undefined, then ++ a. Let minutes be temporalDurationLike.[[Minutes]]. ++ 15. Else, ++ a. Let minutes be duration.[[Minutes]]. ++ 16. If temporalDurationLike.[[Seconds]] is not undefined, then ++ a. Let seconds be temporalDurationLike.[[Seconds]]. ++ 17. Else, ++ a. Let seconds be duration.[[Seconds]]. ++ 18. If temporalDurationLike.[[Milliseconds]] is not undefined, then ++ a. Let milliseconds be temporalDurationLike.[[Milliseconds]]. ++ 19. Else, ++ a. Let milliseconds be duration.[[Milliseconds]]. ++ 20. If temporalDurationLike.[[Microseconds]] is not undefined, then ++ a. Let microseconds be temporalDurationLike.[[Microseconds]]. ++ 21. Else, ++ a. Let microseconds be duration.[[Microseconds]]. ++ 22. If temporalDurationLike.[[Nanoseconds]] is not undefined, then ++ a. Let nanoseconds be temporalDurationLike.[[Nanoseconds]]. ++ 23. Else, ++ a. Let nanoseconds be duration.[[Nanoseconds]]. ++ 24. Return ? CreateTemporalDuration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const durationlike1 = { years: 9, hours: 5 }; ++const durationlike2 = { months: 8, minutes: 4 }; ++const durationlike3 = { weeks: 7, seconds: 3 }; ++const durationlike4 = { days: 6, milliseconds: 2 }; ++const durationlike5 = { microseconds: 987, nanoseconds: 123 }; ++ ++const d1 = new Temporal.Duration(); ++TemporalHelpers.assertDuration( ++ d1.with(durationlike1), 9, 0, 0, 0, 5, 0, 0, 0, 0, 0, "replace all zeroes with years and hours"); ++TemporalHelpers.assertDuration( ++ d1.with(durationlike2), 0, 8, 0, 0, 0, 4, 0, 0, 0, 0, "replace all zeroes wtih months and minutes"); ++TemporalHelpers.assertDuration( ++ d1.with(durationlike3), 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, "replace all zeroes with weeks and seconds"); ++TemporalHelpers.assertDuration( ++ d1.with(durationlike4), 0, 0, 0, 6, 0, 0, 0, 2, 0, 0, "replace all zeroes with days and milliseconds"); ++TemporalHelpers.assertDuration( ++ d1.with(durationlike5), 0, 0, 0, 0, 0, 0, 0, 0, 987, 123, "replace all zeroes with microseconds and nanoseconds"); ++ ++const d2 = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ++TemporalHelpers.assertDuration( ++ d2.with(durationlike1), 9, 2, 3, 4, 5, 6, 7, 8, 9, 10, "replace all positive with years and hours"); ++TemporalHelpers.assertDuration( ++ d2.with(durationlike2), 1, 8, 3, 4, 5, 4, 7, 8, 9, 10, "replace all positive with months and minutes"); ++TemporalHelpers.assertDuration( ++ d2.with(durationlike3), 1, 2, 7, 4, 5, 6, 3, 8, 9, 10, "replace all positive with weeks and seconds"); ++TemporalHelpers.assertDuration( ++ d2.with(durationlike4), 1, 2, 3, 6, 5, 6, 7, 2, 9, 10, "replace all positive with days and milliseconds"); ++TemporalHelpers.assertDuration( ++ d2.with(durationlike5), 1, 2, 3, 4, 5, 6, 7, 8, 987, 123, "replace all positive with microseconds and nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/sign-conflict-throws-rangeerror.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/sign-conflict-throws-rangeerror.js +new file mode 100644 +index 0000000000000000000000000000000000000000..239951b34d184ee8cf63fd7829e6a63cbd20fc1a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/sign-conflict-throws-rangeerror.js +@@ -0,0 +1,28 @@ ++// 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.duration.prototype.with ++description: Throw RangeError if the resulting duration has mixed signs ++info: | ++ 24. Return ? CreateTemporalDuration(years, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds). ++features: [Temporal] ++---*/ ++ ++const d1 = new Temporal.Duration(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); ++const d2 = new Temporal.Duration(-1, -2, -3, -4, -5, -6, -7, -8, -9, -10); ++const fields = ["years", "months", "weeks", "days", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds"]; ++ ++fields.forEach((field) => { ++ assert.throws( ++ RangeError, ++ () => d1.with({ [field]: -1 }), ++ `sign in argument { ${field}: -1 } conflicting with sign of duration should throw RangeError` ++ ); ++ ++ assert.throws( ++ RangeError, ++ () => d2.with({ [field]: 1 }), ++ `sign in argument { ${field}: 1 } conflicting with sign of duration should throw RangeError` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/sign-replace.js b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/sign-replace.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a4b9c0ccd3adcbe1210c7c22f57c3851020e5408 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/prototype/with/sign-replace.js +@@ -0,0 +1,15 @@ ++// 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.duration.prototype.with ++description: Replacing the sign is supported. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const d = Temporal.Duration.from({ years: 5, days: 1 }); ++assert.sameValue(d.sign, 1, "original sign"); ++const d2 = d.with({ years: -1, days: 0, minutes: -1 }); ++assert.sameValue(d2.sign, -1, "new sign"); ++TemporalHelpers.assertDuration(d2, -1, 0, 0, 0, 0, -1, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/seconds-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/seconds-undefined.js +index a4cc4add4a010757c50f5311355f0b3d6a869dc1..e3cd9b15b22fc68e7613ae234f0620a5db27c220 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/seconds-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/seconds-undefined.js +@@ -4,13 +4,14 @@ + /*--- + esid: sec-temporal.duration + description: Undefined arguments should be treated as zero. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const args = [1, 1, 1, 1, 1, 1]; + + const explicit = new Temporal.Duration(...args, undefined); +-assert.sameValue(explicit.seconds, 0, "seconds default argument"); ++TemporalHelpers.assertDuration(explicit, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, "explicit"); + + const implicit = new Temporal.Duration(...args); +-assert.sameValue(implicit.seconds, 0, "seconds default argument"); ++TemporalHelpers.assertDuration(implicit, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, "implicit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/weeks-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/weeks-undefined.js +index d01172db2d38276865dc3f44623f73a6c4baab73..12c03332d057a701a2a6fddfca1259f0b15d2df4 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/weeks-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/weeks-undefined.js +@@ -4,13 +4,14 @@ + /*--- + esid: sec-temporal.duration + description: Undefined arguments should be treated as zero. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const args = [1, 1]; + + const explicit = new Temporal.Duration(...args, undefined); +-assert.sameValue(explicit.weeks, 0, "weeks default argument"); ++TemporalHelpers.assertDuration(explicit, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "explicit"); + + const implicit = new Temporal.Duration(...args); +-assert.sameValue(implicit.weeks, 0, "weeks default argument"); ++TemporalHelpers.assertDuration(implicit, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, "implicit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Duration/years-undefined.js b/JSTests/test262/test/built-ins/Temporal/Duration/years-undefined.js +index 55235840916b579f8285d37b2a128aea182db829..c0fb9cea21eb292f8c32c3add1f7af8c7cb20203 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Duration/years-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Duration/years-undefined.js +@@ -4,11 +4,14 @@ + /*--- + esid: sec-temporal.duration + description: Undefined arguments should be treated as zero. ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const explicit = new Temporal.Duration(undefined); +-assert.sameValue(explicit.years, 0, "years default argument"); ++const args = []; + +-const implicit = new Temporal.Duration(); +-assert.sameValue(implicit.years, 0, "years default argument"); ++const explicit = new Temporal.Duration(...args, undefined); ++TemporalHelpers.assertDuration(explicit, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "explicit"); ++ ++const implicit = new Temporal.Duration(...args); ++TemporalHelpers.assertDuration(implicit, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "implicit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-object-tostring.js b/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-object-tostring.js +new file mode 100644 +index 0000000000000000000000000000000000000000..808cd21453243e3375073efcb26771f59d2d57db +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-object-tostring.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.instant.compare ++description: Object is converted to a string, then to Temporal.Instant ++features: [Temporal] ++---*/ ++ ++const epoch = new Temporal.Instant(0n); ++ ++const arg = {}; ++assert.throws(RangeError, () => Temporal.Instant.compare(arg, epoch), "[object Object] is not a valid ISO string (first argument)"); ++assert.throws(RangeError, () => Temporal.Instant.compare(epoch, arg), "[object Object] is not a valid ISO string (second argument)"); ++ ++arg.toString = function() { ++ return "1970-01-01T00:00Z"; ++}; ++const result1 = Temporal.Instant.compare(arg, epoch); ++assert.sameValue(result1, 0, "result of toString is interpreted as ISO string (first argument)"); ++const result2 = Temporal.Instant.compare(epoch, arg); ++assert.sameValue(result2, 0, "result of toString is interpreted as ISO string (second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cf4c5931bf9c5b937903e76f5bff71090ebf9445 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/compare/argument-wrong-type.js +@@ -0,0 +1,39 @@ ++// 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.instant.compare ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ for Instant ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const other = new Temporal.Instant(0n); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++ [{}, "plain object"], ++ [Temporal.Instant, "Temporal.Instant, object"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Instant.compare(arg, other), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.Instant.compare(other, arg), `${description} does not convert to a valid ISO string (second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [Temporal.Instant.prototype, "Temporal.Instant.prototype, object"], // fails brand check in toString() ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Instant.compare(arg, other), `${description} does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.Instant.compare(other, arg), `${description} does not convert to a string (second argument)`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/compare/instant-string-sub-minute-offset.js b/JSTests/test262/test/built-ins/Temporal/Instant/compare/instant-string-sub-minute-offset.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8b44cd75d0c77103be1fa7a4618fdcafa5729cf1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/compare/instant-string-sub-minute-offset.js +@@ -0,0 +1,17 @@ ++// 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.instant.compare ++description: Temporal.Instant string with sub-minute offset ++features: [Temporal] ++---*/ ++ ++const epoch = new Temporal.Instant(0n); ++const str = "1970-01-01T00:19:32.37+00:19:32.37"; ++ ++const result1 = Temporal.Instant.compare(str, epoch); ++assert.sameValue(result1, 0, "if present, sub-minute offset is accepted exactly (first argument)"); ++ ++const result2 = Temporal.Instant.compare(epoch, str); ++assert.sameValue(result2, 0, "if present, sub-minute offset is accepted exactly (second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/compare/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Instant/compare/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b2f5967d92ad1184b371e498599abbbc6c80ba90 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/compare/leap-second.js +@@ -0,0 +1,15 @@ ++// 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.instant.compare ++description: Leap second is a valid ISO string for Instant ++features: [Temporal] ++---*/ ++ ++const other = new Temporal.Instant(1_483_228_799_000_000_000n); ++const arg = "2016-12-31T23:59:60Z"; ++const result1 = Temporal.Instant.compare(arg, other); ++assert.sameValue(result1, 0, "leap second is a valid ISO string for Instant (first argument)"); ++const result2 = Temporal.Instant.compare(other, arg); ++assert.sameValue(result2, 0, "leap second is a valid ISO string for Instant (second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/compare/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Instant/compare/year-zero.js +index e6bb684d43808f96b1f06eeafeddf130b16f4674..23293adff14845b142009e6d11b0141540d238eb 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/compare/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/compare/year-zero.js +@@ -8,12 +8,18 @@ features: [Temporal] + ---*/ + + const instance = new Temporal.Instant(0n); +-const bad = '-000000-03-30T00:45Z'; ++const invalidStrings = [ ++ "-000000-03-30T00:45Z", ++ "-000000-03-30T01:45+01:00", ++ "-000000-03-30T01:45:00+00:00[UTC]", ++]; + +-assert.throws(RangeError, +- () => Temporal.Instant.compare(bad, instance), +- "minus zero is invalid extended year (first argument)"); +-assert.throws(RangeError, +- () => Temporal.Instant.compare(instance, bad), +- "minus zero is invalid extended year (second argument)" +-); ++invalidStrings.forEach((arg) => { ++ assert.throws(RangeError, ++ () => Temporal.Instant.compare(arg, instance), ++ "minus zero is invalid extended year (first argument)"); ++ assert.throws(RangeError, ++ () => Temporal.Instant.compare(instance, arg), ++ "minus zero is invalid extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-instant.js b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-instant.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ea70d4c8c3e1ffa6f4197c24a22d8bd6c93c74e3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-instant.js +@@ -0,0 +1,19 @@ ++// 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.instant.from ++description: A Instant object is copied, not returned directly ++features: [Temporal] ++---*/ ++ ++const orig = new Temporal.Instant(217_175_010_123_456_789n); ++const result = Temporal.Instant.from(orig); ++ ++assert.sameValue(result.epochNanoseconds, 217_175_010_123_456_789n, "Instant is copied"); ++ ++assert.notSameValue( ++ result, ++ orig, ++ "When an Instant is given, the returned value is not the original Instant" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-object-tostring.js b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-object-tostring.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a946791a102f3b5c320bceb2ab21c9a22fce2f17 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-object-tostring.js +@@ -0,0 +1,17 @@ ++// 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.instant.from ++description: Object is converted to a string, then to Temporal.Instant ++features: [Temporal] ++---*/ ++ ++const arg = {}; ++assert.throws(RangeError, () => Temporal.Instant.from(arg), "[object Object] is not a valid ISO string"); ++ ++arg.toString = function() { ++ return "1970-01-01T00:00Z"; ++}; ++const result = Temporal.Instant.from(arg); ++assert.sameValue(result.epochNanoseconds, 0n, "result of toString is interpreted as ISO string"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ec746029317dc96a1c8dde96e7908f7fba7a00df +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/from/argument-wrong-type.js +@@ -0,0 +1,35 @@ ++// 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.instant.from ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ for Instant ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++ [{}, "plain object"], ++ [Temporal.Instant, "Temporal.Instant, object"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Instant.from(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [Temporal.Instant.prototype, "Temporal.Instant.prototype, object"], // fails brand check in toString() ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Instant.from(arg), `${description} does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/from/basic.js b/JSTests/test262/test/built-ins/Temporal/Instant/from/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c588f86b0e5aac5fae14c68c767b222560fe8bba +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/from/basic.js +@@ -0,0 +1,59 @@ ++// 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.instant.from ++description: Basic functionality of Temporal.Instant.from ++features: [Temporal] ++---*/ ++ ++const baseValue = 217_178_580_000_000_000n; ++ ++let instant = Temporal.Instant.from("1976-11-18T15:23Z"); ++assert.sameValue( ++ instant.epochNanoseconds, ++ baseValue, ++ "ISO string with UTC designator and minutes precision" ++); ++ ++instant = Temporal.Instant.from("1976-11-18T15:23:30Z"); ++assert.sameValue( ++ instant.epochNanoseconds, ++ baseValue + 30_000_000_000n, ++ "ISO string with UTC designator and seconds precision" ++); ++ ++instant = Temporal.Instant.from("1976-11-18T15:23:30.123Z"); ++assert.sameValue( ++ instant.epochNanoseconds, ++ baseValue + 30_123_000_000n, ++ "ISO string with UTC designator and milliseconds precision" ++); ++ ++instant = Temporal.Instant.from("1976-11-18T15:23:30.123456Z"); ++assert.sameValue( ++ instant.epochNanoseconds, ++ baseValue + 30_123_456_000n, ++ "ISO string with UTC designator and microseconds precision" ++); ++ ++instant = Temporal.Instant.from("1976-11-18T15:23:30.123456789Z"); ++assert.sameValue( ++ instant.epochNanoseconds, ++ baseValue + 30_123_456_789n, ++ "ISO string with UTC designator and nanoseconds precision" ++); ++ ++instant = Temporal.Instant.from("1976-11-18T15:23-01:00"); ++assert.sameValue( ++ instant.epochNanoseconds, ++ baseValue + 3600_000_000_000n, ++ "ISO string with negative UTC offset" ++); ++ ++instant = Temporal.Instant.from("1976-11-18T15:23+01:00"); ++assert.sameValue( ++ instant.epochNanoseconds, ++ baseValue - 3600_000_000_000n, ++ "ISO string with positive UTC offset" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/from/instant-string-sub-minute-offset.js b/JSTests/test262/test/built-ins/Temporal/Instant/from/instant-string-sub-minute-offset.js +new file mode 100644 +index 0000000000000000000000000000000000000000..70c3f19870335594ad483dca2aaa1a108d71c932 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/from/instant-string-sub-minute-offset.js +@@ -0,0 +1,12 @@ ++// 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.instant.from ++description: Temporal.Instant string with sub-minute offset ++features: [Temporal] ++---*/ ++ ++const str = "1970-01-01T00:19:32.37+00:19:32.37"; ++const result = Temporal.Instant.from(str); ++assert.sameValue(result.epochNanoseconds, 0n, "if present, sub-minute offset is accepted exactly"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/from/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Instant/from/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..379aa7b11440b8996c8dc6f7b0e30d7d5413a849 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/from/leap-second.js +@@ -0,0 +1,16 @@ ++// 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.instant.from ++description: Leap second is a valid ISO string for Instant ++features: [Temporal] ++---*/ ++ ++const arg = "2016-12-31T23:59:60Z"; ++const result = Temporal.Instant.from(arg); ++assert.sameValue( ++ result.epochNanoseconds, ++ 1_483_228_799_000_000_000n, ++ "leap second is a valid ISO string for Instant" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/from/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Instant/from/year-zero.js +index b21396b8948da84bc5d421896b3533b320150338..5d1ad4a84f872b34d74cbedac51fe11b4f88671a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/from/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/from/year-zero.js +@@ -4,19 +4,19 @@ + /*--- + esid: sec-temporal.instant.from + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- "-000000-03-31T00:45Z", +- "-000000-03-31T01:45+01:00", +- "-000000-03-31T01:45:00+01:00[UTC]" ++ "-000000-03-30T00:45Z", ++ "-000000-03-30T01:45+01:00", ++ "-000000-03-30T01:45:00+00:00[UTC]", + ]; + +-invalidStrings.forEach((str) => { ++invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => Temporal.Instant.from(str), ++ () => Temporal.Instant.from(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/basic.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1b94ba1befbfb34f7fefd6dd0cb7657ee4c936e6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/basic.js +@@ -0,0 +1,72 @@ ++// 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.instant.prototype.add ++description: Basic functionality of Temporal.Instant.prototype.add() ++info: | ++ 1. Let instant be the this value. ++ 2. Perform ? RequireInternalSlot(instant, [[InitializedTemporalInstant]]). ++ 3. Let duration be ? ToLimitedTemporalDuration(temporalDurationLike, « "years", "months", "weeks", "days" »). ++ 4. Let ns be ? AddInstant(instant.[[EpochNanoseconds]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]]). ++ 5. Return ! CreateTemporalInstant(ns). ++features: [Temporal] ++---*/ ++ ++const inst = new Temporal.Instant(50000n); ++ ++let result = inst.add(new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 3, 2, 1)); ++assert.sameValue( ++ 3052001n, ++ result.epochNanoseconds, ++ "add positive sub-seconds" ++); ++ ++result = inst.add(new Temporal.Duration(0, 0, 0, 0, 0, 0, 4, 3, 2, 1)); ++assert.sameValue( ++ BigInt(4 * 1e9) + 3052001n, ++ result.epochNanoseconds, ++ "add positive seconds" ++); ++ ++result = inst.add(new Temporal.Duration(0, 0, 0, 0, 0, 5, 4, 3, 2, 1)); ++assert.sameValue( ++ BigInt(5 * 60 + 4) * 1000000000n + 3052001n, ++ result.epochNanoseconds, ++ "add positive minutes" ++); ++ ++result = inst.add(new Temporal.Duration(0, 0, 0, 0, 6, 5, 4, 3, 2, 1)); ++assert.sameValue( ++ BigInt(6 * 3600 + 5 * 60 + 4) * 1000000000n + 3052001n, ++ result.epochNanoseconds, ++ "add positive hours" ++); ++ ++result = inst.add(new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -3, -2, -1)); ++assert.sameValue( ++ -2952001n, ++ result.epochNanoseconds, ++ "add negative sub-seconds" ++); ++ ++result = inst.add(new Temporal.Duration(0, 0, 0, 0, 0, 0, -4, -3, -2, -1)); ++assert.sameValue( ++ BigInt(-4 * 1e9) - 2952001n, ++ result.epochNanoseconds, ++ "add negative seconds" ++); ++ ++result = inst.add(new Temporal.Duration(0, 0, 0, 0, 0, -5, -4, -3, -2, -1)); ++assert.sameValue( ++ BigInt(5 * 60 + 4) * -1000000000n - 2952001n, ++ result.epochNanoseconds, ++ "add negative minutes" ++); ++ ++result = inst.add(new Temporal.Duration(0, 0, 0, 0, -6, -5, -4, -3, -2, -1)); ++assert.sameValue( ++ BigInt(6 * 3600 + 5 * 60 + 4) * -1000000000n - 2952001n, ++ result.epochNanoseconds, ++ "add negative hours" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/branding.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/branding.js +index cb6b1158c6d5f57113200f22d7bd2237f93aba94..cccdbf63ef10fb3c7da743cf3e4ca584d2fb91ae 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/branding.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/branding.js +@@ -11,12 +11,14 @@ const add = Temporal.Instant.prototype.add; + + assert.sameValue(typeof add, "function"); + +-assert.throws(TypeError, () => add.call(undefined), "undefined"); +-assert.throws(TypeError, () => add.call(null), "null"); +-assert.throws(TypeError, () => add.call(true), "true"); +-assert.throws(TypeError, () => add.call(""), "empty string"); +-assert.throws(TypeError, () => add.call(Symbol()), "symbol"); +-assert.throws(TypeError, () => add.call(1), "1"); +-assert.throws(TypeError, () => add.call({}), "plain object"); +-assert.throws(TypeError, () => add.call(Temporal.Instant), "Temporal.Instant"); +-assert.throws(TypeError, () => add.call(Temporal.Instant.prototype), "Temporal.Instant.prototype"); ++const arg = new Temporal.Duration(0, 0, 0, 0, 5); ++ ++assert.throws(TypeError, () => add.call(undefined, arg), "undefined"); ++assert.throws(TypeError, () => add.call(null, arg), "null"); ++assert.throws(TypeError, () => add.call(true, arg), "true"); ++assert.throws(TypeError, () => add.call("", arg), "empty string"); ++assert.throws(TypeError, () => add.call(Symbol(), arg), "symbol"); ++assert.throws(TypeError, () => add.call(1, arg), "1"); ++assert.throws(TypeError, () => add.call({}, arg), "plain object"); ++assert.throws(TypeError, () => add.call(Temporal.Instant, arg), "Temporal.Instant"); ++assert.throws(TypeError, () => add.call(Temporal.Instant.prototype, arg), "Temporal.Instant.prototype"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/disallowed-duration-units.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/disallowed-duration-units.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f6e35389cd874844c243fc4741e2c19b884308e5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/disallowed-duration-units.js +@@ -0,0 +1,31 @@ ++// 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.instant.prototype.add ++description: | ++ Temporal.Instant.prototype.add() throws RangeError when the duration has ++ non-zero years, months, weeks, or days. ++info: | ++ 1. Let instant be the this value. ++ 3. Let duration be ? ToLimitedTemporalDuration(temporalDurationLike, « "years", "months", "weeks", "days" »). ++features: [Temporal] ++---*/ ++ ++const inst = new Temporal.Instant(500000n); ++assert.throws(RangeError, () => inst.add(new Temporal.Duration(1)), ++ "should throw RangeError when the duration has non-zero years (positive)"); ++assert.throws(RangeError, () => inst.add(new Temporal.Duration(0, 2)), ++ "should throw RangeError when the duration has non-zero months (positive)"); ++assert.throws(RangeError, () => inst.add(new Temporal.Duration(0, 0, 3)), ++ "should throw RangeError when the duration has non-zero weeks (positive)"); ++assert.throws(RangeError, () => inst.add(new Temporal.Duration(0, 0, 0, 4)), ++ "should throw RangeError when the duration has non-zero days (positive)"); ++assert.throws(RangeError, () => inst.add(new Temporal.Duration(-1)), ++ "should throw RangeError when the duration has non-zero years (negative)"); ++assert.throws(RangeError, () => inst.add(new Temporal.Duration(0, -2)), ++ "should throw RangeError when the duration has non-zero months (negative)"); ++assert.throws(RangeError, () => inst.add(new Temporal.Duration(0, 0, -3)), ++ "should throw RangeError when the duration has non-zero weeks (negative)"); ++assert.throws(RangeError, () => inst.add(new Temporal.Duration(0, 0, 0, -4)), ++ "should throw RangeError when the duration has non-zero days (negative)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/result-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/result-out-of-range.js +index 63f6bba22a3395dc659b2c9e99908b747c1a30c1..a2473233c8d6a98d0ca4b5434b33846b3d792866 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/result-out-of-range.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/add/result-out-of-range.js +@@ -9,8 +9,22 @@ features: [Temporal] + + const fields = ["hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds"]; + +-const instance = Temporal.Instant.fromEpochNanoseconds(8640000_000_000_000_000_000n); ++const latest = Temporal.Instant.fromEpochNanoseconds(8640000_000_000_000_000_000n); + + fields.forEach((field) => { +- assert.throws(RangeError, () => instance.add({ [field]: 1 })); ++ assert.throws( ++ RangeError, ++ () => latest.add({ [field]: 1 }), ++ `adding ${field} with result out of range (positive)` ++ ); ++}); ++ ++const earliest = Temporal.Instant.fromEpochNanoseconds(-8640000_000_000_000_000_000n); ++ ++fields.forEach((field) => { ++ assert.throws( ++ RangeError, ++ () => earliest.add({ [field]: -1 }), ++ `adding ${field} with result out of range (negative)` ++ ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-object-tostring.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-object-tostring.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2a0e34955d2712373f950b40c49df933138b69ff +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-object-tostring.js +@@ -0,0 +1,19 @@ ++// 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.instant.prototype.equals ++description: Object is converted to a string, then to Temporal.Instant ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const arg = {}; ++assert.throws(RangeError, () => instance.equals(arg), "[object Object] is not a valid ISO string"); ++ ++arg.toString = function() { ++ return "1970-01-01T00:00Z"; ++}; ++const result = instance.equals(arg); ++assert.sameValue(result, true, "result of toString is interpreted as ISO string"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-wrong-type.js +index 04d3d188bac3e00dad208f7d025c1c7b6c8119b2..d195169c908446986632e544d83097f07db327b5 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/argument-wrong-type.js +@@ -1,20 +1,37 @@ +-// Copyright (C) 2020 Igalia, S.L. All rights reserved. ++// 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.instant.prototype.equals +-description: Appropriate error thrown when argument cannot be converted to a valid string +-features: [Symbol, Temporal] ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ for Instant ++features: [BigInt, Symbol, Temporal] + ---*/ + +-const instance = Temporal.Instant.fromEpochSeconds(0); ++const instance = new Temporal.Instant(0n); + +-assert.throws(RangeError, () => instance.equals(undefined), "undefined"); +-assert.throws(RangeError, () => instance.equals(null), "null"); +-assert.throws(RangeError, () => instance.equals(true), "true"); +-assert.throws(RangeError, () => instance.equals(""), "empty string"); +-assert.throws(TypeError, () => instance.equals(Symbol()), "symbol"); +-assert.throws(RangeError, () => instance.equals(1), "1"); +-assert.throws(RangeError, () => instance.equals({}), "plain object"); +-assert.throws(RangeError, () => instance.equals(Temporal.Instant), "Temporal.Instant"); +-assert.throws(TypeError, () => instance.equals(Temporal.Instant.prototype), "Temporal.Instant.prototype"); ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++ [{}, "plain object"], ++ [Temporal.Instant, "Temporal.Instant, object"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [Temporal.Instant.prototype, "Temporal.Instant.prototype, object"], // fails brand check in toString() ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.equals(arg), `${description} does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/instant-string-sub-minute-offset.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/instant-string-sub-minute-offset.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5bbaaf32c4ec1f4309b3c7b1df0374662c82d14a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/instant-string-sub-minute-offset.js +@@ -0,0 +1,14 @@ ++// 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.instant.prototype.equals ++description: Temporal.Instant string with sub-minute offset ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const str = "1970-01-01T00:19:32.37+00:19:32.37"; ++const result = instance.equals(str); ++assert.sameValue(result, true, "if present, sub-minute offset is accepted exactly"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..547cbcfe8593a7e28ae8b5f37e147259d3d98b89 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/leap-second.js +@@ -0,0 +1,18 @@ ++// 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.instant.prototype.equals ++description: Leap second is a valid ISO string for Instant ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(1_483_228_799_000_000_000n); ++ ++const arg = "2016-12-31T23:59:60Z"; ++const result = instance.equals(arg); ++assert.sameValue( ++ result, ++ true, ++ "leap second is a valid ISO string for Instant" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/year-zero.js +index d2932d2888992d3cdd2700ad01fdf5f3adcaff8c..d568c70c3bf5ef428fe03da3b762f2f4f52ac510 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/equals/year-zero.js +@@ -4,19 +4,19 @@ + /*--- + esid: sec-temporal.instant.prototype.equals + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- "-000000-03-30T00:45Z", +- "-000000-03-30T01:45+01:00", +- "-000000-03-30T01:45:00+01:00[UTC]" ++ "-000000-03-30T00:45Z", ++ "-000000-03-30T01:45+01:00", ++ "-000000-03-30T01:45:00+00:00[UTC]", + ]; + const instance = new Temporal.Instant(0n); +-invalidStrings.forEach((str) => { ++invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => instance.equals(str), ++ () => instance.equals(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/options-wrong-type.js +index 51cba2ff1a1b1f82795159ed9c5a7e3fdc995ab1..0cd3a0a985e8ce4da40177dae63fb3b927362ac3 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/options-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/options-wrong-type.js +@@ -1,13 +1,13 @@ +-// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// 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.instant.prototype.round +-description: TypeError thrown when options argument is missing or a primitive +-features: [Symbol, Temporal] ++description: TypeError thrown when options argument is missing or a non-string primitive ++features: [BigInt, Symbol, Temporal] + ---*/ + +-const values = [ ++const badOptions = [ + undefined, + null, + true, +@@ -17,7 +17,8 @@ const values = [ + ]; + + const instance = new Temporal.Instant(0n); +-assert.throws(TypeError, () => instance.round(), "missing argument"); +-for (const value of values) { +- assert.throws(TypeError, () => instance.round(value), `argument ${String(value)}`); +-} ++assert.throws(TypeError, () => instance.round(), "TypeError on missing options argument"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.round(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/rounding-direction.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/rounding-direction.js +new file mode 100644 +index 0000000000000000000000000000000000000000..88a6abba4c2cfdb0b1f87e6fa6cebb7c0ec7cf64 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/rounding-direction.js +@@ -0,0 +1,30 @@ ++// 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.instant.prototype.round ++description: Rounding down is towards the Big Bang, not the epoch or 1 BCE ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(-65_261_246_399_500_000_000n); // -000099-12-15T12:00:00.5Z ++assert.sameValue( ++ instance.round({ smallestUnit: "second", roundingMode: "floor" }).epochNanoseconds, ++ -65_261_246_400_000_000_000n, // -000099-12-15T12:00:00Z ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode floor)" ++); ++assert.sameValue( ++ instance.round({ smallestUnit: "second", roundingMode: "trunc" }).epochNanoseconds, ++ -65_261_246_400_000_000_000n, // -000099-12-15T12:00:00Z ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode trunc)" ++); ++assert.sameValue( ++ instance.round({ smallestUnit: "second", roundingMode: "ceil" }).epochNanoseconds, ++ -65_261_246_399_000_000_000n, // -000099-12-15T12:00:01Z ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode ceil)" ++); ++assert.sameValue( ++ instance.round({ smallestUnit: "second", roundingMode: "halfExpand" }).epochNanoseconds, ++ -65_261_246_399_000_000_000n, // -000099-12-15T12:00:01Z ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode halfExpand)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/roundingmode-invalid-string.js +index 7f3ed29f4a24c43af997777921bec97a7d042911..a826b1e72e2dda050bcabf0e315be02d1bee45ce 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/roundingmode-invalid-string.js +@@ -8,4 +8,6 @@ features: [Temporal] + ---*/ + + const instant = new Temporal.Instant(1_000_000_000_123_987_500n); +-assert.throws(RangeError, () => instant.round({ smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => instant.round({ smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/roundto-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/roundto-invalid-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..db76bcd23fbc3ab7bb674acebb6ce03f48af9076 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/roundto-invalid-string.js +@@ -0,0 +1,35 @@ ++// 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.instant.prototype.round ++description: RangeError thrown when smallestUnit option not one of the allowed string values ++features: [Temporal] ++---*/ ++ ++const instant = new Temporal.Instant(1_000_000_000_123_987_500n); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => instant.round(smallestUnit), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/smallestunit-disallowed-units.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/smallestunit-disallowed-units.js +deleted file mode 100644 +index 2d7dcb1d5fbf6988359459bb4ada3e95cddb44a6..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/smallestunit-disallowed-units.js ++++ /dev/null +@@ -1,34 +0,0 @@ +-// Copyright (C) 2021 Igalia, S.L. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +- +-/*--- +-esid: sec-temporal.instant.prototype.round +-description: Specifically disallowed units for the smallestUnit option +-features: [Temporal, arrow-function] +----*/ +- +-const instance = new Temporal.Instant(1_000_000_000_987_654_321n); +-const invalidUnits = [ +- "era", +- "eras", +- "year", +- "month", +- "week", +- "years", +- "months", +- "weeks", +- "day", +- "days", +-]; +-invalidUnits.forEach((smallestUnit) => { +- assert.throws( +- RangeError, +- () => instance.round({ smallestUnit }), +- `{ smallestUnit: "${smallestUnit}" } should not be allowed as an argument to round` +- ); +- assert.throws( +- RangeError, +- () => instance.round(smallestUnit), +- `"${smallestUnit}" should not be allowed as an argument to round` +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/smallestunit-invalid-string.js +index 298c3ce64d6bb5063fab439d6c8a57667609e1b5..375603790911c9b465f2f8abbf3c3e1e840985be 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/round/smallestunit-invalid-string.js +@@ -8,4 +8,28 @@ features: [Temporal] + ---*/ + + const instant = new Temporal.Instant(1_000_000_000_123_987_500n); +-assert.throws(RangeError, () => instant.round({ smallestUnit: "other string" })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => instant.round({ smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-object-tostring.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-object-tostring.js +new file mode 100644 +index 0000000000000000000000000000000000000000..437de1654bbaa9cb4267c0aeb5f0e44e37ea6bca +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-object-tostring.js +@@ -0,0 +1,20 @@ ++// 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.instant.prototype.since ++description: Object is converted to a string, then to Temporal.Instant ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const arg = {}; ++assert.throws(RangeError, () => instance.since(arg), "[object Object] is not a valid ISO string"); ++ ++arg.toString = function() { ++ return "1970-01-01T00:00Z"; ++}; ++const result = instance.since(arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "result of toString is interpreted as ISO string"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..499623d4f7648f6851a0e01be517f6f45d8501e2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/argument-wrong-type.js +@@ -0,0 +1,37 @@ ++// 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.instant.prototype.since ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ for Instant ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++ [{}, "plain object"], ++ [Temporal.Instant, "Temporal.Instant, object"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [Temporal.Instant.prototype, "Temporal.Instant.prototype, object"], // fails brand check in toString() ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.since(arg), `${description} does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/instant-string-sub-minute-offset.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/instant-string-sub-minute-offset.js +new file mode 100644 +index 0000000000000000000000000000000000000000..00e766024fadfc1ebbc78fe3790b0db9c6ee41d4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/instant-string-sub-minute-offset.js +@@ -0,0 +1,15 @@ ++// 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.instant.prototype.since ++description: Temporal.Instant string with sub-minute offset ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const str = "1970-01-01T00:19:32.37+00:19:32.37"; ++const result = instance.since(str); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "if present, sub-minute offset is accepted exactly"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/largestunit-invalid-string.js +index 57aa9977ef288e6fa156182f6d0cdec8a5ddb150..48befae125623c5ba39ae5fc1161996680dc1408 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/largestunit-invalid-string.js +@@ -9,7 +9,28 @@ features: [Temporal] + + const earlier = new Temporal.Instant(1_000_000_000_000_000_000n); + const later = new Temporal.Instant(1_000_090_061_987_654_321n); +-const values = ["era", "eraYear", "years", "months", "weeks", "days", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..298aeb99b97f2bcba93264bca9f9e41f5d2a11b4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/leap-second.js +@@ -0,0 +1,19 @@ ++// 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.instant.prototype.since ++description: Leap second is a valid ISO string for Instant ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(1_483_228_799_000_000_000n); ++ ++const arg = "2016-12-31T23:59:60Z"; ++const result = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for Instant" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..529789279749edc972d5ebe454b70887b94c30a5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.instant.prototype.since ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Instant(0n); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.since(new Temporal.Instant(3600_000_000_000n), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/roundingmode-invalid-string.js +index 66f94cf2ca15134a9c13de54d697a3a6e9400801..27771f28e8c58387d494d9ce39d8c52d2d3b37e7 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/roundingmode-invalid-string.js +@@ -9,4 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.Instant(1_000_000_000_000_000_000n); + const later = new Temporal.Instant(1_000_090_061_123_987_500n); +-assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/smallestunit-invalid-string.js +index 0e91f3e745d95dc8e6c34db213f2449fd945c96e..25f795a89ae2d4873f42d1af422f76e03d50c559 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/smallestunit-invalid-string.js +@@ -9,7 +9,28 @@ features: [Temporal] + + const earlier = new Temporal.Instant(1_000_000_000_000_000_000n); + const later = new Temporal.Instant(1_000_090_061_987_654_321n); +-const values = ["era", "eraYear", "years", "months", "weeks", "days", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/year-zero.js +index 38bf10fd6732093c3f18262eebb7b3649fd9f3e9..e8f765c689359dbf6457cf0aeb5522090da498a8 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/since/year-zero.js +@@ -4,19 +4,19 @@ + /*--- + esid: sec-temporal.instant.prototype.since + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- "-000000-03-30T00:45Z", +- "-000000-03-30T01:45+01:00", +- "-000000-03-30T01:45:00+01:00[UTC]" ++ "-000000-03-30T00:45Z", ++ "-000000-03-30T01:45+01:00", ++ "-000000-03-30T01:45:00+00:00[UTC]", + ]; + const instance = new Temporal.Instant(0n); +-invalidStrings.forEach((str) => { ++invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => instance.since(str), ++ () => instance.since(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/basic.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..36fa8544520335a71a085605b1078270208bf2c3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/basic.js +@@ -0,0 +1,72 @@ ++// 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.instant.prototype.subtract ++description: Basic functionality of Temporal.Instant.prototype.subtract() ++info: | ++ 1. Let instant be the this value. ++ 2. Perform ? RequireInternalSlot(instant, [[InitializedTemporalInstant]]). ++ 3. Let duration be ? ToLimitedTemporalDuration(temporalDurationLike, « "years", "months", "weeks", "days" »). ++ 4. Let ns be ? AddInstant(instant.[[EpochNanoseconds]], duration.[[Hours]], duration.[[Minutes]], duration.[[Seconds]], duration.[[Milliseconds]], duration.[[Microseconds]], duration.[[Nanoseconds]]). ++ 5. Return ! CreateTemporalInstant(ns). ++features: [Temporal] ++---*/ ++ ++const inst = new Temporal.Instant(50000n); ++ ++let result = inst.subtract(new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, 3, 2, 1)); ++assert.sameValue( ++ -2952001n, ++ result.epochNanoseconds, ++ "subtract positive sub-seconds" ++); ++ ++result = inst.subtract(new Temporal.Duration(0, 0, 0, 0, 0, 0, 4, 3, 2, 1)); ++assert.sameValue( ++ BigInt(-4 * 1e9) - 2952001n, ++ result.epochNanoseconds, ++ "subtract positive seconds" ++); ++ ++result = inst.subtract(new Temporal.Duration(0, 0, 0, 0, 0, 5, 4, 3, 2, 1)); ++assert.sameValue( ++ BigInt(5 * 60 + 4) * -1000000000n - 2952001n, ++ result.epochNanoseconds, ++ "subtract positive minutes" ++); ++ ++result = inst.subtract(new Temporal.Duration(0, 0, 0, 0, 6, 5, 4, 3, 2, 1)); ++assert.sameValue( ++ BigInt(6 * 3600 + 5 * 60 + 4) * -1000000000n - 2952001n, ++ result.epochNanoseconds, ++ "subtract positive hours" ++); ++ ++result = inst.subtract(new Temporal.Duration(0, 0, 0, 0, 0, 0, 0, -3, -2, -1)); ++assert.sameValue( ++ 3052001n, ++ result.epochNanoseconds, ++ "subtract negative sub-seconds" ++); ++ ++result = inst.subtract(new Temporal.Duration(0, 0, 0, 0, 0, 0, -4, -3, -2, -1)); ++assert.sameValue( ++ BigInt(4 * 1e9) + 3052001n, ++ result.epochNanoseconds, ++ "subtract negative seconds" ++); ++ ++result = inst.subtract(new Temporal.Duration(0, 0, 0, 0, 0, -5, -4, -3, -2, -1)); ++assert.sameValue( ++ BigInt(5 * 60 + 4) * 1000000000n + 3052001n, ++ result.epochNanoseconds, ++ "subtract negative minutes" ++); ++ ++result = inst.subtract(new Temporal.Duration(0, 0, 0, 0, -6, -5, -4, -3, -2, -1)); ++assert.sameValue( ++ BigInt(6 * 3600 + 5 * 60 + 4) * 1000000000n + 3052001n, ++ result.epochNanoseconds, ++ "subtract negative hours" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/branding.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/branding.js +index d7c307e3f9fc18e64938e0c9f6380b9da0a10c84..a7aac12b9c235b0bd5db38e0ed6a2ecf274df2e9 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/branding.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/branding.js +@@ -11,12 +11,14 @@ const subtract = Temporal.Instant.prototype.subtract; + + assert.sameValue(typeof subtract, "function"); + +-assert.throws(TypeError, () => subtract.call(undefined), "undefined"); +-assert.throws(TypeError, () => subtract.call(null), "null"); +-assert.throws(TypeError, () => subtract.call(true), "true"); +-assert.throws(TypeError, () => subtract.call(""), "empty string"); +-assert.throws(TypeError, () => subtract.call(Symbol()), "symbol"); +-assert.throws(TypeError, () => subtract.call(1), "1"); +-assert.throws(TypeError, () => subtract.call({}), "plain object"); +-assert.throws(TypeError, () => subtract.call(Temporal.Instant), "Temporal.Instant"); +-assert.throws(TypeError, () => subtract.call(Temporal.Instant.prototype), "Temporal.Instant.prototype"); ++const arg = new Temporal.Duration(0, 0, 0, 0, 5); ++ ++assert.throws(TypeError, () => subtract.call(undefined, arg), "undefined"); ++assert.throws(TypeError, () => subtract.call(null, arg), "null"); ++assert.throws(TypeError, () => subtract.call(true, arg), "true"); ++assert.throws(TypeError, () => subtract.call("", arg), "empty string"); ++assert.throws(TypeError, () => subtract.call(Symbol(), arg), "symbol"); ++assert.throws(TypeError, () => subtract.call(1, arg), "1"); ++assert.throws(TypeError, () => subtract.call({}, arg), "plain object"); ++assert.throws(TypeError, () => subtract.call(Temporal.Instant, arg), "Temporal.Instant"); ++assert.throws(TypeError, () => subtract.call(Temporal.Instant.prototype, arg), "Temporal.Instant.prototype"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/disallowed-duration-units.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/disallowed-duration-units.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9a8cf9ae0e7997898ff4ed2bf73fff0e4edcba52 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/disallowed-duration-units.js +@@ -0,0 +1,31 @@ ++// 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.instant.prototype.subtract ++description: | ++ Temporal.Instant.prototype.subtract() throws RangeError when the duration has ++ non-zero years, months, weeks or days. ++info: | ++ 1. Let instant be the this value. ++ 3. Let duration be ? ToLimitedTemporalDuration(temporalDurationLike, « "years", "months", "weeks", "days" »). ++features: [Temporal] ++---*/ ++ ++let i1 = new Temporal.Instant(500000n); ++assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(1)), ++ "should throw RangeError when the duration has non-zero years (positive)"); ++assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, 2)), ++ "should throw RangeError when the duration has non-zero months (positive)"); ++assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, 0, 3)), ++ "should throw RangeError when the duration has non-zero weeks (positive)"); ++assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, 0, 0, 4)), ++ "should throw RangeError when the duration has non-zero days (positive)"); ++assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(-1)), ++ "should throw RangeError when the duration has non-zero years (negative)"); ++assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, -2)), ++ "should throw RangeError when the duration has non-zero months (negative)"); ++assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, 0, -3)), ++ "should throw RangeError when the duration has non-zero weeks (negative)"); ++assert.throws(RangeError, () => i1.subtract(new Temporal.Duration(0, 0, 0, -4)), ++ "should throw RangeError when the duration has non-zero days (negative)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js +index 83804b758c4d7bb954082a531a0848b775b85461..82702dea68def9bbd65d95e0d650161f3ec5fd23 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/subtract/result-out-of-range.js +@@ -2,15 +2,29 @@ + // This code is governed by the BSD license found in the LICENSE file. + + /*--- +-esid: sec-temporal.instant.prototype.add ++esid: sec-temporal.instant.prototype.subtract + description: RangeError thrown if result is outside representable range + features: [Temporal] + ---*/ + + const fields = ["hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds"]; + +-const instance = Temporal.Instant.fromEpochNanoseconds(-8640000_000_000_000_000_000n); ++const earliest = Temporal.Instant.fromEpochNanoseconds(-8640000_000_000_000_000_000n); + + fields.forEach((field) => { +- assert.throws(RangeError, () => instance.subtract({ [field]: 1 })); ++ assert.throws( ++ RangeError, ++ () => earliest.subtract({ [field]: 1 }), ++ `subtracting ${field} with result out of range (negative)` ++ ); ++}); ++ ++const latest = Temporal.Instant.fromEpochNanoseconds(8640000_000_000_000_000_000n); ++ ++fields.forEach((field) => { ++ assert.throws( ++ RangeError, ++ () => latest.subtract({ [field]: -1 }), ++ `subtracting ${field} with result out of range (positive)` ++ ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toJSON/year-format.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toJSON/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..01ffe822c866edf765a40e277019ab7ab3b91764 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toJSON/year-format.js +@@ -0,0 +1,53 @@ ++// 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.instant.prototype.tojson ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++function epochNsInYear(year) { ++ // Return an epoch nanoseconds value near the middle of the given year ++ const avgNsPerYear = 31_556_952_000_000_000n; ++ return (year - 1970n) * avgNsPerYear + (avgNsPerYear / 2n); ++} ++ ++let instance = new Temporal.Instant(epochNsInYear(-100000n)); ++assert.sameValue(instance.toJSON(), "-100000-07-01T21:30:36Z", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(-10000n)); ++assert.sameValue(instance.toJSON(), "-010000-07-01T21:30:36Z", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(-9999n)); ++assert.sameValue(instance.toJSON(), "-009999-07-02T03:19:48Z", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(-1000n)); ++assert.sameValue(instance.toJSON(), "-001000-07-02T09:30:36Z", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(-999n)); ++assert.sameValue(instance.toJSON(), "-000999-07-02T15:19:48Z", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(-1n)); ++assert.sameValue(instance.toJSON(), "-000001-07-02T15:41:24Z", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(0n)); ++assert.sameValue(instance.toJSON(), "0000-07-01T21:30:36Z", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(1n)); ++assert.sameValue(instance.toJSON(), "0001-07-02T03:19:48Z", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(999n)); ++assert.sameValue(instance.toJSON(), "0999-07-02T03:41:24Z", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(1000n)); ++assert.sameValue(instance.toJSON(), "1000-07-02T09:30:36Z", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(9999n)); ++assert.sameValue(instance.toJSON(), "9999-07-02T15:41:24Z", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(10000n)); ++assert.sameValue(instance.toJSON(), "+010000-07-01T21:30:36Z", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(100000n)); ++assert.sameValue(instance.toJSON(), "+100000-07-01T21:30:36Z", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5e37b7ffd5c4dfdea358de7f98e59b0a6daab88d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-auto.js +@@ -0,0 +1,23 @@ ++// 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.instant.prototype.tostring ++description: auto value for fractionalSecondDigits option ++features: [BigInt, Temporal] ++---*/ ++ ++const zeroSeconds = new Temporal.Instant(0n); ++const wholeSeconds = new Temporal.Instant(30_000_000_000n); ++const subSeconds = new Temporal.Instant(30_123_400_000n); ++ ++const tests = [ ++ [zeroSeconds, "1970-01-01T00:00:00Z"], ++ [wholeSeconds, "1970-01-01T00:00:30Z"], ++ [subSeconds, "1970-01-01T00:00:30.1234Z"], ++]; ++ ++for (const [instant, expected] of tests) { ++ assert.sameValue(instant.toString(), expected, "default is to emit seconds and drop trailing zeroes"); ++ assert.sameValue(instant.toString({ fractionalSecondDigits: "auto" }), expected, "auto is the default"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-invalid-string.js +index f75db5a7ffc520d0e1ab1739aac61d74e2e1a6f5..0a1cc3e3cb835d9dc8279d9f1742918cb79a7cbb 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-invalid-string.js +@@ -10,10 +10,13 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.instant.prototype.tostring step 6: +- 6. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 6. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + + const instant = new Temporal.Instant(1_000_000_000_987_650_000n); + +-assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: "other string" })); ++for (const fractionalSecondDigits of ["other string", "AUTO", "not-auto", "autos", "auto\0"]) { ++ assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits }), ++ `"${fractionalSecondDigits}" is not a valid value for fractionalSecondDigits`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-non-integer.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-non-integer.js +index beb567b6889cc107b3fd6d7b74b0b2d6ec3d1b75..1a3479b5cc61d4fa83809e578a0bd96e555a21af 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-non-integer.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-non-integer.js +@@ -10,7 +10,7 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.instant.prototype.tostring step 6: +- 6. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 6. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e6ba96340530de46f0d95b67081f0585d70e0e70 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-number.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. ++ ++/*--- ++esid: sec-temporal.instant.prototype.tostring ++description: Number for fractionalSecondDigits option ++features: [BigInt, Temporal] ++---*/ ++ ++const zeroSeconds = new Temporal.Instant(0n); ++const wholeSeconds = new Temporal.Instant(30_000_000_000n); ++const subSeconds = new Temporal.Instant(30_123_400_000n); ++ ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 0 }), "1970-01-01T00:00:30Z", ++ "truncates 4 decimal places to 0"); ++assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 2 }), "1970-01-01T00:00:00.00Z", ++ "pads zero seconds to 2 decimal places"); ++assert.sameValue(wholeSeconds.toString({ fractionalSecondDigits: 2 }), "1970-01-01T00:00:30.00Z", ++ "pads whole seconds to 2 decimal places"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 2 }), "1970-01-01T00:00:30.12Z", ++ "truncates 4 decimal places to 2"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 3 }), "1970-01-01T00:00:30.123Z", ++ "truncates 4 decimal places to 3"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 6 }), "1970-01-01T00:00:30.123400Z", ++ "pads 4 decimal places to 6"); ++assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 7 }), "1970-01-01T00:00:00.0000000Z", ++ "pads zero seconds to 7 decimal places"); ++assert.sameValue(wholeSeconds.toString({ fractionalSecondDigits: 7 }), "1970-01-01T00:00:30.0000000Z", ++ "pads whole seconds to 7 decimal places"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 7 }), "1970-01-01T00:00:30.1234000Z", ++ "pads 4 decimal places to 7"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 9 }), "1970-01-01T00:00:30.123400000Z", ++ "pads 4 decimal places to 9"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-out-of-range.js +index 4506d3ef2153845655fe8e6b3c8ac787b59dd782..a634aee890390d305339bf80b4eb95fecd7baee1 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-out-of-range.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-out-of-range.js +@@ -10,13 +10,17 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.instant.prototype.tostring step 6: +- 6. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 6. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + + const instant = new Temporal.Instant(1_000_000_000_987_650_000n); + +-assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: -1 })); +-assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: 10 })); +-assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: -Infinity })); +-assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: Infinity })); ++assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: -Infinity }), ++ "−∞ is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: -1 }), ++ "−1 is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: 10 }), ++ "10 is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: Infinity }), ++ "∞ is out of range for fractionalSecondDigits"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js +index 7bed467685f7b86874f8c00b720cf3dacc1781e4..be0fbf77e388a5aa451ecca304884e72004f7250 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-undefined.js +@@ -8,18 +8,31 @@ info: | + sec-getoption step 3: + 3. If _value_ is *undefined*, return _fallback_. + sec-getstringornumberoption step 2: +- 2. Let _value_ be ? GetOption(_options_, _property_, *"stringOrNumber"*, *undefined*, _fallback_). ++ 2. Let _value_ be ? GetOption(_options_, _property_, « Number, String », *undefined*, _fallback_). + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.instant.prototype.tostring step 6: +- 6. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 6. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + +-const instant = new Temporal.Instant(1_000_000_000_987_650_000n); ++const zeroSeconds = new Temporal.Instant(0n); ++const wholeSeconds = new Temporal.Instant(30_000_000_000n); ++const subSeconds = new Temporal.Instant(30_123_400_000n); + +-const explicit = instant.toString({ fractionalSecondDigits: undefined }); +-assert.sameValue(explicit, "2001-09-09T01:46:40.98765Z", "default fractionalSecondDigits is auto"); ++const tests = [ ++ [zeroSeconds, "1970-01-01T00:00:00Z"], ++ [wholeSeconds, "1970-01-01T00:00:30Z"], ++ [subSeconds, "1970-01-01T00:00:30.1234Z"], ++]; + +-const implicit = instant.toString({}); +-assert.sameValue(implicit, "2001-09-09T01:46:40.98765Z", "default fractionalSecondDigits is auto"); ++for (const [instant, expected] of tests) { ++ const explicit = instant.toString({ fractionalSecondDigits: undefined }); ++ assert.sameValue(explicit, expected, "default fractionalSecondDigits is auto (property present but undefined)"); ++ ++ const implicit = instant.toString({}); ++ assert.sameValue(implicit, expected, "default fractionalSecondDigits is auto (property not present)"); ++ ++ const lambda = instant.toString(() => {}); ++ assert.sameValue(lambda, expected, "default fractionalSecondDigits is auto (property not present, function object)"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-wrong-type.js +index 26eb23a30379d155c0967449033b0bbc41555512..419b4a86d169656b4ff3124c3b5f7c9fd358c633 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/fractionalseconddigits-wrong-type.js +@@ -22,4 +22,26 @@ features: [Temporal] + ---*/ + + const instant = new Temporal.Instant(1_000_000_000_987_650_000n); +-TemporalHelpers.checkFractionalSecondDigitsOptionWrongType(instant); ++ ++assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: null }), ++ "null is not a number and converts to the string 'null' which is not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: true }), ++ "true is not a number and converts to the string 'true' which is not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: false }), ++ "false is not a number and converts to the string 'false' which is not valid for fractionalSecondDigits"); ++assert.throws(TypeError, () => instant.toString({ fractionalSecondDigits: Symbol() }), ++ "symbols are not numbers and cannot convert to strings"); ++assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: 2n }), ++ "bigints are not numbers and convert to strings which are not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => instant.toString({ fractionalSecondDigits: {} }), ++ "plain objects are not numbers and convert to strings which are not valid for fractionalSecondDigits"); ++ ++const expected = [ ++ "get fractionalSecondDigits.toString", ++ "call fractionalSecondDigits.toString", ++]; ++const actual = []; ++const observer = TemporalHelpers.toPrimitiveObserver(actual, "auto", "fractionalSecondDigits"); ++const result = instant.toString({ fractionalSecondDigits: observer }); ++assert.sameValue(result, "2001-09-09T01:46:40.98765Z", "object with toString uses toString return value"); ++assert.compareArray(actual, expected, "object with toString calls toString and not valueOf"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4da3c9ebbc17f96a249af3ac98a0899d0f377cd1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.instant.prototype.tostring ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Instant(0n); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.toString(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/rounding-cross-midnight.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/rounding-cross-midnight.js +new file mode 100644 +index 0000000000000000000000000000000000000000..923671d4898d8270904d675120371d5d6eb0a65e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/rounding-cross-midnight.js +@@ -0,0 +1,13 @@ ++// 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.instant.prototype.tostring ++description: Rounding can cross midnight ++features: [Temporal] ++---*/ ++ ++const instant = new Temporal.Instant(946_684_799_999_999_999n); // one nanosecond before 2000-01-01T00:00:00 ++for (const roundingMode of ["ceil", "halfExpand"]) { ++ assert.sameValue(instant.toString({ fractionalSecondDigits: 8, roundingMode }), "2000-01-01T00:00:00.00000000Z"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/rounding-direction.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/rounding-direction.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f5185d9331dbe8cb45f95dc8830493ccc0146468 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/rounding-direction.js +@@ -0,0 +1,30 @@ ++// 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.instant.prototype.tostring ++description: Rounding down is towards the Big Bang, not the epoch or 1 BCE ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(-65_261_246_399_500_000_000n); // -000099-12-15T12:00:00.5Z ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "floor" }), ++ "-000099-12-15T12:00:00Z", ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE" ++); ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "trunc" }), ++ "-000099-12-15T12:00:00Z", ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode trunc)" ++); ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "ceil" }), ++ "-000099-12-15T12:00:01Z", ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode ceil)" ++); ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "halfExpand" }), ++ "-000099-12-15T12:00:01Z", ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode halfExpand)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-ceil.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-ceil.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f4cd9f0a8023d593e03bde89177706956ccc59c4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-ceil.js +@@ -0,0 +1,37 @@ ++// 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.instant.prototype.tostring ++description: ceil value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const instant = new Temporal.Instant(1_000_000_000_123_987_500n); ++ ++const result1 = instant.toString({ smallestUnit: "microsecond", roundingMode: "ceil" }); ++assert.sameValue(result1, "2001-09-09T01:46:40.123988Z", ++ "roundingMode is ceil (with 6 digits from smallestUnit)"); ++ ++const result2 = instant.toString({ fractionalSecondDigits: 6, roundingMode: "ceil" }); ++assert.sameValue(result2, "2001-09-09T01:46:40.123988Z", ++ "roundingMode is ceil (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = instant.toString({ smallestUnit: "millisecond", roundingMode: "ceil" }); ++assert.sameValue(result3, "2001-09-09T01:46:40.124Z", ++ "roundingMode is ceil (with 3 digits from smallestUnit)"); ++ ++const result4 = instant.toString({ fractionalSecondDigits: 3, roundingMode: "ceil" }); ++assert.sameValue(result4, "2001-09-09T01:46:40.124Z", ++ "roundingMode is ceil (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = instant.toString({ smallestUnit: "second", roundingMode: "ceil" }); ++assert.sameValue(result5, "2001-09-09T01:46:41Z", ++ "roundingMode is ceil (with 0 digits from smallestUnit)"); ++ ++const result6 = instant.toString({ fractionalSecondDigits: 0, roundingMode: "ceil" }); ++assert.sameValue(result6, "2001-09-09T01:46:41Z", ++ "roundingMode is ceil (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = instant.toString({ smallestUnit: "minute", roundingMode: "ceil" }); ++assert.sameValue(result7, "2001-09-09T01:47Z", "roundingMode is ceil (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-floor.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-floor.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d50326568b078e39b70af471760967500f610e70 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-floor.js +@@ -0,0 +1,37 @@ ++// 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.instant.prototype.tostring ++description: floor value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const instant = new Temporal.Instant(1_000_000_000_123_987_500n); ++ ++const result1 = instant.toString({ smallestUnit: "microsecond", roundingMode: "floor" }); ++assert.sameValue(result1, "2001-09-09T01:46:40.123987Z", ++ "roundingMode is floor (with 6 digits from smallestUnit)"); ++ ++const result2 = instant.toString({ fractionalSecondDigits: 6, roundingMode: "floor" }); ++assert.sameValue(result2, "2001-09-09T01:46:40.123987Z", ++ "roundingMode is floor (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = instant.toString({ smallestUnit: "millisecond", roundingMode: "floor" }); ++assert.sameValue(result3, "2001-09-09T01:46:40.123Z", ++ "roundingMode is floor (with 3 digits from smallestUnit)"); ++ ++const result4 = instant.toString({ fractionalSecondDigits: 3, roundingMode: "floor" }); ++assert.sameValue(result4, "2001-09-09T01:46:40.123Z", ++ "roundingMode is floor (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = instant.toString({ smallestUnit: "second", roundingMode: "floor" }); ++assert.sameValue(result5, "2001-09-09T01:46:40Z", ++ "roundingMode is floor (with 0 digits from smallestUnit)"); ++ ++const result6 = instant.toString({ fractionalSecondDigits: 0, roundingMode: "floor" }); ++assert.sameValue(result6, "2001-09-09T01:46:40Z", ++ "roundingMode is floor (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = instant.toString({ smallestUnit: "minute", roundingMode: "floor" }); ++assert.sameValue(result7, "2001-09-09T01:46Z", "roundingMode is floor (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-halfExpand.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-halfExpand.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7b8aa7e8fa7e4748ff811ae1d34aeaba56a36289 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-halfExpand.js +@@ -0,0 +1,37 @@ ++// 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.instant.prototype.tostring ++description: halfExpand value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const instant = new Temporal.Instant(1_000_000_000_123_987_500n); ++ ++const result1 = instant.toString({ smallestUnit: "microsecond", roundingMode: "halfExpand" }); ++assert.sameValue(result1, "2001-09-09T01:46:40.123988Z", ++ "roundingMode is halfExpand (with 6 digits from smallestUnit)"); ++ ++const result2 = instant.toString({ fractionalSecondDigits: 6, roundingMode: "halfExpand" }); ++assert.sameValue(result2, "2001-09-09T01:46:40.123988Z", ++ "roundingMode is halfExpand (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = instant.toString({ smallestUnit: "millisecond", roundingMode: "halfExpand" }); ++assert.sameValue(result3, "2001-09-09T01:46:40.124Z", ++ "roundingMode is halfExpand (with 3 digits from smallestUnit)"); ++ ++const result4 = instant.toString({ fractionalSecondDigits: 3, roundingMode: "halfExpand" }); ++assert.sameValue(result4, "2001-09-09T01:46:40.124Z", ++ "roundingMode is halfExpand (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = instant.toString({ smallestUnit: "second", roundingMode: "halfExpand" }); ++assert.sameValue(result5, "2001-09-09T01:46:40Z", ++ "roundingMode is halfExpand (with 0 digits from smallestUnit)"); ++ ++const result6 = instant.toString({ fractionalSecondDigits: 0, roundingMode: "halfExpand" }); ++assert.sameValue(result6, "2001-09-09T01:46:40Z", ++ "roundingMode is halfExpand (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = instant.toString({ smallestUnit: "minute", roundingMode: "halfExpand" }); ++assert.sameValue(result7, "2001-09-09T01:47Z", "roundingMode is halfExpand (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-invalid-string.js +index 4a4099b108fcb364ce27570c0228fd262abeaff1..6bff72f3b3d257809199438c7c9eb87d9aecdd42 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-invalid-string.js +@@ -8,4 +8,6 @@ features: [Temporal] + ---*/ + + const instant = new Temporal.Instant(1_000_000_000_123_987_500n); +-assert.throws(RangeError, () => instant.toString({ smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => instant.toString({ smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-trunc.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-trunc.js +new file mode 100644 +index 0000000000000000000000000000000000000000..944c479c1619de97843b508f5fbd919bae261f7d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/roundingmode-trunc.js +@@ -0,0 +1,37 @@ ++// 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.instant.prototype.tostring ++description: trunc value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const instant = new Temporal.Instant(1_000_000_000_123_987_500n); ++ ++const result1 = instant.toString({ smallestUnit: "microsecond", roundingMode: "trunc" }); ++assert.sameValue(result1, "2001-09-09T01:46:40.123987Z", ++ "roundingMode is trunc (with 6 digits from smallestUnit)"); ++ ++const result2 = instant.toString({ fractionalSecondDigits: 6, roundingMode: "trunc" }); ++assert.sameValue(result2, "2001-09-09T01:46:40.123987Z", ++ "roundingMode is trunc (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = instant.toString({ smallestUnit: "millisecond", roundingMode: "trunc" }); ++assert.sameValue(result3, "2001-09-09T01:46:40.123Z", ++ "roundingMode is trunc (with 3 digits from smallestUnit)"); ++ ++const result4 = instant.toString({ fractionalSecondDigits: 3, roundingMode: "trunc" }); ++assert.sameValue(result4, "2001-09-09T01:46:40.123Z", ++ "roundingMode is trunc (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = instant.toString({ smallestUnit: "second", roundingMode: "trunc" }); ++assert.sameValue(result5, "2001-09-09T01:46:40Z", ++ "roundingMode is trunc (with 0 digits from smallestUnit)"); ++ ++const result6 = instant.toString({ fractionalSecondDigits: 0, roundingMode: "trunc" }); ++assert.sameValue(result6, "2001-09-09T01:46:40Z", ++ "roundingMode is trunc (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = instant.toString({ smallestUnit: "minute", roundingMode: "trunc" }); ++assert.sameValue(result7, "2001-09-09T01:46Z", "roundingMode is trunc (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-fractionalseconddigits.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-fractionalseconddigits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..73d8f9aaf909338a0d22293445076103416b2b77 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-fractionalseconddigits.js +@@ -0,0 +1,30 @@ ++// 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.instant.prototype.tostring ++description: fractionalSecondDigits option is not used with smallestUnit present ++features: [Temporal] ++---*/ ++ ++const instant = new Temporal.Instant(56_789_999_999n); ++const tests = [ ++ ["minute", "1970-01-01T00:00Z"], ++ ["second", "1970-01-01T00:00:56Z"], ++ ["millisecond", "1970-01-01T00:00:56.789Z"], ++ ["microsecond", "1970-01-01T00:00:56.789999Z"], ++ ["nanosecond", "1970-01-01T00:00:56.789999999Z"], ++]; ++ ++for (const [smallestUnit, expected] of tests) { ++ const string = instant.toString({ ++ smallestUnit, ++ get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") } ++ }); ++ assert.sameValue(string, expected, `smallestUnit: "${smallestUnit}" overrides fractionalSecondDigits`); ++} ++ ++assert.throws(RangeError, () => instant.toString({ ++ smallestUnit: "hour", ++ get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") } ++}), "hour is an invalid smallestUnit but still overrides fractionalSecondDigits"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-invalid-string.js +index f6ba6e30cc69145377b33067ef6a8f168d9eae8f..10b0b72baabf9df57d932a33238f76b2d5f3afae 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-invalid-string.js +@@ -8,4 +8,30 @@ features: [Temporal] + ---*/ + + const instant = new Temporal.Instant(1_000_000_000_123_987_500n); +-assert.throws(RangeError, () => instant.toString({ smallestUnit: "other string" })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "hour", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "hours", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => instant.toString({ smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-valid-units.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-valid-units.js +index 191eec97ed44e9bfc1f5c69432e0e2f0e82bac83..e1c53c93eb68e2afe887c7c4c3be2b39782f76f1 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-valid-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/smallestunit-valid-units.js +@@ -9,11 +9,36 @@ features: [Temporal] + + const instant = new Temporal.Instant(1_000_000_000_123_456_789n); + +-assert.sameValue(instant.toString({ smallestUnit: "minute" }), "2001-09-09T01:46Z"); +-assert.sameValue(instant.toString({ smallestUnit: "second" }), "2001-09-09T01:46:40Z"); +-assert.sameValue(instant.toString({ smallestUnit: "millisecond" }), "2001-09-09T01:46:40.123Z"); +-assert.sameValue(instant.toString({ smallestUnit: "microsecond" }), "2001-09-09T01:46:40.123456Z"); +-assert.sameValue(instant.toString({ smallestUnit: "nanosecond" }), "2001-09-09T01:46:40.123456789Z"); ++function test(instance, expectations, description) { ++ for (const [smallestUnit, expectedResult] of expectations) { ++ assert.sameValue(instance.toString({ smallestUnit }), expectedResult, ++ `${description} with smallestUnit "${smallestUnit}"`); ++ } ++} ++ ++test( ++ instant, ++ [ ++ ["minute", "2001-09-09T01:46Z"], ++ ["second", "2001-09-09T01:46:40Z"], ++ ["millisecond", "2001-09-09T01:46:40.123Z"], ++ ["microsecond", "2001-09-09T01:46:40.123456Z"], ++ ["nanosecond", "2001-09-09T01:46:40.123456789Z"], ++ ], ++ "subseconds toString" ++); ++ ++test( ++ new Temporal.Instant(999_999_960_000_000_000n), ++ [ ++ ["minute", "2001-09-09T01:46Z"], ++ ["second", "2001-09-09T01:46:00Z"], ++ ["millisecond", "2001-09-09T01:46:00.000Z"], ++ ["microsecond", "2001-09-09T01:46:00.000000Z"], ++ ["nanosecond", "2001-09-09T01:46:00.000000000Z"], ++ ], ++ "whole minutes toString" ++); + + const notValid = [ + "era", +@@ -25,5 +50,6 @@ const notValid = [ + ]; + + notValid.forEach((smallestUnit) => { +- assert.throws(RangeError, () => instant.toString({ smallestUnit }), smallestUnit); ++ assert.throws(RangeError, () => instant.toString({ smallestUnit }), ++ `"${smallestUnit}" is not a valid unit for the smallestUnit option`); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..72e3391394058cf01e21ec6f05906981c509666a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.instant.prototype.tostring ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = instance.toString({ timeZone }); ++assert.sameValue(result1.substr(-6), "+00:00", "leap second is a valid ISO string for TimeZone"); ++const result2 = instance.toString({ timeZone: { timeZone } }); ++assert.sameValue(result2.substr(-6), "+00:00", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.toString({ timeZone }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.toString({ timeZone: { timeZone } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c04a611c0704f9822d273353fddf6145b99c8baf +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.instant.prototype.tostring ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Instant(0n); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.toString({ timeZone }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.toString({ timeZone: { timeZone } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d7112ae6e6834a071feb63732b7cb7ce25197d40 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.instant.prototype.tostring ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toString({ timeZone }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.toString({ timeZone: { timeZone } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toString({ timeZone }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.toString({ timeZone: { timeZone } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.toString({ timeZone: { timeZone } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/year-format.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..195115a0c3fe46c56606268dbb757fe9d95002cb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toString/year-format.js +@@ -0,0 +1,53 @@ ++// 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.instant.prototype.tostring ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++function epochNsInYear(year) { ++ // Return an epoch nanoseconds value near the middle of the given year ++ const avgNsPerYear = 31_556_952_000_000_000n; ++ return (year - 1970n) * avgNsPerYear + (avgNsPerYear / 2n); ++} ++ ++let instance = new Temporal.Instant(epochNsInYear(-100000n)); ++assert.sameValue(instance.toString(), "-100000-07-01T21:30:36Z", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(-10000n)); ++assert.sameValue(instance.toString(), "-010000-07-01T21:30:36Z", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(-9999n)); ++assert.sameValue(instance.toString(), "-009999-07-02T03:19:48Z", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(-1000n)); ++assert.sameValue(instance.toString(), "-001000-07-02T09:30:36Z", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(-999n)); ++assert.sameValue(instance.toString(), "-000999-07-02T15:19:48Z", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(-1n)); ++assert.sameValue(instance.toString(), "-000001-07-02T15:41:24Z", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(0n)); ++assert.sameValue(instance.toString(), "0000-07-01T21:30:36Z", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(1n)); ++assert.sameValue(instance.toString(), "0001-07-02T03:19:48Z", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(999n)); ++assert.sameValue(instance.toString(), "0999-07-02T03:41:24Z", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(1000n)); ++assert.sameValue(instance.toString(), "1000-07-02T09:30:36Z", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(9999n)); ++assert.sameValue(instance.toString(), "9999-07-02T15:41:24Z", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(10000n)); ++assert.sameValue(instance.toString(), "+010000-07-01T21:30:36Z", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.Instant(epochNsInYear(100000n)); ++assert.sameValue(instance.toString(), "+100000-07-01T21:30:36Z", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b66e68c75c8ce5172e1597898c2ba063c25281d7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-number.js +@@ -0,0 +1,29 @@ ++// 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.instant.prototype.tozoneddatetime ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(1_000_000_000_000_000_000n); ++ ++const arg = 19761118; ++ ++const result = instance.toZonedDateTime({ calendar: arg, timeZone: "UTC" }); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ calendar: arg, timeZone: "UTC" }), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7264f33377f231cf1d5d195d4c8e2e62d29d22ba +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-string-leap-second.js +@@ -0,0 +1,26 @@ ++// 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.instant.prototype.tozoneddatetime ++description: Leap second is a valid ISO string for Calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(1_000_000_000_000_000_000n); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.toZonedDateTime({ calendar: arg, timeZone: "UTC" }); ++assert.sameValue( ++ result1.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar" ++); ++ ++arg = { calendar: "2016-12-31T23:59:60" }; ++const result2 = instance.toZonedDateTime({ calendar: arg, timeZone: "UTC" }); ++assert.sameValue( ++ result2.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c6c4992ab9b0c47a02cea62c08855de83ebdb516 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-wrong-type.js +@@ -0,0 +1,32 @@ ++// 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.instant.prototype.tozoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(1_000_000_000_000_000_000n); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toZonedDateTime({ calendar: arg, timeZone: "UTC" }), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toZonedDateTime({ calendar: arg, timeZone: "UTC" }), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b3a25f04a9be14de0fc9a29e73087746bdbe1ce0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.instant.prototype.tozoneddatetime ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = instance.toZonedDateTime({ timeZone, calendar: "iso8601" }); ++assert.sameValue(result1.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone"); ++const result2 = instance.toZonedDateTime({ timeZone: { timeZone }, calendar: "iso8601" }); ++assert.sameValue(result2.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone, calendar: "iso8601" }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone: { timeZone }, calendar: "iso8601" }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..841a1bcb3d20c02a685a1492c464747d1db3a308 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.instant.prototype.tozoneddatetime ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Instant(0n); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ timeZone, calendar: "iso8601" }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ timeZone: { timeZone }, calendar: "iso8601" }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5400a7f5e48bb2605971892335b7a62f2349e2cf +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.instant.prototype.tozoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone, calendar: "iso8601" }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone: { timeZone }, calendar: "iso8601" }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toZonedDateTime({ timeZone, calendar: "iso8601" }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.toZonedDateTime({ timeZone: { timeZone }, calendar: "iso8601" }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone: { timeZone }, calendar: "iso8601" }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..46be8be647eb1c7ae52bb34d595d7d235d0d2970 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.instant.prototype.tozoneddatetimeiso ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = instance.toZonedDateTimeISO(timeZone); ++assert.sameValue(result1.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone"); ++const result2 = instance.toZonedDateTimeISO({ timeZone }); ++assert.sameValue(result2.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.toZonedDateTimeISO(timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.toZonedDateTimeISO({ timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a8a397ada44c539c097868e79354d850ec3ee7a8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.instant.prototype.tozoneddatetimeiso ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Instant(0n); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTimeISO(timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTimeISO({ timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0358af03ec7a43bded6e5cae5190b05253d6f12b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.instant.prototype.tozoneddatetimeiso ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toZonedDateTimeISO(timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.toZonedDateTimeISO({ timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toZonedDateTimeISO(timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.toZonedDateTimeISO({ timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.toZonedDateTimeISO({ timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-object-tostring.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-object-tostring.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b91a46a44203e125c3e02317220e160bfecc4698 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-object-tostring.js +@@ -0,0 +1,20 @@ ++// 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.instant.prototype.until ++description: Object is converted to a string, then to Temporal.Instant ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const arg = {}; ++assert.throws(RangeError, () => instance.until(arg), "[object Object] is not a valid ISO string"); ++ ++arg.toString = function() { ++ return "1970-01-01T00:00Z"; ++}; ++const result = instance.until(arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "result of toString is interpreted as ISO string"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a4de0bae40d36d9108077e4fee4707cd176044b2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/argument-wrong-type.js +@@ -0,0 +1,37 @@ ++// 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.instant.prototype.until ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ for Instant ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++ [{}, "plain object"], ++ [Temporal.Instant, "Temporal.Instant, object"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [Temporal.Instant.prototype, "Temporal.Instant.prototype, object"], // fails brand check in toString() ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.until(arg), `${description} does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/instant-string-sub-minute-offset.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/instant-string-sub-minute-offset.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9630b1a4f0df8fe0597f56b7deab9440a3b1a006 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/instant-string-sub-minute-offset.js +@@ -0,0 +1,15 @@ ++// 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.instant.prototype.until ++description: Temporal.Instant string with sub-minute offset ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(0n); ++ ++const str = "1970-01-01T00:19:32.37+00:19:32.37"; ++const result = instance.until(str); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "if present, sub-minute offset is accepted exactly"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/largestunit-invalid-string.js +index 9d288cd6d6d8772ed14925c271da3b4ac68c2f43..0837ea1dbb1c5222aac6df256da25b06dfb03a6c 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/largestunit-invalid-string.js +@@ -9,7 +9,28 @@ features: [Temporal] + + const earlier = new Temporal.Instant(1_000_000_000_000_000_000n); + const later = new Temporal.Instant(1_000_090_061_987_654_321n); +-const values = ["era", "eraYear", "years", "months", "weeks", "days", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/leap-second.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5c19ac969ac16fabc2d04663f3c6170b3133b6c7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/leap-second.js +@@ -0,0 +1,19 @@ ++// 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.instant.prototype.until ++description: Leap second is a valid ISO string for Instant ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Instant(1_483_228_799_000_000_000n); ++ ++const arg = "2016-12-31T23:59:60Z"; ++const result = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for Instant" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c30976350c2312e569b3db2014b62a17a47e292e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.instant.prototype.until ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.Instant(0n); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.until(new Temporal.Instant(3600_000_000_000n), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/roundingmode-invalid-string.js +index fc8aaed464f78eb11131aa687e841edfc4c24619..82a212cafd8b81008b7db8510aeaea55607544c0 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/roundingmode-invalid-string.js +@@ -9,4 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.Instant(1_000_000_000_000_000_000n); + const later = new Temporal.Instant(1_000_090_061_123_987_500n); +-assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/smallestunit-invalid-string.js +index 145ea2b808e1a8981e243fc47c4dbd27551957af..146b390014e5256d6b16cbd0b1b347b280a38d1f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/smallestunit-invalid-string.js +@@ -9,7 +9,28 @@ features: [Temporal] + + const earlier = new Temporal.Instant(1_000_000_000_000_000_000n); + const later = new Temporal.Instant(1_000_090_061_987_654_321n); +-const values = ["era", "eraYear", "years", "months", "weeks", "days", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/year-zero.js b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/year-zero.js +index 28953c09e546922d2d885c9812daace11b3ec715..641cf7f3d6ee0f117d533035257570a92706d7ef 100644 +--- a/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/Instant/prototype/until/year-zero.js +@@ -4,19 +4,19 @@ + /*--- + esid: sec-temporal.instant.prototype.until + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- "-000000-03-30T00:45Z", +- "-000000-03-30T01:45+01:00", +- "-000000-03-30T01:45:00+01:00[UTC]" ++ "-000000-03-30T00:45Z", ++ "-000000-03-30T01:45+01:00", ++ "-000000-03-30T01:45:00+00:00[UTC]", + ]; + const instance = new Temporal.Instant(0n); +-invalidStrings.forEach((str) => { ++invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => instance.until(str), ++ () => instance.until(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDate/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8586672bdd805f147080eb0ab7bc4cd9413f6b36 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/calendar-number.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.now.plaindate ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const arg = 19761118; ++ ++const result = Temporal.Now.plainDate(arg); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainDate(arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDate/calendar-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/calendar-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..25c6a9bd3b3d1797cef172d87b01743446366545 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/calendar-string-leap-second.js +@@ -0,0 +1,24 @@ ++// 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.now.plaindate ++description: Leap second is a valid ISO string for Calendar ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = Temporal.Now.plainDate(arg); ++assert.sameValue( ++ result1.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar" ++); ++ ++arg = { calendar: "2016-12-31T23:59:60" }; ++const result2 = Temporal.Now.plainDate(arg); ++assert.sameValue( ++ result2.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDate/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3c9d54c0c4e94af6654d7f944be48cbcfb25b940 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/calendar-wrong-type.js +@@ -0,0 +1,30 @@ ++// 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.now.plaindate ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Now.plainDate(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Now.plainDate(arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDate/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..93db0e2f4cc677347092aec14a1cdf04f600cab2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.now.plaindate ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// A string with a leap second is a valid ISO string, so the following two ++// operations should not throw ++ ++Temporal.Now.plainDate("iso8601", timeZone); ++Temporal.Now.plainDate("iso8601", { timeZone }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.Now.plainDate("iso8601", timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => Temporal.Now.plainDate("iso8601", { timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDate/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..71bb7a11a7fc6ed55463c97bc489521309ea3bff +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/timezone-string-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.now.plaindate ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainDate("iso8601", timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainDate("iso8601", { timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDate/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..132b6f3f29d7ee09fe987dceb7fe5108790404b3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDate/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.now.plaindate ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Now.plainDate("iso8601", timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => Temporal.Now.plainDate("iso8601", { timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Now.plainDate("iso8601", timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => Temporal.Now.plainDate("iso8601", { timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.Now.plainDate("iso8601", { timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateISO/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateISO/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..54f01540c1cc93f3f79355dae0a161659c75c86c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateISO/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.now.plaindateiso ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// A string with a leap second is a valid ISO string, so the following two ++// operations should not throw ++ ++Temporal.Now.plainDateISO(timeZone); ++Temporal.Now.plainDateISO({ timeZone }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.Now.plainDateISO(timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => Temporal.Now.plainDateISO({ timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateISO/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateISO/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5a0c755aa70cec87f19924360f677fd1f42b77ad +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateISO/timezone-string-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.now.plaindateiso ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainDateISO(timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainDateISO({ timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateISO/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateISO/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..495e18c9cd6719a692c68bfb044fa060d265ae2e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateISO/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.now.plaindateiso ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Now.plainDateISO(timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => Temporal.Now.plainDateISO({ timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Now.plainDateISO(timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => Temporal.Now.plainDateISO({ timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.Now.plainDateISO({ timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5d226c703ea1f12b480f6ef17e60fa72d9ac9750 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/calendar-number.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.now.plaindatetime ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const arg = 19761118; ++ ++const result = Temporal.Now.plainDateTime(arg); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainDateTime(arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/calendar-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/calendar-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..98af04f8088f04ee042eedce5d24d810d1fdf911 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/calendar-string-leap-second.js +@@ -0,0 +1,24 @@ ++// 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.now.plaindatetime ++description: Leap second is a valid ISO string for Calendar ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = Temporal.Now.plainDateTime(arg); ++assert.sameValue( ++ result1.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar" ++); ++ ++arg = { calendar: "2016-12-31T23:59:60" }; ++const result2 = Temporal.Now.plainDateTime(arg); ++assert.sameValue( ++ result2.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ccb5a6f722759e82af6eee26dccf35e9606b7f23 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/calendar-wrong-type.js +@@ -0,0 +1,30 @@ ++// 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.now.plaindatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Now.plainDateTime(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Now.plainDateTime(arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e080f9aa857e4952bc7be476573887de1b2566fe +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.now.plaindatetime ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// A string with a leap second is a valid ISO string, so the following two ++// operations should not throw ++ ++Temporal.Now.plainDateTime("iso8601", timeZone); ++Temporal.Now.plainDateTime("iso8601", { timeZone }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.Now.plainDateTime("iso8601", timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => Temporal.Now.plainDateTime("iso8601", { timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..32c6a023c7f15a9b6abae23c9b6debbb3e940162 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/timezone-string-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.now.plaindatetime ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainDateTime("iso8601", timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainDateTime("iso8601", { timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2ded8373098902d05e2bac58deb9955807341799 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTime/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.now.plaindatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Now.plainDateTime("iso8601", timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => Temporal.Now.plainDateTime("iso8601", { timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Now.plainDateTime("iso8601", timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => Temporal.Now.plainDateTime("iso8601", { timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.Now.plainDateTime("iso8601", { timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4fc82538c222644efbef5d8a24a71bd353c0de05 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.now.plaindatetimeiso ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// A string with a leap second is a valid ISO string, so the following two ++// operations should not throw ++ ++Temporal.Now.plainDateTimeISO(timeZone); ++Temporal.Now.plainDateTimeISO({ timeZone }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.Now.plainDateTimeISO(timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => Temporal.Now.plainDateTimeISO({ timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..48501a4b07db23605cc3a403bbc6a0d9b475a768 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-string-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.now.plaindatetimeiso ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainDateTimeISO(timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainDateTimeISO({ timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..85dbb12387433f2c91b7eceba1afb33b23deda40 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainDateTimeISO/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.now.plaindatetimeiso ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Now.plainDateTimeISO(timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => Temporal.Now.plainDateTimeISO({ timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Now.plainDateTimeISO(timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => Temporal.Now.plainDateTimeISO({ timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.Now.plainDateTimeISO({ timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f37d00c9b2ff2f13fc6ca45a70f3d6c8ce797e0d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.now.plaintimeiso ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// A string with a leap second is a valid ISO string, so the following two ++// operations should not throw ++ ++Temporal.Now.plainTimeISO(timeZone); ++Temporal.Now.plainTimeISO({ timeZone }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.Now.plainTimeISO(timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => Temporal.Now.plainTimeISO({ timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a9770de6fdd4725f1d7215be97535fa735475d55 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-string-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.now.plaintimeiso ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainTimeISO(timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.plainTimeISO({ timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..356d766377bdffed495a6862f01b7320f52042a8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/plainTimeISO/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.now.plaintimeiso ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Now.plainTimeISO(timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => Temporal.Now.plainTimeISO({ timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Now.plainTimeISO(timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => Temporal.Now.plainTimeISO({ timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.Now.plainTimeISO({ timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..296ed87aa0f372ddc51c618596949b3d14e5e4e1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-number.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.now.zoneddatetime ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const arg = 19761118; ++ ++const result = Temporal.Now.zonedDateTime(arg); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.zonedDateTime(arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..dde4ad71fe4b4725725def556f3c15d9a47fff61 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-string-leap-second.js +@@ -0,0 +1,24 @@ ++// 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.now.zoneddatetime ++description: Leap second is a valid ISO string for Calendar ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = Temporal.Now.zonedDateTime(arg); ++assert.sameValue( ++ result1.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar" ++); ++ ++arg = { calendar: "2016-12-31T23:59:60" }; ++const result2 = Temporal.Now.zonedDateTime(arg); ++assert.sameValue( ++ result2.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8ba88cc410fa75794be3ad7b1ecb85095e0169e2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/calendar-wrong-type.js +@@ -0,0 +1,30 @@ ++// 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.now.zoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Now.zonedDateTime(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Now.zonedDateTime(arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b91fd58cdffab3da085f85e1f94b6f5f24d3b1cd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-string-leap-second.js +@@ -0,0 +1,19 @@ ++// 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.now.zoneddatetime ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = Temporal.Now.zonedDateTime("iso8601", timeZone); ++assert.sameValue(result1.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone"); ++const result2 = Temporal.Now.zonedDateTime("iso8601", { timeZone }); ++assert.sameValue(result2.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.Now.zonedDateTime("iso8601", timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => Temporal.Now.zonedDateTime("iso8601", { timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e27b3f1730311f6031ee5210430acdd89898d8a0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-string-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.now.zoneddatetime ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.zonedDateTime("iso8601", timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.zonedDateTime("iso8601", { timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2284860ba13cb7ff48fed61575fcdf4532b1464c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTime/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.now.zoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Now.zonedDateTime("iso8601", timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => Temporal.Now.zonedDateTime("iso8601", { timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Now.zonedDateTime("iso8601", timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => Temporal.Now.zonedDateTime("iso8601", { timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.Now.zonedDateTime("iso8601", { timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f5a1dbaf77f2379ba34ae018b32b20f2e8e0bb49 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-leap-second.js +@@ -0,0 +1,19 @@ ++// 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.now.zoneddatetimeiso ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = Temporal.Now.zonedDateTimeISO(timeZone); ++assert.sameValue(result1.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone"); ++const result2 = Temporal.Now.zonedDateTimeISO({ timeZone }); ++assert.sameValue(result2.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.Now.zonedDateTimeISO(timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => Temporal.Now.zonedDateTimeISO({ timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6417c0a787d3972591c6eb7ed8add34ee27293c1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.now.zoneddatetimeiso ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.zonedDateTimeISO(timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.Now.zonedDateTimeISO({ timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1f992209c23e30aea78c33d4fed8f30e791492a6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/Now/zonedDateTimeISO/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.now.zoneddatetimeiso ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.Now.zonedDateTimeISO(timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => Temporal.Now.zonedDateTimeISO({ timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.Now.zonedDateTimeISO(timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => Temporal.Now.zonedDateTimeISO({ timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.Now.zonedDateTimeISO({ timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8fdba7016482d0c454e6cba5a1eee70d81c051ef +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/calendar-number.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.plaindate ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const arg = 19761118; ++ ++const result = new Temporal.PlainDate(2000, 5, 2, arg); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => new Temporal.PlainDate(2000, 5, 2, arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..10370ab28dbe4c7dbe2d76385e85d497490136d1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/calendar-wrong-type.js +@@ -0,0 +1,30 @@ ++// 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.plaindate ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => new Temporal.PlainDate(2000, 5, 2, arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => new Temporal.PlainDate(2000, 5, 2, arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cf93daf7a16ea32195401db962a84363e7c9dae9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-number.js +@@ -0,0 +1,34 @@ ++// 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.plaindate.compare ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const arg = 19761118; ++ ++const result1 = Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)); ++assert.sameValue(result1, 0, "19761118 is a valid ISO string for PlainDate (first argument)"); ++const result2 = Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg); ++assert.sameValue(result2, 0, "19761118 is a valid ISO string for PlainDate (second argument)"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate (second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..94b12a67ab79006b678ab93be2c176d8edcd7ea6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-leap-second.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.plaindate.compare ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)); ++assert.sameValue(result1, 0, "leap second is a valid ISO string for calendar (first argument)"); ++const result2 = Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg); ++assert.sameValue(result2, 0, "leap second is a valid ISO string for calendar (first argument)"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result3 = Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)); ++assert.sameValue(result3, 0, "leap second is a valid ISO string for calendar (nested property, first argument)"); ++const result4 = Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg); ++assert.sameValue(result4, 0, "leap second is a valid ISO string for calendar (nested property, second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..debcfec9c19893403fea347b802a888c302ebbfb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-number.js +@@ -0,0 +1,53 @@ ++// 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.plaindate.compare ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)); ++assert.sameValue(result1, 0, "19970327 is a valid ISO string for calendar (first argument)"); ++const result2 = Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg); ++assert.sameValue(result2, 0, "19970327 is a valid ISO string for calendar (first argument)"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result3 = Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)); ++assert.sameValue(result3, 0, "19970327 is a valid ISO string for calendar (nested property, first argument)"); ++const result4 = Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg); ++assert.sameValue(result4, 0, "19970327 is a valid ISO string for calendar (nested property, first argument)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (second argument)` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property, first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property, second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..04866d8831faed8068d179984d13800ad875ef82 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,49 @@ ++// 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.plaindate.compare ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), `${description} does not convert to a valid ISO string (second argument)`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), `${description} does not convert to a valid ISO string (nested property, first argument)`); ++ assert.throws(RangeError, () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), `${description} does not convert to a valid ISO string (nested property, second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), `${description} is not a valid property bag and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), `${description} is not a valid property bag and does not convert to a string (nested property, first argument)`); ++ assert.throws(TypeError, () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), `${description} is not a valid property bag and does not convert to a string (nested property, second argument)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), `nested undefined calendar property is always a RangeError (first argument)`); ++assert.throws(RangeError, () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), `nested undefined calendar property is always a RangeError (second argument)`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d99de36cdf23a3e338e677886b80a0be45967b42 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,29 @@ ++// 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.plaindate.compare ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++ ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), ++ "reject minus zero as extended year (first argument)" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), ++ "reject minus zero as extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8c0480b1d1abd2a81e0523b71209013b257c35be +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-string-invalid.js +@@ -0,0 +1,66 @@ ++// 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.plaindate.compare ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a %%%conversion_target%%% ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const other = new Temporal.PlainDate(2020, 1, 1); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.compare(arg, other), ++ `"${arg}" should not be a valid ISO string for a PlainDate (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.compare(other, arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate (second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c25dc6772b1baa0da121cb9ce39eca2b5110d0df +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plaindate.compare ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), `${description} does not convert to a valid ISO string (second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18)), `${description} is not a valid property bag and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e874d00f7cc1476c2eb2e53fae95fa4c758186f6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.plaindate.prototype.compare ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++Temporal.PlainDate.compare({ year: 2000, month: 5, day: 2, calendar }, { year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 2); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..125edba5a7c6a9b2f302f6af80a87b18c398bd8b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/leap-second.js +@@ -0,0 +1,20 @@ ++// 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.plaindate.compare ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++let result = Temporal.PlainDate.compare(arg, new Temporal.PlainDate(2016, 12, 31)); ++assert.sameValue(result, 0, "leap second is a valid ISO string for PlainDate (first argument)"); ++result = Temporal.PlainDate.compare(new Temporal.PlainDate(2016, 12, 31), arg); ++assert.sameValue(result, 0, "leap second is a valid ISO string for PlainDate (second argument)"); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++result = Temporal.PlainDate.compare(arg, new Temporal.PlainDate(2016, 12, 31)); ++assert.sameValue(result, 0, "second: 60 is ignored in property bag for PlainDate (first argument)"); ++result = Temporal.PlainDate.compare(new Temporal.PlainDate(2016, 12, 31), arg); ++assert.sameValue(result, 0, "second: 60 is ignored in property bag for PlainDate (second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/year-zero.js +index 75f79cf98e93589340ec0143a5115f9045426b34..9bb6812affeb119227707cdb6e4627f1a632b951 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/compare/year-zero.js +@@ -8,14 +8,21 @@ features: [Temporal] + ---*/ + + const instance = new Temporal.PlainDate(2000, 5, 2); +-const bad = "-000000-08-24"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + +-assert.throws(RangeError, +- () => Temporal.PlainDate.compare(bad, instance), +- "Minus zero is an invalid extended year (first argument)" +-); ++invalidStrings.forEach((arg) => { ++ assert.throws(RangeError, ++ () => Temporal.PlainDate.compare(arg, instance), ++ "Minus zero is an invalid extended year (first argument)" ++ ); + +-assert.throws(RangeError, +- () => Temporal.PlainDate.compare(instance, bad), +- "Minus zero is an invalid extended year (second argument)" +-); ++ assert.throws(RangeError, ++ () => Temporal.PlainDate.compare(instance, arg), ++ "Minus zero is an invalid extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-number.js +index 0b1741613c4ed016b0d8876ae1fb59cebc06d3b8..519b3ba7f39fbf77ac629f6596cb392e84e73984 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-number.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-number.js +@@ -3,10 +3,26 @@ + + /*--- + esid: sec-temporal.plaindate.from +-description: various interesting string arguments. ++description: A number is converted to a string, then to Temporal.PlainDate + includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const result = Temporal.PlainDate.from(19761118); +-TemporalHelpers.assertPlainDate(result, 1976, 11, "M11", 18); ++const arg = 19761118; ++ ++const result = Temporal.PlainDate.from(arg); ++TemporalHelpers.assertPlainDate(result, 1976, 11, "M11", 18, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.from(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-plaindate.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-plaindate.js +index 953393f824faf162d81c4ec6f6b03cebab3526dc..6eb685f042d5596f6ee2b213dea0ec8f4de489ec 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-plaindate.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-plaindate.js +@@ -4,11 +4,21 @@ + /*--- + esid: sec-temporal.plaindate.from + description: A PlainDate object is copied, not returned directly +-includes: [compareArray.js, temporalHelpers.js] ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const plainDate = new Temporal.PlainDate(2000, 5, 2); +-const result = Temporal.PlainDate.from(plainDate); +-assert.notSameValue(result, plainDate); +-TemporalHelpers.assertPlainDate(result, 2000, 5, "M05", 2); ++const orig = new Temporal.PlainDate(2000, 5, 2); ++const result = Temporal.PlainDate.from(orig); ++ ++TemporalHelpers.assertPlainDate( ++ result, ++ 2000, 5, "M05", 2, ++ "PlainDate is copied" ++); ++ ++assert.notSameValue( ++ result, ++ orig, ++ "When a PlainDate is given, the returned value is not the original PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4455b5fc2fc1aba81b04d34d4226711e8e109cc9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-leap-second.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.plaindate.from ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = Temporal.PlainDate.from(arg); ++TemporalHelpers.assertPlainDate( ++ result1, ++ 1976, 11, "M11", 18, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = Temporal.PlainDate.from(arg); ++TemporalHelpers.assertPlainDate( ++ result2, ++ 1976, 11, "M11", 18, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..634405c73458ad40ad3c143a659fe11525327535 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-number.js +@@ -0,0 +1,40 @@ ++// 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.plaindate.from ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = Temporal.PlainDate.from(arg); ++TemporalHelpers.assertPlainDate(result1, 1976, 11, "M11", 18, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = Temporal.PlainDate.from(arg); ++TemporalHelpers.assertPlainDate(result2, 1976, 11, "M11", 18, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.from(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.from(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9cb16543edbad041a9a422027af9d0c57dfc9625 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,44 @@ ++// 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.plaindate.from ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => Temporal.PlainDate.from(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => Temporal.PlainDate.from(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => Temporal.PlainDate.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => Temporal.PlainDate.from(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => Temporal.PlainDate.from(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..daafcd37aa3f20510ff19146c09c0c215261e75f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plaindate.from ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++ ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.from(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-invalid.js +index f0dee3ade9c3a9168350367321c6557736fe0ed3..b59bdf35d49f7e934d669aa0b4edfba72cf7cb9c 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-invalid.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-invalid.js +@@ -1,30 +1,60 @@ +-// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// 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.plaindate.from +-description: overflow property is extracted with ISO-invalid string argument. +-info: | +- 1. Perform ? ToTemporalOverflow(_options_). +- +- 1. If ! IsValidISODate(year, month, day) is false, throw a RangeError exception. +-includes: [compareArray.js, temporalHelpers.js] +-features: [Temporal] ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] + ---*/ + +-const expected = [ +- "get overflow", +- "get overflow.toString", +- "call overflow.toString", ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", + ]; +- +-let actual = []; +-const object = { +- get overflow() { +- actual.push("get overflow"); +- return TemporalHelpers.toPrimitiveObserver(actual, "constrain", "overflow"); +- } +-}; +- +-assert.throws(RangeError, () => Temporal.PlainDate.from("2020-13-34", object)); +-assert.compareArray(actual, expected); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.from(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d662976f5c3caa168c8bd683035d37b4f21fd22d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-wrong-type.js +@@ -0,0 +1,34 @@ ++// 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.plaindate.from ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.PlainDate.from(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.PlainDate.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0b523cf5390f3ce3aa76700649d49a49be5222de +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/leap-second.js +@@ -0,0 +1,41 @@ ++// 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.plaindate.from ++description: Leap second is a valid ISO string for PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++ ++const result1 = Temporal.PlainDate.from(arg); ++TemporalHelpers.assertPlainDate( ++ result1, ++ 2016, 12, "M12", 31, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++const result2 = Temporal.PlainDate.from(arg, { overflow: "reject" }); ++TemporalHelpers.assertPlainDate( ++ result2, ++ 2016, 12, "M12", 31, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++ ++const result3 = Temporal.PlainDate.from(arg); ++TemporalHelpers.assertPlainDate( ++ result3, ++ 2016, 12, "M12", 31, ++ "second: 60 is ignored in property bag for PlainDate" ++); ++ ++const result4 = Temporal.PlainDate.from(arg, { overflow: "reject" }); ++TemporalHelpers.assertPlainDate( ++ result4, ++ 2016, 12, "M12", 31, ++ "second: 60 is ignored in property bag for PlainDate even with overflow: reject" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f0dee3ade9c3a9168350367321c6557736fe0ed3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string-invalid.js +@@ -0,0 +1,30 @@ ++// Copyright (C) 2021 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: overflow property is extracted with ISO-invalid string argument. ++info: | ++ 1. Perform ? ToTemporalOverflow(_options_). ++ ++ 1. If ! IsValidISODate(year, month, day) is false, throw a RangeError exception. ++includes: [compareArray.js, temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const expected = [ ++ "get overflow", ++ "get overflow.toString", ++ "call overflow.toString", ++]; ++ ++let actual = []; ++const object = { ++ get overflow() { ++ actual.push("get overflow"); ++ return TemporalHelpers.toPrimitiveObserver(actual, "constrain", "overflow"); ++ } ++}; ++ ++assert.throws(RangeError, () => Temporal.PlainDate.from("2020-13-34", object)); ++assert.compareArray(actual, expected); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-overflow.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string.js +similarity index 100% +rename from JSTests/test262/test/built-ins/Temporal/PlainDate/from/argument-string-overflow.js +rename to JSTests/test262/test/built-ins/Temporal/PlainDate/from/observable-get-overflow-argument-string.js +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..734081766062a90bc97a0764e50a239f658e0687 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/options-wrong-type.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.plaindate.from ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++for (const value of badOptions) { ++ assert.throws(TypeError, () => Temporal.PlainDate.from({ year: 1976, month: 11, day: 18 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js +index f04f77f745b7aa20ed5fdc956089b1d6252940f9..27e499961c5dc28a7e06982f6ed552f0dbad1cdb 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/overflow-invalid-string.js +@@ -34,8 +34,14 @@ const invalidOverflow = [ + "CONSTRAIN", + "constra\u0131n", + ]; +-validItems.forEach((item) => { +- invalidOverflow.forEach((overflow) => { +- assert.throws(RangeError, () => Temporal.PlainDate.from(item, { overflow })); +- }); +-}); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const item of validItems) { ++ for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDate.from(item, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++ } ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/year-zero.js +index 0e000677f21353d0e0fd6cfa5c68244549a7ce95..16c6cd9c2893ebeff8062144ce3c28d5ce1ef4c3 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/from/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/from/year-zero.js +@@ -4,14 +4,20 @@ + /*--- + esid: sec-temporal.plaindate.from + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { Temporal.PlainDate.from(arg); }, ++ () => Temporal.PlainDate.from(arg), + "reject minus zero as extended year" +-); +- ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e33a0a90c01d5b6240692e0d6f940a9254c369b4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plaindate.prototype.add ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.add({ months: 1 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/overflow-invalid-string.js +index 66282d2a6c32f6d8f1466da98d79eed4869e3986..6c7b65fd879ab7d321956818c7733a102be92223 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/add/overflow-invalid-string.js +@@ -18,6 +18,12 @@ features: [Temporal] + + const date = new Temporal.PlainDate(2000, 5, 2); + const duration = new Temporal.Duration(3, 3, 0, 3); +-for (const overflow of ["", "CONSTRAIN", "balance", "other string", "constra\u0131n"]) { +- assert.throws(RangeError, () => date.add(duration, { overflow })); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => date.add(duration, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2f06b86c7f9fa411b55567e45ff933a694f2b406 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.plaindate.prototype.equals ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18); ++ ++const arg = 19761118; ++ ++const result = instance.equals(arg); ++assert.sameValue(result, true, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2d24e808b2373c7e372088bcb05f64fad0dbfeb7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.plaindate.prototype.equals ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.equals(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.equals(arg); ++assert.sameValue( ++ result2, ++ true, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..22e505924f6047f92d50ad37d98f096164b16437 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.plaindate.prototype.equals ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.equals(arg); ++assert.sameValue(result1, true, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.equals(arg); ++assert.sameValue(result2, true, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2e5f4c34bb25ac7c3ed3c16f8336713a81ec7100 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.plaindate.prototype.equals ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.equals(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6263cc5a70c8e0d6f11509d740609758e099d429 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plaindate.prototype.equals ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainDate(2000, 5, 2); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ca71e4016a92c23d6d5e6dd12325d3bedc113a9e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.plaindate.prototype.equals ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.PlainDate(2000, 5, 2); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-wrong-type.js +index 2f61141c080e55979cd12b454dcdfb0f8246a1fc..d90b83024af6cc3a7e5199584ea8e757ca6e1a63 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/argument-wrong-type.js +@@ -1,17 +1,36 @@ +-// Copyright (C) 2020 Igalia, S.L. All rights reserved. ++// 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.plaindate.prototype.equals +-description: Appropriate error thrown when argument cannot be converted to a valid string +-features: [Symbol, Temporal] ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] + ---*/ + +-const instance = Temporal.PlainDate.from({ year: 2000, month: 5, day: 2 }); ++const instance = new Temporal.PlainDate(2000, 5, 2); + +-assert.throws(RangeError, () => instance.equals(undefined), "undefined"); +-assert.throws(RangeError, () => instance.equals(null), "null"); +-assert.throws(RangeError, () => instance.equals(true), "true"); +-assert.throws(RangeError, () => instance.equals(""), "empty string"); +-assert.throws(TypeError, () => instance.equals(Symbol()), "symbol"); +-assert.throws(RangeError, () => instance.equals(1), "1"); ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5de98aa4001325361fb1e0ebd225d72a6243efb9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.plaindate.prototype.equals ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainDate(2000, 5, 2, calendar); ++instance.equals({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..56f946877a365ada376e772086d3af5601f96161 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.plaindate.prototype.equals ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2016, 12, 31); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.equals(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.equals(arg); ++assert.sameValue( ++ result2, ++ true, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/year-zero.js +index 486a5da1ac273c5e56bb80ac73510b8cbb93d292..674d60a471a7d3890e788ec3ae68af34007e37b1 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/equals/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.PlainDate(2000, 5, 2); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.equals(arg); }, ++ () => instance.equals(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..734eec3be3e559a571511286b359bf85d8ec6f59 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.plaindate.prototype.since ++description: A number is converted to a string, then to Temporal.PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18); ++ ++const arg = 19761118; ++ ++const result = instance.since(arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c65e3e141f378c489e75e6d6aec77fe7fa54c982 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.plaindate.prototype.since ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c1156c06dc25a6edae842d19c5717ba24442d1c4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.plaindate.prototype.since ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3460f40198257dcbf36cdb8092cf5f3a147f2db6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.plaindate.prototype.since ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.since(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..10fe06753d0d499876b56724c69eeeb8dae2e7ac +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plaindate.prototype.since ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainDate(2000, 5, 2); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..45e74d668a518769f002b76438707c3fc94b3662 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.plaindate.prototype.since ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.PlainDate(2000, 5, 2); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e54867c7c696f18c1d6b4ef7c243ce873c9c0e3f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plaindate.prototype.since ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..782f4823b185ebd4db3878153ed890a9262d12bd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.plaindate.prototype.since ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainDate(2000, 5, 2, calendar); ++instance.since({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-default.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-default.js +index dbeb5699d69184139383ea09f2ac1e3ebb91c33e..86fdee9d580960e980b4a7f53f5b1ee113fbb94d 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-default.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-default.js +@@ -10,10 +10,10 @@ features: [Temporal] + + const feb20 = Temporal.PlainDate.from("2020-02-01"); + const feb21 = Temporal.PlainDate.from("2021-02-01"); +-TemporalHelpers.assertDuration(feb21.since(feb20), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "no options"); +-TemporalHelpers.assertDuration(feb21.since(feb20, undefined), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "undefined options"); +-TemporalHelpers.assertDuration(feb21.since(feb20, {}), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "no largestUnit"); +-TemporalHelpers.assertDuration(feb21.since(feb20, { largestUnit: undefined }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "undefined largestUnit"); +-TemporalHelpers.assertDuration(feb21.since(feb20, { largestUnit: "days" }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "days"); +-TemporalHelpers.assertDuration(feb21.since(feb20, { largestUnit: "auto" }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "auto"); +-TemporalHelpers.assertDuration(feb21.since(feb20, () => {}), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "no largestUnit (function)"); ++TemporalHelpers.assertDuration(feb21.since(feb20), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "no options"); ++TemporalHelpers.assertDuration(feb21.since(feb20, undefined), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "undefined options"); ++TemporalHelpers.assertDuration(feb21.since(feb20, {}), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "no largestUnit"); ++TemporalHelpers.assertDuration(feb21.since(feb20, { largestUnit: undefined }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "undefined largestUnit"); ++TemporalHelpers.assertDuration(feb21.since(feb20, { largestUnit: "days" }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "days"); ++TemporalHelpers.assertDuration(feb21.since(feb20, { largestUnit: "auto" }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "auto"); ++TemporalHelpers.assertDuration(feb21.since(feb20, () => {}), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "no largestUnit (function)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-higher-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-higher-units.js +index c1d8068ee4ee236f1e1d143f71ec37b99881a933..b3623a502e7003ab3ce719677896f748fc926b33 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-higher-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-higher-units.js +@@ -17,10 +17,10 @@ const feb20 = Temporal.PlainDate.from("2020-02-01"); + const feb21 = Temporal.PlainDate.from("2021-02-01"); + TemporalHelpers.assertDuration(feb21.since(feb20, { largestUnit: "years" }), /* years = */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "start of February, years"); + TemporalHelpers.assertDuration(feb21.since(feb20, { largestUnit: "months" }), 0, /* months = */ 12, 0, 0, 0, 0, 0, 0, 0, 0, "start of February, months"); +-TemporalHelpers.assertDuration(feb21.since(feb20, { largestUnit: "weeks" }), 0, 0, /* weeks = */ 52, /* days = */ 2, 0, 0, 0, 0, 0, 0, 0, "start of February, weeks"); ++TemporalHelpers.assertDuration(feb21.since(feb20, { largestUnit: "weeks" }), 0, 0, /* weeks = */ 52, /* days = */ 2, 0, 0, 0, 0, 0, 0, "start of February, weeks"); + + const lastFeb20 = Temporal.PlainDate.from("2020-02-29"); + const lastFeb21 = Temporal.PlainDate.from("2021-02-28"); +-TemporalHelpers.assertDuration(lastFeb21.since(lastFeb20, { largestUnit: "years" }), 0, /* months = */ 11, 0, /* days = */ 28, 0, 0, 0, 0, 0, 0, 0, "end of February, years"); ++TemporalHelpers.assertDuration(lastFeb21.since(lastFeb20, { largestUnit: "years" }), 0, /* months = */ 11, 0, /* days = */ 28, 0, 0, 0, 0, 0, 0, "end of February, years"); + TemporalHelpers.assertDuration(lastFeb21.since(lastFeb20, { largestUnit: "months" }), 0, /* months = */ 11, 0, /* days = */ 28, 0, 0, 0, 0, 0, 0, "end of February, months"); + TemporalHelpers.assertDuration(lastFeb21.since(lastFeb20, { largestUnit: "weeks" }), 0, 0, /* weeks = */ 52, /* days = */ 1, 0, 0, 0, 0, 0, 0, "end of February, weeks"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-invalid-string.js +index 9b31fbaabcb922ed8f97f31507c950aa43845467..3b047aa86aa6ae4dee487e3237c95cf911517092 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/largestunit-invalid-string.js +@@ -9,7 +9,30 @@ features: [Temporal] + + const earlier = new Temporal.PlainDate(2000, 5, 2); + const later = new Temporal.PlainDate(2001, 6, 3); +-const values = ["era", "eraYear", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "hour", ++ "minute", ++ "second", ++ "millisecond", ++ "microsecond", ++ "nanosecond", ++ "month\0", ++ "YEAR", ++ "eras", ++ "eraYears", ++ "hours", ++ "minutes", ++ "seconds", ++ "milliseconds", ++ "microseconds", ++ "nanoseconds", ++ "months\0", ++ "YEARS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f182e0582fb29e98c438fb9a5964c24362458a1c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/leap-second.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.plaindate.prototype.since ++description: Leap second is a valid ISO string for PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2016, 12, 31); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..09905ce544b676900518f22b79bb8777565ccdc0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plaindate.prototype.since ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.since(new Temporal.PlainDate(1976, 11, 18), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-invalid-string.js +index cf9d9e20c7a202cdca0b00e9772ef20568da74e1..8aeeb56734238da123722e0b271b6d92e09ddd1b 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/roundingmode-invalid-string.js +@@ -9,4 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.PlainDate(2000, 5, 2); + const later = new Temporal.PlainDate(2001, 6, 3); +-assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/smallestunit-invalid-string.js +index b06b57f530a27878f894077a5d4b5980aae3034b..2bc9968ca6766f160f90cc6d3d6655a0a2ad2fc1 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/smallestunit-invalid-string.js +@@ -9,7 +9,30 @@ features: [Temporal] + + const earlier = new Temporal.PlainDate(2000, 5, 2); + const later = new Temporal.PlainDate(2001, 6, 3); +-const values = ["era", "eraYear", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "hour", ++ "minute", ++ "second", ++ "millisecond", ++ "microsecond", ++ "nanosecond", ++ "month\0", ++ "YEAR", ++ "eras", ++ "eraYears", ++ "hours", ++ "minutes", ++ "seconds", ++ "milliseconds", ++ "microseconds", ++ "nanoseconds", ++ "months\0", ++ "YEARS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/year-zero.js +index 9f83cc531c029162cd91b5ec1a4a3ff27e517114..92fa4f294cc32df0a836c0250b9ccd27e6ea1ef3 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/since/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.PlainDate(2000, 5, 2); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.since(arg); }, ++ () => instance.since(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..66584a29d6a4f64a54cddc8a73c0569eaa2bc4f8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plaindate.prototype.subtract ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.subtract({ months: 1 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-invalid-string.js +index d3cbd6e80748f6bb575f3e4e30fc7c51a3a08de9..9387c6aff46dce506c0288db198c4d703ef74957 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/subtract/overflow-invalid-string.js +@@ -18,6 +18,12 @@ features: [Temporal] + + const date = new Temporal.PlainDate(2000, 5, 2); + const duration = new Temporal.Duration(3, 3, 0, 3); +-for (const overflow of ["", "CONSTRAIN", "balance", "other string", "constra\u0131n"]) { +- assert.throws(RangeError, () => date.subtract(duration, { overflow })); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => date.subtract(duration, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toJSON/year-format.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toJSON/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6f4864b4d6253b3a6732fdfd1d1c4956437b562f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toJSON/year-format.js +@@ -0,0 +1,47 @@ ++// 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.plaindate.prototype.tojson ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++let instance = new Temporal.PlainDate(-100000, 12, 3); ++assert.sameValue(instance.toJSON(), "-100000-12-03", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(-10000, 4, 5); ++assert.sameValue(instance.toJSON(), "-010000-04-05", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(-9999, 6, 7); ++assert.sameValue(instance.toJSON(), "-009999-06-07", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(-1000, 8, 9); ++assert.sameValue(instance.toJSON(), "-001000-08-09", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(-999, 10, 9); ++assert.sameValue(instance.toJSON(), "-000999-10-09", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(-1, 8, 7); ++assert.sameValue(instance.toJSON(), "-000001-08-07", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(0, 6, 5); ++assert.sameValue(instance.toJSON(), "0000-06-05", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.PlainDate(1, 4, 3); ++assert.sameValue(instance.toJSON(), "0001-04-03", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.PlainDate(999, 2, 10); ++assert.sameValue(instance.toJSON(), "0999-02-10", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDate(1000, 1, 23); ++assert.sameValue(instance.toJSON(), "1000-01-23", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDate(9999, 4, 5); ++assert.sameValue(instance.toJSON(), "9999-04-05", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDate(10000, 6, 7); ++assert.sameValue(instance.toJSON(), "+010000-06-07", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(100000, 8, 9); ++assert.sameValue(instance.toJSON(), "+100000-08-09", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..79d13f0b7fa50e0fe49154200532e2068efafc63 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-number.js +@@ -0,0 +1,31 @@ ++// 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.plaindate.prototype.toplaindatetime ++description: A number is converted to a string, then to Temporal.PlainTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++const arg = 123456.987654321; ++ ++const result = instance.toPlainDateTime(arg); ++TemporalHelpers.assertPlainDateTime(result, 2000, 5, "M05", 2, 12, 34, 56, 987, 654, 321, "123456.987654321 is a valid ISO string for PlainTime"); ++ ++const numbers = [ ++ 1, ++ -123456.987654321, ++ 1234567, ++ 123456.9876543219, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.toPlainDateTime(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-designator-required-for-disambiguation.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-designator-required-for-disambiguation.js +index 243f3de9207342113849d1e64927a7c2d9180e10..797192c7797a875a83ddf1030b13bae5eac5fbc2 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-designator-required-for-disambiguation.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-string-time-designator-required-for-disambiguation.js +@@ -27,6 +27,13 @@ ambiguousStrings.forEach((string) => { + // The same string with a T prefix should not throw: + arg = `T${string}`; + instance.toPlainDateTime(arg); ++ ++ arg = ` ${string}`; ++ assert.throws( ++ RangeError, ++ () => instance.toPlainDateTime(arg), ++ "space is not accepted as a substitute for T prefix" ++ ); + }); + + // None of these should throw without a T prefix, because they are unambiguously time strings: +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2caa82b2eb201a55a8afd129fa71410857bbdd51 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/argument-wrong-type.js +@@ -0,0 +1,35 @@ ++// 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.plaindate.prototype.toplaindatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toPlainDateTime(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainTime, "Temporal.PlainTime, object"], ++ [Temporal.PlainTime.prototype, "Temporal.PlainTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toPlainDateTime(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5b06e59dd1a0a5b2dac7f94b446f9dcf20c3a5c6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/leap-second.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.plaindate.prototype.toplaindatetime ++description: Leap second is a valid ISO string for PlainTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.toPlainDateTime(arg); ++TemporalHelpers.assertPlainDateTime( ++ result1, ++ 2000, 5, "M05", 2, 23, 59, 59, 0, 0, 0, ++ "leap second is a valid ISO string for PlainTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.toPlainDateTime(arg); ++TemporalHelpers.assertPlainDateTime( ++ result2, ++ 2000, 5, "M05", 2, 23, 59, 59, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/limits.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/limits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e26ca7fba52ee3fdbe1535010a167ae479ab1378 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/limits.js +@@ -0,0 +1,39 @@ ++// 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.plaindate.prototype.toplaindatetime ++description: Checking limits of representable PlainDateTime ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const midnight = new Temporal.PlainTime(0, 0); ++const firstNs = new Temporal.PlainTime(0, 0, 0, 0, 0, 1); ++const lastNs = new Temporal.PlainTime(23, 59, 59, 999, 999, 999); ++const min = new Temporal.PlainDate(-271821, 4, 19); ++const max = new Temporal.PlainDate(275760, 9, 13); ++ ++assert.throws( ++ RangeError, ++ () => min.toPlainDateTime(midnight), ++ "Cannot go below representable limit for PlainDateTime" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ max.toPlainDateTime(midnight), ++ 275760, 9, "M09", 13, 0, 0, 0, 0, 0, 0, ++ "Midnight on maximal representable PlainDate" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ min.toPlainDateTime(firstNs), ++ -271821, 4, "M04", 19, 0, 0, 0, 0, 0, 1, ++ "Computing the minimum (earliest) representable PlainDateTime" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ max.toPlainDateTime(lastNs), ++ 275760, 9, "M09", 13, 23, 59, 59, 999, 999, 999, ++ "Computing the maximum (latest) representable PlainDateTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/plaintime-propertybag-no-time-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/plaintime-propertybag-no-time-units.js +index 0998479018ee5c39c04b2345e3fc721803389c1d..7dfe34adbf4050503d4d0104be7bdb3ca8a27d14 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/plaintime-propertybag-no-time-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/plaintime-propertybag-no-time-units.js +@@ -11,7 +11,7 @@ features: [Temporal] + const instance = new Temporal.PlainDate(2000, 1, 1); + + const props = {}; +-assert.throws(TypeError, () => instance.toPlainDateTime(props), "TypeError if at least one property is not present"); ++assert.throws(TypeError, () => instance.toPlainDateTime(props), "TypeError if no properties are present"); + + props.minute = 30; + const result = instance.toPlainDateTime(props); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/year-zero.js +index 0e1d28347494d5eff79d01eecdafa8a92820b88b..12cc1f466b5bc8f1ef4fa7c879a47ebc69cf8f28 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainDateTime/year-zero.js +@@ -8,8 +8,9 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-12-07T03:24:30', +- '-000000-12-07T03:24:30+01:00[UTC]' ++ "-000000-12-07T03:24:30", ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.PlainDate(2000, 5, 2); + invalidStrings.forEach((arg) => { +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..681c5f08a6476870685cc969bf5da246f24bf674 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.plaindate.prototype.toplainmonthday ++description: > ++ Calendar.monthDayFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainDate(2000, 5, 2, calendar); ++instance.toPlainMonthDay(); ++assert.sameValue(calendar.monthDayFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6ef9df6b85fb7272ca524e8eea70ae562d9f2373 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.plaindate.prototype.toplainyearmonth ++description: > ++ Calendar.yearMonthFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainDate(2000, 5, 2, calendar); ++instance.toPlainYearMonth(); ++assert.sameValue(calendar.yearMonthFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..af7518abb73ac9fc0f7ca6042fb0e5f766ce0b9e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plaindate.prototype.tostring ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.toString(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/year-format.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9c1d121aab2e851359e2b9591517d216bb2d69a0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toString/year-format.js +@@ -0,0 +1,47 @@ ++// 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.plaindate.prototype.tostring ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++let instance = new Temporal.PlainDate(-100000, 12, 3); ++assert.sameValue(instance.toString(), "-100000-12-03", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(-10000, 4, 5); ++assert.sameValue(instance.toString(), "-010000-04-05", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(-9999, 6, 7); ++assert.sameValue(instance.toString(), "-009999-06-07", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(-1000, 8, 9); ++assert.sameValue(instance.toString(), "-001000-08-09", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(-999, 10, 9); ++assert.sameValue(instance.toString(), "-000999-10-09", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(-1, 8, 7); ++assert.sameValue(instance.toString(), "-000001-08-07", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(0, 6, 5); ++assert.sameValue(instance.toString(), "0000-06-05", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.PlainDate(1, 4, 3); ++assert.sameValue(instance.toString(), "0001-04-03", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.PlainDate(999, 2, 10); ++assert.sameValue(instance.toString(), "0999-02-10", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDate(1000, 1, 23); ++assert.sameValue(instance.toString(), "1000-01-23", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDate(9999, 4, 5); ++assert.sameValue(instance.toString(), "9999-04-05", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDate(10000, 6, 7); ++assert.sameValue(instance.toString(), "+010000-06-07", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDate(100000, 8, 9); ++assert.sameValue(instance.toString(), "+100000-08-09", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b25efbb22b1137cabc394f20cf6242db104ed7f5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.plaindate.prototype.tozoneddatetime ++description: A number is converted to a string, then to Temporal.PlainTime ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++const arg = 123456.987654321; ++ ++const result = instance.toZonedDateTime({ plainTime: arg, timeZone: "UTC" }); ++assert.sameValue(result.epochNanoseconds, 957270896_987_654_321n, "123456.987654321 is a valid ISO string for PlainTime"); ++ ++const numbers = [ ++ 1, ++ -123456.987654321, ++ 1234567, ++ 123456.9876543219, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ plainTime: arg, timeZone: "UTC" }), ++ `Number ${arg} does not convert to a valid ISO string for PlainTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-designator-required-for-disambiguation.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-designator-required-for-disambiguation.js +index 8c874288258f6af25ae9713dfdb925085720e3b0..62877675b8e68aa7b5d0983c1181a1cf54e15ead 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-designator-required-for-disambiguation.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-string-time-designator-required-for-disambiguation.js +@@ -27,6 +27,13 @@ ambiguousStrings.forEach((string) => { + // The same string with a T prefix should not throw: + arg = `T${string}`; + instance.toZonedDateTime({ plainTime: arg, timeZone: "UTC" }); ++ ++ arg = ` ${string}`; ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ plainTime: arg, timeZone: "UTC" }), ++ "space is not accepted as a substitute for T prefix" ++ ); + }); + + // None of these should throw without a T prefix, because they are unambiguously time strings: +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..02e3410e195d34a55635b85810982c9d318967f1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/argument-wrong-type.js +@@ -0,0 +1,35 @@ ++// 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.plaindate.prototype.tozoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toZonedDateTime({ plainTime: arg, timeZone: "UTC" }), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainTime, "Temporal.PlainTime, object"], ++ [Temporal.PlainTime.prototype, "Temporal.PlainTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toZonedDateTime({ plainTime: arg, timeZone: "UTC" }), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c8d07074fcaab196b55da2af8d6a14c5fbc707ed +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.plaindate.prototype.tozoneddatetime ++description: Leap second is a valid ISO string for PlainTime ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.toZonedDateTime({ plainTime: arg, timeZone: "UTC" }); ++assert.sameValue( ++ result1.epochNanoseconds, ++ 957311999_000_000_000n, ++ "leap second is a valid ISO string for PlainTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.toZonedDateTime({ plainTime: arg, timeZone: "UTC" }); ++assert.sameValue( ++ result2.epochNanoseconds, ++ 957311999_000_000_000n, ++ "second: 60 is ignored in property bag for PlainTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/plaintime-propertybag-no-time-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/plaintime-propertybag-no-time-units.js +index 8b87a0225411f14072524d9bacf5792ad2b6ca65..af8d058476eb9243a7fc1849a83107660c78880f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/plaintime-propertybag-no-time-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/plaintime-propertybag-no-time-units.js +@@ -10,7 +10,7 @@ features: [Temporal] + const instance = new Temporal.PlainDate(2000, 1, 1); + + const props = {}; +-assert.throws(TypeError, () => instance.toZonedDateTime({ plainTime: props, timeZone: "UTC" }), "TypeError if at least one property is not present"); ++assert.throws(TypeError, () => instance.toZonedDateTime({ plainTime: props, timeZone: "UTC" }), "TypeError if no properties are present"); + + props.minute = 30; + const result = instance.toZonedDateTime({ plainTime: props, timeZone: "UTC" }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7265aca26168ebd09d9efb46f99b1256185540d2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.plaindate.prototype.tozoneddatetime ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = instance.toZonedDateTime(timeZone); ++assert.sameValue(result1.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone"); ++const result2 = instance.toZonedDateTime({ timeZone }); ++assert.sameValue(result2.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.toZonedDateTime(timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..62e499eb4fcc3ad60412e6dc13ca4b6239afcade +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.plaindate.prototype.tozoneddatetime ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainDate(2000, 5, 2); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime(timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bfd5be2dad86f50ce46bdf0847d52f674f81e2b0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.plaindate.prototype.tozoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toZonedDateTime(timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toZonedDateTime(timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.toZonedDateTime({ timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/year-zero.js +index 33387244aaeef82d07d570ac2fa431669d1d7d63..20420664aa4bcf438f8f5d2b3760e353cbfce4b4 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/toZonedDateTime/year-zero.js +@@ -8,8 +8,9 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-12-07T03:24:30', +- '-000000-12-07T03:24:30+01:00[UTC]' ++ "-000000-12-07T03:24:30", ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.PlainDate(2000, 5, 2); + invalidStrings.forEach((arg) => { +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..04e1567d76486c06414c285d5fced5deb20a8523 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.plaindate.prototype.until ++description: A number is converted to a string, then to Temporal.PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18); ++ ++const arg = 19761118; ++ ++const result = instance.until(arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a0a12252ccc7a36165760b5b57ba5dd676725211 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.plaindate.prototype.until ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2a73bffd8d501ee05c1fc133d8d014b2ebaaed72 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.plaindate.prototype.until ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..36bf6986ea2571ddb3cfdccd14f3982414bd5aa1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.plaindate.prototype.until ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.until(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6ed6fb9e30c6d3dc6da53cf8170e7d9bb33e057f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plaindate.prototype.until ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainDate(2000, 5, 2); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4e59ac5e3f38e886fb765c6afb0eac842b8aa035 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.plaindate.prototype.until ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.PlainDate(2000, 5, 2); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6c1c8372428f9adb295f920b7942c59958a452f9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plaindate.prototype.until ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e55859f727838c77a2d4b9fb6fe45f9175e54c5b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.plaindate.prototype.until ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainDate(2000, 5, 2, calendar); ++instance.until({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-default.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-default.js +index ea3f667957073c8612a338c169aef7f1216fdfda..63b7fd397e65408e337866cd09cd8d2737cf0ef6 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-default.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-default.js +@@ -10,10 +10,10 @@ features: [Temporal] + + const feb20 = Temporal.PlainDate.from("2020-02-01"); + const feb21 = Temporal.PlainDate.from("2021-02-01"); +-TemporalHelpers.assertDuration(feb20.until(feb21), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "no options"); +-TemporalHelpers.assertDuration(feb20.until(feb21, undefined), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "undefined options"); +-TemporalHelpers.assertDuration(feb20.until(feb21, {}), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "no largestUnit"); +-TemporalHelpers.assertDuration(feb20.until(feb21, { largestUnit: undefined }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "undefined largestUnit"); +-TemporalHelpers.assertDuration(feb20.until(feb21, { largestUnit: "days" }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "days"); +-TemporalHelpers.assertDuration(feb20.until(feb21, { largestUnit: "auto" }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "auto"); +-TemporalHelpers.assertDuration(feb20.until(feb21, () => {}), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, 0, "no largestUnit (function)"); ++TemporalHelpers.assertDuration(feb20.until(feb21), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "no options"); ++TemporalHelpers.assertDuration(feb20.until(feb21, undefined), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "undefined options"); ++TemporalHelpers.assertDuration(feb20.until(feb21, {}), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "no largestUnit"); ++TemporalHelpers.assertDuration(feb20.until(feb21, { largestUnit: undefined }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "undefined largestUnit"); ++TemporalHelpers.assertDuration(feb20.until(feb21, { largestUnit: "days" }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "days"); ++TemporalHelpers.assertDuration(feb20.until(feb21, { largestUnit: "auto" }), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "auto"); ++TemporalHelpers.assertDuration(feb20.until(feb21, () => {}), 0, 0, 0, /* days = */ 366, 0, 0, 0, 0, 0, 0, "no largestUnit (function)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-higher-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-higher-units.js +index 30c7ceec20cf8b4a07bc9ee0e249742db22f5801..30fd70ae2ae8e9be19497af3cc7cb0202872e3cc 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-higher-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-higher-units.js +@@ -17,7 +17,7 @@ const feb20 = Temporal.PlainDate.from("2020-02-01"); + const feb21 = Temporal.PlainDate.from("2021-02-01"); + TemporalHelpers.assertDuration(feb20.until(feb21, { largestUnit: "years" }), /* years = */ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, "start of February, years"); + TemporalHelpers.assertDuration(feb20.until(feb21, { largestUnit: "months" }), 0, /* months = */ 12, 0, 0, 0, 0, 0, 0, 0, 0, "start of February, months"); +-TemporalHelpers.assertDuration(feb20.until(feb21, { largestUnit: "weeks" }), 0, 0, /* weeks = */ 52, /* days = */ 2, 0, 0, 0, 0, 0, 0, 0, "start of February, weeks"); ++TemporalHelpers.assertDuration(feb20.until(feb21, { largestUnit: "weeks" }), 0, 0, /* weeks = */ 52, /* days = */ 2, 0, 0, 0, 0, 0, 0, "start of February, weeks"); + + const lastFeb20 = Temporal.PlainDate.from("2020-02-29"); + const lastFeb21 = Temporal.PlainDate.from("2021-02-28"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-invalid-string.js +index b06f5d6ed8534fbb07c8bbace28e0bcef1f5a704..379dd28424dad7a45b1c447fa2b5eaec907aa8de 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/largestunit-invalid-string.js +@@ -9,7 +9,30 @@ features: [Temporal] + + const earlier = new Temporal.PlainDate(2000, 5, 2); + const later = new Temporal.PlainDate(2001, 6, 3); +-const values = ["era", "eraYear", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "hour", ++ "minute", ++ "second", ++ "millisecond", ++ "microsecond", ++ "nanosecond", ++ "month\0", ++ "YEAR", ++ "eras", ++ "eraYears", ++ "hours", ++ "minutes", ++ "seconds", ++ "milliseconds", ++ "microseconds", ++ "nanoseconds", ++ "months\0", ++ "YEARS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ba46445e78e7b57b00086fd4e338aee6c5d68484 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/leap-second.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.plaindate.prototype.until ++description: Leap second is a valid ISO string for PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(2016, 12, 31); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e93369500ed03ef9a9c034cf61d7ba2954293b08 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plaindate.prototype.until ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.until(new Temporal.PlainDate(1976, 11, 18), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-invalid-string.js +index 2ed4da16bb69527115d8a9743073ca5d02ec35fb..9139e8c15197947bcaa2d0f2468a78fbdb89dd9f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/roundingmode-invalid-string.js +@@ -9,4 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.PlainDate(2000, 5, 2); + const later = new Temporal.PlainDate(2001, 6, 3); +-assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/smallestunit-invalid-string.js +index 3eb01aaee8917a27b3caae400b9677bb8a127d93..8382c5c924ca76200762fd5d2a299a701b69cd57 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/smallestunit-invalid-string.js +@@ -9,7 +9,30 @@ features: [Temporal] + + const earlier = new Temporal.PlainDate(2000, 5, 2); + const later = new Temporal.PlainDate(2001, 6, 3); +-const values = ["era", "eraYear", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "hour", ++ "minute", ++ "second", ++ "millisecond", ++ "microsecond", ++ "nanosecond", ++ "month\0", ++ "YEAR", ++ "eras", ++ "eraYears", ++ "hours", ++ "minutes", ++ "seconds", ++ "milliseconds", ++ "microseconds", ++ "nanoseconds", ++ "months\0", ++ "YEARS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/year-zero.js +index 28a78617277dd2e523472fefe00d04c645585e8e..819913d02225a55988603c52c146a4ef5c161339 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/until/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.PlainDate(2000, 5, 2); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.until(arg); }, ++ () => instance.until(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0fdb1c24e6dda18741a0abfda07df7a17b5f1db7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plaindate.prototype.with ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDate(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.with({ day: 5 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/overflow-invalid-string.js +index d35f66be86b46997a7308b0b92e362e8bd834fd5..acef874825b267937a2b7661ccd403cf8dc7c2bb 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/with/overflow-invalid-string.js +@@ -17,6 +17,12 @@ features: [Temporal] + ---*/ + + const date = new Temporal.PlainDate(2000, 5, 2); +-["", "CONSTRAIN", "balance", "other string"].forEach((overflow) => +- assert.throws(RangeError, () => date.with({ month: 8 }, { overflow })) +-); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => date.with({ month: 8 }, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1ff8a50d695b54280c64960e06c349ae1c990291 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-number.js +@@ -0,0 +1,29 @@ ++// 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.plaindate.prototype.withcalendar ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18, { id: "replace-me" }); ++ ++const arg = 19761118; ++ ++const result = instance.withCalendar(arg); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.withCalendar(arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7bd95a80cdf8e8878a8b1537d0a67e6bdcccb957 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-string-leap-second.js +@@ -0,0 +1,26 @@ ++// 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.plaindate.prototype.withcalendar ++description: Leap second is a valid ISO string for Calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18, { id: "replace-me" }); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.withCalendar(arg); ++assert.sameValue( ++ result1.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar" ++); ++ ++arg = { calendar: "2016-12-31T23:59:60" }; ++const result2 = instance.withCalendar(arg); ++assert.sameValue( ++ result2.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2587a1cac86f3888d8158b93dac598ad66cdd91d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-wrong-type.js +@@ -0,0 +1,32 @@ ++// 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.plaindate.prototype.withcalendar ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDate(1976, 11, 18, { id: "replace-me" }); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.withCalendar(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.withCalendar(arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c44989eaeb39460d10992e4edfeaac6feff089c5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/calendar-number.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 ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const arg = 19761118; ++ ++const result = new Temporal.PlainDateTime(2000, 5, 2, 15, 23, 30, 987, 654, 321, arg); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => new Temporal.PlainDateTime(2000, 5, 2, 15, 23, 30, 987, 654, 321, arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..61fc252ddca57a652a526fac0559d0b57ef03e91 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/calendar-wrong-type.js +@@ -0,0 +1,30 @@ ++// 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 ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => new Temporal.PlainDateTime(2000, 5, 2, 15, 23, 30, 987, 654, 321, arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => new Temporal.PlainDateTime(2000, 5, 2, 15, 23, 30, 987, 654, 321, arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8bf6b2caac2436c2ed89446076d29935d4bbffe6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-number.js +@@ -0,0 +1,34 @@ ++// 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.compare ++description: A number is converted to a string, then to Temporal.PlainDateTime ++features: [Temporal] ++---*/ ++ ++let arg = 19761118; ++ ++const result1 = Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)); ++assert.sameValue(result1, 0, "19761118 is a valid ISO string for PlainDateTime (first argument)"); ++const result2 = Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg); ++assert.sameValue(result2, 0, "19761118 is a valid ISO string for PlainDateTime (second argument)"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), ++ `Number ${arg} does not convert to a valid ISO string for PlainDateTime (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDateTime (second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-object-insufficient-data.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-object-insufficient-data.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5ef97473d645b678595e7a06bd4701241d8ab5f3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-object-insufficient-data.js +@@ -0,0 +1,23 @@ ++// 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.compare ++description: Plain object arguments may throw if they do not contain sufficient information ++features: [Temporal] ++---*/ ++ ++const dt1 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const dt2 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++ ++assert.throws( ++ TypeError, ++ () => Temporal.PlainDateTime.compare({ year: 1976 }, dt2), ++ "object must contain at least the required properties (first arg)" ++); ++ ++assert.throws( ++ TypeError, ++ () => Temporal.PlainDateTime.compare(dt1, { year: 2019 }), ++ "object must contain at least the required properties (second arg)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..37547e3272f6ad994193a69cc27a89afa1189135 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,23 @@ ++// 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.compare ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)); ++assert.sameValue(result1, 0, "leap second is a valid ISO string for calendar (first argument)"); ++const result2 = Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg); ++assert.sameValue(result2, 0, "leap second is a valid ISO string for calendar (second argument)"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result3 = Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)); ++assert.sameValue(result3, 0, "leap second is a valid ISO string for calendar (nested property, first argument)"); ++const result4 = Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg); ++assert.sameValue(result4, 0, "leap second is a valid ISO string for calendar (nested property, second argument)"); ++ +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eb830da34f0d6ae4a52f76fdd55d50757ae14c5e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-number.js +@@ -0,0 +1,53 @@ ++// 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.compare ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)); ++assert.sameValue(result1, 0, "19970327 is a valid ISO string for calendar (first argument)"); ++const result2 = Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg); ++assert.sameValue(result2, 0, "19970327 is a valid ISO string for calendar (second argument)"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result3 = Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)); ++assert.sameValue(result3, 0, "19970327 is a valid ISO string for calendar (nested property, first argument)"); ++const result4 = Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg); ++assert.sameValue(result4, 0, "19970327 is a valid ISO string for calendar (nested property, second argument)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (second argument)` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property, first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property, second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..139fa9eab5bae46afe557ac4ba78e4b39a2a589f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,49 @@ ++// 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.compare ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), `${description} does not convert to a valid ISO string (second argument)`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), `${description} does not convert to a valid ISO string (nested property, first argument)`); ++ assert.throws(RangeError, () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), `${description} does not convert to a valid ISO string (nested property, second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), `${description} is not a valid property bag and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), `${description} is not a valid property bag and does not convert to a string (nested property, first argument)`); ++ assert.throws(TypeError, () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), `${description} is not a valid property bag and does not convert to a string (nested property, second argument)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), `nested undefined calendar property is always a RangeError (first argument)`); ++assert.throws(RangeError, () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), `nested undefined calendar property is always a RangeError (second argument)`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b50886514d6102ed237607787b5944e3c5004b18 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,29 @@ ++// 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.compare ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++ ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), ++ "reject minus zero as extended year (first argument)" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), ++ "reject minus zero as extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5136e87f29a333b956b2bd9c71ec6610ecd42cc3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.compare ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), `${description} does not convert to a valid ISO string (second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDateTime, "Temporal.PlainDateTime, object"], ++ [Temporal.PlainDateTime.prototype, "Temporal.PlainDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18)), `${description} is not a valid property bag and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..17cd7104252f9af9b6ebecd3e69edf9d16b44209 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/basic.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.compare ++description: Checking a typical case (nothing undefined, no NaNs, does not throw, etc.) ++features: [Temporal] ++---*/ ++ ++const dt1 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const dt2 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++const dt3 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++const dt4 = new Temporal.PlainDateTime(2019, 10, 29, 15, 23, 30, 123, 456, 789); ++const dt5 = new Temporal.PlainDateTime(1976, 11, 18, 10, 46, 38, 271, 986, 102); ++ ++assert.sameValue(Temporal.PlainDateTime.compare(dt1, dt1), 0, "equal"); ++assert.sameValue(Temporal.PlainDateTime.compare(dt1, dt2), -1, "smaller/larger"); ++assert.sameValue(Temporal.PlainDateTime.compare(dt2, dt1), 1, "larger/smaller"); ++assert.sameValue(Temporal.PlainDateTime.compare(dt2, dt3), 0, "equal different object"); ++assert.sameValue(Temporal.PlainDateTime.compare(dt3, dt4), -1, "same date, earlier time"); ++assert.sameValue(Temporal.PlainDateTime.compare(dt3, dt5), 1, "same time, later date"); ++ +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/calendar-ignored.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/calendar-ignored.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9f197ae0a62778370b0fa3d59821beba83e11956 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/calendar-ignored.js +@@ -0,0 +1,19 @@ ++// 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.compare ++description: Calendar is not taken into account for the comparison. ++features: [Temporal] ++---*/ ++ ++const calendar1 = { toString() { throw new Test262Error("should not call calendar1.toString") } }; ++const calendar2 = { toString() { throw new Test262Error("should not call calendar2.toString") } }; ++const dt1 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar1); ++const dt2 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102, calendar1); ++const dt3 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102, calendar1); ++const dt4 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102, calendar2); ++ ++assert.sameValue(Temporal.PlainDateTime.compare(dt1, dt2), -1, "smaller"); ++assert.sameValue(Temporal.PlainDateTime.compare(dt2, dt3), 0, "equal with same calendar"); ++assert.sameValue(Temporal.PlainDateTime.compare(dt2, dt4), 0, "equal with different calendar"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/cast.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/cast.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a9a09dc09ad9af12b35d70f2be5755dd87bcc3b5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/cast.js +@@ -0,0 +1,35 @@ ++// 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.compare ++description: Arguments may be casted (string, plain object) ++features: [Temporal] ++---*/ ++ ++const dt1 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const dt2 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++ ++assert.sameValue( ++ Temporal.PlainDateTime.compare({ year: 1976, month: 11, day: 18, hour: 15 }, dt2), ++ -1, ++ "casts first argument (plain object)" ++); ++ ++assert.sameValue( ++ Temporal.PlainDateTime.compare("1976-11-18T15:23:30.123456789", dt2), ++ -1, ++ "casts first argument (string)" ++); ++ ++assert.sameValue( ++ Temporal.PlainDateTime.compare(dt1, { year: 2019, month: 10, day: 29, hour: 10 }), ++ -1, ++ "casts second argument (plain object)" ++); ++ ++assert.sameValue( ++ Temporal.PlainDateTime.compare(dt1, "2019-10-29T10:46:38.271986102"), ++ -1, ++ "casts second argument (string)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fde64d43a23369ee76bd96a57aa57a02d20bf010 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/leap-second.js +@@ -0,0 +1,21 @@ ++// 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.compare ++description: Leap second is a valid ISO string for PlainDateTime ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(2016, 12, 31, 23, 59, 59)); ++assert.sameValue(result1, 0, "leap second is a valid ISO string for PlainDateTime (first argument)"); ++const result2 = Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(2016, 12, 31, 23, 59, 59), arg); ++assert.sameValue(result2, 0, "leap second is a valid ISO string for PlainDateTime (second argument)"); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++ ++const result3 = Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(2016, 12, 31, 23, 59, 59)); ++assert.sameValue(result3, 0, "second: 60 is constrained in property bag for PlainDateTime (first argument)"); ++const result4 = Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(2016, 12, 31, 23, 59, 59), arg); ++assert.sameValue(result4, 0, "second: 60 is constrained in property bag for PlainDateTime (second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/year-zero.js +index f32f6cb0e312370f0a982a7e050c103e2804dd34..d71f6f07716e1dc665df59e71160c59d75096fc2 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/compare/year-zero.js +@@ -8,14 +8,21 @@ features: [Temporal] + ---*/ + + const ok = new Temporal.PlainDateTime(2000, 5, 2, 15); +-const bad = "-000000-12-07T03:24:30"; ++const invalidStrings = [ ++ "-000000-12-07", ++ "-000000-12-07T03:24:30", ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", ++]; + +-assert.throws(RangeError, +- () => Temporal.PlainDateTime.compare(bad,ok), +- "Cannot use minus zero as extended year (first argument)" +-); ++invalidStrings.forEach((arg) => { ++ assert.throws(RangeError, ++ () => Temporal.PlainDateTime.compare(arg, ok), ++ "Cannot use minus zero as extended year (first argument)" ++ ); + +-assert.throws(RangeError, +- () => Temporal.PlainDateTime.compare(ok, bad), +- "Cannot use minus zero as extended year (second argument)" +-); ++ assert.throws(RangeError, ++ () => Temporal.PlainDateTime.compare(ok, arg), ++ "Cannot use minus zero as extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/constructor-full.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/constructor-full.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8715f22122f34129363973cd67303cbf11e3fdf5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/constructor-full.js +@@ -0,0 +1,23 @@ ++// 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 ++description: Checking an explicitly constructed instance with all arguments ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const calendar = Temporal.Calendar.from("iso8601"); ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar); ++ ++TemporalHelpers.assertPlainDateTime(datetime, ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 456, 789, ++ "check instance (all arguments supplied)" ++); ++ ++assert.sameValue( ++ datetime.calendar, ++ calendar, ++ "calendar supplied in constructor can be extracted and is unchanged" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/datetime-math.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/datetime-math.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0f2e05c6948803800e6c332b88878feca26b25ff +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/datetime-math.js +@@ -0,0 +1,47 @@ ++// 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 ++description: Testing combinations of since, until, add, subtract, and negated ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++const units = ["years", "months", "weeks", "days", "hours", "minutes", "seconds"]; ++ ++units.forEach((largestUnit) => { ++ const diff = later.since(earlier, { largestUnit }); ++ TemporalHelpers.assertDurationsEqual( ++ earlier.since(later, { largestUnit }), ++ diff.negated(), ++ `(${earlier}).since(${later}) == (${later}).since(${earlier}).negated()` ++ ); ++ TemporalHelpers.assertDurationsEqual( ++ earlier.until(later, { largestUnit }), ++ diff, ++ `(${earlier}).until(${later}) == (${later}).since(${earlier})` ++ ); ++ assert.sameValue( ++ earlier.add(diff).equals(later), ++ true, ++ `(${earlier}).add(${diff}) == (${later})` ++ ); ++ assert.sameValue( ++ later.subtract(diff).equals(earlier), ++ true, ++ `(${later}).subtract(${diff}) == (${earlier})` ++ ); ++ assert.sameValue( ++ earlier.subtract(diff.negated()).equals(later), ++ true, ++ "symmetrical with regard to negative durations (1)" ++ ); ++ assert.sameValue( ++ later.add(diff.negated()).equals(earlier), ++ true, ++ "symmetrical with regard to negative durations (2)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0c1d2a5fdf3aecaab1d7bb5ec6c431ee93caeeed +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-number.js +@@ -0,0 +1,28 @@ ++// 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.from ++description: A number is converted to a string, then to Temporal.PlainDateTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++let arg = 19761118; ++ ++const result = Temporal.PlainDateTime.from(arg); ++TemporalHelpers.assertPlainDateTime(result, 1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0, "19761118 is a valid ISO string for PlainDateTime"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDateTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-object-month.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-object-month.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1a2600b80a056d0fe9909dda80cabcf4e53baab3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-object-month.js +@@ -0,0 +1,32 @@ ++// 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.from ++description: A plain object argument needs to specify a month ++features: [Temporal] ++---*/ ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from({year: 1976, month: 11, monthCode: "M12", day: 18}), ++ "month and monthCode must agree" ++); ++ ++assert.throws( ++ TypeError, ++ () => Temporal.PlainDateTime.from({year: 1976, month: undefined, monthCode: undefined, day: 18}), ++ "required prop undefined throws" ++); ++ ++assert.throws( ++ TypeError, ++ () => Temporal.PlainDateTime.from({year: 1976, day: 18, hour: 15, minute: 23, second: 30, millisecond: 123}), ++ "required prop missing throws" ++); ++ ++assert.throws( ++ TypeError, ++ () => Temporal.PlainDateTime.from({year: 1976, months: 11, day: 18}), ++ "plural \"months\" is not acceptable" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bfb0f36cce760684520eaf4d8356d07ce2c8f00a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-object.js +@@ -0,0 +1,40 @@ ++// 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.from ++description: Plain objects are acceptable ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from({year: 1976, month: 11, monthCode: "M11", day: 18}), ++ 1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0, ++ "plain object with month & month code" ++); ++ ++assert.throws( ++ TypeError, ++ () => Temporal.PlainDateTime.from({}), ++ "empty object throws" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from({year: 1976, month: 11, day: 18, millisecond: 123}), ++ 1976, 11, "M11", 18, 0, 0, 0, 123, 0, 0, ++ "plain object with month but not month code" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from({year: 1976, monthCode: "M09", day: 18, millisecond: 123}), ++ 1976, 9, "M09", 18, 0, 0, 0, 123, 0, 0, ++ "plain object with month code but not month" ++); ++ ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from({year: 1976, month: 11, day: 18, hours: 12}), ++ 1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0, ++ "incorrectly-spelled properties (e.g., plural \"hours\") are ignored" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-plaindatetime.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-plaindatetime.js +new file mode 100644 +index 0000000000000000000000000000000000000000..67239ff1e3fe5bd7223f6a3012f12f3744ff4dce +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-plaindatetime.js +@@ -0,0 +1,24 @@ ++// 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.from ++description: A PlainDateTime object is copied, not returned directly ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const orig = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 20, 123, 456, 789); ++const result = Temporal.PlainDateTime.from(orig); ++ ++TemporalHelpers.assertPlainDateTime( ++ result, ++ 1976, 11, "M11", 18, 15, 23, 20, 123, 456, 789, ++ "PlainDateTime is copied" ++); ++ ++assert.notSameValue( ++ result, ++ orig, ++ "When a PlainDateTime is given, the returned value is not the original PlainDateTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4e19d8ac56c91f0715d76b600edb7199cabb9371 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-leap-second.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.from ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = Temporal.PlainDateTime.from(arg); ++TemporalHelpers.assertPlainDateTime( ++ result1, ++ 1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = Temporal.PlainDateTime.from(arg); ++TemporalHelpers.assertPlainDateTime( ++ result2, ++ 1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ae00e596a0d9b14a7c9793209b4909e4ce53b76c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-number.js +@@ -0,0 +1,40 @@ ++// 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.from ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = Temporal.PlainDateTime.from(arg); ++TemporalHelpers.assertPlainDateTime(result1, 1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = Temporal.PlainDateTime.from(arg); ++TemporalHelpers.assertPlainDateTime(result2, 1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e81f58d4b47684887a274c07513a948395a91893 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,44 @@ ++// 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.from ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => Temporal.PlainDateTime.from(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => Temporal.PlainDateTime.from(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => Temporal.PlainDateTime.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => Temporal.PlainDateTime.from(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => Temporal.PlainDateTime.from(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..833ed2f08dd9c782c964c3d4127c5a473f168824 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.from ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++ ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-comma-decimal-separator.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-comma-decimal-separator.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a3cd3cbc77d0cc331e8170490194844203b06534 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-comma-decimal-separator.js +@@ -0,0 +1,15 @@ ++// 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.from ++description: Comma may be used as a decimal separator ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30,12"), ++ 1976, 11, "M11", 18, 15, 23, 30, 120, 0, 0, ++ "comma decimal separator" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ed060ba5273788de212426fdfa8ddff9d2232344 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-invalid.js +@@ -0,0 +1,59 @@ ++// 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.from ++description: Reject string argument if it cannot be parsed ++features: [Temporal] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "obviously invalid", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDateTime: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++ ++invalidStrings.forEach((s) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from(s), ++ `invalid date-time string (${s})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-minus-sign.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-minus-sign.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eef062b12e66482d0c417795bc553b42a748df87 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-minus-sign.js +@@ -0,0 +1,21 @@ ++// 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.from ++description: Non-ASCII minus sign is acceptable ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.12\u221202:00"), ++ 1976, 11, "M11", 18, 15, 23, 30, 120, 0, 0, ++ "variant minus sign (offset)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("\u2212009999-11-18T15:23:30.12"), ++ -9999, 11, "M11", 18, 15, 23, 30, 120, 0, 0, ++ "variant minus sign (leading minus)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-offset.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-offset.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7c98362d41ce1180c9d2433660c8536324282f52 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-offset.js +@@ -0,0 +1,36 @@ ++// 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.from ++description: Extended format may be used ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const expected = [1976, 11, "M11", 18, 15, 23, 30, 100, 0, 0]; ++ ++const strs = [ ++ "1976-11-18T152330.1+00:00", ++ "19761118T15:23:30.1+00:00", ++ "1976-11-18T15:23:30.1+0000", ++ "1976-11-18T152330.1+0000", ++ "19761118T15:23:30.1+0000", ++ "19761118T152330.1+00:00", ++ "19761118T152330.1+0000", ++ "+001976-11-18T152330.1+00:00", ++ "+0019761118T15:23:30.1+00:00", ++ "+001976-11-18T15:23:30.1+0000", ++ "+001976-11-18T152330.1+0000", ++ "+0019761118T15:23:30.1+0000", ++ "+0019761118T152330.1+00:00", ++ "+0019761118T152330.1+0000" ++]; ++ ++strs.forEach((s) => { ++ TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from(s), ++ ...expected, ++ `mixture of basic and extended format (${s})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-optional-data.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-optional-data.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ff4d5816a82d6c8782ab008b264a29f87e18f1ee +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-optional-data.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.from ++description: Some parts of a string argument may be omitted ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30+00"), ++ 1976, 11, "M11", 18, 15, 23, 30, 0, 0, 0, ++ "optional parts (no minute after offset)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15"), ++ 1976, 11, "M11", 18, 15, 0, 0, 0, 0, 0, ++ "optional parts (no minute in time part)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18"), ++ 1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0, ++ "optional parts (no time part)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-out-of-range.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3a5525d0a8b893f1de4add9b3bb34308a5000329 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-out-of-range.js +@@ -0,0 +1,32 @@ ++// 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.from ++description: Invalid ISO string not acceptable even with overflow = constrain ++features: [Temporal] ++---*/ ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from("2020-13-34T24:60", {}), ++ "constrain has no effect on invalid ISO string (empty options argument)" ++); ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from("2020-13-34T24:60", () => {}), ++ "constrain has no effect on invalid ISO string (nullary empty object function argument)" ++); ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from("2020-13-34T24:60", {overflow: "constrain"}), ++ "overflow = constrain has no effect on invalid ISO string" ++); ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from("2020-13-34T24:60", {overflow: "reject"}), ++ "overflow = reject has no effect on invalid ISO string" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-subsecond.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-subsecond.js +new file mode 100644 +index 0000000000000000000000000000000000000000..096c51b30b5d284cfad1d2dc923c3c39c1306c7d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-subsecond.js +@@ -0,0 +1,69 @@ ++// 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.from ++description: Up to nine digits of sub-second precision are acceptable ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.1"), ++ 1976, 11, "M11", 18, 15, 23, 30, 100, 0, 0, ++ "various precisions are possible (one decimal digit)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.12"), ++ 1976, 11, "M11", 18, 15, 23, 30, 120, 0, 0, ++ "various precisions are possible (two decimal digits)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.123"), ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 0, 0, ++ "various precisions are possible (three decimal digits)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.1234"), ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 400, 0, ++ "various precisions are possible (four decimal digits)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.12345"), ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 450, 0, ++ "various precisions are possible (five decimal digits)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.123456"), ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 456, 0, ++ "various precisions are possible (six decimal digits)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.1234567"), ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 456, 700, ++ "various precisions are possible (seven decimal digits)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.12345678"), ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 456, 780, ++ "various precisions are possible (eight decimal digits)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.123456789"), ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 456, 789, ++ "various precisions are possible (nine decimal digits)" ++); ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from("1976-11-18T15:23:30.1234567891"), ++ "ten decimal digits is too much" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js +new file mode 100644 +index 0000000000000000000000000000000000000000..739b96e9ea8bb40c1c363cf289bdc0c7065f3691 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-time-separators.js +@@ -0,0 +1,29 @@ ++// 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.from ++description: Time separator in string argument can vary ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const expected = [1976, 11, "M11", 18, 15, 23, 0, 0, 0, 0]; ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23"), ++ ...expected, ++ "variant time separators (uppercase T)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18t15:23"), ++ ...expected, ++ "variant time separators (lowercase T)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18 15:23"), ++ ...expected, ++ "variant time separators (space between date and time)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-timezone.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-timezone.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c729d7e0e886ba10550864a38dd9610812d16fc3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string-timezone.js +@@ -0,0 +1,15 @@ ++// 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.from ++description: Timezone, if specified, is ignored ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("2020-01-01T01:23:45[Asia/Kolkata]"), ++ 2020, 1, "M01", 1, 1, 23, 45, 0, 0, 0, ++ "ignores if a timezone is specified" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bec38c43d8747cd40423fa5ecfd9f03b94c12b1b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-string.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. ++ ++/*--- ++esid: sec-temporal.plaindatetime.from ++description: String arguments are acceptable ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30"), ++ 1976, 11, "M11", 18, 15, 23, 30, 0, 0, 0, ++ "date and time (no subseconds)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.001"), ++ 1976, 11, "M11", 18, 15, 23, 30, 1, 0, 0, ++ "date and time (millisecond)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.001123"), ++ 1976, 11, "M11", 18, 15, 23, 30, 1, 123, 0, ++ "date and time (microsecond)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("1976-11-18T15:23:30.001123456"), ++ 1976, 11, "M11", 18, 15, 23, 30, 1, 123, 456, ++ "date and time (nanosecond)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..99b167fc2cd2ca43e6f8285e921f9d52524e7d24 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/argument-wrong-type.js +@@ -0,0 +1,34 @@ ++// 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.from ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.PlainDateTime.from(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDateTime, "Temporal.PlainDateTime, object"], ++ [Temporal.PlainDateTime.prototype, "Temporal.PlainDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.PlainDateTime.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9a1a78c1fe79f076a5d6087905d02095f8730216 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/leap-second.js +@@ -0,0 +1,40 @@ ++// 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.from ++description: Leap second is a valid ISO string for PlainDateTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++ ++const result1 = Temporal.PlainDateTime.from(arg); ++TemporalHelpers.assertPlainDateTime( ++ result1, ++ 2016, 12, "M12", 31, 23, 59, 59, 0, 0, 0, ++ "leap second is a valid ISO string for PlainDateTime" ++); ++ ++const result2 = Temporal.PlainDateTime.from(arg); ++TemporalHelpers.assertPlainDateTime( ++ result2, ++ 2016, 12, "M12", 31, 23, 59, 59, 0, 0, 0, ++ "leap second is a valid ISO string for PlainDateTime even with overflow: reject" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++ ++const result3 = Temporal.PlainDateTime.from(arg); ++TemporalHelpers.assertPlainDateTime( ++ result3, ++ 2016, 12, "M12", 31, 23, 59, 59, 0, 0, 0, ++ "second: 60 is constrained in property bag for PlainDateTime" ++); ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from(arg, { overflow: "reject" }), ++ "second: 60 is rejected in property bag for PlainDateTime with overflow: reject" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/limits.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/limits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1d4f76eac2e2dd250cead629117f08ef575fbd1b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/limits.js +@@ -0,0 +1,70 @@ ++// 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.from ++description: Checking limits of representable PlainDateTime ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++["reject", "constrain"].forEach((overflow) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from({ year: -271821, month: 4, day: 19 }, { overflow }), ++ `negative out of bounds (plain object, overflow = ${overflow})` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from({ year: 275760, month: 9, day: 14 }, { overflow }), ++ `positive out of bounds (plain object, overflow = ${overflow})` ++ ); ++}); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from({ year: -271821, month: 4, day: 19, nanosecond: 1 }), ++ -271821, 4, "M04", 19, 0, 0, 0, 0, 0, 1, ++ "construct from property bag (negative boundary)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from( ++ { ++ year: 275760, ++ month: 9, ++ day: 13, ++ hour: 23, ++ minute: 59, ++ second: 59, ++ millisecond: 999, ++ microsecond: 999, ++ nanosecond: 999 ++ } ++ ), ++ 275760, 9, "M09", 13, 23, 59, 59, 999, 999, 999, ++ "construct from property bag (positive boundary)" ++); ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from("-271821-04-19T00:00"), ++ "out-of-bounds ISO string (negative case)" ++); ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from("+275760-09-14T00:00"), ++ "out-of-bounds ISO string (positive case)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("-271821-04-19T00:00:00.000000001"), ++ -271821, 4, "M04", 19, 0, 0, 0, 0, 0, 1, ++ "boundary ISO string (negative case)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from("+275760-09-13T23:59:59.999999999"), ++ 275760, 9, "M09", 13, 23, 59, 59, 999, 999, 999, ++ "boundary ISO string (positive case)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..df34d81b64c22db0acdfd1aea8e2f75fd870b6e3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/options-wrong-type.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.from ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++for (const value of badOptions) { ++ assert.throws(TypeError, () => Temporal.PlainDateTime.from({ year: 1976, month: 11, day: 18 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/overflow-default-constrain.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/overflow-default-constrain.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a2b52c1d9723eda70bdaa8f002d871386abaf90c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/overflow-default-constrain.js +@@ -0,0 +1,37 @@ ++// 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.from ++description: By default, overflow = constrain ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const date = {year: 2019, month: 1, day: 32}; ++const data = [2019, 1, "M01", 31, 0, 0, 0, 0, 0, 0]; ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from(date), ++ ...data, ++ "by default, overflow is constrain (overflow options argument absent)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from(date, {}), ++ ...data, ++ "by default, overflow is constrain (options argument is empty plain object)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from(date, () => {}), ++ ...data, ++ "by default, overflow is constrain (options argument is empty function)" ++); ++ ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from(date, {overflow: "constrain"}), ++ ...data, ++ "by default, overflow is constrain (overflow options argument present)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/overflow-invalid-string.js +index 41673499f7231b29cf936286827bbbb686e3c365..1786ed59049c5600e75b8b52f94a451027a174d2 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/overflow-invalid-string.js +@@ -31,6 +31,14 @@ const validValues = [ + { year: 2000, month: 5, day: 2, hour: 12 }, + "2000-05-02T12:00", + ]; +-validValues.forEach((value) => { +- assert.throws(RangeError, () => Temporal.PlainDateTime.from(value, { overflow: "other string" })); +-}); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const value of validValues) { ++ for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from(value, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++ } ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/overflow-reject.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/overflow-reject.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bbd57ae4b752efee410c06683a88c02acc966c79 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/overflow-reject.js +@@ -0,0 +1,21 @@ ++// 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.from ++description: Possibly throw if overflow is reject ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++TemporalHelpers.assertPlainDateTime( ++ Temporal.PlainDateTime.from({year: 2019, month: 1, day: 31}, {overflow: "reject"}), ++ 2019, 1, "M01", 31, 0, 0, 0, 0, 0, 0, ++ "overflow reject, acceptable argument" ++); ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainDateTime.from({year: 2019, month: 1, day: 32}, {overflow: "reject"}), ++ "overflow reject, unacceptable argument" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/year-zero.js +index 7f21302a3bc18b3f4789a597a33881ebddfc570f..f40d3345a436aadaac5cd5426fe381c151e56686 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/from/year-zero.js +@@ -8,13 +8,16 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ ++ "-000000-12-07", + "-000000-12-07T03:24:30", +- "-000000-12-07T03:24:30+01:00[UTC]" ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; ++ + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => { Temporal.PlainDateTime.from(arg); }, ++ () => Temporal.PlainDateTime.from(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/hour-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/hour-undefined.js +index e42831dcd6f2501eb6854c7ceb4fcfade3425044..a27c964d1c14bfda5b8f294bf5dd18bb13c2e236 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/hour-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/hour-undefined.js +@@ -5,12 +5,19 @@ + esid: sec-temporal.plaindatetime + description: Hour argument defaults to 0 if not given + features: [Temporal] ++includes: [temporalHelpers.js] + ---*/ + + const args = [2000, 5, 2]; + +-const explicit = new Temporal.PlainDateTime(...args, undefined); +-assert.sameValue(explicit.hour, 0, "hour default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args, undefined), ++ 2000, 5, "M05", 2, 0, 0, 0, 0, 0, 0, ++ "hour default argument (argument present)" ++); + +-const implicit = new Temporal.PlainDateTime(...args); +-assert.sameValue(implicit.hour, 0, "hour default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args), ++ 2000, 5, "M05", 2, 0, 0, 0, 0, 0, 0, ++ "hour default argument (argument missing)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/limits.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/limits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c820fa7234c6ff851924ca563b31c812f9513f0f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/limits.js +@@ -0,0 +1,19 @@ ++// 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 ++description: Checking limits of representable PlainDateTime ++features: [Temporal] ++---*/ ++ ++assert.throws( ++ RangeError, ++ () => new Temporal.PlainDateTime(-271821, 4, 19, 0, 0, 0, 0, 0, 0), ++ "negative year out of bounds" ++); ++assert.throws( ++ RangeError, ++ () => new Temporal.PlainDateTime(275760, 9, 14, 0, 0, 0, 0, 0, 0), ++ "positive year out of bounds" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/microsecond-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/microsecond-undefined.js +index 83004a31301248c6491793c80af4e50a2c7c86bf..e2fd092f4acd1fa8cfcec8c3f2f3702b2e426152 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/microsecond-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/microsecond-undefined.js +@@ -5,12 +5,20 @@ + esid: sec-temporal.plaindatetime + description: Microsecond argument defaults to 0 if not given + features: [Temporal] ++includes: [temporalHelpers.js] + ---*/ + + const args = [2000, 5, 2, 12, 34, 56, 123]; + +-const explicit = new Temporal.PlainDateTime(...args, undefined); +-assert.sameValue(explicit.microsecond, 0, "microsecond default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args, undefined), ++ 2000, 5, "M05", 2, 12, 34, 56, 123, 0, 0, ++ "microsecond default argument (argument present)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args), ++ 2000, 5, "M05", 2, 12, 34, 56, 123, 0, 0, ++ "microsecond default argument (argument missing)" ++); + +-const implicit = new Temporal.PlainDateTime(...args); +-assert.sameValue(implicit.microsecond, 0, "microsecond default argument"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/millisecond-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/millisecond-undefined.js +index de0c1b84476f6ccc93fae61302bf0b1fc8848267..33c2a7ec638bcd312269dfc4ea971d3f4178239e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/millisecond-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/millisecond-undefined.js +@@ -5,12 +5,19 @@ + esid: sec-temporal.plaindatetime + description: Millisecond argument defaults to 0 if not given + features: [Temporal] ++includes: [temporalHelpers.js] + ---*/ + + const args = [2000, 5, 2, 12, 34, 56]; + +-const explicit = new Temporal.PlainDateTime(...args, undefined); +-assert.sameValue(explicit.millisecond, 0, "millisecond default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args, undefined), ++ 2000, 5, "M05", 2, 12, 34, 56, 0, 0, 0, ++ "millisecond default argument (argument present)" ++); + +-const implicit = new Temporal.PlainDateTime(...args); +-assert.sameValue(implicit.millisecond, 0, "millisecond default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args), ++ 2000, 5, "M05", 2, 12, 34, 56, 0, 0, 0, ++ "millisecond default argument (argument missing)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/minute-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/minute-undefined.js +index 9ac682fc9584cf12818f8e45fa5f880ebc527ee7..8792608e822c71b50f616a4fad9736929bda4c9e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/minute-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/minute-undefined.js +@@ -5,12 +5,19 @@ + esid: sec-temporal.plaindatetime + description: Minute argument defaults to 0 if not given + features: [Temporal] ++includes: [temporalHelpers.js] + ---*/ + + const args = [2000, 5, 2, 12]; + +-const explicit = new Temporal.PlainDateTime(...args, undefined); +-assert.sameValue(explicit.minute, 0, "minute default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args, undefined), ++ 2000, 5, "M05", 2, 12, 0, 0, 0, 0, 0, ++ "minute default argument (argument present)" ++); + +-const implicit = new Temporal.PlainDateTime(...args); +-assert.sameValue(implicit.minute, 0, "minute default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args), ++ 2000, 5, "M05", 2, 12, 0, 0, 0, 0, 0, ++ "minute default argument (argument missing)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/nanosecond-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/nanosecond-undefined.js +index f3f8b52c5d481d7a6e9d37a3bd4ecab13464e431..a913a005ad32e2587dd6f151ebd7f616257cd644 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/nanosecond-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/nanosecond-undefined.js +@@ -5,12 +5,19 @@ + esid: sec-temporal.plaindatetime + description: Nanosecond argument defaults to 0 if not given + features: [Temporal] ++includes: [temporalHelpers.js] + ---*/ + + const args = [2000, 5, 2, 12, 34, 56, 123, 456]; + +-const explicit = new Temporal.PlainDateTime(...args, undefined); +-assert.sameValue(explicit.nanosecond, 0, "nanosecond default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args, undefined), ++ 2000, 5, "M05", 2, 12, 34, 56, 123, 456, 0, ++ "nanosecond default argument (argument present)" ++); + +-const implicit = new Temporal.PlainDateTime(...args); +-assert.sameValue(implicit.nanosecond, 0, "nanosecond default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args), ++ 2000, 5, "M05", 2, 12, 34, 56, 123, 456, 0, ++ "nanosecond default argument (argument missing)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/ambiguous-date.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/ambiguous-date.js +new file mode 100644 +index 0000000000000000000000000000000000000000..476129400d3114d86119abd53725e4c9870cd555 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/ambiguous-date.js +@@ -0,0 +1,29 @@ ++// 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.add ++description: Ambiguous addition is handled according to the overflow option ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.add({ months: 1 }), ++ 2020, 2, "M02", 29, 15, 0, 0, 0, 0, 0, ++ "constrain when ambiguous result (overflow options not supplied)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.add({ months: 1 }, { overflow: "constrain" }), ++ 2020, 2, "M02", 29, 15, 0, 0, 0, 0, 0, ++ "constrain when ambiguous result (overflow options supplied)" ++); ++ ++assert.throws( ++ RangeError, ++ () => jan31.add({ months: 1 }, { overflow: "reject" }), ++ "throw when ambiguous result with reject" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-duration.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-duration.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7fd1317644daa70a728a73456211bdeee619d95e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-duration.js +@@ -0,0 +1,17 @@ ++// 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.add ++description: Duration object arguments are handled ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.add(Temporal.Duration.from("P1MT1S")), ++ 2020, 2, "M02", 29, 15, 0, 1, 0, 0, 0, ++ "Duration argument" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-object-insufficient-data.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-object-insufficient-data.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4780d5ac08ffd90579b9fd2f444e22aa2f685da6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-object-insufficient-data.js +@@ -0,0 +1,35 @@ ++// 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.add ++description: At least one recognized property has to be present in argument ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++assert.throws( ++ TypeError, ++ () => jan31.add({}), ++ "empty object not acceptable" ++); ++ ++assert.throws( ++ TypeError, ++ () => jan31.add({ month: 12 }), // should be "months" ++ "misspelled property in argument throws if no other properties are present" ++); ++ ++assert.throws( ++ TypeError, ++ () => jan31.add({ nonsense: true }), ++ "unrecognized properties throw if no other recognized property is present" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.add({ nonsense: 1, days: 1 }), ++ 2020, 2, "M02", 1, 15, 0, 0, 0, 0, 0, ++ "unrecognized properties ignored provided at least one recognized property is present" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-plain-object-mixed-signs.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-plain-object-mixed-signs.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0a308a79a043d41b36cf78708228ee8eae7748fe +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/argument-plain-object-mixed-signs.js +@@ -0,0 +1,18 @@ ++// 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.add ++description: Positive and negative values in the temporalDurationLike argument are not acceptable ++features: [Temporal] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++["constrain", "reject"].forEach((overflow) => { ++ assert.throws( ++ RangeError, ++ () => jan31.add({ hours: 1, minutes: -30 }, { overflow }), ++ `mixed positive and negative values always throw (overflow = "${overflow}")` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/hour-overflow.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/hour-overflow.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fe6f83e3f6d8319d362539de2213a96fe52e3d60 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/hour-overflow.js +@@ -0,0 +1,25 @@ ++// 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.add ++description: Testing overflow hours (adding hours that push one to the next/previous day) ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2020, 5, 31, 23, 12, 38, 271, 986, 102); ++ ++TemporalHelpers.assertPlainDateTime( ++ earlier.add({ hours: 2 }), ++ 2020, 6, "M06", 1, 1, 12, 38, 271, 986, 102, ++ "hours overflow (push to next day)" ++); ++ ++const later = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++ ++TemporalHelpers.assertPlainDateTime( ++ later.add({ hours: -12 }), ++ 2019, 10, "M10", 28, 22, 46, 38, 271, 986, 102, ++ "hours overflow (push to previous day)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/limits.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/limits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6110946bab89a70482e0867dc7513062d8002885 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/limits.js +@@ -0,0 +1,25 @@ ++// 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.add ++description: Checking limits of representable PlainDateTime ++features: [Temporal] ++---*/ ++ ++const min = new Temporal.PlainDateTime(-271821, 4, 19, 0, 0, 0, 0, 0, 1); ++const max = new Temporal.PlainDateTime(275760, 9, 13, 23, 59, 59, 999, 999, 999); ++ ++["reject", "constrain"].forEach((overflow) => { ++ assert.throws( ++ RangeError, ++ () => max.add({ nanoseconds: 1 }, { overflow }), ++ `adding 1 nanosecond beyond maximum limit (overflow = ${overflow})` ++ ); ++ assert.throws( ++ RangeError, ++ () => min.add({ nanoseconds: -1 }, { overflow }), ++ `adding -1 nanosecond beyond minimum limit (overflow = ${overflow})` ++ ); ++ ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/negative-duration.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/negative-duration.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c60f871e6131bda8e69f8b6d7efe7a680778a97a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/negative-duration.js +@@ -0,0 +1,23 @@ ++// 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.add ++description: Negative durations can be supplied ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.add({ minutes: -30 }), ++ 2020, 1, "M01", 31, 14, 30, 0, 0, 0, 0, ++ "negative minutes" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.add({ seconds: -30 }), ++ 2020, 1, "M01", 31, 14, 59, 30, 0, 0, 0, ++ "negative seconds" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-empty.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-empty.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d7c923f6f24eb56906bb5a612f0e0ada6ff332d1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-empty.js +@@ -0,0 +1,23 @@ ++// 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.add ++description: Verify that undefined options are handled correctly. ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.add({ months: 1 }, {}), ++ 2020, 2, "M02", 29, 15, 0, 0, 0, 0, 0, ++ "options may be empty object" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.add({ months: 1 }, () => {}), ++ 2020, 2, "M02", 29, 15, 0, 0, 0, 0, 0, ++ "options may be function object" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9255c7a10f4585cb28387ee4aa15449daf98c7a1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-invalid.js +@@ -0,0 +1,20 @@ ++// 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.add ++description: Various invalid (wrong type) values for options argument ++features: [Temporal, Symbol] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++const badOptions = [null, 1, 'hello', true, Symbol('foo'), 1n]; ++ ++badOptions.forEach((bad) => { ++ assert.throws( ++ TypeError, ++ () => jan31.add({ years: 1 }, bad), ++ `invalid options (${typeof bad})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..68c33eb49700883d957f25c41c05a87263cd2815 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.add ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.add({ months: 1 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/overflow-invalid-string.js +index 2ff326b8d67b2fe010541be2485e701491e40eae..6ce6ecc29de5425dd1caa3af9b8cf8cd0fb20b2f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/add/overflow-invalid-string.js +@@ -20,4 +20,13 @@ features: [Temporal] + + const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12); + const duration = new Temporal.Duration(3, 3, 0, 3, 3); +-assert.throws(RangeError, () => datetime.add(duration, { overflow: "other string" })); ++ ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => datetime.add({ months: 1 }, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfWeek/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfWeek/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..437ac74b60ea07469f4c89ff9764d13b994be111 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfWeek/basic.js +@@ -0,0 +1,12 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-get-temporal.plaindatetime.prototype.dayofweek ++description: Checking day of week for a "normal" case (non-undefined, non-boundary case, etc.) ++features: [Temporal] ++---*/ ++ ++const calendar = Temporal.Calendar.from("iso8601"); ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar); ++assert.sameValue(datetime.dayOfWeek, 4, "check day of week information"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfYear/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfYear/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..98ee0fbef0a360a7390e4ce1175c2d7a7ec0906b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/dayOfYear/basic.js +@@ -0,0 +1,12 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-get-temporal.plaindatetime.prototype.dayofyear ++description: Checking day of year for a "normal" case (non-undefined, non-boundary case, etc.) ++features: [Temporal] ++---*/ ++ ++const calendar = Temporal.Calendar.from("iso8601"); ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar); ++assert.sameValue(datetime.dayOfYear, 323, "check day of year information"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7059e7a0cb90444d28d1aac5ed229afdc64ee59e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInMonth/basic.js +@@ -0,0 +1,12 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-get-temporal.plaindatetime.prototype.daysinmonth ++description: Checking days in month for a "normal" case (non-undefined, non-boundary case, etc.) ++features: [Temporal] ++---*/ ++ ++const calendar = Temporal.Calendar.from("iso8601"); ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar); ++assert.sameValue(datetime.daysInMonth, 30, "check days in month information"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f34e00f7560150ab0bc384d2bf9d40b16d0ee65f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInWeek/basic.js +@@ -0,0 +1,12 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-get-temporal.plaindatetime.prototype.daysinweek ++description: Checking days in week for a "normal" case (non-undefined, non-boundary case, etc.) ++features: [Temporal] ++---*/ ++ ++const calendar = Temporal.Calendar.from("iso8601"); ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar); ++assert.sameValue(datetime.daysInWeek, 7, "check days in week information"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d3c7a5d8a94087d03ff60fbb734bcdc4e5977930 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/daysInYear/basic.js +@@ -0,0 +1,12 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-get-temporal.plaindatetime.prototype.daysinyear ++description: Checking days in year for a "normal" case (non-undefined, non-boundary case, etc.) ++features: [Temporal] ++---*/ ++ ++const calendar = Temporal.Calendar.from("iso8601"); ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar); ++assert.sameValue(datetime.daysInYear, 366, "check days in year information"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3b5f54af8801f08dcb9f3e74c29ecd8fd938e8ac +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.equals ++description: A number is converted to a string, then to Temporal.PlainDateTime ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18); ++ ++let arg = 19761118; ++ ++const result = instance.equals(arg); ++assert.sameValue(result, true, "19761118 is a valid ISO string for PlainDateTime"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDateTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-object-insufficient-data.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-object-insufficient-data.js +new file mode 100644 +index 0000000000000000000000000000000000000000..054e032ded502a25239f535fb99c12564263414b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-object-insufficient-data.js +@@ -0,0 +1,16 @@ ++// 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.equals ++description: If argument is an object, it must contain sufficient information ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++ ++assert.throws( ++ TypeError, ++ () => dt.equals({ year: 1976 }), ++ "object must contain required properties" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2ef93da20c014ebfafc7dcf8ddccdedec4379686 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.equals ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.equals(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.equals(arg); ++assert.sameValue( ++ result2, ++ true, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..347888b944a12fce05c1712a4f57300e899554e5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.equals ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.equals(arg); ++assert.sameValue(result1, true, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.equals(arg); ++assert.sameValue(result2, true, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bfbdcec9462eb865933aa72c1926a07991c67b5c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.equals ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.equals(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2ada66e34e40462b71b21c9bfdc7ad1d97ef87f5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.equals ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-wrong-type.js +index 2ec4c776d5de8a72cabc9eeec28e6d0c326a82cc..686d371b9aec517dfd57fec980b9bdae155ba9f1 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/argument-wrong-type.js +@@ -1,20 +1,36 @@ +-// Copyright (C) 2020 Igalia, S.L. All rights reserved. ++// 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.equals +-description: Appropriate error thrown when argument cannot be converted to a valid string +-features: [Symbol, Temporal] ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDateTime ++features: [BigInt, Symbol, Temporal] + ---*/ + +-const instance = Temporal.PlainDateTime.from({ year: 2000, month: 5, day: 2, minute: 34, second: 56, millisecond: 987, microsecond: 654, nanosecond: 321 }); ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + +-assert.throws(RangeError, () => instance.equals(undefined), "undefined"); +-assert.throws(RangeError, () => instance.equals(null), "null"); +-assert.throws(RangeError, () => instance.equals(true), "true"); +-assert.throws(RangeError, () => instance.equals(""), "empty string"); +-assert.throws(TypeError, () => instance.equals(Symbol()), "symbol"); +-assert.throws(RangeError, () => instance.equals(1), "1"); +-assert.throws(TypeError, () => instance.equals({}), "plain object"); +-assert.throws(TypeError, () => instance.equals(Temporal.PlainDateTime), "Temporal.PlainDateTime"); +-assert.throws(TypeError, () => instance.equals(Temporal.PlainDateTime.prototype), "Temporal.PlainDateTime.prototype"); ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDateTime, "Temporal.PlainDateTime, object"], ++ [Temporal.PlainDateTime.prototype, "Temporal.PlainDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..72133b1e514e7d8e3e05f5751aeb9734131d5526 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/basic.js +@@ -0,0 +1,20 @@ ++// 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.equals ++description: Checking a typical case (everything defined, no NaNs, nothing throws, etc.) ++features: [Temporal] ++---*/ ++ ++const dt1 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const dt2 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++const dt3 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++const dt4 = new Temporal.PlainDateTime(2019, 10, 29, 15, 23, 30, 123, 456, 789); ++const dt5 = new Temporal.PlainDateTime(1976, 11, 18, 10, 46, 38, 271, 986, 102); ++ ++assert.sameValue(dt1.equals(dt1), true, "equal"); ++assert.sameValue(dt1.equals(dt2), false, "unequal"); ++assert.sameValue(dt2.equals(dt3), true, "equal with different objects"); ++assert.sameValue(dt2.equals(dt4), false, "same date, different time"); ++assert.sameValue(dt2.equals(dt5), false, "same time, different date"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/calendar-checked.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/calendar-checked.js +new file mode 100644 +index 0000000000000000000000000000000000000000..de8dfabf30ea60209153138d7ce3cee2d58abeb4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/calendar-checked.js +@@ -0,0 +1,36 @@ ++// 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.equals ++description: Calendar is taken into account if the ISO data is equal ++includes: [compareArray.js,temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const actual = []; ++const calendar1 = TemporalHelpers.toPrimitiveObserver(actual, "A", "calendar1"); ++const calendar2 = TemporalHelpers.toPrimitiveObserver(actual, "A", "calendar2"); ++const calendar3 = TemporalHelpers.toPrimitiveObserver(actual, "B", "calendar3"); ++const dt1 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar1); ++const dt1b = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar1); ++const dt2 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar2); ++const dt3 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar3); ++ ++assert.sameValue(dt1.equals(dt1b), true, "same calendar object"); ++assert.compareArray(actual, []); ++ ++assert.sameValue(dt1.equals(dt2), true, "same calendar string"); ++assert.compareArray(actual, ["get calendar1.toString", "call calendar1.toString", "get calendar2.toString", "call calendar2.toString"]); ++ ++actual.splice(0, actual.length); // empty it for the next check ++assert.sameValue(dt1.equals(dt3), false, "different calendar string"); ++assert.compareArray(actual, ["get calendar1.toString", "call calendar1.toString", "get calendar3.toString", "call calendar3.toString"]); ++ ++const calendar4 = { toString() { throw new Test262Error("should not call calendar4.toString") } }; ++const calendar5 = { toString() { throw new Test262Error("should not call calendar5.toString") } }; ++const dt4 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar4); ++const dt5 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102, calendar4); ++const dt6 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102, calendar5); ++assert.sameValue(dt4.equals(dt5), false, "not equal same calendar"); ++assert.sameValue(dt4.equals(dt6), false, "not equal different calendar"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/cast.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/cast.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bad87ec1d7bef50cca4a859958d29a7528598183 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/cast.js +@@ -0,0 +1,46 @@ ++// 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.equals ++description: Argument may be cast ++features: [Temporal] ++---*/ ++ ++const dt1 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const dt2 = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++ ++assert.sameValue( ++ dt1.equals({ ++ year: 1976, ++ month: 11, ++ day: 18, ++ hour: 15, ++ minute: 23, ++ second: 30, ++ millisecond: 123, ++ microsecond: 456, ++ nanosecond: 789 ++ }), ++ true, ++ "casts argument (plain object, positive)" ++); ++ ++ ++assert.sameValue( ++ dt2.equals({ year: 1976, month: 11, day: 18, hour: 15 }), ++ false, ++ "casts argument (plain object, negative)" ++); ++ ++assert.sameValue( ++ dt1.equals("1976-11-18T15:23:30.123456789"), ++ true, ++ "casts argument (string, positive)" ++); ++ ++assert.sameValue( ++ dt2.equals("1976-11-18T15:23:30.123456789"), ++ false, ++ "casts argument (string, negative)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f8687efb4dee0f9c0a2fc6b44ceeca1f047d79f0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.equals ++description: Leap second is a valid ISO string for PlainDateTime ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2016, 12, 31, 23, 59, 59); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.equals(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for PlainDateTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.equals(arg); ++assert.sameValue( ++ result2, ++ true, ++ "second: 60 is ignored in property bag for PlainDateTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/year-zero.js +index 175c2d7016608ce7bc8ba5438ef7495a2f217227..6eb6fd5c27694d0467d1ef58b575565a76596147 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/equals/year-zero.js +@@ -8,14 +8,16 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ ++ "-000000-12-07", + "-000000-12-07T03:24:30", +- "-000000-12-07T03:24:30+01:00[UTC]" ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => { instance.equals(arg); }, ++ () => instance.equals(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/monthsInYear/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/monthsInYear/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f918a25355e39f7611b427d4fe5d68cd9823711b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/monthsInYear/basic.js +@@ -0,0 +1,12 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-get-temporal.plaindatetime.prototype.monthsinyear ++description: Checking months in year for a "normal" case (non-undefined, non-boundary case, etc.) ++features: [Temporal] ++---*/ ++ ++const calendar = Temporal.Calendar.from("iso8601"); ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar); ++assert.sameValue(datetime.monthsInYear, 12, "check months in year information"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/balance.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/balance.js +new file mode 100644 +index 0000000000000000000000000000000000000000..37a7947b6e3bff9032c17be4866d1aef02a34bcb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/balance.js +@@ -0,0 +1,19 @@ ++// 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.round ++description: Rounding balances to the next smallest unit ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 23, 59, 59, 999, 999, 999); ++ ++["day", "hour", "minute", "second", "millisecond", "microsecond"].forEach((smallestUnit) => { ++ TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit }), ++ 1976, 11, "M11", 19, 0, 0, 0, 0, 0, 0, ++ `balances to next ${smallestUnit}` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/limits.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/limits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..15db01f45a97e8e3ecaef93eeac40a1a4106a0f5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/limits.js +@@ -0,0 +1,24 @@ ++// 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.round ++description: Checking limits of representable PlainDateTime ++features: [Temporal] ++---*/ ++ ++const min = new Temporal.PlainDateTime(-271821, 4, 19, 0, 0, 0, 0, 0, 1); ++const max = new Temporal.PlainDateTime(275760, 9, 13, 23, 59, 59, 999, 999, 999); ++ ++["day", "hour", "minute", "second", "millisecond", "microsecond"].forEach((smallestUnit) => { ++ assert.throws( ++ RangeError, ++ () => min.round({ smallestUnit, roundingMode: "floor" }), ++ `rounding beyond limit (unit = ${smallestUnit}, rounding mode = floor)` ++ ); ++ assert.throws( ++ RangeError, ++ () => max.round({ smallestUnit, roundingMode: "ceil" }), ++ `rounding beyond limit (unit = ${smallestUnit}, rounding mode = ceil)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eaf7bd764a62c75932de6a772694e03d3cd822d5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/options-wrong-type.js +@@ -0,0 +1,24 @@ ++// 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.round ++description: TypeError thrown when options argument is missing or a non-string primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ undefined, ++ null, ++ true, ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++assert.throws(TypeError, () => instance.round(), "TypeError on missing options argument"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.round(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/rounding-direction.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/rounding-direction.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5e0e1eaeca41e346444f9473fa2652e92fed4d0e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/rounding-direction.js +@@ -0,0 +1,31 @@ ++// 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.round ++description: Rounding down is towards the Big Bang, not the epoch or 1 BCE ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(-99, 12, 15, 12, 0, 0, 500); ++TemporalHelpers.assertPlainDateTime( ++ instance.round({ smallestUnit: "second", roundingMode: "floor" }), ++ -99, 12, "M12", 15, 12, 0, 0, 0, 0, 0, ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode floor)" ++); ++TemporalHelpers.assertPlainDateTime( ++ instance.round({ smallestUnit: "second", roundingMode: "trunc" }), ++ -99, 12, "M12", 15, 12, 0, 0, 0, 0, 0, ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode trunc)" ++); ++TemporalHelpers.assertPlainDateTime( ++ instance.round({ smallestUnit: "second", roundingMode: "ceil" }), ++ -99, 12, "M12", 15, 12, 0, 1, 0, 0, 0, ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode ceil)" ++); ++TemporalHelpers.assertPlainDateTime( ++ instance.round({ smallestUnit: "second", roundingMode: "halfExpand" }), ++ -99, 12, "M12", 15, 12, 0, 1, 0, 0, 0, ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode halfExpand)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-divides.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-divides.js +new file mode 100644 +index 0000000000000000000000000000000000000000..304046e331de12da66ed4d3dbe7b43a77e739764 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-divides.js +@@ -0,0 +1,53 @@ ++// 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.round ++description: Rounding increment should properly divide the relevant time unit ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++[1, 2, 3, 4, 6, 8, 12].forEach((roundingIncrement) => { ++ assert.sameValue( ++ dt.round({ smallestUnit: "hour", roundingIncrement }) instanceof Temporal.PlainDateTime, ++ true, ++ `valid hour increments divide into 24 (rounding increment = ${roundingIncrement})`); ++}); ++ ++["minute", "second"].forEach((smallestUnit) => { ++ [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30].forEach((roundingIncrement) => { ++ assert.sameValue( ++ dt.round({ smallestUnit, roundingIncrement }) instanceof Temporal.PlainDateTime, ++ true, ++ `valid ${smallestUnit} increments divide into 60 (rounding increment = ${roundingIncrement})` ++ ); ++ }); ++}); ++ ++["millisecond", "microsecond", "nanosecond"].forEach((smallestUnit) => { ++ [1, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500].forEach((roundingIncrement) => { ++ assert.sameValue( ++ dt.round({ smallestUnit, roundingIncrement }) instanceof Temporal.PlainDateTime, ++ true, ++ `valid ${smallestUnit} increments divide into 1000 (rounding increment = ${roundingIncrement})`); ++ }); ++}); ++ ++const nextIncrements = { ++ "hour": 24, ++ "minute": 60, ++ "second": 60, ++ "millisecond": 1000, ++ "microsecond": 1000, ++ "nanosecond": 1000 ++}; ++ ++Object.entries(nextIncrements).forEach(([unit, next]) => { ++ assert.throws( ++ RangeError, ++ () => dt.round({ smallestUnit: unit, roundingIncrement: next }), ++ `throws on increments that are equal to the next highest (unit = ${unit}, increment = ${next})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-does-not-divide.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-does-not-divide.js +new file mode 100644 +index 0000000000000000000000000000000000000000..82ab14b519cb68302a0a1118c3a50c797b0cba72 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-does-not-divide.js +@@ -0,0 +1,18 @@ ++// 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.round ++description: Throw exception if the rounding unit does not properly divide the relevant time unit ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++const units = ["day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond"]; ++units.forEach((unit) => { ++ assert.throws( ++ RangeError, ++ () => dt.round({ smallestUnit: unit, roundingIncrement: 29 }), ++ `throws on increments that do not divide evenly into the next highest (unit = ${unit})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-one-day.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-one-day.js +new file mode 100644 +index 0000000000000000000000000000000000000000..71470b4bb9cb558010676923cd23046d0716ca72 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingincrement-one-day.js +@@ -0,0 +1,17 @@ ++// 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.round ++description: One day is a valid rounding increment ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit: "day", roundingIncrement: 1 }), ++ 1976, 11, "M11", 19, 0, 0, 0, 0, 0, 0, ++ "1 day is a valid increment" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d434095df9aded6d3631fdb685bca7d2568f74ec +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-basic.js +@@ -0,0 +1,47 @@ ++// 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.round ++description: Basic checks for rounding mode ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit: "hour", roundingIncrement: 4 }), ++ 1976, 11, "M11", 18, 16, 0, 0, 0, 0, 0, ++ "rounds to an increment of hours" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit: "minute", roundingIncrement: 15 }), ++ 1976, 11, "M11", 18, 14, 30, 0, 0, 0, 0, ++ "rounds to an increment of minutes" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit: "second", roundingIncrement: 30 }), ++ 1976, 11, "M11", 18, 14, 23, 30, 0, 0, 0, ++ "rounds to an increment of seconds" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit: "millisecond", roundingIncrement: 10 }), ++ 1976, 11, "M11", 18, 14, 23, 30, 120, 0, 0, ++ "rounds to an increment of milliseconds" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit: "microsecond", roundingIncrement: 10 }), ++ 1976, 11, "M11", 18, 14, 23, 30, 123, 460, 0, ++ "rounds to an increment of microseconds" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit: "nanosecond", roundingIncrement: 10 }), ++ 1976, 11, "M11", 18, 14, 23, 30, 123, 456, 790, ++ "rounds to an increment of nanoseconds" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-ceil-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-ceil-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3e290c9317894961f8d54201badfa6045d00bd32 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-ceil-basic.js +@@ -0,0 +1,30 @@ ++// 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.round ++description: Basic checks for ceiling rounding mode ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++const incrementOneCeil = { ++ "day": [1976, 11, "M11", 19, 0, 0, 0, 0, 0, 0], ++ "hour": [1976, 11, "M11", 18, 15, 0, 0, 0, 0, 0], ++ "minute": [1976, 11, "M11", 18, 14, 24, 0, 0, 0, 0], ++ "second": [1976, 11, "M11", 18, 14, 23, 31, 0, 0, 0], ++ "millisecond": [1976, 11, "M11", 18, 14, 23, 30, 124, 0, 0], ++ "microsecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 457, 0], ++ "nanosecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 456, 789] ++}; ++ ++Object.entries(incrementOneCeil).forEach(([smallestUnit, expected]) => { ++ TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit, roundingMode: "ceil" }), ++ ...expected, ++ `rounds up to ${smallestUnit} (ceil)`, ++ undefined ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-floor-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-floor-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8379b6100f8c2a525eaec454572b7fe0c4de947e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-floor-basic.js +@@ -0,0 +1,29 @@ ++// 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.round ++description: Basic checks for the floor rounding mode ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++const incrementOneFloor = { ++ "day": [1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0], ++ "hour": [1976, 11, "M11", 18, 14, 0, 0, 0, 0, 0], ++ "minute": [1976, 11, "M11", 18, 14, 23, 0, 0, 0, 0], ++ "second": [1976, 11, "M11", 18, 14, 23, 30, 0, 0, 0], ++ "millisecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 0, 0], ++ "microsecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 456, 0], ++ "nanosecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 456, 789] ++}; ++ ++Object.entries(incrementOneFloor).forEach(([smallestUnit, expected]) => { ++ TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit, roundingMode: "floor" }), ++ ...expected, ++ `rounds down to ${smallestUnit} (floor)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5cb4275c3aafb2a4e499a34517b0b31a430ffd16 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-basic.js +@@ -0,0 +1,30 @@ ++// 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.round ++description: Basic checks for half-expand rounding mode ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++const incrementOneNearest = { ++ "day": [1976, 11, "M11", 19, 0, 0, 0, 0, 0, 0], ++ "hour": [1976, 11, "M11", 18, 14, 0, 0, 0, 0, 0], ++ "minute": [1976, 11, "M11", 18, 14, 24, 0, 0, 0, 0], ++ "second": [1976, 11, "M11", 18, 14, 23, 30, 0, 0, 0], ++ "millisecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 0, 0], ++ "microsecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 457, 0], ++ "nanosecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 456, 789] ++}; ++ ++Object.entries(incrementOneNearest).forEach(([smallestUnit, expected]) => { ++ TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit, roundingMode: "halfExpand" }), ++ ...expected, ++ `rounds to nearest ${smallestUnit} (half-expand)`, ++ undefined ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-is-default.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-is-default.js +new file mode 100644 +index 0000000000000000000000000000000000000000..47274d17459a18dbd7e59bc80db943d6392a4087 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-halfexpand-is-default.js +@@ -0,0 +1,31 @@ ++// 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.round ++description: Half-expand is the default rounding mode ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++const units = { ++ "day": [1976, 11, "M11", 19, 0, 0, 0, 0, 0, 0], ++ "hour": [1976, 11, "M11", 18, 14, 0, 0, 0, 0, 0], ++ "minute": [1976, 11, "M11", 18, 14, 24, 0, 0, 0, 0], ++ "second": [1976, 11, "M11", 18, 14, 23, 30, 0, 0, 0], ++ "millisecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 0, 0], ++ "microsecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 457, 0], ++ "nanosecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 456, 789] ++}; ++ ++const expected = [1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0]; ++ ++Object.entries(units).forEach(([unit, expected]) => { ++ TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit: unit }), ++ ...expected, ++ `halfExpand is the default (smallest unit = ${unit}, rounding mode absent)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-invalid-string.js +index 00a3140c539b328d6511b3bc1ac844370be0d05a..1a231aad4c7ec686cc5393d31d779b0de0d001d9 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-invalid-string.js +@@ -8,4 +8,6 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 123, 987, 500); +-assert.throws(RangeError, () => datetime.round({ smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => datetime.round({ smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-trunc-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-trunc-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c8f0a2784884e890d5c971dc9b6a182bfe042e8e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundingmode-trunc-basic.js +@@ -0,0 +1,29 @@ ++// 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.round ++description: Basic checks for truncation rounding mode ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++const incrementOneFloor = { ++ "day": [1976, 11, "M11", 18, 0, 0, 0, 0, 0, 0], ++ "hour": [1976, 11, "M11", 18, 14, 0, 0, 0, 0, 0], ++ "minute": [1976, 11, "M11", 18, 14, 23, 0, 0, 0, 0], ++ "second": [1976, 11, "M11", 18, 14, 23, 30, 0, 0, 0], ++ "millisecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 0, 0], ++ "microsecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 456, 0], ++ "nanosecond": [1976, 11, "M11", 18, 14, 23, 30, 123, 456, 789] ++}; ++ ++Object.entries(incrementOneFloor).forEach(([smallestUnit, expected]) => { ++ TemporalHelpers.assertPlainDateTime( ++ dt.round({ smallestUnit, roundingMode: "trunc" }), ++ ...expected, ++ `truncates to ${smallestUnit}` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundto-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundto-invalid-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..184d11731cc36d98410dc68623c2d2ffaedf5880 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/roundto-invalid-string.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. ++ ++/*--- ++esid: sec-temporal.plaindatetime.prototype.round ++description: RangeError thrown when smallestUnit option not one of the allowed string values ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 123, 987, 500); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => datetime.round(smallestUnit), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-disallowed-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-disallowed-units.js +deleted file mode 100644 +index cd85d00ae1917339ed5c24b3c1e6e6677e7ee770..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-disallowed-units.js ++++ /dev/null +@@ -1,32 +0,0 @@ +-// Copyright (C) 2021 Igalia, S.L. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +- +-/*--- +-esid: sec-temporal.plaindatetime.prototype.round +-description: Specifically disallowed units for the smallestUnit option +-features: [Temporal, arrow-function] +----*/ +- +-const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 789, 999, 999); +-const invalidUnits = [ +- "era", +- "eras", +- "year", +- "month", +- "week", +- "years", +- "months", +- "weeks", +-]; +-invalidUnits.forEach((smallestUnit) => { +- assert.throws( +- RangeError, +- () => instance.round({ smallestUnit }), +- `{ smallestUnit: "${smallestUnit}" } should not be allowed as an argument to round` +- ); +- assert.throws( +- RangeError, +- () => instance.round(smallestUnit), +- `"${smallestUnit}" should not be allowed as an argument to round` +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-invalid-string.js +index e4d8f8503c14a854fbfda1ceb54c88b5259be30c..f37ebe513cce8ea9de95361e4965598e49615b6f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/smallestunit-invalid-string.js +@@ -8,4 +8,26 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 123, 987, 500); +-assert.throws(RangeError, () => datetime.round({ smallestUnit: "other string" })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => datetime.round({ smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object-insufficient-data.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object-insufficient-data.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7f57d1d220a75896a9bb3c07a95613b2f0de1968 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object-insufficient-data.js +@@ -0,0 +1,16 @@ ++// 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.round ++description: Throw if smallest unit is missing from argument ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++assert.throws( ++ RangeError, ++ () => dt.round({ roundingIncrement: 1, roundingMode: "ceil" }), ++ "throws without required smallestUnit parameter" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8ca7977a4e9d064ed64b356f3dd50caec2035428 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-argument-object.js +@@ -0,0 +1,16 @@ ++// 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.round ++description: Throw if argument is an empty plain object ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++assert.throws( ++ RangeError, ++ () => dt.round({}), ++ "throws on empty object" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-no-argument.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-no-argument.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d75fe284628dca3369202af83938467cac90e15e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-no-argument.js +@@ -0,0 +1,16 @@ ++// 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.round ++description: Throw if no arguments at all are given ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++assert.throws( ++ TypeError, ++ () => dt.round(), ++ "throws without any parameters" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7b49ded8ddc1e7db64c770e55c23bc1d7a9b5704 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/round/throws-undefined.js +@@ -0,0 +1,16 @@ ++// 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.round ++description: Throw if sole argument is undefined ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 14, 23, 30, 123, 456, 789); ++ ++assert.throws( ++ TypeError, ++ () => dt.round(undefined), ++ "throws without undefined as sole parameter" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5c0179d5a5d3bbbec51d88da2f4d1657d423a30e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.since ++description: A number is converted to a string, then to Temporal.PlainDateTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18); ++ ++let arg = 19761118; ++ ++const result = instance.since(arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19761118 is a valid ISO string for PlainDateTime"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDateTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4326ae653ca39dedf2de79141625d25610726bb9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-object.js +@@ -0,0 +1,17 @@ ++// 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.since ++description: Plain objects are accepted as an argument ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++TemporalHelpers.assertDuration( ++ dt.since({ year: 2019, month: 10, day: 29, hour: 10 }), ++ 0, 0, 0, -15684, -18, -36, -29, -876, -543, -211, ++ "casts argument (plain object)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..dd989748cced70e1c9257530fba107334fcb57e3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.since ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e12a26b7351a0c0c02e303e2c7dd067b333f16d9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.since ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..42f638759c2c3a240f16e5e962979e2d1d1cd742 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.since ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.since(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..26dd4d767b0d7d4f9b4bc1a7ffda45997530a040 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.since ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c8096d191dfd0ec9a2af833029334f118560ee7a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-string.js +@@ -0,0 +1,17 @@ ++// 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.since ++description: Date-like string arguments are acceptable ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++TemporalHelpers.assertDuration( ++ dt.since("2019-10-29T10:46:38.271986102"), ++ 0, 0, 0, -15684, -19, -23, -8, -148, -529, -313, ++ "casts argument (string)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..535326bbd6306a1b52611115e79a833925f2d263 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.since ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDateTime, "Temporal.PlainDateTime, object"], ++ [Temporal.PlainDateTime.prototype, "Temporal.PlainDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/different-calendars-throws.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/different-calendars-throws.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6312b4748c4bfdf6081965cc09c971287c49436c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/different-calendars-throws.js +@@ -0,0 +1,17 @@ ++// 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.since ++description: Fail if the argument is a PlainDateTime with a different calendar ++features: [Temporal] ++---*/ ++ ++const dt1 = new Temporal.PlainDateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0); ++const dt2 = new Temporal.PlainDateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0, {}); ++ ++assert.throws( ++ RangeError, ++ () => dt1.since(dt2), ++ "different calendars not allowed" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/largestunit-invalid-string.js +index 1e8f9c8054899604e59827feaf9d86f413e2cf6d..547667d70d3f84321a37b793b8046589c210eca4 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/largestunit-invalid-string.js +@@ -9,7 +9,20 @@ features: [Temporal] + + const earlier = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainDateTime(2001, 6, 3, 13, 35, 57, 987, 654, 321); +-const values = ["era", "eraYear", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..44a464e405640f1134419661381db6e2dba99cc5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/leap-second.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.since ++description: Leap second is a valid ISO string for PlainDateTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2016, 12, 31, 23, 59, 59); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainDateTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainDateTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/no-unnecessary-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/no-unnecessary-units.js +new file mode 100644 +index 0000000000000000000000000000000000000000..20e600dc9ee2285f3619e96c0d85a237a5de8b53 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/no-unnecessary-units.js +@@ -0,0 +1,30 @@ ++// 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.since ++description: Do not return Durations with unnecessary units ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const feb2 = new Temporal.PlainDateTime(2020, 2, 2, 0, 0); ++const feb28 = new Temporal.PlainDateTime(2021, 2, 28, 0, 0); ++ ++TemporalHelpers.assertDuration( ++ feb28.since(feb2), ++ 0, 0, 0, 392, 0, 0, 0, 0, 0, 0, ++ "does not include higher units than necessary (no largest unit)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb28.since(feb2, { largestUnit: "months" }), ++ 0, 12, 0, 26, 0, 0, 0, 0, 0, 0, ++ "does not include higher units than necessary (largest unit = months)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb28.since(feb2, { largestUnit: "years" }), ++ 1, 0, 0, 26, 0, 0, 0, 0, 0, 0, ++ "does not include higher units than necessary (largest unit = years)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-empty.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-empty.js +new file mode 100644 +index 0000000000000000000000000000000000000000..579d16a14a0b6172a528cd80ef1a49547f49efd5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-empty.js +@@ -0,0 +1,24 @@ ++// 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.since ++description: Empty objects are acceptable ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const feb20 = new Temporal.PlainDateTime(2020, 2, 1, 0, 0); ++const feb21 = new Temporal.PlainDateTime(2021, 2, 1, 0, 0); ++ ++TemporalHelpers.assertDuration( ++ feb21.since(feb20, {}), ++ 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, ++ "empty plain object options" ++); ++ ++TemporalHelpers.assertDuration( ++ feb21.since(feb20, () => {}), ++ 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, ++ "empty function object options" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6ba94819ce1b704d43b5ddbc2b95952ab69303ef +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-invalid.js +@@ -0,0 +1,20 @@ ++// 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.since ++description: A variety of bad options (type error thrown) ++features: [Temporal, Symbol] ++---*/ ++ ++const feb20 = new Temporal.PlainDateTime(2020, 2, 1, 0, 0); ++const feb21 = new Temporal.PlainDateTime(2021, 2, 1, 0, 0); ++ ++const badOptions = [null, 1, 'hello', true, Symbol('foo'), 1n]; ++badOptions.forEach((bad) => { ++ assert.throws( ++ TypeError, ++ () => feb21.since(feb20, bad), ++ `bad options (${typeof bad})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ef026cc97c3a3e70dc8b5e7eb85ce2e9372c8b96 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.since ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.since(new Temporal.PlainDateTime(1976, 11, 18), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/returns-days.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/returns-days.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c7e77d98516382219895b2555ddd21496542d02e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/returns-days.js +@@ -0,0 +1,44 @@ ++// 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.since ++description: Days are the default level of specificity ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const feb_1_2020 = new Temporal.PlainDateTime(2020, 2, 1, 0, 0); ++const feb_1_2021 = new Temporal.PlainDateTime(2021, 2, 1, 0, 0); ++ ++TemporalHelpers.assertDuration( ++ feb_1_2021.since(feb_1_2020), ++ 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, ++ "defaults to returning days (no options)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb_1_2021.since(feb_1_2020, { largestUnit: "auto" }), ++ 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, ++ "defaults to returning days (largest unit = auto)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb_1_2021.since(feb_1_2020, { largestUnit: "days" }), ++ 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, ++ "defaults to returning days (largest unit = days)" ++); ++ ++const dt = new Temporal.PlainDateTime(2020, 2, 1, 0, 0, 0, 0, 0, 1); ++ ++TemporalHelpers.assertDuration( ++ dt.since(feb_1_2020), ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, ++ "defaults to returning days (nanosecond)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb_1_2021.since(dt), ++ 0, 0, 0, 365, 23, 59, 59, 999, 999, 999, ++ "defaults to returning days (nanosecond)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/round-relative-to-receiver.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/round-relative-to-receiver.js +new file mode 100644 +index 0000000000000000000000000000000000000000..982d732e8110c2121205e22b62bcb2456e5854a1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/round-relative-to-receiver.js +@@ -0,0 +1,24 @@ ++// 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.since ++description: Values are rounded relative to the receiver ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt1 = new Temporal.PlainDateTime(2019, 1, 1); ++const dt2 = new Temporal.PlainDateTime(2020, 7, 2); ++ ++TemporalHelpers.assertDuration( ++ dt2.since(dt1, { smallestUnit: "years", roundingMode: "halfExpand" }), ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "rounds relative to the receiver (positive case)" ++); ++ ++TemporalHelpers.assertDuration( ++ dt1.since(dt2, { smallestUnit: "years", roundingMode: "halfExpand" }), ++ -2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "rounds relative to the receiver (negative case)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0b18fac0d3998c234dbc091c908ac17a6c7b2126 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-basic.js +@@ -0,0 +1,48 @@ ++// 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.since ++description: Round to different smallest increments ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingIncrement: 3, roundingMode: "halfExpand" }), ++ 0, 0, 0, 973, 3, 0, 0, 0, 0, 0, ++ "rounds to an increment of hours" ++); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 30, roundingMode: "halfExpand" }), ++ 0, 0, 0, 973, 4, 30, 0, 0, 0,0, ++ "rounds to an increment of minutes" ++); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 15, roundingMode: "halfExpand" }), ++ 0, 0, 0, 973, 4, 17, 0, 0, 0, 0, ++ "rounds to an increment of seconds" ++); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 10, roundingMode: "halfExpand" }), ++ 0, 0, 0, 973, 4, 17, 4, 860, 0, 0, ++ "rounds to an increment of milliseconds" ++); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 10, roundingMode: "halfExpand" }), ++ 0, 0, 0, 973, 4, 17, 4, 864, 200, 0, ++ "rounds to an increment of microseconds" ++); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 10, roundingMode: "halfExpand" }), ++ 0, 0, 0, 973, 4, 17, 4, 864, 197, 530, ++ "rounds to an increment of nanoseconds" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-cleanly-divides.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-cleanly-divides.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0d331d2966e955094688ec49f949e2100709f896 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-cleanly-divides.js +@@ -0,0 +1,39 @@ ++// 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.since ++description: Rounding argument cleanly divides the relevant smallest unit ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++[1, 2, 3, 4, 6, 8, 12].forEach((roundingIncrement) => { ++ const options = { smallestUnit: "hours", roundingIncrement }; ++ assert( ++ later.since(earlier, options) instanceof Temporal.Duration, ++ `valid hour increments divide into 24 (rounding increment = ${roundingIncrement}, smallest unit = hours)` ++ ); ++}); ++ ++["minutes", "seconds"].forEach((smallestUnit) => { ++ [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30].forEach((roundingIncrement) => { ++ const options = { smallestUnit, roundingIncrement }; ++ assert( ++ later.since(earlier, options) instanceof Temporal.Duration, ++ `valid ${smallestUnit} increments divide into 60 (rounding increment = ${roundingIncrement})` ++ ); ++ }); ++}); ++ ++["milliseconds", "microseconds", "nanoseconds"].forEach((smallestUnit) => { ++ [1, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500].forEach((roundingIncrement) => { ++ const options = { smallestUnit, roundingIncrement }; ++ assert( ++ later.since(earlier, options) instanceof Temporal.Duration, ++ `valid ${smallestUnit} increments divide into 1000 (rounding increment = ${roundingIncrement})` ++ ); ++ }); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-does-not-divide.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-does-not-divide.js +new file mode 100644 +index 0000000000000000000000000000000000000000..15f1727aeeae4fee484db156e5510dff57a4d36e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingincrement-does-not-divide.js +@@ -0,0 +1,45 @@ ++// 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.since ++description: Throw if rounding increment does not cleanly divide the relevant unit ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++const badIncrements = { ++ "hours": 11, ++ "minutes": 29, ++ "seconds": 29, ++ "milliseconds": 29, ++ "microseconds": 29, ++ "nanoseconds": 29 ++}; ++ ++Object.entries(badIncrements).forEach(([unit, bad]) => { ++ assert.throws( ++ RangeError, ++ () => later.since(earlier, { smallestUnit: unit, roundingIncrement: bad }), ++ `throws on increments that do not divide evenly into the next highest (unit = ${unit}, increment = ${bad})` ++ ); ++}); ++ ++const fullIncrements = { ++ "hours": 24, ++ "minutes": 60, ++ "seconds": 60, ++ "milliseconds": 1000, ++ "microseconds": 1000, ++ "nanoseconds": 1000 ++}; ++ ++Object.entries(fullIncrements).forEach(([unit, bad]) => { ++ assert.throws( ++ RangeError, ++ () => later.since(earlier, { smallestUnit: unit, roundingIncrement: bad }), ++ `throws on increments that are equal to the next highest (unit = ${unit}, rounding increment = ${bad}` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-ceil-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-ceil-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fd82fdbfdf8aaf478f7c3f0cfce32815dc6ea746 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-ceil-basic.js +@@ -0,0 +1,40 @@ ++// 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.since ++description: Ceiling rounding mode basic tests ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++const incrementOneCeil = [ ++ ["years", [3], [-2]], ++ ["months", [0, 32], [0, -31]], ++ ["weeks", [0, 0, 140], [0, 0, -139]], ++ ["days", [0, 0, 0, 974], [0, 0, 0, -973]], ++ ["hours", [0, 0, 0, 973, 5], [0, 0, 0, -973, -4]], ++ ["minutes", [0, 0, 0, 973, 4, 18], [0, 0, 0, -973, -4, -17]], ++ ["seconds", [0, 0, 0, 973, 4, 17, 5], [0, 0, 0, -973, -4, -17, -4]], ++ ["milliseconds", [0, 0, 0, 973, 4, 17, 4, 865], [0, 0, 0, -973, -4, -17, -4, -864]], ++ ["microseconds", [0, 0, 0, 973, 4, 17, 4, 864, 198], [0, 0, 0, -973, -4, -17, -4, -864, -197]], ++ ["nanoseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197, 532], [0, 0, 0, -973, -4, -17, -4, -864, -197, -532]] ++]; ++const roundingMode = "ceil"; ++incrementOneCeil.forEach(([smallestUnit, expectedPositive, expectedNegative]) => { ++ const [py, pm = 0, pw = 0, pd = 0, ph = 0, pmin = 0, ps = 0, pms = 0, pµs = 0, pns = 0] = expectedPositive; ++ const [ny, nm = 0, nw = 0, nd = 0, nh = 0, nmin = 0, ns = 0, nms = 0, nµs = 0, nns = 0] = expectedNegative; ++ TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit, roundingMode }), ++ py, pm, pw, pd, ph, pmin, ps, pms, pµs, pns, ++ `rounds up to ${smallestUnit} (roundingMode = ceil, positive case)` ++ ); ++ TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit, roundingMode }), ++ ny, nm, nw, nd, nh, nmin, ns, nms, nµs, nns, ++ `rounds up to ${smallestUnit} (rounding mode = ceil, negative case)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-floor-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-floor-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e075d51dbf7b6e9a40baa02826fd73f8637e7558 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-floor-basic.js +@@ -0,0 +1,42 @@ ++// 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.since ++description: Floor rounding mode basic tests ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++const incrementOneFloor = [ ++ ["years", [2], [-3]], ++ ["months", [0, 31], [0, -32]], ++ ["weeks", [0, 0, 139], [0, 0, -140]], ++ ["days", [0, 0, 0, 973], [0, 0, 0, -974]], ++ ["hours", [0, 0, 0, 973, 4], [0, 0, 0, -973, -5]], ++ ["minutes", [0, 0, 0, 973, 4, 17], [0, 0, 0, -973, -4, -18]], ++ ["seconds", [0, 0, 0, 973, 4, 17, 4], [0, 0, 0, -973, -4, -17, -5]], ++ ["milliseconds", [0, 0, 0, 973, 4, 17, 4, 864], [0, 0, 0, -973, -4, -17, -4, -865]], ++ ["microseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197], [0, 0, 0, -973, -4, -17, -4, -864, -198]], ++ ["nanoseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197, 532], [0, 0, 0, -973, -4, -17, -4, -864, -197, -532]] ++]; ++ ++const roundingMode = "floor"; ++ ++incrementOneFloor.forEach(([smallestUnit, expectedPositive, expectedNegative]) => { ++ const [py, pm = 0, pw = 0, pd = 0, ph = 0, pmin = 0, ps = 0, pms = 0, pµs = 0, pns = 0] = expectedPositive; ++ const [ny, nm = 0, nw = 0, nd = 0, nh = 0, nmin = 0, ns = 0, nms = 0, nµs = 0, nns = 0] = expectedNegative; ++ TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit, roundingMode }), ++ py, pm, pw, pd, ph, pmin, ps, pms, pµs, pns, ++ `rounds down to ${smallestUnit} (rounding mode = ${roundingMode}, positive case)` ++ ); ++ TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit, roundingMode }), ++ ny, nm, nw, nd, nh, nmin, ns, nms, nµs, nns, ++ `rounds down to ${smallestUnit} (rounding mode = ${roundingMode}, negative case)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..92d28c3734441d0dd8a8d49d209a3c1475a8add1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-basic.js +@@ -0,0 +1,52 @@ ++// 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.since ++description: Half-expand rounding mode basic tests ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++function ensureUnsignedZero(x) { ++ return Object.is(x, -0) ? 0 : x; ++} ++ ++const incrementOneNearest = [ ++ ["years", [3]], ++ ["months", [0, 32]], ++ ["weeks", [0, 0, 139]], ++ ["days", [0, 0, 0, 973]], ++ ["hours", [0, 0, 0, 973, 4]], ++ ["minutes", [0, 0, 0, 973, 4, 17]], ++ ["seconds", [0, 0, 0, 973, 4, 17, 5]], ++ ["milliseconds", [0, 0, 0, 973, 4, 17, 4, 864]], ++ ["microseconds", [0, 0, 0, 973, 4, 17, 4, 864, 198]], ++ ["nanoseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197, 532]] ++]; ++const roundingMode = "halfExpand"; ++incrementOneNearest.forEach(([smallestUnit, expected]) => { ++ const [y, m = 0, w = 0, d = 0, h = 0, min = 0, s = 0, ms = 0, µs = 0, ns = 0] = expected; ++ TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit, roundingMode }), ++ y, m, w, d, h, min, s, ms, µs, ns, ++ `rounds to nearest ${smallestUnit} (rounding mode = ${roundingMode}, positive case)` ++ ); ++ TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit, roundingMode }), ++ ensureUnsignedZero(-y), ++ ensureUnsignedZero(-m), ++ ensureUnsignedZero(-w), ++ ensureUnsignedZero(-d), ++ ensureUnsignedZero(-h), ++ ensureUnsignedZero(-min), ++ ensureUnsignedZero(-s), ++ ensureUnsignedZero(-ms), ++ ensureUnsignedZero(-µs), ++ ensureUnsignedZero(-ns), ++ `rounds to nearest ${smallestUnit} (rounding mode = ${roundingMode}, negative case)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-default-changes.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-default-changes.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eb7aca6ebdb97e003b3e3b8bc698ab030d4e3cb8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-halfexpand-default-changes.js +@@ -0,0 +1,30 @@ ++// 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.since ++description: A different default for largest unit will be used if smallest unit is larger than "days" ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "years", roundingMode: "halfExpand" }), ++ 3, 0, 0, 0, 0, 0, 0, 0, 0,0, ++ "assumes a different default for largestUnit if smallestUnit is larger than days (smallest unit = years)" ++); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "months", roundingMode: "halfExpand" }), ++ 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, ++ "assumes a different default for largestUnit if smallestUnit is larger than days (smallest unit = months)" ++); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "weeks", roundingMode: "halfExpand" }), ++ 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, ++ "assumes a different default for largestUnit if smallestUnit is larger than days (smallest unit = weeks)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-invalid-string.js +index 59b1314d56670c5e5f0bfb259902114a8a2e3f15..52f4b8fe3bf239f4238b45e46bc8da6c67973a19 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-invalid-string.js +@@ -9,4 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainDateTime(2000, 5, 3, 13, 35, 57, 123, 987, 500); +-assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4874694cc951d7d41cc29223411f440ec102a4e8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-basic.js +@@ -0,0 +1,54 @@ ++// 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.since ++description: Truncation rounding mode basic tests ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++function ensureUnsignedZero(x) { ++ return Object.is(x, -0) ? 0 : x; ++} ++ ++const incrementOneTrunc = [ ++ ["years", [2]], ++ ["months", [0, 31]], ++ ["weeks", [0, 0, 139]], ++ ["days", [0, 0, 0, 973]], ++ ["hours", [0, 0, 0, 973, 4]], ++ ["minutes", [0, 0, 0, 973, 4, 17]], ++ ["seconds", [0, 0, 0, 973, 4, 17, 4]], ++ ["milliseconds", [0, 0, 0, 973, 4, 17, 4, 864]], ++ ["microseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197]], ++ ["nanoseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197, 532]] ++]; ++ ++const roundingMode = "trunc"; ++ ++incrementOneTrunc.forEach(([smallestUnit, expected]) => { ++ const [y, m = 0, w = 0, d = 0, h = 0, min = 0, s = 0, ms = 0, µs = 0, ns = 0] = expected; ++ TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit, roundingMode }), ++ y, m, w, d, h, min, s, ms, µs, ns, ++ `truncates to ${smallestUnit} (rounding mode = ${roundingMode}, positive case)` ++ ); ++ TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit, roundingMode }), ++ ensureUnsignedZero(-y), ++ ensureUnsignedZero(-m), ++ ensureUnsignedZero(-w), ++ ensureUnsignedZero(-d), ++ ensureUnsignedZero(-h), ++ ensureUnsignedZero(-min), ++ ensureUnsignedZero(-s), ++ ensureUnsignedZero(-ms), ++ ensureUnsignedZero(-µs), ++ ensureUnsignedZero(-ns), ++ `truncates to ${smallestUnit} (rounding mode = ${roundingMode}, negative case)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-is-default.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-is-default.js +new file mode 100644 +index 0000000000000000000000000000000000000000..90804658226de2c369ced507ba18a0aba4279355 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-trunc-is-default.js +@@ -0,0 +1,24 @@ ++// 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.since ++description: Truncation (trunc) is the default rounding mode ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes" }), ++ 0, 0, 0, 973, 4, 17, 0, 0, 0, 0, ++ "trunc is the default (round up)" ++); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds" }), ++ 0, 0, 0, 973, 4, 17, 4, 0, 0, 0, ++ "trunc is the default (round down)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/smallestunit-invalid-string.js +index a031b3f0fffdc946eadd02141e45e71a54b6019e..6fc80aa6a06cbf7f4d96103eee89ab1992c5c40e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/smallestunit-invalid-string.js +@@ -9,7 +9,20 @@ features: [Temporal] + + const earlier = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainDateTime(2000, 5, 3, 13, 35, 57, 987, 654, 321); +-const values = ["era", "eraYear", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/subseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/subseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9572f9cb1f2dd5ee4eff10123b84b32a3f885a76 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/subseconds.js +@@ -0,0 +1,30 @@ ++// 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.since ++description: Returned granularity may be finer than seconds ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const feb20 = new Temporal.PlainDateTime(2020, 2, 1, 0, 0); ++const feb21 = new Temporal.PlainDateTime(2020, 2, 2, 0, 0, 0, 250, 250, 250); ++ ++TemporalHelpers.assertDuration( ++ feb21.since(feb20, { largestUnit: "milliseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 86400250, 250, 250, ++ "can return subseconds (milliseconds)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb21.since(feb20, { largestUnit: "microseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 86400250250, 250, ++ "can return subseconds (microseconds)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb21.since(feb20, { largestUnit: "nanoseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 86400250250250, ++ "can return subseconds (nanoseconds)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/weeks-months-mutually-exclusive.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/weeks-months-mutually-exclusive.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1191dadcfb62399b1cd03f292a5df9792102abb0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/weeks-months-mutually-exclusive.js +@@ -0,0 +1,24 @@ ++// 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.since ++description: Weeks and months are mutually exclusive ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const laterDateTime = dt.add({ days: 42, hours: 3 }); ++ ++TemporalHelpers.assertDuration( ++ laterDateTime.since(dt, { largestUnit: "weeks" }), ++ 0, 0, 6, 0, 3, 0, 0, 0, 0, 0, ++ "weeks and months are mutually exclusive (prefer weeks)" ++); ++ ++TemporalHelpers.assertDuration( ++ laterDateTime.since(dt, { largestUnit: "months" }), ++ 0, 1, 0, 12, 3, 0, 0, 0,0, 0, ++ "weeks and months are mutually exclusive (prefer months)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/year-zero.js +index e7b6146a57962d06804a89168ecbce2a9c6628ae..bc376c23533598cbce2e92c2a31497fd6bbfbc6f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/since/year-zero.js +@@ -8,14 +8,16 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ ++ "-000000-12-07", + "-000000-12-07T03:24:30", +- "-000000-12-07T03:24:30+01:00[UTC]" ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => { instance.since(arg); }, ++ () => instance.since(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/ambiguous-date.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/ambiguous-date.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f6fe8738aeca4367c28b30e6acc79ed56f1e882f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/ambiguous-date.js +@@ -0,0 +1,29 @@ ++// 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.subtract ++description: Ambiguous subtraction is handled according to the overflow option ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const mar31 = new Temporal.PlainDateTime(2020, 3, 31, 15, 0); ++ ++TemporalHelpers.assertPlainDateTime( ++ mar31.subtract({ months: 1 }), ++ 2020, 2, "M02", 29, 15, 0, 0, 0, 0, 0, ++ "constrain when ambiguous result (overflow options not supplied)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ mar31.subtract({ months: 1 }, { overflow: "constrain" }), ++ 2020, 2, "M02", 29, 15, 0, 0, 0, 0, 0, ++ "constrain when ambiguous result (overflow options supplied)" ++); ++ ++assert.throws( ++ RangeError, ++ () => mar31.subtract({ months: 1 }, { overflow: "reject" }), ++ "throw when ambiguous result with reject" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-duration.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-duration.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fb0d3d1f8e5bcb27155accdbd4b20b8137165686 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-duration.js +@@ -0,0 +1,18 @@ ++// 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.subtract ++description: Duration object arguments are handled ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++const subtractWithDuration = jan31.subtract(new Temporal.Duration(0, 1, 0, 0, 0, 1)); ++TemporalHelpers.assertPlainDateTime( ++ subtractWithDuration, ++ 2019, 12, "M12", 31, 14, 59, 0, 0, 0, 0, ++ "Duration argument" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-object-insufficient-data.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-object-insufficient-data.js +new file mode 100644 +index 0000000000000000000000000000000000000000..450d14cefef05fa1ddbd39aba4b152811dd0db57 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-object-insufficient-data.js +@@ -0,0 +1,35 @@ ++// 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.subtract ++description: At least one recognized property has to be present in argument ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++assert.throws( ++ TypeError, ++ () => jan31.subtract({}), ++ "empty object not acceptable" ++); ++ ++assert.throws( ++ TypeError, ++ () => jan31.subtract({ month: 12 }), // should be "months" ++ "misspelled property in argument throws if no other properties are present" ++); ++ ++assert.throws( ++ TypeError, ++ () => jan31.subtract({ nonsense: true }), ++ "unrecognized properties throw if no other recognized property is present" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.subtract({ nonsense: 1, days: 1 }), ++ 2020, 1, "M01", 30, 15, 0, 0, 0, 0, 0, ++ "unrecognized properties ignored provided at least one recognized property is present" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-plain-object-mixed-signs.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-plain-object-mixed-signs.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cabfd209396ac1e63370054280e5d3ab0d9313c7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/argument-plain-object-mixed-signs.js +@@ -0,0 +1,18 @@ ++// 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.subtract ++description: Positive and negative values in the temporalDurationLike argument are not acceptable ++features: [Temporal] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++["constrain", "reject"].forEach((overflow) => { ++ assert.throws( ++ RangeError, ++ () => jan31.subtract({ hours: 1, minutes: -30 }, { overflow }), ++ `mixed positive and negative values always throw (overflow = "${overflow}")` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/hour-overflow.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/hour-overflow.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bda7309920c18bf0bfb946414b40f1bb6cee0e66 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/hour-overflow.js +@@ -0,0 +1,30 @@ ++// 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.subtract ++description: Testing overflow hours (subtracting hours that push one to the next/previous day) ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++const later = new Temporal.PlainDateTime(2020, 5, 31, 23, 12, 38, 271, 986, 102); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.subtract({ hours: 12 }), ++ 2019, 10, "M10", 28, 22, 46, 38, 271, 986, 102, ++ "subtract result" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.add({ hours: -12 }), ++ 2019, 10, "M10", 28, 22, 46, 38, 271, 986, 102, ++ "hour overflow (pushes to previous day)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ later.subtract({ hours: -2 }), ++ 2020, 6, "M06", 1, 1, 12, 38, 271, 986, 102, ++ "subtracting a negative amount of hours is equivalent to adding hours" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/limits.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/limits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..038f97fe78dbc53be8467f352539b49d832f674b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/limits.js +@@ -0,0 +1,24 @@ ++// 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.subtract ++description: Checking limits of representable PlainDateTime ++features: [Temporal] ++---*/ ++ ++const min = new Temporal.PlainDateTime(-271821, 4, 19, 0, 0, 0, 0, 0, 1); ++const max = new Temporal.PlainDateTime(275760, 9, 13, 23, 59, 59, 999, 999, 999); ++ ++["reject", "constrain"].forEach((overflow) => { ++ assert.throws( ++ RangeError, ++ () => min.subtract({ nanoseconds: 1 }, { overflow }), ++ `subtracting 1 nanosecond beyond minimum limit (overflow = ${overflow})` ++ ); ++ assert.throws( ++ RangeError, ++ () => max.subtract({ nanoseconds: -1 }, { overflow }), ++ `subtracting -1 nanosecond beyond maximum limit (overflow = ${overflow})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/negative-duration.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/negative-duration.js +new file mode 100644 +index 0000000000000000000000000000000000000000..672d87d9fc49d818a64e93d718dea63d239f46f4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/negative-duration.js +@@ -0,0 +1,23 @@ ++// 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.subtract ++description: Negative durations can be supplied ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.subtract({ minutes: -30 }), ++ 2020, 1, "M01", 31, 15, 30, 0, 0, 0, 0, ++ "negative minutes" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.subtract({ seconds: -30 }), ++ 2020, 1, "M01", 31, 15, 0, 30, 0, 0, 0, ++ "negative seconds" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-empty.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-empty.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ca9fd5112a8b5f9f063710dcc64ea9f62a7950b6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-empty.js +@@ -0,0 +1,23 @@ ++// 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.subtract ++description: Verify that undefined options are handled correctly. ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.subtract({ months: 2 }, {}), ++ 2019, 11, "M11", 30, 15, 0, 0, 0, 0, 0, ++ "options may be empty object" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ jan31.subtract({ months: 2 }, () => {}), ++ 2019, 11, "M11", 30, 15, 0, 0, 0, 0, 0, ++ "options may be function object" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ad8b1244e59588e44c36f70699ba782c2ebe0116 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-invalid.js +@@ -0,0 +1,20 @@ ++// 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.subtract ++description: Various invalid (wrong type) values for options argument ++features: [Temporal, Symbol] ++---*/ ++ ++const jan31 = new Temporal.PlainDateTime(2020, 1, 31, 15, 0); ++ ++const badOptions = [null, 1, 'hello', true, Symbol('foo'), 1n]; ++ ++badOptions.forEach((bad) => { ++ assert.throws( ++ TypeError, ++ () => jan31.subtract({ years: 1 }, bad), ++ `invalid options (${typeof bad})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..38172d541d8bf8e4338b8c5d091607f77f598355 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.subtract ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.subtract({ months: 1 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/overflow-invalid-string.js +index 1e1f1761c81466751938fe49725ddbfe0b3d275e..c3e4b694f44e2b347b69840c03f71bfe6450f004 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/subtract/overflow-invalid-string.js +@@ -20,4 +20,11 @@ features: [Temporal] + + const date = new Temporal.PlainDateTime(2000, 5, 2, 12); + const duration = new Temporal.Duration(3, 3, 0, 3, 3); +-assert.throws(RangeError, () => date.subtract(duration, { overflow: "other string" })); ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => date.subtract(duration, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toJSON/year-format.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toJSON/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..261e9e6ec076ed0735cef863ffdeeffcd8f2b165 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toJSON/year-format.js +@@ -0,0 +1,47 @@ ++// 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.tojson ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++let instance = new Temporal.PlainDateTime(-100000, 12, 3, 4, 56, 7, 890); ++assert.sameValue(instance.toJSON(), "-100000-12-03T04:56:07.89", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(-10000, 4, 5, 6, 7, 8, 910); ++assert.sameValue(instance.toJSON(), "-010000-04-05T06:07:08.91", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(-9999, 6, 7, 8, 9, 10, 987); ++assert.sameValue(instance.toJSON(), "-009999-06-07T08:09:10.987", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(-1000, 8, 9, 10, 9, 8, 765); ++assert.sameValue(instance.toJSON(), "-001000-08-09T10:09:08.765", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(-999, 10, 9, 8, 7, 6, 543); ++assert.sameValue(instance.toJSON(), "-000999-10-09T08:07:06.543", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(-1, 8, 7, 6, 54, 32, 100); ++assert.sameValue(instance.toJSON(), "-000001-08-07T06:54:32.1", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(0, 6, 5, 4, 32, 10, 123); ++assert.sameValue(instance.toJSON(), "0000-06-05T04:32:10.123", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.PlainDateTime(1, 4, 3, 21, 0, 12, 345); ++assert.sameValue(instance.toJSON(), "0001-04-03T21:00:12.345", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.PlainDateTime(999, 2, 10, 12, 34, 56, 789); ++assert.sameValue(instance.toJSON(), "0999-02-10T12:34:56.789", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDateTime(1000, 1, 23, 4, 56, 7, 890); ++assert.sameValue(instance.toJSON(), "1000-01-23T04:56:07.89", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDateTime(9999, 4, 5, 6, 7, 8, 910); ++assert.sameValue(instance.toJSON(), "9999-04-05T06:07:08.91", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDateTime(10000, 6, 7, 8, 9, 10, 987); ++assert.sameValue(instance.toJSON(), "+010000-06-07T08:09:10.987", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(100000, 8, 9, 10, 9, 8, 765); ++assert.sameValue(instance.toJSON(), "+100000-08-09T10:09:08.765", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ee8746eb4b036d0b67cb0457f29745af3acad173 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.toplainmonthday ++description: > ++ Calendar.monthDayFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321, calendar); ++instance.toPlainMonthDay(); ++assert.sameValue(calendar.monthDayFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainTime/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainTime/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1ec62ba2d91905cf61fe0213dd8d04d8da73c2bc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainTime/basic.js +@@ -0,0 +1,12 @@ ++// 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.toplaintime ++description: Basic usage ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainDateTime = Temporal.PlainDateTime.from("2020-02-12T11:42:56.987654321+01:00[Europe/Amsterdam]"); ++TemporalHelpers.assertPlainTime(plainDateTime.toPlainTime(), 11, 42, 56, 987, 654, 321); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0a8deb44c9ef139e220e6737c68fb70c550ca158 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.toplainyearmonth ++description: > ++ Calendar.yearMonthFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321, calendar); ++instance.toPlainYearMonth(); ++assert.sameValue(calendar.yearMonthFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5e5b7596a46a79b17b92eb05c6bd5ea2402059b3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/basic.js +@@ -0,0 +1,13 @@ ++// 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.tostring ++description: Checking the string form of an explicitly constructed instance with all arguments ++features: [Temporal] ++---*/ ++ ++const calendar = Temporal.Calendar.from("iso8601"); ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar); ++ ++assert.sameValue(datetime.toString(), "1976-11-18T15:23:30.123456789", "check string value"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-always.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-always.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5ae257d8bd02f069e87ac42fd95ae737034df495 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-always.js +@@ -0,0 +1,16 @@ ++// 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.tostring ++description: Show ISO calendar if calendar name is "always" ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23); ++ ++assert.sameValue( ++ dt.toString({ calendarName: "always" }), ++ "1976-11-18T15:23:00[u-ca=iso8601]", ++ "shows ISO calendar if calendarName = always" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7440f549227ee296b2f4f9857a15da6d3b32174a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js +@@ -0,0 +1,35 @@ ++// 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.tostring ++description: Possibly display calendar when calendarName is "auto" ++features: [Temporal] ++---*/ ++ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23); ++const customCal = { ++ toString() { return "bogus"; } ++}; ++const fakeISO8601Cal = { ++ toString() { return "iso8601"; } ++}; ++const expected = "1976-11-18T15:23:00"; ++ ++assert.sameValue(dt.toString(), expected, "default is calendar = auto (zero arguments)"); ++assert.sameValue(dt.toString({ calendarName: "auto" }), expected, "shows only non-ISO calendar if calendarName = auto"); ++ ++assert.sameValue( ++ dt.withCalendar(fakeISO8601Cal).toString({ calendarName: "auto" }), ++ expected, ++ "Don't show ISO calendar even if calendarName = auto" ++); ++ ++const dt2 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 0, 0, 0, 0, customCal); ++ ++assert.sameValue( ++ dt2.toString({ calendarName: "auto" }), ++ "1976-11-18T15:23:00[u-ca=bogus]", ++ "Don't show calendar if calendarName = auto & PlainDateTime has non-ISO calendar" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-invalid-string.js +index 985ad225ac72031b3bd7d9df4d90a9f2d9a38371..e17d9d1e443efabfb699a0ea21e971e4b87400ac 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-invalid-string.js +@@ -15,4 +15,11 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); +-assert.throws(RangeError, () => datetime.toString({ calendarName: "other string" })); ++const invalidCals = ["other string", "ALWAYS", "sometimes", "auto\0"]; ++ ++invalidCals.forEach((cal) => { ++ assert.throws( ++ RangeError, ++ () => datetime.toString({ calendarName: cal }), ++ `invalid calendar (${cal})`); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-never.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-never.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a27cec98d23df650963a577bb7ff68d3691957bd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/calendarname-never.js +@@ -0,0 +1,26 @@ ++// 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.tostring ++description: Do not show calendar if calendar name option is "never" ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23); ++const cal = { ++ toString() { return "bogus"; } ++}; ++const expected = "1976-11-18T15:23:00"; ++ ++assert.sameValue( ++ dt.toString({ calendarName: "never" }), ++ expected, ++ "Do not show calendar if calendarName = never" ++); ++ ++assert.sameValue( ++ dt.withCalendar(cal).toString({ calendarName: "never" }), ++ expected, ++ "Do not show calendar when calendarName = never, even if non-ISO calendar is used" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2567d0427586d18b92b19fac2b00761b1cf27fe3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-auto.js +@@ -0,0 +1,23 @@ ++// 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.tostring ++description: auto value for fractionalSecondDigits option ++features: [Temporal] ++---*/ ++ ++const zeroSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23); ++const wholeSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30); ++const subSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 400); ++ ++const tests = [ ++ [zeroSeconds, "1976-11-18T15:23:00"], ++ [wholeSeconds, "1976-11-18T15:23:30"], ++ [subSeconds, "1976-11-18T15:23:30.1234"], ++]; ++ ++for (const [datetime, expected] of tests) { ++ assert.sameValue(datetime.toString(), expected, "default is to emit seconds and drop trailing zeroes"); ++ assert.sameValue(datetime.toString({ fractionalSecondDigits: "auto" }), expected, "auto is the default"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-invalid-string.js +index 150d868658a319715eaf64831f04d3b4e7aa5e4c..9fa496c2955e7148b5ec26051b23909014c89640 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-invalid-string.js +@@ -10,10 +10,13 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.plaindatetime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + + const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 650, 0); + +-assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: "other string" })); ++for (const fractionalSecondDigits of ["other string", "AUTO", "not-auto", "autos", "auto\0"]) { ++ assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits }), ++ `"${fractionalSecondDigits}" is not a valid value for fractionalSecondDigits`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-non-integer.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-non-integer.js +index 7de58c30b349e8cf911c6982af37362582d1a18c..281d78f1abd86406f1780e0ead9444119364862e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-non-integer.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-non-integer.js +@@ -10,7 +10,7 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.plaindatetime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..843ef74f78833bbdf7a2d088b931c85dab529b37 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-number.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. ++ ++/*--- ++esid: sec-temporal.plaindatetime.prototype.tostring ++description: Number for fractionalSecondDigits option ++features: [Temporal] ++---*/ ++ ++const zeroSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23); ++const wholeSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30); ++const subSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 400); ++ ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 0 }), "1976-11-18T15:23:30", ++ "truncates 4 decimal places to 0"); ++assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 2 }), "1976-11-18T15:23:00.00", ++ "pads zero seconds to 2 decimal places"); ++assert.sameValue(wholeSeconds.toString({ fractionalSecondDigits: 2 }), "1976-11-18T15:23:30.00", ++ "pads whole seconds to 2 decimal places"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 2 }), "1976-11-18T15:23:30.12", ++ "truncates 4 decimal places to 2"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 3 }), "1976-11-18T15:23:30.123", ++ "truncates 4 decimal places to 3"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 6 }), "1976-11-18T15:23:30.123400", ++ "pads 4 decimal places to 6"); ++assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 7 }), "1976-11-18T15:23:00.0000000", ++ "pads zero seconds to 7 decimal places"); ++assert.sameValue(wholeSeconds.toString({ fractionalSecondDigits: 7 }), "1976-11-18T15:23:30.0000000", ++ "pads whole seconds to 7 decimal places"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 7 }), "1976-11-18T15:23:30.1234000", ++ "pads 4 decimal places to 7"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 9 }), "1976-11-18T15:23:30.123400000", ++ "pads 4 decimal places to 9"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-out-of-range.js +index 948d707eb35ac67473ee15bebf165ef27f8fd055..2ccbafaeec02bdb7f5d2bc11a9d69f5b46375820 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-out-of-range.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-out-of-range.js +@@ -10,11 +10,17 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.plaindatetime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + + const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 650, 0); + +-assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: -1 })); +-assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: 10 })); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: -Infinity }), ++ "−∞ is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: -1 }), ++ "−1 is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: 10 }), ++ "10 is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: Infinity }), ++ "∞ is out of range for fractionalSecondDigits"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js +index 12a0f77b873b211e414ace70369737d0c63feb86..d5ebb9c7e68a960620d516726abeb167c992c0e7 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-undefined.js +@@ -8,17 +8,31 @@ info: | + sec-getoption step 3: + 3. If _value_ is *undefined*, return _fallback_. + sec-getstringornumberoption step 2: +- 2. Let _value_ be ? GetOption(_options_, _property_, *"stringOrNumber"*, *undefined*, _fallback_). ++ 2. Let _value_ be ? GetOption(_options_, _property_, « Number, String », *undefined*, _fallback_). + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.plaindatetime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + +-const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 650, 0); ++const zeroSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23); ++const wholeSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30); ++const subSeconds = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 400); + +-const explicit = datetime.toString({ fractionalSecondDigits: undefined }); +-assert.sameValue(explicit, "2000-05-02T12:34:56.98765", "default fractionalSecondDigits is auto"); ++const tests = [ ++ [zeroSeconds, "1976-11-18T15:23:00"], ++ [wholeSeconds, "1976-11-18T15:23:30"], ++ [subSeconds, "1976-11-18T15:23:30.1234"], ++]; + +-// See options-undefined.js for {} ++for (const [datetime, expected] of tests) { ++ const explicit = datetime.toString({ fractionalSecondDigits: undefined }); ++ assert.sameValue(explicit, expected, "default fractionalSecondDigits is auto (property present but undefined)"); ++ ++ const implicit = datetime.toString({}); ++ assert.sameValue(implicit, expected, "default fractionalSecondDigits is auto (property not present)"); ++ ++ const lambda = datetime.toString(() => {}); ++ assert.sameValue(lambda, expected, "default fractionalSecondDigits is auto (property not present, function object)"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-wrong-type.js +index 9177b82196a93294ac60ef0d200fe91ea46a3661..5ecaf7a6d1f940611fc1abe8edb65bded55b0376 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/fractionalseconddigits-wrong-type.js +@@ -22,4 +22,26 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 650, 0); +-TemporalHelpers.checkFractionalSecondDigitsOptionWrongType(datetime); ++ ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: null }), ++ "null is not a number and converts to the string 'null' which is not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: true }), ++ "true is not a number and converts to the string 'true' which is not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: false }), ++ "false is not a number and converts to the string 'false' which is not valid for fractionalSecondDigits"); ++assert.throws(TypeError, () => datetime.toString({ fractionalSecondDigits: Symbol() }), ++ "symbols are not numbers and cannot convert to strings"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: 2n }), ++ "bigints are not numbers and convert to strings which are not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: {} }), ++ "plain objects are not numbers and convert to strings which are not valid for fractionalSecondDigits"); ++ ++const expected = [ ++ "get fractionalSecondDigits.toString", ++ "call fractionalSecondDigits.toString", ++]; ++const actual = []; ++const observer = TemporalHelpers.toPrimitiveObserver(actual, "auto", "fractionalSecondDigits"); ++const result = datetime.toString({ fractionalSecondDigits: observer }); ++assert.sameValue(result, "2000-05-02T12:34:56.98765", "object with toString uses toString return value"); ++assert.compareArray(actual, expected, "object with toString calls toString and not valueOf"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b535b7e07c9a82eb70db249b4b2ea10e478d7ef4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.tostring ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.toString(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-cross-midnight.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-cross-midnight.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fe29b3b9c510e5ee8962dd9c5d269a72b5e7ab63 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-cross-midnight.js +@@ -0,0 +1,13 @@ ++// 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.tostring ++description: Rounding can cross midnight ++features: [Temporal] ++---*/ ++ ++const plainDateTime = new Temporal.PlainDateTime(1999, 12, 31, 23, 59, 59, 999, 999, 999); // one nanosecond before 2000-01-01T00:00:00 ++for (const roundingMode of ["ceil", "halfExpand"]) { ++ assert.sameValue(plainDateTime.toString({ fractionalSecondDigits: 8, roundingMode }), "2000-01-01T00:00:00.00000000"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-direction.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-direction.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a4d7dec32d74f7cb0261cb48754d7521de5eba44 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/rounding-direction.js +@@ -0,0 +1,30 @@ ++// 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.tostring ++description: Rounding down is towards the Big Bang, not the epoch or 1 BCE ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(-99, 12, 15, 12, 0, 0, 500); ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "floor" }), ++ "-000099-12-15T12:00:00", ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE" ++); ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "trunc" }), ++ "-000099-12-15T12:00:00", ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode trunc)" ++); ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "ceil" }), ++ "-000099-12-15T12:00:01", ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode ceil)" ++); ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "halfExpand" }), ++ "-000099-12-15T12:00:01", ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode halfExpand)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-ceil.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-ceil.js +new file mode 100644 +index 0000000000000000000000000000000000000000..762b3a5cd3319ae27fbbbd87f93dab088c910b0c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-ceil.js +@@ -0,0 +1,37 @@ ++// 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.tostring ++description: ceil value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 123, 987, 500); ++ ++const result1 = datetime.toString({ smallestUnit: "microsecond", roundingMode: "ceil" }); ++assert.sameValue(result1, "2000-05-02T12:34:56.123988", ++ "roundingMode is ceil (with 6 digits from smallestUnit)"); ++ ++const result2 = datetime.toString({ fractionalSecondDigits: 6, roundingMode: "ceil" }); ++assert.sameValue(result2, "2000-05-02T12:34:56.123988", ++ "roundingMode is ceil (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = datetime.toString({ smallestUnit: "millisecond", roundingMode: "ceil" }); ++assert.sameValue(result3, "2000-05-02T12:34:56.124", ++ "roundingMode is ceil (with 3 digits from smallestUnit)"); ++ ++const result4 = datetime.toString({ fractionalSecondDigits: 3, roundingMode: "ceil" }); ++assert.sameValue(result4, "2000-05-02T12:34:56.124", ++ "roundingMode is ceil (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = datetime.toString({ smallestUnit: "second", roundingMode: "ceil" }); ++assert.sameValue(result5, "2000-05-02T12:34:57", ++ "roundingMode is ceil (with 0 digits from smallestUnit)"); ++ ++const result6 = datetime.toString({ fractionalSecondDigits: 0, roundingMode: "ceil" }); ++assert.sameValue(result6, "2000-05-02T12:34:57", ++ "roundingMode is ceil (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = datetime.toString({ smallestUnit: "minute", roundingMode: "ceil" }); ++assert.sameValue(result7, "2000-05-02T12:35", "roundingMode is ceil (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-floor.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-floor.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4899d4cfa26b5a3cef984a17cb6a3cc52bdd7d84 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-floor.js +@@ -0,0 +1,37 @@ ++// 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.tostring ++description: floor value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 123, 987, 500); ++ ++const result1 = datetime.toString({ smallestUnit: "microsecond", roundingMode: "floor" }); ++assert.sameValue(result1, "2000-05-02T12:34:56.123987", ++ "roundingMode is floor (with 6 digits from smallestUnit)"); ++ ++const result2 = datetime.toString({ fractionalSecondDigits: 6, roundingMode: "floor" }); ++assert.sameValue(result2, "2000-05-02T12:34:56.123987", ++ "roundingMode is floor (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = datetime.toString({ smallestUnit: "millisecond", roundingMode: "floor" }); ++assert.sameValue(result3, "2000-05-02T12:34:56.123", ++ "roundingMode is floor (with 3 digits from smallestUnit)"); ++ ++const result4 = datetime.toString({ fractionalSecondDigits: 3, roundingMode: "floor" }); ++assert.sameValue(result4, "2000-05-02T12:34:56.123", ++ "roundingMode is floor (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = datetime.toString({ smallestUnit: "second", roundingMode: "floor" }); ++assert.sameValue(result5, "2000-05-02T12:34:56", ++ "roundingMode is floor (with 0 digits from smallestUnit)"); ++ ++const result6 = datetime.toString({ fractionalSecondDigits: 0, roundingMode: "floor" }); ++assert.sameValue(result6, "2000-05-02T12:34:56", ++ "roundingMode is floor (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = datetime.toString({ smallestUnit: "minute", roundingMode: "floor" }); ++assert.sameValue(result7, "2000-05-02T12:34", "roundingMode is floor (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-halfExpand.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-halfExpand.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9dcad461121f9330c5df775ae8c5ba8e1be9dd1a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-halfExpand.js +@@ -0,0 +1,37 @@ ++// 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.tostring ++description: halfExpand value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 123, 987, 500); ++ ++const result1 = datetime.toString({ smallestUnit: "microsecond", roundingMode: "halfExpand" }); ++assert.sameValue(result1, "2000-05-02T12:34:56.123988", ++ "roundingMode is halfExpand (with 6 digits from smallestUnit)"); ++ ++const result2 = datetime.toString({ fractionalSecondDigits: 6, roundingMode: "halfExpand" }); ++assert.sameValue(result2, "2000-05-02T12:34:56.123988", ++ "roundingMode is halfExpand (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = datetime.toString({ smallestUnit: "millisecond", roundingMode: "halfExpand" }); ++assert.sameValue(result3, "2000-05-02T12:34:56.124", ++ "roundingMode is halfExpand (with 3 digits from smallestUnit)"); ++ ++const result4 = datetime.toString({ fractionalSecondDigits: 3, roundingMode: "halfExpand" }); ++assert.sameValue(result4, "2000-05-02T12:34:56.124", ++ "roundingMode is halfExpand (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = datetime.toString({ smallestUnit: "second", roundingMode: "halfExpand" }); ++assert.sameValue(result5, "2000-05-02T12:34:56", ++ "roundingMode is halfExpand (with 0 digits from smallestUnit)"); ++ ++const result6 = datetime.toString({ fractionalSecondDigits: 0, roundingMode: "halfExpand" }); ++assert.sameValue(result6, "2000-05-02T12:34:56", ++ "roundingMode is halfExpand (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = datetime.toString({ smallestUnit: "minute", roundingMode: "halfExpand" }); ++assert.sameValue(result7, "2000-05-02T12:35", "roundingMode is halfExpand (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-invalid-string.js +index 3a3c9af8e8fdf3242fd7d4d525322bbc03b0d14c..bc2e1e2c4a8e63eb0e4070fe97265e257ab9efaf 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-invalid-string.js +@@ -8,4 +8,6 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 123, 987, 500); +-assert.throws(RangeError, () => datetime.toString({ smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => datetime.toString({ smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-trunc.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-trunc.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fa3e86319fc53655d53cf76eff87f0ff4db84b3c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/roundingmode-trunc.js +@@ -0,0 +1,37 @@ ++// 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.tostring ++description: trunc value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 123, 987, 500); ++ ++const result1 = datetime.toString({ smallestUnit: "microsecond", roundingMode: "trunc" }); ++assert.sameValue(result1, "2000-05-02T12:34:56.123987", ++ "roundingMode is trunc (with 6 digits from smallestUnit)"); ++ ++const result2 = datetime.toString({ fractionalSecondDigits: 6, roundingMode: "trunc" }); ++assert.sameValue(result2, "2000-05-02T12:34:56.123987", ++ "roundingMode is trunc (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = datetime.toString({ smallestUnit: "millisecond", roundingMode: "trunc" }); ++assert.sameValue(result3, "2000-05-02T12:34:56.123", ++ "roundingMode is trunc (with 3 digits from smallestUnit)"); ++ ++const result4 = datetime.toString({ fractionalSecondDigits: 3, roundingMode: "trunc" }); ++assert.sameValue(result4, "2000-05-02T12:34:56.123", ++ "roundingMode is trunc (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = datetime.toString({ smallestUnit: "second", roundingMode: "trunc" }); ++assert.sameValue(result5, "2000-05-02T12:34:56", ++ "roundingMode is trunc (with 0 digits from smallestUnit)"); ++ ++const result6 = datetime.toString({ fractionalSecondDigits: 0, roundingMode: "trunc" }); ++assert.sameValue(result6, "2000-05-02T12:34:56", ++ "roundingMode is trunc (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = datetime.toString({ smallestUnit: "minute", roundingMode: "trunc" }); ++assert.sameValue(result7, "2000-05-02T12:34", "roundingMode is trunc (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-fractionalseconddigits.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-fractionalseconddigits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9918d045fc7fde860974d29c426ddca71f03b9ae +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-fractionalseconddigits.js +@@ -0,0 +1,30 @@ ++// 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.tostring ++description: fractionalSecondDigits option is not used with smallestUnit present ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 12, 34, 56, 789, 999, 999); ++const tests = [ ++ ["minute", "1976-11-18T12:34"], ++ ["second", "1976-11-18T12:34:56"], ++ ["millisecond", "1976-11-18T12:34:56.789"], ++ ["microsecond", "1976-11-18T12:34:56.789999"], ++ ["nanosecond", "1976-11-18T12:34:56.789999999"], ++]; ++ ++for (const [smallestUnit, expected] of tests) { ++ const string = datetime.toString({ ++ smallestUnit, ++ get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") } ++ }); ++ assert.sameValue(string, expected, `smallestUnit: "${smallestUnit}" overrides fractionalSecondDigits`); ++} ++ ++assert.throws(RangeError, () => datetime.toString({ ++ smallestUnit: "hour", ++ get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") } ++}), "hour is an invalid smallestUnit but still overrides fractionalSecondDigits"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-invalid-string.js +index 1d1a6aaeca2abf198108926a1cd36d3d02e0d2ad..10e19530c1a5c4deb37e0286caef0b678f3f0924 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-invalid-string.js +@@ -8,4 +8,30 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 123, 987, 500); +-assert.throws(RangeError, () => datetime.toString({ smallestUnit: "other string" })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "hour", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "hours", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => datetime.toString({ smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-valid-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-valid-units.js +index 34928a9c6d9e94986b6b8cb34421ab2d56b76129..6aff7a613b2ba4d282439777df904f363370b786 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-valid-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/smallestunit-valid-units.js +@@ -7,15 +7,41 @@ description: Valid units for the smallestUnit option + features: [Temporal] + ---*/ + +-const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 789, 999, 999); ++const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 123, 456, 789); + +-assert.sameValue(datetime.toString({ smallestUnit: "minute" }), "2000-05-02T12:34"); +-assert.sameValue(datetime.toString({ smallestUnit: "second" }), "2000-05-02T12:34:56"); +-assert.sameValue(datetime.toString({ smallestUnit: "millisecond" }), "2000-05-02T12:34:56.789"); +-assert.sameValue(datetime.toString({ smallestUnit: "microsecond" }), "2000-05-02T12:34:56.789999"); +-assert.sameValue(datetime.toString({ smallestUnit: "nanosecond" }), "2000-05-02T12:34:56.789999999"); ++function test(instance, expectations, description) { ++ for (const [smallestUnit, expectedResult] of expectations) { ++ assert.sameValue(instance.toString({ smallestUnit }), expectedResult, ++ `${description} with smallestUnit "${smallestUnit}"`); ++ } ++} ++ ++test( ++ datetime, ++ [ ++ ["minute", "2000-05-02T12:34"], ++ ["second", "2000-05-02T12:34:56"], ++ ["millisecond", "2000-05-02T12:34:56.123"], ++ ["microsecond", "2000-05-02T12:34:56.123456"], ++ ["nanosecond", "2000-05-02T12:34:56.123456789"], ++ ], ++ "subseconds toString" ++); ++ ++test( ++ new Temporal.PlainDateTime(2000, 5, 2, 12, 34), ++ [ ++ ["minute", "2000-05-02T12:34"], ++ ["second", "2000-05-02T12:34:00"], ++ ["millisecond", "2000-05-02T12:34:00.000"], ++ ["microsecond", "2000-05-02T12:34:00.000000"], ++ ["nanosecond", "2000-05-02T12:34:00.000000000"], ++ ], ++ "whole minutes toString" ++); + + const notValid = [ ++ "era", + "year", + "month", + "week", +@@ -24,5 +50,6 @@ const notValid = [ + ]; + + notValid.forEach((smallestUnit) => { +- assert.throws(RangeError, () => datetime.toString({ smallestUnit }), smallestUnit); ++ assert.throws(RangeError, () => datetime.toString({ smallestUnit }), ++ `"${smallestUnit}" is not a valid unit for the smallestUnit option`); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/year-format.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d94ed41240f2b9e32ed4dc9fb69b05983b93e60a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toString/year-format.js +@@ -0,0 +1,47 @@ ++// 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.tostring ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++let instance = new Temporal.PlainDateTime(-100000, 12, 3, 4, 56, 7, 890); ++assert.sameValue(instance.toString(), "-100000-12-03T04:56:07.89", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(-10000, 4, 5, 6, 7, 8, 910); ++assert.sameValue(instance.toString(), "-010000-04-05T06:07:08.91", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(-9999, 6, 7, 8, 9, 10, 987); ++assert.sameValue(instance.toString(), "-009999-06-07T08:09:10.987", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(-1000, 8, 9, 10, 9, 8, 765); ++assert.sameValue(instance.toString(), "-001000-08-09T10:09:08.765", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(-999, 10, 9, 8, 7, 6, 543); ++assert.sameValue(instance.toString(), "-000999-10-09T08:07:06.543", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(-1, 8, 7, 6, 54, 32, 100); ++assert.sameValue(instance.toString(), "-000001-08-07T06:54:32.1", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(0, 6, 5, 4, 32, 10, 123); ++assert.sameValue(instance.toString(), "0000-06-05T04:32:10.123", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.PlainDateTime(1, 4, 3, 21, 0, 12, 345); ++assert.sameValue(instance.toString(), "0001-04-03T21:00:12.345", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.PlainDateTime(999, 2, 10, 12, 34, 56, 789); ++assert.sameValue(instance.toString(), "0999-02-10T12:34:56.789", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDateTime(1000, 1, 23, 4, 56, 7, 890); ++assert.sameValue(instance.toString(), "1000-01-23T04:56:07.89", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDateTime(9999, 4, 5, 6, 7, 8, 910); ++assert.sameValue(instance.toString(), "9999-04-05T06:07:08.91", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainDateTime(10000, 6, 7, 8, 9, 10, 987); ++assert.sameValue(instance.toString(), "+010000-06-07T08:09:10.987", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.PlainDateTime(100000, 8, 9, 10, 9, 8, 765); ++assert.sameValue(instance.toString(), "+100000-08-09T10:09:08.765", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..78d23ba94233ff3c8ff23e2b75422db815635879 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/basic.js +@@ -0,0 +1,15 @@ ++// 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.tozoneddatetime ++description: Straightforward case of using UTC ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(2020, 1, 1, 0, 0); ++const zdt = dt.toZonedDateTime("UTC"); ++ ++assert.sameValue(zdt.epochNanoseconds, 1577836800000000000n, "nanoseconds"); ++assert.sameValue(zdt.calendar.toString(), "iso8601", "calendar"); ++assert.sameValue(zdt.timeZone.toString(), "UTC", "timezone"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation-invalid-string.js +index 65eab04c1543b6ce9fe1556a6cabaa7056221a0e..ab7127ce59ffaf084958b56232a3d6d6797bc9d7 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/disambiguation-invalid-string.js +@@ -16,4 +16,11 @@ features: [Temporal] + + const datetime = new Temporal.PlainDateTime(2001, 9, 9, 1, 46, 40, 987, 654, 321); + const timeZone = new Temporal.TimeZone("UTC"); +-assert.throws(RangeError, () => datetime.toZonedDateTime(timeZone, { disambiguation: "other string" })); ++const invalidStrings = ["obviously bad", "", "EARLIER", "earlıer", "late\u0131r", "reject\0"]; ++invalidStrings.forEach((s) => { ++ assert.throws( ++ RangeError, ++ () => datetime.toZonedDateTime(timeZone, { disambiguation: s }), ++ `invalid disambiguation string (${s})`); ++}); ++ +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/invalid-instant.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/invalid-instant.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d1ec3c3d73269d74499a036ec56cf0c86ccc8e01 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/invalid-instant.js +@@ -0,0 +1,23 @@ ++// 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.tozoneddatetime ++description: Convert to zoned datetime outside valid range ++features: [Temporal] ++---*/ ++ ++const max = new Temporal.PlainDateTime(275760, 9, 13, 23, 59, 59, 999, 999, 999); ++const min = new Temporal.PlainDateTime(-271821, 4, 19, 0, 0, 0, 0, 0, 1); ++ ++assert.throws( ++ RangeError, ++ () => max.toZonedDateTime("UTC"), ++ "outside of Instant range (too big)" ++); ++ ++assert.throws( ++ RangeError, ++ () => min.toZonedDateTime("UTC"), ++ "outside of Instant range (too small)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/multiple-instants.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/multiple-instants.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5863513091c08875e84fc951420cae4ac7066acb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/multiple-instants.js +@@ -0,0 +1,47 @@ ++// 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.tozoneddatetime ++description: Checking disambiguation options for daylight savings time changes ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const tz = TemporalHelpers.springForwardFallBackTimeZone(); ++ ++const dt1 = new Temporal.PlainDateTime(2000, 4, 2, 2); ++ ++const zdt1 = dt1.toZonedDateTime(tz); ++const zdt1_compatible = dt1.toZonedDateTime(tz, { disambiguation: "compatible" }); ++const zdt1_earlier = dt1.toZonedDateTime(tz, { disambiguation: "earlier" }); ++const zdt1_later = dt1.toZonedDateTime(tz, { disambiguation: "later" }); ++ ++assert.sameValue(zdt1.epochNanoseconds, 954669600000000000n, "Fall DST (no disambiguation)"); ++assert.sameValue(zdt1_compatible.epochNanoseconds, 954669600000000000n, "Fall DST (disambiguation = compatible)"); ++assert.sameValue(zdt1_earlier.epochNanoseconds, 954666000000000000n, "Fall DST (disambiguation = earlier)"); ++assert.sameValue(zdt1_later.epochNanoseconds, 954669600000000000n, "Fall DST (disambiguation = later)"); ++ ++assert.throws( ++ RangeError, ++ () => dt1.toZonedDateTime(tz, { disambiguation: "reject" }), ++ "Fall DST (disambiguation = reject)" ++); ++ ++const dt2 = new Temporal.PlainDateTime(2000, 10, 29, 1); ++ ++const zdt2 = dt2.toZonedDateTime(tz); ++const zdt2_compatible = dt2.toZonedDateTime(tz, { disambiguation: "compatible" }); ++const zdt2_earlier = dt2.toZonedDateTime(tz, { disambiguation: "earlier" }); ++const zdt2_later = dt2.toZonedDateTime(tz, { disambiguation: "later" }); ++ ++assert.sameValue(zdt2.epochNanoseconds, 972806400000000000n, "Spring DST (no disambiguation)"); ++assert.sameValue(zdt2_compatible.epochNanoseconds, 972806400000000000n, "Spring DST (disambiguation = compatible)"); ++assert.sameValue(zdt2_earlier.epochNanoseconds, 972806400000000000n, "Spring DST (disambiguation = earlier)"); ++assert.sameValue(zdt2_later.epochNanoseconds, 972810000000000000n, "Spring DST (disambiguation = later)"); ++ ++assert.throws( ++ RangeError, ++ () => dt2.toZonedDateTime(tz, { disambiguation: "reject" }), ++ "Spring DST (disambiguation = reject)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e7cd07013c39dfc1d06ddde518d43bda7cec0822 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-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.plaindate.prototype.tozoneddatetime ++description: Empty object may be used as options ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38, 271, 986, 102); ++ ++assert.sameValue( ++ dt.toZonedDateTime("UTC", {}).epochNanoseconds, ++ 1572345998271986102n, ++ "options may be an empty plain object" ++); ++ ++assert.sameValue( ++ dt.toZonedDateTime("UTC", () => {}).epochNanoseconds, ++ 1572345998271986102n, ++ "options may be a function object" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c2a63768399fcc37685967491cc031798723c823 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.tozoneddatetime ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.toZonedDateTime("UTC", value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9b02984eb90242fa36fde6b4ba61baadd5c0ec0c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.tozoneddatetime ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = instance.toZonedDateTime(timeZone); ++assert.sameValue(result1.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone"); ++const result2 = instance.toZonedDateTime({ timeZone }); ++assert.sameValue(result2.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.toZonedDateTime(timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..79caa639eb31ef382acaa32798c2f67b95fa5059 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.tozoneddatetime ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime(timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1fac66b7f9e431d9cfaf03f5b8727432c24c951d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.tozoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toZonedDateTime(timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toZonedDateTime(timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.toZonedDateTime({ timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.toZonedDateTime({ timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e6c05841d806089ef02d0f51adb1ce77c22a3bfd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.until ++description: A number is converted to a string, then to Temporal.PlainDateTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18); ++ ++let arg = 19761118; ++ ++const result = instance.until(arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19761118 is a valid ISO string for PlainDateTime"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDateTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..18f38a6ff0940114147363c8bf3efdc984949492 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-object.js +@@ -0,0 +1,17 @@ ++// 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.until ++description: Plain objects are accepted as an argument ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++TemporalHelpers.assertDuration( ++ dt.until({ year: 2019, month: 10, day: 29, hour: 10 }), ++ 0, 0, 0, 15684, 18, 36, 29, 876, 543, 211, ++ "casts argument (plain object)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b49bd1593dcb60b6adbc16825eeeece2bd0070ee +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.until ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8cf4915c7f68598722fdd2ea16a4dd3c786daadb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.until ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..611f6724cc098b6dd02def9fbcdf207d326e2107 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.until ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.until(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..377398049721d07df17b2b77929eab24d5dece63 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.until ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..015b66fd9d89a7c7d22ba585277e6ce804742639 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-string.js +@@ -0,0 +1,17 @@ ++// 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.until ++description: Date-like strings are accepted ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++TemporalHelpers.assertDuration( ++ dt.until("2019-10-29T10:46:38.271986102"), ++ 0, 0, 0, 15684, 19, 23, 8, 148, 529, 313, ++ "casts argument (string)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..66c4439bf947b0c50139117a4628d7cfb5617c28 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.until ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDateTime, "Temporal.PlainDateTime, object"], ++ [Temporal.PlainDateTime.prototype, "Temporal.PlainDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/balance-negative-duration.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/balance-negative-duration.js +index 2de57f305e5aef2a7f5beb09265b225fa5de3741..81c7336090663082f575ca9042237641e35c303a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/balance-negative-duration.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/balance-negative-duration.js +@@ -25,10 +25,10 @@ features: [Temporal] + + const earlier1 = new Temporal.PlainDateTime(2000, 5, 2, 9); + const later1 = new Temporal.PlainDateTime(2000, 5, 5, 10); +-const result1 = later1.until(earlier1, { largestUnit: 'day' }); ++const result1 = later1.until(earlier1, { largestUnit: "day" }); + TemporalHelpers.assertDuration(result1, 0, 0, 0, -3, -1, 0, 0, 0, 0, 0, "date sign == time sign"); + + const earlier2 = new Temporal.PlainDateTime(2000, 5, 2, 10); + const later2 = new Temporal.PlainDateTime(2000, 5, 5, 9); +-const result2 = later2.until(earlier2, { largestUnit: 'day' }); ++const result2 = later2.until(earlier2, { largestUnit: "day" }); + TemporalHelpers.assertDuration(result2, 0, 0, 0, -2, -23, 0, 0, 0, 0, 0, "date sign != time sign"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/balance.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/balance.js +index 08687951c4e5d43404aed70b4ff87b32fa643de7..05eff7a63aaf947362566b57cf55ad9ad0744491 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/balance.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/balance.js +@@ -8,18 +8,18 @@ includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const a = Temporal.PlainDateTime.from('2017-10-05T08:07:14+00:00[UTC]'); +-const b = Temporal.PlainDateTime.from('2021-03-05T03:32:45+00:00[UTC]'); +-const c = Temporal.PlainDateTime.from('2021-03-05T09:32:45+00:00[UTC]'); ++const a = Temporal.PlainDateTime.from("2017-10-05T08:07:14+00:00[UTC]"); ++const b = Temporal.PlainDateTime.from("2021-03-05T03:32:45+00:00[UTC]"); ++const c = Temporal.PlainDateTime.from("2021-03-05T09:32:45+00:00[UTC]"); + +-const r1 = a.until(b, { largestUnit: 'months' }); ++const r1 = a.until(b, { largestUnit: "months" }); + TemporalHelpers.assertDuration(r1, 0, 40, 0, 27, 19, 25, 31, 0, 0, 0, "r1"); + assert.sameValue(a.add(r1).toString(), b.toString(), "a.add(r1)"); + +-const r2 = b.until(a, { largestUnit: 'months' }); ++const r2 = b.until(a, { largestUnit: "months" }); + TemporalHelpers.assertDuration(r2, 0, -40, 0, -30, -19, -25, -31, 0, 0, 0, "r2"); + assert.sameValue(b.add(r2).toString(), a.toString(), "b.add(r2)"); + +-const r3 = c.until(a, { largestUnit: 'months' }); ++const r3 = c.until(a, { largestUnit: "months" }); + TemporalHelpers.assertDuration(r3, 0, -41, 0, 0, -1, -25, -31, 0, 0, 0, "r3"); + assert.sameValue(c.add(r3).toString(), a.toString(), "c.add(r3)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/casts-argument.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/casts-argument.js +new file mode 100644 +index 0000000000000000000000000000000000000000..979759ddf67b1d57722dc7ed718276b367a073ee +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/casts-argument.js +@@ -0,0 +1,23 @@ ++// 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.until ++description: String and object arguments get cast ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++TemporalHelpers.assertDuration( ++ datetime.until({ year: 2019, month: 10, day: 29, hour: 10 }), ++ 0, 0, 0, 15684, 18, 36, 29, 876, 543, 211, ++ "plain object argument" ++); ++ ++TemporalHelpers.assertDuration( ++ datetime.until("2019-10-29T10:46:38.271986102"), ++ 0, 0, 0, 15684, 19, 23, 8, 148, 529, 313, ++ "string argument gets cast" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/different-calendars-throws.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/different-calendars-throws.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1fe7a721911fdaf0c5b3fdcd218a4baa32832121 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/different-calendars-throws.js +@@ -0,0 +1,17 @@ ++// 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.until ++description: Using different calendars is not acceptable ++features: [Temporal] ++---*/ ++ ++const dt1 = new Temporal.PlainDateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0); ++const dt2 = new Temporal.PlainDateTime(2000, 1, 1, 0, 0, 0, 0, 0, 0, {}); ++ ++assert.throws( ++ RangeError, ++ () => dt1.until(dt2), ++ "cannot use until with PDTs having different calendars" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/inverse.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/inverse.js +new file mode 100644 +index 0000000000000000000000000000000000000000..026024e3100af4c6dbe7b642b948c77b1f5ee9e8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/inverse.js +@@ -0,0 +1,14 @@ ++// 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.until ++description: The since and until operations act as inverses ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2016, 3, 3, 18); ++ ++TemporalHelpers.assertDurationsEqual(dt.until(later), later.since(dt), "until and since act as inverses"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/largestunit-invalid-string.js +index a3cf0f6aff3d50323ca8e9e3307d1edc7386a97f..aa7ca9a4c346027134a18434b052c931f2fdf466 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/largestunit-invalid-string.js +@@ -9,7 +9,20 @@ features: [Temporal] + + const earlier = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainDateTime(2001, 6, 3, 13, 35, 57, 987, 654, 321); +-const values = ["era", "eraYear", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..352899ac089a565b73789774a2597b0ddfcfda00 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/leap-second.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.until ++description: Leap second is a valid ISO string for PlainDateTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2016, 12, 31, 23, 59, 59); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainDateTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainDateTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/no-unnecessary-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/no-unnecessary-units.js +new file mode 100644 +index 0000000000000000000000000000000000000000..081f9502efc9879f1d0d20e39ce436104095cc31 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/no-unnecessary-units.js +@@ -0,0 +1,24 @@ ++// 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.until ++description: Do not return Durations with unnecessary units ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const feb29 = new Temporal.PlainDateTime(2020, 2, 29, 0, 0); ++const feb28 = new Temporal.PlainDateTime(2021, 2, 28, 0, 0); ++ ++TemporalHelpers.assertDuration( ++ feb29.until(feb28, { largestUnit: "months" }), ++ 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, ++ "does not include higher units than necessary (largest unit = months)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb29.until(feb28, { largestUnit: "years" }), ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "does not include higher units than necessary (largest unit = years)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-empty.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-empty.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6708ac5f143c2a235a96e948bc78b2269d11cdef +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-empty.js +@@ -0,0 +1,20 @@ ++// 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.until ++description: Empty options are valid ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const feb20 = new Temporal.PlainDateTime(2020, 2, 1, 0, 0); ++const feb21 = new Temporal.PlainDateTime(2021, 2, 1, 0, 0); ++ ++TemporalHelpers.assertDuration(feb20.until(feb21, {}), ++ 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, ++ "empty options (plain object) are acceptable"); ++ ++TemporalHelpers.assertDuration(feb20.until(feb21, () => {}), ++ 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, ++ "empty options (function object) are acceptable"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8442c32b6a7db6e11d5e2bdd56faa10a0baee44c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-invalid.js +@@ -0,0 +1,20 @@ ++// 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.until ++description: A variety of invalid option arguments ++features: [Temporal, Symbol] ++---*/ ++ ++const feb20 = new Temporal.PlainDateTime(2020, 2, 1, 0, 0); ++const feb21 = new Temporal.PlainDateTime(2021, 2, 1, 0, 0); ++ ++const badOptions = [null, 1, 'obviously invalid', true, Symbol('foo'), 1n]; ++badOptions.forEach((bad) => { ++ assert.throws( ++ TypeError, ++ () => feb20.until(feb21, bad), ++ `unacceptable options (${typeof bad})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6b248d2e110d0b2667befd5f0306418a2413d4df +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.until ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.until(new Temporal.PlainDateTime(1976, 11, 18), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/returns-days.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/returns-days.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b6e00ead5d52229b8465425b4f020cea47da24b4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/returns-days.js +@@ -0,0 +1,38 @@ ++// 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.until ++description: Return days by default ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const feb20 = new Temporal.PlainDateTime(2020, 2, 1, 0, 0); ++const feb21 = new Temporal.PlainDateTime(2021, 2, 1, 0, 0); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "auto" }), ++ 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, ++ "defaults to returning days (largest unit = auto)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "days" }), ++ 0, 0, 0, 366, 0, 0, 0, 0, 0, 0, ++ "defaults to returning days (largest unit = days)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(new Temporal.PlainDateTime(2021, 2, 1, 0, 0, 0, 0, 0, 1)), ++ 0, 0, 0, 366, 0, 0, 0, 0, 0, 1, ++ "returns nanoseconds if argument is PDT with non-zero nanoseconds" ++); ++ ++const dt = new Temporal.PlainDateTime(2020, 2, 1, 0, 0, 0, 0, 0, 1); ++ ++TemporalHelpers.assertDuration( ++ dt.until(feb21), ++ 0, 0, 0, 365, 23, 59, 59, 999, 999, 999, ++ "one nanosecond away from one year away" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/round-relative-to-receiver.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/round-relative-to-receiver.js +new file mode 100644 +index 0000000000000000000000000000000000000000..496913564b1b53f71ecae2a8f70e5fe1551fc5d9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/round-relative-to-receiver.js +@@ -0,0 +1,25 @@ ++// 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.until ++description: Rounding happens relative to receiver ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt1 = new Temporal.PlainDateTime(2019, 1, 1); ++const dt2 = new Temporal.PlainDateTime(2020, 7, 2); ++const options = { smallestUnit: "years", roundingMode: "halfExpand" }; ++ ++TemporalHelpers.assertDuration( ++ dt1.until(dt2, options), ++ 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "rounds relative to the receiver (positive case)" ++); ++ ++TemporalHelpers.assertDuration( ++ dt2.until(dt1, options), ++ -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "rounds relative to the receiver (negative case)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..aad8a6d9a8b524c3a9fe89986593c7ccd4733d3b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-basic.js +@@ -0,0 +1,48 @@ ++// 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.until ++description: A variety of rounding increments ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "hours", roundingIncrement: 3, roundingMode: "halfExpand"}), ++ 0, 0, 0, 973, 3, 0, 0, 0, 0, 0, ++ "rounds to an increment of hours" ++); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "minutes", roundingIncrement: 30, roundingMode: "halfExpand"}), ++ 0, 0, 0, 973, 4, 30, 0, 0, 0, 0, ++ "rounds to an increment of minutes" ++); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "seconds", roundingIncrement: 15, roundingMode: "halfExpand"}), ++ 0, 0, 0, 973, 4, 17, 0, 0, 0, 0, ++ "rounds to an increment of seconds" ++); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "milliseconds", roundingIncrement: 10, roundingMode: "halfExpand"}), ++ 0, 0, 0, 973, 4, 17, 4, 860, 0, 0, ++ "rounds to an increment of milliseconds" ++); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "microseconds", roundingIncrement: 10, roundingMode: "halfExpand"}), ++ 0, 0, 0, 973, 4, 17, 4, 864, 200, 0, ++ "rounds to an increment of microseconds" ++); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "nanoseconds", roundingIncrement: 10, roundingMode: "halfExpand"}), ++ 0, 0, 0, 973, 4, 17, 4, 864, 197, 530, ++ "rounds to an increment of nanoseconds" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-cleanly-divides.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-cleanly-divides.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d42a933fa286b27f54f88d34791b17cb608f3fc8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-cleanly-divides.js +@@ -0,0 +1,39 @@ ++// 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.until ++description: Rounding increments that cleanly divide relevant units ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++[1, 2, 3, 4, 6, 8, 12].forEach((roundingIncrement) => { ++ const options = {smallestUnit: "hours", roundingIncrement}; ++ assert( ++ earlier.until(later, options) instanceof Temporal.Duration, ++ `valid hour increments divide 24 (rounding increment = ${roundingIncrement})` ++ ); ++}); ++ ++["minutes", "seconds"].forEach((smallestUnit) => { ++ [1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30].forEach((roundingIncrement) => { ++ const options = {smallestUnit, roundingIncrement}; ++ assert( ++ earlier.until(later, options) instanceof Temporal.Duration, ++ `valid ${smallestUnit} increments divide 60 (rounding increment = ${roundingIncrement})` ++ ); ++ }); ++}); ++ ++["milliseconds", "microseconds", "nanoseconds"].forEach((smallestUnit) => { ++ [1, 2, 4, 5, 8, 10, 20, 25, 40, 50, 100, 125, 200, 250, 500].forEach((roundingIncrement) => { ++ const options = {smallestUnit, roundingIncrement}; ++ assert( ++ earlier.until(later, options) instanceof Temporal.Duration, ++ `valid ${smallestUnit} increments divide 1000 (rounding increment = ${roundingIncrement}` ++ ); ++ }); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-does-not-divide.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-does-not-divide.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9207928957f6c11226802a980e33e0c1a754a275 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingincrement-does-not-divide.js +@@ -0,0 +1,45 @@ ++// 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.until ++description: Rounding increments that do not cleanly divide the relevant unit ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++const nondivisibleUnits = { ++ "hours": 11, ++ "minutes": 29, ++ "seconds": 29, ++ "milliseconds": 29, ++ "microseconds": 29, ++ "nanoseconds": 29 ++}; ++ ++Object.entries(nondivisibleUnits).forEach(([unit, increment]) => { ++ assert.throws( ++ RangeError, ++ () => earlier.until(later, {smallestUnit: unit, roundingIncrement: increment}), ++ `throws on increments that do not divide evenly into the next highest (unit = ${unit}, increment = ${increment})` ++ ); ++}); ++ ++const equalDivisibleUnits = { ++ "hours": 24, ++ "minutes": 60, ++ "seconds": 60, ++ "milliseconds": 1000, ++ "microseconds": 1000, ++ "nanoseconds": 1000 ++}; ++ ++Object.entries(equalDivisibleUnits).forEach(([unit, increment]) => { ++ assert.throws( ++ RangeError, ++ () => earlier.until(later, {smallestUnit: unit, roundingIncrement: increment}), ++ `throws on increments that are equal to the next highest (unit = ${unit}, rounding increment = ${increment})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-ceil-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-ceil-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4f4a4ded7d79752f818edfaf05062464c00bf025 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-ceil-basic.js +@@ -0,0 +1,39 @@ ++// 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.until ++description: Checking that ceiling rounding mode rounds correctly ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++const incrementOneCeil = [ ++ ["years", [3], [-2]], ++ ["months", [0, 32], [0, -31]], ++ ["weeks", [0, 0, 140], [0, 0, -139]], ++ ["days", [0, 0, 0, 974], [0, 0, 0, -973]], ++ ["hours", [0, 0, 0, 973, 5], [0, 0, 0, -973, -4]], ++ ["minutes", [0, 0, 0, 973, 4, 18], [0, 0, 0, -973, -4, -17]], ++ ["seconds", [0, 0, 0, 973, 4, 17, 5], [0, 0, 0, -973, -4, -17, -4]], ++ ["milliseconds", [0, 0, 0, 973, 4, 17, 4, 865], [0, 0, 0, -973, -4, -17, -4, -864]], ++ ["microseconds", [0, 0, 0, 973, 4, 17, 4, 864, 198], [0, 0, 0, -973, -4, -17, -4, -864, -197]], ++ ["nanoseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197, 532], [0, 0, 0, -973, -4, -17, -4, -864, -197, -532]] ++]; ++incrementOneCeil.forEach(([smallestUnit, expectedPositive, expectedNegative]) => { ++ const [py, pm = 0, pw = 0, pd = 0, ph = 0, pmin = 0, ps = 0, pms = 0, pµs = 0, pns = 0] = expectedPositive; ++ const [ny, nm = 0, nw = 0, nd = 0, nh = 0, nmin = 0, ns = 0, nms = 0, nµs = 0, nns = 0] = expectedNegative; ++ TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit, roundingMode: "ceil" }), ++ py, pm, pw, pd, ph, pmin, ps, pms, pµs, pns, ++ `rounds up to ${smallestUnit} (roundingMode = ceil, positive case)` ++ ); ++ TemporalHelpers.assertDuration( ++ later.until(earlier, {smallestUnit, roundingMode: "ceil"}), ++ ny, nm, nw, nd, nh, nmin, ns, nms, nµs, nns, ++ `rounds up to ${smallestUnit} (rounding mode = ceil, negative case)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d9a021e9ace9c709737f5f640295a62c78977e4c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor-basic.js +@@ -0,0 +1,39 @@ ++// 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.until ++description: Checking that floor rounding mode rounds correctly ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++const incrementOneFloor = [ ++ ["years", [2], [-3]], ++ ["months", [0, 31], [0, -32]], ++ ["weeks", [0, 0, 139], [0, 0, -140]], ++ ["days", [0, 0, 0, 973], [0, 0, 0, -974]], ++ ["hours", [0, 0, 0, 973, 4], [0, 0, 0, -973, -5]], ++ ["minutes", [0, 0, 0, 973, 4, 17], [0, 0, 0, -973, -4, -18]], ++ ["seconds", [0, 0, 0, 973, 4, 17, 4], [0, 0, 0, -973, -4, -17, -5]], ++ ["milliseconds", [0, 0, 0, 973, 4, 17, 4, 864], [0, 0, 0, -973, -4, -17, -4, -865]], ++ ["microseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197], [0, 0, 0, -973, -4, -17, -4, -864, -198]], ++ ["nanoseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197, 532], [0, 0, 0, -973, -4, -17, -4, -864, -197, -532]] ++]; ++incrementOneFloor.forEach(([smallestUnit, expectedPositive, expectedNegative]) => { ++ const [py, pm = 0, pw = 0, pd = 0, ph = 0, pmin = 0, ps = 0, pms = 0, pµs = 0, pns = 0] = expectedPositive; ++ const [ny, nm = 0, nw = 0, nd = 0, nh = 0, nmin = 0, ns = 0, nms = 0, nµs = 0, nns = 0] = expectedNegative; ++ TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit, roundingMode: "floor" }), ++ py, pm, pw, pd, ph, pmin, ps, pms, pµs, pns, ++ `rounds down to ${smallestUnit} (rounding mode = floor, positive case)` ++ ); ++ TemporalHelpers.assertDuration( ++ later.until(earlier, {smallestUnit, roundingMode: "floor"}), ++ ny, nm, nw, nd, nh, nmin, ns, nms, nµs, nns, ++ `rounds down to ${smallestUnit} (rounding mode = floor, negative case)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f0d4ff1cd5c2d9148fed0b1ad2745634e47f97c5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-basic.js +@@ -0,0 +1,51 @@ ++// 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.until ++description: Checking that half-expand rounding mode rounds correctly ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++function ensureUnsignedZero(x) { ++ return Object.is(x, -0) ? 0 : x; ++} ++ ++const incrementOneNearest = [ ++ ["years", [3]], ++ ["months", [0, 32]], ++ ["weeks", [0, 0, 139]], ++ ["days", [0, 0, 0, 973]], ++ ["hours", [0, 0, 0, 973, 4]], ++ ["minutes", [0, 0, 0, 973, 4, 17]], ++ ["seconds", [0, 0, 0, 973, 4, 17, 5]], ++ ["milliseconds", [0, 0, 0, 973, 4, 17, 4, 864]], ++ ["microseconds", [0, 0, 0, 973, 4, 17, 4, 864, 198]], ++ ["nanoseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197, 532]] ++]; ++incrementOneNearest.forEach(([smallestUnit, expected]) => { ++ const [y, m = 0, w = 0, d = 0, h = 0, min = 0, s = 0, ms = 0, µs = 0, ns = 0] = expected; ++ TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit, roundingMode: "halfExpand"}), ++ y, m, w, d, h, min, s, ms, µs, ns, ++ `rounds to nearest ${smallestUnit} (positive case, rounding mode = halfExpand)` ++ ); ++ TemporalHelpers.assertDuration( ++ later.until(earlier, {smallestUnit, roundingMode: "halfExpand"}), ++ ensureUnsignedZero(-y), ++ ensureUnsignedZero(-m), ++ ensureUnsignedZero(-w), ++ ensureUnsignedZero(-d), ++ ensureUnsignedZero(-h), ++ ensureUnsignedZero(-min), ++ ensureUnsignedZero(-s), ++ ensureUnsignedZero(-ms), ++ ensureUnsignedZero(-µs), ++ ensureUnsignedZero(-ns), ++ `rounds to nearest ${smallestUnit} (negative case, rounding mode = halfExpand)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-default-changes.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-default-changes.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2cecf4b37d924cd0567f34586a5d005b1f1c769d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-halfexpand-default-changes.js +@@ -0,0 +1,28 @@ ++// 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.until ++description: A different default for largest unit will be used if smallest unit is larger than "days" ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "years", roundingMode: "halfExpand"}), ++ 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "assumes a different default for largestUnit if smallestUnit is larger than days (largest unit = years)" ++); ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "months", roundingMode: "halfExpand"}), ++ 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, ++ "assumes a different default for largestUnit if smallestUnit is larger than days (largest unit = months)" ++); ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "weeks", roundingMode: "halfExpand"}), ++ 0, 0, 139, 0, 0, 0, 0, 0, 0, 0, ++ "assumes a different default for largestUnit if smallestUnit is larger than days (largest unit = weeks)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-invalid-string.js +index f907ababfd02da33e30f4ca3b29c0ed3881112c9..47455e7a1916c75c1e55d18e5ceefd2d85dcc44f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-invalid-string.js +@@ -9,4 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainDateTime(2000, 5, 3, 13, 35, 57, 123, 987, 500); +-assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..844e3083c2153c72e6ce01fdb1d3ef85836a1642 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-basic.js +@@ -0,0 +1,51 @@ ++// 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.until ++description: A variety of tests for truncation (trunc) round mode ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++function ensureUnsignedZero(x) { ++ return Object.is(x, -0) ? 0 : x; ++} ++ ++const incrementOneTrunc = [ ++ ["years", [2]], ++ ["months", [0, 31]], ++ ["weeks", [0, 0, 139]], ++ ["days", [0, 0, 0, 973]], ++ ["hours", [0, 0, 0, 973, 4]], ++ ["minutes", [0, 0, 0, 973, 4, 17]], ++ ["seconds", [0, 0, 0, 973, 4, 17, 4]], ++ ["milliseconds", [0, 0, 0, 973, 4, 17, 4, 864]], ++ ["microseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197]], ++ ["nanoseconds", [0, 0, 0, 973, 4, 17, 4, 864, 197, 532]] ++]; ++incrementOneTrunc.forEach(([smallestUnit, expected]) => { ++ const [y, m = 0, w = 0, d = 0, h = 0, min = 0, s = 0, ms = 0, µs = 0, ns = 0] = expected; ++ TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit, roundingMode: "trunc"}), ++ y, m, w, d, h, min, s, ms, µs, ns, ++ `truncates to ${smallestUnit} (rounding mode = trunc, positive case)` ++ ); ++ TemporalHelpers.assertDuration( ++ later.until(earlier, {smallestUnit, roundingMode: "trunc"}), ++ ensureUnsignedZero(-y), ++ ensureUnsignedZero(-m), ++ ensureUnsignedZero(-w), ++ ensureUnsignedZero(-d), ++ ensureUnsignedZero(-h), ++ ensureUnsignedZero(-min), ++ ensureUnsignedZero(-s), ++ ensureUnsignedZero(-ms), ++ ensureUnsignedZero(-µs), ++ ensureUnsignedZero(-ns), ++ `truncates to ${smallestUnit} (rounding mode = trunc, negative case)` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-is-default.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-is-default.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3ae7ecbedc42ad93b3d9508cf93b1228fc5e766d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-trunc-is-default.js +@@ -0,0 +1,24 @@ ++// 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.until ++description: Show that truncation is the default rounding mode ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainDateTime(2019, 1, 8, 8, 22, 36, 123, 456, 789); ++const later = new Temporal.PlainDateTime(2021, 9, 7, 12, 39, 40, 987, 654, 321); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "minutes"}), ++ 0, 0, 0, 973, 4, 17,0, 0, 0, 0, ++ "trunc is the default (round up)" ++); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, {smallestUnit: "seconds"}), ++ 0, 0, 0, 973, 4, 17, 4, 0, 0, 0, ++ "trunc is the default (round down)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/smallestunit-invalid-string.js +index 781434f7af6aef6bc98a245ed1fe12c859ff0007..d12bb40e32cc46724c6f10d448331e47b037467e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/smallestunit-invalid-string.js +@@ -9,7 +9,20 @@ features: [Temporal] + + const earlier = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainDateTime(2000, 5, 3, 13, 35, 57, 987, 654, 321); +-const values = ["era", "eraYear", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/subseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/subseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..389963400e46e283d2990fd8ac600bafff737766 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/subseconds.js +@@ -0,0 +1,30 @@ ++// 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.until ++description: Returned granularity may be finer than seconds ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const feb20 = new Temporal.PlainDateTime(2020, 2, 1, 0, 0); ++const feb21 = new Temporal.PlainDateTime(2020, 2, 2, 0, 0, 0, 250, 250, 250); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "milliseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 86400250, 250, 250, ++ "can return subseconds (millisecond precision)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "microseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 86400250250, 250, ++ "can return subseconds (microsecond precision)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "nanoseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 86400250250250, ++ "can return subseconds (nanosecond precision)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/units-changed.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/units-changed.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e13f520ea33db0df0cdc0d44861978f12a0f3323 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/units-changed.js +@@ -0,0 +1,66 @@ ++// 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.until ++description: Largest unit is respected ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const feb20 = new Temporal.PlainDateTime(2020, 2, 1, 0, 0); ++const feb21 = new Temporal.PlainDateTime(2021, 2, 1, 0, 0); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "years" }), ++ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "can return lower or higher units (years)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "months" }), ++ 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, ++ "can return lower or higher units (months)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "weeks" }), ++ 0, 0, 52, 2, 0, 0, 0, 0, 0, 0, ++ "can return lower or higher units (weeks)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "hours" }), ++ 0, 0, 0, 0, 8784, 0, 0, 0, 0, 0, ++ "can return lower or higher units (hours)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "minutes" }), ++ 0, 0, 0, 0, 0, 527040, 0, 0, 0, 0, ++ "can return lower or higher units (minutes)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "seconds" }), ++ 0, 0, 0, 0, 0, 0, 31622400, 0, 0, 0, ++ "can return lower or higher units (seconds)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "milliseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 31622400000, 0, 0, ++ "can return lower or higher units (milliseconds)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "microseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 31622400000000, 0, ++ "can return lower or higher units (microseconds)" ++); ++ ++TemporalHelpers.assertDuration( ++ feb20.until(feb21, { largestUnit: "nanoseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 31622400000000000, ++ "can return lower or higher units (nanoseconds)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/weeks-months-mutually-exclusive.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/weeks-months-mutually-exclusive.js +new file mode 100644 +index 0000000000000000000000000000000000000000..412673117e1e7b0808fff267ce0203957e5ceb82 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/weeks-months-mutually-exclusive.js +@@ -0,0 +1,24 @@ ++// 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.until ++description: Weeks and months are mutually exclusive ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const laterDateTime = dt.add({ days: 42, hours: 3 }); ++ ++TemporalHelpers.assertDuration( ++ dt.until(laterDateTime, { largestUnit: "weeks" }), ++ 0, 0, 6, 0, 3, 0, 0, 0, 0, 0, ++ "weeks and months mutually exclusive (prefer weeks)" ++); ++ ++TemporalHelpers.assertDuration( ++ dt.until(laterDateTime, { largestUnit: "months" }), ++ 0, 1, 0, 12, 3, 0, 0, 0, 0, 0, ++ "weeks and months mutually exclusive (prefer months)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/year-zero.js +index 028410a06d576dd42dc7eea4cabf2890f202a8c3..dd7ac76c968a9e15751ca471989325a228f88186 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/until/year-zero.js +@@ -8,14 +8,16 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ ++ "-000000-12-07", + "-000000-12-07T03:24:30", +- "-000000-12-07T03:24:30+01:00[UTC]" ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => { instance.until(arg); }, ++ () => instance.until(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/valueOf/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/valueOf/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3da2878448ed2b9acf5780a1319cb06e1a45b7b7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/valueOf/basic.js +@@ -0,0 +1,23 @@ ++// 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.valueof ++description: Comparison operators (except !== and ===) do not work ++features: [Temporal] ++---*/ ++ ++const dt1 = new Temporal.PlainDateTime(1963, 2, 13, 9, 36, 29, 123, 456, 789); ++const dt1again = new Temporal.PlainDateTime(1963, 2, 13, 9, 36, 29, 123, 456, 789); ++const dt2 = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++assert.sameValue(dt1 === dt1, true, "object equality implies ==="); ++assert.sameValue(dt1 !== dt1again, true, "object non-equality, even if all data is the same, implies !=="); ++assert.throws(TypeError, () => dt1 < dt1, "< throws (same objects)"); ++assert.throws(TypeError, () => dt1 < dt2, "< throws (different objects)"); ++assert.throws(TypeError, () => dt1 > dt1, "> throws (same objects)"); ++assert.throws(TypeError, () => dt1 > dt2, "> throws (different objects)"); ++assert.throws(TypeError, () => dt1 <= dt1, "<= does not throw (same objects)"); ++assert.throws(TypeError, () => dt1 <= dt2, "<= throws (different objects)"); ++assert.throws(TypeError, () => dt1 >= dt1, ">= throws (same objects)"); ++assert.throws(TypeError, () => dt1 >= dt2, ">= throws (different objects)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/weekOfYear/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/weekOfYear/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6273dbc54cd4820d60491ceeef6822128a71acbd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/weekOfYear/basic.js +@@ -0,0 +1,12 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-get-temporal.plaindatetime.prototype.weekofyear ++description: Checking week of year for a "normal" case (non-undefined, non-boundary case, etc.) ++features: [Temporal] ++---*/ ++ ++const calendar = Temporal.Calendar.from("iso8601"); ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar); ++assert.sameValue(datetime.weekOfYear, 47, "check week of year information"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/argument-not-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/argument-not-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..65c474da5385506e5e8efdf7a2f6474e99381f38 +--- /dev/null ++++ b/JSTests/test262/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/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/argument-object-insufficient-data.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/argument-object-insufficient-data.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5c4c4e2b5bf0ef63fdd859deb32423c1a96cbdb2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/argument-object-insufficient-data.js +@@ -0,0 +1,42 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++description: Unrecognized properties (incl. plurals of recognized units) are ignored ++esid: sec-temporal.plaindatetime.prototype.with ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++assert.throws( ++ TypeError, ++ () => instance.with({}), ++ "empty object not acceptable" ++); ++ ++const units = ["year", "month", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond"]; ++ ++units.forEach((unit) => { ++ let plural = `${unit}s`; ++ let options = {}; ++ options[plural] = 1; ++ assert.throws( ++ TypeError, ++ () => instance.with(options), ++ `plural unit ("${plural}" vs "${unit}") is not acceptable` ++ ); ++}); ++ ++assert.throws( ++ TypeError, ++ () => instance.with({nonsense: true}), ++ "throw if no recognized properties present" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ instance.with({year: 1965, nonsense: true}), ++ 1965, 5, "M05", 2, 12, 34, 56, 987, 654, 321, ++ "unrecognized properties ignored & does not throw if recognized properties present)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d021389adcf2111ab92b4f20d32554f60bb04d18 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/basic.js +@@ -0,0 +1,77 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++description: A variety of "normal" (non-throwing, non-boundary case, non-null, etc.) arguments ++esid: sec-temporal.plaindatetime.prototype.with ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ year: 2019 }), ++ 2019, 11, "M11", 18, 15, 23, 30, 123, 456, 789, ++ "with year works" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ month: 5 }), ++ 1976, 5, "M05", 18, 15, 23, 30, 123, 456, 789, ++ "with month works" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ monthCode: "M05" }), ++ 1976, 5, "M05", 18, 15, 23, 30, 123, 456, 789, ++ "with month code works" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ day: 5 }), ++ 1976, 11, "M11", 5, 15, 23, 30, 123, 456, 789, ++ "with day works" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ hour: 5 }), ++ 1976, 11, "M11", 18, 5, 23, 30, 123, 456, 789, ++ "with hour works" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ minute: 5 }), ++ 1976, 11, "M11", 18, 15, 5, 30, 123, 456, 789, ++ "with minute works" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ second: 5 }), ++ 1976, 11, "M11", 18, 15, 23, 5, 123, 456, 789, ++ "with second works" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ millisecond: 5 }), ++ 1976, 11, "M11", 18, 15, 23, 30, 5, 456, 789, ++ "with millisecond works" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ microsecond: 5 }), ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 5, 789, ++ "with microsecond works" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ nanosecond: 5 }), ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 456, 5, ++ "with nanosecond works" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ month: 5, second: 15 }), ++ 1976, 5, "M05", 18, 15, 23, 15, 123, 456, 789, ++ "with month and second works" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-options.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-options.js +new file mode 100644 +index 0000000000000000000000000000000000000000..935c1333d122f0c496a8b40e0f0db4b2891ae468 +--- /dev/null ++++ b/JSTests/test262/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/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ae6887e31a17fe32feec9209698edc2f3a106f26 +--- /dev/null ++++ b/JSTests/test262/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/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-throws.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-throws.js +new file mode 100644 +index 0000000000000000000000000000000000000000..165c7b57b2a7c724dc28d978544bb0150e6575e4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/calendar-throws.js +@@ -0,0 +1,16 @@ ++// 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 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); ++ ++assert.throws( ++ TypeError, ++ () => datetime.with({ year: 2021, calendar: "iso8601" }), ++ "throws with calendar property" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/month-and-monthcode-must-agree.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/month-and-monthcode-must-agree.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6e81bac840ed71afbacd4694824f8ad7a953de6e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/month-and-monthcode-must-agree.js +@@ -0,0 +1,16 @@ ++// 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 month and month code should agree ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++assert.throws( ++ RangeError, ++ () => datetime.with({ month: 5, monthCode: "M06" }), ++ "month and monthCode must agree" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/multiple-unrecognized-properties-ignored.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/multiple-unrecognized-properties-ignored.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5a5309f2e20572c7aa852c87b500bc2661c8a5fc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/multiple-unrecognized-properties-ignored.js +@@ -0,0 +1,23 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++description: Unrecognized units are ignored ++esid: sec-temporal.plaindatetime.prototype.with ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const units = ["year", "month", "day", "hour", "minute", "second", "millisecond", "microsecond", "nanosecond"]; ++ ++units.forEach((unit) => { ++ let plural = `${unit}s`; ++ let arg = { month: 12 }; ++ arg[plural] = 1; ++ TemporalHelpers.assertPlainDateTime( ++ datetime.with(arg), ++ 1976, 12, "M12", 18, 15, 23, 30, 123, 456, 789, ++ `unrecognized property (${plural}) gets ignored` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-empty.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-empty.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3bc92e0d8e6ecc61150c2dae3564e0f941521268 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-empty.js +@@ -0,0 +1,23 @@ ++// 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: Verify that undefined options are handled correctly. ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ day: 40 }, {}), ++ 1976, 11, "M11", 30, 15, 23, 30, 123, 456, 789, ++ "options may be empty object" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ datetime.with({ day: 40 }, () => {}), ++ 1976, 11, "M11", 30, 15, 23, 30, 123, 456, 789, ++ "read empty options from function object" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8f52de349e67a3a101179eeadd9e3b3d32840f00 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-invalid.js +@@ -0,0 +1,20 @@ ++// 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: Verify that undefined options are handled correctly. ++features: [Temporal, Symbol] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++const badOptions = [null, 1, 'hello', true, Symbol('foo'), 1n]; ++ ++badOptions.forEach((bad) => { ++ assert.throws( ++ TypeError, ++ () => datetime.with({ day: 5 }, bad), ++ `bad options (${typeof bad})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5c29d95e5e60ac2d4d4751d1624bd9c32b3ba611 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.with({ day: 5 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js +index be6e0797b8377ba5994a31949e7e0dc6f08179fb..ce2bc34b9c68b9a1049b8fb04f8b5b56b8fb1ff9 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/order-of-operations.js ++++ b/JSTests/test262/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"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/overflow-invalid-string.js +index 9e3f561784620b6a32baaea0691917b4a4c0e4a0..4d3b05b0eac021236cef4287acf09fafd2afca47 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/overflow-invalid-string.js +@@ -18,4 +18,12 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.PlainDateTime(2000, 5, 2, 12); +-assert.throws(RangeError, () => datetime.with({ minute: 45 }, { overflow: "other string" })); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => datetime.with({ minute: 45 }, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/string-throws.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/string-throws.js +new file mode 100644 +index 0000000000000000000000000000000000000000..405a12fadbe83b5a3cc27758dcf6b2b176cd2431 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/string-throws.js +@@ -0,0 +1,20 @@ ++// 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 string argument is supplied ++esid: sec-temporal.plaindatetime.prototype.with ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const baddies = ["12:00", "1995-04-07", "2019-05-17T12:34:56.007007007", "2019-05-17T12:34:56.007007007Z", "42"]; ++ ++baddies.forEach((bad) => { ++ assert.throws( ++ TypeError, ++ () => instance.with(bad), ++ `bad argument (${bad})` ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/timezone-throws.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/timezone-throws.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0931204b16f6b3e4233ea132c6a33b79f8862fcd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/with/timezone-throws.js +@@ -0,0 +1,16 @@ ++// 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 timezone is supplied ++esid: sec-temporal.plaindatetime.prototype.with ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++ ++assert.throws( ++ TypeError, ++ () => datetime.with({ year: 2021, timeZone: "UTC" }), ++ "throws with timezone property" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/argument-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b75ace828f85e0a45eb2b4e19ac52a0f3c47802c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/argument-string.js +@@ -0,0 +1,37 @@ ++// 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.withcalendar ++description: String argument, if it names a recognizable calendar, gets cast ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const calendar = { ++ toString() { return "something special"; } ++}; ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, calendar); ++const result = dt.withCalendar("iso8601"); ++ ++TemporalHelpers.assertPlainDateTime( ++ result, ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 456, 789, ++ "'iso8601' is a recognizable calendar" ++); ++ ++const resultCalendar = result.calendar; ++ ++assert.sameValue( ++ resultCalendar instanceof Temporal.Calendar, ++ true, ++ "underlying calendar is no longer a plain object" ++); ++ ++assert.sameValue(resultCalendar.toString(), "iso8601", "underlying calendar has changed"); ++ ++assert.throws( ++ RangeError, ++ () => dt.withCalendar("this will fail"), ++ "unknown calendar throws" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..318f552ab5429093253d4ddcdd4cdd4ddd1f2393 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/basic.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.withcalendar ++description: Non-throwing non-edge case ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789); ++const calendar = new Temporal.Calendar("iso8601"); ++ ++const result = dt.withCalendar(calendar); ++ ++TemporalHelpers.assertPlainDateTime( ++ result, ++ 1976, 11, "M11", 18, 15, 23, 30, 123, 456, 789, ++ "works" ++); ++ ++assert.sameValue(result.calendar, calendar, "underlying calendar is unchanged"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3289014fc493ddb2353667214a83a93c52f0deb3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-number.js +@@ -0,0 +1,29 @@ ++// 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.withcalendar ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, { id: "replace-me" }); ++ ++const arg = 19761118; ++ ++const result = instance.withCalendar(arg); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.withCalendar(arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..02ea408591f633159c592f5c6b816cb0174b909b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-string-leap-second.js +@@ -0,0 +1,26 @@ ++// 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.withcalendar ++description: Leap second is a valid ISO string for Calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, { id: "replace-me" }); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.withCalendar(arg); ++assert.sameValue( ++ result1.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar" ++); ++ ++arg = { calendar: "2016-12-31T23:59:60" }; ++const result2 = instance.withCalendar(arg); ++assert.sameValue( ++ result2.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-temporal-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-temporal-object.js +index d433a932aadcd49816f2843f5aa3420332bd6be8..b5aa7ac67f10f283c3c48f7985794c2c8ad8755e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-temporal-object.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-temporal-object.js +@@ -17,5 +17,5 @@ features: [Temporal] + TemporalHelpers.checkToTemporalCalendarFastPath((temporalObject, calendar) => { + const plainDateTime = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + const result = plainDateTime.withCalendar(temporalObject); +- assert.sameValue(result.calendar, calendar, 'Temporal object coerced to calendar'); ++ assert.sameValue(result.calendar, calendar, "Temporal object coerced to calendar"); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e08a087f2b0d5812a20a5042e5fcb72f97048637 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-wrong-type.js +@@ -0,0 +1,32 @@ ++// 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.withcalendar ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789, { id: "replace-me" }); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.withCalendar(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.withCalendar(arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cb2c9337a3da1828c8117005fc0e464449af40e4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.withplaindate ++description: A number is converted to a string, then to Temporal.PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const arg = 19761118; ++ ++const result = instance.withPlainDate(arg); ++TemporalHelpers.assertPlainDateTime(result, 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.withPlainDate(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object-insufficient-data.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object-insufficient-data.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0ddb21932d17699ae2d2de4742cbf830dc241867 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object-insufficient-data.js +@@ -0,0 +1,35 @@ ++// 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.withplaindate ++description: Unrecognized properties of plain object ignored ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30); ++ ++assert.throws( ++ TypeError, ++ () => dt.withPlainDate({}), ++ "empty object not acceptable" ++); ++ ++assert.throws( ++ TypeError, ++ () => dt.withPlainDate({ months: 12 }), // should be "month" ++ "no recognized properties (look like it might work)" ++); ++ ++assert.throws( ++ TypeError, ++ () => dt.with({nonsense: true}), ++ "no recognized properties (clearly won't work)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.withPlainDate({ year: 2000, month: 6, day: 1, months: 123 }), // 'months' unrecognized; see above ++ 2000, 6, "M06", 1, 3, 24, 30, 0, 0, 0, ++ "unrecognized properties ignored & does not throw if recognized properties present)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b7e336344aa096ce6599009628b0ef35dfbb800c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object.js +@@ -0,0 +1,17 @@ ++// 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.withplaindate ++description: Plain object may be acceptable ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.withPlainDate({ year: 2000, month: 6, day: 1 }), ++ 2000, 6, "M06", 1, 3, 24, 30, 0, 0, 0, ++ "plain object works" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js +new file mode 100644 +index 0000000000000000000000000000000000000000..326aed7c76240abdabce591fa08dbbf5ca097894 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js +@@ -0,0 +1,35 @@ ++// 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.withplaindate ++description: PlainDate calendar is preserved with ISO PDT ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const cal = { ++ id: 'thisisnotiso', ++ toString() { return "this is a string"; }, ++ year() { return 2008; }, ++ month() { return 9; }, ++ monthCode() { return "M09"; }, ++ day() { return 6; } ++}; ++const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0); ++assert.sameValue(pdt.calendar.toString(), "iso8601", "PlainDateTime with ISO calendar"); ++const pd = new Temporal.PlainDate(2010, 11, 12, cal); ++const shifted = pdt.withPlainDate(pd); ++ ++TemporalHelpers.assertPlainDateTime( ++ shifted, ++ 2008, 9, "M09", 6, 3, 24, 30, 0, 0, 0, ++ "calendar is changed if receiver has ISO calendar (1)" ++ // Testing of era and eraYear should only be coded under intl402 ++); ++ ++assert.sameValue( ++ shifted.calendar, ++ cal, ++ "calendar is changed if receiver has ISO calendar (2)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5c7536640bcf2260f4b93653ba8d424701104036 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js +@@ -0,0 +1,37 @@ ++// 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.withplaindate ++description: PlainDate calendar is preserved when both calendars have the same id ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const cal1 = { ++ toString() { return "this is a string"; }, ++}; ++const cal2 = { ++ id: 'thisisnotiso', ++ toString() { return "this is a string"; }, ++ year() { return 2008; }, ++ month() { return 9; }, ++ monthCode() { return "M09"; }, ++ day() { return 6; } ++}; ++const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal1); ++const pd = new Temporal.PlainDate(2010, 11, 12, cal2); ++const shifted = pdt.withPlainDate(pd); ++ ++TemporalHelpers.assertPlainDateTime( ++ shifted, ++ 2008, 9, "M09", 6, 3, 24, 30, 0, 0, 0, ++ "calendar is changed with same id (1)" ++ // Testing of era and eraYear should only be coded under intl402 ++); ++ ++assert.sameValue( ++ shifted.calendar, ++ cal2, ++ "calendar is changed with same id (2)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9eaba18a9405a00b65c1053ba7de399ba13eb066 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js +@@ -0,0 +1,39 @@ ++// 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.withplaindate ++description: PlainDate calendar is preserved when both calendars are the same object ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++let calls = 0; ++const cal = { ++ id: 'thisisnotiso', ++ toString() { ++ ++calls; ++ return "this is a string"; ++ }, ++ year() { return 2008; }, ++ month() { return 9; }, ++ monthCode() { return "M09"; }, ++ day() { return 6; } ++}; ++const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal); ++const pd = new Temporal.PlainDate(2010, 11, 12, cal); ++const shifted = pdt.withPlainDate(pd); ++ ++TemporalHelpers.assertPlainDateTime( ++ shifted, ++ 2008, 9, "M09", 6, 3, 24, 30, 0, 0, 0, ++ "calendar is unchanged with same calendars (1)" ++ // Testing of era and eraYear should only be coded under intl402 ++); ++ ++assert.sameValue( ++ shifted.calendar, ++ cal, ++ "calendar is unchanged with same calendars (2)" ++); ++assert.sameValue(calls, 0, "should not have called cal.toString()"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js +new file mode 100644 +index 0000000000000000000000000000000000000000..12a28cb78eb883c9a3bbce2200d28585ee045040 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js +@@ -0,0 +1,35 @@ ++// 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.withplaindate ++description: Original PDT calendar is preserved with ISO PlainDate ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const cal = { ++ id: 'thisisnotiso', ++ toString() { return "this is a string"; }, ++ year() { return 2008; }, ++ month() { return 9; }, ++ monthCode() { return "M09"; }, ++ day() { return 6; } ++}; ++const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal); ++const pd = new Temporal.PlainDate(2010, 11, 12); ++assert.sameValue(pd.calendar.toString(), "iso8601", "PlainDate with ISO calendar"); ++const shifted = pdt.withPlainDate(pd); ++ ++TemporalHelpers.assertPlainDateTime( ++ shifted, ++ 2008, 9, "M09", 6, 3, 24, 30, 0, 0, 0, ++ "calendar is unchanged if input has ISO calendar (1)" ++ // Testing of era and eraYear should only be coded under intl402 ++); ++ ++assert.sameValue( ++ shifted.calendar, ++ cal, ++ "calendar is unchanged if input has ISO calendar (2)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate.js +new file mode 100644 +index 0000000000000000000000000000000000000000..14ebb69c035db7e717c07ac809bb9bd8befa3db7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate.js +@@ -0,0 +1,18 @@ ++// 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.withplaindate ++description: PlainDate object is acceptable ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30); ++const date = new Temporal.PlainDate(2020, 1, 23); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.withPlainDate(date), ++ 2020, 1, "M01", 23, 3, 24, 30, 0, 0, 0, ++ "PlainDate argument works" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..db9a51215e7d2d268f7bfe1041903876c21d58cd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.withplaindate ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.withPlainDate(arg); ++TemporalHelpers.assertPlainDateTime( ++ result1, ++ 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.withPlainDate(arg); ++TemporalHelpers.assertPlainDateTime( ++ result2, ++ 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c9ae966915434a3265ed48ef01969d2403b4f0e3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.withplaindate ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.withPlainDate(arg); ++TemporalHelpers.assertPlainDateTime(result1, 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.withPlainDate(arg); ++TemporalHelpers.assertPlainDateTime(result2, 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.withPlainDate(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.withPlainDate(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7fbae64fc59a91f48498b7112ab06597b0027132 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.withplaindate ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.withPlainDate(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.withPlainDate(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.withPlainDate(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.withPlainDate(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.withPlainDate(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bb85c7bec1e10a88912cc3a8cfc5f1f57e439865 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.withplaindate ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.withPlainDate(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a4f4d9350f010e1c8f7020e7cb566eef0a5569c5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.withplaindate ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.withPlainDate(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f587118608c76fa6603c39a95c2044feb6077def +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.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. ++ ++/*--- ++esid: sec-temporal.plaindatetime.prototype.withplaindate ++description: Original PDT calendar is preserved with ISO string ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const cal = { ++ id: "thisisnotiso", ++ toString() { return "this is a string"; }, ++ year() { return 2008; }, ++ month() { return 9; }, ++ monthCode() { return "M09"; }, ++ day() { return 6; } ++}; ++const dt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal); ++const shifted = dt.withPlainDate("2010-11-12"); ++ ++TemporalHelpers.assertPlainDateTime( ++ shifted, ++ 2008, 9, "M09", 6, 3, 24, 30, 0, 0, 0, ++ "calendar is unchanged if input has ISO calendar (1)" ++ // Testing of era and eraYear should only be coded under intl402 ++); ++ ++assert.sameValue( ++ shifted.calendar, ++ cal, ++ "calendar is unchanged if input has ISO calendar (2)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..902cae34dc089ebcb4991c5a7d35f35e20ff900a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string.js +@@ -0,0 +1,17 @@ ++// 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.withplaindate ++description: PlainDate-like string argument is acceptable ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.withPlainDate("2018-09-15"), ++ 2018, 9, "M09", 15, 3, 24, 30, 0, 0, 0, ++ "PlainDate-like string argument works" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..37daa75ccd428130eb0b90abf9400b5461cd2212 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.withplaindate ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.withPlainDate(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.withPlainDate(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b67561e482900dce5e3235d1a04bde9b8e79f073 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.withplaindate ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321, calendar); ++instance.withPlainDate({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..39c6186177fca56ab21ed82d1a41e696a7208e4d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/leap-second.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.withplaindate ++description: Leap second is a valid ISO string for PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.withPlainDate(arg); ++TemporalHelpers.assertPlainDateTime( ++ result1, ++ 2016, 12, "M12", 31, 12, 34, 56, 987, 654, 321, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.withPlainDate(arg); ++TemporalHelpers.assertPlainDateTime( ++ result2, ++ 2016, 12, "M12", 31, 12, 34, 56, 987, 654, 321, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/non-compatible-calendars-throw.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/non-compatible-calendars-throw.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9e3920d2bb066eb528ab75fddc20ffca30e71268 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/non-compatible-calendars-throw.js +@@ -0,0 +1,28 @@ ++// 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.withplaindate ++description: If two non-ISO calendars are involved, an error is raised ++features: [Temporal] ++---*/ ++ ++const cal = { ++ id: "foo", ++ toString() { return "this is a string"; }, ++}; ++ ++const dt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal); ++ ++const anotherCal = { ++ id: "bar", ++ toString() { return "this is another string"; }, ++}; ++ ++const date = new Temporal.PlainDate(2008, 9, 6, anotherCal); ++ ++assert.throws( ++ RangeError, ++ () => dt.withPlainDate(date), ++ "throws if both `this` and `other` have a non-ISO calendar" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/year-zero.js +index 392a7ec2c077bcd54242ca24f1da06f731878a14..b6fffe30e42fd042dd2f0ccc6535f72ffa810813 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.withPlainDate(arg); }, ++ () => instance.withPlainDate(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a2dc97347decf4c944ca965ef616bb64ac5fd498 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-number.js +@@ -0,0 +1,31 @@ ++// 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.withplaintime ++description: A number is converted to a string, then to Temporal.PlainTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2); ++ ++const arg = 123456.987654321; ++ ++const result = instance.withPlainTime(arg); ++TemporalHelpers.assertPlainDateTime(result, 2000, 5, "M05", 2, 12, 34, 56, 987, 654, 321, "123456.987654321 is a valid ISO string for PlainTime"); ++ ++const numbers = [ ++ 1, ++ -123456.987654321, ++ 1234567, ++ 123456.9876543219, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.withPlainTime(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-object-insufficient-data.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-object-insufficient-data.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3143b43c5e8a6caf9f7d8e8d2fe4091cb1082820 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-object-insufficient-data.js +@@ -0,0 +1,35 @@ ++// 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.withplaintime ++description: A plain object can be used as an argument ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(2015, 12, 7, 3, 24, 30, 0, 3, 500); ++ ++assert.throws( ++ TypeError, ++ () => dt.withPlainTime({}), ++ "empty object not an acceptable argument" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.withPlainTime({ hour: 10 }), ++ 2015, 12, "M12", 7, 10, 0, 0, 0, 0, 0, ++ "plain object (hour) works" ++); ++ ++assert.throws( ++ TypeError, ++ () => dt.withPlainTime({ hours: 9 }), // should be "hour", see above ++ "plain object with a single unrecognized property fails" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.withPlainTime({ hour: 10, seconds: 123 }), ++ 2015, 12, "M12", 7, 10, 0, 0, 0, 0, 0, ++ "unrecognized properties are ignored if at least one recognized property is present" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js +index 2b0988cda55e8401b1183e6a62ae4b723d1e0c23..62b61c51eeeaec3d350296d7c23d9a0822bc55c5 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js +@@ -27,6 +27,13 @@ ambiguousStrings.forEach((string) => { + // The same string with a T prefix should not throw: + arg = `T${string}`; + instance.withPlainTime(arg); ++ ++ arg = ` ${string}`; ++ assert.throws( ++ RangeError, ++ () => instance.withPlainTime(arg), ++ "space is not accepted as a substitute for T prefix" ++ ); + }); + + // None of these should throw without a T prefix, because they are unambiguously time strings: +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-without-time-designator.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-without-time-designator.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2acd0c8a3ac18715aa93eb5ab7b475d3a50ee3b2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-without-time-designator.js +@@ -0,0 +1,17 @@ ++// 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.withplaintime ++description: String argument without ISO 8601 time designator "T" allowed ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(2015, 12, 7, 3, 24, 30, 0, 3, 500); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.withPlainTime("12:34"), ++ 2015, 12, "M12", 7, 12, 34, 0, 0, 0, 0, ++ "time-like string works" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-time.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-time.js +new file mode 100644 +index 0000000000000000000000000000000000000000..885116f7d06b9965ba4c8a4e97ab39e1c42484a3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-time.js +@@ -0,0 +1,29 @@ ++// 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.withplaintime ++description: An instance of PlainTime can be used as an argument ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(2015, 12, 7, 3, 24, 30, 0, 3, 500); ++const hour = 11; ++const minute = 22; ++const time = new Temporal.PlainTime(hour, minute); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.withPlainTime(time), ++ 2015, ++ 12, ++ "M12", ++ 7, ++ hour, ++ minute, ++ 0, ++ 0, ++ 0, ++ 0, ++ "PlainTime argument works" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b8308b37f536a1cb56aa319fe68a8521f6fe69bd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-wrong-type.js +@@ -0,0 +1,35 @@ ++// 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.withplaintime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.withPlainTime(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainTime, "Temporal.PlainTime, object"], ++ [Temporal.PlainTime.prototype, "Temporal.PlainTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.withPlainTime(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4cfd1e0ec32e0cbe99fdf935453acde2e4473440 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/leap-second.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.withplaintime ++description: Leap second is a valid ISO string for PlainTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.withPlainTime(arg); ++TemporalHelpers.assertPlainDateTime( ++ result1, ++ 2000, 5, "M05", 2, 23, 59, 59, 0, 0, 0, ++ "leap second is a valid ISO string for PlainTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.withPlainTime(arg); ++TemporalHelpers.assertPlainDateTime( ++ result2, ++ 2000, 5, "M05", 2, 23, 59, 59, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/no-argument-default-to-midnight.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/no-argument-default-to-midnight.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bcda293fb20d5bc629259097efabd666aeb47d49 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/no-argument-default-to-midnight.js +@@ -0,0 +1,17 @@ ++// 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.withplaintime ++description: If no argument is given, default to midnight ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(2015, 12, 7, 3, 24, 30, 0, 3, 500); ++ ++TemporalHelpers.assertPlainDateTime( ++ dt.withPlainTime(), ++ 2015, 12, "M12", 7, 0, 0, 0, 0, 0, 0, ++ "no argument defaults to midnight" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js +index df9181a483fa013b77a47f4a19c8b71f0e1850fd..5c749e611f466b26cb176a95bc2dd57970f7db55 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js +@@ -11,7 +11,7 @@ features: [Temporal] + const instance = new Temporal.PlainDateTime(2000, 1, 1, 12, 30, 45, 123, 456, 789); + + const props = {}; +-assert.throws(TypeError, () => instance.withPlainTime(props), "TypeError if at least one property is not present"); ++assert.throws(TypeError, () => instance.withPlainTime(props), "TypeError if no properties are present"); + + props.minute = 30; + const result = instance.withPlainTime(props); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/year-zero.js +index 0b74c516c6cb60948bc2bcd9251f606c602a2625..19734655f17368c1f313b66a86effc03c563646e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/prototype/withPlainTime/year-zero.js +@@ -8,8 +8,9 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-12-07T03:24:30', +- '-000000-12-07T03:24:30+01:00[UTC]' ++ "-000000-12-07T03:24:30", ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + invalidStrings.forEach((arg) => { +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/second-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/second-undefined.js +index 9ec2ea3ef79b5fd27d73dba7b673d54aed097437..4b8422d4c352591b1e46ed61e00df011f3f2e6c0 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainDateTime/second-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainDateTime/second-undefined.js +@@ -4,13 +4,20 @@ + /*--- + esid: sec-temporal.plaindatetime + description: Second argument defaults to 0 if not given ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + + const args = [2000, 5, 2, 12, 34]; + +-const explicit = new Temporal.PlainDateTime(...args, undefined); +-assert.sameValue(explicit.second, 0, "second default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args, undefined), ++ 2000, 5, "M05", 2, 12, 34, 0, 0, 0, 0, ++ "second default argument (argument present)" ++); + +-const implicit = new Temporal.PlainDateTime(...args); +-assert.sameValue(implicit.second, 0, "second default argument"); ++TemporalHelpers.assertPlainDateTime( ++ new Temporal.PlainDateTime(...args), ++ 2000, 5, "M05", 2, 12, 34, 0, 0, 0, 0, ++ "second default argument (argument missing)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/calendar-always.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/calendar-always.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8b9d87ff0a012602c5fe0cadee5ffdc13b05ef37 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/calendar-always.js +@@ -0,0 +1,24 @@ ++// 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.plainmonthday ++description: If calendar name is to be emitted, include additional reference info ++features: [Temporal] ++---*/ ++ ++const pmd = new Temporal.PlainMonthDay(10, 31, "iso8601", 2019); ++ ++assert.sameValue( ++ pmd.toString({ calendarName: 'always' }), ++ "2019-10-31[u-ca=iso8601]", ++ "emit year-month-day if calendarName = 'always' (four-argument constructor)" ++); ++ ++const anotherPMD = Temporal.PlainMonthDay.from("2019-10-31"); // 2019 will get dropped ++ ++assert.sameValue( ++ anotherPMD.toString({ calendarName: 'always' }), ++ "1972-10-31[u-ca=iso8601]", ++ "emit fallback year if calendarName = 'always' (static from)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bc2edac62fabd29a90448a07c9326072efe2378b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/calendar-number.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.plainmonthday ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const arg = 19761118; ++ ++const result = new Temporal.PlainMonthDay(12, 15, arg, 1972); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => new Temporal.PlainMonthDay(12, 15, arg, 1972), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d2f3038539472e06b0546ba6a908274bbe2ea4f0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/calendar-wrong-type.js +@@ -0,0 +1,30 @@ ++// 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.plainmonthday ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => new Temporal.PlainMonthDay(12, 15, arg, 1972), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => new Temporal.PlainMonthDay(12, 15, arg, 1972), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e9b0edcbf45536cecea37f74c0d8907ff2b4a8ea +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-number.js +@@ -0,0 +1,28 @@ ++// 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.plainmonthday.from ++description: A number is converted to a string, then to Temporal.PlainMonthDay ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const arg = 1118; ++ ++const result = Temporal.PlainMonthDay.from(arg); ++TemporalHelpers.assertPlainMonthDay(result, "M11", 18, "1118 is a valid ISO string for PlainMonthDay"); ++ ++const numbers = [ ++ 1, ++ -1118, ++ 12345, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainMonthDay.from(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainMonthDay` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-plainmonthday.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-plainmonthday.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5304f5539695bfd945b9e62d44b91cb19eb4ff42 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-plainmonthday.js +@@ -0,0 +1,25 @@ ++// 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.plainmonthday.from ++description: A PlainMonthDay object is copied, not returned directly ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const orig = new Temporal.PlainMonthDay(5, 2, undefined, 2000); ++const result = Temporal.PlainMonthDay.from(orig); ++ ++TemporalHelpers.assertPlainMonthDay( ++ result, ++ "M05", 2, ++ "PlainMonthDay is copied", ++ /* isoYear = */ 2000 ++); ++ ++assert.notSameValue( ++ result, ++ orig, ++ "When a PlainMonthDay is given, the returned value is not the original PlainMonthDay" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1a2d2cd042ce8620926605d0e6e395628ff27d64 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-leap-second.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.plainmonthday.from ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { monthCode: "M11", day: 18, calendar }; ++const result1 = Temporal.PlainMonthDay.from(arg); ++TemporalHelpers.assertPlainMonthDay( ++ result1, ++ "M11", 18, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = Temporal.PlainMonthDay.from(arg); ++TemporalHelpers.assertPlainMonthDay( ++ result2, ++ "M11", 18, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..56eec0c4271cda00eebaa8fd7567fa8599d03e4e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-number.js +@@ -0,0 +1,40 @@ ++// 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.plainmonthday.from ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = 19970327; ++ ++let arg = { monthCode: "M11", day: 18, calendar }; ++const result1 = Temporal.PlainMonthDay.from(arg); ++TemporalHelpers.assertPlainMonthDay(result1, "M11", 18, "19970327 is a valid ISO string for calendar"); ++ ++arg = { monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = Temporal.PlainMonthDay.from(arg); ++TemporalHelpers.assertPlainMonthDay(result2, "M11", 18, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainMonthDay.from(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainMonthDay.from(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fceeb50eabbeac0e46ef4c068a23513d935d1619 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,44 @@ ++// 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.plainmonthday.from ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => Temporal.PlainMonthDay.from(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => Temporal.PlainMonthDay.from(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => Temporal.PlainMonthDay.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => Temporal.PlainMonthDay.from(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => Temporal.PlainMonthDay.from(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c71ce5ee2d7aaed946994e9b55aee974e84725bb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plainmonthday.from ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++ ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainMonthDay.from(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..42ea70dfd26d08d1c97845633cfbd22c1c1f9b45 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/argument-wrong-type.js +@@ -0,0 +1,34 @@ ++// 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.plainmonthday.from ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainMonthDay ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.PlainMonthDay.from(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainMonthDay, "Temporal.PlainMonthDay, object"], ++ [Temporal.PlainMonthDay.prototype, "Temporal.PlainMonthDay.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.PlainMonthDay.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/calendar-monthdayfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/calendar-monthdayfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..aa302eb1aba1bd2b90c240f022082d8f6f90c6ff +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/calendar-monthdayfromfields-called-with-options-undefined.js +@@ -0,0 +1,23 @@ ++// 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.plainmonthday.from ++description: > ++ Calendar.monthDayFromFields method is called with undefined as the options ++ value when call originates internally ++features: [Temporal] ++---*/ ++ ++const realMonthDayFromFields = Temporal.Calendar.prototype.monthDayFromFields; ++let monthDayFromFieldsCallCount = 0; ++Temporal.Calendar.prototype.monthDayFromFields = function (fields, options) { ++ monthDayFromFieldsCallCount++; ++ assert.sameValue(options, undefined, "monthDayFromFields shouldn't be called with options"); ++ return realMonthDayFromFields.call(this, fields, options); ++} ++ ++Temporal.PlainMonthDay.from("2000-05-02"); ++assert.sameValue(monthDayFromFieldsCallCount, 1); ++ ++Temporal.Calendar.prototype.monthDayFromFields = realMonthDayFromFields; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..450a2f832cb9341ca5523ed007f86ea089e863ff +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/leap-second.js +@@ -0,0 +1,41 @@ ++// 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.plainmonthday.from ++description: Leap second is a valid ISO string for PlainMonthDay ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++ ++const result1 = Temporal.PlainMonthDay.from(arg); ++TemporalHelpers.assertPlainMonthDay( ++ result1, ++ "M12", 31, ++ "leap second is a valid ISO string for PlainMonthDay" ++); ++ ++const result2 = Temporal.PlainMonthDay.from(arg, { overflow: "reject" }); ++TemporalHelpers.assertPlainMonthDay( ++ result2, ++ "M12", 31, ++ "leap second is a valid ISO string for PlainMonthDay" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++ ++const result3 = Temporal.PlainMonthDay.from(arg); ++TemporalHelpers.assertPlainMonthDay( ++ result3, ++ "M12", 31, ++ "second: 60 is ignored in property bag for PlainMonthDay" ++); ++ ++const result4 = Temporal.PlainMonthDay.from(arg, { overflow: "reject" }); ++TemporalHelpers.assertPlainMonthDay( ++ result4, ++ "M12", 31, ++ "second: 60 is ignored in property bag for PlainMonthDay even with overflow: reject" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c4c559bc6a89b3773cdd1ae75b1257632815bc1f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/options-wrong-type.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.plainmonthday.from ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++for (const value of badOptions) { ++ assert.throws(TypeError, () => Temporal.PlainMonthDay.from({ monthCode: "M12", day: 15 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/overflow-invalid-string.js +index c2427006fdc9d7cf94681de71d2228cc942094d5..48ccf8436433280254bc6c26190fab67dfb5c5d9 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/overflow-invalid-string.js +@@ -27,6 +27,14 @@ const validValues = [ + { monthCode: "M05", day: 2 }, + "05-02", + ]; +-validValues.forEach((value) => { +- assert.throws(RangeError, () => Temporal.PlainMonthDay.from(value, { overflow: "other string" })); +-}); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const value of validValues) { ++ for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainMonthDay.from(value, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++ } ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/year-zero.js +index 347dba092828b3129b07934a8e5b2b19fb0108ac..782debd933a6925aee9242bac6fc76c07beb60a4 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/from/year-zero.js +@@ -8,15 +8,16 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- "-000000-08", +- "-000000-08-24", +- "-000000-08-24T15:43:27", +- "-000000-08-24T15:43:27+01:00[UTC]" ++ "-000000-08-24", ++ "-000000-08-24T15:43:27", ++ "-000000-08-24T15:43:27+01:00", ++ "-000000-08-24T15:43:27+00:00[UTC]", + ]; ++ + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => { Temporal.PlainMonthDay.from(arg); }, ++ () => Temporal.PlainMonthDay.from(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b24f80790fe97a91b98a99fdc072815d3bf0aace +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.plainmonthday.prototype.equals ++description: A number is converted to a string, then to Temporal.PlainMonthDay ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainMonthDay(11, 18); ++ ++const arg = 1118; ++ ++const result = instance.equals(arg); ++assert.sameValue(result, true, "1118 is a valid ISO string for PlainMonthDay"); ++ ++const numbers = [ ++ 1, ++ -1118, ++ 12345, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainMonthDay` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..202f5f4318d39a77a1294abdd4f386a90a38c8fb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.plainmonthday.prototype.equals ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainMonthDay(11, 18); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { monthCode: "M11", day: 18, calendar }; ++const result1 = instance.equals(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.equals(arg); ++assert.sameValue( ++ result2, ++ true, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..be40e79001a171c3a7ffe8f2e1d4d8c45ecf0ec8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.plainmonthday.prototype.equals ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainMonthDay(11, 18); ++ ++const calendar = 19970327; ++ ++let arg = { monthCode: "M11", day: 18, calendar }; ++const result1 = instance.equals(arg); ++assert.sameValue(result1, true, "19970327 is a valid ISO string for calendar"); ++ ++arg = { monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.equals(arg); ++assert.sameValue(result2, true, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b3b856b20b01ddfefc13d01256f5c0bd8a26c57a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.plainmonthday.prototype.equals ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainMonthDay(5, 2); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.equals(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b50c75421c34bfb2a6ff3dcf626efd860f3c2431 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plainmonthday.prototype.equals ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainMonthDay(5, 2); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-wrong-type.js +index c89ad73130edee5c0e94969b48e82f405f3be9fb..8c91b61fc4b5adaa5f67ca720fd953c082fced3d 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/argument-wrong-type.js +@@ -1,20 +1,36 @@ +-// Copyright (C) 2020 Igalia, S.L. All rights reserved. ++// 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.plainmonthday.prototype.equals +-description: Appropriate error thrown when argument cannot be converted to a valid string +-features: [Symbol, Temporal] ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainMonthDay ++features: [BigInt, Symbol, Temporal] + ---*/ + +-const instance = Temporal.PlainMonthDay.from({ month: 5, day: 2 }); ++const instance = new Temporal.PlainMonthDay(5, 2); + +-assert.throws(RangeError, () => instance.equals(undefined), "undefined"); +-assert.throws(RangeError, () => instance.equals(null), "null"); +-assert.throws(RangeError, () => instance.equals(true), "true"); +-assert.throws(RangeError, () => instance.equals(""), "empty string"); +-assert.throws(TypeError, () => instance.equals(Symbol()), "symbol"); +-assert.throws(RangeError, () => instance.equals(1), "1"); +-assert.throws(TypeError, () => instance.equals({}), "plain object"); +-assert.throws(TypeError, () => instance.equals(Temporal.PlainMonthDay), "Temporal.PlainMonthDay"); +-assert.throws(TypeError, () => instance.equals(Temporal.PlainMonthDay.prototype), "Temporal.PlainMonthDay.prototype"); ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainMonthDay, "Temporal.PlainMonthDay, object"], ++ [Temporal.PlainMonthDay.prototype, "Temporal.PlainMonthDay.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/calendar-monthdayfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/calendar-monthdayfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..649812219f9dade5da0a10d2c15c73a1932e8386 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/calendar-monthdayfromfields-called-with-options-undefined.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. ++ ++/*--- ++esid: sec-temporal.plainmonthday.prototype.equals ++description: > ++ Calendar.monthDayFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainMonthDay(5, 2, calendar); ++instance.equals({ monthCode: "M05", day: 3, calendar }); ++assert.sameValue(calendar.monthDayFromFieldsCallCount, 1); ++ ++// Test again, but overriding the global Temporal.Calendar.prototype method so ++// we can observe the call to monthDayFromFields() on the ISO8601 calendar ++// that occurs when we parse the string ++ ++const realMonthDayFromFields = Temporal.Calendar.prototype.monthDayFromFields; ++let monthDayFromFieldsCallCount = 0; ++Temporal.Calendar.prototype.monthDayFromFields = function (fields, options) { ++ monthDayFromFieldsCallCount++; ++ assert.sameValue(options, undefined, "monthDayFromFields shouldn't be called with options"); ++ return realMonthDayFromFields.call(this, fields, options); ++} ++ ++instance.equals("2000-05-03"); ++assert.sameValue(monthDayFromFieldsCallCount, 1); ++ ++Temporal.Calendar.prototype.monthDayFromFields = realMonthDayFromFields; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f950ce0f1d892d129e935a64866394508b79922d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.plainmonthday.prototype.equals ++description: Leap second is a valid ISO string for PlainMonthDay ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainMonthDay(12, 31); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.equals(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for PlainMonthDay" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.equals(arg); ++assert.sameValue( ++ result2, ++ true, ++ "second: 60 is ignored in property bag for PlainMonthDay" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/year-zero.js +index f420f38b46ab60a5beffdf4b7ea49a509276afda..155b4a114a195154989cb72042b8e3492c0753b5 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/equals/year-zero.js +@@ -8,10 +8,10 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- "-000000-08", +- "-000000-08-24", +- "-000000-08-24T15:43:27", +- "-000000-08-24T15:43:27+01:00[UTC]" ++ "-000000-08-24", ++ "-000000-08-24T15:43:27", ++ "-000000-08-24T15:43:27+01:00", ++ "-000000-08-24T15:43:27+00:00[UTC]", + ]; + const instance = new Temporal.PlainMonthDay(5, 2); + invalidStrings.forEach((arg) => { +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toJSON/year-format.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toJSON/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..90b633fb299fb3ee7c26386e7a3e6cec9e469005 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toJSON/year-format.js +@@ -0,0 +1,55 @@ ++// 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.plainmonthday.prototype.tojson ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++// For PlainMonthDay, the ISO reference year is only present in the string if ++// the calendar is not ISO 8601 ++class NotISO extends Temporal.Calendar { ++ constructor() { super("iso8601"); } ++ toString() { return "not-iso"; } ++} ++const calendar = new NotISO(); ++ ++let instance = new Temporal.PlainMonthDay(12, 3, calendar, -100000); ++assert.sameValue(instance.toJSON(), "-100000-12-03[u-ca=not-iso]", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(4, 5, calendar, -10000); ++assert.sameValue(instance.toJSON(), "-010000-04-05[u-ca=not-iso]", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(6, 7, calendar, -9999); ++assert.sameValue(instance.toJSON(), "-009999-06-07[u-ca=not-iso]", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(8, 9, calendar, -1000); ++assert.sameValue(instance.toJSON(), "-001000-08-09[u-ca=not-iso]", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(10, 9, calendar, -999); ++assert.sameValue(instance.toJSON(), "-000999-10-09[u-ca=not-iso]", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(8, 7, calendar, -1); ++assert.sameValue(instance.toJSON(), "-000001-08-07[u-ca=not-iso]", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(6, 5, calendar, 0); ++assert.sameValue(instance.toJSON(), "0000-06-05[u-ca=not-iso]", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.PlainMonthDay(4, 3, calendar, 1); ++assert.sameValue(instance.toJSON(), "0001-04-03[u-ca=not-iso]", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.PlainMonthDay(2, 10, calendar, 999); ++assert.sameValue(instance.toJSON(), "0999-02-10[u-ca=not-iso]", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainMonthDay(1, 23, calendar, 1000); ++assert.sameValue(instance.toJSON(), "1000-01-23[u-ca=not-iso]", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainMonthDay(4, 5, calendar, 9999); ++assert.sameValue(instance.toJSON(), "9999-04-05[u-ca=not-iso]", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainMonthDay(6, 7, calendar, 10000); ++assert.sameValue(instance.toJSON(), "+010000-06-07[u-ca=not-iso]", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(8, 9, calendar, 100000); ++assert.sameValue(instance.toJSON(), "+100000-08-09[u-ca=not-iso]", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-always.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-always.js +index fadff8929f487870240c9dec880f327c208d4c34..4d1d85b67976ce70bd984adf2b9fbc3e9252803a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-always.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/calendarname-always.js +@@ -8,9 +8,9 @@ features: [Temporal] + ---*/ + + const tests = [ +- [[], "05-02[u-ca=iso8601]"], ++ [[], "1972-05-02[u-ca=iso8601]"], + [[{ toString() { return "custom"; } }], "1972-05-02[u-ca=custom]"], +- [[{ toString() { return "iso8601"; } }], "05-02[u-ca=iso8601]"], ++ [[{ toString() { return "iso8601"; } }], "1972-05-02[u-ca=iso8601]"], + [[{ toString() { return "ISO8601"; } }], "1972-05-02[u-ca=ISO8601]"], + [[{ toString() { return "\u0131so8601"; } }], "1972-05-02[u-ca=\u0131so8601]"], // dotless i + ]; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..67575fe09f8ef70cc1d1e56e331117b188c6835b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plainmonthday.prototype.tostring ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainMonthDay(5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.toString(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/year-format.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3898ff66b655dc93930101eabe50b74105286257 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/toString/year-format.js +@@ -0,0 +1,55 @@ ++// 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.plainmonthday.prototype.tostring ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++// For PlainMonthDay, the ISO reference year is only present in the string if ++// the calendar is not ISO 8601 ++class NotISO extends Temporal.Calendar { ++ constructor() { super("iso8601"); } ++ toString() { return "not-iso"; } ++} ++const calendar = new NotISO(); ++ ++let instance = new Temporal.PlainMonthDay(12, 3, calendar, -100000); ++assert.sameValue(instance.toString(), "-100000-12-03[u-ca=not-iso]", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(4, 5, calendar, -10000); ++assert.sameValue(instance.toString(), "-010000-04-05[u-ca=not-iso]", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(6, 7, calendar, -9999); ++assert.sameValue(instance.toString(), "-009999-06-07[u-ca=not-iso]", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(8, 9, calendar, -1000); ++assert.sameValue(instance.toString(), "-001000-08-09[u-ca=not-iso]", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(10, 9, calendar, -999); ++assert.sameValue(instance.toString(), "-000999-10-09[u-ca=not-iso]", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(8, 7, calendar, -1); ++assert.sameValue(instance.toString(), "-000001-08-07[u-ca=not-iso]", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(6, 5, calendar, 0); ++assert.sameValue(instance.toString(), "0000-06-05[u-ca=not-iso]", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.PlainMonthDay(4, 3, calendar, 1); ++assert.sameValue(instance.toString(), "0001-04-03[u-ca=not-iso]", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.PlainMonthDay(2, 10, calendar, 999); ++assert.sameValue(instance.toString(), "0999-02-10[u-ca=not-iso]", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainMonthDay(1, 23, calendar, 1000); ++assert.sameValue(instance.toString(), "1000-01-23[u-ca=not-iso]", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainMonthDay(4, 5, calendar, 9999); ++assert.sameValue(instance.toString(), "9999-04-05[u-ca=not-iso]", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainMonthDay(6, 7, calendar, 10000); ++assert.sameValue(instance.toString(), "+010000-06-07[u-ca=not-iso]", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.PlainMonthDay(8, 9, calendar, 100000); ++assert.sameValue(instance.toString(), "+100000-08-09[u-ca=not-iso]", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5dbd34864b031f790186295c6e550910a0c5bf52 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plainmonthday.prototype.with ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainMonthDay(5, 2); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.with({ day: 5 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/overflow-invalid-string.js +index 5ed47e975385b504ba8a55d631e7a796b9050c6a..0036dfe638022079dacf96c9aefddd0576d8158c 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainMonthDay/prototype/with/overflow-invalid-string.js +@@ -17,6 +17,12 @@ features: [Temporal] + ---*/ + + const monthday = new Temporal.PlainMonthDay(5, 2); +-for (const overflow of ["", "CONSTRAIN", "balance", "other string", "constra\u0131n"]) { +- assert.throws(RangeError, () => monthday.with({ day: 8 }, { overflow })); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => monthday.with({ day: 8 }, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..aedb3f9b84ddd0f910b011b15fa753cf428f0b70 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-number.js +@@ -0,0 +1,35 @@ ++// 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.plaintime.compare ++description: A number is converted to a string, then to Temporal.PlainTime ++features: [Temporal] ++---*/ ++ ++const arg = 123456.987654321; ++ ++const result1 = Temporal.PlainTime.compare(arg, new Temporal.PlainTime(12, 34, 56, 987, 654, 321)); ++assert.sameValue(result1, 0, "123456.987654321 is a valid ISO string for PlainTime (first argument)"); ++const result2 = Temporal.PlainTime.compare(new Temporal.PlainTime(12, 34, 56, 987, 654, 321), arg); ++assert.sameValue(result2, 0, "123456.987654321 is a valid ISO string for PlainTime (second argument)"); ++ ++const numbers = [ ++ 1, ++ -123456.987654321, ++ 1234567, ++ 123456.9876543219, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainTime.compare(arg, new Temporal.PlainTime(12, 34, 56, 987, 654, 321)), ++ `Number ${arg} does not convert to a valid ISO string for PlainTime (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainTime.compare(new Temporal.PlainTime(12, 34, 56, 987, 654, 321), arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainTime (second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-string-time-designator-required-for-disambiguation.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-string-time-designator-required-for-disambiguation.js +index 1fc7ead2d00bc2ab06cbd87189056d560b051a56..a3cbbf96ee84553a8e6ce198bc0fa84fda404ba8 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-string-time-designator-required-for-disambiguation.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-string-time-designator-required-for-disambiguation.js +@@ -33,6 +33,18 @@ ambiguousStrings.forEach((string) => { + arg = `T${string}`; + Temporal.PlainTime.compare(arg, midnight); + Temporal.PlainTime.compare(midnight, arg); ++ ++ arg = ` ${string}`; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainTime.compare(arg, midnight), ++ 'space is not accepted as a substitute for T prefix (first argument)' ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainTime.compare(midnight, arg), ++ 'space is not accepted as a substitute for T prefix (second argument)' ++ ); + }); + + // None of these should throw without a T prefix, because they are unambiguously time strings: +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9efa7f69f0061307ff9edb857ca5fd3a6810be00 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plaintime.compare ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.PlainTime.compare(arg, new Temporal.PlainTime(12, 34, 56, 987, 654, 321)), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.PlainTime.compare(new Temporal.PlainTime(12, 34, 56, 987, 654, 321), arg), `${description} does not convert to a valid ISO string (second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainTime, "Temporal.PlainTime, object"], ++ [Temporal.PlainTime.prototype, "Temporal.PlainTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.PlainTime.compare(arg, new Temporal.PlainTime(12, 34, 56, 987, 654, 321)), `${description} is not a valid property bag and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.PlainTime.compare(new Temporal.PlainTime(12, 34, 56, 987, 654, 321), arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..186fed3a8e50f74c6cb9590be8f2943851ab2533 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/leap-second.js +@@ -0,0 +1,20 @@ ++// 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.plaintime.compare ++description: Leap second is a valid ISO string for PlainTime ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = Temporal.PlainTime.compare(arg, new Temporal.PlainTime(23, 59, 59)); ++assert.sameValue(result1, 0, "leap second is a valid ISO string for PlainTime (first argument)"); ++const result2 = Temporal.PlainTime.compare(new Temporal.PlainTime(23, 59, 59), arg); ++assert.sameValue(result2, 0, "leap second is a valid ISO string for PlainTime (first argument)"); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result3 = Temporal.PlainTime.compare(arg, new Temporal.PlainTime(23, 59, 59)); ++assert.sameValue(result3, 0, "second: 60 is ignored in property bag for PlainTime (first argument)"); ++const result4 = Temporal.PlainTime.compare(new Temporal.PlainTime(23, 59, 59), arg); ++assert.sameValue(result4, 0, "second: 60 is ignored in property bag for PlainTime (second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/plaintime-propertybag-no-time-units.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/plaintime-propertybag-no-time-units.js +index 9b0d146d55b5d3c7a99234ed57cb708caa12bd02..e9c7ddef2bf43233412ec58d8e2d5dfc2b62bea2 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/plaintime-propertybag-no-time-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/plaintime-propertybag-no-time-units.js +@@ -8,7 +8,7 @@ features: [Temporal] + ---*/ + + const props = {}; +-assert.throws(TypeError, () => Temporal.PlainTime.compare(props, new Temporal.PlainTime(0, 30)), "TypeError if at least one property is not present"); ++assert.throws(TypeError, () => Temporal.PlainTime.compare(props, new Temporal.PlainTime(0, 30)), "TypeError if no properties are present"); + + props.minute = 30; + const result = Temporal.PlainTime.compare(props, new Temporal.PlainTime(0, 30)); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/year-zero.js +index 470b42fda1c665e0a421d4b98bf6375c2baa1207..ca3d4b5e4765d7ec9be2c444e788224156fa0a83 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/compare/year-zero.js +@@ -8,16 +8,22 @@ features: [Temporal] + ---*/ + + const time = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); +-const bad = "-000000-12-07T03:24:30"; ++const invalidStrings = [ ++ "-000000-12-07T03:24:30", ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", ++]; + +-assert.throws( +- RangeError, +- () => Temporal.PlainTime.compare(bad, time), +- "Cannot use minus zero as extended year (first argument)" +-); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainTime.compare(arg, time), ++ "Cannot use minus zero as extended year (first argument)" ++ ); + +-assert.throws( +- RangeError, +- () => Temporal.PlainTime.compare(time, bad), +- "Cannot use minus zero as extended year (second argument)" +-); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainTime.compare(time, arg), ++ "Cannot use minus zero as extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bc83036e0f82018963290f997d874e3843f6fe24 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.plaintime.from ++description: A number is converted to a string, then to Temporal.PlainTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const arg = 123456.987654321; ++ ++const result = Temporal.PlainTime.from(arg); ++TemporalHelpers.assertPlainTime(result, 12, 34, 56, 987, 654, 321, "123456.987654321 is a valid ISO string for PlainTime"); ++ ++const numbers = [ ++ 1, ++ -123456.987654321, ++ 1234567, ++ 123456.9876543219, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainTime.from(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-object-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-object-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..de580b23316feb92d49848f93aa7c39609d5cbf5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-object-leap-second.js +@@ -0,0 +1,23 @@ ++// 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.plaintime.from ++description: Object argument handles leap seconds according to the overflow option. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++for (const options of [undefined, {}, { overflow: "constrain" }]) { ++ TemporalHelpers.assertPlainTime(Temporal.PlainTime.from({ hour: 23, minute: 59, second: 60 }, options), ++ 23, 59, 59, 0, 0, 0); ++ TemporalHelpers.assertPlainTime(Temporal.PlainTime.from({ hour: 12, minute: 30, second: 60 }, options), ++ 12, 30, 59, 0, 0, 0); ++ TemporalHelpers.assertPlainTime(Temporal.PlainTime.from({ hour: 23, minute: 59, second: 60, millisecond: 170 }, options), ++ 23, 59, 59, 170, 0, 0); ++} ++ ++const options = { overflow: "reject" }; ++assert.throws(RangeError, () => Temporal.PlainTime.from({ hour: 23, minute: 59, second: 60 }, options)); ++assert.throws(RangeError, () => Temporal.PlainTime.from({ hour: 12, minute: 30, second: 60 }, options)); ++assert.throws(RangeError, () => Temporal.PlainTime.from({ hour: 23, minute: 59, second: 60, millisecond: 170 }, options)); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-object.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..59a69c880658290da7b848551e6fbbcd53318101 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-object.js +@@ -0,0 +1,21 @@ ++// 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.plaintime.from ++description: Plain object argument is supported and ignores plural properties ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from({ hour: 15, minute: 23 }), ++ 15, 23, 0, 0, 0, 0); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from({ minute: 30, microsecond: 555 }), ++ 0, 30, 0, 0, 555, 0); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from({ year: 2019, month: 10, day: 1, hour: 14, minute: 20, second: 36 }), ++ 14, 20, 36, 0, 0, 0); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from({ hours: 2, minute: 30, microsecond: 555 }), ++ 0, 30, 0, 0, 555, 0); ++ ++assert.throws(TypeError, () => Temporal.PlainTime.from({})); ++assert.throws(TypeError, () => Temporal.PlainTime.from({ minutes: 12 })); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-plaintime.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-plaintime.js +index 2c6af716f37b5602149f0ae041b8d70f8202c0fa..b00215ca270d69339d79f94cf6d9c4743626fcc5 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-plaintime.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-plaintime.js +@@ -4,11 +4,21 @@ + /*--- + esid: sec-temporal.plaintime.from + description: A PlainTime object is copied, not returned directly +-includes: [compareArray.js, temporalHelpers.js] ++includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const plainTime = Temporal.PlainTime.from("11:42:00"); +-const result = Temporal.PlainTime.from(plainTime); +-assert.notSameValue(result, plainTime); +-TemporalHelpers.assertPlainTime(result, 11, 42, 0, 0, 0, 0); ++const orig = new Temporal.PlainTime(11, 42, 0, 0, 0, 0); ++const result = Temporal.PlainTime.from(orig); ++ ++TemporalHelpers.assertPlainTime( ++ result, ++ 11, 42, 0, 0, 0, 0, ++ "PlainTime is copied" ++); ++ ++assert.notSameValue( ++ result, ++ orig, ++ "When a PlainTime is given, the returned value is not the original PlainTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cb960920eedbd487d77998d84b8fcd51e87795dd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-leap-second.js +@@ -0,0 +1,18 @@ ++// 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.plaintime.from ++description: Leap second is replaced by :59 in ISO strings. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++for (const options of [undefined, {}, { overflow: "constrain" }, { overflow: "reject" }]) { ++ TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("23:59:60", options), ++ 23, 59, 59, 0, 0, 0); ++ TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("12:30:60", options), ++ 12, 30, 59, 0, 0, 0); ++ TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("23:59:60.170", options), ++ 23, 59, 59, 170, 0, 0); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-time-designator-required-for-disambiguation.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-time-designator-required-for-disambiguation.js +index 15f5f105483b81ceef92128a3437f1c2c94a49c5..20dcb43eb41883023efb4db0a241f23c25c05a5a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-time-designator-required-for-disambiguation.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-time-designator-required-for-disambiguation.js +@@ -25,6 +25,13 @@ ambiguousStrings.forEach((string) => { + // The same string with a T prefix should not throw: + arg = `T${string}`; + Temporal.PlainTime.from(arg); ++ ++ arg = ` ${string}`; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainTime.from(arg), ++ "space is not accepted as a substitute for T prefix" ++ ); + }); + + // None of these should throw without a T prefix, because they are unambiguously time strings: +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9786937f3294b14346de04b4a840ed29d2fd5896 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-wrong-type.js +@@ -0,0 +1,34 @@ ++// 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.plaintime.from ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.PlainTime.from(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainTime, "Temporal.PlainTime, object"], ++ [Temporal.PlainTime.prototype, "Temporal.PlainTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.PlainTime.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5626c74666e4938851d4c4f38e759e4c5b1e0ed6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/leap-second.js +@@ -0,0 +1,40 @@ ++// 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.plaintime.from ++description: Leap second is a valid ISO string for PlainTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++ ++const result1 = Temporal.PlainTime.from(arg); ++TemporalHelpers.assertPlainTime( ++ result1, ++ 23, 59, 59, 0, 0, 0, ++ "leap second is a valid ISO string for PlainTime" ++); ++ ++const result2 = Temporal.PlainTime.from(arg, { overflow: "reject" }); ++TemporalHelpers.assertPlainTime( ++ result2, ++ 23, 59, 59, 0, 0, 0, ++ "leap second is a valid ISO string for PlainTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++ ++const result3 = Temporal.PlainTime.from(arg); ++TemporalHelpers.assertPlainTime( ++ result3, ++ 23, 59, 59, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainTime" ++); ++ ++assert.throws( ++ RangeError, ++ () => Temporal.PlainTime.from(arg, { overflow: "reject" }), ++ "second: 60 is rejected in property bag for PlainTime with overflow: reject" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/observable-get-overflow-argument-string-invalid.js +similarity index 100% +rename from JSTests/test262/test/built-ins/Temporal/PlainTime/from/argument-string-invalid.js +rename to JSTests/test262/test/built-ins/Temporal/PlainTime/from/observable-get-overflow-argument-string-invalid.js +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..587674dd12857d3252c68f993dc38a701c65c4a7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/options-wrong-type.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.plaintime.from ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++for (const value of badOptions) { ++ assert.throws(TypeError, () => Temporal.PlainTime.from({ hour: 12, minute: 34 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/overflow-constrain.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/overflow-constrain.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9048d1b7a0beec9d538b9f87dabaeb2329891207 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/overflow-constrain.js +@@ -0,0 +1,14 @@ ++// 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.plaintime.from ++description: constrain value for overflow option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from({ hour: 26 }, { overflow: "constrain" }), ++ 23, 0, 0, 0, 0, 0); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from({ hour: 22 }, { overflow: "constrain" }), ++ 22, 0, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js +index 856d071453e57e3212091f990c68069ed0640a20..dcefde8a682cc7cc1fcdb1f063c5035cdb302f7a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/overflow-invalid-string.js +@@ -19,8 +19,14 @@ const validValues = [ + { hour: 12 }, + "12:00", + ]; +-validValues.forEach((value) => { +- ["", "CONSTRAIN", "balance", "other string", "constra\u0131n"].forEach((overflow) => { +- assert.throws(RangeError, () => Temporal.PlainTime.from(value, { overflow })); +- }); +-}); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const value of validValues) { ++ for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainTime.from(value, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++ } ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/overflow-reject.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/overflow-reject.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7f76deab506a7f4b66f33716f2bd7a3b359332d0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/overflow-reject.js +@@ -0,0 +1,13 @@ ++// 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.plaintime.from ++description: reject value for overflow option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++assert.throws(RangeError, () => Temporal.PlainTime.from({ hour: 26 }, { overflow: "reject" })); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from({ hour: 22 }, { overflow: "reject" }), ++ 22, 0, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/year-zero.js +index 671e5c5c68a98e753d233c2a56b1c8da6d7f1f32..39b849c69b819484fda06218700e0c0a5ff88d28 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/from/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/from/year-zero.js +@@ -8,13 +8,15 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-12-07T03:24:30', +- '-000000-12-07T03:24:30+01:00[UTC]' ++ "-000000-12-07T03:24:30", ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; ++ + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => { Temporal.PlainTime.from(arg); }, ++ () => Temporal.PlainTime.from(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/negative-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/negative-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4959e4323df73303a23b046f3afb566a4743deef +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/negative-zero.js +@@ -0,0 +1,12 @@ ++// 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.plaintime ++description: Negative zero arguments are treated as zero. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(-0, -0, -0, -0, -0, -0); ++TemporalHelpers.assertPlainTime(plainTime, 0, 0, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-duration.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-duration.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0a4e1070f351b82919845bb2e8896fbaf9602c73 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-duration.js +@@ -0,0 +1,14 @@ ++// 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.plaintime.prototype.add ++description: Duration arguments are supported. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(15, 23, 30, 123, 456, 789); ++const duration = Temporal.Duration.from("PT16H"); ++TemporalHelpers.assertPlainTime(plainTime.add(duration), ++ 7, 23, 30, 123, 456, 789); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-higher-units.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-higher-units.js +new file mode 100644 +index 0000000000000000000000000000000000000000..af4913e217dafa0151acb5bf9d44fe62e6263b95 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-higher-units.js +@@ -0,0 +1,29 @@ ++// 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.plaintime.prototype.add ++description: Higher units are ignored. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(15, 23, 30, 123, 456, 789); ++const values = [ ++ new Temporal.Duration(0, 0, 0, 1), ++ new Temporal.Duration(0, 0, 1), ++ new Temporal.Duration(0, 1), ++ new Temporal.Duration(1), ++ { days: 1 }, ++ { weeks: 1 }, ++ { months: 1 }, ++ { years: 1 }, ++ "P1D", ++ "P1W", ++ "P1M", ++ "P1Y", ++]; ++for (const value of values) { ++ TemporalHelpers.assertPlainTime(plainTime.add(value), ++ 15, 23, 30, 123, 456, 789); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-object.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4f0bdaa2b5f511a97b11a4944113818cd5ea6f6c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/add/argument-object.js +@@ -0,0 +1,37 @@ ++// 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.plaintime.prototype.add ++description: Plain object arguments are supported. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.add({ hours: 16 }), ++ 7, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.add({ minutes: 45 }), ++ 16, 8, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.add({ seconds: 800 }), ++ 15, 36, 50, 123, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.add({ milliseconds: 800 }), ++ 15, 23, 30, 923, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.add({ microseconds: 800 }), ++ 15, 23, 30, 124, 256, 789); ++TemporalHelpers.assertPlainTime(plainTime.add({ nanoseconds: 300 }), ++ 15, 23, 30, 123, 457, 89); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("07:23:30.123456789").add({ hours: -16 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("16:08:30.123456789").add({ minutes: -45 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("15:36:50.123456789").add({ seconds: -800 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("15:23:30.923456789").add({ milliseconds: -800 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("15:23:30.124256789").add({ microseconds: -800 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("15:23:30.123457089").add({ nanoseconds: -300 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.add({ minute: 1, hours: 1 }), ++ 16, 23, 30, 123, 456, 789); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4894d5934e4fad727f6431ad95e548995e235c9c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.plaintime.prototype.equals ++description: A number is converted to a string, then to Temporal.PlainTime ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const arg = 123456.987654321; ++ ++const result = instance.equals(arg); ++assert.sameValue(result, true, "123456.987654321 is a valid ISO string for PlainTime"); ++ ++const numbers = [ ++ 1, ++ -123456.987654321, ++ 1234567, ++ 123456.9876543219, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-designator-required-for-disambiguation.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-designator-required-for-disambiguation.js +index ca750d2eb7977f70241f054c5ca81fa7b7a734d9..b5efb776c3d3836f96698ace715b4ca3dbe30b71 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-designator-required-for-disambiguation.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-string-time-designator-required-for-disambiguation.js +@@ -27,6 +27,13 @@ ambiguousStrings.forEach((string) => { + // The same string with a T prefix should not throw: + arg = `T${string}`; + instance.equals(arg); ++ ++ arg = ` ${string}`; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ "space is not accepted as a substitute for T prefix" ++ ); + }); + + // None of these should throw without a T prefix, because they are unambiguously time strings: +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-wrong-type.js +index d01e485613ad5bfaff6c65dac6fc11baa251751a..70bb470a9e5400fc47357673ff092019ab37e208 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/argument-wrong-type.js +@@ -1,20 +1,36 @@ +-// Copyright (C) 2020 Igalia, S.L. All rights reserved. ++// 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.plaintime.prototype.equals +-description: Appropriate error thrown when argument cannot be converted to a valid string +-features: [Symbol, Temporal] ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainTime ++features: [BigInt, Symbol, Temporal] + ---*/ + +-const instance = Temporal.PlainTime.from({ minute: 34, second: 56, millisecond: 987, microsecond: 654, nanosecond: 321 }); ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + +-assert.throws(RangeError, () => instance.equals(undefined), "undefined"); +-assert.throws(RangeError, () => instance.equals(null), "null"); +-assert.throws(RangeError, () => instance.equals(true), "true"); +-assert.throws(RangeError, () => instance.equals(""), "empty string"); +-assert.throws(TypeError, () => instance.equals(Symbol()), "symbol"); +-assert.throws(RangeError, () => instance.equals(1), "1"); +-assert.throws(TypeError, () => instance.equals({}), "plain object"); +-assert.throws(TypeError, () => instance.equals(Temporal.PlainTime), "Temporal.PlainTime"); +-assert.throws(TypeError, () => instance.equals(Temporal.PlainTime.prototype), "Temporal.PlainTime.prototype"); ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainTime, "Temporal.PlainTime, object"], ++ [Temporal.PlainTime.prototype, "Temporal.PlainTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..066a2cafec658a5192781fa5b6ba12efdd4df2fc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.plaintime.prototype.equals ++description: Leap second is a valid ISO string for PlainTime ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(23, 59, 59); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.equals(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for PlainTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.equals(arg); ++assert.sameValue( ++ result2, ++ true, ++ "second: 60 is ignored in property bag for PlainTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/plaintime-propertybag-no-time-units.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/plaintime-propertybag-no-time-units.js +index 1b4edfa6a293d0b810e43e492f386f9971b93bce..d342498899207ab737df0eecc5a3b91a6d96e670 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/plaintime-propertybag-no-time-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/plaintime-propertybag-no-time-units.js +@@ -10,7 +10,7 @@ features: [Temporal] + const instance = new Temporal.PlainTime(0, 30, 0, 0, 0, 0); + + const props = {}; +-assert.throws(TypeError, () => instance.equals(props), "TypeError if at least one property is not present"); ++assert.throws(TypeError, () => instance.equals(props), "TypeError if no properties are present"); + + props.minute = 30; + const result = instance.equals(props); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/year-zero.js +index c58365d4b0574edba237e88756d2d0cc140e11f8..56ea599d8a2096dfcb51afca8e5ca8f908ddec1b 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/equals/year-zero.js +@@ -8,8 +8,9 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-12-07T03:24:30', +- '-000000-12-07T03:24:30+01:00[UTC]' ++ "-000000-12-07T03:24:30", ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + invalidStrings.forEach((arg) => { +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2edf4591a14a5fe4476387e2df07298a42896185 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/options-wrong-type.js +@@ -0,0 +1,24 @@ ++// 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.plaintime.prototype.round ++description: TypeError thrown when options argument is missing or a non-string primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ undefined, ++ null, ++ true, ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainTime(); ++assert.throws(TypeError, () => instance.round(), "TypeError on missing options argument"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.round(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/rounding-cross-midnight.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/rounding-cross-midnight.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9b281783144ae5833832f59acac5304044a99ce3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/rounding-cross-midnight.js +@@ -0,0 +1,14 @@ ++// 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.plaintime.prototype.round ++description: Rounding can cross midnight ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = Temporal.PlainTime.from("23:59:59.999999999"); ++for (const smallestUnit of ["hour", "minute", "second", "millisecond", "microsecond"]) { ++ TemporalHelpers.assertPlainTime(plainTime.round({ smallestUnit }), 0, 0, 0, 0, 0, 0); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-hours.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-hours.js +new file mode 100644 +index 0000000000000000000000000000000000000000..666fd223d0b57e479408c5e9454fceabf96f80d1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-hours.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. ++ ++/*--- ++esid: sec-temporal.plaintime.prototype.round ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(3, 34, 56, 987, 654, 321); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hours", roundingIncrement: 1 }), ++ 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hours", roundingIncrement: 2 }), ++ 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hours", roundingIncrement: 3 }), ++ 3, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hours", roundingIncrement: 4 }), ++ 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hours", roundingIncrement: 6 }), ++ 6, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hours", roundingIncrement: 8 }), ++ 0, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hours", roundingIncrement: 12 }), ++ 0, 0, 0, 0, 0, 0, "hours"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..185875418fb703e2e929d03f98df236e84b150ae +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-invalid.js +@@ -0,0 +1,23 @@ ++// 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.plaintime.prototype.round ++description: Tests roundingIncrement restrictions. ++features: [Temporal] ++---*/ ++ ++const plainTime = Temporal.PlainTime.from("08:22:36.123456789"); ++ ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "hours", roundingIncrement: 11 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "minutes", roundingIncrement: 29 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "seconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "hours", roundingIncrement: 24 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "minutes", roundingIncrement: 60 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "seconds", roundingIncrement: 60 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 1000 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 1000 })); ++assert.throws(RangeError, () => plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 1000 })); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-microseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-microseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6eb685312a6dbb5664a5d49bdce30a903ef1db19 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-microseconds.js +@@ -0,0 +1,57 @@ ++// 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.plaintime.prototype.round ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(3, 34, 56, 987, 654, 321); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 1 }), ++ 3, 34, 56, 987, 654, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 2 }), ++ 3, 34, 56, 987, 654, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 4 }), ++ 3, 34, 56, 987, 656, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 5 }), ++ 3, 34, 56, 987, 655, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 8 }), ++ 3, 34, 56, 987, 656, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 10 }), ++ 3, 34, 56, 987, 650, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 20 }), ++ 3, 34, 56, 987, 660, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 25 }), ++ 3, 34, 56, 987, 650, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 40 }), ++ 3, 34, 56, 987, 640, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 50 }), ++ 3, 34, 56, 987, 650, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 100 }), ++ 3, 34, 56, 987, 700, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 125 }), ++ 3, 34, 56, 987, 625, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 200 }), ++ 3, 34, 56, 987, 600, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 250 }), ++ 3, 34, 56, 987, 750, 0, "microseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microseconds", roundingIncrement: 500 }), ++ 3, 34, 56, 987, 500, 0, "microseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-milliseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-milliseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a33615f4d1b934d8035f10f0f638df0b8e1cba1b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-milliseconds.js +@@ -0,0 +1,57 @@ ++// 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.plaintime.prototype.round ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(3, 34, 56, 987, 654, 321); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 1 }), ++ 3, 34, 56, 988, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 2 }), ++ 3, 34, 56, 988, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 4 }), ++ 3, 34, 56, 988, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 5 }), ++ 3, 34, 56, 990, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 8 }), ++ 3, 34, 56, 984, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 10 }), ++ 3, 34, 56, 990, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 20 }), ++ 3, 34, 56, 980, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 25 }), ++ 3, 34, 57, 0, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 40 }), ++ 3, 34, 57, 0, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 50 }), ++ 3, 34, 57, 0, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 100 }), ++ 3, 34, 57, 0, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 125 }), ++ 3, 34, 57, 0, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 200 }), ++ 3, 34, 57, 0, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 250 }), ++ 3, 34, 57, 0, 0, 0, "milliseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "milliseconds", roundingIncrement: 500 }), ++ 3, 34, 57, 0, 0, 0, "milliseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-minutes.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-minutes.js +new file mode 100644 +index 0000000000000000000000000000000000000000..297407eb17459b1475287f12810bcef508e6d0c1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-minutes.js +@@ -0,0 +1,45 @@ ++// 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.plaintime.prototype.round ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(3, 34, 56, 987, 654, 321); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 1 }), ++ 3, 35, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 2 }), ++ 3, 34, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 3 }), ++ 3, 36, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 4 }), ++ 3, 36, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 5 }), ++ 3, 35, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 6 }), ++ 3, 36, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 10 }), ++ 3, 30, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 12 }), ++ 3, 36, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 15 }), ++ 3, 30, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 20 }), ++ 3, 40, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minutes", roundingIncrement: 30 }), ++ 3, 30, 0, 0, 0, 0, "minutes"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-nanoseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-nanoseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0992ce73a2dc49c6892fc0644e57bd03d320dac4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-nanoseconds.js +@@ -0,0 +1,57 @@ ++// 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.plaintime.prototype.round ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(3, 34, 56, 987, 654, 321); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 1 }), ++ 3, 34, 56, 987, 654, 321, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 2 }), ++ 3, 34, 56, 987, 654, 322, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 4 }), ++ 3, 34, 56, 987, 654, 320, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 5 }), ++ 3, 34, 56, 987, 654, 320, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 8 }), ++ 3, 34, 56, 987, 654, 320, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 10 }), ++ 3, 34, 56, 987, 654, 320, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 20 }), ++ 3, 34, 56, 987, 654, 320, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 25 }), ++ 3, 34, 56, 987, 654, 325, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 40 }), ++ 3, 34, 56, 987, 654, 320, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 50 }), ++ 3, 34, 56, 987, 654, 300, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 100 }), ++ 3, 34, 56, 987, 654, 300, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 125 }), ++ 3, 34, 56, 987, 654, 375, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 200 }), ++ 3, 34, 56, 987, 654, 400, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 250 }), ++ 3, 34, 56, 987, 654, 250, "nanoseconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanoseconds", roundingIncrement: 500 }), ++ 3, 34, 56, 987, 654, 500, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-seconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-seconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..11bbb6a7a64eabd65d1f19b10e268e4b9e9e48ea +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingincrement-seconds.js +@@ -0,0 +1,45 @@ ++// 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.plaintime.prototype.round ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(3, 34, 56, 987, 654, 321); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 1 }), ++ 3, 34, 57, 0, 0, 0, "seconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 2 }), ++ 3, 34, 56, 0, 0, 0, "seconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 3 }), ++ 3, 34, 57, 0, 0, 0, "seconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 4 }), ++ 3, 34, 56, 0, 0, 0, "seconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 5 }), ++ 3, 34, 55, 0, 0, 0, "seconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 6 }), ++ 3, 34, 54, 0, 0, 0, "seconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 10 }), ++ 3, 35, 0, 0, 0, 0, "seconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 12 }), ++ 3, 35, 0, 0, 0, 0, "seconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 15 }), ++ 3, 35, 0, 0, 0, 0, "seconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 20 }), ++ 3, 35, 0, 0, 0, 0, "seconds"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "seconds", roundingIncrement: 30 }), ++ 3, 35, 0, 0, 0, 0, "seconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-ceil.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-ceil.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5628f4e8582557f98a3940024aea70fe8fa340ce +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-ceil.js +@@ -0,0 +1,36 @@ ++// 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.plaintime.prototype.round ++description: Tests calculations with roundingMode "ceil". ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const plainTime = Temporal.PlainTime.from("13:46:23.123456789"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hour", roundingMode: "ceil" }), ++ 14, 0, 0, 0, 0, 0, "hour"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minute", roundingMode: "ceil" }), ++ 13, 47, 0, 0, 0, 0, "minute"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "second", roundingMode: "ceil" }), ++ 13, 46, 24, 0, 0, 0, "second"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "millisecond", roundingMode: "ceil" }), ++ 13, 46, 23, 124, 0, 0, "millisecond"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microsecond", roundingMode: "ceil" }), ++ 13, 46, 23, 123, 457, 0, "microsecond"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanosecond", roundingMode: "ceil" }), ++ 13, 46, 23, 123, 456, 789, "nanosecond"); ++ +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-floor.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-floor.js +new file mode 100644 +index 0000000000000000000000000000000000000000..93d2c5603e15a0a65be1ed993b9bb2baf1c0ed9e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-floor.js +@@ -0,0 +1,35 @@ ++// 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.plaintime.prototype.round ++description: Tests calculations with roundingMode "floor". ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const plainTime = Temporal.PlainTime.from("13:46:23.123456789"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hour", roundingMode: "floor" }), ++ 13, 0, 0, 0, 0, 0, "hour"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minute", roundingMode: "floor" }), ++ 13, 46, 0, 0, 0, 0, "minute"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "second", roundingMode: "floor" }), ++ 13, 46, 23, 0, 0, 0, "second"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "millisecond", roundingMode: "floor" }), ++ 13, 46, 23, 123, 0, 0, "millisecond"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microsecond", roundingMode: "floor" }), ++ 13, 46, 23, 123, 456, 0, "microsecond"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanosecond", roundingMode: "floor" }), ++ 13, 46, 23, 123, 456, 789, "nanosecond"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-halfExpand.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-halfExpand.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f6fdd5e554c47aebe4993165bbd3c93262fc8c14 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-halfExpand.js +@@ -0,0 +1,35 @@ ++// 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.plaintime.prototype.round ++description: Tests calculations with roundingMode "floor". ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const plainTime = Temporal.PlainTime.from("13:46:23.123456789"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hour", roundingMode: "halfExpand" }), ++ 14, 0, 0, 0, 0, 0, "hour"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minute", roundingMode: "halfExpand" }), ++ 13, 46, 0, 0, 0, 0, "minute"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "second", roundingMode: "halfExpand" }), ++ 13, 46, 23, 0, 0, 0, "second"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "millisecond", roundingMode: "halfExpand" }), ++ 13, 46, 23, 123, 0, 0, "millisecond"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microsecond", roundingMode: "halfExpand" }), ++ 13, 46, 23, 123, 457, 0, "microsecond"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanosecond", roundingMode: "halfExpand" }), ++ 13, 46, 23, 123, 456, 789, "nanosecond"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js +index 200c100d2e841357bd436fd4e886dd21386684b6..ba3fa48a7e02b3dfe24542a6983cbe53caaf1518 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-invalid-string.js +@@ -8,6 +8,6 @@ features: [Temporal] + ---*/ + + const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); +-for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l"]) { ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { + assert.throws(RangeError, () => time.round({ smallestUnit: "microsecond", roundingMode })); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-trunc.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-trunc.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8975b381f342fbb5db93d5af37eb315658f1cc47 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-trunc.js +@@ -0,0 +1,35 @@ ++// 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.plaintime.prototype.round ++description: Tests calculations with roundingMode "trunc". ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const plainTime = Temporal.PlainTime.from("13:46:23.123456789"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hour", roundingMode: "trunc" }), ++ 13, 0, 0, 0, 0, 0, "hour"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minute", roundingMode: "trunc" }), ++ 13, 46, 0, 0, 0, 0, "minute"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "second", roundingMode: "trunc" }), ++ 13, 46, 23, 0, 0, 0, "second"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "millisecond", roundingMode: "trunc" }), ++ 13, 46, 23, 123, 0, 0, "millisecond"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microsecond", roundingMode: "trunc" }), ++ 13, 46, 23, 123, 456, 0, "microsecond"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanosecond", roundingMode: "trunc" }), ++ 13, 46, 23, 123, 456, 789, "nanosecond"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-undefined.js +index 9e02425c01eb84317a07ead1ee8d3586c381741e..bc3ef4131b3c27454428eeda11e893d13bcac097 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundingmode-undefined.js +@@ -1,26 +1,53 @@ +-// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// 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.plaintime.prototype.round +-description: Fallback value for roundingMode option +-includes: [temporalHelpers.js] ++description: Tests calculations with roundingMode undefined. + features: [Temporal] ++includes: [temporalHelpers.js] + ---*/ + +-const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); ++const plainTime = Temporal.PlainTime.from("13:46:23.123456789"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hour", roundingMode: undefined }), ++ 14, 0, 0, 0, 0, 0, "hour"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "hour" }), ++ 14, 0, 0, 0, 0, 0, "hour"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minute", roundingMode: undefined }), ++ 13, 46, 0, 0, 0, 0, "minute"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "minute" }), ++ 13, 46, 0, 0, 0, 0, "minute"); ++ ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "second", roundingMode: undefined }), ++ 13, 46, 23, 0, 0, 0, "second"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "second" }), ++ 13, 46, 23, 0, 0, 0, "second"); + +-const explicit1 = time.round({ smallestUnit: "microsecond", roundingMode: undefined }); +-TemporalHelpers.assertPlainTime(explicit1, 12, 34, 56, 123, 988, 0, "default roundingMode is halfExpand"); +-const implicit1 = time.round({ smallestUnit: "microsecond" }); +-TemporalHelpers.assertPlainTime(implicit1, 12, 34, 56, 123, 988, 0, "default roundingMode is halfExpand"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "millisecond", roundingMode: undefined }), ++ 13, 46, 23, 123, 0, 0, "millisecond"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "millisecond" }), ++ 13, 46, 23, 123, 0, 0, "millisecond"); + +-const explicit2 = time.round({ smallestUnit: "millisecond", roundingMode: undefined }); +-TemporalHelpers.assertPlainTime(explicit2, 12, 34, 56, 124, 0, 0, "default roundingMode is halfExpand"); +-const implicit2 = time.round({ smallestUnit: "millisecond" }); +-TemporalHelpers.assertPlainTime(implicit2, 12, 34, 56, 124, 0, 0, "default roundingMode is halfExpand"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microsecond", roundingMode: undefined }), ++ 13, 46, 23, 123, 457, 0, "microsecond"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "microsecond" }), ++ 13, 46, 23, 123, 457, 0, "microsecond"); + +-const explicit3 = time.round({ smallestUnit: "second", roundingMode: undefined }); +-TemporalHelpers.assertPlainTime(explicit3, 12, 34, 56, 0, 0, 0, "default roundingMode is halfExpand"); +-const implicit3 = time.round({ smallestUnit: "second" }); +-TemporalHelpers.assertPlainTime(implicit3, 12, 34, 56, 0, 0, 0, "default roundingMode is halfExpand"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanosecond", roundingMode: undefined }), ++ 13, 46, 23, 123, 456, 789, "nanosecond"); ++TemporalHelpers.assertPlainTime( ++ plainTime.round({ smallestUnit: "nanosecond" }), ++ 13, 46, 23, 123, 456, 789, "nanosecond"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundto-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundto-invalid-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..53a665f9518399399c8692cf0725f4b663805fa2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/roundto-invalid-string.js +@@ -0,0 +1,35 @@ ++// 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.plaintime.prototype.round ++description: RangeError thrown when smallestUnit option not one of the allowed string values ++features: [Temporal] ++---*/ ++ ++const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => time.round(smallestUnit), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-disallowed-units.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-disallowed-units.js +deleted file mode 100644 +index 1a9da4e74ac6987cb710ac3f8d9a3e793442e7fc..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-disallowed-units.js ++++ /dev/null +@@ -1,34 +0,0 @@ +-// Copyright (C) 2021 Igalia, S.L. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +- +-/*--- +-esid: sec-temporal.plaintime.prototype.round +-description: Specifically disallowed units for the smallestUnit option +-features: [Temporal, arrow-function] +----*/ +- +-const instance = new Temporal.PlainTime(12, 34, 56, 789, 999, 999); +-const invalidUnits = [ +- "era", +- "eras", +- "year", +- "month", +- "week", +- "years", +- "months", +- "weeks", +- "day", +- "days", +-]; +-invalidUnits.forEach((smallestUnit) => { +- assert.throws( +- RangeError, +- () => instance.round({ smallestUnit }), +- `{ smallestUnit: "${smallestUnit}" } should not be allowed as an argument to round` +- ); +- assert.throws( +- RangeError, +- () => instance.round(smallestUnit), +- `"${smallestUnit}" should not be allowed as an argument to round` +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-invalid-string.js +index 71a8d55f25d4e7dd31e34eaa371842afd5374652..917a5a409d29eba50c51ec302bab079e29a03499 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-invalid-string.js +@@ -8,4 +8,28 @@ features: [Temporal] + ---*/ + + const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); +-assert.throws(RangeError, () => time.round({ smallestUnit: "other string" })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => time.round({ smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-missing.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-missing.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c892b73361f359f965c055d5b655161d9e86a3fc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/round/smallestunit-missing.js +@@ -0,0 +1,13 @@ ++// 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.plaintime.prototype.round ++description: RangeError thrown when smallestUnit option is missing ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); ++assert.throws(TypeError, () => plainTime.round()); ++assert.throws(RangeError, () => plainTime.round({})); ++assert.throws(RangeError, () => plainTime.round({ roundingIncrement: 1, roundingMode: "ceil" })); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-cast.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-cast.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2303a0bdb4879b082a21c1686ffa8e9ac675fc1c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-cast.js +@@ -0,0 +1,18 @@ ++// 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.plaintime.prototype.since ++description: Casts the argument ++includes: [temporalHelpers.js] ++features: [Temporal, arrow-function] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertDuration(plainTime.since("16:34"), ++ 0, 0, 0, 0, /* hours = */ -1, /* minutes = */ -10, /* seconds = */ -29, -876, -543, -211, "string"); ++TemporalHelpers.assertDuration(plainTime.since({ hour: 16, minute: 34 }), ++ 0, 0, 0, 0, /* hours = */ -1, /* minutes = */ -10, /* seconds = */ -29, -876, -543, -211, "object"); ++ ++assert.throws(TypeError, () => plainTime.since({}), "empty"); ++assert.throws(TypeError, () => plainTime.since({ minutes: 30 }), "only plural 'minutes'"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3ca4003a0b21fe8c55ad16582905682c6e2af4eb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-number.js +@@ -0,0 +1,31 @@ ++// 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.plaintime.prototype.since ++description: A number is converted to a string, then to Temporal.PlainTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const arg = 123456.987654321; ++ ++const result = instance.since(arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "123456.987654321 is a valid ISO string for PlainTime"); ++ ++const numbers = [ ++ 1, ++ -123456.987654321, ++ 1234567, ++ 123456.9876543219, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-designator-required-for-disambiguation.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-designator-required-for-disambiguation.js +index 5318a2177bf250e569f2de21d6bb2c61b1c8cb42..2e9c362004a3b4f838ac9ae472636a4a94496ad2 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-designator-required-for-disambiguation.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-string-time-designator-required-for-disambiguation.js +@@ -27,6 +27,13 @@ ambiguousStrings.forEach((string) => { + // The same string with a T prefix should not throw: + arg = `T${string}`; + instance.since(arg); ++ ++ arg = ` ${string}`; ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ "space is not accepted as a substitute for T prefix" ++ ); + }); + + // None of these should throw without a T prefix, because they are unambiguously time strings: +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ee7142c89d235b94cd2152c2c85f70cf29b4d918 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plaintime.prototype.since ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainTime, "Temporal.PlainTime, object"], ++ [Temporal.PlainTime.prototype, "Temporal.PlainTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..06a55ca9be2483bbfdfdc7d1622a65ee7c5eb22b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/basic.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.plaintime.prototype.until ++description: Basic usage ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const one = new Temporal.PlainTime(15, 23, 30, 123, 456, 789); ++const two = new Temporal.PlainTime(14, 23, 30, 123, 456, 789); ++const three = new Temporal.PlainTime(13, 30, 30, 123, 456, 789); ++ ++TemporalHelpers.assertDuration(one.since(two), ++ 0, 0, 0, 0, /* hours = */ 1, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(two.since(one), ++ 0, 0, 0, 0, /* hours = */ -1, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(one.since(three), ++ 0, 0, 0, 0, /* hours = */ 1, 53, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(three.since(one), ++ 0, 0, 0, 0, /* hours = */ -1, -53, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/largestunit-invalid-string.js +index f74105aba5115bb8117f8989e7060cb44b57126a..0faa16156a0449a5379f36515e9f0a5920df4e01 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/largestunit-invalid-string.js +@@ -9,7 +9,28 @@ features: [Temporal] + + const earlier = new Temporal.PlainTime(12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainTime(13, 35, 57, 987, 654, 321); +-const values = ["era", "eraYear", "years", "months", "weeks", "days", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/largestunit.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/largestunit.js +index 1345c64361eae653d8427d53cb3bd58af918f4f6..799051aec8bd2ae1e5513b3c61174d6420c31b9c 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/largestunit.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/largestunit.js +@@ -3,13 +3,14 @@ + + /*--- + esid: sec-temporal.plaintime.prototype.since +-description: Specify behavior of PlainTime.since when largest specified unit is years or months. ++description: PlainTime.since with various largestUnit values. + includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + const fourFortyEight = new Temporal.PlainTime(4, 48, 55); + const elevenFiftyNine = new Temporal.PlainTime(11, 59, 58); + TemporalHelpers.assertDuration(elevenFiftyNine.since(fourFortyEight), 0, 0, 0, 0, 7, 11, 3, 0, 0, 0, 'does not include higher units than necessary (largest unit unspecified)'); ++TemporalHelpers.assertDuration(elevenFiftyNine.since(fourFortyEight, { largestUnit: 'auto' }), 0, 0, 0, 0, 7, 11, 3, 0, 0, 0, 'does not include higher units than necessary (largest unit is auto)'); + TemporalHelpers.assertDuration(elevenFiftyNine.since(fourFortyEight, { largestUnit: 'hours' }), 0, 0, 0, 0, 7, 11, 3, 0, 0, 0, 'does not include higher units than necessary (largest unit is hours)'); + TemporalHelpers.assertDuration(elevenFiftyNine.since(fourFortyEight, { largestUnit: 'minutes' }), 0, 0, 0, 0, 0, 431, 3, 0, 0, 0, 'does not include higher units than necessary (largest unit is minutes)'); + TemporalHelpers.assertDuration(elevenFiftyNine.since(fourFortyEight, { largestUnit: 'seconds' }), 0, 0, 0, 0, 0, 0, 25863, 0, 0, 0, 'does not include higher units than necessary (largest unit is seconds)'); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7457e58233eb6f524d2e76e8ad4d2793e2ebdd37 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/leap-second.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.plaintime.prototype.since ++description: Leap second is a valid ISO string for PlainTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(23, 59, 59); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f48b7c373bc1c12a5422e8f6592405a4473ed5cc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plaintime.prototype.since ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainTime(); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.since(new Temporal.PlainTime(12, 34, 56), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/plaintime-propertybag-no-time-units.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/plaintime-propertybag-no-time-units.js +index 51be13a45de81aaadbb0b7efc03ee7a366a859b9..5a725a16119ddae0375c3555a529a77e3a9521d6 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/plaintime-propertybag-no-time-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/plaintime-propertybag-no-time-units.js +@@ -11,7 +11,7 @@ features: [Temporal] + const instance = new Temporal.PlainTime(1, 0, 0, 0, 0, 1); + + const props = {}; +-assert.throws(TypeError, () => instance.since(props), "TypeError if at least one property is not present"); ++assert.throws(TypeError, () => instance.since(props), "TypeError if no properties are present"); + + props.minute = 30; + const result = instance.since(props); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/result-sub-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/result-sub-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3f2742fa316487521f5bd1fb3f8242c8fb20c186 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/result-sub-second.js +@@ -0,0 +1,21 @@ ++// 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.plaintime.prototype.since ++description: Supports sub-second precision ++includes: [temporalHelpers.js] ++features: [Temporal, arrow-function] ++---*/ ++ ++const time1 = Temporal.PlainTime.from("10:23:15"); ++const time2 = Temporal.PlainTime.from("17:15:57.250250250"); ++ ++TemporalHelpers.assertDuration(time2.since(time1, { largestUnit: "milliseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, /* milliseconds = */ 24762250, 250, 250, "milliseconds"); ++ ++TemporalHelpers.assertDuration(time2.since(time1, { largestUnit: "microseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, /* milliseconds = */ 0, 24762250250, 250, "microseconds"); ++ ++TemporalHelpers.assertDuration(time2.since(time1, { largestUnit: "nanoseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, /* milliseconds = */ 0, 0, 24762250250250, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-hours.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-hours.js +new file mode 100644 +index 0000000000000000000000000000000000000000..dc57609720cffeb0fb6daa50366d15ced1157c43 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-hours.js +@@ -0,0 +1,34 @@ ++// 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.plaintime.prototype.since ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingIncrement: 3 }), ++ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingIncrement: 6 }), ++ 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingIncrement: 8 }), ++ 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingIncrement: 12 }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "hours"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1daec9a1cae4882ffb200ea2ce604246bc670c9d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-invalid.js +@@ -0,0 +1,24 @@ ++// 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.plaintime.prototype.since ++description: Tests roundingIncrement restrictions. ++features: [Temporal] ++---*/ ++ ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "hours", roundingIncrement: 11 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 29 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "hours", roundingIncrement: 24 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 60 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 60 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 1000 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 1000 })); ++assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 1000 })); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-microseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-microseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ded0e0d90887b49dc7ff255f3135cd15c2655f1a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-microseconds.js +@@ -0,0 +1,58 @@ ++// 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.plaintime.prototype.since ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 196, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 5 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 195, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 8 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 192, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 10 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 190, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 20 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 180, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 25 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 175, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 40 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 160, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 50 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 150, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 100 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 100, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 125 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 125, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 200 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 0, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 250 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 0, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingIncrement: 500 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 0, 0, "microseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-milliseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-milliseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4a6c867dde8ceb711d7bbc5c518d6fc2137b9b94 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-milliseconds.js +@@ -0,0 +1,58 @@ ++// 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.plaintime.prototype.since ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 35, 23, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 10, 35, 23, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 5 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 8 }), ++ 0, 0, 0, 0, 10, 35, 23, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 10 }), ++ 0, 0, 0, 0, 10, 35, 23, 860, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 20 }), ++ 0, 0, 0, 0, 10, 35, 23, 860, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 25 }), ++ 0, 0, 0, 0, 10, 35, 23, 850, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 40 }), ++ 0, 0, 0, 0, 10, 35, 23, 840, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 50 }), ++ 0, 0, 0, 0, 10, 35, 23, 850, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 100 }), ++ 0, 0, 0, 0, 10, 35, 23, 800, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 125 }), ++ 0, 0, 0, 0, 10, 35, 23, 750, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 200 }), ++ 0, 0, 0, 0, 10, 35, 23, 800, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 250 }), ++ 0, 0, 0, 0, 10, 35, 23, 750, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingIncrement: 500 }), ++ 0, 0, 0, 0, 10, 35, 23, 500, 0, 0, "milliseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-minutes.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-minutes.js +new file mode 100644 +index 0000000000000000000000000000000000000000..05a62d426940c820358e39e65e0769ae1d1953cf +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-minutes.js +@@ -0,0 +1,46 @@ ++// 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.plaintime.prototype.since ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 35, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 34, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 3 }), ++ 0, 0, 0, 0, 10, 33, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 10, 32, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 5 }), ++ 0, 0, 0, 0, 10, 35, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 6 }), ++ 0, 0, 0, 0, 10, 30, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 10 }), ++ 0, 0, 0, 0, 10, 30, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 12 }), ++ 0, 0, 0, 0, 10, 24, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 15 }), ++ 0, 0, 0, 0, 10, 30, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 20 }), ++ 0, 0, 0, 0, 10, 20, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingIncrement: 30 }), ++ 0, 0, 0, 0, 10, 30, 0, 0, 0, 0, "minutes"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-nanoseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-nanoseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cc43a8e3e9e894a139f2dd26d18b279f11388ffd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-nanoseconds.js +@@ -0,0 +1,58 @@ ++// 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.plaintime.prototype.since ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 533, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 5 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 530, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 8 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 528, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 10 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 530, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 20 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 520, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 25 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 525, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 40 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 520, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 50 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 500, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 100 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 500, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 125 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 500, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 200 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 400, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 250 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 500, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingIncrement: 500 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 500, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-seconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-seconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ac24ee8ce8574416e49be0a5f1c79fab76e6bc5f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingincrement-seconds.js +@@ -0,0 +1,46 @@ ++// 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.plaintime.prototype.since ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 35, 23, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 35, 22, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 3 }), ++ 0, 0, 0, 0, 10, 35, 21, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 10, 35, 20, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 5 }), ++ 0, 0, 0, 0, 10, 35, 20, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 6 }), ++ 0, 0, 0, 0, 10, 35, 18, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 10 }), ++ 0, 0, 0, 0, 10, 35, 20, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 12 }), ++ 0, 0, 0, 0, 10, 35, 12, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 15 }), ++ 0, 0, 0, 0, 10, 35, 15, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 20 }), ++ 0, 0, 0, 0, 10, 35, 20, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingIncrement: 30 }), ++ 0, 0, 0, 0, 10, 35, 0, 0, 0, 0, "seconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-ceil.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-ceil.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6d83292fbc09805bf33572e451409c16fcd4558d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-ceil.js +@@ -0,0 +1,54 @@ ++// 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.plaintime.prototype.since ++description: Tests calculations with roundingMode "ceil". ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "hours", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, "hours"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 4, 18, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "minutes", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, -17, 0, 0, 0, 0, "minutes"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 4, 17, 5, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "seconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, -17, -4, 0, 0, 0, "seconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 4, 17, 4, 865, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "milliseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, 0, 0, "milliseconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 198, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "microseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, 0, "microseconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "nanoseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-floor.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-floor.js +new file mode 100644 +index 0000000000000000000000000000000000000000..65ffaae11044b7a69fe1d340f32df4cf423955fb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-floor.js +@@ -0,0 +1,55 @@ ++// 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.plaintime.prototype.since ++description: Tests calculations with roundingMode "floor". ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "hours", roundingMode: "floor" }), ++ 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, "hours"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "minutes", roundingMode: "floor" }), ++ 0, 0, 0, 0, -4, -18, 0, 0, 0, 0, "minutes"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 17, 4, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "seconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, -4, -17, -5, 0, 0, 0, "seconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "milliseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, -4, -17, -4, -865, 0, 0, "milliseconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "microseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -198, 0, "microseconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "nanoseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); ++ +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-halfExpand.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-halfExpand.js +new file mode 100644 +index 0000000000000000000000000000000000000000..22ad25414dbcc76a1449eaf98135a32921d0cf91 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-halfExpand.js +@@ -0,0 +1,54 @@ ++// 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.plaintime.prototype.since ++description: Tests calculations with roundingMode "halfExpand". ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "hours", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, "hours"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "minutes", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, -17, 0, 0, 0, 0, "minutes"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 17, 5, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "seconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, -17, -5, 0, 0, 0, "seconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "milliseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, 0, 0, "milliseconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 198, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "microseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -198, 0, "microseconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "nanoseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js +index 392c8565bef2b43b9b439b6b23a950f9cfa621a6..623d94637141354d18946d13b21f20d3a22478b1 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-invalid-string.js +@@ -9,7 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.PlainTime(12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainTime(13, 35, 57, 123, 987, 500); +- +-for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l"]) { ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { + assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode })); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-trunc.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-trunc.js +new file mode 100644 +index 0000000000000000000000000000000000000000..521dead75793973090705f031f5b54319e7548ec +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-trunc.js +@@ -0,0 +1,54 @@ ++// 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.plaintime.prototype.since ++description: Tests calculations with roundingMode "trunc". ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "hours", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, "hours"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "minutes", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, -17, 0, 0, 0, 0, "minutes"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 17, 4, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "seconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, -17, -4, 0, 0, 0, "seconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "milliseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, 0, 0, "milliseconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "microseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, 0, "microseconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "nanoseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-undefined.js +index 91eaf058416c0f75eef472fdf440c0690b951395..e16c0dcd5af058615572645e9e66ec65bff2a8f9 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/roundingmode-undefined.js +@@ -8,20 +8,83 @@ includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const earlier = new Temporal.PlainTime(12, 34, 56, 0, 0, 0); +-const later = new Temporal.PlainTime(13, 35, 57, 123, 987, 500); +- +-const explicit1 = later.since(earlier, { smallestUnit: "microsecond", roundingMode: undefined }); +-TemporalHelpers.assertDuration(explicit1, 0, 0, 0, 0, 1, 1, 1, 123, 987, 0, "default roundingMode is trunc"); +-const implicit1 = later.since(earlier, { smallestUnit: "microsecond" }); +-TemporalHelpers.assertDuration(implicit1, 0, 0, 0, 0, 1, 1, 1, 123, 987, 0, "default roundingMode is trunc"); +- +-const explicit2 = later.since(earlier, { smallestUnit: "millisecond", roundingMode: undefined }); +-TemporalHelpers.assertDuration(explicit2, 0, 0, 0, 0, 1, 1, 1, 123, 0, 0, "default roundingMode is trunc"); +-const implicit2 = later.since(earlier, { smallestUnit: "millisecond" }); +-TemporalHelpers.assertDuration(implicit2, 0, 0, 0, 0, 1, 1, 1, 123, 0, 0, "default roundingMode is trunc"); +- +-const explicit3 = later.since(earlier, { smallestUnit: "second", roundingMode: undefined }); +-TemporalHelpers.assertDuration(explicit3, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, "default roundingMode is trunc"); +-const implicit3 = later.since(earlier, { smallestUnit: "second" }); +-TemporalHelpers.assertDuration(implicit3, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, "default roundingMode is trunc"); ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "hours" }), ++ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "hours", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "hours" }), ++ 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, "hours"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "minutes" }), ++ 0, 0, 0, 0, 4, 17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "minutes", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, -17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "minutes" }), ++ 0, 0, 0, 0, -4, -17, 0, 0, 0, 0, "minutes"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 17, 4, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "seconds" }), ++ 0, 0, 0, 0, 4, 17, 4, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "seconds", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, -17, -4, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "seconds" }), ++ 0, 0, 0, 0, -4, -17, -4, 0, 0, 0, "seconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "milliseconds" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "milliseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, -17, -4, -864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "milliseconds" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, 0, 0, "milliseconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "microseconds" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "microseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "microseconds" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, 0, "microseconds"); ++ ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.since(earlier, { smallestUnit: "nanoseconds" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "nanoseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.since(later, { smallestUnit: "nanoseconds" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-invalid-string.js +index de440191cf2276b0c19e0e34f065ad5ec3ceb922..b375626bf591ab475baee8996c08304fa19bf0ca 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/smallestunit-invalid-string.js +@@ -9,7 +9,28 @@ features: [Temporal] + + const earlier = new Temporal.PlainTime(12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainTime(13, 35, 57, 987, 654, 321); +-const values = ["era", "eraYear", "years", "months", "weeks", "days", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/year-zero.js +index 1124fe8a7716a6e1cf0b283b7bc271756f0185d6..e2261ea82c34129fb4e61503fd563b7a8adeb285 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/since/year-zero.js +@@ -8,8 +8,9 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-12-07T03:24:30', +- '-000000-12-07T03:24:30+01:00[UTC]' ++ "-000000-12-07T03:24:30", ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + invalidStrings.forEach((arg) => { +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-duration.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-duration.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eff64119bc660276ad8d1c8a94958461823a830a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-duration.js +@@ -0,0 +1,14 @@ ++// 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.plaintime.prototype.subtract ++description: Duration arguments are supported. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(15, 23, 30, 123, 456, 789); ++const duration = Temporal.Duration.from("PT16H"); ++TemporalHelpers.assertPlainTime(plainTime.subtract(duration), ++ 23, 23, 30, 123, 456, 789); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-higher-units.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-higher-units.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8e647205735fdcb8b1cb27cb43edb7cb3702de68 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-higher-units.js +@@ -0,0 +1,29 @@ ++// 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.plaintime.prototype.subtract ++description: Higher units are ignored. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(15, 23, 30, 123, 456, 789); ++const values = [ ++ new Temporal.Duration(0, 0, 0, 1), ++ new Temporal.Duration(0, 0, 1), ++ new Temporal.Duration(0, 1), ++ new Temporal.Duration(1), ++ { days: 1 }, ++ { weeks: 1 }, ++ { months: 1 }, ++ { years: 1 }, ++ "P1D", ++ "P1W", ++ "P1M", ++ "P1Y", ++]; ++for (const value of values) { ++ TemporalHelpers.assertPlainTime(plainTime.subtract(value), ++ 15, 23, 30, 123, 456, 789); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-object.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a981492bdfbaa75c07d446590aae766e70d3dcb8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/subtract/argument-object.js +@@ -0,0 +1,37 @@ ++// 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.plaintime.prototype.subtract ++description: Plain object arguments are supported. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.subtract({ hours: 16 }), ++ 23, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.subtract({ minutes: 45 }), ++ 14, 38, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.subtract({ seconds: 45 }), ++ 15, 22, 45, 123, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.subtract({ milliseconds: 800 }), ++ 15, 23, 29, 323, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.subtract({ microseconds: 800 }), ++ 15, 23, 30, 122, 656, 789); ++TemporalHelpers.assertPlainTime(plainTime.subtract({ nanoseconds: 800 }), ++ 15, 23, 30, 123, 455, 989); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("23:23:30.123456789").subtract({ hours: -16 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("14:38:30.123456789").subtract({ minutes: -45 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("15:22:45.123456789").subtract({ seconds: -45 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("15:23:29.323456789").subtract({ milliseconds: -800 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("15:23:30.122656789").subtract({ microseconds: -800 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(Temporal.PlainTime.from("15:23:30.123455989").subtract({ nanoseconds: -800 }), ++ 15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertPlainTime(plainTime.subtract({ minute: 1, hours: 1 }), ++ 14, 23, 30, 123, 456, 789); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1742c9a9d3eabd428a7227af63b0e5bb66f497c7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.plaintime.prototype.toplaindatetime ++description: A number is converted to a string, then to Temporal.PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const arg = 19761118; ++ ++const result = instance.toPlainDateTime(arg); ++TemporalHelpers.assertPlainDateTime(result, 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.toPlainDateTime(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6e38a93003829437163b07332fac7089a8b29456 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.plaintime.prototype.toplaindatetime ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.toPlainDateTime(arg); ++TemporalHelpers.assertPlainDateTime( ++ result1, ++ 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.toPlainDateTime(arg); ++TemporalHelpers.assertPlainDateTime( ++ result2, ++ 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1353b30b991740f31391dbe2431de7d4b8470679 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.plaintime.prototype.toplaindatetime ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.toPlainDateTime(arg); ++TemporalHelpers.assertPlainDateTime(result1, 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.toPlainDateTime(arg); ++TemporalHelpers.assertPlainDateTime(result2, 1976, 11, "M11", 18, 12, 34, 56, 987, 654, 321, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.toPlainDateTime(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.toPlainDateTime(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b74193686c08922d8a50f81f8452dfba6da0bdb6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.plaintime.prototype.toplaindatetime ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.toPlainDateTime(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.toPlainDateTime(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.toPlainDateTime(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.toPlainDateTime(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.toPlainDateTime(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..802381765cf153ca09a93668bb8a54e7b2cefe76 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plaintime.prototype.toplaindatetime ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.toPlainDateTime(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..768f1dba079c834af3cf0617da27e8444a423aa8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.plaintime.prototype.toplaindatetime ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.toPlainDateTime(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..888760b50de02408cfdb82a476c5d3dcdc925ec5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plaintime.prototype.toplaindatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toPlainDateTime(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toPlainDateTime(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5a594f23a4288213a11d412729b4d8a85f504f78 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.plaintime.prototype.toplaindatetime ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321, calendar); ++instance.toPlainDateTime({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ea1ee612233f54495446928da66263a6b544fbf9 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/leap-second.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.plaintime.prototype.toplaindatetime ++description: Leap second is a valid ISO string for PlainDate ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.toPlainDateTime(arg); ++TemporalHelpers.assertPlainDateTime( ++ result1, ++ 2016, 12, "M12", 31, 12, 34, 56, 987, 654, 321, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.toPlainDateTime(arg); ++TemporalHelpers.assertPlainDateTime( ++ result2, ++ 2016, 12, "M12", 31, 12, 34, 56, 987, 654, 321, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/limits.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/limits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fcde863d6451f730b05a8d0192bd1079e1e0236e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/limits.js +@@ -0,0 +1,39 @@ ++// 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.plaintime.prototype.toplaindatetime ++description: Checking limits of representable PlainDateTime ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const midnight = new Temporal.PlainTime(0, 0); ++const firstNs = new Temporal.PlainTime(0, 0, 0, 0, 0, 1); ++const lastNs = new Temporal.PlainTime(23, 59, 59, 999, 999, 999); ++const min = new Temporal.PlainDate(-271821, 4, 19); ++const max = new Temporal.PlainDate(275760, 9, 13); ++ ++assert.throws( ++ RangeError, ++ () => midnight.toPlainDateTime(min), ++ "Cannot go below representable limit" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ midnight.toPlainDateTime(max), ++ 275760, 9, "M09", 13, 0, 0, 0, 0, 0, 0, ++ "Midnight of maximum representable PlainDate" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ firstNs.toPlainDateTime(min), ++ -271821, 4, "M04", 19, 0, 0, 0, 0, 0, 1, ++ "Computing the minimum (earliest) representable PlainDateTime" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ lastNs.toPlainDateTime(max), ++ 275760, 9, "M09", 13, 23, 59, 59, 999, 999, 999, ++ "Computing the maximum (latest) representable PlainDateTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/year-zero.js +index 481f20b37afe81cdb646e111f68c665ca9dddb83..e08a6d03057be9e828fd00855d3ec89ec6e44a9c 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.toPlainDateTime(arg); }, ++ () => instance.toPlainDateTime(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js +index 2bff43e90a745720ceb406c776e097731eb1935d..2c90ffaa47a89373c7b92f10eef3297d24898be5 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-auto.js +@@ -7,13 +7,17 @@ description: auto value for fractionalSecondDigits option + features: [Temporal] + ---*/ + ++const zeroSeconds = new Temporal.PlainTime(15, 23); ++const wholeSeconds = new Temporal.PlainTime(15, 23, 30); ++const subSeconds = new Temporal.PlainTime(15, 23, 30, 123, 400); ++ + const tests = [ +- ["15:23", "15:23:00"], +- ["15:23:30", "15:23:30"], +- ["15:23:30.1234", "15:23:30.1234"], ++ [zeroSeconds, "15:23:00"], ++ [wholeSeconds, "15:23:30"], ++ [subSeconds, "15:23:30.1234"], + ]; + +-for (const [input, expected] of tests) { +- const plainTime = Temporal.PlainTime.from(input); +- assert.sameValue(plainTime.toString({ fractionalSecondDigits: "auto" }), expected); ++for (const [time, expected] of tests) { ++ assert.sameValue(time.toString(), expected, "default is to emit seconds and drop trailing zeroes"); ++ assert.sameValue(time.toString({ fractionalSecondDigits: "auto" }), expected, "auto is the default"); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js +index 3d4ab17c4305feaabf4cd05be9114a0ceda96927..1be21d324c768ae99ba56a30099a47bd689478ae 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-invalid-string.js +@@ -10,12 +10,13 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.plaintime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + + const time = new Temporal.PlainTime(12, 34, 56, 987, 650, 0); + +-for (const fractionalSecondDigits of ["other string", "AUTO", "not-auto", "autos"]) { +- assert.throws(RangeError, () => time.toString({ fractionalSecondDigits })); ++for (const fractionalSecondDigits of ["other string", "AUTO", "not-auto", "autos", "auto\0"]) { ++ assert.throws(RangeError, () => time.toString({ fractionalSecondDigits }), ++ `"${fractionalSecondDigits}" is not a valid value for fractionalSecondDigits`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-non-integer.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-non-integer.js +index 9b7c5250e0d5ded33c3dfba538cd953f40f998bc..3ca8fed5aa0bb4e667eafceeaeb694e61991cab8 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-non-integer.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-non-integer.js +@@ -10,7 +10,7 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.plaintime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js +index 5973c534001aedf9c76ffc9f2742bccb59fc8c34..0ea1eb838eac6c859272a6daef3115cf5dc73e1a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-number.js +@@ -7,16 +7,27 @@ description: Number for fractionalSecondDigits option + features: [Temporal] + ---*/ + +-const t1 = Temporal.PlainTime.from("15:23"); +-const t2 = Temporal.PlainTime.from("15:23:30"); +-const t3 = Temporal.PlainTime.from("15:23:30.1234"); +-assert.sameValue(t3.toString({ fractionalSecondDigits: 0 }), "15:23:30"); +-assert.sameValue(t1.toString({ fractionalSecondDigits: 2 }), "15:23:00.00"); +-assert.sameValue(t2.toString({ fractionalSecondDigits: 2 }), "15:23:30.00"); +-assert.sameValue(t3.toString({ fractionalSecondDigits: 2 }), "15:23:30.12"); +-assert.sameValue(t3.toString({ fractionalSecondDigits: 3 }), "15:23:30.123"); +-assert.sameValue(t3.toString({ fractionalSecondDigits: 6 }), "15:23:30.123400"); +-assert.sameValue(t1.toString({ fractionalSecondDigits: 7 }), "15:23:00.0000000"); +-assert.sameValue(t2.toString({ fractionalSecondDigits: 7 }), "15:23:30.0000000"); +-assert.sameValue(t3.toString({ fractionalSecondDigits: 7 }), "15:23:30.1234000"); +-assert.sameValue(t3.toString({ fractionalSecondDigits: 9 }), "15:23:30.123400000"); ++const zeroSeconds = new Temporal.PlainTime(15, 23); ++const wholeSeconds = new Temporal.PlainTime(15, 23, 30); ++const subSeconds = new Temporal.PlainTime(15, 23, 30, 123, 400); ++ ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 0 }), "15:23:30", ++ "truncates 4 decimal places to 0"); ++assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 2 }), "15:23:00.00", ++ "pads zero seconds to 2 decimal places"); ++assert.sameValue(wholeSeconds.toString({ fractionalSecondDigits: 2 }), "15:23:30.00", ++ "pads whole seconds to 2 decimal places"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 2 }), "15:23:30.12", ++ "truncates 4 decimal places to 2"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 3 }), "15:23:30.123", ++ "truncates 4 decimal places to 3"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 6 }), "15:23:30.123400", ++ "pads 4 decimal places to 6"); ++assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 7 }), "15:23:00.0000000", ++ "pads zero seconds to 7 decimal places"); ++assert.sameValue(wholeSeconds.toString({ fractionalSecondDigits: 7 }), "15:23:30.0000000", ++ "pads whole seconds to 7 decimal places"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 7 }), "15:23:30.1234000", ++ "pads 4 decimal places to 7"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 9 }), "15:23:30.123400000", ++ "pads 4 decimal places to 9"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js +index 5959dd945913784daec987a09fdce49ea243088d..1d6e899312fe43d4964004f90b1d04229ccdd889 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-out-of-range.js +@@ -10,13 +10,17 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.plaintime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + + const time = new Temporal.PlainTime(12, 34, 56, 987, 650, 0); + +-assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: -Infinity })); +-assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: -1 })); +-assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: 10 })); +-assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: Infinity })); ++assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: -Infinity }), ++ "−∞ is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: -1 }), ++ "−1 is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: 10 }), ++ "10 is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: Infinity }), ++ "∞ is out of range for fractionalSecondDigits"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js +index 1d9d2dff03817eb5ed3542dd6292b9114efde415..6c33c55f7f4613437aba42bef7835890ef732974 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-undefined.js +@@ -8,29 +8,31 @@ info: | + sec-getoption step 3: + 3. If _value_ is *undefined*, return _fallback_. + sec-getstringornumberoption step 2: +- 2. Let _value_ be ? GetOption(_options_, _property_, *"stringOrNumber"*, *undefined*, _fallback_). ++ 2. Let _value_ be ? GetOption(_options_, _property_, « Number, String », *undefined*, _fallback_). + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.plaintime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + ++const zeroSeconds = new Temporal.PlainTime(15, 23); ++const wholeSeconds = new Temporal.PlainTime(15, 23, 30); ++const subSeconds = new Temporal.PlainTime(15, 23, 30, 123, 400); ++ + const tests = [ +- ["15:23", "15:23:00"], +- ["15:23:30", "15:23:30"], +- ["15:23:30.1234", "15:23:30.1234"], ++ [zeroSeconds, "15:23:00"], ++ [wholeSeconds, "15:23:30"], ++ [subSeconds, "15:23:30.1234"], + ]; + +-for (const [input, expected] of tests) { +- const time = Temporal.PlainTime.from(input); +- ++for (const [time, expected] of tests) { + const explicit = time.toString({ fractionalSecondDigits: undefined }); +- assert.sameValue(explicit, expected, "default fractionalSecondDigits is auto"); ++ assert.sameValue(explicit, expected, "default fractionalSecondDigits is auto (property present but undefined)"); + + const implicit = time.toString({}); +- assert.sameValue(implicit, expected, "default fractionalSecondDigits is auto"); ++ assert.sameValue(implicit, expected, "default fractionalSecondDigits is auto (property not present)"); + + const lambda = time.toString(() => {}); +- assert.sameValue(lambda, expected, "default fractionalSecondDigits is auto"); ++ assert.sameValue(lambda, expected, "default fractionalSecondDigits is auto (property not present, function object)"); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-wrong-type.js +index 54440155aa3c27985ce1143e63d10849a889eceb..79fcd2829382f8c6b3adcf052fe46307faa712e1 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/fractionalseconddigits-wrong-type.js +@@ -22,4 +22,26 @@ features: [Temporal] + ---*/ + + const time = new Temporal.PlainTime(12, 34, 56, 987, 650, 0); +-TemporalHelpers.checkFractionalSecondDigitsOptionWrongType(time); ++ ++assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: null }), ++ "null is not a number and converts to the string 'null' which is not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: true }), ++ "true is not a number and converts to the string 'true' which is not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: false }), ++ "false is not a number and converts to the string 'false' which is not valid for fractionalSecondDigits"); ++assert.throws(TypeError, () => time.toString({ fractionalSecondDigits: Symbol() }), ++ "symbols are not numbers and cannot convert to strings"); ++assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: 2n }), ++ "bigints are not numbers and convert to strings which are not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => time.toString({ fractionalSecondDigits: {} }), ++ "plain objects are not numbers and convert to strings which are not valid for fractionalSecondDigits"); ++ ++const expected = [ ++ "get fractionalSecondDigits.toString", ++ "call fractionalSecondDigits.toString", ++]; ++const actual = []; ++const observer = TemporalHelpers.toPrimitiveObserver(actual, "auto", "fractionalSecondDigits"); ++const result = time.toString({ fractionalSecondDigits: observer }); ++assert.sameValue(result, "12:34:56.98765", "object with toString uses toString return value"); ++assert.compareArray(actual, expected, "object with toString calls toString and not valueOf"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d77abfa038d70cfe717b15fe77990c7b2dfca149 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plaintime.prototype.tostring ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainTime(); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.toString(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js +index 4c67d223aaccf3026c02381fb46ecce6a0406ab9..d580f6f5e237419c3e3da7089f7f618c36a6b89d 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/rounding-cross-midnight.js +@@ -7,7 +7,7 @@ description: Rounding can cross midnight + features: [Temporal] + ---*/ + +-const plainTime = Temporal.PlainTime.from("23:59:59.999999999"); ++const plainTime = new Temporal.PlainTime(23, 59, 59, 999, 999, 999); // one nanosecond before 00:00:00 + for (const roundingMode of ["ceil", "halfExpand"]) { + assert.sameValue(plainTime.toString({ fractionalSecondDigits: 8, roundingMode }), "00:00:00.00000000"); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js +index 4f6552b87be37073cb6dc8b3ddc5161213433c11..97006c66ff63e5966e057e4920642d3f7077d122 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-ceil.js +@@ -10,10 +10,28 @@ features: [Temporal] + const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); + + const result1 = time.toString({ smallestUnit: "microsecond", roundingMode: "ceil" }); +-assert.sameValue(result1, "12:34:56.123988", "roundingMode is ceil"); ++assert.sameValue(result1, "12:34:56.123988", ++ "roundingMode is ceil (with 6 digits from smallestUnit)"); + +-const result2 = time.toString({ smallestUnit: "millisecond", roundingMode: "ceil" }); +-assert.sameValue(result2, "12:34:56.124", "roundingMode is ceil"); ++const result2 = time.toString({ fractionalSecondDigits: 6, roundingMode: "ceil" }); ++assert.sameValue(result2, "12:34:56.123988", ++ "roundingMode is ceil (with 6 digits from fractionalSecondDigits)"); + +-const result3 = time.toString({ smallestUnit: "second", roundingMode: "ceil" }); +-assert.sameValue(result3, "12:34:57", "roundingMode is ceil"); ++const result3 = time.toString({ smallestUnit: "millisecond", roundingMode: "ceil" }); ++assert.sameValue(result3, "12:34:56.124", ++ "roundingMode is ceil (with 3 digits from smallestUnit)"); ++ ++const result4 = time.toString({ fractionalSecondDigits: 3, roundingMode: "ceil" }); ++assert.sameValue(result4, "12:34:56.124", ++ "roundingMode is ceil (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = time.toString({ smallestUnit: "second", roundingMode: "ceil" }); ++assert.sameValue(result5, "12:34:57", ++ "roundingMode is ceil (with 0 digits from smallestUnit)"); ++ ++const result6 = time.toString({ fractionalSecondDigits: 0, roundingMode: "ceil" }); ++assert.sameValue(result6, "12:34:57", ++ "roundingMode is ceil (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = time.toString({ smallestUnit: "minute", roundingMode: "ceil" }); ++assert.sameValue(result7, "12:35", "roundingMode is ceil (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js +index 63b30d3cc5b759baaca9f27bfbf18c3636c27da1..528d8cd0c84267f6b869b3768659f9133dd9c4de 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-floor.js +@@ -10,10 +10,28 @@ features: [Temporal] + const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); + + const result1 = time.toString({ smallestUnit: "microsecond", roundingMode: "floor" }); +-assert.sameValue(result1, "12:34:56.123987", "roundingMode is floor"); ++assert.sameValue(result1, "12:34:56.123987", ++ "roundingMode is floor (with 6 digits from smallestUnit)"); + +-const result2 = time.toString({ smallestUnit: "millisecond", roundingMode: "floor" }); +-assert.sameValue(result2, "12:34:56.123", "roundingMode is floor"); ++const result2 = time.toString({ fractionalSecondDigits: 6, roundingMode: "floor" }); ++assert.sameValue(result2, "12:34:56.123987", ++ "roundingMode is floor (with 6 digits from fractionalSecondDigits)"); + +-const result3 = time.toString({ smallestUnit: "second", roundingMode: "floor" }); +-assert.sameValue(result3, "12:34:56", "roundingMode is floor"); ++const result3 = time.toString({ smallestUnit: "millisecond", roundingMode: "floor" }); ++assert.sameValue(result3, "12:34:56.123", ++ "roundingMode is floor (with 3 digits from smallestUnit)"); ++ ++const result4 = time.toString({ fractionalSecondDigits: 3, roundingMode: "floor" }); ++assert.sameValue(result4, "12:34:56.123", ++ "roundingMode is floor (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = time.toString({ smallestUnit: "second", roundingMode: "floor" }); ++assert.sameValue(result5, "12:34:56", ++ "roundingMode is floor (with 0 digits from smallestUnit)"); ++ ++const result6 = time.toString({ fractionalSecondDigits: 0, roundingMode: "floor" }); ++assert.sameValue(result6, "12:34:56", ++ "roundingMode is floor (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = time.toString({ smallestUnit: "minute", roundingMode: "floor" }); ++assert.sameValue(result7, "12:34", "roundingMode is floor (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js +index cd7b8e4673a8ae6c4710349fad42d7a16b58c020..35a65a866650bf364b0dbc2003dc471a33274934 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-halfExpand.js +@@ -10,10 +10,28 @@ features: [Temporal] + const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); + + const result1 = time.toString({ smallestUnit: "microsecond", roundingMode: "halfExpand" }); +-assert.sameValue(result1, "12:34:56.123988", "roundingMode is halfExpand"); ++assert.sameValue(result1, "12:34:56.123988", ++ "roundingMode is halfExpand (with 6 digits from smallestUnit)"); + +-const result2 = time.toString({ smallestUnit: "millisecond", roundingMode: "halfExpand" }); +-assert.sameValue(result2, "12:34:56.124", "roundingMode is halfExpand"); ++const result2 = time.toString({ fractionalSecondDigits: 6, roundingMode: "halfExpand" }); ++assert.sameValue(result2, "12:34:56.123988", ++ "roundingMode is halfExpand (with 6 digits from fractionalSecondDigits)"); + +-const result3 = time.toString({ smallestUnit: "second", roundingMode: "halfExpand" }); +-assert.sameValue(result3, "12:34:56", "roundingMode is halfExpand"); ++const result3 = time.toString({ smallestUnit: "millisecond", roundingMode: "halfExpand" }); ++assert.sameValue(result3, "12:34:56.124", ++ "roundingMode is halfExpand (with 3 digits from smallestUnit)"); ++ ++const result4 = time.toString({ fractionalSecondDigits: 3, roundingMode: "halfExpand" }); ++assert.sameValue(result4, "12:34:56.124", ++ "roundingMode is halfExpand (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = time.toString({ smallestUnit: "second", roundingMode: "halfExpand" }); ++assert.sameValue(result5, "12:34:56", ++ "roundingMode is halfExpand (with 0 digits from smallestUnit)"); ++ ++const result6 = time.toString({ fractionalSecondDigits: 0, roundingMode: "halfExpand" }); ++assert.sameValue(result6, "12:34:56", ++ "roundingMode is halfExpand (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = time.toString({ smallestUnit: "minute", roundingMode: "halfExpand" }); ++assert.sameValue(result7, "12:35", "roundingMode is halfExpand (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js +index 529541f2ad9330a42f412247c911bbf8418067dc..c66d624740cbbfd1be96475a0b5afdf7e85cc1f0 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-invalid-string.js +@@ -8,6 +8,6 @@ features: [Temporal] + ---*/ + + const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); +-for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l"]) { ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { + assert.throws(RangeError, () => time.toString({ smallestUnit: "microsecond", roundingMode })); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js +index e25101caf420ce4ad10da109e2cefb5e53665289..d3496b266bd15c9e3eb4e395b4c6dfb1f651267a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/roundingmode-trunc.js +@@ -10,10 +10,28 @@ features: [Temporal] + const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); + + const result1 = time.toString({ smallestUnit: "microsecond", roundingMode: "trunc" }); +-assert.sameValue(result1, "12:34:56.123987", "roundingMode is trunc"); ++assert.sameValue(result1, "12:34:56.123987", ++ "roundingMode is trunc (with 6 digits from smallestUnit)"); + +-const result2 = time.toString({ smallestUnit: "millisecond", roundingMode: "trunc" }); +-assert.sameValue(result2, "12:34:56.123", "roundingMode is trunc"); ++const result2 = time.toString({ fractionalSecondDigits: 6, roundingMode: "trunc" }); ++assert.sameValue(result2, "12:34:56.123987", ++ "roundingMode is trunc (with 6 digits from fractionalSecondDigits)"); + +-const result3 = time.toString({ smallestUnit: "second", roundingMode: "trunc" }); +-assert.sameValue(result3, "12:34:56", "roundingMode is trunc"); ++const result3 = time.toString({ smallestUnit: "millisecond", roundingMode: "trunc" }); ++assert.sameValue(result3, "12:34:56.123", ++ "roundingMode is trunc (with 3 digits from smallestUnit)"); ++ ++const result4 = time.toString({ fractionalSecondDigits: 3, roundingMode: "trunc" }); ++assert.sameValue(result4, "12:34:56.123", ++ "roundingMode is trunc (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = time.toString({ smallestUnit: "second", roundingMode: "trunc" }); ++assert.sameValue(result5, "12:34:56", ++ "roundingMode is trunc (with 0 digits from smallestUnit)"); ++ ++const result6 = time.toString({ fractionalSecondDigits: 0, roundingMode: "trunc" }); ++assert.sameValue(result6, "12:34:56", ++ "roundingMode is trunc (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = time.toString({ smallestUnit: "minute", roundingMode: "trunc" }); ++assert.sameValue(result7, "12:34", "roundingMode is trunc (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js +index 06ab3baac63f9ef9e349a40e8171f8c916209dd4..318041efa069db7fb3acaa8c55b4f367949a38fb 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-fractionalseconddigits.js +@@ -21,11 +21,10 @@ for (const [smallestUnit, expected] of tests) { + smallestUnit, + get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") } + }); +- assert.sameValue(string, expected, smallestUnit); ++ assert.sameValue(string, expected, `smallestUnit: "${smallestUnit}" overrides fractionalSecondDigits`); + } + + assert.throws(RangeError, () => time.toString({ + smallestUnit: "hour", + get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") } +-})); +- ++}), "hour is an invalid smallestUnit but still overrides fractionalSecondDigits"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js +index d5ea0a7b3e7627f2ef800085ec62237e1acd5ccb..d093928a48936a8eee4f199505d78ba69c64f0cf 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-invalid-string.js +@@ -8,6 +8,30 @@ features: [Temporal] + ---*/ + + const time = new Temporal.PlainTime(12, 34, 56, 123, 987, 500); +-for (const smallestUnit of ["era", "year", "month", "day", "hour", "nonsense", "other string", "m\u0131nute", "SECOND"]) { +- assert.throws(RangeError, () => time.toString({ smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "hour", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "hours", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => time.toString({ smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js +index e2b4c71dbd23587ffbba682adcb4efd200c769dd..bb942179e2cfdfbd4a1a154160d08c4f007db7bd 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toString/smallestunit-valid-units.js +@@ -7,21 +7,41 @@ description: Valid units for the smallestUnit option + features: [Temporal] + ---*/ + +-const time = new Temporal.PlainTime(12, 34, 56, 789, 999, 999); +-assert.sameValue(time.toString({ smallestUnit: "minute" }), "12:34"); +-assert.sameValue(time.toString({ smallestUnit: "second" }), "12:34:56"); +-assert.sameValue(time.toString({ smallestUnit: "millisecond" }), "12:34:56.789"); +-assert.sameValue(time.toString({ smallestUnit: "microsecond" }), "12:34:56.789999"); +-assert.sameValue(time.toString({ smallestUnit: "nanosecond" }), "12:34:56.789999999"); ++const time = new Temporal.PlainTime(12, 34, 56, 123, 456, 789); + +-const time2 = new Temporal.PlainTime(12, 34); +-assert.sameValue(time2.toString({ smallestUnit: "minute" }), "12:34"); +-assert.sameValue(time2.toString({ smallestUnit: "second" }), "12:34:00"); +-assert.sameValue(time2.toString({ smallestUnit: "millisecond" }), "12:34:00.000"); +-assert.sameValue(time2.toString({ smallestUnit: "microsecond" }), "12:34:00.000000"); +-assert.sameValue(time2.toString({ smallestUnit: "nanosecond" }), "12:34:00.000000000"); ++function test(instance, expectations, description) { ++ for (const [smallestUnit, expectedResult] of expectations) { ++ assert.sameValue(instance.toString({ smallestUnit }), expectedResult, ++ `${description} with smallestUnit "${smallestUnit}"`); ++ } ++} ++ ++test( ++ time, ++ [ ++ ["minute", "12:34"], ++ ["second", "12:34:56"], ++ ["millisecond", "12:34:56.123"], ++ ["microsecond", "12:34:56.123456"], ++ ["nanosecond", "12:34:56.123456789"], ++ ], ++ "subseconds toString" ++); ++ ++test( ++ new Temporal.PlainTime(12, 34), ++ [ ++ ["minute", "12:34"], ++ ["second", "12:34:00"], ++ ["millisecond", "12:34:00.000"], ++ ["microsecond", "12:34:00.000000"], ++ ["nanosecond", "12:34:00.000000000"], ++ ], ++ "whole minutes toString" ++); + + const notValid = [ ++ "era", + "year", + "month", + "week", +@@ -30,5 +50,6 @@ const notValid = [ + ]; + + notValid.forEach((smallestUnit) => { +- assert.throws(RangeError, () => time.toString({ smallestUnit }), smallestUnit); ++ assert.throws(RangeError, () => time.toString({ smallestUnit }), ++ `"${smallestUnit}" is not a valid unit for the smallestUnit option`); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e466ad4e48cb7a220007ce045b98a4f5dc110bcf +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const arg = 19761118; ++ ++const result = instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }); ++assert.sameValue(result.epochNanoseconds, 217_168_496_987_654_321n, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..975d536ff80da2d7da4d6d3640e546c63da7e27f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }); ++assert.sameValue( ++ result1.epochNanoseconds, ++ 217_168_496_987_654_321n, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }); ++assert.sameValue( ++ result2.epochNanoseconds, ++ 217_168_496_987_654_321n, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1f40ffa0dcf2ded0b1613064efba6e88f39cd28d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }); ++assert.sameValue(result1.epochNanoseconds, 217_168_496_987_654_321n, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }); ++assert.sameValue(result2.epochNanoseconds, 217_168_496_987_654_321n, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..22a1101801c6602abadee1a1cd127ca109c861bf +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fb6c3eca8006d909f60805a649972b30d1aed002 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7eee26a343a8ecf00a15f7370875a16bd542f29c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-with-utc-designator.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-with-utc-designator.js +index 7af7b65a9a5931ec3c90702c2a3f1259af1d9169..c02d4f4da6bece02a33c91de37d63e3cd5e02fc2 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-with-utc-designator.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-string-with-utc-designator.js +@@ -15,7 +15,7 @@ const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => instance.toZonedDateTime({ plainDate: arg }), ++ () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), + "String with UTC designator should not be valid as a PlainDate" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f668689be54d37b2f3a0132bdb6a149d84207e4b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [undefined, "undefined"], // plainDate property is required ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e6b9fc3e1229d52f35da9e65a287b61a7544d38f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321, calendar); ++instance.toZonedDateTime({ plainDate: { year: 2000, month: 5, day: 3, calendar }, timeZone: new Temporal.TimeZone("UTC") }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b882057429e5145a1f126e0441d5dc6193c10dd3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }); ++assert.sameValue( ++ result1.epochNanoseconds, ++ 1_483_187_696_987_654_321n, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }); ++assert.sameValue( ++ result2.epochNanoseconds, ++ 1_483_187_696_987_654_321n, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..78dffeb2c9b26e31cbba90b76534ac1b9d601dae +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone }); ++assert.sameValue(result1.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone"); ++const result2 = instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone: { timeZone } }); ++assert.sameValue(result2.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone: { timeZone } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..80a06780bc797c973781aa6ee91634312b8070d0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainTime(); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone: { timeZone } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..059326c6a2a848405a1a5b673de7b455cd457306 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.plaintime.prototype.tozoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone: { timeZone } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone: { timeZone } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: new Temporal.PlainDate(2000, 5, 2), timeZone: { timeZone } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/year-zero.js +index d5381ad4050a55292fc078606d006867d2ea0e1a..6fb496ea92497b559d9a047505fc849727f2e832 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.toZonedDateTime({ plainDate: arg }); }, ++ () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" }), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-cast.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-cast.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b027b400ed4cc0899e89fd08f10cb67f56c4247d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-cast.js +@@ -0,0 +1,18 @@ ++// 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.plaintime.prototype.until ++description: Casts the argument ++includes: [temporalHelpers.js] ++features: [Temporal, arrow-function] ++---*/ ++ ++const plainTime = new Temporal.PlainTime(15, 23, 30, 123, 456, 789); ++TemporalHelpers.assertDuration(plainTime.until("16:34"), ++ 0, 0, 0, 0, /* hours = */ 1, /* minutes = */ 10, /* seconds = */ 29, 876, 543, 211, "string"); ++TemporalHelpers.assertDuration(plainTime.until({ hour: 16, minute: 34 }), ++ 0, 0, 0, 0, /* hours = */ 1, /* minutes = */ 10, /* seconds = */ 29, 876, 543, 211, "object"); ++ ++assert.throws(TypeError, () => plainTime.until({}), "empty"); ++assert.throws(TypeError, () => plainTime.until({ minutes: 30 }), "only plural 'minutes'"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0ce8dcf2949b3e2767ea25ab28f928a3140980e5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-number.js +@@ -0,0 +1,31 @@ ++// 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.plaintime.prototype.until ++description: A number is converted to a string, then to Temporal.PlainTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const arg = 123456.987654321; ++ ++const result = instance.until(arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "123456.987654321 is a valid ISO string for PlainTime"); ++ ++const numbers = [ ++ 1, ++ -123456.987654321, ++ 1234567, ++ 123456.9876543219, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-designator-required-for-disambiguation.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-designator-required-for-disambiguation.js +index 785e1efe6937c06e8381d81cda3615fbeece57c6..3f11bf7f3b309a2a10ee0f0be778c07d62f12d83 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-designator-required-for-disambiguation.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-string-time-designator-required-for-disambiguation.js +@@ -27,6 +27,13 @@ ambiguousStrings.forEach((string) => { + // The same string with a T prefix should not throw: + arg = `T${string}`; + instance.until(arg); ++ ++ arg = ` ${string}`; ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ "space is not accepted as a substitute for T prefix" ++ ); + }); + + // None of these should throw without a T prefix, because they are unambiguously time strings: +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2e9c5e29e23e8e752cbf4207fdd19024b4e48425 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plaintime.prototype.until ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainTime, "Temporal.PlainTime, object"], ++ [Temporal.PlainTime.prototype, "Temporal.PlainTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/basic.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..74f4c37ceb680d4efbadb8b04b415a1e1dad3dcc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/basic.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.plaintime.prototype.until ++description: Basic usage ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const one = new Temporal.PlainTime(15, 23, 30, 123, 456, 789); ++const two = new Temporal.PlainTime(16, 23, 30, 123, 456, 789); ++const three = new Temporal.PlainTime(17, 0, 30, 123, 456, 789); ++ ++TemporalHelpers.assertDuration(one.until(two), ++ 0, 0, 0, 0, /* hours = */ 1, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(two.until(one), ++ 0, 0, 0, 0, /* hours = */ -1, 0, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(one.until(three), ++ 0, 0, 0, 0, /* hours = */ 1, 37, 0, 0, 0, 0); ++TemporalHelpers.assertDuration(three.until(one), ++ 0, 0, 0, 0, /* hours = */ -1, -37, 0, 0, 0, 0); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/largestunit-invalid-string.js +index 7fcf10a557ba2ae5f259d0121a34689899b7f5f4..ff95f0e78325782cc6359cc7f1614d924594c482 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/largestunit-invalid-string.js +@@ -9,7 +9,28 @@ features: [Temporal] + + const earlier = new Temporal.PlainTime(12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainTime(13, 35, 57, 987, 654, 321); +-const values = ["era", "eraYear", "years", "months", "weeks", "days", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/largestunit.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/largestunit.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d477d39074c44abd6736c554a8c5a23d38335daf +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/largestunit.js +@@ -0,0 +1,16 @@ ++// 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.plaintime.prototype.until ++description: PlainTime.until with various largestUnit values. ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++const fourFortyEight = new Temporal.PlainTime(4, 48, 55); ++const elevenFiftyNine = new Temporal.PlainTime(11, 59, 58); ++TemporalHelpers.assertDuration(fourFortyEight.until(elevenFiftyNine), 0, 0, 0, 0, 7, 11, 3, 0, 0, 0, "does not include higher units than necessary (largest unit unspecified)"); ++TemporalHelpers.assertDuration(fourFortyEight.until(elevenFiftyNine, { largestUnit: "auto" }), 0, 0, 0, 0, 7, 11, 3, 0, 0, 0, "does not include higher units than necessary (largest unit is auto)"); ++TemporalHelpers.assertDuration(fourFortyEight.until(elevenFiftyNine, { largestUnit: "hours" }), 0, 0, 0, 0, 7, 11, 3, 0, 0, 0, "does not include higher units than necessary (largest unit is hours)"); ++TemporalHelpers.assertDuration(fourFortyEight.until(elevenFiftyNine, { largestUnit: "minutes" }), 0, 0, 0, 0, 0, 431, 3, 0, 0, 0, "does not include higher units than necessary (largest unit is minutes)"); ++TemporalHelpers.assertDuration(fourFortyEight.until(elevenFiftyNine, { largestUnit: "seconds" }), 0, 0, 0, 0, 0, 0, 25863, 0, 0, 0, "does not include higher units than necessary (largest unit is seconds)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a19b99b4d9c44b9047bf0e03dff560a384b6dcfc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/leap-second.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.plaintime.prototype.until ++description: Leap second is a valid ISO string for PlainTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainTime(23, 59, 59); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4f30cb995d2db70d09afe49ededc5c77ec2ea820 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plaintime.prototype.until ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainTime(); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.until(new Temporal.PlainTime(12, 34, 56), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/plaintime-propertybag-no-time-units.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/plaintime-propertybag-no-time-units.js +index 12b344b753bc7ff5f0071ac1593ea3e176e7bb6b..c8d511c02acb37342b79ae71c0120dea1d6902ce 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/plaintime-propertybag-no-time-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/plaintime-propertybag-no-time-units.js +@@ -11,7 +11,7 @@ features: [Temporal] + const instance = new Temporal.PlainTime(1, 0, 0, 0, 0, 1); + + const props = {}; +-assert.throws(TypeError, () => instance.until(props), "TypeError if at least one property is not present"); ++assert.throws(TypeError, () => instance.until(props), "TypeError if no properties are present"); + + props.minute = 30; + const result = instance.until(props); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/result-sub-second.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/result-sub-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8504b817c4e941b938b877d6ba70d557cd398db3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/result-sub-second.js +@@ -0,0 +1,21 @@ ++// 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.plaintime.prototype.until ++description: Supports sub-second precision ++includes: [temporalHelpers.js] ++features: [Temporal, arrow-function] ++---*/ ++ ++const time1 = Temporal.PlainTime.from("10:23:15"); ++const time2 = Temporal.PlainTime.from("17:15:57.250250250"); ++ ++TemporalHelpers.assertDuration(time1.until(time2, { largestUnit: "milliseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, /* milliseconds = */ 24762250, 250, 250, "milliseconds"); ++ ++TemporalHelpers.assertDuration(time1.until(time2, { largestUnit: "microseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, /* milliseconds = */ 0, 24762250250, 250, "microseconds"); ++ ++TemporalHelpers.assertDuration(time1.until(time2, { largestUnit: "nanoseconds" }), ++ 0, 0, 0, 0, 0, 0, 0, /* milliseconds = */ 0, 0, 24762250250250, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-hours.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-hours.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9245498b407534d4b3897cc0b402c96a0e83aa71 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-hours.js +@@ -0,0 +1,34 @@ ++// 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.plaintime.prototype.until ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingIncrement: 3 }), ++ 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingIncrement: 6 }), ++ 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingIncrement: 8 }), ++ 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingIncrement: 12 }), ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "hours"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-invalid.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4d094b6b10c0dbb5009b02bdc5e79c60b23fc13d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-invalid.js +@@ -0,0 +1,24 @@ ++// 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.plaintime.prototype.until ++description: Tests roundingIncrement restrictions. ++features: [Temporal] ++---*/ ++ ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "hours", roundingIncrement: 11 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 29 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 29 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "hours", roundingIncrement: 24 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 60 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 60 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 1000 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 1000 })); ++assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 1000 })); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-microseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-microseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2bde9cd4af3139756df11a75631bacacb9d31ad6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-microseconds.js +@@ -0,0 +1,58 @@ ++// 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.plaintime.prototype.until ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 196, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 5 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 195, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 8 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 192, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 10 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 190, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 20 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 180, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 25 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 175, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 40 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 160, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 50 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 150, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 100 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 100, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 125 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 125, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 200 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 0, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 250 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 0, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingIncrement: 500 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 0, 0, "microseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-milliseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-milliseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2eade031db7525f6d61056068f915dc6d9432010 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-milliseconds.js +@@ -0,0 +1,58 @@ ++// 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.plaintime.prototype.until ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 35, 23, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 10, 35, 23, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 5 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 8 }), ++ 0, 0, 0, 0, 10, 35, 23, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 10 }), ++ 0, 0, 0, 0, 10, 35, 23, 860, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 20 }), ++ 0, 0, 0, 0, 10, 35, 23, 860, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 25 }), ++ 0, 0, 0, 0, 10, 35, 23, 850, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 40 }), ++ 0, 0, 0, 0, 10, 35, 23, 840, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 50 }), ++ 0, 0, 0, 0, 10, 35, 23, 850, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 100 }), ++ 0, 0, 0, 0, 10, 35, 23, 800, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 125 }), ++ 0, 0, 0, 0, 10, 35, 23, 750, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 200 }), ++ 0, 0, 0, 0, 10, 35, 23, 800, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 250 }), ++ 0, 0, 0, 0, 10, 35, 23, 750, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingIncrement: 500 }), ++ 0, 0, 0, 0, 10, 35, 23, 500, 0, 0, "milliseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-minutes.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-minutes.js +new file mode 100644 +index 0000000000000000000000000000000000000000..371d8fcb83c9b8686dce4ee57192f4d3ec931cc5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-minutes.js +@@ -0,0 +1,46 @@ ++// 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.plaintime.prototype.until ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 35, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 34, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 3 }), ++ 0, 0, 0, 0, 10, 33, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 10, 32, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 5 }), ++ 0, 0, 0, 0, 10, 35, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 6 }), ++ 0, 0, 0, 0, 10, 30, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 10 }), ++ 0, 0, 0, 0, 10, 30, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 12 }), ++ 0, 0, 0, 0, 10, 24, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 15 }), ++ 0, 0, 0, 0, 10, 30, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 20 }), ++ 0, 0, 0, 0, 10, 20, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingIncrement: 30 }), ++ 0, 0, 0, 0, 10, 30, 0, 0, 0, 0, "minutes"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-nanoseconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-nanoseconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7ec306ff7a01fac1ac3d94f4d52f37998595cf20 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-nanoseconds.js +@@ -0,0 +1,58 @@ ++// 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.plaintime.prototype.until ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 533, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 5 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 530, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 8 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 528, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 10 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 530, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 20 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 520, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 25 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 525, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 40 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 520, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 50 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 500, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 100 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 500, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 125 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 500, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 200 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 400, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 250 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 500, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingIncrement: 500 }), ++ 0, 0, 0, 0, 10, 35, 23, 865, 198, 500, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-seconds.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-seconds.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eb5edd775a69758adede02eacfd849decb9c0e0b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingincrement-seconds.js +@@ -0,0 +1,46 @@ ++// 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.plaintime.prototype.until ++description: Valid values for roundingIncrement option ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = new Temporal.PlainTime(3, 12, 34, 123, 456, 789); ++const later = new Temporal.PlainTime(13, 47, 57, 988, 655, 322); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 1 }), ++ 0, 0, 0, 0, 10, 35, 23, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 2 }), ++ 0, 0, 0, 0, 10, 35, 22, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 3 }), ++ 0, 0, 0, 0, 10, 35, 21, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 4 }), ++ 0, 0, 0, 0, 10, 35, 20, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 5 }), ++ 0, 0, 0, 0, 10, 35, 20, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 6 }), ++ 0, 0, 0, 0, 10, 35, 18, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 10 }), ++ 0, 0, 0, 0, 10, 35, 20, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 12 }), ++ 0, 0, 0, 0, 10, 35, 12, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 15 }), ++ 0, 0, 0, 0, 10, 35, 15, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 20 }), ++ 0, 0, 0, 0, 10, 35, 20, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingIncrement: 30 }), ++ 0, 0, 0, 0, 10, 35, 0, 0, 0, 0, "seconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-ceil.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-ceil.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5d15c343f00dd45e91b2c1566c3428354443d6cc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-ceil.js +@@ -0,0 +1,54 @@ ++// 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.plaintime.prototype.until ++description: Tests calculations with roundingMode "ceil". ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "hours", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, "hours"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 4, 18, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "minutes", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, -17, 0, 0, 0, 0, "minutes"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 4, 17, 5, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "seconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, -17, -4, 0, 0, 0, "seconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 4, 17, 4, 865, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "milliseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, 0, 0, "milliseconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 198, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "microseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, 0, "microseconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "nanoseconds", roundingMode: "ceil" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-floor.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-floor.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1ab01526c5c79cc4bb571ff340c00de65aec698d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-floor.js +@@ -0,0 +1,54 @@ ++// 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.plaintime.prototype.until ++description: Tests calculations with roundingMode "floor". ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "hours", roundingMode: "floor" }), ++ 0, 0, 0, 0, -5, 0, 0, 0, 0, 0, "hours"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "minutes", roundingMode: "floor" }), ++ 0, 0, 0, 0, -4, -18, 0, 0, 0, 0, "minutes"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 17, 4, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "seconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, -4, -17, -5, 0, 0, 0, "seconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "milliseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, -4, -17, -4, -865, 0, 0, "milliseconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "microseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -198, 0, "microseconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "nanoseconds", roundingMode: "floor" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-halfExpand.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-halfExpand.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fe4dbd69c5ef51dfb834d5fc0827038155aa1c4e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-halfExpand.js +@@ -0,0 +1,54 @@ ++// 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.plaintime.prototype.until ++description: Tests calculations with roundingMode "halfExpand". ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "hours", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, "hours"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "minutes", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, -17, 0, 0, 0, 0, "minutes"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 17, 5, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "seconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, -17, -5, 0, 0, 0, "seconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "milliseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, 0, 0, "milliseconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 198, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "microseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -198, 0, "microseconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "nanoseconds", roundingMode: "halfExpand" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js +index b92eec08a57551b335e84cb5da40e413ffd70b44..1b2aa526d12b7fae54a48428d6e47075d4d46363 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-invalid-string.js +@@ -9,6 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.PlainTime(12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainTime(13, 35, 57, 123, 987, 500); +-for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l"]) { ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { + assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode })); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-trunc.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-trunc.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5897a126fead6dee81c3c0a718272dbc31f05719 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-trunc.js +@@ -0,0 +1,54 @@ ++// 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.plaintime.prototype.until ++description: Tests calculations with roundingMode "trunc". ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "hours", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, "hours"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "minutes", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, -17, 0, 0, 0, 0, "minutes"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 17, 4, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "seconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, -17, -4, 0, 0, 0, "seconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "milliseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, 0, 0, "milliseconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "microseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, 0, "microseconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "nanoseconds", roundingMode: "trunc" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-undefined.js +index ca0e24aba9c842499fb8289b34736b7f76e3217f..7f786b8351107fce67636a79a94be725b4787777 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/roundingmode-undefined.js +@@ -8,20 +8,83 @@ includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const earlier = new Temporal.PlainTime(12, 34, 56, 0, 0, 0); +-const later = new Temporal.PlainTime(13, 35, 57, 123, 987, 500); +- +-const explicit1 = earlier.until(later, { smallestUnit: "microsecond", roundingMode: undefined }); +-TemporalHelpers.assertDuration(explicit1, 0, 0, 0, 0, 1, 1, 1, 123, 987, 0, "default roundingMode is trunc"); +-const implicit1 = earlier.until(later, { smallestUnit: "microsecond" }); +-TemporalHelpers.assertDuration(implicit1, 0, 0, 0, 0, 1, 1, 1, 123, 987, 0, "default roundingMode is trunc"); +- +-const explicit2 = earlier.until(later, { smallestUnit: "millisecond", roundingMode: undefined }); +-TemporalHelpers.assertDuration(explicit2, 0, 0, 0, 0, 1, 1, 1, 123, 0, 0, "default roundingMode is trunc"); +-const implicit2 = earlier.until(later, { smallestUnit: "millisecond" }); +-TemporalHelpers.assertDuration(implicit2, 0, 0, 0, 0, 1, 1, 1, 123, 0, 0, "default roundingMode is trunc"); +- +-const explicit3 = earlier.until(later, { smallestUnit: "second", roundingMode: undefined }); +-TemporalHelpers.assertDuration(explicit3, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, "default roundingMode is trunc"); +-const implicit3 = earlier.until(later, { smallestUnit: "second" }); +-TemporalHelpers.assertDuration(implicit3, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, "default roundingMode is trunc"); ++const earlier = Temporal.PlainTime.from("08:22:36.123456789"); ++const later = Temporal.PlainTime.from("12:39:40.987654321"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "hours" }), ++ 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "hours", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, "hours"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "hours" }), ++ 0, 0, 0, 0, -4, 0, 0, 0, 0, 0, "hours"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "minutes" }), ++ 0, 0, 0, 0, 4, 17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "minutes", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, -17, 0, 0, 0, 0, "minutes"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "minutes" }), ++ 0, 0, 0, 0, -4, -17, 0, 0, 0, 0, "minutes"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 17, 4, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "seconds" }), ++ 0, 0, 0, 0, 4, 17, 4, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "seconds", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, -17, -4, 0, 0, 0, "seconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "seconds" }), ++ 0, 0, 0, 0, -4, -17, -4, 0, 0, 0, "seconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "milliseconds" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "milliseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, -17, -4, -864, 0, 0, "milliseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "milliseconds" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, 0, 0, "milliseconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "microseconds" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "microseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, 0, "microseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "microseconds" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, 0, "microseconds"); ++ ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ earlier.until(later, { smallestUnit: "nanoseconds" }), ++ 0, 0, 0, 0, 4, 17, 4, 864, 197, 532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "nanoseconds", roundingMode: undefined }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); ++TemporalHelpers.assertDuration( ++ later.until(earlier, { smallestUnit: "nanoseconds" }), ++ 0, 0, 0, 0, -4, -17, -4, -864, -197, -532, "nanoseconds"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-invalid-string.js +index 7225494a217389e3a5206f92e170e0ae43318ec3..62ca4957d279080efb9693cccb8af85596c0a3a2 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/smallestunit-invalid-string.js +@@ -9,7 +9,28 @@ features: [Temporal] + + const earlier = new Temporal.PlainTime(12, 34, 56, 0, 0, 0); + const later = new Temporal.PlainTime(13, 35, 57, 987, 654, 321); +-const values = ["era", "eraYear", "years", "months", "weeks", "days", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/year-zero.js +index 759782e9bb145d5e8c1c834c0c860dfc6fe3d049..ff561458adc6cb0de47d436b6ca2f3b1dc57b06d 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/until/year-zero.js +@@ -8,8 +8,9 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-12-07T03:24:30', +- '-000000-12-07T03:24:30+01:00[UTC]' ++ "-000000-12-07T03:24:30", ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + invalidStrings.forEach((arg) => { +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d45bbc8986d546d8d13ff1c18f67b8dd43427a96 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plaintime.prototype.with ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainTime(); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.with({ minute: 45 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js +index 796cec5fcf3d1788391e046408e56e90270b1129..dc50e7795bc7f27072b76f8d738e60690f9e31ed 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainTime/prototype/with/overflow-invalid-string.js +@@ -16,6 +16,12 @@ features: [Temporal] + + const time = new Temporal.PlainTime(12); + const values = ["", "CONSTRAIN", "balance", "other string"]; +-for (const overflow of values) { +- assert.throws(RangeError, () => time.with({ minute: 45 }, { overflow })); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => time.with({ minute: 45 }, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/calendar-always.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/calendar-always.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0aad58df09f23920af9931dcad6a2c83673ddb8e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/calendar-always.js +@@ -0,0 +1,24 @@ ++// 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.plainyearmonth ++description: If calendar name is to be emitted, include additional reference info ++features: [Temporal] ++---*/ ++ ++const pym = new Temporal.PlainYearMonth(2019, 10, "iso8601", 31); ++ ++assert.sameValue( ++ pym.toString({ calendarName: 'always' }), ++ "2019-10-31[u-ca=iso8601]", ++ "emit year-month-day if calendarName = 'always' (four-argument constructor)" ++); ++ ++const anotherPYM = Temporal.PlainYearMonth.from("2019-10-31"); // 31 will get dropped ++ ++assert.sameValue( ++ anotherPYM.toString({ calendarName: 'always' }), ++ "2019-10-01[u-ca=iso8601]", ++ "emit fallback day if calendarName = 'always' (static from)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cf7d4142a517051325000b3cf84425d05d50ba5a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/calendar-number.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.plainyearmonth ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const arg = 19761118; ++ ++const result = new Temporal.PlainYearMonth(2000, 5, arg, 1); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => new Temporal.PlainYearMonth(2000, 5, arg, 1), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3ca821d0b5c61d2b87d20b05b3c67fd0e4ec83ee +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/calendar-wrong-type.js +@@ -0,0 +1,30 @@ ++// 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.plainyearmonth ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => new Temporal.PlainYearMonth(2000, 5, arg, 1), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => new Temporal.PlainYearMonth(2000, 5, arg, 1), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c34aa67e146215bcf42d90c13815ae5bc5b6b4ce +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-number.js +@@ -0,0 +1,34 @@ ++// 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.plainyearmonth.compare ++description: A number is converted to a string, then to Temporal.PlainYearMonth ++features: [Temporal] ++---*/ ++ ++const arg = 201906; ++ ++const result1 = Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)); ++assert.sameValue(result1, 0, "201906 is a valid ISO string for PlainYearMonth (first argument)"); ++const result2 = Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg); ++assert.sameValue(result2, 0, "201906 is a valid ISO string for PlainYearMonth (second argument)"); ++ ++const numbers = [ ++ 1, ++ -201906, ++ 1234567, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), ++ `Number ${arg} does not convert to a valid ISO string for PlainYearMonth (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainYearMonth (first argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e153ce98fc504027dde9a0bb46c733d3928194fc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-number.js +@@ -0,0 +1,53 @@ ++// 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.plainyearmonth.compare ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const calendar = 19970327; ++ ++let arg = { year: 2019, monthCode: "M06", calendar }; ++const result1 = Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)); ++assert.sameValue(result1, 0, "19970327 is a valid ISO string for calendar (first argument)"); ++const result2 = Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg); ++assert.sameValue(result2, 0, "19970327 is a valid ISO string for calendar (second argument)"); ++ ++arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++const result3 = Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)); ++assert.sameValue(result3, 0, "19970327 is a valid ISO string for calendar (nested property, first argument)"); ++const result4 = Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg); ++assert.sameValue(result4, 0, "19970327 is a valid ISO string for calendar (nested property, second argument)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 2019, monthCode: "M06", calendar }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (second argument)` ++ ); ++ arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property, first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property, second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..387a03412db1ff104e2b39be79eb0d10da0edbb0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,49 @@ ++// 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.plainyearmonth.compare ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), `${description} does not convert to a valid ISO string (second argument)`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), `${description} does not convert to a valid ISO string (nested property, first argument)`); ++ assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), `${description} does not convert to a valid ISO string (nested property, second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), `${description} is not a valid property bag and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), `${description} is not a valid property bag and does not convert to a string (nested property, first argument)`); ++ assert.throws(TypeError, () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), `${description} is not a valid property bag and does not convert to a string (nested property, second argument)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), `nested undefined calendar property is always a RangeError (first argument)`); ++assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), `nested undefined calendar property is always a RangeError (second argument)`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f436289f1258cc20827f50fa1f6768e354c038d6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,29 @@ ++// 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.plainyearmonth.compare ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++ ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), ++ "reject minus zero as extended year (first argument)" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), ++ "reject minus zero as extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c50651ec762454151e11345ee0952845cdb5e079 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plainyearmonth.compare ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainYearMonth ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), `${description} does not convert to a valid ISO string (second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainYearMonth, "Temporal.PlainYearMonth, object"], ++ [Temporal.PlainYearMonth.prototype, "Temporal.PlainYearMonth.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6)), `${description} is not a valid property bag and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/calendar-yearmonthfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/calendar-yearmonthfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..999e5afa760a58e3e525500187b4dd3bd7a2f1d0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/calendar-yearmonthfromfields-called-with-options-undefined.js +@@ -0,0 +1,32 @@ ++// 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.plainyearmonth.compare ++description: > ++ Calendar.yearMonthFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++Temporal.PlainYearMonth.compare({ year: 2000, month: 5, calendar }, { year: 2000, month: 6, calendar }); ++assert.sameValue(calendar.yearMonthFromFieldsCallCount, 2); ++ ++// Test again, but overriding the global Temporal.Calendar.prototype method so ++// we can observe the call to yearMonthFromFields() on the ISO8601 calendar ++// that occurs when we parse the string ++ ++const realYearMonthFromFields = Temporal.Calendar.prototype.yearMonthFromFields; ++let yearMonthFromFieldsCallCount = 0; ++Temporal.Calendar.prototype.yearMonthFromFields = function (fields, options) { ++ yearMonthFromFieldsCallCount++; ++ assert.sameValue(options, undefined, "yearMonthFromFields shouldn't be called with options"); ++ return realYearMonthFromFields.call(this, fields, options); ++} ++ ++Temporal.PlainYearMonth.compare("2000-05-01", "2000-06-01"); ++assert.sameValue(yearMonthFromFieldsCallCount, 2); ++ ++Temporal.Calendar.prototype.yearMonthFromFields = realYearMonthFromFields; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c3c755a4efbafd6ff1174ff1c7f800829e218c14 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/leap-second.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.plainyearmonth.compare ++description: Leap second is a valid ISO string for PlainYearMonth ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++ ++const result1 = Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2016, 12)); ++assert.sameValue(result1, 0, "leap second is a valid ISO string for PlainYearMonth (first argument)"); ++const result2 = Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2016, 12), arg); ++assert.sameValue(result2, 0, "leap second is a valid ISO string for PlainYearMonth (second argument)"); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++ ++const result3 = Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2016, 12)); ++assert.sameValue(result3, 0, "second: 60 is ignored in property bag for PlainYearMonth (first argument)"); ++const result4 = Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2016, 12), arg); ++assert.sameValue(result4, 0, "second: 60 is ignored in property bag for PlainYearMonth (second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/year-zero.js +index 5d1a6cd03ee96015c02383b26fdcfc3b6ae0e3e3..f4de105c408cbc8c0e7e4c6e6a6301c548861472 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/compare/year-zero.js +@@ -8,16 +8,24 @@ features: [Temporal] + ---*/ + + const ok = new Temporal.PlainYearMonth(2000, 5); +-const bad = "-000000-06"; ++const invalidStrings = [ ++ "-000000-06", ++ "-000000-06-24", ++ "-000000-06-24T15:43:27", ++ "-000000-06-24T15:43:27+01:00", ++ "-000000-06-24T15:43:27+00:00[UTC]", ++]; + +-assert.throws( +- RangeError, +- () => Temporal.PlainYearMonth.compare(bad, ok), +- "Cannot use minus zero as extended year (first argument)" +-); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.compare(arg, ok), ++ "Cannot use minus zero as extended year (first argument)" ++ ); + +-assert.throws( +- RangeError, +- () => Temporal.PlainYearMonth.compare(ok, bad), +- "Cannot use minus zero as extended year (second argument)" +-); ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.compare(ok, arg), ++ "Cannot use minus zero as extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-number.js +index 90a720fac0b07b1526d8edd047935aef20243e2e..4c9e3196c6691c88d214a618b47bf84377a047d1 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-number.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-number.js +@@ -3,15 +3,26 @@ + + /*--- + esid: sec-temporal.plainyearmonth.from +-description: A number argument is stringified ++description: A number is converted to a string, then to Temporal.PlainYearMonth + includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const plainYearMonth = Temporal.PlainYearMonth.from(201906); +-TemporalHelpers.assertPlainYearMonth(plainYearMonth, 2019, 6, "M06"); +-const fields = plainYearMonth.getISOFields(); +-assert.sameValue(fields.calendar.id, "iso8601"); +-assert.sameValue(fields.isoDay, 1, "isoDay"); +-assert.sameValue(fields.isoMonth, 6, "isoMonth"); +-assert.sameValue(fields.isoYear, 2019, "isoYear"); ++const arg = 201906; ++ ++const result = Temporal.PlainYearMonth.from(arg); ++TemporalHelpers.assertPlainYearMonth(result, 2019, 6, "M06", "201906 is a valid ISO string for PlainYearMonth"); ++ ++const numbers = [ ++ 1, ++ -201906, ++ 1234567, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.from(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainYearMonth` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-plainyearmonth.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-plainyearmonth.js +index a66b605c012dbd0a8f278482cc40b45df2b5bb58..577318692f1bf7a30a7ec4fb38eb5857a2e2388e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-plainyearmonth.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-plainyearmonth.js +@@ -3,20 +3,23 @@ + + /*--- + esid: sec-temporal.plainyearmonth.from +-description: A PlainYearMonth argument is cloned ++description: A PlainYearMonth object is copied, not returned directly + includes: [temporalHelpers.js] + features: [Temporal] + ---*/ + +-const original = new Temporal.PlainYearMonth(2019, 11, undefined, 7); +-const result = Temporal.PlainYearMonth.from(original); +-assert.notSameValue(result, original); ++const orig = new Temporal.PlainYearMonth(2000, 5, undefined, 7); ++const result = Temporal.PlainYearMonth.from(orig); + +-for (const plainYearMonth of [original, result]) { +- TemporalHelpers.assertPlainYearMonth(plainYearMonth, 2019, 11, "M11"); +- const fields = plainYearMonth.getISOFields(); +- assert.sameValue(fields.calendar.id, "iso8601"); +- assert.sameValue(fields.isoDay, 7, "isoDay"); +- assert.sameValue(fields.isoMonth, 11, "isoMonth"); +- assert.sameValue(fields.isoYear, 2019, "isoYear"); +-} ++TemporalHelpers.assertPlainYearMonth( ++ result, ++ 2000, 5, "M05", ++ "PlainYearMonth is copied", ++ /* era = */ undefined, /* eraYear = */ undefined, /* isoDay = */ 7 ++); ++ ++assert.notSameValue( ++ result, ++ orig, ++ "When a PlainYearMonth is given, the returned value is not the original PlainYearMonth" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..34160a40db06d922687f62274af681372a2f77fa +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-leap-second.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.plainyearmonth.from ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 2019, monthCode: "M06", calendar }; ++const result1 = Temporal.PlainYearMonth.from(arg); ++TemporalHelpers.assertPlainYearMonth( ++ result1, ++ 2019, 6, "M06", ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++const result2 = Temporal.PlainYearMonth.from(arg); ++TemporalHelpers.assertPlainYearMonth( ++ result2, ++ 2019, 6, "M06", ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ecead4225c1e710f054e78c24f96e858fbced034 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-number.js +@@ -0,0 +1,40 @@ ++// 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.plainyearmonth.from ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = 19970327; ++ ++let arg = { year: 2019, monthCode: "M06", calendar }; ++const result1 = Temporal.PlainYearMonth.from(arg); ++TemporalHelpers.assertPlainYearMonth(result1, 2019, 6, "M06", "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++const result2 = Temporal.PlainYearMonth.from(arg); ++TemporalHelpers.assertPlainYearMonth(result2, 2019, 6, "M06", "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 2019, monthCode: "M06", calendar }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.from(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.from(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0419e3c42133c84cf893ed68cd6c307036325770 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,44 @@ ++// 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.plainyearmonth.from ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => Temporal.PlainYearMonth.from(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => Temporal.PlainYearMonth.from(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => Temporal.PlainYearMonth.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => Temporal.PlainYearMonth.from(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => Temporal.PlainYearMonth.from(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..60b0d94490958df4eff80bfa7a0c2d82b4b49180 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plainyearmonth.from ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++ ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.from(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5e4154a3e006328dcf1562a34c9a746f215d7171 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/argument-wrong-type.js +@@ -0,0 +1,34 @@ ++// 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.plainyearmonth.from ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainYearMonth ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.PlainYearMonth.from(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainYearMonth, "Temporal.PlainYearMonth, object"], ++ [Temporal.PlainYearMonth.prototype, "Temporal.PlainYearMonth.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.PlainYearMonth.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/calendar-yearmonthfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/calendar-yearmonthfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f3f33f1ba0f8936b0cb3ae58b27e724d1bb37b06 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/calendar-yearmonthfromfields-called-with-options-undefined.js +@@ -0,0 +1,23 @@ ++// 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.plainyearmonth.from ++description: > ++ Calendar.yearMonthFromFields method is called with undefined as the options ++ value when call originates internally ++features: [Temporal] ++---*/ ++ ++const realYearMonthFromFields = Temporal.Calendar.prototype.yearMonthFromFields; ++let yearMonthFromFieldsCallCount = 0; ++Temporal.Calendar.prototype.yearMonthFromFields = function (fields, options) { ++ yearMonthFromFieldsCallCount++; ++ assert.sameValue(options, undefined, "yearMonthFromFields shouldn't be called with options"); ++ return realYearMonthFromFields.call(this, fields, options); ++} ++ ++Temporal.PlainYearMonth.from("2000-05-01"); ++assert.sameValue(yearMonthFromFieldsCallCount, 1); ++ ++Temporal.Calendar.prototype.yearMonthFromFields = realYearMonthFromFields; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..818a43dc1b407dfd392ef0efd2fc727ed8d37a5c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/leap-second.js +@@ -0,0 +1,41 @@ ++// 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.plainyearmonth.from ++description: Leap second is a valid ISO string for PlainYearMonth ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60"; ++ ++const result1 = Temporal.PlainYearMonth.from(arg); ++TemporalHelpers.assertPlainYearMonth( ++ result1, ++ 2016, 12, "M12", ++ "leap second is a valid ISO string for PlainYearMonth" ++); ++ ++const result2 = Temporal.PlainYearMonth.from(arg, { overflow: "reject" }); ++TemporalHelpers.assertPlainYearMonth( ++ result2, ++ 2016, 12, "M12", ++ "leap second is a valid ISO string for PlainYearMonth" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++ ++const result3 = Temporal.PlainYearMonth.from(arg); ++TemporalHelpers.assertPlainYearMonth( ++ result3, ++ 2016, 12, "M12", ++ "second: 60 is ignored in property bag for PlainYearMonth" ++); ++ ++const result4 = Temporal.PlainYearMonth.from(arg, { overflow: "reject" }); ++TemporalHelpers.assertPlainYearMonth( ++ result4, ++ 2016, 12, "M12", ++ "second: 60 is ignored in property bag for PlainYearMonth even with overflow: reject" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eb85b8180b3add9fa9d5b89968a760b8b9704d9d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/options-wrong-type.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.plainyearmonth.from ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++for (const value of badOptions) { ++ assert.throws(TypeError, () => Temporal.PlainYearMonth.from({ year: 2021, monthCode: "M01" }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/overflow-invalid-string.js +index d30774eece5296d656eaa1ce2abd5318ae9556bf..11335f2481a24dfbe3ae13bc86d14e9eaedf70e3 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/overflow-invalid-string.js +@@ -27,8 +27,14 @@ const validValues = [ + { year: 2000, month: 5 }, + "2000-05", + ]; +-validValues.forEach((value) => { +- ["", "CONSTRAIN", "balance", "other string", "constra\u0131n"].forEach((overflow) => { +- assert.throws(RangeError, () => Temporal.PlainYearMonth.from(value, { overflow })); +- }); +-}); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const value of validValues) { ++ for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => Temporal.PlainYearMonth.from(value, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++ } ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/year-zero.js +index 1d8c7b3af73e8af8ca4604dba109b36c2158242a..930951a8dae2b9448b34f8dc75b08b8d55af0627 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/from/year-zero.js +@@ -8,15 +8,17 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-06', +- '-000000-06-24', +- '-000000-06-24T15:43:27', +- '-000000-06-24T15:43:27+01:00[UTC]' ++ "-000000-06", ++ "-000000-06-24", ++ "-000000-06-24T15:43:27", ++ "-000000-06-24T15:43:27+01:00", ++ "-000000-06-24T15:43:27+00:00[UTC]", + ]; ++ + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => { Temporal.PlainYearMonth.from(arg); }, ++ () => Temporal.PlainYearMonth.from(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/limits.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/limits.js +index 696184b9906192f8362738f98147f74441c6c90d..5bc38a4107a1c893f6b18eef78def059f1ade192 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/limits.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/limits.js +@@ -13,8 +13,10 @@ assert.throws(RangeError, () => new Temporal.PlainYearMonth(275760, 10), "max"); + TemporalHelpers.assertPlainYearMonth(new Temporal.PlainYearMonth(-271821, 4), + -271821, 4, "M04", "min"); + TemporalHelpers.assertPlainYearMonth(new Temporal.PlainYearMonth(-271821, 4, "iso8601", 18), +- -271821, 4, "M04", "min with referenceISODay"); ++ -271821, 4, "M04", "min with referenceISODay", ++ /* era = */ undefined, /* eraYear = */ undefined, /* referenceISODay = */ 18); + TemporalHelpers.assertPlainYearMonth(new Temporal.PlainYearMonth(275760, 9), + 275760, 9, "M09", "max"); + TemporalHelpers.assertPlainYearMonth(new Temporal.PlainYearMonth(275760, 9, "iso8601", 14), +- 275760, 9, "M09", "max with referenceISODay"); ++ 275760, 9, "M09", "max with referenceISODay", ++ /* era = */ undefined, /* eraYear = */ undefined, /* referenceISODay = */ 14); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js +new file mode 100644 +index 0000000000000000000000000000000000000000..40f5dd1b73870bcd5f9c796908fe95794661f425 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/calendar-datefromfields-called.js +@@ -0,0 +1,156 @@ ++// 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.plainyearmonth.prototype.add ++description: > ++ Calls calendar's dateFromFields method to obtain a start date for the ++ operation, based on the sign of the duration ++info: | ++ 8. Let _fields_ be ? PrepareTemporalFields(_yearMonth_, _fieldNames_, «»). ++ 9. Let _sign_ be ! DurationSign(_duration_.[[Years]], _duration_.[[Months]], _duration_.[[Weeks]], _balanceResult_.[[Days]], 0, 0, 0, 0, 0, 0). ++ 10. If _sign_ < 0, then ++ a. Let _dayFromCalendar_ be ? CalendarDaysInMonth(_calendar_, _yearMonth_). ++ b. Let _day_ be ? ToPositiveInteger(_dayFromCalendar_). ++ 11. Else, ++ a. Let _day_ be 1. ++ 12. Perform ! CreateDataPropertyOrThrow(_fields_, *"day"*, _day_). ++ 13. Let _date_ be ? DateFromFields(_calendar_, _fields_, *undefined*). ++includes: [deepEqual.js, temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++class CustomCalendar extends Temporal.Calendar { ++ constructor() { ++ super("iso8601"); ++ this.dateFromFieldsCalls = []; ++ } ++ year(date) { ++ // years in this calendar start and end on the same day as ISO 8601 years ++ return date.getISOFields().isoYear; ++ } ++ month(date) { ++ // this calendar has 10 months of 36 days each, plus an 11th month of 5 or 6 ++ const { isoYear, isoMonth, isoDay } = date.getISOFields(); ++ const isoDate = new Temporal.PlainDate(isoYear, isoMonth, isoDay); ++ return Math.floor((isoDate.dayOfYear - 1) / 36) + 1; ++ } ++ monthCode(date) { ++ return "M" + this.month(date).toString().padStart(2, "0"); ++ } ++ day(date) { ++ return (date.dayOfYear - 1) % 36 + 1; ++ } ++ daysInMonth(date) { ++ if (this.month(date) < 11) return 36; ++ return this.daysInYear(date) - 360; ++ } ++ _dateFromFieldsImpl({ year, month, monthCode, day }) { ++ if (year === undefined) throw new TypeError("year required"); ++ if (month === undefined && monthCode === undefined) throw new TypeError("one of month or monthCode required"); ++ if (month !== undefined && month < 1) throw new RangeError("month < 1"); ++ if (day === undefined) throw new TypeError("day required"); ++ ++ if (monthCode !== undefined) { ++ const numberPart = +(monthCode.slice(1)); ++ if ("M" + `${numberPart}`.padStart(2, "0") !== monthCode) throw new RangeError("invalid monthCode"); ++ if (month === undefined) { ++ month = numberPart; ++ } else if (month !== numberPart) { ++ throw new RangeError("month and monthCode must match"); ++ } ++ } ++ ++ const isoDayOfYear = (month - 1) * 36 + day; ++ return new Temporal.PlainDate(year, 1, 1).add({ days: isoDayOfYear - 1 }).withCalendar(this); ++ } ++ dateFromFields(...args) { ++ this.dateFromFieldsCalls.push(args); ++ return this._dateFromFieldsImpl(...args); ++ } ++ yearMonthFromFields(fields, options) { ++ const { isoYear, isoMonth, isoDay } = this._dateFromFieldsImpl({ ...fields, day: 1 }, options).getISOFields(); ++ return new Temporal.PlainYearMonth(isoYear, isoMonth, this, isoDay); ++ } ++ monthDayFromFields(fields, options) { ++ const { isoYear, isoMonth, isoDay } = this._dateFromFieldsImpl({ ...fields, year: 2000 }, options).getISOFields(); ++ return new Temporal.PlainMonthDay(isoMonth, isoDay, this, isoYear); ++ } ++ dateAdd(date, duration, options) { ++ if (duration.months) throw new Error("adding months not implemented in this test"); ++ return super.dateAdd(date, duration, options); ++ } ++ toString() { ++ return "thirty-six"; ++ } ++} ++ ++const calendar = new CustomCalendar(); ++const month2 = Temporal.PlainYearMonth.from({ year: 2022, month: 2, calendar }); ++const lessThanOneMonth = new Temporal.Duration(0, 0, 0, 35); ++const oneMonth = new Temporal.Duration(0, 0, 0, 36); ++ ++// Reference ISO dates in the custom calendar: ++// M01 = 01-01 ++// M02 = 02-06 ++// M03 = 03-14 ++ ++calendar.dateFromFieldsCalls = []; ++TemporalHelpers.assertPlainYearMonth( ++ month2.add(lessThanOneMonth), ++ 2022, 2, "M02", ++ "adding positive less than one month's worth of days yields the same month", ++ /* era = */ undefined, /* eraYear = */ undefined, /* referenceISODay = */ 6 ++); ++assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called"); ++assert.deepEqual( ++ calendar.dateFromFieldsCalls[0][0], ++ { year: 2022, month: 2, monthCode: "M02", day: 1 }, ++ "first day of month 2 passed to dateFromFields when adding positive duration" ++); ++assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed"); ++ ++calendar.dateFromFieldsCalls = []; ++TemporalHelpers.assertPlainYearMonth( ++ month2.add(oneMonth), ++ 2022, 3, "M03", ++ "adding positive one month's worth of days yields the following month", ++ /* era = */ undefined, /* eraYear = */ undefined, /* referenceISODay = */ 14 ++); ++assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called"); ++assert.deepEqual( ++ calendar.dateFromFieldsCalls[0][0], ++ { year: 2022, month: 2, monthCode: "M02", day: 1 }, ++ "first day of month 2 passed to dateFromFields when adding positive duration" ++); ++assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed"); ++ ++calendar.dateFromFieldsCalls = []; ++TemporalHelpers.assertPlainYearMonth( ++ month2.add(lessThanOneMonth.negated()), ++ 2022, 2, "M02", ++ "adding negative less than one month's worth of days yields the same month", ++ /* era = */ undefined, /* eraYear = */ undefined, /* referenceISODay = */ 6 ++); ++assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called"); ++assert.deepEqual( ++ calendar.dateFromFieldsCalls[0][0], ++ { year: 2022, month: 2, monthCode: "M02", day: 36 }, ++ "last day of month 2 passed to dateFromFields when adding negative duration" ++); ++assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed"); ++ ++calendar.dateFromFieldsCalls = []; ++TemporalHelpers.assertPlainYearMonth( ++ month2.add(oneMonth.negated()), ++ 2022, 1, "M01", ++ "adding negative one month's worth of days yields the previous month", ++ /* era = */ undefined, /* eraYear = */ undefined, /* referenceISODay = */ 1 ++); ++assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called"); ++assert.deepEqual( ++ calendar.dateFromFieldsCalls[0][0], ++ { year: 2022, month: 2, monthCode: "M02", day: 36 }, ++ "last day of month 2 passed to dateFromFields when adding negative duration" ++); ++assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..95d62d106b2d8efe9d93a266bfaafded64744c6b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plainyearmonth.prototype.add ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainYearMonth(2019, 10); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.add({ months: 1 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/overflow-invalid-string.js +index 4913de46a290e4174ce7ba151d74617aa4b7484b..1633f1b6544ef614f0512e9199856989bae8874a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/add/overflow-invalid-string.js +@@ -20,6 +20,12 @@ features: [Temporal] + + const yearmonth = new Temporal.PlainYearMonth(2000, 5); + const duration = new Temporal.Duration(1, 1); +-for (const overflow of ["", "CONSTRAIN", "balance", "other string", "constra\u0131n"]) { +- assert.throws(RangeError, () => yearmonth.add(duration, { overflow })); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => yearmonth.add(duration, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..11cbfd5e07bebb33b6b14f31fe4a9c2f7ce83458 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.plainyearmonth.prototype.equals ++description: A number is converted to a string, then to Temporal.PlainYearMonth ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2019, 6); ++ ++const arg = 201906; ++ ++const result = instance.equals(arg); ++assert.sameValue(result, true, "201906 is a valid ISO string for PlainYearMonth"); ++ ++const numbers = [ ++ 1, ++ -201906, ++ 1234567, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainYearMonth` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3d446c7789806d6f7f05c5b983e0375437ee9a17 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.plainyearmonth.prototype.equals ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2019, 6); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 2019, monthCode: "M06", calendar }; ++const result1 = instance.equals(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++const result2 = instance.equals(arg); ++assert.sameValue( ++ result2, ++ true, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cd1ea7b30d318bb160bf2cc96b74e987d6f7cc7b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.plainyearmonth.prototype.equals ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2019, 6); ++ ++const calendar = 19970327; ++ ++let arg = { year: 2019, monthCode: "M06", calendar }; ++const result1 = instance.equals(arg); ++assert.sameValue(result1, true, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++const result2 = instance.equals(arg); ++assert.sameValue(result2, true, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 2019, monthCode: "M06", calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..137b9ffdbeb4a507af7d620981166109952e467a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.plainyearmonth.prototype.equals ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainYearMonth(2000, 5); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.equals(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b5e0c3045ca25b2970ed7408d4bc62e74509baec +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plainyearmonth.prototype.equals ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainYearMonth(2000, 5); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-wrong-type.js +index 61bac7360141d01e18aa65109a8827e97a832c3d..f3c1e56acaa2fb929e1faaa35ee627273e4843a0 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/argument-wrong-type.js +@@ -1,20 +1,36 @@ +-// Copyright (C) 2020 Igalia, S.L. All rights reserved. ++// 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.plainyearmonth.prototype.equals +-description: Appropriate error thrown when argument cannot be converted to a valid string +-features: [Symbol, Temporal] ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainYearMonth ++features: [BigInt, Symbol, Temporal] + ---*/ + +-const instance = Temporal.PlainYearMonth.from({ year: 2000, month: 5, day: 2 }); ++const instance = new Temporal.PlainYearMonth(2000, 5); + +-assert.throws(RangeError, () => instance.equals(undefined), "undefined"); +-assert.throws(RangeError, () => instance.equals(null), "null"); +-assert.throws(RangeError, () => instance.equals(true), "true"); +-assert.throws(RangeError, () => instance.equals(""), "empty string"); +-assert.throws(TypeError, () => instance.equals(Symbol()), "symbol"); +-assert.throws(RangeError, () => instance.equals(1), "1"); +-assert.throws(TypeError, () => instance.equals({}), "plain object"); +-assert.throws(TypeError, () => instance.equals(Temporal.PlainYearMonth), "Temporal.PlainYearMonth"); +-assert.throws(TypeError, () => instance.equals(Temporal.PlainYearMonth.prototype), "Temporal.PlainYearMonth.prototype"); ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainYearMonth, "Temporal.PlainYearMonth, object"], ++ [Temporal.PlainYearMonth.prototype, "Temporal.PlainYearMonth.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/calendar-yearmonthfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/calendar-yearmonthfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..490c35f49390f965227174382b2d473d92f03bd3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/calendar-yearmonthfromfields-called-with-options-undefined.js +@@ -0,0 +1,35 @@ ++// 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.plainyearmonth.prototype.equals ++description: > ++ Calendar.yearMonthFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++let calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++let instance = new Temporal.PlainYearMonth(2000, 5, calendar); ++instance.equals({ year: 2000, month: 6, calendar }); ++assert.sameValue(calendar.yearMonthFromFieldsCallCount, 1); ++ ++// Test again, but overriding the global Temporal.Calendar.prototype method so ++// we can observe the call to yearMonthFromFields() on the ISO8601 calendar ++// that occurs when we parse the string ++ ++const realYearMonthFromFields = Temporal.Calendar.prototype.yearMonthFromFields; ++let yearMonthFromFieldsCallCount = 0; ++Temporal.Calendar.prototype.yearMonthFromFields = function (fields, options) { ++ yearMonthFromFieldsCallCount++; ++ assert.sameValue(options, undefined, "yearMonthFromFields shouldn't be called with options"); ++ return realYearMonthFromFields.call(this, fields, options); ++} ++ ++calendar = new Temporal.Calendar("iso8601"); ++instance = new Temporal.PlainYearMonth(2000, 5, calendar); ++instance.equals("2000-06-01"); ++assert.sameValue(yearMonthFromFieldsCallCount, 1); ++ ++Temporal.Calendar.prototype.yearMonthFromFields = realYearMonthFromFields; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..210c4209572f759fbea55279a70f0a9b65b4acbc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.plainyearmonth.prototype.equals ++description: Leap second is a valid ISO string for PlainYearMonth ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2016, 12); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.equals(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for PlainYearMonth" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.equals(arg); ++assert.sameValue( ++ result2, ++ true, ++ "second: 60 is ignored in property bag for PlainYearMonth" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/year-zero.js +index 9ab97736fd50b75880af9f86e3fc1c912456efcf..11c10168d7db805cef1e1b882fcd47537350d746 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/equals/year-zero.js +@@ -3,15 +3,16 @@ + + /*--- + esid: sec-temporal.plainyearmonth.prototype.equals +-description: RangeError thrown if a string with UTC designator is used as a PlainYearMonth ++description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-06', +- '-000000-06-24', +- '-000000-06-24T15:43:27', +- '-000000-06-24T15:43:27+01:00[UTC]' ++ "-000000-06", ++ "-000000-06-24", ++ "-000000-06-24T15:43:27", ++ "-000000-06-24T15:43:27+01:00", ++ "-000000-06-24T15:43:27+00:00[UTC]", + ]; + const instance = new Temporal.PlainYearMonth(2000, 5); + invalidStrings.forEach((arg) => { +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f9116301e5a7464e196851baa2219cbaca056f12 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.plainyearmonth.prototype.since ++description: A number is converted to a string, then to Temporal.PlainYearMonth ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2019, 6); ++ ++const arg = 201906; ++ ++const result = instance.since(arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "201906 is a valid ISO string for PlainYearMonth"); ++ ++const numbers = [ ++ 1, ++ -201906, ++ 1234567, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainYearMonth` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9a276a1a4c5f4111226db53dd8f06659480ead80 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.plainyearmonth.prototype.since ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2019, 6); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 2019, monthCode: "M06", calendar }; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ab573e785ab4fc6048ef46de1d2dd74ce93687f1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.plainyearmonth.prototype.since ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2019, 6); ++ ++const calendar = 19970327; ++ ++let arg = { year: 2019, monthCode: "M06", calendar }; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 2019, monthCode: "M06", calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..da4a19a8bfc8ed489cde40ec0d9961d6e1b520e0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.plainyearmonth.prototype.since ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainYearMonth(2000, 5); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.since(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c4701a3aeb9ac7ddb938ce6f9882da5f05fb4950 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plainyearmonth.prototype.since ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainYearMonth(2000, 5); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7078e9941c83521be600335bc0104e91a39c6ffa +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plainyearmonth.prototype.since ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainYearMonth ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2000, 5); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainYearMonth, "Temporal.PlainYearMonth, object"], ++ [Temporal.PlainYearMonth.prototype, "Temporal.PlainYearMonth.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d7978361ad5e552ccb9edc2763f95752d3fdf825 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.plainyearmonth.prototype.since ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainYearMonth(2000, 5, calendar); ++instance.since({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 2); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-yearmonthfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-yearmonthfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..db48db0cfaaeb0a5b26064dbce5479f2f57bdb77 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/calendar-yearmonthfromfields-called-with-options-undefined.js +@@ -0,0 +1,35 @@ ++// 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.plainyearmonth.prototype.since ++description: > ++ Calendar.yearMonthFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++let calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++let instance = new Temporal.PlainYearMonth(2000, 5, calendar); ++instance.since({ year: 2000, month: 6, calendar }); ++assert.sameValue(calendar.yearMonthFromFieldsCallCount, 1); ++ ++// Test again, but overriding the global Temporal.Calendar.prototype method so ++// we can observe the call to yearMonthFromFields() on the ISO8601 calendar ++// that occurs when we parse the string ++ ++const realYearMonthFromFields = Temporal.Calendar.prototype.yearMonthFromFields; ++let yearMonthFromFieldsCallCount = 0; ++Temporal.Calendar.prototype.yearMonthFromFields = function (fields, options) { ++ yearMonthFromFieldsCallCount++; ++ assert.sameValue(options, undefined, "yearMonthFromFields shouldn't be called with options"); ++ return realYearMonthFromFields.call(this, fields, options); ++} ++ ++calendar = new Temporal.Calendar("iso8601"); ++instance = new Temporal.PlainYearMonth(2000, 5, calendar); ++instance.since("2000-06-01"); ++assert.sameValue(yearMonthFromFieldsCallCount, 1); ++ ++Temporal.Calendar.prototype.yearMonthFromFields = realYearMonthFromFields; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-invalid-string.js +index 09b7687f263ffa25d79ee8a3818c0668da1dd75d..00a668d252dba096e28c035f44a9c8e46b901845 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/largestunit-invalid-string.js +@@ -9,7 +9,34 @@ features: [Temporal] + + const earlier = new Temporal.PlainYearMonth(2000, 5); + const later = new Temporal.PlainYearMonth(2001, 6); +-const values = ["era", "eraYear", "weeks", "days", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "week", ++ "day", ++ "hour", ++ "minute", ++ "second", ++ "millisecond", ++ "microsecond", ++ "nanosecond", ++ "month\0", ++ "YEAR", ++ "eras", ++ "eraYears", ++ "weeks", ++ "days", ++ "hours", ++ "minutes", ++ "seconds", ++ "milliseconds", ++ "microseconds", ++ "nanoseconds", ++ "months\0", ++ "YEARS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..651cf05d3246514c9cee24789127c18c5856a80d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/leap-second.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.plainyearmonth.prototype.since ++description: Leap second is a valid ISO string for PlainYearMonth ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2016, 12); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainYearMonth" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainYearMonth" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9441a8e4dbafac0f2bb4ba055b5ad2a261975a5a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plainyearmonth.prototype.since ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainYearMonth(2019, 10); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.since(new Temporal.PlainYearMonth(1976, 11), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-invalid-string.js +index 14cbe1ac2fb10340a20d11440513ea57a7bef6b0..ae3e9de8e347b8b496703e3727ca1f6a7e8885af 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/roundingmode-invalid-string.js +@@ -9,4 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.PlainYearMonth(2000, 5); + const later = new Temporal.PlainYearMonth(2001, 6); +-assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/smallestunit-invalid-string.js +index 21b0c4b69839c244149040bb23f22e95ebdc1cb9..f8e1f541a06b71ee24ce122cebf1d56dc8b3477a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/smallestunit-invalid-string.js +@@ -9,7 +9,34 @@ features: [Temporal] + + const earlier = new Temporal.PlainYearMonth(2000, 5); + const later = new Temporal.PlainYearMonth(2001, 6); +-const values = ["era", "eraYear", "weeks", "days", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "week", ++ "day", ++ "hour", ++ "minute", ++ "second", ++ "millisecond", ++ "microsecond", ++ "nanosecond", ++ "month\0", ++ "YEAR", ++ "eras", ++ "eraYears", ++ "weeks", ++ "days", ++ "hours", ++ "minutes", ++ "seconds", ++ "milliseconds", ++ "microseconds", ++ "nanoseconds", ++ "months\0", ++ "YEARS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/year-zero.js +index e1b961038314f17fdddc585dfc2c614956b18dfc..7bb5b9611c79acd98c95e0adb7d0ef06499665cf 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/since/year-zero.js +@@ -3,15 +3,16 @@ + + /*--- + esid: sec-temporal.plainyearmonth.prototype.since +-description: RangeError thrown if a string with UTC designator is used as a PlainYearMonth ++description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-06', +- '-000000-06-24', +- '-000000-06-24T15:43:27', +- '-000000-06-24T15:43:27+01:00[UTC]' ++ "-000000-06", ++ "-000000-06-24", ++ "-000000-06-24T15:43:27", ++ "-000000-06-24T15:43:27+01:00", ++ "-000000-06-24T15:43:27+00:00[UTC]", + ]; + const instance = new Temporal.PlainYearMonth(2000, 5); + invalidStrings.forEach((arg) => { +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fda7e4bbacb84afda2791fd84e6a12eb33fedb1c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/calendar-datefromfields-called.js +@@ -0,0 +1,156 @@ ++// 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.plainyearmonth.prototype.subtract ++description: > ++ Calls calendar's dateFromFields method to obtain a start date for the ++ operation, based on the sign of the duration ++info: | ++ 9. Let _fields_ be ? PrepareTemporalFields(_yearMonth_, _fieldNames_, «»). ++ 10. Let _sign_ be ! DurationSign(_duration_.[[Years]], _duration_.[[Months]], _duration_.[[Weeks]], _balanceResult_.[[Days]], 0, 0, 0, 0, 0, 0). ++ 11. If _sign_ < 0, then ++ a. Let _dayFromCalendar_ be ? CalendarDaysInMonth(_calendar_, _yearMonth_). ++ b. Let _day_ be ? ToPositiveInteger(_dayFromCalendar_). ++ 12. Else, ++ a. Let _day_ be 1. ++ 13. Perform ! CreateDataPropertyOrThrow(_fields_, *"day"*, _day_). ++ 14. Let _date_ be ? DateFromFields(_calendar_, _fields_, *undefined*). ++includes: [deepEqual.js, temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++class CustomCalendar extends Temporal.Calendar { ++ constructor() { ++ super("iso8601"); ++ this.dateFromFieldsCalls = []; ++ } ++ year(date) { ++ // years in this calendar start and end on the same day as ISO 8601 years ++ return date.getISOFields().isoYear; ++ } ++ month(date) { ++ // this calendar has 10 months of 36 days each, plus an 11th month of 5 or 6 ++ const { isoYear, isoMonth, isoDay } = date.getISOFields(); ++ const isoDate = new Temporal.PlainDate(isoYear, isoMonth, isoDay); ++ return Math.floor((isoDate.dayOfYear - 1) / 36) + 1; ++ } ++ monthCode(date) { ++ return "M" + this.month(date).toString().padStart(2, "0"); ++ } ++ day(date) { ++ return (date.dayOfYear - 1) % 36 + 1; ++ } ++ daysInMonth(date) { ++ if (this.month(date) < 11) return 36; ++ return this.daysInYear(date) - 360; ++ } ++ _dateFromFieldsImpl({ year, month, monthCode, day }) { ++ if (year === undefined) throw new TypeError("year required"); ++ if (month === undefined && monthCode === undefined) throw new TypeError("one of month or monthCode required"); ++ if (month !== undefined && month < 1) throw new RangeError("month < 1"); ++ if (day === undefined) throw new TypeError("day required"); ++ ++ if (monthCode !== undefined) { ++ const numberPart = +(monthCode.slice(1)); ++ if ("M" + `${numberPart}`.padStart(2, "0") !== monthCode) throw new RangeError("invalid monthCode"); ++ if (month === undefined) { ++ month = numberPart; ++ } else if (month !== numberPart) { ++ throw new RangeError("month and monthCode must match"); ++ } ++ } ++ ++ const isoDayOfYear = (month - 1) * 36 + day; ++ return new Temporal.PlainDate(year, 1, 1).add({ days: isoDayOfYear - 1 }).withCalendar(this); ++ } ++ dateFromFields(...args) { ++ this.dateFromFieldsCalls.push(args); ++ return this._dateFromFieldsImpl(...args); ++ } ++ yearMonthFromFields(fields, options) { ++ const { isoYear, isoMonth, isoDay } = this._dateFromFieldsImpl({ ...fields, day: 1 }, options).getISOFields(); ++ return new Temporal.PlainYearMonth(isoYear, isoMonth, this, isoDay); ++ } ++ monthDayFromFields(fields, options) { ++ const { isoYear, isoMonth, isoDay } = this._dateFromFieldsImpl({ ...fields, year: 2000 }, options).getISOFields(); ++ return new Temporal.PlainMonthDay(isoMonth, isoDay, this, isoYear); ++ } ++ dateAdd(date, duration, options) { ++ if (duration.months) throw new Error("adding months not implemented in this test"); ++ return super.dateAdd(date, duration, options); ++ } ++ toString() { ++ return "thirty-six"; ++ } ++} ++ ++const calendar = new CustomCalendar(); ++const month2 = Temporal.PlainYearMonth.from({ year: 2022, month: 2, calendar }); ++const lessThanOneMonth = new Temporal.Duration(0, 0, 0, 35); ++const oneMonth = new Temporal.Duration(0, 0, 0, 36); ++ ++// Reference ISO dates in the custom calendar: ++// M01 = 01-01 ++// M02 = 02-06 ++// M03 = 03-14 ++ ++calendar.dateFromFieldsCalls = []; ++TemporalHelpers.assertPlainYearMonth( ++ month2.subtract(lessThanOneMonth), ++ 2022, 2, "M02", ++ "subtracting positive less than one month's worth of days yields the same month", ++ /* era = */ undefined, /* eraYear = */ undefined, /* referenceISODay = */ 6 ++); ++assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called"); ++assert.deepEqual( ++ calendar.dateFromFieldsCalls[0][0], ++ { year: 2022, month: 2, monthCode: "M02", day: 36 }, ++ "last day of month 2 passed to dateFromFields when subtracting positive duration" ++); ++assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed"); ++ ++calendar.dateFromFieldsCalls = []; ++TemporalHelpers.assertPlainYearMonth( ++ month2.subtract(oneMonth), ++ 2022, 1, "M01", ++ "subtracting positive one month's worth of days yields the previous month", ++ /* era = */ undefined, /* eraYear = */ undefined, /* referenceISODay = */ 1 ++); ++assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called"); ++assert.deepEqual( ++ calendar.dateFromFieldsCalls[0][0], ++ { year: 2022, month: 2, monthCode: "M02", day: 36 }, ++ "last day of month 2 passed to dateFromFields when subtracting positive duration" ++); ++assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed"); ++ ++calendar.dateFromFieldsCalls = []; ++TemporalHelpers.assertPlainYearMonth( ++ month2.subtract(lessThanOneMonth.negated()), ++ 2022, 2, "M02", ++ "subtracting negative less than one month's worth of days yields the same month", ++ /* era = */ undefined, /* eraYear = */ undefined, /* referenceISODay = */ 6 ++); ++assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called"); ++assert.deepEqual( ++ calendar.dateFromFieldsCalls[0][0], ++ { year: 2022, month: 2, monthCode: "M02", day: 1 }, ++ "first day of month 2 passed to dateFromFields when subtracting negative duration" ++); ++assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed"); ++ ++calendar.dateFromFieldsCalls = []; ++TemporalHelpers.assertPlainYearMonth( ++ month2.subtract(oneMonth.negated()), ++ 2022, 3, "M03", ++ "subtracting negative one month's worth of days yields the following month", ++ /* era = */ undefined, /* eraYear = */ undefined, /* referenceISODay = */ 14 ++); ++assert.sameValue(calendar.dateFromFieldsCalls.length, 1, "dateFromFields was called"); ++assert.deepEqual( ++ calendar.dateFromFieldsCalls[0][0], ++ { year: 2022, month: 2, monthCode: "M02", day: 1 }, ++ "first day of month 2 passed to dateFromFields when subtracting negative duration" ++); ++assert.sameValue(calendar.dateFromFieldsCalls[0][1], undefined, "undefined options passed"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d64177826d65aeb01792b63567beb958057f16e3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plainyearmonth.prototype.subtract ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainYearMonth(2019, 10); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.subtract({ months: 1 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/overflow-invalid-string.js +index 8c2efb855a74812a89c0b8843eea337009afdd53..46286d5a6a21c1f2135b04fd9ec4c416c698ec9f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/subtract/overflow-invalid-string.js +@@ -20,6 +20,12 @@ features: [Temporal] + + const yearmonth = new Temporal.PlainYearMonth(2000, 5); + const duration = new Temporal.Duration(1, 1); +-for (const overflow of ["", "CONSTRAIN", "balance", "other string", "constra\u0131n"]) { +- assert.throws(RangeError, () => yearmonth.subtract(duration, { overflow })); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => yearmonth.subtract(duration, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toJSON/year-format.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toJSON/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..706d3624a0f2b5dbe77b80fc3d1db0bf26410134 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toJSON/year-format.js +@@ -0,0 +1,47 @@ ++// 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.plainyearmonth.prototype.tojson ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++let instance = new Temporal.PlainYearMonth(-100000, 12); ++assert.sameValue(instance.toJSON(), "-100000-12", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(-10000, 4); ++assert.sameValue(instance.toJSON(), "-010000-04", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(-9999, 6); ++assert.sameValue(instance.toJSON(), "-009999-06", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(-1000, 8); ++assert.sameValue(instance.toJSON(), "-001000-08", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(-999, 10); ++assert.sameValue(instance.toJSON(), "-000999-10", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(-1, 8); ++assert.sameValue(instance.toJSON(), "-000001-08", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(0, 6); ++assert.sameValue(instance.toJSON(), "0000-06", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.PlainYearMonth(1, 4); ++assert.sameValue(instance.toJSON(), "0001-04", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.PlainYearMonth(999, 2); ++assert.sameValue(instance.toJSON(), "0999-02", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainYearMonth(1000, 1); ++assert.sameValue(instance.toJSON(), "1000-01", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainYearMonth(9999, 4); ++assert.sameValue(instance.toJSON(), "9999-04", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainYearMonth(10000, 6); ++assert.sameValue(instance.toJSON(), "+010000-06", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(100000, 8); ++assert.sameValue(instance.toJSON(), "+100000-08", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-always.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-always.js +index d6fa52e10649241a1b9af0b632579521020f2309..be8cc7e93f8812e663bf71e2ee1b509540c45d31 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-always.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/calendarname-always.js +@@ -14,7 +14,7 @@ const yearmonth1 = new Temporal.PlainYearMonth(2000, 5); + const yearmonth2 = new Temporal.PlainYearMonth(2000, 5, calendar); + + [ +- [yearmonth1, "2000-05[u-ca=iso8601]"], ++ [yearmonth1, "2000-05-01[u-ca=iso8601]"], // fallback day 1 used + [yearmonth2, "2000-05-01[u-ca=custom]"], + ].forEach(([yearmonth, expected]) => { + const result = yearmonth.toString({ calendarName: "always" }); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1e759554d51c42eb936d7cdce8a779b3176fb30b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plainyearmonth.prototype.tostring ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainYearMonth(2019, 10); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.toString(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/year-format.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6c1b947463824a66751d087ef8c03dfc5870fe96 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/toString/year-format.js +@@ -0,0 +1,47 @@ ++// 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.plainyearmonth.prototype.tostring ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++let instance = new Temporal.PlainYearMonth(-100000, 12); ++assert.sameValue(instance.toString(), "-100000-12", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(-10000, 4); ++assert.sameValue(instance.toString(), "-010000-04", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(-9999, 6); ++assert.sameValue(instance.toString(), "-009999-06", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(-1000, 8); ++assert.sameValue(instance.toString(), "-001000-08", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(-999, 10); ++assert.sameValue(instance.toString(), "-000999-10", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(-1, 8); ++assert.sameValue(instance.toString(), "-000001-08", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(0, 6); ++assert.sameValue(instance.toString(), "0000-06", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.PlainYearMonth(1, 4); ++assert.sameValue(instance.toString(), "0001-04", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.PlainYearMonth(999, 2); ++assert.sameValue(instance.toString(), "0999-02", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainYearMonth(1000, 1); ++assert.sameValue(instance.toString(), "1000-01", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainYearMonth(9999, 4); ++assert.sameValue(instance.toString(), "9999-04", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.PlainYearMonth(10000, 6); ++assert.sameValue(instance.toString(), "+010000-06", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.PlainYearMonth(100000, 8); ++assert.sameValue(instance.toString(), "+100000-08", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b056e5aebe846442b2a685361fc9b8d6f3fce3cb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.plainyearmonth.prototype.until ++description: A number is converted to a string, then to Temporal.PlainYearMonth ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2019, 6); ++ ++const arg = 201906; ++ ++const result = instance.until(arg); ++TemporalHelpers.assertDuration(result, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "201906 is a valid ISO string for PlainYearMonth"); ++ ++const numbers = [ ++ 1, ++ -201906, ++ 1234567, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainYearMonth` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..883d319460ecbaaed7140cda57a0a7cd633781ae +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.plainyearmonth.prototype.until ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2019, 6); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 2019, monthCode: "M06", calendar }; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2dedd8fe55fa3ee624e34d00b816afb2e80b0981 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.plainyearmonth.prototype.until ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2019, 6); ++ ++const calendar = 19970327; ++ ++let arg = { year: 2019, monthCode: "M06", calendar }; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 2019, monthCode: "M06", calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 2019, monthCode: "M06", calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..18a4d80265ef20b7fc6fb1f260e0c6d519831b87 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.plainyearmonth.prototype.until ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.PlainYearMonth(2000, 5); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.until(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d8a718b0adda26e2ab00574c4cf87cb315f73601 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.plainyearmonth.prototype.until ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.PlainYearMonth(2000, 5); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fc04e66b8a0a0e8009d10ca324b1300ca55f9832 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.plainyearmonth.prototype.until ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainYearMonth ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2000, 5); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainYearMonth, "Temporal.PlainYearMonth, object"], ++ [Temporal.PlainYearMonth.prototype, "Temporal.PlainYearMonth.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..89bdacd0cd309c55f0b216ad608f8331e1606aee +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.plainyearmonth.prototype.until ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.PlainYearMonth(2000, 5, calendar); ++instance.until({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 2); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-yearmonthfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-yearmonthfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d9b946e2795ac7eea7ebb2f6f9090f09ba248c16 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/calendar-yearmonthfromfields-called-with-options-undefined.js +@@ -0,0 +1,35 @@ ++// 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.plainyearmonth.prototype.until ++description: > ++ Calendar.yearMonthFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++let calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++let instance = new Temporal.PlainYearMonth(2000, 5, calendar); ++instance.until({ year: 2000, month: 6, calendar }); ++assert.sameValue(calendar.yearMonthFromFieldsCallCount, 1); ++ ++// Test again, but overriding the global Temporal.Calendar.prototype method so ++// we can observe the call to yearMonthFromFields() on the ISO8601 calendar ++// that occurs when we parse the string ++ ++const realYearMonthFromFields = Temporal.Calendar.prototype.yearMonthFromFields; ++let yearMonthFromFieldsCallCount = 0; ++Temporal.Calendar.prototype.yearMonthFromFields = function (fields, options) { ++ yearMonthFromFieldsCallCount++; ++ assert.sameValue(options, undefined, "yearMonthFromFields shouldn't be called with options"); ++ return realYearMonthFromFields.call(this, fields, options); ++} ++ ++calendar = new Temporal.Calendar("iso8601"); ++instance = new Temporal.PlainYearMonth(2000, 5, calendar); ++instance.until("2000-06-01"); ++assert.sameValue(yearMonthFromFieldsCallCount, 1); ++ ++Temporal.Calendar.prototype.yearMonthFromFields = realYearMonthFromFields; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-invalid-string.js +index bb243a89914d4b324f6a435eea5e67ae0e9a122e..e3055ec8c49a2035d64c18b2155193d53325dacf 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/largestunit-invalid-string.js +@@ -9,7 +9,34 @@ features: [Temporal] + + const earlier = new Temporal.PlainYearMonth(2000, 5); + const later = new Temporal.PlainYearMonth(2001, 6); +-const values = ["era", "eraYear", "weeks", "days", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "week", ++ "day", ++ "hour", ++ "minute", ++ "second", ++ "millisecond", ++ "microsecond", ++ "nanosecond", ++ "month\0", ++ "YEAR", ++ "eras", ++ "eraYears", ++ "weeks", ++ "days", ++ "hours", ++ "minutes", ++ "seconds", ++ "milliseconds", ++ "microseconds", ++ "nanoseconds", ++ "months\0", ++ "YEARS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/leap-second.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3c82e66e152f9e95f0c60ffa35c36296be08602b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/leap-second.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.plainyearmonth.prototype.until ++description: Leap second is a valid ISO string for PlainYearMonth ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.PlainYearMonth(2016, 12); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for PlainYearMonth" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "second: 60 is ignored in property bag for PlainYearMonth" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ff3266edcccbc08f0b28339b1f02bc6dc29eafed +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.plainyearmonth.prototype.until ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.PlainYearMonth(2019, 10); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.until(new Temporal.PlainYearMonth(1976, 11), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-invalid-string.js +index 3e6231aef4c2e2390fd2ca5cd483151624dbd436..d5f8d9884f29fd989fb5fb30d18be726d5cb3166 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/roundingmode-invalid-string.js +@@ -9,4 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.PlainYearMonth(2000, 5); + const later = new Temporal.PlainYearMonth(2001, 6); +-assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/smallestunit-invalid-string.js +index 9e494305079ba9a2601932ee80f2a363464c82fa..07095eaf3f41098988e92c2675d750980d1e99d0 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/smallestunit-invalid-string.js +@@ -9,7 +9,34 @@ features: [Temporal] + + const earlier = new Temporal.PlainYearMonth(2000, 5); + const later = new Temporal.PlainYearMonth(2001, 6); +-const values = ["era", "eraYear", "weeks", "days", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "week", ++ "day", ++ "hour", ++ "minute", ++ "second", ++ "millisecond", ++ "microsecond", ++ "nanosecond", ++ "month\0", ++ "YEAR", ++ "eras", ++ "eraYears", ++ "weeks", ++ "days", ++ "hours", ++ "minutes", ++ "seconds", ++ "milliseconds", ++ "microseconds", ++ "nanoseconds", ++ "months\0", ++ "YEARS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/year-zero.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/year-zero.js +index b2f534aeff70a1819a634e66362354554e694710..2326993bbcabc34c8f13133af56e7743a4eaf672 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/until/year-zero.js +@@ -3,15 +3,16 @@ + + /*--- + esid: sec-temporal.plainyearmonth.prototype.until +-description: RangeError thrown if a string with UTC designator is used as a PlainYearMonth ++description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-06', +- '-000000-06-24', +- '-000000-06-24T15:43:27', +- '-000000-06-24T15:43:27+01:00[UTC]' ++ "-000000-06", ++ "-000000-06-24", ++ "-000000-06-24T15:43:27", ++ "-000000-06-24T15:43:27+01:00", ++ "-000000-06-24T15:43:27+00:00[UTC]", + ]; + const instance = new Temporal.PlainYearMonth(2000, 5); + invalidStrings.forEach((arg) => { +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/options-wrong-type.js +index bc8f0a542ec3e2cf8210e7213fcfa555b5052bfa..8b6b6e1af38d128604b6e4f310c5bac8aa7bfc9f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/options-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/options-wrong-type.js +@@ -7,7 +7,7 @@ description: TypeError thrown when options argument is a primitive + features: [BigInt, Symbol, Temporal] + ---*/ + +-const values = [ ++const badOptions = [ + null, + true, + "2021-01", +@@ -16,7 +16,8 @@ const values = [ + 2n, + ]; + +-const ym = Temporal.PlainYearMonth.from("2019-10"); +-values.forEach((value) => { +- assert.throws(TypeError, () => ym.with({ year: 2020 }, value), `TypeError on wrong argument type ${typeof value}`); +-}); ++const instance = new Temporal.PlainYearMonth(2019, 10); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.with({ year: 2020 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/overflow-invalid-string.js +index 587c66754c8d9bcbe2e01e18addcfe3d93fdf45f..4684d597f3e1be1cae350df4f72522abbb55bbaa 100644 +--- a/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/PlainYearMonth/prototype/with/overflow-invalid-string.js +@@ -17,6 +17,12 @@ features: [Temporal] + ---*/ + + const yearmonth = new Temporal.PlainYearMonth(2000, 5); +-for (const overflow of ["", "CONSTRAIN", "balance", "other string", "constra\u0131n"]) { +- assert.throws(RangeError, () => yearmonth.with({ month: 8 }, { overflow })); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => yearmonth.with({ month: 8 }, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/from/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/from/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6629f5aeb84fe83b29396822473171d5e1ac9275 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/from/timezone-string-leap-second.js +@@ -0,0 +1,19 @@ ++// 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.timezone.from ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = Temporal.TimeZone.from(timeZone); ++assert.sameValue(result1.id, "UTC", "leap second is a valid ISO string for TimeZone"); ++const result2 = Temporal.TimeZone.from({ timeZone }); ++assert.sameValue(result2.id, "UTC", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.TimeZone.from(timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => Temporal.TimeZone.from({ timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/from/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/from/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..59940a4faa066a9dc2e54f2eceaabf03f123bb52 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/from/timezone-string-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.timezone.from ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.TimeZone.from(timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.TimeZone.from({ timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/from/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/from/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c8351d11605a62fe1d0bbe302f0d51c2763c071a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/from/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.timezone.from ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.TimeZone.from(timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => Temporal.TimeZone.from({ timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.TimeZone.from(timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => Temporal.TimeZone.from({ timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.TimeZone.from({ timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-number.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d2d05898828903c5dac595a0f587ccddc1d6f1bb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.timezone.prototype.getinstantfor ++description: A number is converted to a string, then to Temporal.PlainDateTime ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++let arg = 19761118; ++ ++const result = instance.getInstantFor(arg); ++assert.sameValue(result.epochNanoseconds, 217_123_200_000_000_000n, "19761118 is a valid ISO string for PlainDateTime"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.getInstantFor(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDateTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0e9d07bfb791a08856d08998f566822d488b967c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.timezone.prototype.getinstantfor ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.getInstantFor(arg); ++assert.sameValue( ++ result1.epochNanoseconds, ++ 217_123_200_000_000_000n, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.getInstantFor(arg); ++assert.sameValue( ++ result2.epochNanoseconds, ++ 217_123_200_000_000_000n, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2d14c50ee38a85efced041730a114f51bc6326ff +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.timezone.prototype.getinstantfor ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.getInstantFor(arg); ++assert.sameValue(result1.epochNanoseconds, 217_123_200_000_000_000n, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.getInstantFor(arg); ++assert.sameValue(result2.epochNanoseconds, 217_123_200_000_000_000n, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.getInstantFor(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.getInstantFor(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..576a7ff93cf2aeda6d4f18b304c4f7eda1c61dc3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.timezone.prototype.getinstantfor ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.TimeZone("UTC"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.getInstantFor(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.getInstantFor(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.getInstantFor(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.getInstantFor(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.getInstantFor(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f282e30534bdf3b5658ff2e958fba6dbfec9c1ad +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.timezone.prototype.getinstantfor ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.TimeZone("UTC"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.getInstantFor(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..187c362e0a88e4948b2dd4d70997d8b9138b803f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.timezone.prototype.getinstantfor ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.getInstantFor(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDateTime, "Temporal.PlainDateTime, object"], ++ [Temporal.PlainDateTime.prototype, "Temporal.PlainDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.getInstantFor(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..22945fe481ccb71d3aeb43cfb3c8b11bd00c198a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.timezone.prototype.getinstantfor ++description: Leap second is a valid ISO string for PlainDateTime ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.getInstantFor(arg); ++assert.sameValue( ++ result1.epochNanoseconds, ++ 1_483_228_799_000_000_000n, ++ "leap second is a valid ISO string for PlainDateTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.getInstantFor(arg); ++assert.sameValue( ++ result2.epochNanoseconds, ++ 1_483_228_799_000_000_000n, ++ "second: 60 is ignored in property bag for PlainDateTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eaa0b1239d0e023d3a9efe47d4f5aec6e5415533 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.timezone.prototype.getinstantfor ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.TimeZone("UTC"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.getInstantFor(new Temporal.PlainDateTime(2019, 10, 29, 10, 46, 38), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/year-zero.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/year-zero.js +index dfa1f9121d0e3a514cb0f074bea6e52650169df7..d7ed91a2bf4a295d6973dfe524cfdbeed1dd77f8 100644 +--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getInstantFor/year-zero.js +@@ -8,14 +8,16 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ ++ "-000000-12-07", + "-000000-12-07T03:24:30", +- "-000000-12-07T03:24:30+01:00[UTC]" ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.TimeZone("UTC"); + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => { instance.getInstantFor(arg); }, ++ () => instance.getInstantFor(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..44cafb81c3b655f34fbe3ba54555383beafcfabb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/leap-second.js +@@ -0,0 +1,18 @@ ++// 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.timezone.prototype.getnexttransition ++description: Leap second is a valid ISO string for Instant ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const arg = "2016-12-31T23:59:60Z"; ++const result = instance.getNextTransition(arg); ++assert.sameValue( ++ result, ++ null, ++ "leap second is a valid ISO string for Instant" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/year-zero.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/year-zero.js +index f93af181509a31c22ecc62062685e642d61b9d78..3874a284fb6e68b224c803e6e4d997063990e52d 100644 +--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getNextTransition/year-zero.js +@@ -4,10 +4,19 @@ + /*--- + esid: sec-temporal.timezone.prototype.getnexttransition + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + ++const invalidStrings = [ ++ "-000000-03-30T00:45Z", ++ "-000000-03-30T01:45+01:00", ++ "-000000-03-30T01:45:00+00:00[UTC]", ++]; + const instance = new Temporal.TimeZone("UTC"); +- +-let str = "-000000-01-01T00:00"; +-assert.throws(RangeError, () => instance.getNextTransition(str), "reject minus zero as extended year"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.getNextTransition(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..417d2d4fd4d6dc971b44fc2b391d0fa00aa18058 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/leap-second.js +@@ -0,0 +1,18 @@ ++// 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.timezone.prototype.getoffsetnanosecondsfor ++description: Leap second is a valid ISO string for Instant ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const arg = "2016-12-31T23:59:60Z"; ++const result = instance.getOffsetNanosecondsFor(arg); ++assert.sameValue( ++ result, ++ 0, ++ "leap second is a valid ISO string for Instant" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/year-zero.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/year-zero.js +index 91275f9836404fa78b8f3ca5bb5152f3926323a5..2af428da658675a03d9ee6aa53ca312179b68fdf 100644 +--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetNanosecondsFor/year-zero.js +@@ -4,10 +4,19 @@ + /*--- + esid: sec-temporal.timezone.prototype.getoffsetnanosecondsfor + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + ++const invalidStrings = [ ++ "-000000-03-30T00:45Z", ++ "-000000-03-30T01:45+01:00", ++ "-000000-03-30T01:45:00+00:00[UTC]", ++]; + const instance = new Temporal.TimeZone("UTC"); +- +-let str = "-000000-01-01T00:00"; +-assert.throws(RangeError, () => instance.getOffsetNanosecondsFor(str), "reject minus zero as extended year"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.getOffsetNanosecondsFor(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eac9e7c63c3a9f8d47a54ce6971b7b7da53253a8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/leap-second.js +@@ -0,0 +1,18 @@ ++// 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.timezone.prototype.getoffsetstringfor ++description: Leap second is a valid ISO string for Instant ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const arg = "2016-12-31T23:59:60Z"; ++const result = instance.getOffsetStringFor(arg); ++assert.sameValue( ++ result, ++ "+00:00", ++ "leap second is a valid ISO string for Instant" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/year-zero.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/year-zero.js +index 3840a51ff8fb34f2f43c7637785dbebea6dd38e3..a0933319900c30b1926428ea9b85bf451060d723 100644 +--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getOffsetStringFor/year-zero.js +@@ -4,10 +4,19 @@ + /*--- + esid: sec-temporal.timezone.prototype.getoffsetstringfor + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + ++const invalidStrings = [ ++ "-000000-03-30T00:45Z", ++ "-000000-03-30T01:45+01:00", ++ "-000000-03-30T01:45:00+00:00[UTC]", ++]; + const instance = new Temporal.TimeZone("UTC"); +- +-let str = "-000000-01-01T00:00"; +-assert.throws(RangeError, () => instance.getOffsetStringFor(str), "reject minus zero as extended year"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.getOffsetStringFor(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-object-tostring.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-object-tostring.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f2cdde159648c53476dda73ea813c25cf959b1fa +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-object-tostring.js +@@ -0,0 +1,20 @@ ++// 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.timezone.prototype.getplaindatetimefor ++description: Object is converted to a string, then to Temporal.Instant ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const arg = {}; ++assert.throws(RangeError, () => instance.getPlainDateTimeFor(arg), "[object Object] is not a valid ISO string"); ++ ++arg.toString = function() { ++ return "1970-01-01T00:00Z"; ++}; ++const result = instance.getPlainDateTimeFor(arg); ++TemporalHelpers.assertPlainDateTime(result, 1970, 1, "M01", 1, 0, 0, 0, 0, 0, 0, "result of toString is interpreted as ISO string"); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..087f7a1f8a774afca5fbdca252a6e1a7d04806ed +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/argument-wrong-type.js +@@ -0,0 +1,37 @@ ++// 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.timezone.prototype.getplaindatetimefor ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ for Instant ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++ [{}, "plain object"], ++ [Temporal.Instant, "Temporal.Instant, object"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.getPlainDateTimeFor(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [Temporal.Instant.prototype, "Temporal.Instant.prototype, object"], // fails brand check in toString() ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.getPlainDateTimeFor(arg), `${description} does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..97a6429cd5a2a1377edb88b6d342484684025b51 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-number.js +@@ -0,0 +1,29 @@ ++// 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.timezone.prototype.getplaindatetimefor ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const arg = 19761118; ++ ++const result = instance.getPlainDateTimeFor(new Temporal.Instant(0n), arg); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.getPlainDateTimeFor(new Temporal.Instant(0n), arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..927df49001024c3f31fc65a6f1c49b1e2c1613f7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-string-leap-second.js +@@ -0,0 +1,26 @@ ++// 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.timezone.prototype.getplaindatetimefor ++description: Leap second is a valid ISO string for Calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.getPlainDateTimeFor(new Temporal.Instant(0n), arg); ++assert.sameValue( ++ result1.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar" ++); ++ ++arg = { calendar: "2016-12-31T23:59:60" }; ++const result2 = instance.getPlainDateTimeFor(new Temporal.Instant(0n), arg); ++assert.sameValue( ++ result2.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4fcd6b89d78391498339800b03afa4713e452689 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/calendar-wrong-type.js +@@ -0,0 +1,32 @@ ++// 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.timezone.prototype.getplaindatetimefor ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.getPlainDateTimeFor(new Temporal.Instant(0n), arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.getPlainDateTimeFor(new Temporal.Instant(0n), arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/instant-string-sub-minute-offset.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/instant-string-sub-minute-offset.js +new file mode 100644 +index 0000000000000000000000000000000000000000..766cec0863f02aa48ef793b95611a6286c20b0c5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/instant-string-sub-minute-offset.js +@@ -0,0 +1,15 @@ ++// 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.timezone.prototype.getplaindatetimefor ++description: Temporal.Instant string with sub-minute offset ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const str = "1970-01-01T00:19:32.37+00:19:32.37"; ++const result = instance.getPlainDateTimeFor(str); ++TemporalHelpers.assertPlainDateTime(result, 1970, 1, "M01", 1, 0, 0, 0, 0, 0, 0, "if present, sub-minute offset is accepted exactly"); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f17224284aee0f9939866ab34899154ae246b5e8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/leap-second.js +@@ -0,0 +1,19 @@ ++// 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.timezone.prototype.getplaindatetimefor ++description: Leap second is a valid ISO string for Instant ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const arg = "2016-12-31T23:59:60Z"; ++const result = instance.getPlainDateTimeFor(arg); ++TemporalHelpers.assertPlainDateTime( ++ result, ++ 2016, 12, "M12", 31, 23, 59, 59, 0, 0, 0, ++ "leap second is a valid ISO string for Instant" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/limits.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/limits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..24a970573df3494c230d77b8ee03149ac203f619 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/limits.js +@@ -0,0 +1,26 @@ ++// 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.getplaindatetimefor ++description: Checking limits of representable PlainDateTime ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const min = new Temporal.Instant(-8_640_000_000_000_000_000_000n); ++const offsetMin = new Temporal.TimeZone("-23:59"); ++const max = new Temporal.Instant(8_640_000_000_000_000_000_000n); ++const offsetMax = new Temporal.TimeZone("+23:59"); ++ ++TemporalHelpers.assertPlainDateTime( ++ offsetMin.getPlainDateTimeFor(min, "iso8601"), ++ -271821, 4, "M04", 19, 0, 1, 0, 0, 0, 0, ++ "converting from Instant (negative case)" ++); ++ ++TemporalHelpers.assertPlainDateTime( ++ offsetMax.getPlainDateTimeFor(max, "iso8601"), ++ 275760, 9, "M09", 13, 23, 59, 0, 0, 0, 0, ++ "converting from Instant (positive case)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/year-zero.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/year-zero.js +index d15162a5e7e819b2949ea094508bd221ffb1a74c..aa2b02626e87047f56f7b7a561bddb07f4c70a5d 100644 +--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPlainDateTimeFor/year-zero.js +@@ -4,19 +4,19 @@ + /*--- + esid: sec-temporal.timezone.prototype.getplaindatetimefor + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- "-000000-03-30T00:45Z", +- "-000000-03-30T01:45+01:00", +- "-000000-03-30T01:45:00+01:00[UTC]" ++ "-000000-03-30T00:45Z", ++ "-000000-03-30T01:45+01:00", ++ "-000000-03-30T01:45:00+00:00[UTC]", + ]; + const instance = new Temporal.TimeZone("UTC"); +-invalidStrings.forEach((str) => { ++invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => instance.getPlainDateTimeFor(str), ++ () => instance.getPlainDateTimeFor(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-number.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a5894c8bf0eb4bf871e889f5af59b17078db64fa +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.timezone.prototype.getpossibleinstantsfor ++description: A number is converted to a string, then to Temporal.PlainDateTime ++includes: [compareArray.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++let arg = 19761118; ++ ++const result = instance.getPossibleInstantsFor(arg); ++assert.compareArray(result.map(i => i.epochNanoseconds), [217_123_200_000_000_000n], "19761118 is a valid ISO string for PlainDateTime"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.getPossibleInstantsFor(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDateTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..39b5d7ee9ef982c499714f56d24cdcdd9b60ad1b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.timezone.prototype.getpossibleinstantsfor ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [compareArray.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.getPossibleInstantsFor(arg); ++assert.compareArray( ++ result1.map(i => i.epochNanoseconds), ++ [217_123_200_000_000_000n], ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.getPossibleInstantsFor(arg); ++assert.compareArray( ++ result2.map(i => i.epochNanoseconds), ++ [217_123_200_000_000_000n], ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bee5a0819884f242229755ede5e4ea3c2769c3c5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.timezone.prototype.getpossibleinstantsfor ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [compareArray.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.getPossibleInstantsFor(arg); ++assert.compareArray(result1.map(i => i.epochNanoseconds), [217_123_200_000_000_000n], "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.getPossibleInstantsFor(arg); ++assert.compareArray(result2.map(i => i.epochNanoseconds), [217_123_200_000_000_000n], "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.getPossibleInstantsFor(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.getPossibleInstantsFor(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..dd2a88d76e8a59069010bd29f3aa35c493f5f6fd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.timezone.prototype.getpossibleinstantsfor ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.TimeZone("UTC"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.getPossibleInstantsFor(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.getPossibleInstantsFor(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.getPossibleInstantsFor(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.getPossibleInstantsFor(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.getPossibleInstantsFor(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..44bb062dcdc1dbe724a31084dc6e4d747702727c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.timezone.prototype.getpossibleinstantsfor ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.TimeZone("UTC"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.getPossibleInstantsFor(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..40cd622852c66602b8ce4bcccca165e53433d5e5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.timezone.prototype.getpossibleinstantsfor ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.getPossibleInstantsFor(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDateTime, "Temporal.PlainDateTime, object"], ++ [Temporal.PlainDateTime.prototype, "Temporal.PlainDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.getPossibleInstantsFor(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..79cb2a37326fee51ccd4dcbfc0fcf259ac0121c8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/leap-second.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.timezone.prototype.getpossibleinstantsfor ++description: Leap second is a valid ISO string for PlainDateTime ++includes: [compareArray.js] ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.getPossibleInstantsFor(arg); ++assert.compareArray( ++ result1.map(i => i.epochNanoseconds), ++ [1_483_228_799_000_000_000n], ++ "leap second is a valid ISO string for PlainDateTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.getPossibleInstantsFor(arg); ++assert.compareArray( ++ result2.map(i => i.epochNanoseconds), ++ [1_483_228_799_000_000_000n], ++ "second: 60 is ignored in property bag for PlainDateTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/year-zero.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/year-zero.js +index e6efaf6004abf72da12f82c9839e892c5c173102..0db44c186970060f19def51c9edf3c2e56b79411 100644 +--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/year-zero.js +@@ -8,14 +8,16 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ ++ "-000000-12-07", + "-000000-12-07T03:24:30", +- "-000000-12-07T03:24:30+01:00[UTC]" ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; + const instance = new Temporal.TimeZone("UTC"); + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +- () => { instance.getPossibleInstantsFor(arg); }, ++ () => instance.getPossibleInstantsFor(arg), + "reject minus zero as extended year" + ); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/leap-second.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..29d3b5d41008964de3f0eb61358b386aafd1b624 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/leap-second.js +@@ -0,0 +1,18 @@ ++// 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.timezone.prototype.getprevioustransition ++description: Leap second is a valid ISO string for Instant ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.TimeZone("UTC"); ++ ++const arg = "2016-12-31T23:59:60Z"; ++const result = instance.getPreviousTransition(arg); ++assert.sameValue( ++ result, ++ null, ++ "leap second is a valid ISO string for Instant" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/year-zero.js b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/year-zero.js +index 558656721054662a5514e035b864c65e3e1c0dd3..07b1e7248f81ab26402a7bb115734581d613a61b 100644 +--- a/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/TimeZone/prototype/getPreviousTransition/year-zero.js +@@ -4,10 +4,19 @@ + /*--- + esid: sec-temporal.timezone.prototype.getprevioustransition + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + ++const invalidStrings = [ ++ "-000000-03-30T00:45Z", ++ "-000000-03-30T01:45+01:00", ++ "-000000-03-30T01:45:00+00:00[UTC]", ++]; + const instance = new Temporal.TimeZone("UTC"); +- +-let str = "-000000-01-01T00:00"; +-assert.throws(RangeError, () => instance.getPreviousTransition(str), "reject minus zero as extended year"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.getPreviousTransition(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..889bf726c8484707d60b4e89b6b63687da270a50 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/calendar-number.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.zoneddatetime ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const arg = 19761118; ++ ++const result = new Temporal.ZonedDateTime(0n, "UTC", arg); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => new Temporal.ZonedDateTime(0n, "UTC", arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..082c904fdabdcbeddf4fc57defb3cce16da411a3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/calendar-wrong-type.js +@@ -0,0 +1,30 @@ ++// 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.zoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => new Temporal.ZonedDateTime(0n, "UTC", arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => new Temporal.ZonedDateTime(0n, "UTC", arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8a6c34e0b881234391597a6c818b441feaa4b893 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,24 @@ ++// 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.zoneddatetime.compare ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const datetime = new Temporal.ZonedDateTime(217_123_200_000_000_000n, timeZone); ++const calendar = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, timeZone, calendar }; ++const result1 = Temporal.ZonedDateTime.compare(arg, datetime); ++assert.sameValue(result1, 0, "leap second is a valid ISO string for calendar (first argument)"); ++const result2 = Temporal.ZonedDateTime.compare(datetime, arg); ++assert.sameValue(result2, 0, "leap second is a valid ISO string for calendar (second argument)"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, timeZone, calendar: { calendar } }; ++const result3 = Temporal.ZonedDateTime.compare(arg, datetime); ++assert.sameValue(result3, 0, "leap second is a valid ISO string for calendar (nested property, first argument)"); ++const result4 = Temporal.ZonedDateTime.compare(datetime, arg); ++assert.sameValue(result4, 0, "leap second is a valid ISO string for calendar (nested property, second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e75341024315b36e3031c944d45145d1970668a6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-number.js +@@ -0,0 +1,56 @@ ++// 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.zoneddatetime.compare ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const calendar = 19970327; ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const datetime = new Temporal.ZonedDateTime(0n, timeZone); ++ ++let arg = { year: 1970, monthCode: "M01", day: 1, calendar, timeZone }; ++const result1 = Temporal.ZonedDateTime.compare(arg, datetime); ++assert.sameValue(result1, 0, "19970327 is a valid ISO string for calendar (first argument)"); ++const result2 = Temporal.ZonedDateTime.compare(datetime, arg); ++assert.sameValue(result2, 0, "19970327 is a valid ISO string for calendar (second argument)"); ++ ++arg = { year: 1970, monthCode: "M01", day: 1, calendar: { calendar }, timeZone }; ++const result3 = Temporal.ZonedDateTime.compare(arg, datetime); ++assert.sameValue(result3, 0, "19970327 is a valid ISO string for calendar (nested property, first argument)"); ++const result4 = Temporal.ZonedDateTime.compare(datetime, arg); ++assert.sameValue(result4, 0, "19970327 is a valid ISO string for calendar (nested property, second argument)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1970, monthCode: "M01", day: 1, calendar, timeZone }; ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.compare(arg, datetime), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.compare(datetime, arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (second argument)` ++ ); ++ arg = { year: 1970, monthCode: "M01", day: 1, calendar: { calendar }, timeZone }; ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.compare(arg, datetime), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property, first argument)` ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.compare(datetime, arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property, second argument)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d542d4acd37cbb8c1353c8eb89a8669be6faef5d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,51 @@ ++// 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.zoneddatetime.compare ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(arg, datetime), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(datetime, arg), `${description} does not convert to a valid ISO string (second argument)`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(arg, datetime), `${description} does not convert to a valid ISO string (nested property, first argument)`); ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(datetime, arg), `${description} does not convert to a valid ISO string (nested property, second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.compare(arg, datetime), `${description} is not a valid property bag and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.compare(datetime, arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.compare(arg, datetime), `${description} is not a valid property bag and does not convert to a string (nested property, first argument)`); ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.compare(datetime, arg), `${description} is not a valid property bag and does not convert to a string (nested property, second argument)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(arg, datetime), `nested undefined calendar property is always a RangeError (first argument)`); ++assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(datetime, arg), `nested undefined calendar property is always a RangeError (second argument)`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..26a1253b18f43f7220e001275d56388e80377814 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,30 @@ ++// 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.zoneddatetime.compare ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++ ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.compare(arg, datetime), ++ "reject minus zero as extended year (first argument)" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.compare(datetime, arg), ++ "reject minus zero as extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b6ca567fefc6fc6ab3410e19fd1e35a3dd539493 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/argument-wrong-type.js +@@ -0,0 +1,40 @@ ++// 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.zoneddatetime.compare ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for ZonedDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const other = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(arg, other), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(other, arg), `${description} does not convert to a valid ISO string (second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.compare(arg, other), `${description} is not a valid property bag and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.compare(other, arg), `${description} is not a valid property bag and does not convert to a string (second argument)`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cdd1368336fbd30392a4c785a8ef79a3fb90bdf6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/leap-second.js +@@ -0,0 +1,20 @@ ++// 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.zoneddatetime.compare ++description: Leap second is a valid ISO string for ZonedDateTime ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(1_483_228_799_000_000_000n, new Temporal.TimeZone("UTC")); ++ ++let arg = "2016-12-31T23:59:60+00:00[UTC]"; ++const result1 = Temporal.ZonedDateTime.compare(arg, datetime); ++assert.sameValue(result1, 0, "leap second is a valid ISO string for ZonedDateTime (first argument)"); ++const result2 = Temporal.ZonedDateTime.compare(datetime, arg); ++assert.sameValue(result2, 0, "leap second is a valid ISO string for ZonedDateTime (second argument)"); ++ ++arg = "2000-05-02T12:34:56+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(arg, datetime), "leap second in time zone name not valid (first argument)"); ++assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(datetime, arg), "leap second in time zone name not valid (second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..15726d7695e8104e7e6ef67b5a68dcf5508d9db8 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-leap-second.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.zoneddatetime.compare ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1588377600_000_000_000n, "UTC"); ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone }, instance); ++assert.sameValue(result1, 0, "leap second is a valid ISO string for TimeZone (first argument)"); ++const result2 = Temporal.ZonedDateTime.compare(instance, { year: 2020, month: 5, day: 2, timeZone }); ++assert.sameValue(result2, 0, "leap second is a valid ISO string for TimeZone (second argument)"); ++const result3 = Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }, instance); ++assert.sameValue(result3, 0, "leap second is a valid ISO string for TimeZone (nested property, first argument)"); ++const result4 = Temporal.ZonedDateTime.compare(instance, { year: 2020, month: 5, day: 2, timeZone: { timeZone } }); ++assert.sameValue(result4, 0, "leap second is a valid ISO string for TimeZone (nested property, second argument)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone }, instance), "leap second in time zone name not valid (first argument)"); ++assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(instance, { year: 2020, month: 5, day: 2, timeZone }), "leap second in time zone name not valid (second argument)"); ++assert.throws(RangeError, () => Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }, instance), "leap second in time zone name not valid (nested property, first argument)"); ++assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(instance, { year: 2020, month: 5, day: 2, timeZone: { timeZone } }), "leap second in time zone name not valid (nested property, second argument)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7f170bfe7e6e0c6bd8ae66f0c857a31fb9424661 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-string-year-zero.js +@@ -0,0 +1,37 @@ ++// 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.zoneddatetime.compare ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone }, datetime), ++ "reject minus zero as extended year (first argument)" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.compare(datetime, { year: 2020, month: 5, day: 2, timeZone }), ++ "reject minus zero as extended year (second argument)" ++ ); ++ ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }, datetime), ++ "reject minus zero as extended year (nested property, first argument)" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.compare(datetime, { year: 2020, month: 5, day: 2, timeZone: { timeZone } }), ++ "reject minus zero as extended year (nested property, second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a2c34b5a4ecc47292294ab45a5de5ed713182901 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/timezone-wrong-type.js +@@ -0,0 +1,43 @@ ++// 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.zoneddatetime.compare ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone }, datetime), `${description} does not convert to a valid ISO string (first argument)`); ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(datetime, { year: 2020, month: 5, day: 2, timeZone }), `${description} does not convert to a valid ISO string (second argument)`); ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }, datetime), `${description} does not convert to a valid ISO string (nested property, first argument)`); ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(datetime, { year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `${description} does not convert to a valid ISO string (nested property, second argument)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone }, datetime), `${description} is not a valid object and does not convert to a string (first argument)`); ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.compare(datetime, { year: 2020, month: 5, day: 2, timeZone }), `${description} is not a valid object and does not convert to a string (second argument)`); ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }, datetime), `${description} is not a valid object and does not convert to a string (nested property, first argument)`); ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.compare(datetime, { year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `${description} is not a valid object and does not convert to a string (nested property, second argument)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.ZonedDateTime.compare({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }, datetime), `undefined is always a RangeError as nested property (first argument)`); ++assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(datetime, { year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `undefined is always a RangeError as nested property (second argument)`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/year-zero.js +index 314b364b42d09581d5f3cdc6b67ed3e64a6bde99..82ec45e13b3c3e398951681ecb79a6e6d7e8a2ac 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/compare/year-zero.js +@@ -8,13 +8,19 @@ features: [Temporal] + ---*/ + + const instance = new Temporal.ZonedDateTime(0n, "UTC"); +-const bad = "-000000-08-19T17:30Z"; ++const invalidStrings = [ ++ "-0000000-01-01T00:02Z[UTC]", ++ "-0000000-01-01T00:02+00:00[UTC]", ++ "-0000000-01-01T00:02:00.000000000+00:00[UTC]", ++]; + +-assert.throws(RangeError, +- () => Temporal.ZonedDateTime.compare(bad, instance), +- "cannot use negative zero as extended year (first argument)" +-); +-assert.throws(RangeError, +- () => Temporal.ZonedDateTime.compare(instance, bad), +- "cannot use negative zero as extended year (second argument)" +-); ++invalidStrings.forEach((arg) => { ++ assert.throws(RangeError, ++ () => Temporal.ZonedDateTime.compare(arg, instance), ++ "cannot use negative zero as extended year (first argument)" ++ ); ++ assert.throws(RangeError, ++ () => Temporal.ZonedDateTime.compare(instance, arg), ++ "cannot use negative zero as extended year (second argument)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2d68e15b72570dc4df48c73a1fb5450d977e97c0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-leap-second.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.zoneddatetime.from ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const calendar = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++const result1 = Temporal.ZonedDateTime.from(arg); ++assert.sameValue( ++ result1.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++const result2 = Temporal.ZonedDateTime.from(arg); ++assert.sameValue( ++ result2.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..58775d77ae54aee1bef4d42ac6bf212b5907cb84 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-number.js +@@ -0,0 +1,40 @@ ++// 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.zoneddatetime.from ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const calendar = 19970327; ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++const result1 = Temporal.ZonedDateTime.from(arg); ++assert.sameValue(result1.calendar.id, "iso8601", "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++const result2 = Temporal.ZonedDateTime.from(arg); ++assert.sameValue(result2.calendar.id, "iso8601", "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.from(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.from(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fc1dfa9604f50240512f9407ad78af33b65a2d42 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,44 @@ ++// 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.zoneddatetime.from ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.from(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.from(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.from(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => Temporal.ZonedDateTime.from(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ffabba823fc8c5be534e0a9f4e0ad4d7f1328766 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.zoneddatetime.from ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++ ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.from(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d2a424fb4e77a4b5858f7d5fed48c9b8afeedf41 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-wrong-type.js +@@ -0,0 +1,35 @@ ++// 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.zoneddatetime.from ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for ZonedDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.from(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.from(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-zoneddatetime.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-zoneddatetime.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eb1c6c67ae1d01a2b243d075a16fb6209d0712cd +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/argument-zoneddatetime.js +@@ -0,0 +1,21 @@ ++// 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.zoneddatetime.from ++description: A ZonedDateTime object is copied, not returned directly ++features: [Temporal] ++---*/ ++ ++const orig = new Temporal.ZonedDateTime(946684800_000_000_010n, new Temporal.TimeZone("UTC")); ++const result = Temporal.ZonedDateTime.from(orig); ++ ++assert.sameValue(result.epochNanoseconds, 946684800_000_000_010n, "ZonedDateTime is copied"); ++assert.sameValue(result.timeZone, orig.timeZone, "time zone is the same"); ++assert.sameValue(result.calendar, orig.calendar, "calendar is the same"); ++ ++assert.notSameValue( ++ result, ++ orig, ++ "When a ZonedDateTime is given, the returned value is not the original ZonedDateTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f7cf91d8e4d62e5535a52e71258c5c54e7b5ce37 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/leap-second.js +@@ -0,0 +1,23 @@ ++// 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.zoneddatetime.from ++description: Leap second is a valid ISO string for ZonedDateTime ++features: [Temporal] ++---*/ ++ ++let arg = "2016-12-31T23:59:60+00:00[UTC]"; ++const result = Temporal.ZonedDateTime.from(arg); ++assert.sameValue( ++ result.epochNanoseconds, ++ 1_483_228_799_000_000_000n, ++ "leap second is a valid ISO string for ZonedDateTime" ++); ++ ++arg = "2000-05-02T12:34:56+23:59[+23:59:60]"; ++assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.from(arg), ++ "leap second in time zone name not valid" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..91fb3bab63efa0454721a898190beff073f7da24 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/options-wrong-type.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.zoneddatetime.from ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++for (const value of badOptions) { ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.from({ year: 1976, month: 11, day: 18, timeZone: "UTC" }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/overflow-invalid-string.js +index 5913d3e7f966fe27be045cb7802088838b118873..e8406c57e37242ff15fb9752df16116f367564a0 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/overflow-invalid-string.js +@@ -32,6 +32,14 @@ const validValues = [ + { year: 2000, month: 5, day: 2, hour: 12, timeZone: "UTC" }, + "2001-09-09T01:46:40.987654321+00:00[UTC]", + ]; +-validValues.forEach((value) => { +- assert.throws(RangeError, () => Temporal.ZonedDateTime.from(value, { overflow: "other string" })); +-}); ++ ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const value of validValues) { ++ for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.from(value, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++ } ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2b2a9eb311d8069649304b20df8d1f3a66fb9f53 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-string-leap-second.js +@@ -0,0 +1,19 @@ ++// 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.zoneddatetime.from ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone }); ++assert.sameValue(result1.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone"); ++const result2 = Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone: { timeZone } }); ++assert.sameValue(result2.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone: { timeZone } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0065848f01c6ec7d62f17bc363ad6798afb9b72e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-string-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.zoneddatetime.from ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone: { timeZone } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1ad5649c811f7823f37250fe94d1630af9911a2a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.zoneddatetime.from ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone: { timeZone } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone: { timeZone } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => Temporal.ZonedDateTime.from({ year: 2000, month: 5, day: 2, timeZone: { timeZone } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/year-zero.js +index da7638028a07d7f191fed8ca9671a307476e30d9..727200f8599b6b6e0a9c63a37afe5656afe2076b 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/from/year-zero.js +@@ -4,9 +4,19 @@ + /*--- + esid: sec-temporal.zoneddatetime.from + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + +-const str = "-0000000-01-01T00:02:00.000000000+00:00[UTC]"; ++const invalidStrings = [ ++ "-0000000-01-01T00:02Z[UTC]", ++ "-0000000-01-01T00:02+00:00[UTC]", ++ "-0000000-01-01T00:02:00.000000000+00:00[UTC]", ++]; + +-assert.throws(RangeError, () => { Temporal.ZonedDateTime.from(str); }, "reject minus zero as extended year"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => Temporal.ZonedDateTime.from(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b107f23ee029e2987513d80ec0ebba9961b4eaf5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.zoneddatetime.prototype.add ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.ZonedDateTime(0n, "UTC"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.add({ years: 1 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/overflow-invalid-string.js +index 4c88b568784d0822ba587b91e7163381c558e721..ede72ad4a96396d1bb79a893f1b9546b2e087ebe 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/add/overflow-invalid-string.js +@@ -20,4 +20,11 @@ features: [Temporal] + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, "UTC"); + const duration = new Temporal.Duration(0, 0, 0, 1); +-assert.throws(RangeError, () => datetime.add(duration, { overflow: "other string" })); ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => datetime.add(duration, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8957994ea29cd1c91218f565241646635582d6ed +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.zoneddatetime.prototype.equals ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const calendar = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++const result1 = instance.equals(arg); ++assert.sameValue( ++ result1, ++ true, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++const result2 = instance.equals(arg); ++assert.sameValue( ++ result2, ++ true, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d3419b97b86c2f97d4457aa69f7d0c04abaf023d +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.zoneddatetime.prototype.equals ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++const result1 = instance.equals(arg); ++assert.sameValue(result1, true, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++const result2 = instance.equals(arg); ++assert.sameValue(result2, true, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..599ec149ace274762d3c1847feaf35dbdb2c919b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.zoneddatetime.prototype.equals ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.equals(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..007750f204467b56271cb2eb824c27612e97e77b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.zoneddatetime.prototype.equals ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..32294fc757b7a7a8f628a95fa16599f2ca8ff634 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/argument-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.zoneddatetime.prototype.equals ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for ZonedDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.equals(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.equals(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cc57129d4eee7d7fc7f53c6c8b20bf6e026d2685 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.zoneddatetime.prototype.equals ++description: Leap second is a valid ISO string for ZonedDateTime ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(1_483_228_799_000_000_000n, timeZone); ++ ++let arg = "2016-12-31T23:59:60+00:00[UTC]"; ++const result = instance.equals(arg); ++assert.sameValue( ++ result, ++ true, ++ "leap second is a valid ISO string for ZonedDateTime" ++); ++ ++arg = "2000-05-02T12:34:56+23:59[+23:59:60]"; ++assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ "leap second in time zone name not valid" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8470aacdbf924b93bbc5ba24727f9ab03883905b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-leap-second.js +@@ -0,0 +1,18 @@ ++// 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.zoneddatetime.prototype.equals ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1588377600_000_000_000n, new Temporal.TimeZone("UTC")); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++assert(instance.equals({ year: 2020, month: 5, day: 2, timeZone }), "leap second is a valid ISO string for TimeZone"); ++assert(instance.equals({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), "leap second is a valid ISO String for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.equals({ year: 2020, month: 5, day: 2, timeZone }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.equals({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9a58704f1ff23385a3bbf447851ad86c856be54e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.zoneddatetime.prototype.equals ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.equals({ year: 2020, month: 5, day: 2, timeZone }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.equals({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6dc438b8ab0f773950933f68b58212757cd1df3b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.zoneddatetime.prototype.equals ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.equals({ year: 2020, month: 5, day: 2, timeZone }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.equals({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.equals({ year: 2020, month: 5, day: 2, timeZone }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.equals({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.equals({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/year-zero.js +index f7030e4d6a9d40df3d2d92b1571f1d7ba7b3b0dd..3e87ae889316af26316a698074b89d390ad4f55a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/equals/year-zero.js +@@ -4,11 +4,20 @@ + /*--- + esid: sec-temporal.zoneddatetime.prototype.equals + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + ++const invalidStrings = [ ++ "-0000000-01-01T00:02Z[UTC]", ++ "-0000000-01-01T00:02+00:00[UTC]", ++ "-0000000-01-01T00:02:00.000000000+00:00[UTC]", ++]; + const timeZone = new Temporal.TimeZone("UTC"); + const instance = new Temporal.ZonedDateTime(0n, timeZone); +-const str = "-0000000-01-01T00:02:00.000000000+00:00[UTC]"; +- +-assert.throws(RangeError, () => { instance.equals(str); }, "reject minus zero as extended year"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.equals(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e54dcd45e6cde4d77099c535ca14fbdb5c1bf195 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/options-wrong-type.js +@@ -0,0 +1,24 @@ ++// 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.zoneddatetime.prototype.round ++description: TypeError thrown when options argument is missing or a non-string primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ undefined, ++ null, ++ true, ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.ZonedDateTime(0n, "UTC"); ++assert.throws(TypeError, () => instance.round(), "TypeError on missing options argument"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.round(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/rounding-direction.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/rounding-direction.js +new file mode 100644 +index 0000000000000000000000000000000000000000..676841ed26df5d4708897ee1d619554b07a4c8c4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/rounding-direction.js +@@ -0,0 +1,30 @@ ++// 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.zoneddatetime.prototype.round ++description: Rounding down is towards the Big Bang, not the epoch or 1 BCE ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(-65_261_246_399_500_000_000n, "UTC"); // -000099-12-15T12:00:00.5Z ++assert.sameValue( ++ instance.round({ smallestUnit: "second", roundingMode: "floor" }).epochNanoseconds, ++ -65_261_246_400_000_000_000n, // -000099-12-15T12:00:00Z ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode floor)" ++); ++assert.sameValue( ++ instance.round({ smallestUnit: "second", roundingMode: "trunc" }).epochNanoseconds, ++ -65_261_246_400_000_000_000n, // -000099-12-15T12:00:00Z ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode trunc)" ++); ++assert.sameValue( ++ instance.round({ smallestUnit: "second", roundingMode: "ceil" }).epochNanoseconds, ++ -65_261_246_399_000_000_000n, // -000099-12-15T12:00:01Z ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode ceil)" ++); ++assert.sameValue( ++ instance.round({ smallestUnit: "second", roundingMode: "halfExpand" }).epochNanoseconds, ++ -65_261_246_399_000_000_000n, // -000099-12-15T12:00:01Z ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode halfExpand)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/roundingmode-invalid-string.js +index 145e3f615a71058523d84e87db1ac54918a2c092..b5b58bc40d6fb14587c8ea64f5fcdb30d3cb15ce 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/roundingmode-invalid-string.js +@@ -8,4 +8,6 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_123_987_500n, "UTC"); +-assert.throws(RangeError, () => datetime.round({ smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => datetime.round({ smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/roundto-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/roundto-invalid-string.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9ce1a9e17d8ca64a2dcda9c95b19b33c67612043 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/roundto-invalid-string.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. ++ ++/*--- ++esid: sec-temporal.zoneddatetime.prototype.round ++description: RangeError thrown when smallestUnit option not one of the allowed string values ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(1_000_000_000_123_987_500n, "UTC"); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => datetime.round(smallestUnit), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-disallowed-units.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-disallowed-units.js +deleted file mode 100644 +index f89f4c6752b28ea10c97a85d8372599e18e9c4e6..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-disallowed-units.js ++++ /dev/null +@@ -1,32 +0,0 @@ +-// Copyright (C) 2021 Igalia, S.L. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +- +-/*--- +-esid: sec-temporal.zoneddatetime.prototype.round +-description: Specifically disallowed units for the smallestUnit option +-features: [Temporal, arrow-function] +----*/ +- +-const instance = new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, "UTC"); +-const invalidUnits = [ +- "era", +- "eras", +- "year", +- "month", +- "week", +- "years", +- "months", +- "weeks", +-]; +-invalidUnits.forEach((smallestUnit) => { +- assert.throws( +- RangeError, +- () => instance.round({ smallestUnit }), +- `{ smallestUnit: "${smallestUnit}" } should not be allowed as an argument to round` +- ); +- assert.throws( +- RangeError, +- () => instance.round(smallestUnit), +- `"${smallestUnit}" should not be allowed as an argument to round` +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-invalid-string.js +index bee6892ba97c9d6247eb9818525202a32335bc18..cf8831a97564420577530afbcf410d734ea52410 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/round/smallestunit-invalid-string.js +@@ -8,4 +8,26 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_123_987_500n, "UTC"); +-assert.throws(RangeError, () => datetime.round({ smallestUnit: "other string" })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => datetime.round({ smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a907504f4b213e8c3241eeeeb21204a9ec84155e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,30 @@ ++// 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.zoneddatetime.prototype.since ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const calendar = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d99297f1a023715caa905b57a7a660c65dccfe2e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-number.js +@@ -0,0 +1,43 @@ ++// 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.zoneddatetime.prototype.since ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++const result1 = instance.since(arg); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++const result2 = instance.since(arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2269c00245f30497b3ec967d1252b9b1f3e8305a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.zoneddatetime.prototype.since ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.since(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..30d5f0cf5f7058c4aa85df769f50032d0ec6b29c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.zoneddatetime.prototype.since ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d4824739f440580ca18f83a3d4f7d1a123a2f9eb +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/argument-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.zoneddatetime.prototype.since ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for ZonedDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.since(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.since(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/calendar-dateadd-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/calendar-dateadd-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9e6556718c8a6f1f8905f7f6b90cd670b3c96281 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/calendar-dateadd-called-with-options-undefined.js +@@ -0,0 +1,68 @@ ++// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-temporal.zoneddatetime.prototype.since ++description: > ++ BuiltinTimeZoneGetInstantFor calls Calendar.dateAdd with undefined as the ++ options value ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarDateAddUndefinedOptions(); ++const timeZone = TemporalHelpers.oneShiftTimeZone(new Temporal.Instant(0n), 3600e9); ++const earlier = new Temporal.ZonedDateTime(0n, timeZone, calendar); ++ ++// Basic difference with largestUnit larger than days. ++// The calls come from these paths: ++// ZonedDateTime.since() -> DifferenceZonedDateTime -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++ ++const later1 = new Temporal.ZonedDateTime(1_213_200_000_000_000n, timeZone, calendar); ++later1.since(earlier, { largestUnit: "weeks" }); ++assert.sameValue(calendar.dateAddCallCount, 2, "basic difference with largestUnit >days"); ++ ++// Basic difference with largestUnit equal to days, to cover the second path in ++// AddZonedDateTime. ++// The calls come from these paths: ++// ZonedDateTime.since() -> DifferenceZonedDateTime -> NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() (2x) ++ ++calendar.dateAddCallCount = 0; ++ ++later1.since(earlier, { largestUnit: "days" }); ++assert.sameValue(calendar.dateAddCallCount, 2, "basic difference with largestUnit days"); ++ ++// Difference with rounding, with smallestUnit a calendar unit. ++// The calls come from these paths: ++// ZonedDateTime.since() -> ++// DifferenceZonedDateTime -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// RoundDuration -> ++// MoveRelativeZonedDateTime -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// MoveRelativeDate -> calendar.dateAdd() ++ ++calendar.dateAddCallCount = 0; ++ ++later1.since(earlier, { smallestUnit: "weeks" }); ++assert.sameValue(calendar.dateAddCallCount, 5, "rounding difference with calendar smallestUnit"); ++ ++// Difference with rounding, with smallestUnit a non-calendar unit, and having ++// the resulting time difference be longer than a calendar day, covering the ++// paths that go through AdjustRoundedDurationDays. (The path through ++// AdjustRoundedDurationDays -> AddDuration that's covered in the corresponding ++// test in until() only happens in one direction.) ++// The calls come from these paths: ++// ZonedDateTime.since() -> ++// DifferenceZonedDateTime -> NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() (3x) ++// AdjustRoundedDurationDays -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() (3x) ++ ++calendar.dateAddCallCount = 0; ++ ++const later2 = new Temporal.ZonedDateTime(86_399_999_999_999n, timeZone, calendar); ++later2.since(earlier, { largestUnit: "days", smallestUnit: "hours", roundingMode: "ceil" }); ++assert.sameValue(calendar.dateAddCallCount, 6, "rounding difference with non-calendar smallestUnit and time difference longer than a calendar day"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/largestunit-invalid-string.js +index 61dd7f3ad39d552992eeebca91d8e56ef9d3d87b..9e96e8a496518b4b91f60daf9f055c54be7a6b94 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/largestunit-invalid-string.js +@@ -9,7 +9,20 @@ features: [Temporal] + + const earlier = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); + const later = new Temporal.ZonedDateTime(1_000_090_061_987_654_321n, "UTC"); +-const values = ["era", "eraYear", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e3611500bb8ff9423c8d038dd68f7fbfb50ca8c7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/leap-second.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.zoneddatetime.prototype.since ++description: Leap second is a valid ISO string for ZonedDateTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(1_483_228_799_000_000_000n, timeZone); ++ ++let arg = "2016-12-31T23:59:60+00:00[UTC]"; ++const result = instance.since(arg); ++TemporalHelpers.assertDuration( ++ result, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for ZonedDateTime" ++); ++ ++arg = "2000-05-02T12:34:56+23:59[+23:59:60]"; ++assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ "leap second in time zone name not valid" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f2f30920733a9797c11b1aa8c0489d2bf5598957 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.zoneddatetime.prototype.since ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.ZonedDateTime(0n, "UTC"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.since(new Temporal.ZonedDateTime(3600_000_000_000n, "UTC"), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-invalid-string.js +index 8fd11a6ba56da4fa970dbde08f9e3c100ff200cb..c749232dcd204ef34033aae3de12a683698a8dbe 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/roundingmode-invalid-string.js +@@ -9,4 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); + const later = new Temporal.ZonedDateTime(1_000_090_061_123_987_500n, "UTC"); +-assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/smallestunit-invalid-string.js +index 5735fba65e7ad9b5e012a7bf283629d9cdd15473..a116e2407458f5869d37325c6fe4705223fc16de 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/smallestunit-invalid-string.js +@@ -9,7 +9,20 @@ features: [Temporal] + + const earlier = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); + const later = new Temporal.ZonedDateTime(1_000_090_061_987_654_321n, "UTC"); +-const values = ["era", "eraYear", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => later.since(earlier, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => later.since(earlier, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5bce2e354783e74f3b7d990ba980624f510283de +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-leap-second.js +@@ -0,0 +1,23 @@ ++// 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.zoneddatetime.prototype.since ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const expectedTimeZone = "UTC"; ++const instance = new Temporal.ZonedDateTime(0n, expectedTimeZone); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// These operations should produce expectedTimeZone, so the following operations ++// should not throw due to the time zones being different on the receiver and ++// the argument. ++ ++instance.since({ year: 2020, month: 5, day: 2, timeZone }); ++instance.since({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.since({ year: 2020, month: 5, day: 2, timeZone }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.since({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4c4cd97e92dc1291f61561b2c2d26e5577eb10d2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.zoneddatetime.prototype.since ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.since({ year: 2020, month: 5, day: 2, timeZone }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.since({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6fb84b2ae679cff33143c42c1f1c7c4770d5873e +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.zoneddatetime.prototype.since ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.since({ year: 2020, month: 5, day: 2, timeZone }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.since({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.since({ year: 2020, month: 5, day: 2, timeZone }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.since({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.since({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/year-zero.js +index 71271b197b409de0b8446aa654254609f0a1829a..a33e732fba8628146271a229b4de5060efca6e6c 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/since/year-zero.js +@@ -4,11 +4,20 @@ + /*--- + esid: sec-temporal.zoneddatetime.prototype.since + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + ++const invalidStrings = [ ++ "-0000000-01-01T00:02Z[UTC]", ++ "-0000000-01-01T00:02+00:00[UTC]", ++ "-0000000-01-01T00:02:00.000000000+00:00[UTC]", ++]; + const timeZone = new Temporal.TimeZone("UTC"); + const instance = new Temporal.ZonedDateTime(0n, timeZone); +-const str = "-0000000-01-01T00:02:00.000000000+00:00[UTC]"; +- +-assert.throws(RangeError, () => { instance.since(str); }, "reject minus zero as extended year"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.since(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d06125ab40a20bda54c616c354fbd3b24b58552f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.zoneddatetime.prototype.subtract ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.ZonedDateTime(0n, "UTC"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.subtract({ years: 1 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/overflow-invalid-string.js +index 8c144ef70d034aac2b2ca62f2da8fd69d83d87fa..7a7d4fd1206abf47a7fc519bb1dd10033e1d4b40 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/subtract/overflow-invalid-string.js +@@ -20,4 +20,11 @@ features: [Temporal] + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, "UTC"); + const duration = new Temporal.Duration(0, 0, 0, 1); +-assert.throws(RangeError, () => datetime.subtract(duration, { overflow: "other string" })); ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => datetime.subtract(duration, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toJSON/year-format.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toJSON/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d532f99c4a622efe3b0092e20523b72fb4d9dfb4 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toJSON/year-format.js +@@ -0,0 +1,55 @@ ++// 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.zoneddatetime.prototype.tojson ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++function epochNsInYear(year) { ++ // Return an epoch nanoseconds value near the middle of the given year ++ const avgNsPerYear = 31_556_952_000_000_000n; ++ return (year - 1970n) * avgNsPerYear + (avgNsPerYear / 2n); ++} ++ ++const utc = new Temporal.TimeZone("UTC"); ++ ++let instance = new Temporal.ZonedDateTime(epochNsInYear(-100000n), utc); ++assert.sameValue(instance.toJSON(), "-100000-07-01T21:30:36+00:00[UTC]", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(-10000n), utc); ++assert.sameValue(instance.toJSON(), "-010000-07-01T21:30:36+00:00[UTC]", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(-9999n), utc); ++assert.sameValue(instance.toJSON(), "-009999-07-02T03:19:48+00:00[UTC]", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(-1000n), utc); ++assert.sameValue(instance.toJSON(), "-001000-07-02T09:30:36+00:00[UTC]", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(-999n), utc); ++assert.sameValue(instance.toJSON(), "-000999-07-02T15:19:48+00:00[UTC]", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(-1n), utc); ++assert.sameValue(instance.toJSON(), "-000001-07-02T15:41:24+00:00[UTC]", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(0n), utc); ++assert.sameValue(instance.toJSON(), "0000-07-01T21:30:36+00:00[UTC]", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(1n), utc); ++assert.sameValue(instance.toJSON(), "0001-07-02T03:19:48+00:00[UTC]", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(999n), utc); ++assert.sameValue(instance.toJSON(), "0999-07-02T03:41:24+00:00[UTC]", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(1000n), utc); ++assert.sameValue(instance.toJSON(), "1000-07-02T09:30:36+00:00[UTC]", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(9999n), utc); ++assert.sameValue(instance.toJSON(), "9999-07-02T15:41:24+00:00[UTC]", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(10000n), utc); ++assert.sameValue(instance.toJSON(), "+010000-07-01T21:30:36+00:00[UTC]", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(100000n), utc); ++assert.sameValue(instance.toJSON(), "+100000-07-01T21:30:36+00:00[UTC]", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e1925185c5dd89e42637c8002cd371d197847759 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/calendar-monthdayfromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.zoneddatetime.prototype.toplainmonthday ++description: > ++ Calendar.monthDayFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC", calendar); ++instance.toPlainMonthDay(); ++assert.sameValue(calendar.monthDayFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8f75ba30b57aa02231a991a3b3839e7548a2ae02 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/calendar-yearmonthfromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.zoneddatetime.prototype.toplainyearmonth ++description: > ++ Calendar.yearMonthFromFields method is called with undefined as the options ++ value when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC", calendar); ++instance.toPlainYearMonth(); ++assert.sameValue(calendar.yearMonthFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bffb9289511be791d448afbbfb94e265f7edb37c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-auto.js +@@ -0,0 +1,23 @@ ++// 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.zoneddatetime.prototype.tostring ++description: auto value for fractionalSecondDigits option ++features: [BigInt, Temporal] ++---*/ ++ ++const zeroSeconds = new Temporal.ZonedDateTime(0n, "UTC"); ++const wholeSeconds = new Temporal.ZonedDateTime(30_000_000_000n, "UTC"); ++const subSeconds = new Temporal.ZonedDateTime(30_123_400_000n, "UTC"); ++ ++const tests = [ ++ [zeroSeconds, "1970-01-01T00:00:00+00:00[UTC]"], ++ [wholeSeconds, "1970-01-01T00:00:30+00:00[UTC]"], ++ [subSeconds, "1970-01-01T00:00:30.1234+00:00[UTC]"], ++]; ++ ++for (const [datetime, expected] of tests) { ++ assert.sameValue(datetime.toString(), expected, "default is to emit seconds and drop trailing zeroes"); ++ assert.sameValue(datetime.toString({ fractionalSecondDigits: "auto" }), expected, "auto is the default"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-invalid-string.js +index ea172ceb80e7f92aa9801f0ed6697e2ca8a689e7..c933354b9d4c399f19339378a75cc72198832044 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-invalid-string.js +@@ -9,11 +9,14 @@ info: | + 4. If _stringValues_ is not *undefined* and _stringValues_ does not contain an element equal to _value_, throw a *RangeError* exception. + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). +- sec-temporal.instant.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ sec-temporal.zoneddatetime.prototype.tostring step 4: ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_987_650_000n, "UTC"); + +-assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: "other string" })); ++for (const fractionalSecondDigits of ["other string", "AUTO", "not-auto", "autos", "auto\0"]) { ++ assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits }), ++ `"${fractionalSecondDigits}" is not a valid value for fractionalSecondDigits`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-non-integer.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-non-integer.js +index 93685aedece5da3b5a67ac63c8159b994f7932da..a9ccce61d8da3d00e47b2fd0f75113617f2cdc4f 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-non-integer.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-non-integer.js +@@ -10,7 +10,7 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.zoneddatetime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0063031f20361ec969f21ecbbd21571f0161c489 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-number.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. ++ ++/*--- ++esid: sec-temporal.zoneddatetime.prototype.tostring ++description: Number for fractionalSecondDigits option ++features: [BigInt, Temporal] ++---*/ ++ ++const zeroSeconds = new Temporal.ZonedDateTime(0n, "UTC"); ++const wholeSeconds = new Temporal.ZonedDateTime(30_000_000_000n, "UTC"); ++const subSeconds = new Temporal.ZonedDateTime(30_123_400_000n, "UTC"); ++ ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 0 }), "1970-01-01T00:00:30+00:00[UTC]", ++ "truncates 4 decimal places to 0"); ++assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 2 }), "1970-01-01T00:00:00.00+00:00[UTC]", ++ "pads zero seconds to 2 decimal places"); ++assert.sameValue(wholeSeconds.toString({ fractionalSecondDigits: 2 }), "1970-01-01T00:00:30.00+00:00[UTC]", ++ "pads whole seconds to 2 decimal places"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 2 }), "1970-01-01T00:00:30.12+00:00[UTC]", ++ "truncates 4 decimal places to 2"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 3 }), "1970-01-01T00:00:30.123+00:00[UTC]", ++ "truncates 4 decimal places to 3"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 6 }), "1970-01-01T00:00:30.123400+00:00[UTC]", ++ "pads 4 decimal places to 6"); ++assert.sameValue(zeroSeconds.toString({ fractionalSecondDigits: 7 }), "1970-01-01T00:00:00.0000000+00:00[UTC]", ++ "pads zero seconds to 7 decimal places"); ++assert.sameValue(wholeSeconds.toString({ fractionalSecondDigits: 7 }), "1970-01-01T00:00:30.0000000+00:00[UTC]", ++ "pads whole seconds to 7 decimal places"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 7 }), "1970-01-01T00:00:30.1234000+00:00[UTC]", ++ "pads 4 decimal places to 7"); ++assert.sameValue(subSeconds.toString({ fractionalSecondDigits: 9 }), "1970-01-01T00:00:30.123400000+00:00[UTC]", ++ "pads 4 decimal places to 9"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-out-of-range.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-out-of-range.js +index 36ae8d1429301af8411eb266d98c3f58b37663e2..487600a4158776e691fa4027e9905fd9e4003c3a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-out-of-range.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-out-of-range.js +@@ -10,11 +10,17 @@ info: | + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.zoneddatetime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_987_650_000n, "UTC"); + +-assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: -1 })); +-assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: 10 })); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: -Infinity }), ++ "−∞ is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: -1 }), ++ "−1 is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: 10 }), ++ "10 is out of range for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: Infinity }), ++ "∞ is out of range for fractionalSecondDigits"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js +index a4e0a10b5f0ffc80f65b59dde262470846b9f2b0..734f436c4c3e491c2a5a37b79d5b98b9517d89f7 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-undefined.js +@@ -8,17 +8,31 @@ info: | + sec-getoption step 3: + 3. If _value_ is *undefined*, return _fallback_. + sec-getstringornumberoption step 2: +- 2. Let _value_ be ? GetOption(_options_, _property_, *"stringOrNumber"*, *undefined*, _fallback_). ++ 2. Let _value_ be ? GetOption(_options_, _property_, « Number, String », *undefined*, _fallback_). + sec-temporal-tosecondsstringprecision step 9: + 9. Let _digits_ be ? GetStringOrNumberOption(_normalizedOptions_, *"fractionalSecondDigits"*, « *"auto"* », 0, 9, *"auto"*). + sec-temporal.zoneddatetime.prototype.tostring step 4: +- 4. Let _precision_ be ? ToDurationSecondsStringPrecision(_options_). ++ 4. Let _precision_ be ? ToSecondsStringPrecision(_options_). + features: [Temporal] + ---*/ + +-const datetime = new Temporal.ZonedDateTime(1_000_000_000_987_650_000n, "UTC"); ++const zeroSeconds = new Temporal.ZonedDateTime(0n, "UTC"); ++const wholeSeconds = new Temporal.ZonedDateTime(30_000_000_000n, "UTC"); ++const subSeconds = new Temporal.ZonedDateTime(30_123_400_000n, "UTC"); + +-const explicit = datetime.toString({ fractionalSecondDigits: undefined }); +-assert.sameValue(explicit, "2001-09-09T01:46:40.98765+00:00[UTC]", "default fractionalSecondDigits is auto"); ++const tests = [ ++ [zeroSeconds, "1970-01-01T00:00:00+00:00[UTC]"], ++ [wholeSeconds, "1970-01-01T00:00:30+00:00[UTC]"], ++ [subSeconds, "1970-01-01T00:00:30.1234+00:00[UTC]"], ++]; + +-// See options-undefined.js for {} ++for (const [datetime, expected] of tests) { ++ const explicit = datetime.toString({ fractionalSecondDigits: undefined }); ++ assert.sameValue(explicit, expected, "default fractionalSecondDigits is auto (property present but undefined)"); ++ ++ const implicit = datetime.toString({}); ++ assert.sameValue(implicit, expected, "default fractionalSecondDigits is auto (property not present)"); ++ ++ const lambda = datetime.toString(() => {}); ++ assert.sameValue(lambda, expected, "default fractionalSecondDigits is auto (property not present, function object)"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-wrong-type.js +index b147dbac3e25f0151028fad4ce65a8a3f939cf56..9a12691ad6dc8db186884a0adf54f3e3d19e5c0d 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-wrong-type.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/fractionalseconddigits-wrong-type.js +@@ -22,4 +22,26 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_987_650_000n, "UTC"); +-TemporalHelpers.checkFractionalSecondDigitsOptionWrongType(datetime); ++ ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: null }), ++ "null is not a number and converts to the string 'null' which is not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: true }), ++ "true is not a number and converts to the string 'true' which is not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: false }), ++ "false is not a number and converts to the string 'false' which is not valid for fractionalSecondDigits"); ++assert.throws(TypeError, () => datetime.toString({ fractionalSecondDigits: Symbol() }), ++ "symbols are not numbers and cannot convert to strings"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: 2n }), ++ "bigints are not numbers and convert to strings which are not valid for fractionalSecondDigits"); ++assert.throws(RangeError, () => datetime.toString({ fractionalSecondDigits: {} }), ++ "plain objects are not numbers and convert to strings which are not valid for fractionalSecondDigits"); ++ ++const expected = [ ++ "get fractionalSecondDigits.toString", ++ "call fractionalSecondDigits.toString", ++]; ++const actual = []; ++const observer = TemporalHelpers.toPrimitiveObserver(actual, "auto", "fractionalSecondDigits"); ++const result = datetime.toString({ fractionalSecondDigits: observer }); ++assert.sameValue(result, "2001-09-09T01:46:40.98765+00:00[UTC]", "object with toString uses toString return value"); ++assert.compareArray(actual, expected, "object with toString calls toString and not valueOf"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4b579b44d0107b57645ffec002e8a394fe8dae98 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.zoneddatetime.prototype.tostring ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.ZonedDateTime(0n, "UTC"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.toString(value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-cross-midnight.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-cross-midnight.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a55db0f240ee4968996e7fb91685987e61975a53 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-cross-midnight.js +@@ -0,0 +1,13 @@ ++// 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.zoneddatetime.prototype.tostring ++description: Rounding can cross midnight ++features: [Temporal] ++---*/ ++ ++const zonedDateTime = new Temporal.ZonedDateTime(946_684_799_999_999_999n, "UTC"); // one nanosecond before 2000-01-01T00:00:00 ++for (const roundingMode of ["ceil", "halfExpand"]) { ++ assert.sameValue(zonedDateTime.toString({ fractionalSecondDigits: 8, roundingMode }), "2000-01-01T00:00:00.00000000+00:00[UTC]"); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-direction.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-direction.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b376e075bb80a88b5efa51dc112ff501ff923454 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-direction.js +@@ -0,0 +1,30 @@ ++// 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.zoneddatetime.prototype.tostring ++description: Rounding down is towards the Big Bang, not the epoch or 1 BCE ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(-65_261_246_399_500_000_000n, "UTC"); // -000099-12-15T12:00:00.5Z ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "floor" }), ++ "-000099-12-15T12:00:00+00:00[UTC]", ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE" ++); ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "trunc" }), ++ "-000099-12-15T12:00:00+00:00[UTC]", ++ "Rounding down is towards the Big Bang, not the epoch or 1 BCE (roundingMode trunc)" ++); ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "ceil" }), ++ "-000099-12-15T12:00:01+00:00[UTC]", ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode ceil)" ++); ++assert.sameValue( ++ instance.toString({ smallestUnit: "second", roundingMode: "halfExpand" }), ++ "-000099-12-15T12:00:01+00:00[UTC]", ++ "Rounding up is away from the Big Bang, not the epoch or 1 BCE (roundingMode halfExpand)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-ceil.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-ceil.js +new file mode 100644 +index 0000000000000000000000000000000000000000..cd9c1af1edc1b9f3a8b27664f3e8d08afa3ae76a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-ceil.js +@@ -0,0 +1,37 @@ ++// 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.zoneddatetime.prototype.tostring ++description: ceil value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(1_000_000_000_123_987_500n, "UTC"); ++ ++const result1 = datetime.toString({ smallestUnit: "microsecond", roundingMode: "ceil" }); ++assert.sameValue(result1, "2001-09-09T01:46:40.123988+00:00[UTC]", ++ "roundingMode is ceil (with 6 digits from smallestUnit)"); ++ ++const result2 = datetime.toString({ fractionalSecondDigits: 6, roundingMode: "ceil" }); ++assert.sameValue(result2, "2001-09-09T01:46:40.123988+00:00[UTC]", ++ "roundingMode is ceil (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = datetime.toString({ smallestUnit: "millisecond", roundingMode: "ceil" }); ++assert.sameValue(result3, "2001-09-09T01:46:40.124+00:00[UTC]", ++ "roundingMode is ceil (with 3 digits from smallestUnit)"); ++ ++const result4 = datetime.toString({ fractionalSecondDigits: 3, roundingMode: "ceil" }); ++assert.sameValue(result4, "2001-09-09T01:46:40.124+00:00[UTC]", ++ "roundingMode is ceil (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = datetime.toString({ smallestUnit: "second", roundingMode: "ceil" }); ++assert.sameValue(result5, "2001-09-09T01:46:41+00:00[UTC]", ++ "roundingMode is ceil (with 0 digits from smallestUnit)"); ++ ++const result6 = datetime.toString({ fractionalSecondDigits: 0, roundingMode: "ceil" }); ++assert.sameValue(result6, "2001-09-09T01:46:41+00:00[UTC]", ++ "roundingMode is ceil (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = datetime.toString({ smallestUnit: "minute", roundingMode: "ceil" }); ++assert.sameValue(result7, "2001-09-09T01:47+00:00[UTC]", "roundingMode is ceil (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-floor.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-floor.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fec4286c461178d799e31b1217af97b02e42efcc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-floor.js +@@ -0,0 +1,37 @@ ++// 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.zoneddatetime.prototype.tostring ++description: floor value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(1_000_000_000_123_987_500n, "UTC"); ++ ++const result1 = datetime.toString({ smallestUnit: "microsecond", roundingMode: "floor" }); ++assert.sameValue(result1, "2001-09-09T01:46:40.123987+00:00[UTC]", ++ "roundingMode is floor (with 6 digits from smallestUnit)"); ++ ++const result2 = datetime.toString({ fractionalSecondDigits: 6, roundingMode: "floor" }); ++assert.sameValue(result2, "2001-09-09T01:46:40.123987+00:00[UTC]", ++ "roundingMode is floor (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = datetime.toString({ smallestUnit: "millisecond", roundingMode: "floor" }); ++assert.sameValue(result3, "2001-09-09T01:46:40.123+00:00[UTC]", ++ "roundingMode is floor (with 3 digits from smallestUnit)"); ++ ++const result4 = datetime.toString({ fractionalSecondDigits: 3, roundingMode: "floor" }); ++assert.sameValue(result4, "2001-09-09T01:46:40.123+00:00[UTC]", ++ "roundingMode is floor (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = datetime.toString({ smallestUnit: "second", roundingMode: "floor" }); ++assert.sameValue(result5, "2001-09-09T01:46:40+00:00[UTC]", ++ "roundingMode is floor (with 0 digits from smallestUnit)"); ++ ++const result6 = datetime.toString({ fractionalSecondDigits: 0, roundingMode: "floor" }); ++assert.sameValue(result6, "2001-09-09T01:46:40+00:00[UTC]", ++ "roundingMode is floor (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = datetime.toString({ smallestUnit: "minute", roundingMode: "floor" }); ++assert.sameValue(result7, "2001-09-09T01:46+00:00[UTC]", "roundingMode is floor (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-halfExpand.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-halfExpand.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a4a989cb6ed884cefde4be1a2494e332b97b5f0a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-halfExpand.js +@@ -0,0 +1,37 @@ ++// 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.zoneddatetime.prototype.tostring ++description: halfExpand value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(1_000_000_000_123_987_500n, "UTC"); ++ ++const result1 = datetime.toString({ smallestUnit: "microsecond", roundingMode: "halfExpand" }); ++assert.sameValue(result1, "2001-09-09T01:46:40.123988+00:00[UTC]", ++ "roundingMode is halfExpand (with 6 digits from smallestUnit)"); ++ ++const result2 = datetime.toString({ fractionalSecondDigits: 6, roundingMode: "halfExpand" }); ++assert.sameValue(result2, "2001-09-09T01:46:40.123988+00:00[UTC]", ++ "roundingMode is halfExpand (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = datetime.toString({ smallestUnit: "millisecond", roundingMode: "halfExpand" }); ++assert.sameValue(result3, "2001-09-09T01:46:40.124+00:00[UTC]", ++ "roundingMode is halfExpand (with 3 digits from smallestUnit)"); ++ ++const result4 = datetime.toString({ fractionalSecondDigits: 3, roundingMode: "halfExpand" }); ++assert.sameValue(result4, "2001-09-09T01:46:40.124+00:00[UTC]", ++ "roundingMode is halfExpand (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = datetime.toString({ smallestUnit: "second", roundingMode: "halfExpand" }); ++assert.sameValue(result5, "2001-09-09T01:46:40+00:00[UTC]", ++ "roundingMode is halfExpand (with 0 digits from smallestUnit)"); ++ ++const result6 = datetime.toString({ fractionalSecondDigits: 0, roundingMode: "halfExpand" }); ++assert.sameValue(result6, "2001-09-09T01:46:40+00:00[UTC]", ++ "roundingMode is halfExpand (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = datetime.toString({ smallestUnit: "minute", roundingMode: "halfExpand" }); ++assert.sameValue(result7, "2001-09-09T01:47+00:00[UTC]", "roundingMode is halfExpand (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-invalid-string.js +index 01d86acc415e1d88c0c368e5b487464f9f1e4866..50b223237cab431f0a26239600da05b8a12a7653 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-invalid-string.js +@@ -8,4 +8,6 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_123_987_500n, "UTC"); +-assert.throws(RangeError, () => datetime.toString({ smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => datetime.toString({ smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-trunc.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-trunc.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8fc3ca0dca9b0dc7216e80e8696b9709e910f8fe +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/roundingmode-trunc.js +@@ -0,0 +1,37 @@ ++// 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.zoneddatetime.prototype.tostring ++description: trunc value for roundingMode option ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(1_000_000_000_123_987_500n, "UTC"); ++ ++const result1 = datetime.toString({ smallestUnit: "microsecond", roundingMode: "trunc" }); ++assert.sameValue(result1, "2001-09-09T01:46:40.123987+00:00[UTC]", ++ "roundingMode is trunc (with 6 digits from smallestUnit)"); ++ ++const result2 = datetime.toString({ fractionalSecondDigits: 6, roundingMode: "trunc" }); ++assert.sameValue(result2, "2001-09-09T01:46:40.123987+00:00[UTC]", ++ "roundingMode is trunc (with 6 digits from fractionalSecondDigits)"); ++ ++const result3 = datetime.toString({ smallestUnit: "millisecond", roundingMode: "trunc" }); ++assert.sameValue(result3, "2001-09-09T01:46:40.123+00:00[UTC]", ++ "roundingMode is trunc (with 3 digits from smallestUnit)"); ++ ++const result4 = datetime.toString({ fractionalSecondDigits: 3, roundingMode: "trunc" }); ++assert.sameValue(result4, "2001-09-09T01:46:40.123+00:00[UTC]", ++ "roundingMode is trunc (with 3 digits from fractionalSecondDigits)"); ++ ++const result5 = datetime.toString({ smallestUnit: "second", roundingMode: "trunc" }); ++assert.sameValue(result5, "2001-09-09T01:46:40+00:00[UTC]", ++ "roundingMode is trunc (with 0 digits from smallestUnit)"); ++ ++const result6 = datetime.toString({ fractionalSecondDigits: 0, roundingMode: "trunc" }); ++assert.sameValue(result6, "2001-09-09T01:46:40+00:00[UTC]", ++ "roundingMode is trunc (with 0 digits from fractionalSecondDigits)"); ++ ++const result7 = datetime.toString({ smallestUnit: "minute", roundingMode: "trunc" }); ++assert.sameValue(result7, "2001-09-09T01:46+00:00[UTC]", "roundingMode is trunc (round to minute)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-fractionalseconddigits.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-fractionalseconddigits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7845c10bfb258966f326bbca3546da1a615f0dd2 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-fractionalseconddigits.js +@@ -0,0 +1,30 @@ ++// 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.zoneddatetime.prototype.tostring ++description: fractionalSecondDigits option is not used with smallestUnit present ++features: [Temporal] ++---*/ ++ ++const datetime = new Temporal.ZonedDateTime(56_789_999_999n, "UTC"); ++const tests = [ ++ ["minute", "1970-01-01T00:00+00:00[UTC]"], ++ ["second", "1970-01-01T00:00:56+00:00[UTC]"], ++ ["millisecond", "1970-01-01T00:00:56.789+00:00[UTC]"], ++ ["microsecond", "1970-01-01T00:00:56.789999+00:00[UTC]"], ++ ["nanosecond", "1970-01-01T00:00:56.789999999+00:00[UTC]"], ++]; ++ ++for (const [smallestUnit, expected] of tests) { ++ const string = datetime.toString({ ++ smallestUnit, ++ get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") } ++ }); ++ assert.sameValue(string, expected, `smallestUnit: "${smallestUnit}" overrides fractionalSecondDigits`); ++} ++ ++assert.throws(RangeError, () => datetime.toString({ ++ smallestUnit: "hour", ++ get fractionalSecondDigits() { throw new Test262Error("should not get fractionalSecondDigits") } ++}), "hour is an invalid smallestUnit but still overrides fractionalSecondDigits"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-invalid-string.js +index d3940464811bd1368de8e23db9fca293f0ec0787..1ba9732789b96e0036e5daef618c8b2d4c6d8aa1 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-invalid-string.js +@@ -8,4 +8,30 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_123_987_500n, "UTC"); +-assert.throws(RangeError, () => datetime.toString({ smallestUnit: "other string" })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "year", ++ "month", ++ "week", ++ "day", ++ "hour", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "years", ++ "months", ++ "weeks", ++ "days", ++ "hours", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => datetime.toString({ smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-valid-units.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-valid-units.js +index 12c10368b64a641ebf2a8685168470db88f6039b..6ea787955a9da3ca5bd905d2cdea6dc08c49e7db 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-valid-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/smallestunit-valid-units.js +@@ -9,13 +9,39 @@ features: [Temporal] + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_123_456_789n, "UTC"); + +-assert.sameValue(datetime.toString({ smallestUnit: "minute" }), "2001-09-09T01:46+00:00[UTC]"); +-assert.sameValue(datetime.toString({ smallestUnit: "second" }), "2001-09-09T01:46:40+00:00[UTC]"); +-assert.sameValue(datetime.toString({ smallestUnit: "millisecond" }), "2001-09-09T01:46:40.123+00:00[UTC]"); +-assert.sameValue(datetime.toString({ smallestUnit: "microsecond" }), "2001-09-09T01:46:40.123456+00:00[UTC]"); +-assert.sameValue(datetime.toString({ smallestUnit: "nanosecond" }), "2001-09-09T01:46:40.123456789+00:00[UTC]"); ++function test(instance, expectations, description) { ++ for (const [smallestUnit, expectedResult] of expectations) { ++ assert.sameValue(instance.toString({ smallestUnit }), expectedResult, ++ `${description} with smallestUnit "${smallestUnit}"`); ++ } ++} ++ ++test( ++ datetime, ++ [ ++ ["minute", "2001-09-09T01:46+00:00[UTC]"], ++ ["second", "2001-09-09T01:46:40+00:00[UTC]"], ++ ["millisecond", "2001-09-09T01:46:40.123+00:00[UTC]"], ++ ["microsecond", "2001-09-09T01:46:40.123456+00:00[UTC]"], ++ ["nanosecond", "2001-09-09T01:46:40.123456789+00:00[UTC]"], ++ ], ++ "subseconds toString" ++); ++ ++test( ++ new Temporal.ZonedDateTime(999_999_960_000_000_000n, "UTC"), ++ [ ++ ["minute", "2001-09-09T01:46+00:00[UTC]"], ++ ["second", "2001-09-09T01:46:00+00:00[UTC]"], ++ ["millisecond", "2001-09-09T01:46:00.000+00:00[UTC]"], ++ ["microsecond", "2001-09-09T01:46:00.000000+00:00[UTC]"], ++ ["nanosecond", "2001-09-09T01:46:00.000000000+00:00[UTC]"], ++ ], ++ "whole minutes toString" ++); + + const notValid = [ ++ "era", + "year", + "month", + "week", +@@ -24,5 +50,6 @@ const notValid = [ + ]; + + notValid.forEach((smallestUnit) => { +- assert.throws(RangeError, () => datetime.toString({ smallestUnit }), smallestUnit); ++ assert.throws(RangeError, () => datetime.toString({ smallestUnit }), ++ `"${smallestUnit}" is not a valid unit for the smallestUnit option`); + }); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/year-format.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/year-format.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1532bf1fecda3caaa1f962c03662ef577e4d69ce +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/toString/year-format.js +@@ -0,0 +1,55 @@ ++// 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.zoneddatetime.prototype.tostring ++description: Verify that the year is appropriately formatted as 4 or 6 digits ++features: [Temporal] ++---*/ ++ ++function epochNsInYear(year) { ++ // Return an epoch nanoseconds value near the middle of the given year ++ const avgNsPerYear = 31_556_952_000_000_000n; ++ return (year - 1970n) * avgNsPerYear + (avgNsPerYear / 2n); ++} ++ ++const utc = new Temporal.TimeZone("UTC"); ++ ++let instance = new Temporal.ZonedDateTime(epochNsInYear(-100000n), utc); ++assert.sameValue(instance.toString(), "-100000-07-01T21:30:36+00:00[UTC]", "large negative year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(-10000n), utc); ++assert.sameValue(instance.toString(), "-010000-07-01T21:30:36+00:00[UTC]", "smallest 5-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(-9999n), utc); ++assert.sameValue(instance.toString(), "-009999-07-02T03:19:48+00:00[UTC]", "largest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(-1000n), utc); ++assert.sameValue(instance.toString(), "-001000-07-02T09:30:36+00:00[UTC]", "smallest 4-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(-999n), utc); ++assert.sameValue(instance.toString(), "-000999-07-02T15:19:48+00:00[UTC]", "largest 3-digit negative year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(-1n), utc); ++assert.sameValue(instance.toString(), "-000001-07-02T15:41:24+00:00[UTC]", "year -1 formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(0n), utc); ++assert.sameValue(instance.toString(), "0000-07-01T21:30:36+00:00[UTC]", "year 0 formatted as 4-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(1n), utc); ++assert.sameValue(instance.toString(), "0001-07-02T03:19:48+00:00[UTC]", "year 1 formatted as 4-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(999n), utc); ++assert.sameValue(instance.toString(), "0999-07-02T03:41:24+00:00[UTC]", "largest 3-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(1000n), utc); ++assert.sameValue(instance.toString(), "1000-07-02T09:30:36+00:00[UTC]", "smallest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(9999n), utc); ++assert.sameValue(instance.toString(), "9999-07-02T15:41:24+00:00[UTC]", "largest 4-digit positive year formatted as 4-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(10000n), utc); ++assert.sameValue(instance.toString(), "+010000-07-01T21:30:36+00:00[UTC]", "smallest 5-digit positive year formatted as 6-digit"); ++ ++instance = new Temporal.ZonedDateTime(epochNsInYear(100000n), utc); ++assert.sameValue(instance.toString(), "+100000-07-01T21:30:36+00:00[UTC]", "large positive year formatted as 6-digit"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..df3b9989a817896a419cca4dab11496ed9a88c3f +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,30 @@ ++// 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.zoneddatetime.prototype.until ++description: Leap second is a valid ISO string for a calendar in a property bag ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const calendar = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result1, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result2, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7db7eaa625bbf21772628264bafb13a6ba3d39d0 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-number.js +@@ -0,0 +1,43 @@ ++// 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.zoneddatetime.prototype.until ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++const result1 = instance.until(arg); ++TemporalHelpers.assertDuration(result1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++const result2 = instance.until(arg); ++TemporalHelpers.assertDuration(result2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1970, monthCode: "M01", day: 1, timeZone, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a2d75d18de4783fd284968841ef9c81010158e6c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.zoneddatetime.prototype.until ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.until(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f3355384ff32c9f22adea2aa02313b84f1d2159c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.zoneddatetime.prototype.until ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..79609f3e2b89dcc753ef43855454ea941272b9e1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/argument-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.zoneddatetime.prototype.until ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for ZonedDateTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.until(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.ZonedDateTime, "Temporal.ZonedDateTime, object"], ++ [Temporal.ZonedDateTime.prototype, "Temporal.ZonedDateTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.until(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/calendar-dateadd-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/calendar-dateadd-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..13bdd33972e23e19843453b26ec910ee5835b489 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/calendar-dateadd-called-with-options-undefined.js +@@ -0,0 +1,69 @@ ++// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-temporal.zoneddatetime.prototype.until ++description: > ++ BuiltinTimeZoneGetInstantFor calls Calendar.dateAdd with undefined as the ++ options value ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarDateAddUndefinedOptions(); ++const timeZone = TemporalHelpers.oneShiftTimeZone(new Temporal.Instant(0n), 3600e9); ++const earlier = new Temporal.ZonedDateTime(0n, timeZone, calendar); ++ ++// Basic difference with largestUnit larger than days. ++// The calls come from these paths: ++// ZonedDateTime.until() -> DifferenceZonedDateTime -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++ ++const later1 = new Temporal.ZonedDateTime(1_213_200_000_000_000n, timeZone, calendar); ++earlier.until(later1, { largestUnit: "weeks" }); ++assert.sameValue(calendar.dateAddCallCount, 2, "basic difference with largestUnit >days"); ++ ++// Basic difference with largestUnit equal to days, to cover the second path in ++// AddZonedDateTime. ++// The calls come from these paths: ++// ZonedDateTime.until() -> DifferenceZonedDateTime -> NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() (2x) ++ ++calendar.dateAddCallCount = 0; ++ ++earlier.until(later1, { largestUnit: "days" }); ++assert.sameValue(calendar.dateAddCallCount, 2, "basic difference with largestUnit days"); ++ ++// Difference with rounding, with smallestUnit a calendar unit. ++// The calls come from these paths: ++// ZonedDateTime.until() -> ++// DifferenceZonedDateTime -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// RoundDuration -> ++// MoveRelativeZonedDateTime -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// MoveRelativeDate -> calendar.dateAdd() ++ ++calendar.dateAddCallCount = 0; ++ ++earlier.until(later1, { smallestUnit: "weeks" }); ++assert.sameValue(calendar.dateAddCallCount, 5, "rounding difference with calendar smallestUnit"); ++ ++// Difference with rounding, with smallestUnit a non-calendar unit, and having ++// the resulting time difference be longer than a calendar day, covering the ++// paths that go through AdjustRoundedDurationDays. ++// The calls come from these paths: ++// ZonedDateTime.until() -> ++// DifferenceZonedDateTime -> NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// AdjustRoundedDurationDays -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// AddDuration -> ++// AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() ++// DifferenceZonedDateTime -> NanosecondsToDays -> AddZonedDateTime -> BuiltinTimeZoneGetInstantFor -> calendar.dateAdd() (2x) ++ ++calendar.dateAddCallCount = 0; ++ ++const later2 = new Temporal.ZonedDateTime(86_399_999_999_999n, timeZone, calendar); ++earlier.until(later2, { largestUnit: "days", smallestUnit: "hours", roundingMode: "ceil" }); ++assert.sameValue(calendar.dateAddCallCount, 5, "rounding difference with non-calendar smallestUnit and time difference longer than a calendar day"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/largestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/largestunit-invalid-string.js +index a59c2f2e43c12a47b0c7f19b676ff6f8d6b1fc32..2be916f177854232442c9819b408f13d8f6babec 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/largestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/largestunit-invalid-string.js +@@ -9,7 +9,20 @@ features: [Temporal] + + const earlier = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); + const later = new Temporal.ZonedDateTime(1_000_090_061_987_654_321n, "UTC"); +-const values = ["era", "eraYear", "other string"]; +-for (const largestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { largestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string" ++]; ++for (const largestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { largestUnit }), ++ `"${largestUnit}" is not a valid value for largestUnit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ffa342eff0020e154f361922116e385dbcfc6826 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/leap-second.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.zoneddatetime.prototype.until ++description: Leap second is a valid ISO string for ZonedDateTime ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(1_483_228_799_000_000_000n, timeZone); ++ ++let arg = "2016-12-31T23:59:60+00:00[UTC]"; ++const result = instance.until(arg); ++TemporalHelpers.assertDuration( ++ result, ++ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ++ "leap second is a valid ISO string for ZonedDateTime" ++); ++ ++arg = "2000-05-02T12:34:56+23:59[+23:59:60]"; ++assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ "leap second in time zone name not valid" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..55b128637ea9aba19bc5758fcd354cc76c75fac5 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.zoneddatetime.prototype.until ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.ZonedDateTime(0n, "UTC"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.until(new Temporal.ZonedDateTime(3600_000_000_000n, "UTC"), value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-invalid-string.js +index 70d982765916dcce1ba836f6b536a7130ff23b29..3cedb0046df6be08a03d63a714a57aa38e8091e2 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/roundingmode-invalid-string.js +@@ -9,4 +9,6 @@ features: [Temporal] + + const earlier = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); + const later = new Temporal.ZonedDateTime(1_000_090_061_123_987_500n, "UTC"); +-assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode: "other string" })); ++for (const roundingMode of ["other string", "cile", "CEIL", "ce\u0131l", "auto", "expand", "halfCeil", "halfFloor", "halfTrunc", "halfEven", "halfexpand", "floor\0"]) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit: "microsecond", roundingMode })); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/smallestunit-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/smallestunit-invalid-string.js +index 42f55bc85038e26b09033f053c37f4739fa1fa0d..4f09f10f68844c81ac9f6ce5198ad0a665c03de1 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/smallestunit-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/smallestunit-invalid-string.js +@@ -9,7 +9,20 @@ features: [Temporal] + + const earlier = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); + const later = new Temporal.ZonedDateTime(1_000_090_061_987_654_321n, "UTC"); +-const values = ["era", "eraYear", "other string"]; +-for (const smallestUnit of values) { +- assert.throws(RangeError, () => earlier.until(later, { smallestUnit })); ++const badValues = [ ++ "era", ++ "eraYear", ++ "millisecond\0", ++ "mill\u0131second", ++ "SECOND", ++ "eras", ++ "eraYears", ++ "milliseconds\0", ++ "mill\u0131seconds", ++ "SECONDS", ++ "other string", ++]; ++for (const smallestUnit of badValues) { ++ assert.throws(RangeError, () => earlier.until(later, { smallestUnit }), ++ `"${smallestUnit}" is not a valid value for smallest unit`); + } +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..40dddba2e70de933649907609628e0591589e5ab +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-leap-second.js +@@ -0,0 +1,23 @@ ++// 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.zoneddatetime.prototype.until ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const expectedTimeZone = "UTC"; ++const instance = new Temporal.ZonedDateTime(0n, expectedTimeZone); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++// These operations should produce expectedTimeZone, so the following operations ++// should not throw due to the time zones being different on the receiver and ++// the argument. ++ ++instance.until({ year: 2020, month: 5, day: 2, timeZone }); ++instance.until({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.until({ year: 2020, month: 5, day: 2, timeZone }), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.until({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c733c4103ead8b6e326b739c9164c0a87ca7b9e6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.zoneddatetime.prototype.until ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.until({ year: 2020, month: 5, day: 2, timeZone }), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.until({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..53f4330b9a0b7ceaed3d66bfdef576ae0576b56a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.zoneddatetime.prototype.until ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.until({ year: 2020, month: 5, day: 2, timeZone }), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.until({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.until({ year: 2020, month: 5, day: 2, timeZone }), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.until({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.until({ year: 2020, month: 5, day: 2, timeZone: { timeZone } }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/year-zero.js +index 0a8b5e6cb1604db5eded5d60a2b485d3b4f43b67..fb6e140e22acfb242c2e36b49996e855c9815290 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/until/year-zero.js +@@ -4,11 +4,20 @@ + /*--- + esid: sec-temporal.zoneddatetime.prototype.until + description: Negative zero, as an extended year, is rejected +-features: [Temporal] ++features: [Temporal, arrow-function] + ---*/ + ++const invalidStrings = [ ++ "-0000000-01-01T00:02Z[UTC]", ++ "-0000000-01-01T00:02+00:00[UTC]", ++ "-0000000-01-01T00:02:00.000000000+00:00[UTC]", ++]; + const timeZone = new Temporal.TimeZone("UTC"); + const instance = new Temporal.ZonedDateTime(0n, timeZone); +-const str = "-0000000-01-01T00:02:00.000000000+00:00[UTC]"; +- +-assert.throws(RangeError, () => { instance.until(str); }, "reject minus zero as extended year"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.until(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/options-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/options-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5f4d25d930506d679ee3e19702d977fbc349b70a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/options-wrong-type.js +@@ -0,0 +1,23 @@ ++// 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.zoneddatetime.prototype.with ++description: TypeError thrown when options argument is a primitive ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const badOptions = [ ++ null, ++ true, ++ "some string", ++ Symbol(), ++ 1, ++ 2n, ++]; ++ ++const instance = new Temporal.ZonedDateTime(0n, "UTC"); ++for (const value of badOptions) { ++ assert.throws(TypeError, () => instance.with({ day: 5 }, value), ++ `TypeError on wrong options type ${typeof value}`); ++}; +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/overflow-invalid-string.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/overflow-invalid-string.js +index 96d5ab3799d6b0390528bc0c273bf886c0e96d3c..843437f59fd0a763c2458f7689ffbb5b16522328 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/overflow-invalid-string.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/with/overflow-invalid-string.js +@@ -18,4 +18,11 @@ features: [Temporal] + ---*/ + + const datetime = new Temporal.ZonedDateTime(1_000_000_000_987_654_321n, "UTC"); +-assert.throws(RangeError, () => datetime.with({ minute: 45 }, { overflow: "other string" })); ++const badOverflows = ["", "CONSTRAIN", "balance", "other string", "constra\u0131n", "reject\0"]; ++for (const overflow of badOverflows) { ++ assert.throws( ++ RangeError, ++ () => datetime.with({ minute: 45 }, { overflow }), ++ `invalid overflow ("${overflow}")` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0a299d540fb0713e7becaf5f499822c108271f23 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-number.js +@@ -0,0 +1,29 @@ ++// 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.zoneddatetime.prototype.withcalendar ++description: A number is converted to a string, then to Temporal.Calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC", { id: "replace-me" }); ++ ++const arg = 19761118; ++ ++const result = instance.withCalendar(arg); ++assert.sameValue(result.calendar.id, "iso8601", "19761118 is a valid ISO string for Calendar"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.withCalendar(arg), ++ `Number ${arg} does not convert to a valid ISO string for Calendar` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..29e229cc10a200d3c05b672118c9a5ed09b646f6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-string-leap-second.js +@@ -0,0 +1,26 @@ ++// 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.zoneddatetime.prototype.withcalendar ++description: Leap second is a valid ISO string for Calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC", { id: "replace-me" }); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.withCalendar(arg); ++assert.sameValue( ++ result1.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar" ++); ++ ++arg = { calendar: "2016-12-31T23:59:60" }; ++const result2 = instance.withCalendar(arg); ++assert.sameValue( ++ result2.calendar.id, ++ "iso8601", ++ "leap second is a valid ISO string for Calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d4f8e996a1ebefa5330914b8ff549951c181b544 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-wrong-type.js +@@ -0,0 +1,32 @@ ++// 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.zoneddatetime.prototype.withcalendar ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for Calendar ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC", { id: "replace-me" }); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.withCalendar(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.withCalendar(arg), `${description} is not a valid object and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f251b281fda0ceb3f651ecc455b6dfc2cbc4b16c +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.zoneddatetime.prototype.withplaindate ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); ++ ++const arg = 19761118; ++ ++const result = instance.withPlainDate(arg); ++assert.sameValue(result.epochNanoseconds, 217_129_600_000_000_000n, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.withPlainDate(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ebc5f7ce7fdbfc0a3b8c468d5910b425be062eb1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,29 @@ ++// 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.zoneddatetime.prototype.withplaindate ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, timeZone); ++ ++const calendar = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.withPlainDate(arg); ++assert.sameValue( ++ result1.epochNanoseconds, ++ 217_129_600_000_000_000n, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.withPlainDate(arg); ++assert.sameValue( ++ result2.epochNanoseconds, ++ 217_129_600_000_000_000n, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b5c7061ced56f89ace3792bd866c862ebf1e04f7 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-number.js +@@ -0,0 +1,42 @@ ++// 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.zoneddatetime.prototype.withplaindate ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, timeZone); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.withPlainDate(arg); ++assert.sameValue(result1.epochNanoseconds, 217_129_600_000_000_000n, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.withPlainDate(arg); ++assert.sameValue(result2.epochNanoseconds, 217_129_600_000_000_000n, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.withPlainDate(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.withPlainDate(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..54ed639ee706b7a9e574357bf9ae6ff8dcb4c9a1 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.zoneddatetime.prototype.withplaindate ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, timeZone); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.withPlainDate(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.withPlainDate(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.withPlainDate(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.withPlainDate(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.withPlainDate(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5bd85409f332fe4a5ee897acebd31b548f5d4dfc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,25 @@ ++// 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.zoneddatetime.prototype.withplaindate ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, timeZone); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.withPlainDate(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-invalid.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..003bf13f1b85b4195621ac47375c6cd8db61b755 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.zoneddatetime.prototype.withplaindate ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.withPlainDate(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..20a9cd9474e39004f1a0ac925cea7fd15279a92a +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.zoneddatetime.prototype.withplaindate ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.withPlainDate(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.withPlainDate(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f19cc9fac12c8d72a7a44674efcf4a15d41467da +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,16 @@ ++// 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.zoneddatetime.prototype.withplaindate ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC", calendar); ++instance.withPlainDate({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..62e81954d3d8de538526cb0efcc9cb9e6812b163 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.zoneddatetime.prototype.withplaindate ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.withPlainDate(arg); ++assert.sameValue( ++ result1.epochNanoseconds, ++ 1_483_148_800_000_000_000n, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.withPlainDate(arg); ++assert.sameValue( ++ result2.epochNanoseconds, ++ 1_483_148_800_000_000_000n, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/year-zero.js +index 0c66b19fd140dfaa7591b39b206ddd7d8a2d6872..af58036ea97fa23eb413080f8acab597fdd3886a 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/year-zero.js +@@ -7,11 +7,18 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; +-const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); +- +-assert.throws( ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.withPlainDate(arg); }, ++ () => instance.withPlainDate(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-number.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..13dc510e5b3ee3c137114da35332ef9a4c7cb229 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-number.js +@@ -0,0 +1,30 @@ ++// 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.zoneddatetime.prototype.withplaintime ++description: A number is converted to a string, then to Temporal.PlainTime ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); ++ ++const arg = 123456.987654321; ++ ++const result = instance.withPlainTime(arg); ++assert.sameValue(result.epochNanoseconds, 1000038896_987_654_321n, "123456.987654321 is a valid ISO string for PlainTime"); ++ ++const numbers = [ ++ 1, ++ -123456.987654321, ++ 1234567, ++ 123456.9876543219, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.withPlainTime(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainTime` ++ ); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js +index 129743e863f2338ee33fda3b8ae60332f50fa0c3..a2b10a2b5d67103dbcba03d0c7f8e7f4d1d1ab30 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation.js +@@ -27,6 +27,13 @@ ambiguousStrings.forEach((string) => { + // The same string with a T prefix should not throw: + arg = `T${string}`; + instance.withPlainTime(arg); ++ ++ arg = ` ${string}`; ++ assert.throws( ++ RangeError, ++ () => instance.withPlainTime(arg), ++ "space is not accepted as a substitute for T prefix" ++ ); + }); + + // None of these should throw without a T prefix, because they are unambiguously time strings: +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..85589a45b9bd4c6540cf05c089d8736730ad2a74 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-wrong-type.js +@@ -0,0 +1,35 @@ ++// 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.zoneddatetime.prototype.withplaintime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainTime ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.withPlainTime(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainTime, "Temporal.PlainTime, object"], ++ [Temporal.PlainTime.prototype, "Temporal.PlainTime.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.withPlainTime(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9110c08d8fd88529726aeb195092f363e9b5436b +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.zoneddatetime.prototype.withplaintime ++description: Leap second is a valid ISO string for PlainTime ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.withPlainTime(arg); ++assert.sameValue( ++ result1.epochNanoseconds, ++ 1000079999_000_000_000n, ++ "leap second is a valid ISO string for PlainTime" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.withPlainTime(arg); ++assert.sameValue( ++ result2.epochNanoseconds, ++ 1000079999_000_000_000n, ++ "second: 60 is ignored in property bag for PlainTime" ++); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js +index 5ecf3e33745ce5380cecb577a5a7ed04a1713634..e6df5e8472d4afdf4a6719c98a528c9dfc385e7e 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/plaintime-propertybag-no-time-units.js +@@ -10,7 +10,7 @@ features: [Temporal] + const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); + + const props = {}; +-assert.throws(TypeError, () => instance.withPlainTime(props), "TypeError if at least one property is not present"); ++assert.throws(TypeError, () => instance.withPlainTime(props), "TypeError if no properties are present"); + + props.minute = 30; + const result = instance.withPlainTime(props); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/year-zero.js +index 13f6ae2518636a8b3b14bcf65a86213a7fd200b8..f5fa8e920e022a3ae6111218da12d710eab3d803 100644 +--- a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/year-zero.js ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/year-zero.js +@@ -8,10 +8,12 @@ features: [Temporal, arrow-function] + ---*/ + + const invalidStrings = [ +- '-000000-12-07T03:24:30', +- '-000000-12-07T03:24:30+01:00[UTC]' ++ "-000000-12-07T03:24:30", ++ "-000000-12-07T03:24:30+01:00", ++ "-000000-12-07T03:24:30+00:00[UTC]", + ]; +-const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.ZonedDateTime(0n, timeZone); + invalidStrings.forEach((arg) => { + assert.throws( + RangeError, +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..93fc6d9d0ea167181fed64440603934653a1aef3 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-leap-second.js +@@ -0,0 +1,20 @@ ++// 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.zoneddatetime.prototype.withtimezone ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(0n, "UTC"); ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = instance.withTimeZone(timeZone); ++assert.sameValue(result1.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone"); ++const result2 = instance.withTimeZone({ timeZone }); ++assert.sameValue(result2.timeZone.id, "UTC", "leap second is a valid ISO string for TimeZone (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => instance.withTimeZone(timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => instance.withTimeZone({ timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-year-zero.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fc14d8ed3a37e7a61fc3d5d5c6cd827a8ae4eed6 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-string-year-zero.js +@@ -0,0 +1,26 @@ ++// 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.zoneddatetime.prototype.withtimezone ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++invalidStrings.forEach((timeZone) => { ++ assert.throws( ++ RangeError, ++ () => instance.withTimeZone(timeZone), ++ "reject minus zero as extended year" ++ ); ++ assert.throws( ++ RangeError, ++ () => instance.withTimeZone({ timeZone }), ++ "reject minus zero as extended year (nested property)" ++ ); ++}); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ccb404ce43516c8e81325a55d6566bf72fad0664 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/prototype/withTimeZone/timezone-wrong-type.js +@@ -0,0 +1,38 @@ ++// 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.zoneddatetime.prototype.withtimezone ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.ZonedDateTime(0n, new Temporal.TimeZone("UTC")); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.withTimeZone(timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => instance.withTimeZone({ timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.withTimeZone(timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => instance.withTimeZone({ timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => instance.withTimeZone({ timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/timezone-string-leap-second.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/timezone-string-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..966502ef8fa3562d0067588591973d0d84b6f3cc +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/timezone-string-leap-second.js +@@ -0,0 +1,19 @@ ++// 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.zoneddatetime ++description: Leap second is a valid ISO string for TimeZone ++features: [Temporal] ++---*/ ++ ++let timeZone = "2016-12-31T23:59:60+00:00[UTC]"; ++ ++const result1 = new Temporal.ZonedDateTime(0n, timeZone); ++assert.sameValue(result1.timeZone.id, "UTC", "Time zone string determined from bracket name"); ++const result2 = new Temporal.ZonedDateTime(0n, { timeZone }); ++assert.sameValue(result2.timeZone.id, "UTC", "Time zone string determined from bracket name (nested property)"); ++ ++timeZone = "2021-08-19T17:30:45.123456789+23:59[+23:59:60]"; ++assert.throws(RangeError, () => new Temporal.ZonedDateTime(0n, timeZone), "leap second in time zone name not valid"); ++assert.throws(RangeError, () => new Temporal.ZonedDateTime(0n, { timeZone }), "leap second in time zone name not valid (nested property)"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/timezone-string-multiple-offsets.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/timezone-string-multiple-offsets.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f1b9432c8f5c69780a10561362e11f420b2d9c00 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/timezone-string-multiple-offsets.js +@@ -0,0 +1,15 @@ ++// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-temporal.zoneddatetime ++description: Time zone strings with UTC offset fractional part are not confused with time fractional part ++features: [Temporal] ++---*/ ++ ++const timeZone = "2021-08-19T17:30:45.123456789+01:46[+01:45:30.987654321]"; ++ ++const result1 = new Temporal.ZonedDateTime(0n, timeZone); ++assert.sameValue(result1.timeZone.id, "+01:45:30.987654321", "Time zone string determined from bracket name"); ++const result2 = new Temporal.ZonedDateTime(0n, { timeZone }); ++assert.sameValue(result2.timeZone.id, "+01:45:30.987654321", "Time zone string determined from bracket name"); +diff --git a/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/timezone-wrong-type.js b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/timezone-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..163050b3ce3eec8cd86821725c447f8b19fde297 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/Temporal/ZonedDateTime/timezone-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.zoneddatetime ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or object for TimeZone ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [19761118, "number that would convert to a valid ISO string in other contexts"], ++ [1n, "bigint"], ++]; ++ ++for (const [timeZone, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => new Temporal.ZonedDateTime(0n, timeZone), `${description} does not convert to a valid ISO string`); ++ assert.throws(RangeError, () => new Temporal.ZonedDateTime(0n, { timeZone }), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++]; ++ ++for (const [timeZone, description] of typeErrorTests) { ++ assert.throws(TypeError, () => new Temporal.ZonedDateTime(0n, timeZone), `${description} is not a valid object and does not convert to a string`); ++ assert.throws(TypeError, () => new Temporal.ZonedDateTime(0n, { timeZone }), `${description} is not a valid object and does not convert to a string (nested property)`); ++} ++ ++const timeZone = undefined; ++assert.throws(RangeError, () => new Temporal.ZonedDateTime(0n, { timeZone }), `undefined is always a RangeError as nested property`); +diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-get-src-value-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-get-src-value-throws.js +deleted file mode 100644 +index 568e8b9b08a7f407d3c98c9d2ee6db43c0e5443b..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/BigInt/array-arg-targetbuffer-detached-on-get-src-value-throws.js ++++ /dev/null +@@ -1,45 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-%typedarray%.prototype.set-array-offset +-description: > +- Throws an error if buffer is detached before setting a value +-info: | +- 22.2.3.23.1 %TypedArray%.prototype.set (array [ , offset ] ) +- +- 1. Assert: array is any ECMAScript language value other than an Object with a +- [[TypedArrayName]] internal slot. If it is such an Object, the definition in +- 22.2.3.23.2 applies. +- ... +- 21. Repeat, while targetByteIndex < limit +- a. Let Pk be ! ToString(k). +- b. Let kNumber be ? ToNumber(? Get(src, Pk)). +- c. If IsDetachedBuffer(targetBuffer) is true, throw a TypeError exception. +- d. Perform SetValueInBuffer(targetBuffer, targetByteIndex, targetType, +- kNumber). +- ... +-includes: [testBigIntTypedArray.js, detachArrayBuffer.js] +-features: [BigInt, TypedArray] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = new TA([1n, 2n, 3n]); +- var obj = { +- length: 3, +- "0": 42n +- }; +- Object.defineProperty(obj, 1, { +- get: function() { +- $DETACHBUFFER(sample.buffer); +- } +- }); +- Object.defineProperty(obj, 2, { +- get: function() { +- throw new Test262Error("Should not get other values"); +- } +- }); +- +- assert.throws(TypeError, function() { +- sample.set(obj); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1d514622089f6f57845fb272ff9bb9cbbbd99572 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-no-throw.js +@@ -0,0 +1,36 @@ ++// Copyright (C) 2022 the V8 project authors. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++/*--- ++esid: sec-%typedarray%.prototype.set-array-offset ++description: > ++ Does not throw if target TA is detached mid-iteration ++includes: [testTypedArray.js, detachArrayBuffer.js] ++features: [TypedArray] ++---*/ ++ ++testWithTypedArrayConstructors(function(TA) { ++ var sample = new TA([1, 2, 3]); ++ var obj = { ++ length: 3, ++ "0": 42 ++ }; ++ Object.defineProperty(obj, 1, { ++ get: function() { ++ $DETACHBUFFER(sample.buffer); ++ } ++ }); ++ let get2Called = false; ++ Object.defineProperty(obj, 2, { ++ get: function() { ++ get2Called = true; ++ return 2; ++ } ++ }); ++ ++ sample.set(obj); ++ ++ assert.sameValue(true, get2Called); ++ assert.sameValue(0, sample.byteLength); ++ assert.sameValue(0, sample.byteOffset); ++ assert.sameValue(0, sample.length); ++}); +diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-throws.js b/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-throws.js +deleted file mode 100644 +index eed7db0831ad2dc1539d4aea853604e1f41b4c26..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArray/prototype/set/array-arg-targetbuffer-detached-on-get-src-value-throws.js ++++ /dev/null +@@ -1,45 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-%typedarray%.prototype.set-array-offset +-description: > +- Throws an error if buffer is detached before setting a value +-info: | +- 22.2.3.23.1 %TypedArray%.prototype.set (array [ , offset ] ) +- +- 1. Assert: array is any ECMAScript language value other than an Object with a +- [[TypedArrayName]] internal slot. If it is such an Object, the definition in +- 22.2.3.23.2 applies. +- ... +- 21. Repeat, while targetByteIndex < limit +- a. Let Pk be ! ToString(k). +- b. Let kNumber be ? ToNumber(? Get(src, Pk)). +- c. If IsDetachedBuffer(targetBuffer) is true, throw a TypeError exception. +- d. Perform SetValueInBuffer(targetBuffer, targetByteIndex, targetType, +- kNumber). +- ... +-includes: [testTypedArray.js, detachArrayBuffer.js] +-features: [TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = new TA([1, 2, 3]); +- var obj = { +- length: 3, +- "0": 42 +- }; +- Object.defineProperty(obj, 1, { +- get: function() { +- $DETACHBUFFER(sample.buffer); +- } +- }); +- Object.defineProperty(obj, 2, { +- get: function() { +- throw new Test262Error("Should not get other values"); +- } +- }); +- +- assert.throws(TypeError, function() { +- sample.set(obj); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer-comparefn.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer-comparefn.js +deleted file mode 100644 +index caa7f80a28a81620adfd8eebdb3a7ef5ffd5edd0..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/BigInt/detached-buffer-comparefn.js ++++ /dev/null +@@ -1,38 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-%typedarray%.prototype.sort +-description: Throws a TypeError if comparefn detaches the object buffer +-info: | +- 22.2.3.26 %TypedArray%.prototype.sort ( comparefn ) +- +- When the TypedArray SortCompare abstract operation is called with two +- arguments x and y, the following steps are taken: +- +- ... +- 2. If the argument comparefn is not undefined, then +- a. Let v be ? Call(comparefn, undefined, « x, y »). +- b. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. +- ... +- ... +-includes: [testBigIntTypedArray.js, detachArrayBuffer.js] +-features: [BigInt, TypedArray] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = new TA(4); +- var calls = 0; +- var comparefn = function() { +- if (calls > 0) { +- throw new Test262Error(); +- } +- calls++; +- $DETACHBUFFER(sample.buffer); +- }; +- +- assert.throws(TypeError, function() { +- sample.sort(comparefn); +- }); +- +- assert.sameValue(calls, 1); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn-coerce.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn-coerce.js +deleted file mode 100644 +index 6e2be4cafda7d5784b6bd1ab8ca3a796ee803f61..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn-coerce.js ++++ /dev/null +@@ -1,44 +0,0 @@ +-// Copyright (C) 2020 Google. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-%typedarray%.prototype.sort +-description: > +- SECURITY Throws a TypeError if coercion of the comparefn return value +- detaches the object buffer +-info: | +- 22.2.3.26 %TypedArray%.prototype.sort ( comparefn ) +- +- When the TypedArray SortCompare abstract operation is called with two +- arguments x and y, the following steps are taken: +- +- ... +- 2. If the argument comparefn is not undefined, then +- a. Let v be ? ToNumber(? Call(comparefn, undefined, « x, y »)). +- b. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. +- ... +- ... +-includes: [testTypedArray.js, detachArrayBuffer.js] +-features: [TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = new TA(4); +- var calls = 0; +- var convertfn = function(){ +- $DETACHBUFFER(sample.buffer); +- return 1; +- } +- var comparefn = function() { +- if (calls > 0) { +- throw new Test262Error(); +- } +- calls++; +- return {valueOf : convertfn} +- }; +- +- assert.throws(TypeError, function() { +- sample.sort(comparefn); +- }, "Coercion that detaches buffer should throw TypeError"); +- +- assert.sameValue(calls, 1); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn.js +deleted file mode 100644 +index 6ff08beb603b8acd794da05778f2ab661c693c4b..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/detached-buffer-comparefn.js ++++ /dev/null +@@ -1,38 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-%typedarray%.prototype.sort +-description: Throws a TypeError if comparefn detaches the object buffer +-info: | +- 22.2.3.26 %TypedArray%.prototype.sort ( comparefn ) +- +- When the TypedArray SortCompare abstract operation is called with two +- arguments x and y, the following steps are taken: +- +- ... +- 2. If the argument comparefn is not undefined, then +- a. Let v be ? Call(comparefn, undefined, « x, y »). +- b. If IsDetachedBuffer(buffer) is true, throw a TypeError exception. +- ... +- ... +-includes: [testTypedArray.js, detachArrayBuffer.js] +-features: [TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = new TA(4); +- var calls = 0; +- var comparefn = function() { +- if (calls > 0) { +- throw new Test262Error(); +- } +- calls++; +- $DETACHBUFFER(sample.buffer); +- }; +- +- assert.throws(TypeError, function() { +- sample.sort(comparefn); +- }); +- +- assert.sameValue(calls, 1); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sort-tonumber.js b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sort-tonumber.js +index 627ed55ecdf6e7d47be819a26f68a87bd3f8758d..36d8457e9806c3e578651f5879af359b056879c6 100644 +--- a/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sort-tonumber.js ++++ b/JSTests/test262/test/built-ins/TypedArray/prototype/sort/sort-tonumber.js +@@ -21,16 +21,12 @@ testWithTypedArrayConstructors(function(TA) { + var ab = ta.buffer; + + var called = false; +- assert.throws(TypeError, function() { +- ta.sort(function(a, b) { +- // IsDetachedBuffer is checked right after calling comparefn. +- // So, detach the ArrayBuffer to cause sort to throw, to make sure we're actually calling ToNumber immediately (as spec'd) +- // (a possible bug is to wait until the result is inspected to call ToNumber, rather than immediately) +- $DETACHBUFFER(ab); +- return { +- [Symbol.toPrimitive]() { called = true; } +- }; +- }); ++ ta.sort(function(a, b) { ++ // Detaching the buffer does not cause sort to throw. ++ $DETACHBUFFER(ab); ++ return { ++ [Symbol.toPrimitive]() { called = true; } ++ }; + }); + + assert.sameValue(true, called); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-different-type.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-different-type.js +deleted file mode 100644 +index 4b914e6d2ef62dbee573d49ee5b3674c35088623..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-different-type.js ++++ /dev/null +@@ -1,61 +0,0 @@ +-// Copyright (C) 2017 André Bargull. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +- +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- When a TypedArray is created from another TypedArray with a different element-type +- and SpeciesConstructor detaches the source buffer, AllocateArrayBuffer is still +- executed. +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- ... +- 16. If IsSharedArrayBuffer(srcData) is false, then +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- 18. If SameValue(elementType, srcType) is true, then +- ... +- 19. Else, +- a. Let data be ? AllocateArrayBuffer(bufferConstructor, byteLength). +- b. If IsDetachedBuffer(srcData) is true, throw a TypeError exception. +- ... +- +- 24.1.1.1 AllocateArrayBuffer ( constructor, byteLength ) +- +- 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%ArrayBufferPrototype%", +- « [[ArrayBufferData]], [[ArrayBufferByteLength]] »). +- ... +-includes: [testBigIntTypedArray.js, detachArrayBuffer.js] +-features: [BigInt, TypedArray, Symbol.species] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var speciesCallCount = 0; +- var bufferConstructor = Object.defineProperty({}, Symbol.species, { +- get: function() { +- speciesCallCount += 1; +- $DETACHBUFFER(ta.buffer); +- return speciesConstructor; +- } +- }); +- +- var prototypeCallCount = 0; +- var speciesConstructor = Object.defineProperty(function(){}.bind(), "prototype", { +- get: function() { +- prototypeCallCount += 1; +- return null; +- } +- }); +- +- var ta = new TA(0); +- ta.buffer.constructor = bufferConstructor; +- +- assert.throws(TypeError, function() { +- var targetType = TA !== BigInt64Array ? BigInt64Array : BigUint64Array; +- new targetType(ta); +- }, "TypeError thrown for detached source buffer"); +- +- assert.sameValue(speciesCallCount, 1, "@@species getter called once"); +- assert.sameValue(prototypeCallCount, 1, "prototype getter called once"); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-same-type.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-same-type.js +deleted file mode 100644 +index c4f45c49c7cb2be064b0ce06e89fd0ded4b1faa5..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/detached-when-species-retrieved-same-type.js ++++ /dev/null +@@ -1,64 +0,0 @@ +-// Copyright (C) 2017 André Bargull. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +- +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- When a TypedArray is created from another TypedArray with the same element-type +- and SpeciesConstructor detaches the source buffer, AllocateArrayBuffer is still +- executed. +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- ... +- 16. If IsSharedArrayBuffer(srcData) is false, then +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- 18. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset, byteLength, bufferConstructor). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset, srcLength, cloneConstructor ) +- +- ... +- 3. Let targetBuffer be ? AllocateArrayBuffer(cloneConstructor, srcLength). +- 4. If IsDetachedBuffer(srcBuffer) is true, throw a TypeError exception. +- ... +- +- 24.1.1.1 AllocateArrayBuffer ( constructor, byteLength ) +- +- 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%ArrayBufferPrototype%", +- « [[ArrayBufferData]], [[ArrayBufferByteLength]] »). +- ... +-includes: [testBigIntTypedArray.js, detachArrayBuffer.js] +-features: [BigInt, TypedArray, Symbol.species] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var speciesCallCount = 0; +- var bufferConstructor = Object.defineProperty({}, Symbol.species, { +- get: function() { +- speciesCallCount += 1; +- $DETACHBUFFER(ta.buffer); +- return speciesConstructor; +- } +- }); +- +- var prototypeCallCount = 0; +- var speciesConstructor = Object.defineProperty(function(){}.bind(), "prototype", { +- get: function() { +- prototypeCallCount += 1; +- return null; +- } +- }); +- +- var ta = new TA(0); +- ta.buffer.constructor = bufferConstructor; +- +- assert.throws(TypeError, function() { +- new TA(ta); +- }, "TypeError thrown for detached source buffer"); +- +- assert.sameValue(speciesCallCount, 1, "@@species getter called once"); +- assert.sameValue(prototypeCallCount, 1, "prototype getter called once"); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-access-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-access-throws.js +deleted file mode 100644 +index 3882f1c78e8619b508a46b5b3b70aed348b51dd9..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-access-throws.js ++++ /dev/null +@@ -1,41 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt completion from getting typedArray argument's buffer.constructor +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 2. Let C be ? Get(O, "constructor"). +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, TypedArray] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var OtherCtor = TA === BigInt64Array ? BigUint64Array : BigInt64Array; +- var sample = new OtherCtor(); +- +- Object.defineProperty(sample.buffer, "constructor", { +- get() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js +deleted file mode 100644 +index 5a5d7ee0ab7f42abca9675a0bbccf66648334a29..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js ++++ /dev/null +@@ -1,58 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Derive the ArrayBuffer prototype from the realm of the species constructor +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- b. Let data be ? AllocateArrayBuffer(bufferConstructor, byteLength). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +- 9.1.14 GetPrototypeFromConstructor +- +- ... +- 3. Let proto be ? Get(constructor, "prototype"). +- 4. If Type(proto) is not Object, then +- a. Let realm be ? GetFunctionRealm(constructor). +- b. Let proto be realm's intrinsic object named intrinsicDefaultProto. +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, cross-realm, Symbol.species, TypedArray] +----*/ +- +-var sample1 = new BigInt64Array(); +-var sample2 = new BigUint64Array(); +-var other = $262.createRealm().global; +-var C = new other.Function(); +-C.prototype = null; +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = TA === BigInt64Array ? sample2 : sample1; +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = C; +- +- var typedArray = new TA(sample); +- assert.sameValue( +- Object.getPrototypeOf(typedArray.buffer), other.ArrayBuffer.prototype +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species.js +deleted file mode 100644 +index 1ff1e5db5335c52b7377cebf23013b0d64600526..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-custom-species.js ++++ /dev/null +@@ -1,52 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Use default ArrayBuffer constructor on undefined buffer.constructor.@@species +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- b. Let data be ? AllocateArrayBuffer(bufferConstructor, byteLength). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +-includes: [testBigIntTypedArray.js] +-features: [BigInt, Symbol.species, TypedArray] +----*/ +- +-var sample1 = new BigInt64Array(); +-var sample2 = new BigUint64Array(); +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = TA === BigInt64Array ? sample2 : sample1; +- var ctor = {}; +- var called = 0; +- var custom = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = function() { +- called++; +- }; +- +- ctor[Symbol.species].prototype = custom; +- +- var typedArray = new TA(sample); +- assert.sameValue(Object.getPrototypeOf(typedArray.buffer), custom); +- assert.sameValue(called, 0); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js +deleted file mode 100644 +index 44b76c2b95ef160f3d142ead12171483b2f43da8..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js ++++ /dev/null +@@ -1,61 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt completion from typedArray argument's buffer.constructor's value +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 2. Let C be ? Get(O, "constructor"). +- ... +- 4. If Type(C) is not Object, throw a TypeError exception. +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, Symbol, TypedArray] +----*/ +- +-var sample1 = new BigInt64Array(); +-var sample2 = new BigUint64Array(); +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = TA === BigInt64Array ? sample2 : sample1; +- +- sample.buffer.constructor = 1; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = true; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = ""; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = null; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- var s = Symbol("1"); +- sample.buffer.constructor = s; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js +deleted file mode 100644 +index 8b3933eedb5be662a98fa54b38b91066b3d3ddd7..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js ++++ /dev/null +@@ -1,45 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from getting typedArray argument's buffer.constructor.@@species +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, Symbol.species, TypedArray] +----*/ +- +-var sample1 = new BigInt64Array(); +-var sample2 = new BigUint64Array(); +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = TA === BigInt64Array ? sample2 : sample1; +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- Object.defineProperty(ctor, Symbol.species, { +- get: function() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js +deleted file mode 100644 +index 09a8068e9f27d27392411b6a0a697a6fe072034b..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js ++++ /dev/null +@@ -1,47 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from buffer.constructor.@@species.prototype +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- 8. Throw a TypeError exception. +-includes: [testBigIntTypedArray.js] +-features: [BigInt, Symbol.species, TypedArray] +----*/ +- +-var sample1 = new BigInt64Array(); +-var sample2 = new BigUint64Array(); +- +-var ctor = function() { +- throw new Test262Error(); +-}; +-var m = { m() {} }.m; +-ctor[Symbol.species] = m; +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = TA === BigInt64Array ? sample2 : sample1; +- +- sample.buffer.constructor = ctor; +- +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js +deleted file mode 100644 +index 705b8a7319ce8edce1db87f7d2943e5140dcd653..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js ++++ /dev/null +@@ -1,59 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from buffer.constructor.@@species.prototype +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- b. Let data be ? AllocateArrayBuffer(bufferConstructor, byteLength). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +- 24.1.1.1 AllocateArrayBuffer ( constructor, byteLength ) +- +- ... +- 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, +- "%ArrayBufferPrototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]] » ) +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, Symbol.species, TypedArray] +----*/ +- +-var sample1 = new BigInt64Array(); +-var sample2 = new BigUint64Array(); +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = TA === BigInt64Array ? sample2 : sample1; +- var ctor = {}; +- var called = 0; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = function() {called++;}.bind(null); +- Object.defineProperty(ctor[Symbol.species], "prototype", { +- get: function() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +- assert.sameValue(called, 0); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-access-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-access-throws.js +deleted file mode 100644 +index 51fa9a8358f43252ca1a045f3ab90e6e9ab884a9..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-access-throws.js ++++ /dev/null +@@ -1,46 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt completion from getting typedArray argument's buffer.constructor +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 2. Let C be ? Get(O, "constructor"). +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, TypedArray] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- Object.defineProperty(sample.buffer, "constructor", { +- get: function() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js +deleted file mode 100644 +index 90de96428058656899fc9d6d4c421f4e202deede..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js ++++ /dev/null +@@ -1,68 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Derive the ArrayBuffer prototype from the realm of the species constructor +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 8. Let targetBuffer be ? AllocateArrayBuffer(cloneConstructor, cloneLength). +- ... +- +- 9.1.14 GetPrototypeFromConstructor +- +- ... +- 3. Let proto be ? Get(constructor, "prototype"). +- 4. If Type(proto) is not Object, then +- a. Let realm be ? GetFunctionRealm(constructor). +- b. Let proto be realm's intrinsic object named intrinsicDefaultProto. +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, cross-realm, Symbol.species, TypedArray] +----*/ +- +-var other = $262.createRealm().global; +-var C = new other.Function(); +-C.prototype = null; +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = C; +- +- var typedArray = new TA(sample); +- assert.sameValue( +- Object.getPrototypeOf(typedArray.buffer), other.ArrayBuffer.prototype +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom.js +deleted file mode 100644 +index 743b03e3f4bf0f15161cf3203deb828c5b56f8ec..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-custom.js ++++ /dev/null +@@ -1,60 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Use default ArrayBuffer constructor on undefined buffer.constructor.@@species +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 8. Let targetBuffer be ? AllocateArrayBuffer(cloneConstructor, cloneLength). +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, Symbol.species, TypedArray] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- var ctor = {}; +- var called = 0; +- var custom = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = function() { +- called++; +- }; +- +- ctor[Symbol.species].prototype = custom; +- +- var typedArray = new TA(sample); +- assert.sameValue(Object.getPrototypeOf(typedArray.buffer), custom); +- assert.sameValue(called, 0); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js +deleted file mode 100644 +index 32cbc01bc3f56012b55e7eedf5072c0812dccc15..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js ++++ /dev/null +@@ -1,49 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from buffer.constructor.@@species.prototype +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- 8. Throw a TypeError exception. +-includes: [testBigIntTypedArray.js] +-features: [BigInt, Symbol.species, TypedArray] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- var ctor = {}; +- var m = { m() {} }; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = m; +- +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js +deleted file mode 100644 +index 042d4213db8fdc19fbd107c051e8df82ceb5f905..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js ++++ /dev/null +@@ -1,62 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from buffer.constructor.@@species.prototype +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- 8. Let targetBuffer be ? AllocateArrayBuffer(cloneConstructor, cloneLength). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +- 24.1.1.1 AllocateArrayBuffer ( constructor, byteLength ) +- +- ... +- 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, +- "%ArrayBufferPrototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]] » ) +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, Symbol.species, TypedArray] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = function(){}.bind(null); +- Object.defineProperty(ctor[Symbol.species], "prototype", { +- get() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-throws.js +deleted file mode 100644 +index 0aa7517b802ccfa46c3a2d8e58a384462b23aa76..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-species-throws.js ++++ /dev/null +@@ -1,49 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from getting typedArray argument's buffer.constructor.@@species +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, Symbol.species, TypedArray] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- Object.defineProperty(ctor, Symbol.species, { +- get() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js +deleted file mode 100644 +index a3ca9a041b395955d5f126fec9617804a459da7b..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors-bigint/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js ++++ /dev/null +@@ -1,65 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt completion from typedArray argument's buffer.constructor's value +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 2. Let C be ? Get(O, "constructor"). +- ... +- 4. If Type(C) is not Object, throw a TypeError exception. +- ... +-includes: [testBigIntTypedArray.js] +-features: [BigInt, Symbol, TypedArray] +----*/ +- +-testWithBigIntTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- +- sample.buffer.constructor = 1; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = true; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = ''; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = null; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- var s = Symbol('1'); +- sample.buffer.constructor = s; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/no-species.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/no-species.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d288115bf438534b6229d7f60780fa738b027e70 +--- /dev/null ++++ b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/no-species.js +@@ -0,0 +1,30 @@ ++// Copyright (C) 2022 the V8 project authors. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++description: > ++ Creating TypedArray from other TypedArrays doesn't look up Symbol.species. ++features: [TypedArray, ArrayBuffer, Symbol.species] ++---*/ ++ ++let throwOnGrossBufferConstruction = false; ++ ++class GrossBuffer extends ArrayBuffer { ++ constructor() { ++ super(...arguments); ++ if (throwOnGrossBufferConstruction) { ++ throw new Test262Error("unreachable"); ++ } ++ } ++ static get [Symbol.species]() { ++ throw new Test262Error("unreachable"); ++ } ++} ++ ++let grossBuf = new GrossBuffer(1024); ++throwOnGrossBufferConstruction = true; ++let grossTA = new Uint8Array(grossBuf); ++let mysteryTA = new Int8Array(grossTA); ++ ++assert.sameValue(mysteryTA.buffer.__proto__, ArrayBuffer.prototype); ++assert.sameValue(mysteryTA.buffer.constructor, ArrayBuffer); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-different-type.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-different-type.js +deleted file mode 100644 +index 8ee2fba54bc195dcafe393b24bc22652e86493ce..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-different-type.js ++++ /dev/null +@@ -1,61 +0,0 @@ +-// Copyright (C) 2017 André Bargull. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +- +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- When a TypedArray is created from another TypedArray with a different element-type +- and SpeciesConstructor detaches the source buffer, AllocateArrayBuffer is still +- executed. +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- ... +- 16. If IsSharedArrayBuffer(srcData) is false, then +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- 18. If SameValue(elementType, srcType) is true, then +- ... +- 19. Else, +- a. Let data be ? AllocateArrayBuffer(bufferConstructor, byteLength). +- b. If IsDetachedBuffer(srcData) is true, throw a TypeError exception. +- ... +- +- 24.1.1.1 AllocateArrayBuffer ( constructor, byteLength ) +- +- 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%ArrayBufferPrototype%", +- « [[ArrayBufferData]], [[ArrayBufferByteLength]] »). +- ... +-includes: [testTypedArray.js, detachArrayBuffer.js] +-features: [TypedArray, Symbol.species] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var speciesCallCount = 0; +- var bufferConstructor = Object.defineProperty({}, Symbol.species, { +- get: function() { +- speciesCallCount += 1; +- $DETACHBUFFER(ta.buffer); +- return speciesConstructor; +- } +- }); +- +- var prototypeCallCount = 0; +- var speciesConstructor = Object.defineProperty(function(){}.bind(), "prototype", { +- get: function() { +- prototypeCallCount += 1; +- return null; +- } +- }); +- +- var ta = new TA(0); +- ta.buffer.constructor = bufferConstructor; +- +- assert.throws(TypeError, function() { +- var targetType = TA !== Int32Array ? Int32Array : Uint32Array; +- new targetType(ta); +- }, "TypeError thrown for detached source buffer"); +- +- assert.sameValue(speciesCallCount, 1, "@@species getter called once"); +- assert.sameValue(prototypeCallCount, 1, "prototype getter called once"); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-same-type.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-same-type.js +deleted file mode 100644 +index 978f42af64be0e5e280840bfa0670894f2af8ac3..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/detached-when-species-retrieved-same-type.js ++++ /dev/null +@@ -1,64 +0,0 @@ +-// Copyright (C) 2017 André Bargull. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +- +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- When a TypedArray is created from another TypedArray with the same element-type +- and SpeciesConstructor detaches the source buffer, AllocateArrayBuffer is still +- executed. +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- ... +- 16. If IsSharedArrayBuffer(srcData) is false, then +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- 18. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset, byteLength, bufferConstructor). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset, srcLength, cloneConstructor ) +- +- ... +- 3. Let targetBuffer be ? AllocateArrayBuffer(cloneConstructor, srcLength). +- 4. If IsDetachedBuffer(srcBuffer) is true, throw a TypeError exception. +- ... +- +- 24.1.1.1 AllocateArrayBuffer ( constructor, byteLength ) +- +- 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, "%ArrayBufferPrototype%", +- « [[ArrayBufferData]], [[ArrayBufferByteLength]] »). +- ... +-includes: [testTypedArray.js, detachArrayBuffer.js] +-features: [TypedArray, Symbol.species] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var speciesCallCount = 0; +- var bufferConstructor = Object.defineProperty({}, Symbol.species, { +- get: function() { +- speciesCallCount += 1; +- $DETACHBUFFER(ta.buffer); +- return speciesConstructor; +- } +- }); +- +- var prototypeCallCount = 0; +- var speciesConstructor = Object.defineProperty(function(){}.bind(), "prototype", { +- get: function() { +- prototypeCallCount += 1; +- return null; +- } +- }); +- +- var ta = new TA(0); +- ta.buffer.constructor = bufferConstructor; +- +- assert.throws(TypeError, function() { +- new TA(ta); +- }, "TypeError thrown for detached source buffer"); +- +- assert.sameValue(speciesCallCount, 1, "@@species getter called once"); +- assert.sameValue(prototypeCallCount, 1, "prototype getter called once"); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-access-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-access-throws.js +deleted file mode 100644 +index b8976d696deb2a81e7088ab95f18df9051e0ddbd..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-access-throws.js ++++ /dev/null +@@ -1,41 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt completion from getting typedArray argument's buffer.constructor +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 2. Let C be ? Get(O, "constructor"). +- ... +-includes: [testTypedArray.js] +-features: [TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var OtherCtor = TA === Int8Array ? Int16Array : Int8Array; +- var sample = new OtherCtor(); +- +- Object.defineProperty(sample.buffer, "constructor", { +- get() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js +deleted file mode 100644 +index 03860d1a7beddceefabebbfcf81fe9a63724c5d8..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species-proto-from-ctor-realm.js ++++ /dev/null +@@ -1,59 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Derive the ArrayBuffer prototype from the realm of the species constructor +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- b. Let data be ? AllocateArrayBuffer(bufferConstructor, byteLength). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +- 9.1.14 GetPrototypeFromConstructor +- +- ... +- 3. Let proto be ? Get(constructor, "prototype"). +- 4. If Type(proto) is not Object, then +- a. Let realm be ? GetFunctionRealm(constructor). +- b. Let proto be realm's intrinsic object named intrinsicDefaultProto. +- ... +-includes: [testTypedArray.js] +-features: [cross-realm, Symbol.species, TypedArray] +----*/ +- +-var sample1 = new Int8Array(); +-var sample2 = new Int16Array(); +-var other = $262.createRealm().global; +-var C = new other.Function(); +-C.prototype = null; +- +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = TA === Int8Array ? sample2 : sample1; +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = C; +- +- var typedArray = new TA(sample); +- assert.sameValue( +- Object.getPrototypeOf(typedArray.buffer), other.ArrayBuffer.prototype +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species.js +deleted file mode 100644 +index a510d7806da4ec10db4e586606b5f19d185fa126..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-custom-species.js ++++ /dev/null +@@ -1,52 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Use default ArrayBuffer constructor on undefined buffer.constructor.@@species +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- b. Let data be ? AllocateArrayBuffer(bufferConstructor, byteLength). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +-includes: [testTypedArray.js] +-features: [Symbol.species, TypedArray] +----*/ +- +-var sample1 = new Int8Array(); +-var sample2 = new Int16Array(); +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = TA === Int8Array ? sample2 : sample1; +- var ctor = {}; +- var called = 0; +- var custom = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = function() { +- called++; +- }; +- +- ctor[Symbol.species].prototype = custom; +- +- var typedArray = new TA(sample); +- assert.sameValue(Object.getPrototypeOf(typedArray.buffer), custom); +- assert.sameValue(called, 0); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js +deleted file mode 100644 +index cfb79f1a948549ca4a4b8e3c16f0a48089e113a7..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-not-object-throws.js ++++ /dev/null +@@ -1,61 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt completion from typedArray argument's buffer.constructor's value +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 2. Let C be ? Get(O, "constructor"). +- ... +- 4. If Type(C) is not Object, throw a TypeError exception. +- ... +-includes: [testTypedArray.js] +-features: [Symbol, TypedArray] +----*/ +- +-var sample1 = new Int8Array(); +-var sample2 = new Int16Array(); +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = TA === Int8Array ? sample2 : sample1; +- +- sample.buffer.constructor = 1; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = true; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = ""; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = null; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- var s = Symbol("1"); +- sample.buffer.constructor = s; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js +deleted file mode 100644 +index 4b0b19aca73f95e929866d0c514659d388574426..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-access-throws.js ++++ /dev/null +@@ -1,45 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from getting typedArray argument's buffer.constructor.@@species +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- ... +-includes: [testTypedArray.js] +-features: [Symbol.species, TypedArray] +----*/ +- +-var sample1 = new Int8Array(); +-var sample2 = new Int16Array(); +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = TA === Int8Array ? sample2 : sample1; +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- Object.defineProperty(ctor, Symbol.species, { +- get: function() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js +deleted file mode 100644 +index c485cae138f684c86bd68ad1b41c6ba92b7b794c..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-not-ctor-throws.js ++++ /dev/null +@@ -1,47 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from buffer.constructor.@@species.prototype +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- 8. Throw a TypeError exception. +-includes: [testTypedArray.js] +-features: [Symbol.species, TypedArray] +----*/ +- +-var sample1 = new Int8Array(); +-var sample2 = new Int16Array(); +- +-var ctor = function() { +- throw new Test262Error(); +-}; +-var m = { m() {} }.m; +-ctor[Symbol.species] = m; +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = TA === Int8Array ? sample2 : sample1; +- +- sample.buffer.constructor = ctor; +- +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-null.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-null.js +deleted file mode 100644 +index 96ba9009d66d0bdfc172bcb9d0d6b316a0161fb1..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-null.js ++++ /dev/null +@@ -1,44 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Use default ArrayBuffer constructor on null buffer.constructor.@@species +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- ... +-includes: [testTypedArray.js] +-features: [Symbol.species, TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var OtherCtor = TA === Int8Array ? Int16Array : Int8Array; +- var sample = new OtherCtor(); +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = null; +- var typedArray = new TA(sample); +- +- assert.sameValue( +- Object.getPrototypeOf(typedArray.buffer), +- ArrayBuffer.prototype, +- "buffer ctor is not called when species is null" +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js +deleted file mode 100644 +index 135634646b491497da941db744062d5879665e88..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-prototype-throws.js ++++ /dev/null +@@ -1,59 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from buffer.constructor.@@species.prototype +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- b. Let data be ? AllocateArrayBuffer(bufferConstructor, byteLength). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +- 24.1.1.1 AllocateArrayBuffer ( constructor, byteLength ) +- +- ... +- 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, +- "%ArrayBufferPrototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]] » ) +- ... +-includes: [testTypedArray.js] +-features: [Symbol.species, TypedArray] +----*/ +- +-var sample1 = new Int8Array(); +-var sample2 = new Int16Array(); +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = TA === Int8Array ? sample2 : sample1; +- var ctor = {}; +- var called = 0; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = function() {called++;}.bind(null); +- Object.defineProperty(ctor[Symbol.species], "prototype", { +- get: function() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +- assert.sameValue(called, 0); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-undefined.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-undefined.js +deleted file mode 100644 +index 32e78a37dcd0da8c07eac359d386106ceb76ad27..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/other-ctor-buffer-ctor-species-undefined.js ++++ /dev/null +@@ -1,43 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Use default ArrayBuffer constructor on undefined buffer.constructor.@@species +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 18. Else, +- a. Let bufferConstructor be ? SpeciesConstructor(srcData, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- ... +-includes: [testTypedArray.js] +-features: [Symbol.species, TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var OtherCtor = TA === Int8Array ? Int16Array : Int8Array; +- var sample = new OtherCtor(); +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = undefined; +- var a = new TA(sample); +- assert.sameValue( +- Object.getPrototypeOf(a.buffer), +- ArrayBuffer.prototype, +- "buffer ctor is not called when species is undefined" +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-different-type.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-different-type.js +deleted file mode 100644 +index 0aba12fc80f27ada3675dac21062a419f8ec99f1..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-different-type.js ++++ /dev/null +@@ -1,89 +0,0 @@ +-// 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-typedarray-typedarray +-description: > +- Error when a TypedArray is created from another TypedArray with a different +- element-type and SpeciesConstructor causes the "source" array to go +- out-of-bounds. +-includes: [testTypedArray.js, compareArray.js] +-features: [TypedArray, Symbol.species, resizable-arraybuffer] +----*/ +- +-// If the host chooses to throw as allowed by the specification, the observed +-// behavior will be identical to the case where `ArrayBuffer.prototype.resize` +-// has not been implemented. The following assertion prevents this test from +-// passing in runtimes which have not implemented the method. +-assert.sameValue(typeof ArrayBuffer.prototype.resize, 'function'); +- +-testWithTypedArrayConstructors(function(TA) { +- var BPE = TA.BYTES_PER_ELEMENT; +- var TargetCtor = TA !== Int32Array ? Int32Array : Uint32Array; +- var ab = new ArrayBuffer(BPE * 4, {maxByteLength: BPE * 5}); +- var speciesConstructor = Object.defineProperty(function(){}.bind(), 'prototype', { +- get: function() { +- return null; +- } +- }); +- var onGetSpecies; +- ab.constructor = Object.defineProperty({}, Symbol.species, { +- get: function() { +- onGetSpecies(); +- return speciesConstructor; +- } +- }); +- var source = new TA(ab, BPE); +- var expected = [10, 20, 30]; +- +- source[0] = 10; +- source[1] = 20; +- source[2] = 30; +- +- onGetSpecies = function() { +- try { +- ab.resize(BPE * 5); +- expected = [10, 20, 30, 0]; +- } catch (_) {} +- }; +- +- assert(compareArray(new TargetCtor(source), expected), 'following grow'); +- +- onGetSpecies = function() { +- try { +- ab.resize(BPE * 3); +- expected = [10, 20]; +- } catch (_) {} +- }; +- +- assert(compareArray(new TargetCtor(source), expected), 'following shrink (within bounds)'); +- +- onGetSpecies = function() { +- try { +- ab.resize(BPE); +- expected = []; +- } catch (_) {} +- }; +- +- assert(compareArray(new TargetCtor(source), expected), 'following shrink (on boundary)'); +- +- // `assert.throws` cannot be used in this case because the expected error +- // is derived only after the constructor is invoked. +- var expectedError; +- var actualError; +- onGetSpecies = function() { +- try { +- ab.resize(0); +- expectedError = TypeError; +- } catch (_) { +- expectedError = Test262Error; +- } +- }; +- try { +- new TargetCtor(source); +- throw new Test262Error('the operation completed successfully'); +- } catch (caught) { +- actualError = caught; +- } +- +- assert.sameValue(actualError.constructor, expectedError); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-same-type.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-same-type.js +deleted file mode 100644 +index c633ba0696227091bdb1c02e25ef8a70b3e94257..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/out-of-bounds-when-species-retrieved-same-type.js ++++ /dev/null +@@ -1,89 +0,0 @@ +-// 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-typedarray-typedarray +-description: > +- Error when a TypedArray is created from another TypedArray with the same +- element-type and SpeciesConstructor causes the "source" array to go +- out-of-bounds. +-includes: [testTypedArray.js, compareArray.js] +-features: [TypedArray, Symbol.species, resizable-arraybuffer] +----*/ +- +-// If the host chooses to throw as allowed by the specification, the observed +-// behavior will be identical to the case where `ArrayBuffer.prototype.resize` +-// has not been implemented. The following assertion prevents this test from +-// passing in runtimes which have not implemented the method. +-assert.sameValue(typeof ArrayBuffer.prototype.resize, 'function'); +- +-testWithTypedArrayConstructors(function(TA) { +- var BPE = TA.BYTES_PER_ELEMENT; +- var ab = new ArrayBuffer(BPE * 4, {maxByteLength: BPE * 5}); +- var speciesConstructor = Object.defineProperty(function(){}.bind(), 'prototype', { +- get: function() { +- return null; +- } +- }); +- var onGetSpecies; +- ab.constructor = Object.defineProperty({}, Symbol.species, { +- get: function() { +- onGetSpecies(); +- return speciesConstructor; +- } +- }); +- var source = new TA(ab, BPE); +- var expected = [10, 20, 30]; +- +- source[0] = 10; +- source[1] = 20; +- source[2] = 30; +- +- onGetSpecies = function() { +- try { +- ab.resize(BPE * 5); +- expected = [10, 20, 30, 0]; +- } catch (_) {} +- }; +- +- assert.sameValue((new TA(source)).join(','), expected.join(',')); +- assert(compareArray(new TA(source), expected), 'following grow'); +- +- onGetSpecies = function() { +- try { +- ab.resize(BPE * 3); +- expected = [10, 20]; +- } catch (_) {} +- }; +- +- assert(compareArray(new TA(source), expected), 'following shrink (within bounds)'); +- +- onGetSpecies = function() { +- try { +- ab.resize(BPE); +- expected = []; +- } catch (_) {} +- }; +- +- assert(compareArray(new TA(source), expected), 'following shrink (on boundary)'); +- +- // `assert.throws` cannot be used in this case because the expected error +- // is derived only after the constructor is invoked. +- var expectedError; +- var actualError; +- onGetSpecies = function() { +- try { +- ab.resize(0); +- expectedError = TypeError; +- } catch (_) { +- expectedError = Test262Error; +- } +- }; +- try { +- new TA(source); +- throw new Test262Error('the operation completed successfully'); +- } catch (caught) { +- actualError = caught; +- } +- +- assert.sameValue(actualError.constructor, expectedError); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-access-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-access-throws.js +deleted file mode 100644 +index f8e75d20916914ded361d5451c7dcfc11d4bc6df..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-access-throws.js ++++ /dev/null +@@ -1,46 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt completion from getting typedArray argument's buffer.constructor +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 2. Let C be ? Get(O, "constructor"). +- ... +-includes: [testTypedArray.js] +-features: [TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- Object.defineProperty(sample.buffer, "constructor", { +- get: function() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js +deleted file mode 100644 +index 43743b956e742c63289ac819b000f7b596a7e54d..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom-proto-from-ctor-realm.js ++++ /dev/null +@@ -1,68 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Derive the ArrayBuffer prototype from the realm of the species constructor +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 8. Let targetBuffer be ? AllocateArrayBuffer(cloneConstructor, cloneLength). +- ... +- +- 9.1.14 GetPrototypeFromConstructor +- +- ... +- 3. Let proto be ? Get(constructor, "prototype"). +- 4. If Type(proto) is not Object, then +- a. Let realm be ? GetFunctionRealm(constructor). +- b. Let proto be realm's intrinsic object named intrinsicDefaultProto. +- ... +-includes: [testTypedArray.js] +-features: [cross-realm, Symbol.species, TypedArray] +----*/ +- +-var other = $262.createRealm().global; +-var C = new other.Function(); +-C.prototype = null; +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = C; +- +- var typedArray = new TA(sample); +- assert.sameValue( +- Object.getPrototypeOf(typedArray.buffer), other.ArrayBuffer.prototype +- ); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom.js +deleted file mode 100644 +index 7ed3aca0da1148beb44d30f6810c30d1863e53a1..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-custom.js ++++ /dev/null +@@ -1,60 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Use default ArrayBuffer constructor on undefined buffer.constructor.@@species +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 8. Let targetBuffer be ? AllocateArrayBuffer(cloneConstructor, cloneLength). +- ... +-includes: [testTypedArray.js] +-features: [Symbol.species, TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- var ctor = {}; +- var called = 0; +- var custom = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = function() { +- called++; +- }; +- +- ctor[Symbol.species].prototype = custom; +- +- var typedArray = new TA(sample); +- assert.sameValue(Object.getPrototypeOf(typedArray.buffer), custom); +- assert.sameValue(called, 0); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js +deleted file mode 100644 +index 2072aa96dd1a48530c622f0ebf8e5ab5cb8337fd..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-not-ctor.js ++++ /dev/null +@@ -1,49 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from buffer.constructor.@@species.prototype +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- 8. Throw a TypeError exception. +-includes: [testTypedArray.js] +-features: [Symbol.species, TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- var ctor = {}; +- var m = { m() {} }; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = m; +- +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js +deleted file mode 100644 +index b171826cfb1747d0c959669c36edc17026a72aa8..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js ++++ /dev/null +@@ -1,62 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from buffer.constructor.@@species.prototype +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- 8. Let targetBuffer be ? AllocateArrayBuffer(cloneConstructor, cloneLength). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- 6. If S is either undefined or null, return defaultConstructor. +- 7. If IsConstructor(S) is true, return S. +- ... +- +- 24.1.1.1 AllocateArrayBuffer ( constructor, byteLength ) +- +- ... +- 1. Let obj be ? OrdinaryCreateFromConstructor(constructor, +- "%ArrayBufferPrototype%", « [[ArrayBufferData]], [[ArrayBufferByteLength]] » ) +- ... +-includes: [testTypedArray.js] +-features: [Symbol.species, TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- +- ctor[Symbol.species] = function(){}.bind(null); +- Object.defineProperty(ctor[Symbol.species], "prototype", { +- get() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-throws.js +deleted file mode 100644 +index ec2aaf3c1f5250a5461b0bc5f773d365b8a17b53..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-species-throws.js ++++ /dev/null +@@ -1,49 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt from getting typedArray argument's buffer.constructor.@@species +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 5. Let S be ? Get(C, @@species). +- ... +-includes: [testTypedArray.js] +-features: [Symbol.species, TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- var ctor = {}; +- +- sample.buffer.constructor = ctor; +- Object.defineProperty(ctor, Symbol.species, { +- get() { +- throw new Test262Error(); +- } +- }); +- +- assert.throws(Test262Error, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js b/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js +deleted file mode 100644 +index ef97097495cf3dd666749f28a05791138ecfa8d4..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/built-ins/TypedArrayConstructors/ctors/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js ++++ /dev/null +@@ -1,65 +0,0 @@ +-// Copyright (C) 2016 the V8 project authors. All rights reserved. +-// This code is governed by the BSD license found in the LICENSE file. +-/*--- +-esid: sec-typedarray-typedarray +-description: > +- Return abrupt completion from typedArray argument's buffer.constructor's value +-info: | +- 22.2.4.3 TypedArray ( typedArray ) +- +- This description applies only if the TypedArray function is called with at +- least one argument and the Type of the first argument is Object and that +- object has a [[TypedArrayName]] internal slot. +- +- ... +- 17. If SameValue(elementType, srcType) is true, then +- a. Let data be ? CloneArrayBuffer(srcData, srcByteOffset). +- ... +- +- 24.1.1.4 CloneArrayBuffer ( srcBuffer, srcByteOffset [ , cloneConstructor ] ) +- +- ... +- 2. If cloneConstructor is not present, then +- a. Let cloneConstructor be ? SpeciesConstructor(srcBuffer, %ArrayBuffer%). +- ... +- +- 7.3.20 SpeciesConstructor ( O, defaultConstructor ) +- +- ... +- 2. Let C be ? Get(O, "constructor"). +- ... +- 4. If Type(C) is not Object, throw a TypeError exception. +- ... +-includes: [testTypedArray.js] +-features: [Symbol, TypedArray] +----*/ +- +-testWithTypedArrayConstructors(function(TA) { +- var sample = new TA(); +- +- sample.buffer.constructor = 1; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = true; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = ''; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- sample.buffer.constructor = null; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +- +- var s = Symbol('1'); +- sample.buffer.constructor = s; +- assert.throws(TypeError, function() { +- new TA(sample); +- }); +-}); +diff --git a/JSTests/test262/test/built-ins/parseInt/15.1.2.2-2-1.js b/JSTests/test262/test/built-ins/parseInt/15.1.2.2-2-1.js +index 4dc1dc6001f91f402a43e606e81477022cf19cc1..0a9eb648a4576c4b646624c530069185de9b1891 100644 +--- a/JSTests/test262/test/built-ins/parseInt/15.1.2.2-2-1.js ++++ b/JSTests/test262/test/built-ins/parseInt/15.1.2.2-2-1.js +@@ -4,7 +4,7 @@ + /*--- + esid: sec-parseint-string-radix + description: > +- pareseInt - 'S' is the empty string when inputString does not ++ parseInt - 'S' is the empty string when inputString does not + contain any such characters + ---*/ + +diff --git a/JSTests/test262/test/harness/temporalHelpers-one-shift-time-zone.js b/JSTests/test262/test/harness/temporalHelpers-one-shift-time-zone.js +new file mode 100644 +index 0000000000000000000000000000000000000000..db4e4102d0aeccf83d009344fc10ba114fdf374c +--- /dev/null ++++ b/JSTests/test262/test/harness/temporalHelpers-one-shift-time-zone.js +@@ -0,0 +1,80 @@ ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++description: > ++ Verify the time zone arithmetic used in TemporalHelpers.oneShiftTimeZone() ++ against known cases in the implementation's time zone database ++includes: [compareArray.js, temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++function checkTimeZoneArithmetic(shiftInstant, shiftNs, realTimeZoneName, shiftWallTime) { ++ // No need to test this on hosts that don't provide an Intl object. It's ++ // sufficient that the logic is tested on at least one host. ++ if (typeof globalThis.Intl === "undefined") ++ return; ++ ++ const tz = TemporalHelpers.oneShiftTimeZone(shiftInstant, shiftNs); ++ const realTz = new Temporal.TimeZone(realTimeZoneName); ++ ++ assert.sameValue( ++ tz.getOffsetNanosecondsFor(shiftInstant), ++ realTz.getOffsetNanosecondsFor(shiftInstant), ++ 'offset at shift instant' ++ ); ++ const minus1 = shiftInstant.subtract({ hours: 1 }); ++ assert.sameValue( ++ tz.getOffsetNanosecondsFor(minus1), ++ realTz.getOffsetNanosecondsFor(minus1), ++ 'offset at 1 hour before shift' ++ ); ++ const plus1 = shiftInstant.add({ hours: 1 }); ++ assert.sameValue( ++ tz.getOffsetNanosecondsFor(plus1), ++ realTz.getOffsetNanosecondsFor(plus1), ++ 'offset at 1 hour after shift' ++ ); ++ ++ assert.compareArray( ++ tz.getPossibleInstantsFor(shiftWallTime).map((i) => i.epochNanoseconds), ++ realTz.getPossibleInstantsFor(shiftWallTime).map((i) => i.epochNanoseconds), ++ 'possible instants for wall time' ++ ); ++ const before1 = shiftWallTime.subtract({ hours: 1 }); ++ assert.compareArray( ++ tz.getPossibleInstantsFor(before1).map((i) => i.epochNanoseconds), ++ realTz.getPossibleInstantsFor(before1).map((i) => i.epochNanoseconds), ++ 'possible instants for 1 hour before wall time' ++ ); ++ const after1 = shiftWallTime.add({ hours: 1 }); ++ assert.compareArray( ++ tz.getPossibleInstantsFor(after1).map((i) => i.epochNanoseconds), ++ realTz.getPossibleInstantsFor(after1).map((i) => i.epochNanoseconds), ++ 'possible instants for 1 hour after wall time' ++ ); ++} ++ ++// Check a positive DST shift from +00:00 to +01:00 ++checkTimeZoneArithmetic( ++ new Temporal.Instant(1616893200000000000n), ++ 3600e9, ++ 'Europe/London', ++ new Temporal.PlainDateTime(2021, 3, 28, 1) ++); ++ ++// Check a negative DST shift from +00:00 to -01:00 ++checkTimeZoneArithmetic( ++ new Temporal.Instant(1635642000000000000n), ++ -3600e9, ++ 'Atlantic/Azores', ++ new Temporal.PlainDateTime(2021, 10, 31, 1) ++); ++ ++// Check the no-shift case ++checkTimeZoneArithmetic( ++ new Temporal.Instant(0n), ++ 0, ++ 'UTC', ++ new Temporal.PlainDateTime(1970, 1, 1) ++); +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-locales-invalid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-locales-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8c50a2f3d36af25e0c101bd7ecc25b79f44f75ca +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-locales-invalid.js +@@ -0,0 +1,17 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Checks error cases for the locales argument to the DurationFormat constructor. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 3. Let _requestedLocales_ be ? CanonicalizeLocaleList(_locales_). ++includes: [testIntl.js] ++features: [Intl.DurationFormat] ++---*/ ++ ++for (const [locales, expectedError] of getInvalidLocaleArguments()) { ++ assert.throws(expectedError, function() { new Intl.DurationFormat(locales) }) ++} +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-locales-valid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-locales-valid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..5687373bec687d3088946aa7de35aa0171a42336 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-locales-valid.js +@@ -0,0 +1,34 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Checks cases for the locales argument to the DurationFormat constructor. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 3. Let _requestedLocales_ be ? CanonicalizeLocaleList(_locales_). ++features: [Intl.DurationFormat] ++---*/ ++ ++const defaultLocale = new Intl.DurationFormat().resolvedOptions().locale; ++ ++const matchers = ["lookup", "best fit"] ++ ++const tests = [ ++ [undefined, defaultLocale, "undefined"], ++ ["EN", "en", "Single value"], ++ [[], defaultLocale, "Empty array"], ++ [["en", "EN"], "en", "Duplicate value (canonical first)"], ++ [["EN", "en"], "en", "Duplicate value (canonical last)"], ++ [{ 0: "DE", length: 0 }, defaultLocale, "Object with zero length"], ++ [{ 0: "DE", length: 1 }, "de", "Object with length"], ++]; ++ ++ ++for (const [locales, expected, name] of tests) { ++ matchers.forEach((matcher)=>{ ++ const drf = new Intl.DurationFormat(locales, {localeMatcher: matcher}); ++ assert.sameValue(drf.resolvedOptions().locale, expected, name); ++ }); ++}; +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-defaults.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-defaults.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a4d62c2dbdbf5809a0dfa627cf628333f9b76cef +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-defaults.js +@@ -0,0 +1,32 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Checks handling of valid options for the DurationFormat constructor. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 17. For each row in Table 1, except the header row, in table order, do ++ a. Let styleSlot be the Style Slot value. ++ b. Let displaySlot be the Display Slot value. ++ c. Let unit be the Unit value. ++ d. Let valueList be the Values value. ++ e. Let digitalBase be the Digital Default value. ++ f. Let unitOptions be ? GetUnitOptions(unit, options, style, valueList, digitalBase, prevStyle). ++ g. Set durationFormat.[[]] to unitOptions.[[Style]]. ++ h. Set durationFormat.[[]] to unitOptions.[[Display]]. ++features: [Intl.DurationFormat] ++includes: [testIntl.js] ++---*/ ++ ++testOption( Intl.DurationFormat, "years", "string", ["long", "short", "narrow"], "narrow"); ++testOption( Intl.DurationFormat, "months", "string", ["long", "short", "narrow"], "narrow"); ++testOption( Intl.DurationFormat, "weeks", "string", ["long", "short", "narrow"], "narrow"); ++testOption( Intl.DurationFormat, "days", "string", ["long", "short", "narrow", "numeric", "2-digit"], "numeric"); ++testOption( Intl.DurationFormat, "hours", "string", ["long", "short", "narrow", "numeric", "2-digit"], "numeric"); ++testOption( Intl.DurationFormat, "minutes", "string", ["long", "short", "narrow", "numeric", "2-digit"], "numeric"); ++testOption( Intl.DurationFormat, "milliseconds", "string", ["long", "short", "narrow", "numeric", "2-digit"], "numeric"); ++testOption( Intl.DurationFormat, "microseconds", "string", ["long", "short", "narrow", "numeric", "2-digit"], "numeric"); ++testOption( Intl.DurationFormat, "nanoseconds", "string", ["long", "short", "narrow", "numeric", "2-digit"], "numeric"); ++ +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-fractionalDigits-invalid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-fractionalDigits-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e2439143a0f1642abf87154e2765327bc7c87dfb +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-fractionalDigits-invalid.js +@@ -0,0 +1,23 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Tests that the option localeMatcher is processed correctly. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 18. Set durationFormat.[[FractionalDigits]] to ? GetNumberOption(options, "fractionalDigits", 0, 9, undefined). ++features: [Intl.DurationFormat] ++---*/ ++ ++const invalidOptions = [ ++ -10, ++ 10 ++]; ++ ++for (const fractionalDigits of invalidOptions) { ++ assert.throws(RangeError, function() { ++ new Intl.DurationFormat("en", { fractionalDigits }); ++ }, `new Intl.DurationFormat("en", {fractionalDigits: "${fractionalDigits}"}) throws RangeError`); ++} +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-fractionalDigits-valid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-fractionalDigits-valid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8a505978c216c009ac66385c180d423903634019 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-fractionalDigits-valid.js +@@ -0,0 +1,25 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Tests that the option localeMatcher is processed correctly. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 18. Set durationFormat.[[FractionalDigits]] to ? GetNumberOption(options, "fractionalDigits", 0, 9, undefined). ++features: [Intl.DurationFormat] ++---*/ ++ ++const validOptions = [ ++ undefined, ++ 0, ++ 1, ++ 5, ++ 9 ++]; ++ ++for (const fractionalDigits of validOptions) { ++ const obj = new Intl.DurationFormat("en", {fractionalDigits}); ++ assert.sameValue(obj.resolvedOptions().fractionalDigits, fractionalDigits, `${fractionalDigits} is supported by DurationFormat`); ++} +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-invalid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..072cee07fb9a6fcba773f012d794f227bf93624e +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-invalid.js +@@ -0,0 +1,16 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Checks handling of a null options argument to the DurationFormat constructor. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 4. Let options be GetOptionsObject(options). ++features: [Intl.DurationFormat] ++---*/ ++ ++assert.sameValue(typeof Intl.DurationFormat, "function"); ++ ++assert.throws(TypeError, function() { new Intl.DurationFormat([], null) }) +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-localeMatcher-invalid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-localeMatcher-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..125cbb40924c175267472c3ae372325e16d622f6 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-localeMatcher-invalid.js +@@ -0,0 +1,30 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Checks handling of invalid value for the localeMatcher option to the DurationFormat constructor. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 5. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). ++features: [Intl.DurationFormat] ++---*/ ++ ++const invalidOptions = [ ++ null, ++ 1, ++ "", ++ "Lookup", ++ "LOOKUP", ++ "lookup\0", ++ "Best fit", ++ "BEST FIT", ++ "best\u00a0fit", ++]; ++ ++for (const localeMatcher of invalidOptions) { ++ assert.throws(RangeError, function() { ++ new Intl.DurationFormat([], { localeMatcher }); ++ }, `${localeMatcher} is an invalid localeMatcher option value`); ++} +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-localeMatcher-valid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-localeMatcher-valid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b8758084f26176053ce952579b8cb18f5d11fb21 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-localeMatcher-valid.js +@@ -0,0 +1,15 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Tests that the option localeMatcher is processed correctly. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 5. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). ++features: [Intl.DurationFormat] ++includes: [testIntl.js] ++---*/ ++ ++testOption(Intl.DurationFormat, "localeMatcher", "string", ["lookup", "best fit"], "best fit", {noReturn: true}); +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-numberingSystem-invalid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-numberingSystem-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6dfe98eb6f2681b45a8f82291194e3feb430aaa7 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-numberingSystem-invalid.js +@@ -0,0 +1,36 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: > ++ Checks error cases for the options argument to the DurationFormat constructor. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 6. Let numberingSystem be ? GetOption(options, "numberingSystem", "string", undefined, undefined). ++ 7. If numberingSystem does not match the Unicode Locale Identifier type nonterminal, throw a RangeError exception. ++features: [Intl.DurationFormat] ++---*/ ++ ++const invalidOptions = [ ++ "", ++ "a", ++ "ab", ++ "abcdefghi", ++ "abc-abcdefghi", ++ "!invalid!", ++ "-latn-", ++ "latn-", ++ "latn--", ++ "latn-ca", ++ "latn-ca-", ++ "latn-ca-gregory", ++ "latné", ++ "latn编号", ++]; ++for (const numberingSystem of invalidOptions) { ++ assert.throws(RangeError, function() { ++ new Intl.DurationFormat('en', {numberingSystem}); ++ }, `new Intl.DurationFormat("en", {numberingSystem: "${numberingSystem}"}) throws RangeError`); ++} +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-numberingSystem-valid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-numberingSystem-valid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fc50592554007d29a4439502cb91159e095f6d8a +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-numberingSystem-valid.js +@@ -0,0 +1,21 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: > ++ Checks error cases for the options argument to the DurationFormat constructor. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 6. Let numberingSystem be ? GetOption(options, "numberingSystem", "string", undefined, undefined). ++ 7. If numberingSystem does not match the Unicode Locale Identifier type nonterminal, throw a RangeError exception. ++features: [Intl.DurationFormat] ++---*/ ++ ++const numberingSystems = Intl.supportedValuesOf("numberingSystem"); ++ ++for (const numberingSystem of numberingSystems) { ++ const obj = new Intl.DurationFormat("en", {numberingSystem}); ++ assert.sameValue(obj.resolvedOptions().numberingSystem, numberingSystem, `${numberingSystem} is supported by DurationFormat`); ++} +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-order.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-order.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7f91288b31d91d426de142d2c890881be30501ea +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-order.js +@@ -0,0 +1,41 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Checks the order of operations on the options argument to the DurationFormat constructor. ++info: | ++ Intl.DurationFormat ( [ locales [ , options ] ] ) ++ (...) ++ 5. Let matcher be ? GetOption(options, "localeMatcher", "string", « "lookup", "best fit" », "best fit"). ++ 6. Let numberingSystem be ? GetOption(options, "numberingSystem", "string", undefined, undefined). ++ 13. Let style be ? GetOption(options, "style", "string", « "long", "short", "narrow", "digital" », "long"). ++includes: [compareArray.js] ++features: [Intl.DurationFormat] ++---*/ ++ ++var actual = []; ++ ++const options = { ++ get localeMatcher() { ++ actual.push("localeMatcher"); ++ return undefined; ++ }, ++ get numberingSystem() { ++ actual.push("numberingSystem"); ++ return undefined; ++ }, ++ get style() { ++ actual.push("style"); ++ return undefined; ++ }, ++}; ++ ++const expected = [ ++ "localeMatcher", ++ "numberingSystem", ++ "style" ++]; ++ ++let nf = new Intl.DurationFormat(undefined, options); ++assert.compareArray(actual, expected); +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-style-invalid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-style-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..bd660129f1775c49d256036f8dfadba689cf04a9 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-style-invalid.js +@@ -0,0 +1,37 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Checks handling of invalid value for the style option to the DurationFormat constructor. ++info: | ++ InitializeDurationFormat (DurationFormat, locales, options) ++ (...) ++ 13. Let style be ? GetOption(options, "style", "string", « "long", "short", "narrow", "digital" », "long"). ++ 14. Set durationFormat.[[Style]] to style. ++features: [Intl.DurationFormat] ++---*/ ++ ++const invalidOptions = [ ++ null, ++ 1, ++ "", ++ "Long", ++ "LONG", ++ "long\0", ++ "Short", ++ "SHORT", ++ "short\0", ++ "Narrow", ++ "NARROW", ++ "narrow\0", ++ "Digital", ++ "DIGITAL", ++ "digital\0", ++]; ++ ++for (const invalidOption of invalidOptions) { ++ assert.throws(RangeError, function() { ++ new Intl.DurationFormat([], {"style": invalidOption}); ++ }, `${invalidOption} is an invalid style option value`); ++} +diff --git a/JSTests/test262/test/intl402/DurationFormat/constructor-options-style-valid.js b/JSTests/test262/test/intl402/DurationFormat/constructor-options-style-valid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..464b59a2c63630fdb5ce422b801daa4be513cd09 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/constructor-options-style-valid.js +@@ -0,0 +1,31 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: Checks handling of valid values for the style option to the DurationFormat constructor. ++info: | ++ InitializeDurationFormat (DurationFormat, locales, options) ++ (...) ++ 13. Let style be ? GetOption(options, "style", "string", « "long", "short", "narrow", "digital" », "long"). ++ 14. Set durationFormat.[[Style]] to style. ++features: [Intl.DurationFormat] ++---*/ ++ ++const validOptions = [ ++ [undefined, "long"], ++ ["long", "long"], ++ ["short", "short"], ++ ["narrow", "narrow"], ++ ["digital", "digital"], ++ [{ toString() { return "short"; } }, "short"], ++ [{ toString() { return "long"; } }, "long"], ++ [{ toString() { return "narrow"; } }, "narrow"], ++ [{ toString() { return "digital"; } }, "digital"], ++]; ++ ++for (const [validOption, expected] of validOptions) { ++ const df = new Intl.DurationFormat([], {"style": validOption}); ++ const resolvedOptions = df.resolvedOptions(); ++ assert.sameValue(resolvedOptions.style, expected); ++} +diff --git a/JSTests/test262/test/intl402/DurationFormat/instance/extensibility.js b/JSTests/test262/test/intl402/DurationFormat/extensibility.js +similarity index 100% +rename from JSTests/test262/test/intl402/DurationFormat/instance/extensibility.js +rename to JSTests/test262/test/intl402/DurationFormat/extensibility.js +diff --git a/JSTests/test262/test/intl402/DurationFormat/instance/length.js b/JSTests/test262/test/intl402/DurationFormat/length.js +similarity index 100% +rename from JSTests/test262/test/intl402/DurationFormat/instance/length.js +rename to JSTests/test262/test/intl402/DurationFormat/length.js +diff --git a/JSTests/test262/test/intl402/DurationFormat/instance/name.js b/JSTests/test262/test/intl402/DurationFormat/name.js +similarity index 100% +rename from JSTests/test262/test/intl402/DurationFormat/instance/name.js +rename to JSTests/test262/test/intl402/DurationFormat/name.js +diff --git a/JSTests/test262/test/intl402/DurationFormat/newtarget-undefined.js b/JSTests/test262/test/intl402/DurationFormat/newtarget-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..59d4f2dba023546b18b9f7b123260f392bd816b1 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/newtarget-undefined.js +@@ -0,0 +1,27 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat ++description: > ++ Verifies the NewTarget check for Intl.DurationFormat. ++info: | ++ Intl.DurationFormat ([ locales [ , options ]]) ++ (...) ++ 1. If NewTarget is undefined, throw a TypeError exception. ++features: [Intl.DurationFormat] ++---*/ ++ ++assert.sameValue(typeof Intl.DurationFormat, "function"); ++ ++assert.throws(TypeError, function() { ++ Intl.DurationFormat(); ++}); ++ ++assert.throws(TypeError, function() { ++ Intl.DurationFormat("en"); ++}); ++ ++assert.throws(TypeError, function() { ++ Intl.DurationFormat("not-valid-tag"); ++}); +diff --git a/JSTests/test262/test/intl402/DurationFormat/instance/prop-desc.js b/JSTests/test262/test/intl402/DurationFormat/prop-desc.js +similarity index 100% +rename from JSTests/test262/test/intl402/DurationFormat/instance/prop-desc.js +rename to JSTests/test262/test/intl402/DurationFormat/prop-desc.js +diff --git a/JSTests/test262/test/intl402/DurationFormat/instance/prototype.js b/JSTests/test262/test/intl402/DurationFormat/prototype.js +similarity index 100% +rename from JSTests/test262/test/intl402/DurationFormat/instance/prototype.js +rename to JSTests/test262/test/intl402/DurationFormat/prototype.js +diff --git a/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/basic.js b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/basic.js +new file mode 100644 +index 0000000000000000000000000000000000000000..0ed87ecd89e20323f07d3133b9c5b13f991bed3a +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/basic.js +@@ -0,0 +1,19 @@ ++// Copyright 2022 Igalia S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat.supportedLocalesOf ++description: Tests that Intl.DurationFormat has a supportedLocalesOf property, and it works as expected. ++features: [Intl.DurationFormat] ++---*/ ++ ++assert.sameValue(typeof Intl.DurationFormat.supportedLocalesOf, "function", ++ "supportedLocalesOf should be supported."); ++ ++const defaultLocale = new Intl.DurationFormat().resolvedOptions().locale; ++const notSupported = "zxx"; // "no linguistic content" ++const requestedLocales = [defaultLocale, notSupported]; ++ ++const supportedLocales = Intl.DurationFormat.supportedLocalesOf(requestedLocales); ++assert.sameValue(supportedLocales.length, 1, "The length of the supported locales list should be 1"); ++assert.sameValue(supportedLocales[0], defaultLocale, "The default locale is returned in the supported list."); +diff --git a/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/branding.js b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/branding.js +new file mode 100644 +index 0000000000000000000000000000000000000000..960b9584726e926ce52b23927332629fb14ea34c +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/branding.js +@@ -0,0 +1,32 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat.supportedLocalesOf ++description: > ++ Verifies there's no branding check for Intl.DurationFormat.supportedLocalesOf(). ++info: | ++ Intl.DurationFormat.supportedLocalesOf ( locales [, options ]) ++features: [Intl.DurationFormat] ++---*/ ++ ++const supportedLocalesOf = Intl.DurationFormat.supportedLocalesOf; ++ ++assert.sameValue(typeof supportedLocalesOf, "function"); ++ ++const thisValues = [ ++ undefined, ++ null, ++ true, ++ "", ++ Symbol(), ++ 1, ++ {}, ++ Intl.DurationFormat, ++ Intl.DurationFormat.prototype, ++]; ++ ++for (const thisValue of thisValues) { ++ const result = supportedLocalesOf.call(thisValue); ++ assert.sameValue(Array.isArray(result), true); ++} +diff --git a/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/length.js b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/length.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b0b50d466a16c48bdf71b2512f0289119f8b9f44 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/length.js +@@ -0,0 +1,22 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat.supportedLocalesOf ++description: > ++ Checks the "length" property of Intl.DurationFormat.supportedLocalesOf(). ++info: | ++ The value of the length property of the supportedLocalesOf method is 1. ++ Unless specified otherwise in this document, the objects, functions, and constructors described in this standard are subject to the generic requirements and restrictions specified for standard built-in ECMAScript objects in the ECMAScript 2019 Language Specification, 10th edition, clause 17, or successor. ++ Every built-in function object, including constructors, has a length property whose value is an integer. ++ Unless otherwise specified, the length property of a built-in function object has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. ++includes: [propertyHelper.js] ++features: [Intl.DurationFormat] ++---*/ ++ ++verifyProperty(Intl.DurationFormat.supportedLocalesOf, "length", { ++ value: 1, ++ writable: false, ++ enumerable: false, ++ configurable: true, ++}); +diff --git a/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/locales-empty.js b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/locales-empty.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d1c4c3d427d02bfe14d6e2e8178ca7f778125285 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/locales-empty.js +@@ -0,0 +1,19 @@ ++// Copyright 2022 Igalia S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat.supportedLocalesOf ++description: Checks handling of an empty locales argument to the supportedLocalesOf function. ++info: | ++ Intl.DurationFormat.supportedLocalesOf ( locales [, options ]) ++ (...) ++ 3. Return ? SupportedLocales(availableLocales, requestedLocales, options). ++includes: [compareArray.js] ++features: [Intl.DurationFormat] ++---*/ ++ ++assert.sameValue(typeof Intl.DurationFormat.supportedLocalesOf, "function", ++ "Should support Intl.DurationFormat.supportedLocalesOf."); ++ ++assert.compareArray(Intl.DurationFormat.supportedLocalesOf(), []); ++assert.compareArray(Intl.DurationFormat.supportedLocalesOf([]), []); +diff --git a/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/locales-invalid.js b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/locales-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..534545d99ecf76237a0f21acad381838faea3d00 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/locales-invalid.js +@@ -0,0 +1,20 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat.supportedLocalesOf ++description: Checks error cases for the locales argument to the supportedLocalesOf function. ++info: | ++ Intl.DurationFormat.supportedLocalesOf ( locales [, options ]) ++ (...) ++ 2. Let requestedLocales be CanonicalizeLocaleList(locales). ++includes: [testIntl.js] ++features: [Intl.DurationFormat] ++---*/ ++ ++assert.sameValue(typeof Intl.DurationFormat.supportedLocalesOf, "function", ++ "Should support Intl.DurationFormat.supportedLocalesOf."); ++ ++for (const [locales, expectedError] of getInvalidLocaleArguments()) { ++ assert.throws(expectedError, () => Intl.DurationFormat.supportedLocalesOf(locales)); ++} +diff --git a/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/locales-specific.js b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/locales-specific.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a9ab7be55b82d77db3888e31b46c08e6ba693fe0 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/locales-specific.js +@@ -0,0 +1,22 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat.supportedLocalesOf ++description: Checks handling of specific locales arguments to the supportedLocalesOf function. ++info: | ++ Intl.DurationFormat.supportedLocalesOf ( locales [, options ]) ++ (...) ++ 3. Return ? SupportedLocales(availableLocales, requestedLocales, options). ++includes: [compareArray.js] ++locale: [sr, sr-Thai-RS, de, zh-CN] ++features: [Intl.DurationFormat] ++---*/ ++ ++assert.sameValue(typeof Intl.DurationFormat.supportedLocalesOf, "function", ++ "Should support Intl.DurationFormat.supportedLocalesOf."); ++ ++assert.compareArray(Intl.DurationFormat.supportedLocalesOf("sr"), ["sr"]); ++ ++const multiLocale = ["sr-Thai-RS", "de", "zh-CN"]; ++assert.compareArray(Intl.DurationFormat.supportedLocalesOf(multiLocale, {localeMatcher: "lookup"}), multiLocale); +diff --git a/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/name.js b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/name.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a2c8ed63398c2c1a2e18813f3ab8959d0f2138e6 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/name.js +@@ -0,0 +1,21 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat.supportedLocalesOf ++description: > ++ Checks the "name" property of Intl.DurationFormat.supportedLocalesOf(). ++info: | ++ Unless specified otherwise in this document, the objects, functions, and constructors described in this standard are subject to the generic requirements and restrictions specified for standard built-in ECMAScript objects in the ECMAScript 2019 Language Specification, 10th edition, clause 17, or successor. ++ Every built-in function object, including constructors, that is not identified as an anonymous function has a name property whose value is a String. Unless otherwise specified, this value is the name that is given to the function in this specification. ++ Unless otherwise specified, the name property of a built-in function object, if it exists, has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }. ++includes: [propertyHelper.js] ++features: [Intl.DurationFormat] ++---*/ ++ ++verifyProperty(Intl.DurationFormat.supportedLocalesOf, "name", { ++ value: "supportedLocalesOf", ++ writable: false, ++ enumerable: false, ++ configurable: true, ++}); +diff --git a/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/prop-desc.js b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/prop-desc.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8226a7a98424db6232b05bdb8280b26dca7b32c1 +--- /dev/null ++++ b/JSTests/test262/test/intl402/DurationFormat/supportedLocalesOf/prop-desc.js +@@ -0,0 +1,29 @@ ++// Copyright 2022 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-Intl.DurationFormat.supportedLocalesOf ++description: > ++ Checks the "supportedLocalesOf" property of the DurationFormat prototype object. ++info: | ++ Intl.DurationFormat.supportedLocalesOf ( locales [, options ]) ++ ++ Unless specified otherwise in this document, the objects, functions, and constructors described in this standard are subject to the generic requirements and restrictions specified for standard built-in ECMAScript objects in the ECMAScript 2019 Language Specification, 10th edition, clause 17, or successor. ++ ++ Every other data property described in clauses 18 through 26 and in Annex B.2 has the attributes { [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: true } unless otherwise specified. ++includes: [propertyHelper.js] ++features: [Intl.DurationFormat] ++---*/ ++ ++assert.sameValue( ++ typeof Intl.DurationFormat.supportedLocalesOf, ++ "function", ++ "typeof Intl.DurationFormat.supportedLocalesOf is function" ++); ++ ++verifyProperty(Intl.DurationFormat, "supportedLocalesOf", { ++ writable: true, ++ enumerable: false, ++ configurable: true, ++}); ++ +diff --git a/JSTests/test262/test/intl402/Intl/DateTimeFormat/prototype/formatRange/fails-on-distinct-temporal-types.js b/JSTests/test262/test/intl402/Intl/DateTimeFormat/prototype/formatRange/fails-on-distinct-temporal-types.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c3ec39df4c19f509b60dad1339725ecadc6ac39c +--- /dev/null ++++ b/JSTests/test262/test/intl402/Intl/DateTimeFormat/prototype/formatRange/fails-on-distinct-temporal-types.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. ++ ++/*--- ++esid: sec-intl.datetimeformat.prototype.formatRange ++description: formatRange fails if given arguments of different Temporal types ++features: [Temporal] ++---*/ ++ ++const us = new Intl.DateTimeFormat('en-US'); ++ ++const instances = { ++ date: new Date(1580527800000), ++ instant: new Temporal.Instant(0n), ++ plaindate: new Temporal.PlainDate(2000, 5, 2), ++ plaindatetime: new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321), ++ plainmonthday: new Temporal.PlainMonthDay(5, 2), ++ plaintime: new Temporal.PlainTime(13, 37), ++ plainyearmonth: new Temporal.PlainYearMonth(2019, 6), ++ zoneddatetime: new Temporal.ZonedDateTime(0n, 'America/Kentucky/Louisville') ++}; ++ ++Object.entries(instances).forEach(([typeName, instance]) => { ++ Object.entries(instances).forEach(([anotherTypeName, anotherInstance]) => { ++ if (typeName !== anotherTypeName) { ++ assert.throws( ++ TypeError, ++ () => { us.formatRange(instance, anotherInstance); }, ++ 'formatRange: bad arguments (' + typeName + ' and ' + anotherTypeName + ')' ++ ); ++ } ++ }); ++}); +diff --git a/JSTests/test262/test/intl402/Intl/DateTimeFormat/prototype/formatRangeToParts/fails-on-distinct-temporal-types.js b/JSTests/test262/test/intl402/Intl/DateTimeFormat/prototype/formatRangeToParts/fails-on-distinct-temporal-types.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4aeaea5c185169e247db6fc8719bda52dea5f65b +--- /dev/null ++++ b/JSTests/test262/test/intl402/Intl/DateTimeFormat/prototype/formatRangeToParts/fails-on-distinct-temporal-types.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. ++ ++/*--- ++esid: sec-intl.datetimeformat.prototype.formatRangeToParts ++description: formatRange fails if given arguments of different Temporal types ++features: [Temporal] ++---*/ ++ ++const us = new Intl.DateTimeFormat('en-US'); ++ ++const instances = { ++ date: new Date(1580527800000), ++ instant: new Temporal.Instant(0n), ++ plaindate: new Temporal.PlainDate(2000, 5, 2), ++ plaindatetime: new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321), ++ plainmonthday: new Temporal.PlainMonthDay(5, 2), ++ plaintime: new Temporal.PlainTime(13, 37), ++ plainyearmonth: new Temporal.PlainYearMonth(2019, 6), ++ zoneddatetime: new Temporal.ZonedDateTime(0n, 'America/Kentucky/Louisville') ++}; ++ ++Object.entries(instances).forEach(([typeName, instance]) => { ++ Object.entries(instances).forEach(([anotherTypeName, anotherInstance]) => { ++ if (typeName !== anotherTypeName) { ++ assert.throws( ++ TypeError, ++ () => { us.formatRangeToParts(instance, anotherInstance); }, ++ 'formatRange: bad arguments (' + typeName + ' and ' + anotherTypeName + ')' ++ ); ++ } ++ }); ++}); +diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js b/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js +index 1274a0daac770e613685c1ee65a6554461a43f71..e92266498e423be0cfeee27c02f3c25c5d714ab0 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js ++++ b/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement-invalid.js +@@ -1,4 +1,5 @@ + // Copyright 2021 the V8 project authors. All rights reserved. ++// Copyright (C) 2022 Igalia, S.L. All rights reserved. + // This code is governed by the BSD license found in the LICENSE file. + /*--- + esid: sec-initializenumberformat +@@ -26,14 +27,18 @@ assert.throws(RangeError, function() { + new Intl.NumberFormat([], {roundingIncrement: 5001}); + }, '5001'); + +-assert.throws(RangeError, function() { ++assert.throws(TypeError, function() { + new Intl.NumberFormat([], {roundingIncrement: 2, roundingPriority: 'morePrecision'}); + }, '2, roundingType is "morePrecision"'); + +-assert.throws(RangeError, function() { ++assert.throws(TypeError, function() { + new Intl.NumberFormat([], {roundingIncrement: 2, roundingPriority: 'lessPrecision'}); + }, '2, roundingType is "lessPrecision"'); + +-assert.throws(RangeError, function() { ++assert.throws(TypeError, function() { + new Intl.NumberFormat([], {roundingIncrement: 2, minimumSignificantDigits: 1}); + }, '2, roundingType is "significantDigits"'); ++ ++assert.throws(RangeError, function() { ++ new Intl.NumberFormat([], {roundingIncrement: 2, maximumFractionDigits:3 , minimumFractionDigits:2 }); ++}, '"maximumFractionDigits" is not equal to "minimumFractionDigits"'); +diff --git a/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement.js b/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement.js +index ed2637edac33c1604d6fec0f4818bc15b09db4d7..95a4bd5ce28440395f5e809b4f337cd6a94bbdd0 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement.js ++++ b/JSTests/test262/test/intl402/NumberFormat/constructor-roundingIncrement.js +@@ -39,7 +39,8 @@ for (const [value, expected] of values) { + get roundingIncrement() { + callOrder.push("roundingIncrement"); + return value; +- } ++ }, ++ minimumFractionDigits: 3 + }); + const resolvedOptions = nf.resolvedOptions(); + assert("roundingIncrement" in resolvedOptions, "has property for value " + value); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-max-min-fraction-significant-digits.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-max-min-fraction-significant-digits.js +new file mode 100644 +index 0000000000000000000000000000000000000000..dcbdeb8266e782b76c034373fdbf34c408c63520 +--- /dev/null ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-max-min-fraction-significant-digits.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-intl.numberformat.prototype.format ++description: Tests that the digits are determined correctly when specifying at same time «"minimumFractionDigits", "maximumFractionDigits", "minimumSignificantDigits", "maximumSignificantDigits"» ++features: [Intl.NumberFormat-v3] ++includes: [testIntl.js] ++---*/ ++ ++var locales = [new Intl.NumberFormat().resolvedOptions().locale, "ar", "de", "th", "ja"]; ++var numberingSystems = ["latn", "arab", "thai", "hanidec"]; ++ ++var nfTestMatrix = [ ++ // mnfd & mxfd > mnsd & mxsd ++ [{ useGrouping: false, minimumFractionDigits: 1, maximumFractionDigits: 4, minimumSignificantDigits: 1, maximumSignificantDigits: 2 }, { 1.23456: "1.2" }], ++ [{ useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 4, minimumSignificantDigits: 1, maximumSignificantDigits: 2 }, { 1.23456: "1.2" }], ++ // mnfd & mxfd ∩ mnsd & mxsd ++ [{ useGrouping: false, minimumFractionDigits: 2, maximumFractionDigits: 4, minimumSignificantDigits: 2, maximumSignificantDigits: 3 }, { 1.23456: "1.23" }], ++ // mnfd & mxfd < mnsd & mxsd ++ [{ useGrouping: false, minimumFractionDigits: 1, maximumFractionDigits: 2, minimumSignificantDigits: 1, maximumSignificantDigits: 4}, { 1.23456: "1.235" }], ++ [{ useGrouping: false, minimumFractionDigits: 1, maximumFractionDigits: 2, minimumSignificantDigits: 2, maximumSignificantDigits: 4}, { 1.23456: "1.235" }], ++]; ++ ++nfTestMatrix.forEach((nfTestValues)=>{ ++ testNumberFormat(locales, numberingSystems, ...nfTestValues) ++}) +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-10.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-10.js +index 5e1995a83d876ab046de9d3614c45d219540ddec..3958ec6c64f2997a373326bd165ed9c8484af65f 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-10.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-10.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 10, maximumFractionDigits: 2}, ++ {roundingIncrement: 10, maximumFractionDigits: 2, minimumFractionDigits: 2}, + { +- '1.100': '1.1', +- '1.125': '1.1', +- '1.150': '1.2', +- '1.175': '1.2', +- '1.200': '1.2', ++ '1.100': '1.10', ++ '1.125': '1.10', ++ '1.150': '1.20', ++ '1.175': '1.20', ++ '1.200': '1.20', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 10, maximumFractionDigits: 3}, ++ {roundingIncrement: 10, maximumFractionDigits: 3, minimumFractionDigits: 3}, + { +- '1.0100': '1.01', +- '1.0125': '1.01', +- '1.0150': '1.02', +- '1.0175': '1.02', +- '1.0200': '1.02', ++ '1.0100': '1.010', ++ '1.0125': '1.010', ++ '1.0150': '1.020', ++ '1.0175': '1.020', ++ '1.0200': '1.020', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-100.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-100.js +index 4cba468788b92716dab99aee893d8bb15a663391..9e5e699e13b4a1f374a1858bd088933ac662bd33 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-100.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-100.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 100, maximumFractionDigits: 3}, ++ {roundingIncrement: 100, maximumFractionDigits: 3, minimumFractionDigits: 3}, + { +- '1.100': '1.1', +- '1.125': '1.1', +- '1.150': '1.2', +- '1.175': '1.2', +- '1.200': '1.2', ++ '1.100': '1.100', ++ '1.125': '1.100', ++ '1.150': '1.200', ++ '1.175': '1.200', ++ '1.200': '1.200', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 100, maximumFractionDigits: 4}, ++ {roundingIncrement: 100, maximumFractionDigits: 4, minimumFractionDigits: 4}, + { +- '1.0100': '1.01', +- '1.0125': '1.01', +- '1.0150': '1.02', +- '1.0175': '1.02', +- '1.0200': '1.02', ++ '1.0100': '1.0100', ++ '1.0125': '1.0100', ++ '1.0150': '1.0200', ++ '1.0175': '1.0200', ++ '1.0200': '1.0200', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-1000.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-1000.js +index df30e5546bead4733e38b106b64fb595dfc81643..e7a013a1a8d3a1b6132aef636e1f4222e304f233 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-1000.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-1000.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 1000, maximumFractionDigits: 4}, ++ {roundingIncrement: 1000, maximumFractionDigits: 4, minimumFractionDigits: 4}, + { +- '1.100': '1.1', +- '1.125': '1.1', +- '1.150': '1.2', +- '1.175': '1.2', +- '1.200': '1.2', ++ '1.100': '1.1000', ++ '1.125': '1.1000', ++ '1.150': '1.2000', ++ '1.175': '1.2000', ++ '1.200': '1.2000', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 1000, maximumFractionDigits: 5}, ++ {roundingIncrement: 1000, maximumFractionDigits: 5, minimumFractionDigits: 5}, + { +- '1.0100': '1.01', +- '1.0125': '1.01', +- '1.0150': '1.02', +- '1.0175': '1.02', +- '1.0200': '1.02', ++ '1.0100': '1.01000', ++ '1.0125': '1.01000', ++ '1.0150': '1.02000', ++ '1.0175': '1.02000', ++ '1.0200': '1.02000', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2.js +index 3d208893c6de2ef83c75dbf899c5d904f4ab61ef..6ff2f1e9446c95d8ce8d2ee6c8c560b4f050555d 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2.js +@@ -15,7 +15,7 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 2, maximumFractionDigits: 1}, ++ {roundingIncrement: 2, maximumFractionDigits: 1, minimumFractionDigits: 1}, + { + '1.20': '1.2', + '1.25': '1.2', +@@ -28,7 +28,7 @@ testNumberFormat( + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 2, maximumFractionDigits: 2}, ++ {roundingIncrement: 2, maximumFractionDigits: 2, minimumFractionDigits: 2}, + { + '1.020': '1.02', + '1.025': '1.02', +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-20.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-20.js +index 3011904d153e009387ee50d6506ce6a1e3c7a408..b2e0c4943af13cc383c8c506926c489b4bff2440 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-20.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-20.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 20, maximumFractionDigits: 2}, ++ {roundingIncrement: 20, maximumFractionDigits: 2, minimumFractionDigits: 2}, + { +- '1.20': '1.2', +- '1.25': '1.2', +- '1.30': '1.4', +- '1.35': '1.4', +- '1.40': '1.4', ++ '1.20': '1.20', ++ '1.25': '1.20', ++ '1.30': '1.40', ++ '1.35': '1.40', ++ '1.40': '1.40', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 20, maximumFractionDigits: 3}, ++ {roundingIncrement: 20, maximumFractionDigits: 3, minimumFractionDigits: 3}, + { +- '1.020': '1.02', +- '1.025': '1.02', +- '1.030': '1.04', +- '1.035': '1.04', +- '1.040': '1.04', ++ '1.020': '1.020', ++ '1.025': '1.020', ++ '1.030': '1.040', ++ '1.035': '1.040', ++ '1.040': '1.040', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-200.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-200.js +index 08d5aa2e2cfd291ca6e20aa88fe2f76ad3ae2228..5fb3f2240e2a0c060143efac8cb27209355d31b8 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-200.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-200.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 200, maximumFractionDigits: 3}, ++ {roundingIncrement: 200, maximumFractionDigits: 3, minimumFractionDigits: 3}, + { +- '1.20': '1.2', +- '1.25': '1.2', +- '1.30': '1.4', +- '1.35': '1.4', +- '1.40': '1.4', ++ '1.20': '1.200', ++ '1.25': '1.200', ++ '1.30': '1.400', ++ '1.35': '1.400', ++ '1.40': '1.400', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 200, maximumFractionDigits: 4}, ++ {roundingIncrement: 200, maximumFractionDigits: 4, minimumFractionDigits: 4}, + { +- '1.020': '1.02', +- '1.025': '1.02', +- '1.030': '1.04', +- '1.035': '1.04', +- '1.040': '1.04', ++ '1.020': '1.0200', ++ '1.025': '1.0200', ++ '1.030': '1.0400', ++ '1.035': '1.0400', ++ '1.040': '1.0400', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2000.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2000.js +index 2ea562c2b09a60a31270a9683ebe7cbcf46eba25..7ead62f25f8f6ef4833d840e1d7f7f2dcbe1d7ef 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2000.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2000.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 2000, maximumFractionDigits: 4}, ++ {roundingIncrement: 2000, maximumFractionDigits: 4, minimumFractionDigits: 4}, + { +- '1.20': '1.2', +- '1.25': '1.2', +- '1.30': '1.4', +- '1.35': '1.4', +- '1.40': '1.4', ++ '1.20': '1.2000', ++ '1.25': '1.2000', ++ '1.30': '1.4000', ++ '1.35': '1.4000', ++ '1.40': '1.4000', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 2000, maximumFractionDigits: 5}, ++ {roundingIncrement: 2000, maximumFractionDigits: 5, minimumFractionDigits: 5}, + { +- '1.020': '1.02', +- '1.025': '1.02', +- '1.030': '1.04', +- '1.035': '1.04', +- '1.040': '1.04', ++ '1.020': '1.02000', ++ '1.025': '1.02000', ++ '1.030': '1.04000', ++ '1.035': '1.04000', ++ '1.040': '1.04000', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-25.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-25.js +index 607795d5229957d399e2f15504966da87ef4e3d4..5a89388b1cf82c8e6125ebd141f4702d342a1da1 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-25.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-25.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 25, maximumFractionDigits: 2, minimumFractionDigits: 1}, ++ {roundingIncrement: 25, maximumFractionDigits: 2, minimumFractionDigits: 2}, + { + '1.2500': '1.25', + '1.3125': '1.25', +- '1.3750': '1.5', +- '1.4375': '1.5', +- '1.5000': '1.5', ++ '1.3750': '1.50', ++ '1.4375': '1.50', ++ '1.5000': '1.50', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 25, maximumFractionDigits: 3}, ++ {roundingIncrement: 25, maximumFractionDigits: 3, minimumFractionDigits: 3}, + { + '1.02500': '1.025', + '1.03125': '1.025', +- '1.03750': '1.05', +- '1.04375': '1.05', +- '1.05000': '1.05', ++ '1.03750': '1.050', ++ '1.04375': '1.050', ++ '1.05000': '1.050', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-250.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-250.js +index 4843cad0bb4021ad92ca1d071e1acf1b7d68f6a0..4aa7fbb9c2dd932bd0958f0aa2c6bd99f37a38f6 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-250.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-250.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 250, maximumFractionDigits: 3, minimumFractionDigits: 1}, ++ {roundingIncrement: 250, maximumFractionDigits: 3, minimumFractionDigits: 3}, + { +- '1.2500': '1.25', +- '1.3125': '1.25', +- '1.3750': '1.5', +- '1.4375': '1.5', +- '1.5000': '1.5', ++ '1.2500': '1.250', ++ '1.3125': '1.250', ++ '1.3750': '1.500', ++ '1.4375': '1.500', ++ '1.5000': '1.500', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 250, maximumFractionDigits: 4}, ++ {roundingIncrement: 250, maximumFractionDigits: 4, minimumFractionDigits: 4}, + { +- '1.02500': '1.025', +- '1.03125': '1.025', +- '1.03750': '1.05', +- '1.04375': '1.05', +- '1.05000': '1.05', ++ '1.02500': '1.0250', ++ '1.03125': '1.0250', ++ '1.03750': '1.0500', ++ '1.04375': '1.0500', ++ '1.05000': '1.0500', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2500.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2500.js +index 57859bdb2b592602436d92eb38d6ee070259e01f..754a35321afe13e7bbd8a50a91ff59e23205a4a0 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2500.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-2500.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 2500, maximumFractionDigits: 4, minimumFractionDigits: 1}, ++ {roundingIncrement: 2500, maximumFractionDigits: 4, minimumFractionDigits: 4}, + { +- '1.2500': '1.25', +- '1.3125': '1.25', +- '1.3750': '1.5', +- '1.4375': '1.5', +- '1.5000': '1.5', ++ '1.2500': '1.2500', ++ '1.3125': '1.2500', ++ '1.3750': '1.5000', ++ '1.4375': '1.5000', ++ '1.5000': '1.5000', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 2500, maximumFractionDigits: 5}, ++ {roundingIncrement: 2500, maximumFractionDigits: 5, minimumFractionDigits: 5}, + { +- '1.02500': '1.025', +- '1.03125': '1.025', +- '1.03750': '1.05', +- '1.04375': '1.05', +- '1.05000': '1.05', ++ '1.02500': '1.02500', ++ '1.03125': '1.02500', ++ '1.03750': '1.05000', ++ '1.04375': '1.05000', ++ '1.05000': '1.05000', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-5.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-5.js +index 85d56cb415ffc4e5feb5433e1583f7f74d37fbd4..9fe2e0b1841089f756459ce9b0924b3e970e7a74 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-5.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-5.js +@@ -28,12 +28,12 @@ testNumberFormat( + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 5, maximumFractionDigits: 2}, ++ {roundingIncrement: 5, maximumFractionDigits: 2, minimumFractionDigits: 2}, + { + '1.0500': '1.05', + '1.0625': '1.05', +- '1.0750': '1.1', +- '1.0875': '1.1', +- '1.1000': '1.1', ++ '1.0750': '1.10', ++ '1.0875': '1.10', ++ '1.1000': '1.10', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-50.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-50.js +index e527372331459d7fc0397551e9334ab4fd1038d1..f7f5528f7b3b98abb2ad9c7050aaffeac105627d 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-50.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-50.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 50, maximumFractionDigits: 2, minimumFractionDigits: 1}, ++ {roundingIncrement: 50, maximumFractionDigits: 2, minimumFractionDigits: 2}, + { +- '1.500': '1.5', +- '1.625': '1.5', +- '1.750': '2.0', +- '1.875': '2.0', +- '2.000': '2.0', ++ '1.500': '1.50', ++ '1.625': '1.50', ++ '1.750': '2.00', ++ '1.875': '2.00', ++ '2.000': '2.00', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 50, maximumFractionDigits: 3}, ++ {roundingIncrement: 50, maximumFractionDigits: 3, minimumFractionDigits: 3}, + { +- '1.0500': '1.05', +- '1.0625': '1.05', +- '1.0750': '1.1', +- '1.0875': '1.1', +- '1.1000': '1.1', ++ '1.0500': '1.050', ++ '1.0625': '1.050', ++ '1.0750': '1.100', ++ '1.0875': '1.100', ++ '1.1000': '1.100', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-500.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-500.js +index 772cf1838d6d5d2f9ee5477e0af9f8873b25f067..6f0136d130eac5677fec097694246b97180dd634 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-500.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-500.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 500, maximumFractionDigits: 3, minimumFractionDigits: 1}, ++ {roundingIncrement: 500, maximumFractionDigits: 3, minimumFractionDigits: 3}, + { +- '1.500': '1.5', +- '1.625': '1.5', +- '1.750': '2.0', +- '1.875': '2.0', +- '2.000': '2.0', ++ '1.500': '1.500', ++ '1.625': '1.500', ++ '1.750': '2.000', ++ '1.875': '2.000', ++ '2.000': '2.000', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 500, maximumFractionDigits: 4}, ++ {roundingIncrement: 500, maximumFractionDigits: 4, minimumFractionDigits: 4}, + { +- '1.0500': '1.05', +- '1.0625': '1.05', +- '1.0750': '1.1', +- '1.0875': '1.1', +- '1.1000': '1.1', ++ '1.0500': '1.0500', ++ '1.0625': '1.0500', ++ '1.0750': '1.1000', ++ '1.0875': '1.1000', ++ '1.1000': '1.1000', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-5000.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-5000.js +index 1929658e028b1030354db5d84460950d45692495..e5d708347f56aa97a4e79de4f7452ebcdafe9bab 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-5000.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-increment-5000.js +@@ -15,25 +15,25 @@ var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 5000, maximumFractionDigits: 4, minimumFractionDigits: 1}, ++ {roundingIncrement: 5000, maximumFractionDigits: 4, minimumFractionDigits: 4}, + { +- '1.500': '1.5', +- '1.625': '1.5', +- '1.750': '2.0', +- '1.875': '2.0', +- '2.000': '2.0', ++ '1.500': '1.5000', ++ '1.625': '1.5000', ++ '1.750': '2.0000', ++ '1.875': '2.0000', ++ '2.000': '2.0000', + } + ); + + testNumberFormat( + locales, + numberingSystems, +- {roundingIncrement: 5000, maximumFractionDigits: 5}, ++ {roundingIncrement: 5000, maximumFractionDigits: 5, minimumFractionDigits: 5}, + { +- '1.0500': '1.05', +- '1.0625': '1.05', +- '1.0750': '1.1', +- '1.0875': '1.1', +- '1.1000': '1.1', ++ '1.0500': '1.05000', ++ '1.0625': '1.05000', ++ '1.0750': '1.10000', ++ '1.0875': '1.10000', ++ '1.1000': '1.10000', + } + ); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-priority-more-precision.js b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-priority-more-precision.js +index 91725349d0b3e9bd488c1b5753667852ecec2deb..356eafc84ffc83a0d55672b2e082197b9a5dbec9 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-priority-more-precision.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/format/format-rounding-priority-more-precision.js +@@ -14,15 +14,15 @@ var locales = [ + ]; + var numberingSystems = ['arab', 'latn', 'thai', 'hanidec']; + +-// minimumSignificantDigits is less precise ++// maximumSignificantDigits defaults to 21, beating maximumFractionDigits, which defaults to 3 + testNumberFormat( + locales, + numberingSystems, + {useGrouping: false, roundingPriority: 'morePrecision', minimumSignificantDigits: 2, minimumFractionDigits: 2}, +- {'1': '1.00'} ++ {'1': '1.0'} + ); + +-// minimumSignificantDigits is more precise ++// maximumSignificantDigits defaults to 21, beating maximumFractionDigits, which defaults to 3 + testNumberFormat( + locales, + numberingSystems, +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/formatRange/x-greater-than-y-throws.js b/JSTests/test262/test/intl402/NumberFormat/prototype/formatRange/x-greater-than-y-throws.js +index 9b192d4bd352b2d5736fd7e46b9eed4b0939f24f..45ccd67d84cfafac2bfb7625464c2c74d7261e76 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/formatRange/x-greater-than-y-throws.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/formatRange/x-greater-than-y-throws.js +@@ -18,7 +18,7 @@ info: | + (...) + 1.1.21_4.a if y is a mathematical value and y < 0, throw a RangeError exception. + 1.1.21_4.b if y is -∞, throw a RangeError exception. +- features: [Intl.NumberFormat-v3] ++features: [Intl.NumberFormat-v3] + ---*/ + + const nf = new Intl.NumberFormat(); +diff --git a/JSTests/test262/test/intl402/NumberFormat/prototype/formatRangeToParts/x-greater-than-y-throws.js b/JSTests/test262/test/intl402/NumberFormat/prototype/formatRangeToParts/x-greater-than-y-throws.js +index 719f1bee00468f04222f27c51badae92e3e7fcc4..ab264b92e6df2d0347acdc7501d79ded62ea0f52 100644 +--- a/JSTests/test262/test/intl402/NumberFormat/prototype/formatRangeToParts/x-greater-than-y-throws.js ++++ b/JSTests/test262/test/intl402/NumberFormat/prototype/formatRangeToParts/x-greater-than-y-throws.js +@@ -18,7 +18,7 @@ info: | + (...) + 1.1.21_4.a if y is a mathematical value and y < 0, throw a RangeError exception. + 1.1.21_4.b if y is -∞, throw a RangeError exception. +- features: [Intl.NumberFormat-v3] ++features: [Intl.NumberFormat-v3] + ---*/ + + const nf = new Intl.NumberFormat(); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-number.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1fde733db504a56a0776c95b87064bdb4628a702 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.era ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.era(arg); ++assert.sameValue(result, undefined, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.era(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..645159e7472e649ff19d2f2928d6c01e22eeb65d +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.era ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.era(arg); ++assert.sameValue( ++ result1, ++ undefined, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.era(arg); ++assert.sameValue( ++ result2, ++ undefined, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-number.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e355b70e95185e3228a6554d476788b4a6ab6e19 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.era ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.era(arg); ++assert.sameValue(result1, undefined, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.era(arg); ++assert.sameValue(result2, undefined, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.era(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.era(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ef916fc9c61ee8a17b8e889c02dbe0087073ac2b +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.era ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.era(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.era(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.era(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.era(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.era(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ccdbfd47285525776f7d7b8c1634d1f3d74f9e4f +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.era ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.era(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-string-invalid.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b7a6b5c0bc1e8b9df25de13031ba9b6c2855c38e +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.era ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.era(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-wrong-type.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..209579e27cd8dd9a0670352fe165940f75db4224 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.era ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.era(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.era(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..eb1e61d9b19fe4b381b56f3bb3f482a2f5a9ade5 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.era ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.era({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/leap-second.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..42cb42f55aac9f709f9963070ab48bd461eff678 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.era ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.era(arg); ++assert.sameValue( ++ result1, ++ undefined, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.era(arg); ++assert.sameValue( ++ result2, ++ undefined, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/year-zero.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/year-zero.js +index ed3d5134f74cb03bf586581deca29bb995470d7e..a9230724b7e7b1a43ce9e5707469539dbe36b37a 100644 +--- a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/year-zero.js ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/era/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.era(arg); }, ++ () => instance.era(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-number.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..9cecd5ed35a62c8382ad7d19cc56b80f43f88d55 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-number.js +@@ -0,0 +1,29 @@ ++// 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.calendar.prototype.erayear ++description: A number is converted to a string, then to Temporal.PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const arg = 19761118; ++ ++const result = instance.eraYear(arg); ++assert.sameValue(result, undefined, "19761118 is a valid ISO string for PlainDate"); ++ ++const numbers = [ ++ 1, ++ -19761118, ++ 1234567890, ++]; ++ ++for (const arg of numbers) { ++ assert.throws( ++ RangeError, ++ () => instance.eraYear(arg), ++ `Number ${arg} does not convert to a valid ISO string for PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-leap-second.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1a2e15215b8c1de4b94fcc77eaf9e9972c50421d +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-leap-second.js +@@ -0,0 +1,28 @@ ++// 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.calendar.prototype.erayear ++description: Leap second is a valid ISO string for a calendar in a property bag ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = "2016-12-31T23:59:60"; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.eraYear(arg); ++assert.sameValue( ++ result1, ++ undefined, ++ "leap second is a valid ISO string for calendar" ++); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.eraYear(arg); ++assert.sameValue( ++ result2, ++ undefined, ++ "leap second is a valid ISO string for calendar (nested property)" ++); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-number.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-number.js +new file mode 100644 +index 0000000000000000000000000000000000000000..e1640061d8219bbe710d55ac6f63945923353351 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-number.js +@@ -0,0 +1,41 @@ ++// 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.calendar.prototype.erayear ++description: A number as calendar in a property bag is converted to a string, then to a calendar ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const calendar = 19970327; ++ ++let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++const result1 = instance.eraYear(arg); ++assert.sameValue(result1, undefined, "19970327 is a valid ISO string for calendar"); ++ ++arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++const result2 = instance.eraYear(arg); ++assert.sameValue(result2, undefined, "19970327 is a valid ISO string for calendar (nested property)"); ++ ++const numbers = [ ++ 1, ++ -19970327, ++ 1234567890, ++]; ++ ++for (const calendar of numbers) { ++ let arg = { year: 1976, monthCode: "M11", day: 18, calendar }; ++ assert.throws( ++ RangeError, ++ () => instance.eraYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar` ++ ); ++ arg = { year: 1976, monthCode: "M11", day: 18, calendar: { calendar } }; ++ assert.throws( ++ RangeError, ++ () => instance.eraYear(arg), ++ `Number ${calendar} does not convert to a valid ISO string for calendar (nested property)` ++ ); ++} +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-wrong-type.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..fe9969bb0cd4a730722bafca87e8f505ea2afb15 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-wrong-type.js +@@ -0,0 +1,47 @@ ++// 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.calendar.prototype.erayear ++description: > ++ Appropriate error thrown when a calendar property from a property bag cannot ++ be converted to a calendar object or string ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const timeZone = new Temporal.TimeZone("UTC"); ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [calendar, description] of rangeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(RangeError, () => instance.eraYear(arg), `${description} does not convert to a valid ISO string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(RangeError, () => instance.eraYear(arg), `${description} does not convert to a valid ISO string (nested property)`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], // TypeError due to missing dateFromFields() ++ [Temporal.Calendar, "Temporal.Calendar, object"], // ditto ++ [Temporal.Calendar.prototype, "Temporal.Calendar.prototype, object"], // fails brand check in dateFromFields() ++]; ++ ++for (const [calendar, description] of typeErrorTests) { ++ let arg = { year: 2019, monthCode: "M11", day: 1, calendar }; ++ assert.throws(TypeError, () => instance.eraYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++ ++ arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar } }; ++ assert.throws(TypeError, () => instance.eraYear(arg), `${description} is not a valid property bag and does not convert to a string (nested property)`); ++} ++ ++const arg = { year: 2019, monthCode: "M11", day: 1, calendar: { calendar: undefined } }; ++assert.throws(RangeError, () => instance.eraYear(arg), `nested undefined calendar property is always a RangeError`); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-year-zero.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-year-zero.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3007055aeca2d8ff4f57939253b91d15aea5b052 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-propertybag-calendar-year-zero.js +@@ -0,0 +1,24 @@ ++// 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.calendar.prototype.erayear ++description: Negative zero, as an extended year, is rejected ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T17:45", ++ "-000000-10-31T17:45Z", ++ "-000000-10-31T17:45+01:00", ++ "-000000-10-31T17:45+00:00[UTC]", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++invalidStrings.forEach((arg) => { ++ assert.throws( ++ RangeError, ++ () => instance.eraYear(arg), ++ "reject minus zero as extended year" ++ ); ++}); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-string-invalid.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-string-invalid.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6b3f65b9ea42beaa73361dfd20bbeb8717412807 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-string-invalid.js +@@ -0,0 +1,61 @@ ++// 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.calendar.prototype.erayear ++description: > ++ RangeError thrown if an invalid ISO string (or syntactically valid ISO string ++ that is not supported) is used as a PlainDate ++features: [Temporal, arrow-function] ++---*/ ++ ++const invalidStrings = [ ++ // invalid ISO strings: ++ "", ++ "invalid iso8601", ++ "2020-01-00", ++ "2020-01-32", ++ "2020-02-30", ++ "2021-02-29", ++ "2020-00-01", ++ "2020-13-01", ++ "2020-01-01T", ++ "2020-01-01T25:00:00", ++ "2020-01-01T01:60:00", ++ "2020-01-01T01:60:61", ++ "2020-01-01junk", ++ "2020-01-01T00:00:00junk", ++ "2020-01-01T00:00:00+00:00junk", ++ "2020-01-01T00:00:00+00:00[UTC]junk", ++ "2020-01-01T00:00:00+00:00[UTC][u-ca=iso8601]junk", ++ "02020-01-01", ++ "2020-001-01", ++ "2020-01-001", ++ "2020-01-01T001", ++ "2020-01-01T01:001", ++ "2020-01-01T01:01:001", ++ // valid, but forms not supported in Temporal: ++ "2020-W01-1", ++ "2020-001", ++ "+0002020-01-01", ++ // valid, but this calendar must not exist: ++ "2020-01-01[u-ca=notexist]", ++ // may be valid in other contexts, but insufficient information for PlainDate: ++ "2020-01", ++ "+002020-01", ++ "01-01", ++ "2020-W01", ++ "P1Y", ++ "-P12Y", ++ // valid, but outside the supported range: ++ "-999999-01-01", ++ "+999999-01-01", ++]; ++const instance = new Temporal.Calendar("iso8601"); ++for (const arg of invalidStrings) { ++ assert.throws( ++ RangeError, ++ () => instance.eraYear(arg), ++ `"${arg}" should not be a valid ISO string for a PlainDate` ++ ); ++} +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-wrong-type.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-wrong-type.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d30f3214af213ee28f3dc009eb3f830b914c513e +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/argument-wrong-type.js +@@ -0,0 +1,36 @@ ++// 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.calendar.prototype.erayear ++description: > ++ Appropriate error thrown when argument cannot be converted to a valid string ++ or property bag for PlainDate ++features: [BigInt, Symbol, Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++const rangeErrorTests = [ ++ [undefined, "undefined"], ++ [null, "null"], ++ [true, "boolean"], ++ ["", "empty string"], ++ [1, "number that doesn't convert to a valid ISO string"], ++ [1n, "bigint"], ++]; ++ ++for (const [arg, description] of rangeErrorTests) { ++ assert.throws(RangeError, () => instance.eraYear(arg), `${description} does not convert to a valid ISO string`); ++} ++ ++const typeErrorTests = [ ++ [Symbol(), "symbol"], ++ [{}, "plain object"], ++ [Temporal.PlainDate, "Temporal.PlainDate, object"], ++ [Temporal.PlainDate.prototype, "Temporal.PlainDate.prototype, object"], ++]; ++ ++for (const [arg, description] of typeErrorTests) { ++ assert.throws(TypeError, () => instance.eraYear(arg), `${description} is not a valid property bag and does not convert to a string`); ++} +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/calendar-datefromfields-called-with-options-undefined.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/calendar-datefromfields-called-with-options-undefined.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a2c9fa6645e71d12d5ffb9127234178fda51b5af +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/calendar-datefromfields-called-with-options-undefined.js +@@ -0,0 +1,15 @@ ++// 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.calendar.prototype.erayear ++description: > ++ Calendar.dateFromFields method is called with undefined as the options value ++ when call originates internally ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const calendar = TemporalHelpers.calendarFromFieldsUndefinedOptions(); ++calendar.eraYear({ year: 2000, month: 5, day: 3, calendar }); ++assert.sameValue(calendar.dateFromFieldsCallCount, 1); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/leap-second.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/leap-second.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3d1fabe6c2bbae37c7e9774c4c0dac7aaa4a84c7 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/leap-second.js +@@ -0,0 +1,26 @@ ++// 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.calendar.prototype.erayear ++description: Leap second is a valid ISO string for PlainDate ++features: [Temporal] ++---*/ ++ ++const instance = new Temporal.Calendar("iso8601"); ++ ++let arg = "2016-12-31T23:59:60"; ++const result1 = instance.eraYear(arg); ++assert.sameValue( ++ result1, ++ undefined, ++ "leap second is a valid ISO string for PlainDate" ++); ++ ++arg = { year: 2016, month: 12, day: 31, hour: 23, minute: 59, second: 60 }; ++const result2 = instance.eraYear(arg); ++assert.sameValue( ++ result2, ++ undefined, ++ "second: 60 is ignored in property bag for PlainDate" ++); +diff --git a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/year-zero.js b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/year-zero.js +index 22bcccd92cf61b15ccc38e461e78e3bc2a500368..52cb511a15d6397c307e6190c764c5950efcccdf 100644 +--- a/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/year-zero.js ++++ b/JSTests/test262/test/intl402/Temporal/Calendar/prototype/eraYear/year-zero.js +@@ -7,11 +7,17 @@ description: Negative zero, as an extended year, is rejected + features: [Temporal, arrow-function] + ---*/ + +-const arg = "-000000-10-31"; ++const invalidStrings = [ ++ "-000000-10-31", ++ "-000000-10-31T00:45", ++ "-000000-10-31T00:45+01:00", ++ "-000000-10-31T00:45+00:00[UTC]", ++]; + const instance = new Temporal.Calendar("iso8601"); +- +-assert.throws( ++invalidStrings.forEach((arg) => { ++ assert.throws( + RangeError, +- () => { instance.eraYear(arg); }, ++ () => instance.eraYear(arg), + "reject minus zero as extended year" +-); ++ ); ++}); +diff --git a/JSTests/test262/test/intl402/Temporal/Duration/compare/relativeto-hour.js b/JSTests/test262/test/intl402/Temporal/Duration/compare/relativeto-hour.js +new file mode 100644 +index 0000000000000000000000000000000000000000..318c0ba4ac55d2d65536b21d29f36c6624032103 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Duration/compare/relativeto-hour.js +@@ -0,0 +1,31 @@ ++// 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.duration.compare ++description: relativeTo with hours. ++features: [Temporal] ++---*/ ++ ++const oneDay = new Temporal.Duration(0, 0, 0, 1); ++const hours24 = new Temporal.Duration(0, 0, 0, 0, 24); ++ ++assert.sameValue( ++ Temporal.Duration.compare(oneDay, hours24, { relativeTo: Temporal.ZonedDateTime.from('2017-01-01T00:00[America/Montevideo]') }), ++ 0, ++ 'relativeTo does not affect days if ZonedDateTime, and duration encompasses no DST change'); ++assert.sameValue( ++ Temporal.Duration.compare(oneDay, hours24, { relativeTo: Temporal.ZonedDateTime.from('2019-11-03T00:00[America/Vancouver]') }), ++ 1, ++ 'relativeTo does affect days if ZonedDateTime, and duration encompasses DST change'); ++assert.sameValue( ++ Temporal.Duration.compare(oneDay, hours24, { relativeTo: '2019-11-03T00:00[America/Vancouver]' }), ++ 1, ++ 'casts relativeTo to ZonedDateTime from string'); ++assert.sameValue( ++ Temporal.Duration.compare(oneDay, hours24, { ++ relativeTo: { year: 2019, month: 11, day: 3, timeZone: 'America/Vancouver' } ++ }), ++ 1, ++ 'casts relativeTo to ZonedDateTime from object'); ++ +diff --git a/JSTests/test262/test/intl402/Temporal/Instant/prototype/toString/timezone-offset.js b/JSTests/test262/test/intl402/Temporal/Instant/prototype/toString/timezone-offset.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ee2bd1e5fba195bd4c3279e5e1f5c55b19a23972 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/Instant/prototype/toString/timezone-offset.js +@@ -0,0 +1,19 @@ ++// Copyright (C) 2021 Igalia, S.L. All rights reserved. ++// This code is governed by the BSD license found in the LICENSE file. ++ ++/*--- ++esid: sec-temporal.instant.prototype.tostring ++description: The time zone offset part of the string serialization (Intl time zones) ++features: [BigInt, Temporal] ++---*/ ++ ++const instant = new Temporal.Instant(0n); ++ ++function test(timeZoneIdentifier, expected, description) { ++ const timeZone = new Temporal.TimeZone(timeZoneIdentifier); ++ assert.sameValue(instant.toString({ timeZone }), expected, description); ++} ++ ++test("Europe/Berlin", "1970-01-01T01:00:00+01:00", "positive offset"); ++test("America/New_York", "1969-12-31T19:00:00-05:00", "negative offset"); ++test("Africa/Monrovia", "1969-12-31T23:15:30-00:45", "sub-minute offset"); +diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-always.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-always.js +new file mode 100644 +index 0000000000000000000000000000000000000000..727b24ce90c69868d13ceee8e88e433f7dae86d4 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-always.js +@@ -0,0 +1,16 @@ ++// 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.tostring ++description: Show calendar when calendarName is "always" ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 0, 0, 0, 0, "gregory"); ++ ++assert.sameValue( ++ dt.toString({ calendarName: "always" }), ++ "1976-11-18T15:23:00[u-ca=gregory]", ++ "shows non-ISO calendar if calendarName = always" ++); +diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2f9586a83d0c2cf88509cb4431ac4598caecb1d1 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-auto.js +@@ -0,0 +1,14 @@ ++// 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.tostring ++description: Possibly display calendar when calendarName is "auto" ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 0, 0, 0, 0, "gregory"); ++const expected = "1976-11-18T15:23:00[u-ca=gregory]"; ++ ++assert.sameValue(dt.toString(), expected, "shows non-ISO calendar by default (no arguments)"); ++assert.sameValue(dt.toString({ calendarName: "auto" }), expected, "shows only non-ISO calendar if calendarName = auto"); +diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-never.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-never.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1bd9018a213c412d5aff00540d9be6cab1d711ed +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/toString/calendarname-never.js +@@ -0,0 +1,16 @@ ++// 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.tostring ++description: Do not show calendar (even non-ISO calendars) if calendarName = "never" ++features: [Temporal] ++---*/ ++ ++const dt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23); ++ ++assert.sameValue( ++ dt.withCalendar("gregory").toString({ calendarName: "never" }), ++ "1976-11-18T15:23:00", ++ "omits non-ISO calendar if calendarName = never" ++); +diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js +new file mode 100644 +index 0000000000000000000000000000000000000000..118282b48dec7c40900dc9a52edfe88d9c0a4624 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso.js +@@ -0,0 +1,38 @@ ++// 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.withplaindate ++description: PlainDate calendar is preserved with ISO PDT ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const cal = { ++ id: 'thisisnotiso', ++ era() { return "the era"; }, ++ eraYear() { return 1909; }, ++ toString() { return "this is a string"; }, ++ year() { return 2008; }, ++ month() { return 9; }, ++ monthCode() { return "M09"; }, ++ day() { return 6; } ++}; ++const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0); ++assert.sameValue(pdt.calendar.toString(), "iso8601", "PlainDateTime with ISO calendar"); ++const pd = new Temporal.PlainDate(2010, 11, 12, cal); ++const shifted = pdt.withPlainDate(pd); ++ ++TemporalHelpers.assertPlainDateTime( ++ shifted, ++ 2008, 9, "M09", 6, 3, 24, 30, 0, 0, 0, ++ "calendar is changed if receiver has ISO calendar (1)", ++ "the era", ++ 1909 ++); ++ ++assert.sameValue( ++ shifted.calendar, ++ cal, ++ "calendar is changed if receiver has ISO calendar (2)" ++); +diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2849905981592797427fc06d26849cdb52c10208 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id.js +@@ -0,0 +1,40 @@ ++// 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.withplaindate ++description: PlainDate calendar is preserved when both calendars have the same id ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const cal1 = { ++ toString() { return "this is a string"; }, ++}; ++const cal2 = { ++ id: 'thisisnotiso', ++ era() { return "the era"; }, ++ eraYear() { return 1909; }, ++ toString() { return "this is a string"; }, ++ year() { return 2008; }, ++ month() { return 9; }, ++ monthCode() { return "M09"; }, ++ day() { return 6; } ++}; ++const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal1); ++const pd = new Temporal.PlainDate(2010, 11, 12, cal2); ++const shifted = pdt.withPlainDate(pd); ++ ++TemporalHelpers.assertPlainDateTime( ++ shifted, ++ 2008, 9, "M09", 6, 3, 24, 30, 0, 0, 0, ++ "calendar is changed with same id (1)", ++ "the era", ++ 1909 ++); ++ ++assert.sameValue( ++ shifted.calendar, ++ cal2, ++ "calendar is changed with same id (2)" ++); +diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f963a3b61d2ac34d9f1554d043e590e3b7156d71 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object.js +@@ -0,0 +1,42 @@ ++// 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.withplaindate ++description: PlainDate calendar is preserved when both calendars are the same object ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++let calls = 0; ++const cal = { ++ id: 'thisisnotiso', ++ era() { return "the era"; }, ++ eraYear() { return 1909; }, ++ toString() { ++ ++calls; ++ return "this is a string"; ++ }, ++ year() { return 2008; }, ++ month() { return 9; }, ++ monthCode() { return "M09"; }, ++ day() { return 6; } ++}; ++const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal); ++const pd = new Temporal.PlainDate(2010, 11, 12, cal); ++const shifted = pdt.withPlainDate(pd); ++ ++TemporalHelpers.assertPlainDateTime( ++ shifted, ++ 2008, 9, "M09", 6, 3, 24, 30, 0, 0, 0, ++ "calendar is unchanged with same calendars (1)", ++ "the era", ++ 1909 ++); ++ ++assert.sameValue( ++ shifted.calendar, ++ cal, ++ "calendar is unchanged with same calendars (2)" ++); ++assert.sameValue(calls, 0, "should not have called cal.toString()"); +diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ad9f56f7bb4fae4311c4da5ea9aa9902b3f87310 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar.js +@@ -0,0 +1,38 @@ ++// 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.withplaindate ++description: Original PDT calendar is preserved with ISO PlainDate ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const cal = { ++ id: 'thisisnotiso', ++ era() { return "the era"; }, ++ eraYear() { return 1909; }, ++ toString() { return "this is a string"; }, ++ year() { return 2008; }, ++ month() { return 9; }, ++ monthCode() { return "M09"; }, ++ day() { return 6; } ++}; ++const pdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal); ++const pd = new Temporal.PlainDate(2010, 11, 12); ++assert.sameValue(pd.calendar.toString(), "iso8601", "PlainDate with ISO calendar"); ++const shifted = pdt.withPlainDate(pd); ++ ++TemporalHelpers.assertPlainDateTime( ++ shifted, ++ 2008, 9, "M09", 6, 3, 24, 30, 0, 0, 0, ++ "calendar is unchanged if input has ISO calendar (1)", ++ "the era", ++ 1909 ++); ++ ++assert.sameValue( ++ shifted.calendar, ++ cal, ++ "calendar is unchanged if input has ISO calendar (2)" ++); +diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-calendar.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2065751f7191043b9727d6b2ea873ba8f1e860b0 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-calendar.js +@@ -0,0 +1,25 @@ ++// 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.withplaindate ++description: non-ISO calendars are handled correctly ++includes: [temporalHelpers.js] ++features: [Temporal] ++---*/ ++ ++const isopdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 123, 456, 789); ++const gregorypdt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 123, 456, 789, "gregory"); ++ ++const result1 = isopdt.withPlainDate("2020-11-13[u-ca=gregory]"); ++TemporalHelpers.assertPlainDateTime(result1, 2020, 11, "M11", 13, 3, 24, 30, 123, 456, 789, ++ "result1", "ce", 2020); ++assert.sameValue(result1.calendar.toString(), "gregory", "non-ISO calendar in argument overrides ISO calendar in receiver"); ++ ++const result2 = gregorypdt.withPlainDate("2020-11-13[u-ca=iso8601]"); ++TemporalHelpers.assertPlainDateTime(result2, 2020, 11, "M11", 13, 3, 24, 30, 123, 456, 789, ++ "result2", "ce", 2020); ++assert.sameValue(result2.calendar.toString(), "gregory", "non-ISO calendar in receiver overrides ISO calendar in argument"); ++ ++assert.throws(RangeError, () => gregorypdt.withPlainDate("2020-11-13[u-ca=japanese]"), ++ "throws if both `this` and `other` have a non-ISO calendar"); +diff --git a/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js +new file mode 100644 +index 0000000000000000000000000000000000000000..d86925d1b80aed0c02fcfaf1dda2033842c47b65 +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar.js +@@ -0,0 +1,36 @@ ++// 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.withplaindate ++description: Original PDT calendar is preserved with ISO string ++features: [Temporal] ++includes: [temporalHelpers.js] ++---*/ ++ ++const cal = { ++ id: "thisisnotiso", ++ era() { return "the era"; }, ++ eraYear() { return 1909; }, ++ toString() { return "this is a string"; }, ++ year() { return 2008; }, ++ month() { return 9; }, ++ monthCode() { return "M09"; }, ++ day() { return 6; } ++}; ++const dt = new Temporal.PlainDateTime(1995, 12, 7, 3, 24, 30, 0, 0, 0, cal); ++const shifted = dt.withPlainDate("2010-11-12"); ++ ++TemporalHelpers.assertPlainDateTime( ++ shifted, ++ 2008, 9, "M09", 6, 3, 24, 30, 0, 0, 0, ++ "calendar is unchanged if input has ISO calendar (1)", ++ "the era", ++ 1909 ++); ++ ++assert.sameValue( ++ shifted.calendar, ++ cal, ++ "calendar is unchanged if input has ISO calendar (2)" ++); +diff --git a/JSTests/test262/test/intl402/Temporal/TimeZone/etc-timezone.js b/JSTests/test262/test/intl402/Temporal/TimeZone/etc-timezone.js +new file mode 100644 +index 0000000000000000000000000000000000000000..b3995e5f4ca3d97a92dc6e7df5387f869066ad2b +--- /dev/null ++++ b/JSTests/test262/test/intl402/Temporal/TimeZone/etc-timezone.js +@@ -0,0 +1,79 @@ ++// 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.timezone ++description: Some Etc/GMT{+/-}{0}N timezones are valid, but not all ++features: [Temporal] ++---*/ ++ ++// "Etc/GMT-0" through "Etc/GMT-14" are OK ++ ++assert.sameValue( ++ (new Temporal.TimeZone("Etc/GMT-0")).toString(), ++ "UTC", // if the offset is -0, we say "UTC" rather than "GMT" ++ "Etc/GMT-0 is a valid timezone" ++); ++ ++[1,2,3,4,5,6,7,8,9,10,11,12,13,14].forEach((n) => { ++ let tz = "Etc/GMT-" + n; ++ let instance = new Temporal.TimeZone(tz); ++ assert.sameValue( ++ instance.toString(), ++ tz, ++ tz + " is a valid timezone" ++ ); ++}); ++ ++let gmtMinus24TZ = "Etc/GMT-24"; ++assert.throws( ++ RangeError, ++ () => { new Temporal.TimeZone(gmtMinus24TZ); }, ++ gmtMinus24TZ + " is an invalid timezone" ++); ++ ++// "Etc/GMT-0N" is not OK (1 ≤ N ≤ 9) ++[1,2,3,4,5,6,7,8,9].forEach((n) => { ++ let tz = "Etc/GMT-0" + n; ++ assert.throws( ++ RangeError, ++ () => { new Temporal.TimeZone(tz); }, ++ tz + " is an invalid timezone" ++ ); ++}); ++ ++// "Etc/GMT+0N" is not OK (0 ≤ N ≤ 9) ++[0,1,2,3,4,5,6,7,8,9].forEach((n) => { ++ let tz = "Etc/GMT+0" + n; ++ assert.throws( ++ RangeError, ++ () => { new Temporal.TimeZone(tz); }, ++ tz + " is an invalid timezone" ++ ); ++}); ++ ++// Etc/GMT+0" through "Etc/GMT+12" are OK ++ ++// zero is handled in its own way (say "UTC" rather than "GMT"): ++assert.sameValue( ++ (new Temporal.TimeZone("Etc/GMT+0")).toString(), ++ "UTC", // if the offset is +0, we say "UTC" rather than "GMT" ++ "Etc/GMT+0 is a valid timezone" ++); ++ ++[1,2,3,4,5,6,7,8,9,10,11,12].forEach((n) => { ++ let tz = "Etc/GMT+" + n; ++ let instance = new Temporal.TimeZone(tz); ++ assert.sameValue( ++ instance.toString(), ++ tz, ++ tz + " is a valid timezone" ++ ); ++}); ++ ++let gmtPlus24TZ = "Etc/GMT+24"; ++assert.throws( ++ RangeError, ++ () => { new Temporal.TimeZone(gmtPlus24TZ); }, ++ gmtPlus24TZ + " is an invalid timezone" ++); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-and.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-and.js +deleted file mode 100644 +index 78dadeef59163cf957d84ca6574228c5a1b15ecc..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-and.js ++++ /dev/null +@@ -1,60 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/and.case +-// - src/compound-assignment-private/default/getter-setter.template +-/*--- +-description: Compound logical-and assignment with target being a private reference (to an accessor property with getter and setter) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 5.a. Assert: _entry_.[[Kind]] is ~accessor~. +- ... +- 5.c. Let _setter_ be _entry_.[[Set]]. +- d. Perform ? Call(_setter_, _O_, « _value_ »). +- +----*/ +- +- +-class C { +- #setterCalledWith; +- get #field() { +- return true; +- } +- set #field(value) { +- this.#setterCalledWith = value; +- } +- compoundAssignment() { +- return this.#field &&= false; +- } +- setterCalledWithValue() { +- return this.#setterCalledWith; +- } +-} +- +-const o = new C(); +-assert.sameValue(o.compoundAssignment(), false, "The expression should evaluate to the result"); +-assert.sameValue(o.setterCalledWithValue(), false, "PutValue should call the setter with the result"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-nullish.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-nullish.js +deleted file mode 100644 +index 44aad7afe6697c037efef4dafe07359e4e65a3e2..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-nullish.js ++++ /dev/null +@@ -1,60 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/nullish.case +-// - src/compound-assignment-private/default/getter-setter.template +-/*--- +-description: Compound nullish-coalescing assignment with target being a private reference (to an accessor property with getter and setter) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 5.a. Assert: _entry_.[[Kind]] is ~accessor~. +- ... +- 5.c. Let _setter_ be _entry_.[[Set]]. +- d. Perform ? Call(_setter_, _O_, « _value_ »). +- +----*/ +- +- +-class C { +- #setterCalledWith; +- get #field() { +- return null; +- } +- set #field(value) { +- this.#setterCalledWith = value; +- } +- compoundAssignment() { +- return this.#field ??= 1; +- } +- setterCalledWithValue() { +- return this.#setterCalledWith; +- } +-} +- +-const o = new C(); +-assert.sameValue(o.compoundAssignment(), 1, "The expression should evaluate to the result"); +-assert.sameValue(o.setterCalledWithValue(), 1, "PutValue should call the setter with the result"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-or.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-or.js +deleted file mode 100644 +index 8d4c7c61e1b7a7821c5fa20d62d38b1711e786db..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-accessor-property-or.js ++++ /dev/null +@@ -1,60 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/or.case +-// - src/compound-assignment-private/default/getter-setter.template +-/*--- +-description: Compound logical-or assignment with target being a private reference (to an accessor property with getter and setter) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 5.a. Assert: _entry_.[[Kind]] is ~accessor~. +- ... +- 5.c. Let _setter_ be _entry_.[[Set]]. +- d. Perform ? Call(_setter_, _O_, « _value_ »). +- +----*/ +- +- +-class C { +- #setterCalledWith; +- get #field() { +- return false; +- } +- set #field(value) { +- this.#setterCalledWith = value; +- } +- compoundAssignment() { +- return this.#field ||= true; +- } +- setterCalledWithValue() { +- return this.#setterCalledWith; +- } +-} +- +-const o = new C(); +-assert.sameValue(o.compoundAssignment(), true, "The expression should evaluate to the result"); +-assert.sameValue(o.setterCalledWithValue(), true, "PutValue should call the setter with the result"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-and.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-and.js +deleted file mode 100644 +index 5208a2d3c0fc1b1f67c91f9f7d66d5034dfd1990..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-and.js ++++ /dev/null +@@ -1,52 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/and.case +-// - src/compound-assignment-private/default/data-property.template +-/*--- +-description: Compound logical-and assignment with target being a private reference (to a field) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 3. If _entry_.[[Kind]] is ~field~, then +- a. Set _entry_.[[Value]] to _value_. +- +----*/ +- +- +-class C { +- #field = true; +- compoundAssignment() { +- return this.#field &&= false; +- } +- fieldValue() { +- return this.#field; +- } +-} +- +-const o = new C(); +-assert.sameValue(o.compoundAssignment(), false, "The expression should evaluate to the result"); +-assert.sameValue(o.fieldValue(), false, "PutValue should store the result in the private reference"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-nullish.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-nullish.js +deleted file mode 100644 +index e8ecb5f6ddcb87d0bf3c9d1bcdae9b8ac0d1cd05..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-nullish.js ++++ /dev/null +@@ -1,52 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/nullish.case +-// - src/compound-assignment-private/default/data-property.template +-/*--- +-description: Compound nullish-coalescing assignment with target being a private reference (to a field) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 3. If _entry_.[[Kind]] is ~field~, then +- a. Set _entry_.[[Value]] to _value_. +- +----*/ +- +- +-class C { +- #field = null; +- compoundAssignment() { +- return this.#field ??= 1; +- } +- fieldValue() { +- return this.#field; +- } +-} +- +-const o = new C(); +-assert.sameValue(o.compoundAssignment(), 1, "The expression should evaluate to the result"); +-assert.sameValue(o.fieldValue(), 1, "PutValue should store the result in the private reference"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-or.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-or.js +deleted file mode 100644 +index 1057c97e80dc2021099d7b76bbfc02fd1a381144..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-data-property-or.js ++++ /dev/null +@@ -1,52 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/or.case +-// - src/compound-assignment-private/default/data-property.template +-/*--- +-description: Compound logical-or assignment with target being a private reference (to a field) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 3. If _entry_.[[Kind]] is ~field~, then +- a. Set _entry_.[[Value]] to _value_. +- +----*/ +- +- +-class C { +- #field = false; +- compoundAssignment() { +- return this.#field ||= true; +- } +- fieldValue() { +- return this.#field; +- } +-} +- +-const o = new C(); +-assert.sameValue(o.compoundAssignment(), true, "The expression should evaluate to the result"); +-assert.sameValue(o.fieldValue(), true, "PutValue should store the result in the private reference"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-and.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-and.js +deleted file mode 100644 +index 2d7d44a97308e812ba8cb619d6cd12b7a28d0b46..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-and.js ++++ /dev/null +@@ -1,48 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/and.case +-// - src/compound-assignment-private/default/method.template +-/*--- +-description: Compound logical-and assignment with target being a private reference (to a private method) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 4. Else if _entry_.[[Kind]] is ~method~, then +- a. Throw a *TypeError* exception. +- +----*/ +- +- +-class C { +- #privateMethod() {} +- compoundAssignment() { +- return this.#privateMethod &&= 1; +- } +-} +- +-const o = new C(); +-assert.throws(TypeError, () => o.compoundAssignment(), "PutValue throws when storing the result in a method private reference"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-nullish.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-nullish.js +deleted file mode 100644 +index 9d1ad3243d8c8cbd8c44959da1f749e2367e8d51..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-nullish.js ++++ /dev/null +@@ -1,48 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/nullish.case +-// - src/compound-assignment-private/default/method.template +-/*--- +-description: Compound nullish-coalescing assignment with target being a private reference (to a private method) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 4. Else if _entry_.[[Kind]] is ~method~, then +- a. Throw a *TypeError* exception. +- +----*/ +- +- +-class C { +- #privateMethod() {} +- compoundAssignment() { +- return this.#privateMethod ??= 1; +- } +-} +- +-const o = new C(); +-assert.throws(TypeError, () => o.compoundAssignment(), "PutValue throws when storing the result in a method private reference"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-or.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-or.js +deleted file mode 100644 +index 1ff03b32a2cd7fc99bf44caaf315ac4c48ffcc6a..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-method-or.js ++++ /dev/null +@@ -1,48 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/or.case +-// - src/compound-assignment-private/default/method.template +-/*--- +-description: Compound logical-or assignment with target being a private reference (to a private method) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 4. Else if _entry_.[[Kind]] is ~method~, then +- a. Throw a *TypeError* exception. +- +----*/ +- +- +-class C { +- #privateMethod() {} +- compoundAssignment() { +- return this.#privateMethod ||= 1; +- } +-} +- +-const o = new C(); +-assert.throws(TypeError, () => o.compoundAssignment(), "PutValue throws when storing the result in a method private reference"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js +deleted file mode 100644 +index 920814199ddc55434a5c280926033feea515572a..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js ++++ /dev/null +@@ -1,50 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/and.case +-// - src/compound-assignment-private/default/getter.template +-/*--- +-description: Compound logical-and assignment with target being a private reference (to an accessor property with getter) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 5.a. Assert: _entry_.[[Kind]] is ~accessor~. +- b. If _entry_.[[Set]] is *undefined*, throw a *TypeError* exception. +- +----*/ +- +- +-class C { +- get #field() { +- return 1; +- } +- compoundAssignment() { +- return this.#field &&= 1; +- } +-} +- +-const o = new C(); +-assert.throws(TypeError, () => o.compoundAssignment(), "PutValue throws when storing the result if no setter"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js +deleted file mode 100644 +index 4b64e52fd50bc3afcd8b5aee92524ce80cea908d..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js ++++ /dev/null +@@ -1,50 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/nullish.case +-// - src/compound-assignment-private/default/getter.template +-/*--- +-description: Compound nullish-coalescing assignment with target being a private reference (to an accessor property with getter) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 5.a. Assert: _entry_.[[Kind]] is ~accessor~. +- b. If _entry_.[[Set]] is *undefined*, throw a *TypeError* exception. +- +----*/ +- +- +-class C { +- get #field() { +- return 1; +- } +- compoundAssignment() { +- return this.#field ??= 1; +- } +-} +- +-const o = new C(); +-assert.throws(TypeError, () => o.compoundAssignment(), "PutValue throws when storing the result if no setter"); +diff --git a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js b/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js +deleted file mode 100644 +index 3e0c16123ee6c1a8ae695d859a486868195dfe13..0000000000000000000000000000000000000000 +--- a/JSTests/test262/test/language/expressions/compound-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js ++++ /dev/null +@@ -1,50 +0,0 @@ +-// This file was procedurally generated from the following sources: +-// - src/compound-assignment-private/or.case +-// - src/compound-assignment-private/default/getter.template +-/*--- +-description: Compound logical-or assignment with target being a private reference (to an accessor property with getter) +-esid: sec-assignment-operators-runtime-semantics-evaluation +-features: [class-fields-private] +-flags: [generated] +-info: | +- sec-assignment-operators-runtime-semantics-evaluation +- AssignmentExpression : LeftHandSideExpression AssignmentOperator AssignmentExpression +- 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. +- 2. Let _lval_ be ? GetValue(_lref_). +- ... +- 7. Let _r_ be ApplyStringOrNumericBinaryOperator(_lval_, _opText_, _rval_). +- 8. Perform ? PutValue(_lref_, _r_). +- 9. Return _r_. +- +- sec-property-accessors-runtime-semantics-evaluation +- MemberExpression : MemberExpression `.` PrivateIdentifier +- +- 1. Let _baseReference_ be the result of evaluating |MemberExpression|. +- 2. Let _baseValue_ be ? GetValue(_baseReference_). +- 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. +- 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). +- +- PutValue (V, W) +- ... +- 5.b. If IsPrivateReference(_V_) is *true*, then +- i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). +- +- PrivateSet (O, P, value) +- ... +- 5.a. Assert: _entry_.[[Kind]] is ~accessor~. +- b. If _entry_.[[Set]] is *undefined*, throw a *TypeError* exception. +- +----*/ +- +- +-class C { +- get #field() { +- return 1; +- } +- compoundAssignment() { +- return this.#field ||= 1; +- } +-} +- +-const o = new C(); +-assert.throws(TypeError, () => o.compoundAssignment(), "PutValue throws when storing the result if no setter"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-and.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-and.js +new file mode 100644 +index 0000000000000000000000000000000000000000..da33c16339f4f48092c914219337b8b63237c6e9 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-and.js +@@ -0,0 +1,61 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/and.case ++// - src/logical-assignment-private/default/getter-setter.template ++/*--- ++description: Logical-and assignment with target being a private reference (to an accessor property with getter and setter) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ ... ++ 5.c. Let _setter_ be _entry_.[[Set]]. ++ d. Perform ? Call(_setter_, _O_, « _value_ »). ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *false*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++class C { ++ #setterCalledWith; ++ get #field() { ++ return true; ++ } ++ set #field(value) { ++ this.#setterCalledWith = value; ++ } ++ compoundAssignment() { ++ return this.#field &&= false; ++ } ++ setterCalledWithValue() { ++ return this.#setterCalledWith; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), false, "The expression should evaluate to the result"); ++assert.sameValue(o.setterCalledWithValue(), false, "PutValue should call the setter with the result"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-nullish.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-nullish.js +new file mode 100644 +index 0000000000000000000000000000000000000000..3a57a5e69c243f383bc3df0eefad6ad586f368de +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-nullish.js +@@ -0,0 +1,60 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/nullish.case ++// - src/logical-assignment-private/default/getter-setter.template ++/*--- ++description: Nullish-coalescing assignment with target being a private reference (to an accessor property with getter and setter) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ ... ++ 5.c. Let _setter_ be _entry_.[[Set]]. ++ d. Perform ? Call(_setter_, _O_, « _value_ »). ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. If _lval_ is neither *undefined* nor *null*, return _lval_. ++ ... ++ 6. Perform ? PutValue(_lref_, _rval_). ++ 7. Return _rval_. ++---*/ ++ ++ ++class C { ++ #setterCalledWith; ++ get #field() { ++ return null; ++ } ++ set #field(value) { ++ this.#setterCalledWith = value; ++ } ++ compoundAssignment() { ++ return this.#field ??= 1; ++ } ++ setterCalledWithValue() { ++ return this.#setterCalledWith; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), 1, "The expression should evaluate to the result"); ++assert.sameValue(o.setterCalledWithValue(), 1, "PutValue should call the setter with the result"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-or.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-or.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f1d057d2b2af217155c9d8d16312dc123df9d374 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-or.js +@@ -0,0 +1,61 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/or.case ++// - src/logical-assignment-private/default/getter-setter.template ++/*--- ++description: Logical-or assignment with target being a private reference (to an accessor property with getter and setter) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ ... ++ 5.c. Let _setter_ be _entry_.[[Set]]. ++ d. Perform ? Call(_setter_, _O_, « _value_ »). ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *true*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++class C { ++ #setterCalledWith; ++ get #field() { ++ return false; ++ } ++ set #field(value) { ++ this.#setterCalledWith = value; ++ } ++ compoundAssignment() { ++ return this.#field ||= true; ++ } ++ setterCalledWithValue() { ++ return this.#setterCalledWith; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), true, "The expression should evaluate to the result"); ++assert.sameValue(o.setterCalledWithValue(), true, "PutValue should call the setter with the result"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-and.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-and.js +new file mode 100644 +index 0000000000000000000000000000000000000000..2fd976d88dd079f7ccb4c4f7f036aa1af9a077a9 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-and.js +@@ -0,0 +1,62 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/and.case ++// - src/logical-assignment-private/default/getter-setter-short-circuit.template ++/*--- ++description: Logical-and assignment with target being a private reference (to an accessor property with getter and setter (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ ... ++ 5.c. Let _setter_ be _entry_.[[Set]]. ++ d. Perform ? Call(_setter_, _O_, « _value_ »). ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *false*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ setterWasCalled = false; ++ get #field() { ++ return false; ++ } ++ set #field(value) { ++ this.setterWasCalled = true; ++ } ++ compoundAssignment() { ++ return this.#field &&= doNotCall(); ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), false, "The expression should evaluate to the short-circuit value"); ++assert(!o.setterWasCalled, "The setter should not be called"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-nullish.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-nullish.js +new file mode 100644 +index 0000000000000000000000000000000000000000..8a0843794d986477e918b6dc876cd64fa3c3d400 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-nullish.js +@@ -0,0 +1,61 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/nullish.case ++// - src/logical-assignment-private/default/getter-setter-short-circuit.template ++/*--- ++description: Nullish-coalescing assignment with target being a private reference (to an accessor property with getter and setter (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ ... ++ 5.c. Let _setter_ be _entry_.[[Set]]. ++ d. Perform ? Call(_setter_, _O_, « _value_ »). ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. If _lval_ is neither *undefined* nor *null*, return _lval_. ++ ... ++ 6. Perform ? PutValue(_lref_, _rval_). ++ 7. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ setterWasCalled = false; ++ get #field() { ++ return 1; ++ } ++ set #field(value) { ++ this.setterWasCalled = true; ++ } ++ compoundAssignment() { ++ return this.#field ??= doNotCall(); ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), 1, "The expression should evaluate to the short-circuit value"); ++assert(!o.setterWasCalled, "The setter should not be called"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-or.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-or.js +new file mode 100644 +index 0000000000000000000000000000000000000000..91a88e990cc6c95b3837a9e5ce964b6a8c79f320 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-accessor-property-short-circuit-or.js +@@ -0,0 +1,62 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/or.case ++// - src/logical-assignment-private/default/getter-setter-short-circuit.template ++/*--- ++description: Logical-or assignment with target being a private reference (to an accessor property with getter and setter (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ ... ++ 5.c. Let _setter_ be _entry_.[[Set]]. ++ d. Perform ? Call(_setter_, _O_, « _value_ »). ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *true*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ setterWasCalled = false; ++ get #field() { ++ return true; ++ } ++ set #field(value) { ++ this.setterWasCalled = true; ++ } ++ compoundAssignment() { ++ return this.#field ||= doNotCall(); ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), true, "The expression should evaluate to the short-circuit value"); ++assert(!o.setterWasCalled, "The setter should not be called"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-and.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-and.js +new file mode 100644 +index 0000000000000000000000000000000000000000..ffd59ab034e064ee59b1bb3972bef8ec724c2c94 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-and.js +@@ -0,0 +1,53 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/and.case ++// - src/logical-assignment-private/default/data-property.template ++/*--- ++description: Logical-and assignment with target being a private reference (to a field) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 3. If _entry_.[[Kind]] is ~field~, then ++ a. Set _entry_.[[Value]] to _value_. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *false*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++class C { ++ #field = true; ++ compoundAssignment() { ++ return this.#field &&= false; ++ } ++ fieldValue() { ++ return this.#field; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), false, "The expression should evaluate to the result"); ++assert.sameValue(o.fieldValue(), false, "PutValue should store the result in the private reference"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-nullish.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-nullish.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c3cd8f86c8899105cb9e13ab08e5877f023a04cf +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-nullish.js +@@ -0,0 +1,52 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/nullish.case ++// - src/logical-assignment-private/default/data-property.template ++/*--- ++description: Nullish-coalescing assignment with target being a private reference (to a field) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 3. If _entry_.[[Kind]] is ~field~, then ++ a. Set _entry_.[[Value]] to _value_. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. If _lval_ is neither *undefined* nor *null*, return _lval_. ++ ... ++ 6. Perform ? PutValue(_lref_, _rval_). ++ 7. Return _rval_. ++---*/ ++ ++ ++class C { ++ #field = null; ++ compoundAssignment() { ++ return this.#field ??= 1; ++ } ++ fieldValue() { ++ return this.#field; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), 1, "The expression should evaluate to the result"); ++assert.sameValue(o.fieldValue(), 1, "PutValue should store the result in the private reference"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-or.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-or.js +new file mode 100644 +index 0000000000000000000000000000000000000000..f7ca6eba72313e184d2c6d1cdb8e084b8bbe742a +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-or.js +@@ -0,0 +1,53 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/or.case ++// - src/logical-assignment-private/default/data-property.template ++/*--- ++description: Logical-or assignment with target being a private reference (to a field) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 3. If _entry_.[[Kind]] is ~field~, then ++ a. Set _entry_.[[Value]] to _value_. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *true*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++class C { ++ #field = false; ++ compoundAssignment() { ++ return this.#field ||= true; ++ } ++ fieldValue() { ++ return this.#field; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), true, "The expression should evaluate to the result"); ++assert.sameValue(o.fieldValue(), true, "PutValue should store the result in the private reference"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-and.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-and.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c94ae0c709f394f7fe5645f39c8e869951ea35bf +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-and.js +@@ -0,0 +1,56 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/and.case ++// - src/logical-assignment-private/default/data-property-short-circuit.template ++/*--- ++description: Logical-and assignment with target being a private reference (to a field (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 3. If _entry_.[[Kind]] is ~field~, then ++ a. Set _entry_.[[Value]] to _value_. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *false*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ #field = false; ++ compoundAssignment() { ++ return this.#field &&= doNotCall(); ++ } ++ fieldValue() { ++ return this.#field; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), false, "The expression should evaluate to the short-circuit value"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-nullish.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-nullish.js +new file mode 100644 +index 0000000000000000000000000000000000000000..a8c3ac4dd11853fca18d1001e3b703e99be77861 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-nullish.js +@@ -0,0 +1,55 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/nullish.case ++// - src/logical-assignment-private/default/data-property-short-circuit.template ++/*--- ++description: Nullish-coalescing assignment with target being a private reference (to a field (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 3. If _entry_.[[Kind]] is ~field~, then ++ a. Set _entry_.[[Value]] to _value_. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. If _lval_ is neither *undefined* nor *null*, return _lval_. ++ ... ++ 6. Perform ? PutValue(_lref_, _rval_). ++ 7. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ #field = 1; ++ compoundAssignment() { ++ return this.#field ??= doNotCall(); ++ } ++ fieldValue() { ++ return this.#field; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), 1, "The expression should evaluate to the short-circuit value"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-or.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-or.js +new file mode 100644 +index 0000000000000000000000000000000000000000..7a176213fe8f512a0a3f3d468a10b58378c4da68 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-data-property-short-circuit-or.js +@@ -0,0 +1,56 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/or.case ++// - src/logical-assignment-private/default/data-property-short-circuit.template ++/*--- ++description: Logical-or assignment with target being a private reference (to a field (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 3. If _entry_.[[Kind]] is ~field~, then ++ a. Set _entry_.[[Value]] to _value_. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *true*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ #field = true; ++ compoundAssignment() { ++ return this.#field ||= doNotCall(); ++ } ++ fieldValue() { ++ return this.#field; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), true, "The expression should evaluate to the short-circuit value"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-and.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-and.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c604569474c3d5f873ba9e117bc10eb8097bd6ad +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-and.js +@@ -0,0 +1,49 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/and.case ++// - src/logical-assignment-private/default/method.template ++/*--- ++description: Logical-and assignment with target being a private reference (to a private method) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 4. Else if _entry_.[[Kind]] is ~method~, then ++ a. Throw a *TypeError* exception. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *false*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++class C { ++ #privateMethod() {} ++ compoundAssignment() { ++ return this.#privateMethod &&= 1; ++ } ++} ++ ++const o = new C(); ++assert.throws(TypeError, () => o.compoundAssignment(), "PutValue throws when storing the result in a method private reference"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-nullish.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-nullish.js +new file mode 100644 +index 0000000000000000000000000000000000000000..69bc35b9168b425c35c09dff408830e903c68eaf +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-nullish.js +@@ -0,0 +1,55 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/nullish.case ++// - src/logical-assignment-private/default/method-short-circuit.template ++/*--- ++description: Nullish-coalescing assignment with target being a private reference (to a private method (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 4. Else if _entry_.[[Kind]] is ~method~, then ++ a. Throw a *TypeError* exception. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. If _lval_ is neither *undefined* nor *null*, return _lval_. ++ ... ++ 6. Perform ? PutValue(_lref_, _rval_). ++ 7. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ #privateMethod() {} ++ compoundAssignment() { ++ return this.#privateMethod ??= doNotCall(); ++ } ++ getPrivateMethodFunctionObject() { ++ return this.#privateMethod; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), o.getPrivateMethodFunctionObject(), "The expression should evaluate to the short-circuit value"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-or.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-or.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6053891284400cf4f2b10803986b107f3c9642f1 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-method-short-circuit-or.js +@@ -0,0 +1,56 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/or.case ++// - src/logical-assignment-private/default/method-short-circuit.template ++/*--- ++description: Logical-or assignment with target being a private reference (to a private method (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 4. Else if _entry_.[[Kind]] is ~method~, then ++ a. Throw a *TypeError* exception. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *true*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ #privateMethod() {} ++ compoundAssignment() { ++ return this.#privateMethod ||= doNotCall(); ++ } ++ getPrivateMethodFunctionObject() { ++ return this.#privateMethod; ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), o.getPrivateMethodFunctionObject(), "The expression should evaluate to the short-circuit value"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js +new file mode 100644 +index 0000000000000000000000000000000000000000..c11c1f911ded2c0e891378dd3fde9966c6035d5e +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-and.js +@@ -0,0 +1,51 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/and.case ++// - src/logical-assignment-private/default/getter.template ++/*--- ++description: Logical-and assignment with target being a private reference (to an accessor property with getter) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ b. If _entry_.[[Set]] is *undefined*, throw a *TypeError* exception. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *false*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++class C { ++ get #field() { ++ return true; ++ } ++ compoundAssignment() { ++ return this.#field &&= false; ++ } ++} ++ ++const o = new C(); ++assert.throws(TypeError, () => o.compoundAssignment(), "PutValue throws when storing the result if no setter"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js +new file mode 100644 +index 0000000000000000000000000000000000000000..4eb987abc30e30c80c607170485479338eeacbde +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-nullish.js +@@ -0,0 +1,50 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/nullish.case ++// - src/logical-assignment-private/default/getter.template ++/*--- ++description: Nullish-coalescing assignment with target being a private reference (to an accessor property with getter) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ b. If _entry_.[[Set]] is *undefined*, throw a *TypeError* exception. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. If _lval_ is neither *undefined* nor *null*, return _lval_. ++ ... ++ 6. Perform ? PutValue(_lref_, _rval_). ++ 7. Return _rval_. ++---*/ ++ ++ ++class C { ++ get #field() { ++ return null; ++ } ++ compoundAssignment() { ++ return this.#field ??= 1; ++ } ++} ++ ++const o = new C(); ++assert.throws(TypeError, () => o.compoundAssignment(), "PutValue throws when storing the result if no setter"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js +new file mode 100644 +index 0000000000000000000000000000000000000000..1b6db870fd6dc5f21a89f4c163abaa63aeef7d1e +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-or.js +@@ -0,0 +1,51 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/or.case ++// - src/logical-assignment-private/default/getter.template ++/*--- ++description: Logical-or assignment with target being a private reference (to an accessor property with getter) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ b. If _entry_.[[Set]] is *undefined*, throw a *TypeError* exception. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *true*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++class C { ++ get #field() { ++ return false; ++ } ++ compoundAssignment() { ++ return this.#field ||= true; ++ } ++} ++ ++const o = new C(); ++assert.throws(TypeError, () => o.compoundAssignment(), "PutValue throws when storing the result if no setter"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-and.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-and.js +new file mode 100644 +index 0000000000000000000000000000000000000000..6b14acbb7cde88237cc4597d226585eacc50f733 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-and.js +@@ -0,0 +1,55 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/and.case ++// - src/logical-assignment-private/default/getter-short-circuit.template ++/*--- ++description: Logical-and assignment with target being a private reference (to an accessor property with getter (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ b. If _entry_.[[Set]] is *undefined*, throw a *TypeError* exception. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression &&= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *false*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ get #field() { ++ return false; ++ } ++ compoundAssignment() { ++ return this.#field &&= doNotCall(); ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), false, "The expression should evaluate to the short-circuit value"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-nullish.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-nullish.js +new file mode 100644 +index 0000000000000000000000000000000000000000..33df8df39ffb70bee05d9bde4447e095a4cb5825 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-nullish.js +@@ -0,0 +1,54 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/nullish.case ++// - src/logical-assignment-private/default/getter-short-circuit.template ++/*--- ++description: Nullish-coalescing assignment with target being a private reference (to an accessor property with getter (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ b. If _entry_.[[Set]] is *undefined*, throw a *TypeError* exception. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ??= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. If _lval_ is neither *undefined* nor *null*, return _lval_. ++ ... ++ 6. Perform ? PutValue(_lref_, _rval_). ++ 7. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ get #field() { ++ return 1; ++ } ++ compoundAssignment() { ++ return this.#field ??= doNotCall(); ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), 1, "The expression should evaluate to the short-circuit value"); +diff --git a/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-or.js b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-or.js +new file mode 100644 +index 0000000000000000000000000000000000000000..84a20fce9e07ebad7d4d0d29c3724191e2504f13 +--- /dev/null ++++ b/JSTests/test262/test/language/expressions/logical-assignment/left-hand-side-private-reference-readonly-accessor-property-short-circuit-or.js +@@ -0,0 +1,55 @@ ++// This file was procedurally generated from the following sources: ++// - src/logical-assignment-private/or.case ++// - src/logical-assignment-private/default/getter-short-circuit.template ++/*--- ++description: Logical-or assignment with target being a private reference (to an accessor property with getter (short-circuit version)) ++esid: sec-assignment-operators-runtime-semantics-evaluation ++features: [class-fields-private, logical-assignment-operators] ++flags: [generated] ++info: | ++ sec-property-accessors-runtime-semantics-evaluation ++ MemberExpression : MemberExpression `.` PrivateIdentifier ++ ++ 1. Let _baseReference_ be the result of evaluating |MemberExpression|. ++ 2. Let _baseValue_ be ? GetValue(_baseReference_). ++ 3. Let _fieldNameString_ be the StringValue of |PrivateIdentifier|. ++ 4. Return ! MakePrivateReference(_baseValue_, _fieldNameString_). ++ ++ PutValue (V, W) ++ ... ++ 5.b. If IsPrivateReference(_V_) is *true*, then ++ i. Return ? PrivateSet(_baseObj_, _V_.[[ReferencedName]], _W_). ++ ++ PrivateSet (O, P, value) ++ ... ++ 5.a. Assert: _entry_.[[Kind]] is ~accessor~. ++ b. If _entry_.[[Set]] is *undefined*, throw a *TypeError* exception. ++ ++ ++ sec-assignment-operators-runtime-semantics-evaluation ++ AssignmentExpression : LeftHandSideExpression ||= AssignmentExpression ++ 1. Let _lref_ be the result of evaluating |LeftHandSideExpression|. ++ 2. Let _lval_ be ? GetValue(_lref_). ++ 3. Let _lbool_ be ! ToBoolean(_lval_). ++ 4. If _lbool_ is *true*, return _lval_. ++ ... ++ 7. Perform ? PutValue(_lref_, _rval_). ++ 8. Return _rval_. ++---*/ ++ ++ ++function doNotCall() { ++ throw new Test262Error("The right-hand side should not be evaluated"); ++} ++ ++class C { ++ get #field() { ++ return true; ++ } ++ compoundAssignment() { ++ return this.#field ||= doNotCall(); ++ } ++} ++ ++const o = new C(); ++assert.sameValue(o.compoundAssignment(), true, "The expression should evaluate to the short-circuit value"); +diff --git a/JSTests/test262/test/language/expressions/unary-plus/S11.4.6_A3_T3.js b/JSTests/test262/test/language/expressions/unary-plus/S11.4.6_A3_T3.js +index 79bf732a2f2e51ff824dd64ee5b186223abf4ffe..9a3a2f6b49fb9c0d383842927eaa7045eb692cd6 100644 +--- a/JSTests/test262/test/language/expressions/unary-plus/S11.4.6_A3_T3.js ++++ b/JSTests/test262/test/language/expressions/unary-plus/S11.4.6_A3_T3.js +@@ -13,11 +13,21 @@ if (+"1" !== 1) { + } + + //CHECK#2 +-if (isNaN(+"x") !== true) { +- throw new Test262Error('#2: +"x" === Not-a-Number. Actual: ' + (+"x")); ++if (+new Number("-1") !== -1) { ++ throw new Test262Error('#2: +new String("-1") === -1. Actual: ' + (+new String("-1"))); + } + + //CHECK#3 +-if (+new Number("-1") !== -1) { +- throw new Test262Error('#3: +new String("-1") === -1. Actual: ' + (+new String("-1"))); ++if (isNaN(+"x") !== true) { ++ throw new Test262Error('#3: +"x" === Not-a-Number. Actual: ' + (+"x")); ++} ++ ++//CHECK#4 ++if (isNaN(+"INFINITY") !== true) { ++ throw new Test262Error('#4: +"INFINITY" === Not-a-Number. Actual: ' + (+"INFINITY")); ++} ++ ++//CHECK#5 ++if (isNaN(+"infinity") !== true) { ++ throw new Test262Error('#5: +"infinity" === Not-a-Number. Actual: ' + (+"infinity")); + } +diff --git a/JSTests/test262/test/language/statements/for-in/S12.6.4_A7_T2.js b/JSTests/test262/test/language/statements/for-in/S12.6.4_A7_T2.js +index 4ae8a3946ecf906e3030c10e59c744017cc3dba3..9cfbf9163610371235b2e20c50b97e7c2cd809ab 100644 +--- a/JSTests/test262/test/language/statements/for-in/S12.6.4_A7_T2.js ++++ b/JSTests/test262/test/language/statements/for-in/S12.6.4_A7_T2.js +@@ -13,7 +13,10 @@ description: > + + var __obj, __accum; + +-__obj={aa:1,ba:2,ca:3}; ++__obj = Object.create(null); ++__obj.aa = 1; ++__obj.ba = 2; ++__obj.ca = 3; + + __accum=""; + +@@ -21,33 +24,20 @@ for (var __key in __obj){ + + erasator_T_1000(__obj,"b"); + +- __accum+=(__key+__obj[__key]); ++ __accum+=(__key+__obj[__key]); + + } + +- +-////////////////////////////////////////////////////////////////////////////// +-//CHECK#1 +-if (!((__accum.indexOf("aa1")!==-1)&&(__accum.indexOf("ca3")!==-1))) { +- throw new Test262Error('#1: (__accum.indexOf("aa1")!==-1)&&(__accum.indexOf("ca3")!==-1)'); +-} +-// +-////////////////////////////////////////////////////////////////////////////// +- +-////////////////////////////////////////////////////////////////////////////// +-//CHECK#2 +-if (__accum.indexOf("ba2")!==-1) { +- throw new Test262Error('#2: __accum.indexOf("ba2") === -1. Actual: __accum.indexOf("ba2") ==='+ __accum.indexOf("ba2") ); +-} +-// +-////////////////////////////////////////////////////////////////////////////// +- ++assert( ++ __accum === "aa1ca3" || __accum === "ca3aa1", ++ "Unexpected value: '" + __accum + "'" ++); + + // erasator is the hash map terminator + function erasator_T_1000(hash_map, charactr){ +- for (var key in hash_map){ +- if (key.indexOf(charactr)===0) { +- delete hash_map[key]; +- }; +- } ++ for (var key in hash_map){ ++ if (key.indexOf(charactr)===0) { ++ delete hash_map[key]; ++ }; ++ } + } +diff --git a/JSTests/test262/test262-Revision.txt b/JSTests/test262/test262-Revision.txt +index 534b49f0030041247c5ab3fa0c02d021f2d0038c..4a81c5028fed82b860345e18d4d1a16e09bcd9db 100644 +--- a/JSTests/test262/test262-Revision.txt ++++ b/JSTests/test262/test262-Revision.txt +@@ -1,2 +1,2 @@ + test262 remote url: git@github.com:tc39/test262.git +-test262 revision: ec39db5877853f6c8703156af2530730bfdf59d5 ++test262 revision: 0a480293334c34a34f2cae012ddb4dfbd94e5782 +diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog +index 2efc62ebbb100878d9c1b8de4ca1fb4da972ec73..1f1a074d90b97966e327a6a6403a5df19427b1d1 100644 +--- a/LayoutTests/ChangeLog ++++ b/LayoutTests/ChangeLog +@@ -1,3 +1,911 @@ ++2022-05-10 Truitt Savell ++ ++ Rebase inspector/timeline/line-column.html for Mac ++ https://bugs.webkit.org/show_bug.cgi?id=240291 ++ ++ Unreviewed test gardening. ++ ++ * inspector/timeline/line-column-expected.txt: ++ ++2022-05-10 Tim Nguyen ++ ++ Fix inertness of pseudo-elements ++ https://bugs.webkit.org/show_bug.cgi?id=239831 ++ ++ Reviewed by Antti Koivisto. ++ ++ When we adjust style for a pseudo-element, `m_element` and `document().activeModalDialog()` are both null. So we accidentally reset inertness to false in those cases. ++ ++ Fix this by making checking for m_element's existence too. ++ ++ * platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-pseudo-element-hittest-expected.txt: Added. ++ ++2022-05-10 Brent Fulgham ++ ++ Remove abandoned CSSDeferredParser implementation and feature flag ++ https://bugs.webkit.org/show_bug.cgi?id=240244 ++ ++ Reviewed by Antti Koivisto. ++ ++ This patch rolls out the abandoned CSSDeferredParser implementation added in Bug 165743. ++ ++ * fast/css/deferred-parsing/dynamic-external-style-expected.txt: Removed. ++ * fast/css/deferred-parsing/dynamic-external-style.html: Removed. ++ * fast/css/deferred-parsing/dynamic-style-in-document-expected.txt: Removed. ++ * fast/css/deferred-parsing/dynamic-style-in-document.html: Removed. ++ * fast/css/deferred-parsing/hover-test-expected.txt: Removed. ++ * fast/css/deferred-parsing/hover-test.html: Removed. ++ * fast/css/deferred-parsing/keyframes-rule-expected.txt: Removed. ++ * fast/css/deferred-parsing/keyframes-rule.html: Removed. ++ * fast/css/deferred-parsing/media-print-expected.txt: Removed. ++ * fast/css/deferred-parsing/media-print.html: Removed. ++ * fast/css/deferred-parsing/nth-of-type-expected.txt: Removed. ++ * fast/css/deferred-parsing/nth-of-type.html: Removed. ++ * fast/css/deferred-parsing/resources/basic-sheet.css: Removed. ++ * fast/css/deferred-parsing/simple-external-style-expected.txt: Removed. ++ * fast/css/deferred-parsing/simple-external-style.html: Removed. ++ * fast/css/deferred-parsing/simple-style-in-document-expected.txt: Removed. ++ * fast/css/deferred-parsing/simple-style-in-document.html: Removed. ++ * fast/css/deferred-parsing/supports-rule-expected.txt: Removed. ++ * fast/css/deferred-parsing/supports-rule.html: Removed. ++ * platform/ios-wk2/TestExpectations: ++ * platform/ios/TestExpectations: ++ ++2022-05-09 Oriol Brufau ++ ++ [cssom] Don't index perspective/transform-origin-* in computed styles ++ https://bugs.webkit.org/show_bug.cgi?id=239670 ++ ++ Reviewed by Darin Adler. ++ ++ Update test expectations. ++ ++ * fast/css/getComputedStyle/computed-style-expected.txt: ++ * fast/css/getComputedStyle/computed-style-without-renderer-expected.txt: ++ * platform/gtk/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt: ++ * platform/gtk/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt: ++ * platform/ios/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt: ++ * platform/mac-wk1/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt: ++ * platform/wpe/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt: ++ * platform/wpe/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt: ++ * svg/css/getComputedStyle-basic-expected.txt: ++ ++2022-05-09 Nikolaos Mouchtaris ++ ++ Support ray() shape in offset-path ++ https://bugs.webkit.org/show_bug.cgi?id=233344 ++ ++ Reviewed by Simon Fraser. ++ ++ * TestExpectations: ++ ++2022-05-09 Tim Nguyen ++ ++ Implement CSS :modal pseudo class ++ https://bugs.webkit.org/show_bug.cgi?id=240109 ++ ++ Reviewed by Simon Fraser. ++ ++ Removes :-internal-modal-dialog from internal pseudo classes. ++ ++ * fast/css/pseudo-class-internal-expected.txt: ++ * fast/css/pseudo-class-internal.html: ++ ++2022-05-09 Arcady Goldmints-Orlov ++ ++ [GLIB] Update some test expectations for known failures ++ https://bugs.webkit.org/show_bug.cgi?id=240240 ++ ++ Unreviewed test garderning. ++ ++ * platform/glib/TestExpectations: ++ ++2022-05-08 Wenson Hsieh ++ ++ [iOS] Double tapping on YouTube video causes playback to pause instead of seek ++ https://bugs.webkit.org/show_bug.cgi?id=240222 ++ rdar://92637636 ++ ++ Reviewed by Aditya Keerthi and Kate Cheney. ++ ++ Add a new layout test. See WebKit/ChangeLog for more details. ++ ++ * fast/events/touch/ios/touch-events-when-double-tapping-after-selecting-text-expected.txt: Added. ++ * fast/events/touch/ios/touch-events-when-double-tapping-after-selecting-text.html: Added. ++ ++2022-05-09 Kate Cheney ++ ++ Image controls menu button is not appearing for multi-page PDFs ++ https://bugs.webkit.org/show_bug.cgi?id=240120 ++ rdar://86425721 ++ ++ Reviewed by Megan Gardner. ++ ++ * TestExpectations: ++ * fast/attachment/attachment-image-controls-basic.html: Added. ++ * platform/mac-wk2/TestExpectations: ++ * platform/mac/fast/attachment/attachment-image-controls-basic-expected.txt: Added. ++ ++2022-05-09 Ziran Sun ++ ++ Make input placeholder line-height declaration !important ++ https://bugs.webkit.org/show_bug.cgi?id=240225 ++ ++ Reviewed by Tim Nguyen. ++ ++ Unskip the test that passes. ++ * TestExpectations: ++ ++2022-05-09 Antoine Quint ++ ++ REGRESSION (r291817): NativeImage passed to RemoteResourceCacheProxy::recordNativeImageUse may be null ++ https://bugs.webkit.org/show_bug.cgi?id=239649 ++ rdar://92018859 ++ ++ Reviewed by Dean Jackson. ++ ++ * system-preview/svg-image-expected.html: Added. ++ * system-preview/svg-image.html: Added. ++ ++2022-05-09 Manuel Rego Casasnovas ++ ++ [WinCairo][WK1] accessibility/aria-combobox-control-owns-elements.html is crashing after 250325@main ++ https://bugs.webkit.org/show_bug.cgi?id=240218 ++ ++ ++ Reviewed by Joanmarie Diggs. ++ ++ * platform/wincairo-wk1/TestExpectations: Mark test as timeout as it ++ was before r293958. ++ ++2022-05-08 Fujii Hironori ++ ++ [WinCairo][WK1] accessibility/aria-combobox-control-owns-elements.html is crashing after 250325@main ++ https://bugs.webkit.org/show_bug.cgi?id=240218 ++ ++ ++ Unreviewed test gardening. ++ ++ * platform/wincairo-wk1/TestExpectations: Skip it. ++ ++2022-05-07 Cameron McCormack ++ ++ Don't propagate GraphicsContextState change bits into TextPainter's glyph display list recorder ++ https://bugs.webkit.org/show_bug.cgi?id=239952 ++ ++ ++ Reviewed by Antti Koivisto. ++ ++ * fast/text/glyph-display-list-color-expected.txt: Added. ++ * fast/text/glyph-display-list-color.html: Added. ++ ++2022-05-06 Megan Gardner ++ ++ Fix flakey test by using the old API on old systems. ++ https://bugs.webkit.org/show_bug.cgi?id=240195 ++ ++ Reviewed by Tim Horton. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-06 Patrick Griffis ++ ++ CSP: Fix script-src-elem policies in workers ++ https://bugs.webkit.org/show_bug.cgi?id=239840 ++ ++ Reviewed by Kate Cheney. ++ ++ CSP: Fix script-src-elem policies in workers ++ ++ * http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-and-script-src-elem-expected.txt: Added. ++ * http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-and-script-src-elem.html: Added. ++ ++2022-05-06 Karl Rackler ++ ++ [Gardening] REGRESSION (r293117): [ iOS ] fast/innerHTML/001.html is a flaky image failure ++ https://bugs.webkit.org/show_bug.cgi?id=240170 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-06 Karl Rackler ++ ++ [Gardening][ iOS ] fast/innerHTML/001.html is a flaky image failure ++ https://bugs.webkit.org/show_bug.cgi?id=240170 ++ ++ Reviewed by Jonathan Bedard. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-05 Ben Nham ++ ++ Add support for Notification objects with custom data ++ https://bugs.webkit.org/show_bug.cgi?id=240153 ++ ++ Reviewed by Chris Dumez. ++ ++ Test that Notification objects with custom data can be created and shown by both documents ++ and service workers. ++ ++ * http/tests/notifications/notification-expected.txt: ++ * http/tests/notifications/notification.html: ++ * http/tests/workers/service/getnotifications-expected.txt: ++ * http/tests/workers/service/getnotifications-stop-expected.txt: ++ * http/tests/workers/service/getnotifications-stop.html: ++ * http/tests/workers/service/getnotifications.html: ++ * http/tests/workers/service/openwindow-from-notification-click.html: ++ * http/tests/workers/service/resources/shownotification-openwindow-worker.js: ++ (async tryShow): ++ (async getNotes): ++ * http/tests/workers/service/resources/shownotification-worker.js: ++ (async event): ++ (async tryShow): ++ (async tryShowInvalidData.try.data): ++ (async tryShowInvalidData): ++ (async getNotes): ++ * http/tests/workers/service/shownotification-allowed-document-expected.txt: ++ * http/tests/workers/service/shownotification-allowed-document.html: ++ * http/tests/workers/service/shownotification-allowed.html: ++ * http/tests/workers/service/shownotification-invalid-data-expected.txt: Added. ++ * http/tests/workers/service/shownotification-invalid-data.html: Added. ++ ++2022-05-06 Brent Fulgham ++ ++ Remove the viewportFitEnabled WKPreference now that it is always on ++ https://bugs.webkit.org/show_bug.cgi?id=240147 ++ ++ Reviewed by Tim Horton. ++ ++ Remove the WKPreference 'ViewportFitEnabled' now that it is always enabled on all platforms, and ++ we do not wish to turn it off in testing or in other debugging circumstances. ++ ++ * fast/css/variables/env/ios/safe-area-inset-env-set-expected.html: ++ * fast/css/variables/env/ios/safe-area-inset-env-set.html: ++ * fast/events/ios/rotation/safe-area-insets-during-safari-type-rotation.html: ++ * fast/viewport/ios/viewport-fit-auto.html: ++ * fast/viewport/ios/viewport-fit-contain.html: ++ * fast/viewport/ios/viewport-fit-cover.html: ++ ++2022-05-06 Jer Noble ++ ++ [Cocoa] Seeking into a xHE-AAC track backed by a SourceBuffer can stall playback ++ https://bugs.webkit.org/show_bug.cgi?id=239750 ++ ++ ++ Reviewed by Eric Carlson. ++ ++ * media/media-source/content/test-xhe-aac-manifest.json: Added. ++ * media/media-source/content/test-xhe-aac.m4a: Added. ++ * media/media-source/media-mp4-xhe-aac-expected.txt: Added. ++ * media/media-source/media-mp4-xhe-aac.html: Added. ++ ++2022-05-06 Karl Rackler ++ ++ [ iOS ] fast/innerHTML/001.html is a flaky image failure ++ https://bugs.webkit.org/show_bug.cgi?id=240170 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-06 Patrick Griffis ++ ++ CSP: Fix incorrect blocked-uri for inline scripts and strict-dynamic policies ++ https://bugs.webkit.org/show_bug.cgi?id=240136 ++ ++ Reviewed by Kate Cheney. ++ ++ * http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-inline-report-expected.txt: Added. ++ * http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-inline-report.py: Added. ++ ++2022-05-06 Jer Noble ++ ++ Video playback fails when using postMessage() during a User Gesture ++ https://bugs.webkit.org/show_bug.cgi?id=239781 ++ ++ ++ Reviewed by Eric Carlson. ++ ++ * workers/worker-user-gesture-expected.txt: Added. ++ * workers/worker-user-gesture.html: Added. ++ * workers/worker-user-gesture.js: Added. ++ ++2022-05-06 Karl Rackler ++ ++ [ iOS Release ] fast/css-custom-paint/animate-repaint.html is a flaky failure ++ https://bugs.webkit.org/show_bug.cgi?id=240167 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-05 Karl Rackler ++ ++ [ iOS ] fast/images/exif-orientation-background-image-repeat.html is a consistent image failure ++ https://bugs.webkit.org/show_bug.cgi?id=240148 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-05 Manuel Rego Casasnovas ++ ++ ARIA reflection for Element attributes ++ https://bugs.webkit.org/show_bug.cgi?id=239852 ++ ++ Reviewed by Chris Dumez. ++ ++ Update test to include the new reflected attributes. ++ ++ * accessibility/ARIA-reflection-expected.txt: ++ * accessibility/ARIA-reflection.html: ++ ++2022-05-05 Karl Rackler ++ ++ [ iOS ][ Monterey Release wk2 ] imported/w3c/web-platform-tests/content-security-policy/inheritance/blob-url-in-main-window-self-navigate-inherits.sub.html is a flaky failure ++ https://bugs.webkit.org/show_bug.cgi?id=239568 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-05 Robert Jenner ++ ++ Remove and cleanup platform expectations folders ++ https://bugs.webkit.org/show_bug.cgi?id=240131 ++ ++ Unreviewed test gardening. ++ ++ * platform/mac-catalina-wk1/TestExpectations: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/anchor-element-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attrib-string-colors-with-color-filter-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attribute-string-for-copy-with-color-filter-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-1-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-2-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-3-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-4-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-5-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-with-style-1-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-with-style-2-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-for-typing-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-for-typing-with-color-filter-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/basic-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/comment-cdata-section-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/font-size-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/font-style-variant-effect-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/font-weight-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/letter-spacing-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/text-decorations-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/mac/attributed-string/vertical-align-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/selection/select-across-readonly-input-4-expected.txt: Removed. ++ * platform/mac-catalina-wk1/editing/selection/select-across-readonly-input-5-expected.txt: Removed. ++ * platform/mac-catalina-wk1/http/tests/cookies/js-get-and-set-http-only-cookie-expected.txt: Removed. ++ * platform/mac-catalina-wk1/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/mo-stretch-properties-dynamic-001-expected.txt: Removed. ++ * platform/mac-catalina-wk2/fast/events/contextmenu-lookup-action-for-image-expected.txt: Removed. ++ * platform/mac-catalina-wk2/http/tests/websocket/tests/hybi/send-object-tostring-check-expected.txt: Removed. ++ * platform/mac-catalina-wk2/http/tests/workers/service/serviceworker-websocket.https-expected.txt: Removed. ++ * platform/mac-catalina-wk2/imported/w3c/web-platform-tests/media-source/mediasource-invalid-codec-expected.txt: Removed. ++ * platform/mac-catalina-wk2/imported/w3c/web-platform-tests/service-workers/service-worker/websocket-in-service-worker.https-expected.txt: Removed. ++ * platform/mac-catalina-wk2/imported/w3c/web-platform-tests/service-workers/service-worker/websocket.https-expected.txt: Removed. ++ * platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/basic-auth.any-expected.txt: Removed. ++ * platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/basic-auth.any.worker-expected.txt: Removed. ++ * platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/remove-own-iframe-during-onerror.window-expected.txt: Removed. ++ * platform/mac-catalina/TestExpectations: Removed. ++ * platform/mac-catalina/editing/input/reveal-caret-of-multiline-input-expected.txt: Removed. ++ * platform/mac-catalina/editing/pasteboard/pasting-tabs-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/3690703-2-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/3690703-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/3690719-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/select-from-textfield-outwards-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-br-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-br-mixed-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-p-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-p-mixed-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-br-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-br-mixed-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-p-expected.txt: Removed. ++ * platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-p-mixed-expected.txt: Removed. ++ * platform/mac-catalina/fast/block/basic/001-expected.txt: Removed. ++ * platform/mac-catalina/fast/block/float/float-avoidance-expected.txt: Removed. ++ * platform/mac-catalina/fast/css/apple-system-control-colors-expected.txt: Removed. ++ * platform/mac-catalina/fast/css/continuationCrash-expected.txt: Removed. ++ * platform/mac-catalina/fast/css/rtl-ordering-expected.txt: Removed. ++ * platform/mac-catalina/fast/css/text-overflow-input-expected.txt: Removed. ++ * platform/mac-catalina/fast/dom/HTMLInputElement/input-slider-update-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/auto-fill-button/hide-auto-fill-strong-password-viewable-treatment-when-form-is-reset-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/basic-inputs-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/basic-textareas-quirks-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/box-shadow-override-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/button-positioned-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/button-sizes-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/date/date-input-rendering-basic-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/form-element-geometry-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/hidpi-textfield-background-bleeding-expected.html: Removed. ++ * platform/mac-catalina/fast/forms/input-appearance-height-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-appearance-preventDefault-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-appearance-spinbutton-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-appearance-spinbutton-up-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-button-sizes-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-disabled-color-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-placeholder-visibility-1-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-placeholder-visibility-3-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-readonly-dimmed-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-table-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-text-word-wrap-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/input-value-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/listbox-bidi-align-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/listbox-width-change-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/option-text-clip-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/plaintext-mode-2-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/range/input-appearance-range-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/range/slider-padding-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/range/slider-thumb-shared-style-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/range/thumbslider-no-parent-slider-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/search-rtl-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/search/search-size-with-decorations-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/search/search-zoom-computed-style-height-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/select-change-listbox-to-popup-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/select-change-popup-to-listbox-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/select-selected-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/select-visual-hebrew-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/select/optgroup-rendering-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/textAreaLineHeight-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/textarea-placeholder-visibility-1-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/textarea-placeholder-visibility-2-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/textfield-outline-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/time/time-input-rendering-basic-expected.txt: Removed. ++ * platform/mac-catalina/fast/forms/visual-hebrew-text-field-expected.txt: Removed. ++ * platform/mac-catalina/fast/parser/document-write-option-expected.txt: Removed. ++ * platform/mac-catalina/fast/parser/entity-comment-in-textarea-expected.txt: Removed. ++ * platform/mac-catalina/fast/parser/open-comment-in-textarea-expected.txt: Removed. ++ * platform/mac-catalina/fast/repaint/block-inputrange-repaint-expected.txt: Removed. ++ * platform/mac-catalina/fast/repaint/slider-thumb-drag-release-expected.txt: Removed. ++ * platform/mac-catalina/fast/sandbox/mac/sandbox-mach-lookup-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/backslash-to-yen-sign-euc-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/basic/014-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/capitalize-boundaries-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/drawBidiText-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/hyphenate-avoid-orphaned-word-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/hyphenate-character-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/hyphenate-first-word-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/hyphenate-limit-before-after-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/hyphenate-limit-lines-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/hyphenate-locale-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/hyphens-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/indic-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/bidi-fallback-font-weight-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/bidi-linebreak-001-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/bidi-linebreak-002-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/bidi-linebreak-003-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/danda-space-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/pop-up-button-text-alignment-and-direction-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/system-language/navigator-language/navigator-language-en-US-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/system-language/navigator-language/navigator-language-en-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/system-language/navigator-language/navigator-language-es-ES-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/system-language/navigator-language/navigator-language-es-MX-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/system-language/navigator-language/navigator-language-es-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/system-language/navigator-language/navigator-language-fr-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/system-language/navigator-language/navigator-language-hi-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/system-language/navigator-language/navigator-language-pt-BR-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/system-language/navigator-language/navigator-language-ru-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/international/system-language/system-font-punctuation-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/justify-ideograph-leading-expansion-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/midword-break-after-breakable-char-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/vertical-rl-rtl-linebreak-expected.txt: Removed. ++ * platform/mac-catalina/fast/text/vertical-rl-rtl-linebreak-mixed-expected.txt: Removed. ++ * platform/mac-catalina/http/tests/navigation/javascriptlink-frames-expected.txt: Removed. ++ * platform/mac-catalina/http/tests/xmlhttprequest/methods-async-expected.txt: Removed. ++ * platform/mac-catalina/http/tests/xmlhttprequest/methods-expected.txt: Removed. ++ * platform/mac-catalina/http/tests/xmlhttprequest/workers/methods-async-expected.txt: Removed. ++ * platform/mac-catalina/http/tests/xmlhttprequest/workers/methods-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any.worker-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/fetch/redirect-navigate/preserve-fragment-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/html/semantics/embedded-content/media-elements/mime-types/canPlayType-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/html/semantics/embedded-content/the-video-element/resize-during-playback-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/mo-minsize-maxsize-001-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/mo-stretch-properties-dynamic-001-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/operator-dictionary-combining-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/operator-dictionary-stretchy-001-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/operator-dictionary-stretchy-002-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/operator-dictionary-symmetric-001-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/operator-dictionary-symmetric-005-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/operator-dictionary-symmetric-006-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/relations/css-styling/ignored-properties-001-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/relations/css-styling/padding-border-margin/border-002-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/relations/css-styling/padding-border-margin/padding-002-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/mathml/relations/html5-tree/dynamic-childlist-001-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/media-source/mediasource-addsourcebuffer-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/media-source/mediasource-invalid-codec-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/websockets/interfaces/WebSocket/bufferedAmount/bufferedAmount-getting-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/xhr/send-entity-body-empty-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/xhr/send-entity-body-get-head-async-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/xhr/send-entity-body-get-head-expected.txt: Removed. ++ * platform/mac-catalina/imported/w3c/web-platform-tests/xhr/send-entity-body-none-expected.txt: Removed. ++ * platform/mac-catalina/inspector/css/get-system-fonts-expected.txt: Removed. ++ * platform/mac-catalina/media/media-can-play-webm-expected.txt: Removed. ++ * platform/mac-catalina/platform/mac/fast/loader/file-url-mimetypes-3-expected.txt: Removed. ++ * platform/mac-catalina/platform/mac/fast/text/bidi-fallback-font-weight-expected.txt: Removed. ++ * platform/mac-catalina/platform/mac/fast/text/international/Geeza-Pro-vertical-metrics-adjustment-expected.txt: Removed. ++ * platform/mac-catalina/platform/mac/fast/text/international/bidi-fallback-font-weight-expected.txt: Removed. ++ * platform/mac-catalina/svg/W3C-I18N/tspan-direction-rtl-expected.txt: Removed. ++ * platform/mac-catalina/svg/custom/svg-fonts-without-missing-glyph-expected.txt: Removed. ++ * platform/mac-catalina/svg/text/bidi-tspans-expected.txt: Removed. ++ * platform/mac-catalina/tables/mozilla/bugs/bug18359-expected.txt: Removed. ++ * platform/mac-catalina/tables/mozilla/bugs/bug2479-3-expected.txt: Removed. ++ * platform/mac-catalina/tables/mozilla/bugs/bug26178-expected.txt: Removed. ++ * platform/mac-catalina/tables/mozilla/bugs/bug30692-expected.txt: Removed. ++ * platform/mac-catalina/tables/mozilla/bugs/bug33855-expected.txt: Removed. ++ * platform/mac-catalina/tables/mozilla/bugs/bug60749-expected.txt: Removed. ++ * platform/mac-catalina/tables/mozilla/bugs/bug7342-expected.txt: Removed. ++ * platform/mac-catalina/tables/mozilla/other/wa_table_thtd_rowspan-expected.txt: Removed. ++ * platform/mac-catalina/tables/mozilla/other/wa_table_tr_align-expected.txt: Removed. ++ * platform/mac-catalina/transforms/2d/zoom-menulist-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/anchor-element-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attrib-string-colors-with-color-filter-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attribute-string-for-copy-with-color-filter-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-1-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-2-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-3-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-4-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-5-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-with-style-1-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-with-style-2-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attributed-string-for-typing-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/attributed-string-for-typing-with-color-filter-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/basic-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/comment-cdata-section-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/font-size-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/font-style-variant-effect-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/font-weight-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/letter-spacing-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/text-decorations-expected.txt: Removed. ++ * platform/mac-mojave-wk1/editing/mac/attributed-string/vertical-align-expected.txt: Removed. ++ * platform/mac-mojave-wk1/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any-expected.txt: Removed. ++ * platform/mac-mojave-wk1/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any.worker-expected.txt: Removed. ++ * platform/mac-mojave/css1/basic/inheritance-expected.txt: Removed. ++ * platform/mac-mojave/css2.1/t0602-c13-inh-underlin-00-e-expected.txt: Removed. ++ * platform/mac-mojave/css2.1/t0805-c5522-brdr-02-e-expected.txt: Removed. ++ * platform/mac-mojave/css2.1/t1202-counter-09-b-expected.txt: Removed. ++ * platform/mac-mojave/css2.1/t1202-counters-09-b-expected.txt: Removed. ++ * platform/mac-mojave/editing/input/reveal-caret-of-multiline-input-expected.txt: Removed. ++ * platform/mac-mojave/editing/mac/selection/context-menu-select-editability-expected.txt: Removed. ++ * platform/mac-mojave/editing/selection/3690703-2-expected.txt: Removed. ++ * platform/mac-mojave/editing/selection/3690703-expected.txt: Removed. ++ * platform/mac-mojave/editing/selection/3690719-expected.txt: Removed. ++ * platform/mac-mojave/fast/block/basic/001-expected.txt: Removed. ++ * platform/mac-mojave/fast/block/float/float-avoidance-expected.txt: Removed. ++ * platform/mac-mojave/fast/css-generated-content/014-expected.png: Removed. ++ * platform/mac-mojave/fast/css-generated-content/014-expected.txt: Removed. ++ * platform/mac-mojave/fast/css/apple-system-control-colors-expected.txt: Removed. ++ * platform/mac-mojave/fast/css/continuationCrash-expected.txt: Removed. ++ * platform/mac-mojave/fast/css/css3-nth-child-expected.txt: Removed. ++ * platform/mac-mojave/fast/css/line-height-font-order-expected.png: Removed. ++ * platform/mac-mojave/fast/css/line-height-font-order-expected.txt: Removed. ++ * platform/mac-mojave/fast/css/rtl-ordering-expected.txt: Removed. ++ * platform/mac-mojave/fast/css/text-overflow-input-expected.txt: Removed. ++ * platform/mac-mojave/fast/dom/34176-expected.txt: Removed. ++ * platform/mac-mojave/fast/dom/clone-node-dynamic-style-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/basic-inputs-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/button-positioned-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/button-sizes-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/date/date-input-rendering-basic-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/input-appearance-spinbutton-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/input-button-sizes-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/input-disabled-color-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/input-readonly-dimmed-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/input-text-word-wrap-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/listbox-bidi-align-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/listbox-width-change-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/option-text-clip-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/plaintext-mode-2-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/search-rtl-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/search/search-size-with-decorations-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/select-change-listbox-to-popup-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/select-change-popup-to-listbox-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/select-selected-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/select/optgroup-rendering-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/textfield-outline-expected.txt: Removed. ++ * platform/mac-mojave/fast/forms/time/time-input-rendering-basic-expected.txt: Removed. ++ * platform/mac-mojave/fast/images/image-controls-basic-expected.png: Removed. ++ * platform/mac-mojave/fast/indic-expected.txt: Removed. ++ * platform/mac-mojave/fast/invalid/003-expected.txt: Removed. ++ * platform/mac-mojave/fast/invalid/004-expected.txt: Removed. ++ * platform/mac-mojave/fast/invalid/nestedh3s-expected.txt: Removed. ++ * platform/mac-mojave/fast/overflow/007-expected.png: Removed. ++ * platform/mac-mojave/fast/overflow/007-expected.txt: Removed. ++ * platform/mac-mojave/fast/parser/document-write-option-expected.txt: Removed. ++ * platform/mac-mojave/fast/sandbox/mac/sandbox-mach-lookup-expected.txt: Removed. ++ * platform/mac-mojave/fast/selectors/018-expected.txt: Removed. ++ * platform/mac-mojave/fast/table/frame-and-rules-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/atsui-multiple-renderers-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/bidi-embedding-pop-and-push-same-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/font-weights-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/font-weights-zh-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/hyphenate-avoid-orphaned-word-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/hyphenate-character-expected.png: Removed. ++ * platform/mac-mojave/fast/text/hyphenate-character-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/hyphens-expected.png: Removed. ++ * platform/mac-mojave/fast/text/hyphens-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/indic-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/bidi-fallback-font-weight-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/bidi-mirror-he-ar-expected.png: Removed. ++ * platform/mac-mojave/fast/text/international/bidi-mirror-he-ar-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/danda-space-expected.png: Removed. ++ * platform/mac-mojave/fast/text/international/danda-space-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/pop-up-button-text-alignment-and-direction-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-en-US-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-en-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-419-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-ES-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-MX-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-fr-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-hi-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-ja-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-pt-BR-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-ru-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-zh-HK-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-zh-Hant-HK-expected.txt: Removed. ++ * platform/mac-mojave/fast/text/international/system-language/system-font-punctuation-expected.txt: Removed. ++ * platform/mac-mojave/http/tests/cookies/same-site/fetch-after-navigating-iframe-in-cross-origin-page-expected.txt: Removed. ++ * platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-cross-origin-redirect-expected.txt: Removed. ++ * platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-navigation-from-cross-origin-page-expected.txt: Removed. ++ * platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-navigation-initiated-from-iframe-in-cross-origin-page-expected.txt: Removed. ++ * platform/mac-mojave/http/tests/cookies/same-site/fetch-in-cross-origin-service-worker-expected.txt: Removed. ++ * platform/mac-mojave/http/tests/cookies/same-site/popup-cross-site-expected.txt: Removed. ++ * platform/mac-mojave/http/tests/cookies/same-site/popup-cross-site-post-expected.txt: Removed. ++ * platform/mac-mojave/http/tests/cookies/same-site/popup-same-site-via-cross-site-redirect-expected.txt: Removed. ++ * platform/mac-mojave/http/tests/inspector/network/resource-sizes-network-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/cors/access-control-expose-headers-parsing.window-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/cors/credentials-flag-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/cors/origin-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/css/css-fonts/generic-family-keywords-001-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/css/css-pseudo/text-selection-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/basic/header-value-combining.any-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/basic/header-value-combining.any.worker-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any.worker-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/fetch/content-type/script.window-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/fetch/nosniff/parsing-nosniff.window-actual.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/fetch/nosniff/parsing-nosniff.window-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/mathml/relations/css-styling/ignored-properties-001-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/mathml/relations/css-styling/padding-border-margin/padding-002-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getallresponseheaders-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getresponseheader.any-expected.txt: Removed. ++ * platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getresponseheader.any.worker-expected.txt: Removed. ++ * platform/mac-mojave/platform/mac/fast/text/international/bidi-fallback-font-weight-expected.txt: Removed. ++ * platform/mac-mojave/svg/W3C-SVG-1.1/animate-elem-46-t-expected.txt: Removed. ++ * platform/mac-mojave/svg/W3C-SVG-1.1/struct-use-01-t-expected.txt: Removed. ++ * platform/mac-mojave/svg/batik/text/textStyles-expected.txt: Removed. ++ * platform/mac-mojave/svg/custom/glyph-selection-arabic-forms-expected.txt: Removed. ++ * platform/mac-mojave/tables/mozilla/bugs/bug10296-1-expected.png: Removed. ++ * platform/mac-mojave/tables/mozilla/bugs/bug10296-1-expected.txt: Removed. ++ * platform/mac-mojave/tables/mozilla/bugs/bug139524-2-expected.png: Removed. ++ * platform/mac-mojave/tables/mozilla/bugs/bug139524-2-expected.txt: Removed. ++ * platform/mac-mojave/tables/mozilla/bugs/bug2479-3-expected.txt: Removed. ++ * platform/mac-mojave/tables/mozilla/bugs/bug30692-expected.txt: Removed. ++ * platform/mac-mojave/tables/mozilla/bugs/bug33855-expected.txt: Removed. ++ * platform/mac-mojave/tables/mozilla/other/wa_table_thtd_rowspan-expected.txt: Removed. ++ * platform/mac-mojave/tables/mozilla/other/wa_table_tr_align-expected.txt: Removed. ++ * platform/mac-mojave/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png: Removed. ++ * platform/mac-mojave/tables/mozilla_expected_failures/bugs/bug2479-5-expected.txt: Removed. ++ ++2022-05-05 Robert Jenner ++ ++ [ Catalina EWS ] webgl/2.0.0/* tests are flaky crashing ASSERTION FAILED: !needsLayout() ++ https://bugs.webkit.org/show_bug.cgi?id=229580 ++ ++ Unreviewed test gardening. Skip WebGL tests on mac-wk1. ++ ++ * platform/mac-wk1/TestExpectations: ++ ++2022-05-05 Karl Rackler ++ ++ [ iOS ][ macOS ] imported/w3c/web-platform-tests/webrtc/protocol/rtp-clockrate.html is a flaky failure ++ https://bugs.webkit.org/show_bug.cgi?id=240123 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ * platform/mac-wk2/TestExpectations: ++ ++2022-05-05 Karl Rackler ++ ++ [Gardening]REGRESSION (r293506): [ iOS ][ macOS ] imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html is a flaky failure ++ https://bugs.webkit.org/show_bug.cgi?id=240074 ++ ++ Unreviewed test gardening. ++ ++ * platform/mac-wk2/TestExpectations: ++ ++2022-05-05 Ziran Sun ++ ++ should have box-sizing: border-box in UA stylesheet ++ https://bugs.webkit.org/show_bug.cgi?id=197878 ++ ++ Reviewed by Tim Nguyen. ++ ++ * platform/glib/imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt: ++ * platform/mac-wk1/imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt: Copied from LayoutTests/imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt. ++ ++2022-05-04 Devin Rousso ++ ++ [Apple Pay] REGRESSION(r291588): `appearance: -apple-pay-button` doesn't work with `border-width: 0` ++ https://bugs.webkit.org/show_bug.cgi?id=240087 ++ ++ ++ Reviewed by Kate Cheney. ++ ++ * fast/css/appearance-apple-pay-button-border-width.html: Added. ++ * fast/css/appearance-apple-pay-button-border-width-expected-mismatch.html: Added. ++ ++ * TestExpectations: ++ * platform/ios/TestExpectations: ++ * platform/mac/TestExpectations: ++ ++2022-05-04 Alex Christensen ++ ++ Crash in WindowProxy::setDOMWindow ++ https://bugs.webkit.org/show_bug.cgi?id=232763 ++ ++ Reviewed by Chris Dumez. ++ ++ * fast/dom/set-dom-window-without-page-expected.txt: Added. ++ * fast/dom/set-dom-window-without-page.html: Added. ++ ++2022-05-04 Simon Fraser ++ ++ Improve logging of display list items in IPC messages ++ https://bugs.webkit.org/show_bug.cgi?id=240053 ++ ++ Reviewed by Cameron McCormack. ++ ++ Now that display list logging is debug only, these tests will only work in debug builds. ++ ++ * platform/mac/TestExpectations: ++ ++2022-05-04 Aditya Keerthi ++ ++ Indeterminate, checked checkboxes do not render correctly on iOS, GTK, and Windows ++ https://bugs.webkit.org/show_bug.cgi?id=240015 ++ rdar://92645056 ++ ++ Reviewed by Cameron McCormack. ++ ++ Added a reference test to to verify that indeterminate, checked ++ checkboxes have the same appearance as indeterminate checkboxes. ++ ++ * fast/forms/checkbox-checked-indeterminate-expected.html: Added. ++ * fast/forms/checkbox-checked-indeterminate.html: Added. ++ ++2022-05-04 Karl Rackler ++ ++ [ iOS ] fast/text/international/system-language/navigator-language/navigator-language-fr.html is a flaky failure ++ https://bugs.webkit.org/show_bug.cgi?id=240104 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-04 Karl Rackler ++ ++ [Gardening]REGRESSION(r293038):[ iOS ] fast/forms/auto-fill-button/input-auto-fill-button.html is a consistent failure ++ https://bugs.webkit.org/show_bug.cgi?id=240065 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-04 Karl Rackler ++ ++ Unreviewed revert ++ This reverts commit 250254@main because rebaseline resolved failure ++ https://bugs.webkit.org/show_bug.cgi?id=240065 ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-04 Karl Rackler ++ ++ [ iOS ][ macOS Debug wk1 ] webaudio/AudioBuffer/huge-buffer.html is a flaky timeout ++ https://bugs.webkit.org/show_bug.cgi?id=240081 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ * platform/mac-wk1/TestExpectations: ++ ++2022-05-04 Kate Cheney ++ ++ REGRESSION (r293427): [ iOS ] http/tests/quicklook/same-origin-xmlhttprequest-allowed.html is a constant crash and failure (240024) ++ https://bugs.webkit.org/show_bug.cgi?id=240024 ++ rdar://92678727 ++ ++ Reviewed by Wenson Hsieh. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-04 Karl Rackler ++ ++ [Gardening][iOS Mac ] imported/w3c/web-platform-tests/html/browsers/history/the-location-interface/same-hash.html is a flaky text failure ++ https://bugs.webkit.org/show_bug.cgi?id=237552 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ * platform/mac-wk1/TestExpectations: ++ ++2022-05-04 Karl Rackler ++ ++ REGRESSION (r293506): [ iOS ][ macOS ] imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html is a flaky failure ++ https://bugs.webkit.org/show_bug.cgi?id=240074 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ * platform/mac/TestExpectations: ++ ++2022-05-04 Karl Rackler ++ ++ [Rebaseline] REGRESSION (r293038):[ iOS ] fast/forms/auto-fill-button/input-auto-fill-button.html is a consistent failure ++ https://bugs.webkit.org/show_bug.cgi?id=240065 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/fast/forms/auto-fill-button/input-auto-fill-button-expected.txt: ++ ++2022-05-04 Karl Rackler ++ ++ [ iOS ] fast/css/continuationCrash.html is a consistent failure ++ https://bugs.webkit.org/show_bug.cgi?id=240069 ++ ++ Unreviewed test gardening. ++ ++ * platform/ios/TestExpectations: ++ ++2022-05-04 Ziran Sun ++ ++ [InputElement] Selection after type change needs to follow HTML specification ++ https://bugs.webkit.org/show_bug.cgi?id=237361 ++ ++ Reviewed by Chris Dumez. ++ ++ * platform/gtk/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt: ++ * platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt: ++ * platform/mac-wk1/imported/w3c/web-platform-tests/html/semantics/forms/textfieldselection/selection-start-end-extra-expected.txt: Copied from LayoutTests/imported/w3c/web-platform-tests/html/semantics/forms/textfieldselection/selection-start-end-extra-expected.txt. ++ * platform/mac-wk1/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt: ++ * platform/mac-wk2/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt: ++ ++2022-04-30 Philippe Normand ++ ++ [GStreamer] Mediastream mock audio interruption fixes after r290985 ++ https://bugs.webkit.org/show_bug.cgi?id=239926 ++ ++ Reviewed by Chris Dumez. ++ ++ * platform/glib/TestExpectations: Unflag mediastream tests now passing. ++ ++2022-05-04 Philippe Normand ++ ++ Web Inspector: Update jsmin to 3.0.1 ++ https://bugs.webkit.org/show_bug.cgi?id=239924 ++ ++ Reviewed by Yusuke Suzuki. ++ ++ * platform/gtk/inspector/timeline/line-column-expected.txt: ++ ++2022-05-03 Dan Glastonbury ++ ++ webgl/1.0.3/conformance/state/gl-object-get-calls.html times out after turning WebGL in GPUP on by default ++ https://bugs.webkit.org/show_bug.cgi?id=238691 ++ ++ ++ Unreviewed test gardening. ++ ++ * webgl/TestExpectations: ++ + 2022-05-03 Truitt Savell + + Some layout tests are failing on EWS but not post commit testing due to a OS difference +diff --git a/LayoutTests/TestExpectations b/LayoutTests/TestExpectations +index 13d2f0cf1439e4f402332cbe184379605c2606d5..fcad56e0e5863907175c128db95998721f8af6a8 100644 +--- a/LayoutTests/TestExpectations ++++ b/LayoutTests/TestExpectations +@@ -280,6 +280,7 @@ media/deactivate-audio-session.html [ Skip ] + fast/css/appearance-apple-pay-button.html [ Skip ] + fast/css/appearance-apple-pay-button-border-radius.html [ Skip ] + fast/css/appearance-apple-pay-button-border-radius-longhands.html [ Skip ] ++fast/css/appearance-apple-pay-button-border-width.html [ Skip ] + fast/css/appearance-apple-pay-button-default-corners.html [ Skip ] + fast/css/getComputedStyle/computed-style-apple-pay-button.html [ Skip ] + fast/css/webkit-named-image/apple-pay-logo-black [ Skip ] +@@ -661,7 +662,6 @@ imported/w3c/web-platform-tests/html/browsers/windows/iframe-cross-origin-print. + imported/w3c/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-008.html [ ImageOnlyFailure ] + imported/w3c/web-platform-tests/html/editing/editing-0/spelling-and-grammar-checking/spelling-markers-010.html [ ImageOnlyFailure ] + imported/w3c/web-platform-tests/html/rendering/bindings/the-select-element-0/option-label.html [ ImageOnlyFailure ] +-imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/input-placeholder-line-height.html [ ImageOnlyFailure ] + imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/lists/li-type-unsupported-lower-alpha.html [ ImageOnlyFailure ] + imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/lists/li-type-unsupported-lower-roman.html [ ImageOnlyFailure ] + imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/lists/li-type-unsupported-upper-alpha.html [ ImageOnlyFailure ] +@@ -3681,6 +3681,8 @@ webgl/1.0.x/conformance/glsl/misc/fragcolor-fragdata-invariant.html [ Pass ] + webgl/1.0.x/conformance/context/constants-and-properties.html [ Pass ] + webgl/1.0.x/conformance/extensions/webgl-multi-draw.html [ Pass Slow ] + ++# Debug builds on slower machines run close to the time out especially with GPUP enabled ++webkit.org/b/238691 [ Debug ] webgl/1.0.3/conformance/state/gl-object-get-calls.html [ Slow ] + + # WebGL conformance test suite 2.0.1 is skipped until 2.0.0 is retired. + webgl/2.0.y [ Skip ] +@@ -5072,23 +5074,15 @@ webkit.org/b/233340 imported/w3c/web-platform-tests/css/motion/offset-anchor-tra + webkit.org/b/233340 imported/w3c/web-platform-tests/css/motion/offset-anchor-transform-box-fill-box-002.html [ ImageOnlyFailure ] + webkit.org/b/233340 imported/w3c/web-platform-tests/css/motion/offset-anchor-transform-box-fill-box-003.html [ ImageOnlyFailure ] + +-# CSS motion path that depends on ray(), currently not implemented. +-webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-001.html [ ImageOnlyFailure ] +-webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-002.html [ ImageOnlyFailure ] +-webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-003.html [ ImageOnlyFailure ] +-webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-004.html [ ImageOnlyFailure ] +-webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-005.html [ ImageOnlyFailure ] +-webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-006.html [ ImageOnlyFailure ] ++# CSS motion path ray test failing due to getting wrong size from containing block. + webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-007.html [ ImageOnlyFailure ] +-webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-008.html [ ImageOnlyFailure ] +-webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-009.html [ ImageOnlyFailure ] ++ ++# CSS motion path needs to implement contain for ray: https://bugs.webkit.org/show_bug.cgi?id=240259. + webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-contain-001.html [ ImageOnlyFailure ] + webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-contain-002.html [ ImageOnlyFailure ] + webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-contain-003.html [ ImageOnlyFailure ] + webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-contain-004.html [ ImageOnlyFailure ] + webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-path-ray-contain-005.html [ ImageOnlyFailure ] +-webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-rotate-001.html [ ImageOnlyFailure ] +-webkit.org/b/233344 imported/w3c/web-platform-tests/css/motion/offset-rotate-002.html [ ImageOnlyFailure ] + + # IPC test failing in Debug mode due to assert. + [ Debug ] ipc/send-invalid-message.html [ Skip ] +@@ -5113,6 +5107,9 @@ imported/w3c/web-platform-tests/workers/modules/dedicated-worker-import-csp.html + # due to how MessagePort::dispatchMessages() is implemented. + imported/w3c/web-platform-tests/workers/shared-worker-name-via-options.html [ DumpJSConsoleLogInStdErr Failure Pass ] + ++# Display list logging is only available in debug ++[ Release ] fast/text/glyph-display-list-color.html [ Skip ] ++ + # Plugins + # FIXME: Remove these tests. + plugins/ [ Skip ] +@@ -5209,3 +5206,6 @@ webkit.org/b/239533 [ Debug ] editing/inserting/insert-list-user-select-none-cra + webkit.org/b/239550 fast/text/simple-line-hyphens-with-text-align.html [ ImageOnlyFailure ] + webkit.org/b/239550 fast/text/simple-line-layout-hyphen-limit-after.html [ ImageOnlyFailure ] + webkit.org/b/239550 fast/text/simple-line-layout-hyphen-limit-before.html [ ImageOnlyFailure ] ++ ++# Image controls menu is mac only. ++fast/attachment/attachment-image-controls-basic.html [ Skip ] +diff --git a/LayoutTests/accessibility/ARIA-reflection-expected.txt b/LayoutTests/accessibility/ARIA-reflection-expected.txt +index 9504b69bcbacd241b95854302ef5474e352a498e..e3feec30c4c7a9eafad1a94dedeec63f88bb80e7 100644 +--- a/LayoutTests/accessibility/ARIA-reflection-expected.txt ++++ b/LayoutTests/accessibility/ARIA-reflection-expected.txt +@@ -7,317 +7,292 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE + Test role < - > role + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["role"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("role", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty ++ ++Test ariaActiveDescendantElement < - > aria-activedescendant ++PASS element[currentProperty] is null ++PASS element.getAttribute(currentAttribute) is null ++PASS element.getAttribute(currentAttribute) is dataAttribute ++element.setAttribute("aria-activedescendant", otherData); ++PASS element[currentProperty] is otherDataProperty + + Test ariaAtomic < - > aria-atomic + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaAtomic"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-atomic", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaAutoComplete < - > aria-autocomplete + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaAutoComplete"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-autocomplete", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaBusy < - > aria-busy + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaBusy"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-busy", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaChecked < - > aria-checked + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaChecked"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-checked", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaColCount < - > aria-colcount + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaColCount"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-colcount", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaColIndex < - > aria-colindex + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaColIndex"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-colindex", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaColSpan < - > aria-colspan + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaColSpan"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-colspan", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaCurrent < - > aria-current + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaCurrent"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-current", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaDisabled < - > aria-disabled + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaDisabled"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-disabled", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty ++ ++Test ariaErrorMessageElement < - > aria-errormessage ++PASS element[currentProperty] is null ++PASS element.getAttribute(currentAttribute) is null ++PASS element.getAttribute(currentAttribute) is dataAttribute ++element.setAttribute("aria-errormessage", otherData); ++PASS element[currentProperty] is otherDataProperty + + Test ariaExpanded < - > aria-expanded + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaExpanded"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-expanded", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaHasPopup < - > aria-haspopup + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaHasPopup"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-haspopup", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaHidden < - > aria-hidden + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaHidden"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-hidden", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaInvalid < - > aria-invalid + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaInvalid"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-invalid", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaKeyShortcuts < - > aria-keyshortcuts + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaKeyShortcuts"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-keyshortcuts", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaLabel < - > aria-label + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaLabel"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-label", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaLevel < - > aria-level + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaLevel"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-level", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaLive < - > aria-live + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaLive"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-live", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaModal < - > aria-modal + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaModal"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-modal", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaMultiLine < - > aria-multiline + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaMultiLine"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-multiline", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaMultiSelectable < - > aria-multiselectable + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaMultiSelectable"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-multiselectable", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaOrientation < - > aria-orientation + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaOrientation"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-orientation", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaPlaceholder < - > aria-placeholder + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaPlaceholder"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-placeholder", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaPosInSet < - > aria-posinset + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaPosInSet"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-posinset", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaPressed < - > aria-pressed + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaPressed"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-pressed", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaReadOnly < - > aria-readonly + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaReadOnly"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-readonly", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaRelevant < - > aria-relevant + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaRelevant"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-relevant", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaRequired < - > aria-required + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaRequired"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-required", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaRoleDescription < - > aria-roledescription + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaRoleDescription"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-roledescription", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaRowCount < - > aria-rowcount + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaRowCount"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-rowcount", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaRowIndex < - > aria-rowindex + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaRowIndex"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-rowindex", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaRowSpan < - > aria-rowspan + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaRowSpan"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-rowspan", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaSelected < - > aria-selected + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaSelected"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-selected", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaSetSize < - > aria-setsize + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaSetSize"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-setsize", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaSort < - > aria-sort + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaSort"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-sort", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaValueMax < - > aria-valuemax + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaValueMax"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-valuemax", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaValueMin < - > aria-valuemin + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaValueMin"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-valuemin", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaValueNow < - > aria-valuenow + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaValueNow"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-valuenow", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + Test ariaValueText < - > aria-valuetext + PASS element[currentProperty] is null + PASS element.getAttribute(currentAttribute) is null +-element["ariaValueText"] = data; +-PASS element.getAttribute(currentAttribute) is data ++PASS element.getAttribute(currentAttribute) is dataAttribute + element.setAttribute("aria-valuetext", otherData); +-PASS element[currentProperty] is otherData ++PASS element[currentProperty] is otherDataProperty + + +-PASS count is 38 ++PASS count is 40 + PASS successfullyParsed is true + + TEST COMPLETE +diff --git a/LayoutTests/accessibility/ARIA-reflection.html b/LayoutTests/accessibility/ARIA-reflection.html +index 323b189c4e3e401a4ffd56d4cfee464729aff918..93a9b7a17f9a44e4cd11beca969f0ce57769ceee 100644 +--- a/LayoutTests/accessibility/ARIA-reflection.html ++++ b/LayoutTests/accessibility/ARIA-reflection.html +@@ -5,7 +5,8 @@ +
+ +
+- ++
++
+
+ +

+@@ -21,22 +22,40 @@ + var currentProperty; + var currentAttribute; + ++ function isElementReflectionProperty(property) { ++ switch (property) { ++ case "ariaActiveDescendantElement": ++ case "ariaErrorMessageElement": ++ return true; ++ } ++ return false; ++ } ++ ++ function convertPropertyToAttribute(property) { ++ if (isElementReflectionProperty(property)) ++ property = property.replace("Element", ""); ++ return property.replace("aria", "aria-").toLowerCase(); ++ } ++ + function testElement() { +- currentAttribute = currentProperty.replace("aria", "aria-").toLowerCase(); +- ++ currentAttribute = convertPropertyToAttribute(currentProperty); ++ + debug("\nTest " + currentProperty + " < - > " + currentAttribute); + shouldBeNull("element[currentProperty]"); + shouldBeNull("element.getAttribute(currentAttribute)"); +- ++ + // Set the property value +- debug("element[\"" + currentProperty + "\"] = data;"); +- element[currentProperty] = data; +- shouldBe("element.getAttribute(currentAttribute)", "data"); ++ dataProperty = isElementReflectionProperty(currentProperty) ? firstChild : data; ++ dataAttribute = isElementReflectionProperty(currentProperty) ? firstChild.id : data; ++ element[currentProperty] = dataProperty; ++ shouldBe("element.getAttribute(currentAttribute)", "dataAttribute"); + + // Set the attribute value ++ otherDataProperty = isElementReflectionProperty(currentProperty) ? secondChild : otherData; ++ otherDataAttribute = isElementReflectionProperty(currentProperty) ? secondChild.id : otherData; + debug("element.setAttribute(\"" + currentAttribute + "\", otherData);"); +- element.setAttribute(currentAttribute, otherData); +- shouldBe("element[currentProperty]", "otherData"); ++ element.setAttribute(currentAttribute, otherDataAttribute); ++ shouldBe("element[currentProperty]", "otherDataProperty"); + } + + function testRole() { +@@ -59,7 +78,7 @@ + } + + debug("\n"); +- shouldBe("count", "38"); ++ shouldBe("count", "40"); + + } else { + testFailed("Could not load accessibility controller"); +diff --git a/LayoutTests/fast/attachment/attachment-image-controls-basic.html b/LayoutTests/fast/attachment/attachment-image-controls-basic.html +new file mode 100644 +index 0000000000000000000000000000000000000000..08e5027ff7d6ea4bc11405a37521f30225c08a1f +--- /dev/null ++++ b/LayoutTests/fast/attachment/attachment-image-controls-basic.html +@@ -0,0 +1,13 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/LayoutTests/fast/css/appearance-apple-pay-button-border-width-expected-mismatch.html b/LayoutTests/fast/css/appearance-apple-pay-button-border-width-expected-mismatch.html +new file mode 100644 +index 0000000000000000000000000000000000000000..7c89b545c5ac0a2a9db0571749025946344396e3 +--- /dev/null ++++ b/LayoutTests/fast/css/appearance-apple-pay-button-border-width-expected-mismatch.html +@@ -0,0 +1 @@ ++
+diff --git a/LayoutTests/fast/css/appearance-apple-pay-button-border-width.html b/LayoutTests/fast/css/appearance-apple-pay-button-border-width.html +new file mode 100644 +index 0000000000000000000000000000000000000000..ef2dadf1d44d6d198585f9dfbddf97201f2b434e +--- /dev/null ++++ b/LayoutTests/fast/css/appearance-apple-pay-button-border-width.html +@@ -0,0 +1,9 @@ ++ ++
+diff --git a/LayoutTests/fast/css/deferred-parsing/dynamic-external-style-expected.txt b/LayoutTests/fast/css/deferred-parsing/dynamic-external-style-expected.txt +deleted file mode 100644 +index d2f009cf73ba5d7fca3ceb237b03ac055d485bac..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/dynamic-external-style-expected.txt ++++ /dev/null +@@ -1,12 +0,0 @@ +-This tests deferred parsing of CSS style rules. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +- +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 2 +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 1 +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/fast/css/deferred-parsing/dynamic-external-style.html b/LayoutTests/fast/css/deferred-parsing/dynamic-external-style.html +deleted file mode 100644 +index e9ff9ddc3f4a5eaa33ccd66e5e787f2ddfe7b150..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/dynamic-external-style.html ++++ /dev/null +@@ -1,36 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- +- +- +diff --git a/LayoutTests/fast/css/deferred-parsing/dynamic-style-in-document-expected.txt b/LayoutTests/fast/css/deferred-parsing/dynamic-style-in-document-expected.txt +deleted file mode 100644 +index d2f009cf73ba5d7fca3ceb237b03ac055d485bac..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/dynamic-style-in-document-expected.txt ++++ /dev/null +@@ -1,12 +0,0 @@ +-This tests deferred parsing of CSS style rules. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +- +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 2 +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 1 +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/fast/css/deferred-parsing/dynamic-style-in-document.html b/LayoutTests/fast/css/deferred-parsing/dynamic-style-in-document.html +deleted file mode 100644 +index 55f28e811749d78df83823ba010a721257b6e24a..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/dynamic-style-in-document.html ++++ /dev/null +@@ -1,52 +0,0 @@ +- +- +- +- +- +- +- +- +-
+- +- +- +- +- +diff --git a/LayoutTests/fast/css/deferred-parsing/hover-test-expected.txt b/LayoutTests/fast/css/deferred-parsing/hover-test-expected.txt +deleted file mode 100644 +index 2c98592feba39aa290f1aab1505122476b316286..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/hover-test-expected.txt ++++ /dev/null +@@ -1,11 +0,0 @@ +-Test that deferred parsing doesn't parse the :hover rule until the hover happens. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 1 +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 0 +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/fast/css/deferred-parsing/hover-test.html b/LayoutTests/fast/css/deferred-parsing/hover-test.html +deleted file mode 100644 +index d3ad4ad0d52f1bb2e6f58d7222b7393ba3593f82..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/hover-test.html ++++ /dev/null +@@ -1,48 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +diff --git a/LayoutTests/fast/css/deferred-parsing/keyframes-rule-expected.txt b/LayoutTests/fast/css/deferred-parsing/keyframes-rule-expected.txt +deleted file mode 100644 +index c193c9dd81a1eede173f9e90c366782c03f45938..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/keyframes-rule-expected.txt ++++ /dev/null +@@ -1,13 +0,0 @@ +-This tests deferred parsing of CSS style rules. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +- +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 0 +-PASS internals.deferredKeyframesRulesCount(document.styleSheets[0]) is 1 +-PASS internals.deferredKeyframesRulesCount(document.styleSheets[0]) is 0 +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/fast/css/deferred-parsing/keyframes-rule.html b/LayoutTests/fast/css/deferred-parsing/keyframes-rule.html +deleted file mode 100644 +index 832b99758e53d8b567d0cd576d11fdd22563d9c8..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/keyframes-rule.html ++++ /dev/null +@@ -1,40 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- +- +diff --git a/LayoutTests/fast/css/deferred-parsing/media-print-expected.txt b/LayoutTests/fast/css/deferred-parsing/media-print-expected.txt +deleted file mode 100644 +index 09a19f21b4e7388115db4c8fac61c9934989e6c8..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/media-print-expected.txt ++++ /dev/null +@@ -1,14 +0,0 @@ +-This tests deferred parsing of CSS style rules. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +- +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 0 +-PASS internals.deferredGroupRulesCount(document.styleSheets[0]) is 1 +-PASS internals.deferredGroupRulesCount(document.styleSheets[0]) is 0 +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 3 +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/fast/css/deferred-parsing/media-print.html b/LayoutTests/fast/css/deferred-parsing/media-print.html +deleted file mode 100644 +index f702cf9f5dbd82354a8d70bfdfc81d1e0defa6ef..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/media-print.html ++++ /dev/null +@@ -1,59 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- +diff --git a/LayoutTests/fast/css/deferred-parsing/nth-of-type-expected.txt b/LayoutTests/fast/css/deferred-parsing/nth-of-type-expected.txt +deleted file mode 100644 +index 1a577ea3cce6774d1ee3146076a7edfc6c26044f..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/nth-of-type-expected.txt ++++ /dev/null +@@ -1,13 +0,0 @@ +-This tests deferred parsing of CSS :nth-of-type style rules where some are invalid. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +- +-PASS document.styleSheets[0].cssRules.length is 4 +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 4 +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 2 +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/fast/css/deferred-parsing/nth-of-type.html b/LayoutTests/fast/css/deferred-parsing/nth-of-type.html +deleted file mode 100644 +index dd168157a54163d809f7415e95ce90d16a5fd113..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/nth-of-type.html ++++ /dev/null +@@ -1,46 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +diff --git a/LayoutTests/fast/css/deferred-parsing/resources/basic-sheet.css b/LayoutTests/fast/css/deferred-parsing/resources/basic-sheet.css +deleted file mode 100644 +index 8b39ca5959b490db30c4a8625e676b7ffeb8a715..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/resources/basic-sheet.css ++++ /dev/null +@@ -1,21 +0,0 @@ +-/* This rule should parse. */ +-body { +- color: black; +-} +- +-/* This rule should parse because it is empty. */ +-.unknown { +- +-} +- +-/* This rule should not parse. */ +-div#unknown { +- color:red; +-} +- +-/* This rule should not parse. */ +-quote { +- color:lime; +- background-color:blue; +- border:10px solid white; +-} +diff --git a/LayoutTests/fast/css/deferred-parsing/simple-external-style-expected.txt b/LayoutTests/fast/css/deferred-parsing/simple-external-style-expected.txt +deleted file mode 100644 +index 8f4c5815da25b41b0e6b08d22bbd8e2215c88243..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/simple-external-style-expected.txt ++++ /dev/null +@@ -1,11 +0,0 @@ +-This tests deferred parsing of CSS style rules. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +- +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 2 +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/fast/css/deferred-parsing/simple-external-style.html b/LayoutTests/fast/css/deferred-parsing/simple-external-style.html +deleted file mode 100644 +index dd73c02d9215a9ed1b3aba651820b5f8fc40920a..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/simple-external-style.html ++++ /dev/null +@@ -1,26 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- +diff --git a/LayoutTests/fast/css/deferred-parsing/simple-style-in-document-expected.txt b/LayoutTests/fast/css/deferred-parsing/simple-style-in-document-expected.txt +deleted file mode 100644 +index 8f4c5815da25b41b0e6b08d22bbd8e2215c88243..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/simple-style-in-document-expected.txt ++++ /dev/null +@@ -1,11 +0,0 @@ +-This tests deferred parsing of CSS style rules. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +- +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 2 +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/fast/css/deferred-parsing/simple-style-in-document.html b/LayoutTests/fast/css/deferred-parsing/simple-style-in-document.html +deleted file mode 100644 +index 974c4b9996db11e9263747182386a102098e0f34..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/simple-style-in-document.html ++++ /dev/null +@@ -1,45 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +diff --git a/LayoutTests/fast/css/deferred-parsing/supports-rule-expected.txt b/LayoutTests/fast/css/deferred-parsing/supports-rule-expected.txt +deleted file mode 100644 +index 09a19f21b4e7388115db4c8fac61c9934989e6c8..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/supports-rule-expected.txt ++++ /dev/null +@@ -1,14 +0,0 @@ +-This tests deferred parsing of CSS style rules. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +- +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 0 +-PASS internals.deferredGroupRulesCount(document.styleSheets[0]) is 1 +-PASS internals.deferredGroupRulesCount(document.styleSheets[0]) is 0 +-PASS internals.deferredStyleRulesCount(document.styleSheets[0]) is 3 +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/fast/css/deferred-parsing/supports-rule.html b/LayoutTests/fast/css/deferred-parsing/supports-rule.html +deleted file mode 100644 +index 637f2c7a1e43793aef15a2acdbf9846235069be3..0000000000000000000000000000000000000000 +--- a/LayoutTests/fast/css/deferred-parsing/supports-rule.html ++++ /dev/null +@@ -1,58 +0,0 @@ +- +- +- +- +- +- +- +- +- +- +- +- +diff --git a/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt b/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt +index c846ceb2d04653f2275fd49f88ab6a80f3ef35c7..57ca96c7f70c3b92ff8ffc4c8be9f7bdfe59a198 100644 +--- a/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt ++++ b/LayoutTests/fast/css/getComputedStyle/computed-style-expected.txt +@@ -149,6 +149,7 @@ page-break-before: auto; + page-break-inside: auto; + paint-order: normal; + perspective: none; ++perspective-origin: 392px 288px; + pointer-events: auto; + position: static; + print-color-adjust: economy; +@@ -187,6 +188,7 @@ text-shadow: none; + text-transform: none; + top: auto; + transform: none; ++transform-origin: 392px 288px; + transform-style: flat; + transition-delay: 0s; + transition-duration: 0s; +diff --git a/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt b/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt +index 9cbe8511918eefecf2400479169566f76832213b..2b72f38f251280817cce08c87571d0dbb2209233 100644 +--- a/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt ++++ b/LayoutTests/fast/css/getComputedStyle/computed-style-without-renderer-expected.txt +@@ -148,6 +148,7 @@ page-break-before: auto + page-break-inside: auto + paint-order: normal + perspective: none ++perspective-origin: 50% 50% + pointer-events: auto + position: static + print-color-adjust: economy +@@ -186,6 +187,7 @@ text-shadow: none + text-transform: none + top: auto + transform: none ++transform-origin: 50% 50% + transform-style: flat + transition-delay: 0s + transition-duration: 0s +diff --git a/LayoutTests/fast/css/pseudo-class-internal-expected.txt b/LayoutTests/fast/css/pseudo-class-internal-expected.txt +index 838ceb72f603a965894738b05ae879ab449fd6b5..53a246fb75e8505218df264ee8e5b2a762d60995 100644 +--- a/LayoutTests/fast/css/pseudo-class-internal-expected.txt ++++ b/LayoutTests/fast/css/pseudo-class-internal-expected.txt +@@ -4,7 +4,6 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE + + + PASS target.matches(":-internal-direct-focus") threw exception SyntaxError: The string did not match the expected pattern.. +-PASS target.matches(":-internal-modal-dialog") threw exception SyntaxError: The string did not match the expected pattern.. + PASS successfullyParsed is true + + TEST COMPLETE +diff --git a/LayoutTests/fast/css/pseudo-class-internal.html b/LayoutTests/fast/css/pseudo-class-internal.html +index 4243ad067f9fd347a2ae32082a512249f9851e32..2112634287940c9840ba25feff934eab492aa0c3 100644 +--- a/LayoutTests/fast/css/pseudo-class-internal.html ++++ b/LayoutTests/fast/css/pseudo-class-internal.html +@@ -10,7 +10,6 @@ description('This tests that -internal- pseudo classes are not exposed'); + function runTest() { + const internalPseudoClasses = [ + ':-internal-direct-focus', +- ':-internal-modal-dialog', + ]; + for (const pseudo of internalPseudoClasses) { + shouldThrowErrorName('target.matches("' + pseudo + '")', 'SyntaxError'); +diff --git a/LayoutTests/fast/css/variables/env/ios/safe-area-inset-env-set-expected.html b/LayoutTests/fast/css/variables/env/ios/safe-area-inset-env-set-expected.html +index c4dee78b9b7e096ab540a46547b8363acbadf023..7aa5caf06096144517fdbe1e4b12047dd4883323 100644 +--- a/LayoutTests/fast/css/variables/env/ios/safe-area-inset-env-set-expected.html ++++ b/LayoutTests/fast/css/variables/env/ios/safe-area-inset-env-set-expected.html +@@ -1,9 +1,5 @@ + + +- + + ++ ++ ++

Select me

++
Then double tap here
++

++
++
+\ No newline at end of file
+diff --git a/LayoutTests/fast/forms/checkbox-checked-indeterminate-expected.html b/LayoutTests/fast/forms/checkbox-checked-indeterminate-expected.html
+new file mode 100644
+index 0000000000000000000000000000000000000000..ffedc416b6c6635b3698a61097e2e4448f20170f
+--- /dev/null
++++ b/LayoutTests/fast/forms/checkbox-checked-indeterminate-expected.html
+@@ -0,0 +1,14 @@
++
++
++
++
++
++
++
++
++
++
+diff --git a/LayoutTests/fast/forms/checkbox-checked-indeterminate.html b/LayoutTests/fast/forms/checkbox-checked-indeterminate.html
+new file mode 100644
+index 0000000000000000000000000000000000000000..dc5af493f7a81f11f2892d1ec5a71aeda4c63c65
+--- /dev/null
++++ b/LayoutTests/fast/forms/checkbox-checked-indeterminate.html
+@@ -0,0 +1,14 @@
++
++
++
++
++
++
++
++
++
++
+diff --git a/LayoutTests/fast/frames/frame-window-as-callback-expected.txt b/LayoutTests/fast/frames/frame-window-as-callback-expected.txt
+index 5d777375c275847e7137659ab514fb31e648e504..389d6f00cb41fab132ed36a085a8355c0bc33cb2 100644
+--- a/LayoutTests/fast/frames/frame-window-as-callback-expected.txt
++++ b/LayoutTests/fast/frames/frame-window-as-callback-expected.txt
+@@ -3,7 +3,7 @@ Tests that we are using the right global object for DOM callbacks.
+ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+ 
+ 
+-PASS nextNodeError.constructor is f.contentWindow.TypeError
++PASS: Global object was the right one.
+ PASS successfullyParsed is true
+ 
+ TEST COMPLETE
+diff --git a/LayoutTests/fast/frames/frame-window-as-callback.html b/LayoutTests/fast/frames/frame-window-as-callback.html
+index 9325c4e27645b704c090ec6ca6656dadd04f1f9e..fbb9f26a2e679c043064bf06ccc344b2af5c518e 100644
+--- a/LayoutTests/fast/frames/frame-window-as-callback.html
++++ b/LayoutTests/fast/frames/frame-window-as-callback.html
+@@ -6,6 +6,7 @@
+ description("Tests that we are using the right global object for DOM callbacks.");
+ jsTestIsAsync = true;
+ 
++document.result = "PASS: Global object was the right one.";
+ var f = document.body.appendChild(document.createElement("iframe"));
+ f.onload = function() {
+     f.onload = null;
+@@ -14,14 +15,13 @@ f.onload = function() {
+         var iterator = document.createNodeIterator(document, NodeFilter.SHOW_ALL, f.contentWindow);
+         iterator.nextNode();
+     } catch(e) {
+-        window.nextNodeError = e;
++        e.constructor.constructor("debug(document.result)")();
+     }
+ 
+-    shouldBe("nextNodeError.constructor", "f.contentWindow.TypeError");
+     finishJSTest();
+ };
+ 
+-f.src = "resources/empty-body.html";
++f.src = "resources/wrong-global-object.html";
+ 
+ 
+ 
+diff --git a/LayoutTests/fast/frames/resources/wrong-global-object.html b/LayoutTests/fast/frames/resources/wrong-global-object.html
+new file mode 100644
+index 0000000000000000000000000000000000000000..998567c2c8fa9e9c36777862cefa090e55bb3077
+--- /dev/null
++++ b/LayoutTests/fast/frames/resources/wrong-global-object.html
+@@ -0,0 +1,4 @@
++
++
+diff --git a/LayoutTests/fast/text/glyph-display-list-color-expected.txt b/LayoutTests/fast/text/glyph-display-list-color-expected.txt
+new file mode 100644
+index 0000000000000000000000000000000000000000..899b99b50cc7b39c1a85d650d874505913601be0
+--- /dev/null
++++ b/LayoutTests/fast/text/glyph-display-list-color-expected.txt
+@@ -0,0 +1,6 @@
++
++(draw-glyphs
++  (local-anchor (0,0))
++  (anchor-point (0,0))
++  (length 9) extent at (0,0) size 0x0)
++
+diff --git a/LayoutTests/fast/text/glyph-display-list-color.html b/LayoutTests/fast/text/glyph-display-list-color.html
+new file mode 100644
+index 0000000000000000000000000000000000000000..86c4f4eea729559278bfac466e2e8e1f40586af6
+--- /dev/null
++++ b/LayoutTests/fast/text/glyph-display-list-color.html
+@@ -0,0 +1,27 @@
++
++
++
++
Some text
++

++
+diff --git a/LayoutTests/fast/viewport/ios/viewport-fit-auto.html b/LayoutTests/fast/viewport/ios/viewport-fit-auto.html
+index f27004a4dc1126c27509496341082602602133ba..8d5d85331a54c16b5b896f8613d2be34ae3d040d 100644
+--- a/LayoutTests/fast/viewport/ios/viewport-fit-auto.html
++++ b/LayoutTests/fast/viewport/ios/viewport-fit-auto.html
+@@ -2,10 +2,6 @@
+ 
+ 
+ 
+-    
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+     
+ 
+@@ -24,6 +25,7 @@ test(function() {
+     assert_equals(notification.body, "");
+     assert_equals(notification.tag, "");
+     assert_equals(notification.icon, "");
++    assert_equals(notification.data, null);
+ }, "The Notification object initializes its properties to their default values from the NotificationOptions dictionary if it is not provided.");
+ 
+ test(function() {
+@@ -32,7 +34,8 @@ test(function() {
+         lang: "en",
+         body: "test body",
+         tag: "test tag",
+-        icon: "foo.png"
++        icon: "foo.png",
++        data: {foo: 'bar'}
+     });
+ 
+     assert_equals(notification.title, "test title");
+@@ -41,8 +44,13 @@ test(function() {
+     assert_equals(notification.body, "test body");
+     assert_equals(notification.tag, "test tag");
+     assert_equals(notification.icon, "http://127.0.0.1:8000/notifications/foo.png");
++    assert_equals(JSON.stringify(notification.data), '{"foo":"bar"}')
+ }, "The Notification object initializes its properties to the values from NotificationOptions dictionary if it is provided.");
+ 
++test(function() {
++    assert_throws_dom('DataCloneError', function() { new Notification("title", { data: function() { } }); });
++}, "The Notification constructor should throw if it is passed a non-cloneable data option.");
++
+ test(function() {
+     let notification1 = new Notification("test title", { dir: "auto" });
+     assert_equals(notification1.dir, "auto");
+@@ -56,6 +64,17 @@ test(function() {
+     assert_throws_js(TypeError, function() { new Notification("test title", { dir: "foo" }) });
+ }, "The NotificationOptions dictionary only accepts valid NotificationDirection values.");
+ 
++promise_test(async function() {
++    let notification = new Notification("test title", { data: { foo: 'bar' } });
++    let data = notification.data;
++    assert_equals(JSON.stringify(data), '{"foo":"bar"}')
++    gc();
++    await new Promise(resolve => setTimeout(resolve, 10));
++    gc();
++    await new Promise(resolve => setTimeout(resolve, 10));
++    assert_equals(data, notification.data);
++}, "The Notification data property returns the same object after GC.");
++
+ 
+ 
+ 
+diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-and-script-src-elem-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-and-script-src-elem-expected.txt
+new file mode 100644
+index 0000000000000000000000000000000000000000..456519637146b5f1c37c871fea8c131d2d75671c
+--- /dev/null
++++ b/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-and-script-src-elem-expected.txt
+@@ -0,0 +1,2 @@
++ALERT: importScripts allowed
++
+diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-and-script-src-elem.html b/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-and-script-src-elem.html
+new file mode 100644
+index 0000000000000000000000000000000000000000..b998922b191bce9a493393b12304f3c2b29d9957
+--- /dev/null
++++ b/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-and-script-src-elem.html
+@@ -0,0 +1,28 @@
++
++
++
++
++
++
++
++
++
+diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-inline-report-expected.txt b/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-inline-report-expected.txt
+new file mode 100644
+index 0000000000000000000000000000000000000000..ea2b07e103473e769b6a2e6c72601bbcf6914132
+--- /dev/null
++++ b/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-inline-report-expected.txt
+@@ -0,0 +1,9 @@
++CONSOLE MESSAGE: Refused to execute a script because it does not appear in the script-src directive of the Content Security Policy.
++CSP report received:
++CONTENT_TYPE: application/csp-report
++HTTP_HOST: 127.0.0.1:8000
++HTTP_REFERER: http://127.0.0.1:8000/security/contentSecurityPolicy/script-src-strict-dynamic-inline-report.py
++REQUEST_METHOD: POST
++REQUEST_URI: /security/contentSecurityPolicy/resources/save-report.py
++=== POST DATA ===
++{"csp-report":{"document-uri":"http://127.0.0.1:8000/security/contentSecurityPolicy/script-src-strict-dynamic-inline-report.py","referrer":"","violated-directive":"script-src-elem","effective-directive":"script-src-elem","original-policy":"script-src 'nonce-dummy' 'strict-dynamic'; report-uri resources/save-report.py","blocked-uri":"inline","status-code":200}}
+diff --git a/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-inline-report.py b/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-inline-report.py
+new file mode 100755
+index 0000000000000000000000000000000000000000..42fae8b5eab443abba619e268aa7faa5b3181930
+--- /dev/null
++++ b/LayoutTests/http/tests/security/contentSecurityPolicy/script-src-strict-dynamic-inline-report.py
+@@ -0,0 +1,10 @@
++#!/usr/bin/env python3
++
++import sys
++
++sys.stdout.write(
++    "Content-Security-Policy: script-src 'nonce-dummy' 'strict-dynamic'; report-uri resources/save-report.py\r\n"
++    'Content-Type: text/html\r\n\r\n'
++    "\n"
++    '\n'
++)
+diff --git a/LayoutTests/http/tests/workers/service/getnotifications-expected.txt b/LayoutTests/http/tests/workers/service/getnotifications-expected.txt
+index 2ca25741b9987c9e1f22343fd0828ba783b2c4bf..e9e70eea9a606a3f7ccbcba9be59a2b557101e5b 100644
+--- a/LayoutTests/http/tests/workers/service/getnotifications-expected.txt
++++ b/LayoutTests/http/tests/workers/service/getnotifications-expected.txt
+@@ -15,32 +15,38 @@ There are 3 notifications
+ Title: Hello
+ Body: Body1
+ Tag: tag-a
++Data: null
+ Title: There
+ Body: Body2
+ Tag: tag-b
++Data: null
+ Title: Buddy
+ Body: Body3
+ Tag: tag-b
++Data: Data3
+ 
+ Got notifications
+ There are 1 notifications
+ Title: Hello
+ Body: Body1
+ Tag: tag-a
++Data: null
+ 
+ Got notifications
+ There are 2 notifications
+ Title: There
+ Body: Body2
+ Tag: tag-b
++Data: null
+ Title: Buddy
+ Body: Body3
+ Tag: tag-b
++Data: Data3
+ 
+ Retrieving notifications from page registration object - 3
+-Notification: Hello / Body1 / tag-a
+-Notification: There / Body2 / tag-b
+-Notification: Buddy / Body3 / tag-b
++Notification: Hello / Body1 / tag-a / null
++Notification: There / Body2 / tag-b / null
++Notification: Buddy / Body3 / tag-b / Data3
+ Retrieving notifications from page registration object - end
+ PASS successfullyParsed is true
+ 
+diff --git a/LayoutTests/http/tests/workers/service/getnotifications-stop-expected.txt b/LayoutTests/http/tests/workers/service/getnotifications-stop-expected.txt
+index a6d85b371fd04fdb50787618386c7d61a3229df6..f21c9cc1e8cfceb7776df52dbb7aa3ed796d0f97 100644
+--- a/LayoutTests/http/tests/workers/service/getnotifications-stop-expected.txt
++++ b/LayoutTests/http/tests/workers/service/getnotifications-stop-expected.txt
+@@ -15,35 +15,41 @@ There are 3 notifications
+ Title: Hello
+ Body: Body1
+ Tag: tag-a
++Data: null
+ Title: There
+ Body: Body2
+ Tag: tag-b
++Data: null
+ Title: Buddy
+ Body: Body3
+ Tag: tag-b
++Data: Data3
+ 
+ Got notifications
+ There are 1 notifications
+ Title: Hello
+ Body: Body1
+ Tag: tag-a
++Data: null
+ 
+ Got notifications
+ There are 2 notifications
+ Title: There
+ Body: Body2
+ Tag: tag-b
++Data: null
+ Title: Buddy
+ Body: Body3
+ Tag: tag-b
++Data: Data3
+ 
+ Loading iframe
+ Get notifications from iframe
+ Remove iframes to stop notifications
+ Retrieving notifications from page registration object - 3
+-Notification: Hello / Body1 / tag-a
+-Notification: There / Body2 / tag-b
+-Notification: Buddy / Body3 / tag-b
++Notification: Hello / Body1 / tag-a / null
++Notification: There / Body2 / tag-b / null
++Notification: Buddy / Body3 / tag-b / Data3
+ Retrieving notifications from page registration object - end
+ PASS successfullyParsed is true
+ 
+diff --git a/LayoutTests/http/tests/workers/service/getnotifications-stop.html b/LayoutTests/http/tests/workers/service/getnotifications-stop.html
+index e71dde1d5da74d650ec70d5f89e30f3f9466d0e3..34cd6bf1cba1994c68fad9f4b7667a97c583d566 100644
+--- a/LayoutTests/http/tests/workers/service/getnotifications-stop.html
++++ b/LayoutTests/http/tests/workers/service/getnotifications-stop.html
+@@ -66,7 +66,7 @@ async function gotNotes(event)
+     if (numberGot == 1) {
+         event.source.postMessage("tryshow|Hello|Body1|tag-a");
+         event.source.postMessage("tryshow|There|Body2|tag-b");
+-        event.source.postMessage("tryshow|Buddy|Body3|tag-b");
++        event.source.postMessage("tryshow|Buddy|Body3|tag-b|Data3");
+     } else if (numberGot == 4) {
+         debug("Loading iframe");
+         const frame = await with_iframe("resources/getNotifications-iframe.html");
+@@ -79,7 +79,7 @@ async function gotNotes(event)
+ 
+         debug("Retrieving notifications from page registration object - " + notifications.length);
+         notifications.forEach(notification => {
+-            debug("Notification: " + notification.title + " / " + notification.body + " / " + notification.tag);
++            debug("Notification: " + notification.title + " / " + notification.body + " / " + notification.tag + " / " + notification.data);
+         });    
+         debug("Retrieving notifications from page registration object - end");
+ 
+diff --git a/LayoutTests/http/tests/workers/service/getnotifications.html b/LayoutTests/http/tests/workers/service/getnotifications.html
+index 34ef31ecd5ae3f1d2d80674d14b5079b8a18ffe8..8fdafbc832002547369c336ad703ed9bda6ad17d 100644
+--- a/LayoutTests/http/tests/workers/service/getnotifications.html
++++ b/LayoutTests/http/tests/workers/service/getnotifications.html
+@@ -56,12 +56,12 @@ async function gotNotes(event)
+     if (numberGot == 1) {
+         event.source.postMessage("tryshow|Hello|Body1|tag-a");
+         event.source.postMessage("tryshow|There|Body2|tag-b");
+-        event.source.postMessage("tryshow|Buddy|Body3|tag-b");
++        event.source.postMessage("tryshow|Buddy|Body3|tag-b|Data3");
+     } else if (numberGot == 4) {
+         const notifications = await registration.getNotifications({ tag: "" });
+         debug("Retrieving notifications from page registration object - " + notifications.length);
+         notifications.forEach(notification => {
+-            debug("Notification: " + notification.title + " / " + notification.body + " / " + notification.tag);
++            debug("Notification: " + notification.title + " / " + notification.body + " / " + notification.tag + " / " + notification.data);
+         });    
+         debug("Retrieving notifications from page registration object - end");
+ 
+diff --git a/LayoutTests/http/tests/workers/service/openwindow-from-notification-click.html b/LayoutTests/http/tests/workers/service/openwindow-from-notification-click.html
+index 3c2cc7929c36d544418a772fbb83e51109df3d7b..681c0961cabb9395ad4b9efe3dd4c5eb06cfbfe8 100644
+--- a/LayoutTests/http/tests/workers/service/openwindow-from-notification-click.html
++++ b/LayoutTests/http/tests/workers/service/openwindow-from-notification-click.html
+@@ -37,7 +37,7 @@ async function registerServiceWorker() {
+ 
+     installingWorker.addEventListener("statechange", () => {
+         if (installingWorker.state === "activated") {
+-            installingWorker.postMessage("tryshow");
++            installingWorker.postMessage("tryshow|title|body|tag|foobar");
+         }
+     });
+ }
+@@ -55,7 +55,7 @@ navigator.serviceWorker.addEventListener('message', event => {
+     } else if (event.data == "shown") {
+         if (testRunner)
+             testRunner.simulateWebNotificationClickForServiceWorkerNotifications();
+-    } else if (event.data == "clicked") {
++    } else if (event.data == "clicked|data:foobar") {
+         shouldBeFalse("gotClicked");
+         shouldBeFalse("gotClosed");
+         gotClicked = true;
+diff --git a/LayoutTests/http/tests/workers/service/resources/shownotification-openwindow-worker.js b/LayoutTests/http/tests/workers/service/resources/shownotification-openwindow-worker.js
+index feb5d134dd530d9d0fb30d78bc8144aae1013286..1d3500877552e0f435ed8b004d4ec8b1ad21be9b 100644
+--- a/LayoutTests/http/tests/workers/service/resources/shownotification-openwindow-worker.js
++++ b/LayoutTests/http/tests/workers/service/resources/shownotification-openwindow-worker.js
+@@ -17,7 +17,7 @@ clients.openWindow('http://127.0.0.1:8000/workers/service/resources/openwindow-c
+ });
+ 
+ self.addEventListener('notificationclick', async function(event) {
+-    await messageClients("clicked");
++    await messageClients("clicked|data:" + event.notification.data);
+     event.notification.close();
+ 
+     // Should fail because about:blank is not an allowable URL
+@@ -49,21 +49,22 @@ self.addEventListener('notificationclose', async function(event) {
+ 
+ async function tryShow(message)
+ {
+-    var title, body, tag;
++    var command, title, body, tag, data;
+     var components = message.split('|');
+ 
+     if (components.length == 1) {
+         title = "This is a notification";        
+-    } else {
+-        title = components[1];
+-        body = components[2];
+-        tag = components[3];
++    } else if (components.length == 4) {
++        [command, title, body, tag] = components;
++    } else if (components.length == 5) {
++        [command, title, body, tag, data] = components;
+     }
+     
+     try {
+         await registration.showNotification(title, {
+             body: body,
+-            tag: tag
++            tag: tag,
++            data: data
+         });
+     } catch(error) {
+         await messageClients("showFailed");
+@@ -93,6 +94,7 @@ async function getNotes(message)
+         reply += "Title: " + notification.title + "|";
+         reply += "Body: " + notification.body + "|";
+         reply += "Tag: " + notification.tag + "|";
++        reply += "Data: " + notification.data + "|";
+     }
+     await messageClients(reply);
+ }
+diff --git a/LayoutTests/http/tests/workers/service/resources/shownotification-worker.js b/LayoutTests/http/tests/workers/service/resources/shownotification-worker.js
+index 7e4692bae57d29010ac1b2b7ba3155535a485987..690469a32d8f90fa965a5b0960ec0d81f7b875af 100644
+--- a/LayoutTests/http/tests/workers/service/resources/shownotification-worker.js
++++ b/LayoutTests/http/tests/workers/service/resources/shownotification-worker.js
+@@ -9,7 +9,7 @@ let messageClients = async function(msg) {
+ }
+ 
+ self.addEventListener('notificationclick', async function(event) {
+-    await messageClients("clicked");
++    await messageClients("clicked|data:" + event.notification.data);
+     event.notification.close();
+ });
+ 
+@@ -19,15 +19,15 @@ self.addEventListener('notificationclose', async function(event) {
+ 
+ async function tryShow(message)
+ {
+-    var title, body, tag;
++    var command, title, body, tag, data;
+     var components = message.split('|');
+ 
+     if (components.length == 1) {
+         title = "This is a notification";        
+-    } else {
+-        title = components[1];
+-        body = components[2];
+-        tag = components[3];
++    } else if (components.length == 4) {
++        [command, title, body, tag] = components;
++    } else if (components.length == 5) {
++        [command, title, body, tag, data] = components;
+     }
+ 
+     if (!self.Notification) {
+@@ -37,7 +37,8 @@ async function tryShow(message)
+     try {
+          new Notification(title, {
+             body: body,
+-            tag: tag
++            tag: tag,
++            data: data
+         });
+         await messageClients("showFailed due to Notification created from constructor");
+         return;
+@@ -51,7 +52,8 @@ async function tryShow(message)
+     try {
+         await registration.showNotification(title, {
+             body: body,
+-            tag: tag
++            tag: tag,
++            data: data
+         });
+     } catch(error) {
+         await messageClients("showFailed");
+@@ -61,6 +63,21 @@ async function tryShow(message)
+     await messageClients("shown");
+ }
+ 
++async function tryShowInvalidData()
++{
++    let error = null;
++    try {
++        await registration.showNotification("Invalid notification", { data: function() { } });
++    } catch (e) {
++        error = e;
++    }
++
++    if (error)
++        await messageClients("showFailed: threw " + error.name);
++    else if (error0)
++        await messageClients("shown");
++}
++
+ var seenNotes = new Set();
+ 
+ async function getNotes(message)
+@@ -81,6 +98,7 @@ async function getNotes(message)
+         reply += "Title: " + notification.title + "|";
+         reply += "Body: " + notification.body + "|";
+         reply += "Tag: " + notification.tag + "|";
++        reply += "Data: " + notification.data + "|";
+     }
+     await messageClients(reply);
+ }
+@@ -89,6 +107,8 @@ self.addEventListener('message', async function(event) {
+     var messageName = event.data.split('|')[0];
+     if (messageName == "tryshow")
+         await tryShow(event.data);
++    if (messageName == "tryshowinvaliddata")
++        await tryShowInvalidData();
+     if (messageName == "getnotes")
+         await getNotes(event.data);
+ });
+diff --git a/LayoutTests/http/tests/workers/service/shownotification-allowed-document-expected.txt b/LayoutTests/http/tests/workers/service/shownotification-allowed-document-expected.txt
+index 9018fcebf6732f78803b19165ad3bffd6d1c76da..7d7c66b3c2ba5443d9f1af7d85888b2843357ddd 100644
+--- a/LayoutTests/http/tests/workers/service/shownotification-allowed-document-expected.txt
++++ b/LayoutTests/http/tests/workers/service/shownotification-allowed-document-expected.txt
+@@ -4,6 +4,7 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
+ 
+ 
+ PASS Notification.permission is "granted"
++PASS threwDataCloneError is true
+ PASS gotClicked is false
+ PASS gotClosed is false
+ PASS gotClicked is true
+diff --git a/LayoutTests/http/tests/workers/service/shownotification-allowed-document.html b/LayoutTests/http/tests/workers/service/shownotification-allowed-document.html
+index 1f4328f400519e16384692f84e807e3b28e91042..5f9bb614ba4bf2d0dd6c458d2370f63c6bae2b8c 100644
+--- a/LayoutTests/http/tests/workers/service/shownotification-allowed-document.html
++++ b/LayoutTests/http/tests/workers/service/shownotification-allowed-document.html
+@@ -20,6 +20,8 @@ description("This tests that a notification shown by a service worker registrati
+ 
+ shouldBeEqualToString("Notification.permission", "granted");
+ 
++var threwDataCloneError = false;
++
+ async function registerServiceWorker() {
+     var registration = await navigator.serviceWorker.register('resources/shownotification-worker.js');
+ 
+@@ -37,7 +39,14 @@ async function registerServiceWorker() {
+ 
+     installingWorker.addEventListener("statechange", async () => {
+         if (installingWorker.state === "activated") {
+-            await registration.showNotification("This is a notification", { body: "body", tag: "tag" });
++            try {
++                await registration.showNotification("Invalid notification", { data: function() { } });
++            } catch (error) {
++                threwDataCloneError = error.name == 'DataCloneError';
++            }
++            shouldBeTrue('threwDataCloneError');
++
++            await registration.showNotification("This is a notification", { body: "body", tag: "tag", data: "foobar" });
+             if (window.testRunner)
+                 testRunner.simulateWebNotificationClickForServiceWorkerNotifications();
+         }
+@@ -50,7 +59,7 @@ var gotClosed = false;
+ navigator.serviceWorker.addEventListener('message', async event => {
+     if (event.data == "showFailed") {
+         failTheTest("Unexpectedly received the failed-to-show message");
+-    } else if (event.data == "clicked") {
++    } else if (event.data == "clicked|data:foobar") {
+         shouldBeFalse("gotClicked");
+         shouldBeFalse("gotClosed");
+         gotClicked = true;
+diff --git a/LayoutTests/http/tests/workers/service/shownotification-allowed.html b/LayoutTests/http/tests/workers/service/shownotification-allowed.html
+index 766abfee51ca3ad24cea8478f389beaada86ad1c..32df3586dcb5c6a3b91f3c6748708592f0525009 100644
+--- a/LayoutTests/http/tests/workers/service/shownotification-allowed.html
++++ b/LayoutTests/http/tests/workers/service/shownotification-allowed.html
+@@ -37,7 +37,7 @@ async function registerServiceWorker() {
+ 
+     installingWorker.addEventListener("statechange", () => {
+         if (installingWorker.state === "activated") {
+-            installingWorker.postMessage("tryshow");
++            installingWorker.postMessage("tryshow|title|body|tag|foobar");
+         }
+     });
+ }
+@@ -57,7 +57,7 @@ navigator.serviceWorker.addEventListener('message', async event => {
+ 
+         if (testRunner)
+             testRunner.simulateWebNotificationClickForServiceWorkerNotifications();
+-    } else if (event.data == "clicked") {
++    } else if (event.data == "clicked|data:foobar") {
+         shouldBeFalse("gotClicked");
+         shouldBeFalse("gotClosed");
+         gotClicked = true;
+diff --git a/LayoutTests/http/tests/workers/service/shownotification-invalid-data-expected.txt b/LayoutTests/http/tests/workers/service/shownotification-invalid-data-expected.txt
+new file mode 100644
+index 0000000000000000000000000000000000000000..8ceac45ec73a5cc373bc950874087a51bffe6aed
+--- /dev/null
++++ b/LayoutTests/http/tests/workers/service/shownotification-invalid-data-expected.txt
+@@ -0,0 +1,11 @@
++This tests that a notification shown by a service worker fails if it is passed an invalid data option
++
++On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
++
++
++PASS Notification.permission is "granted"
++PASS Notification constructor failed with DataCloneError
++PASS successfullyParsed is true
++
++TEST COMPLETE
++
+diff --git a/LayoutTests/http/tests/workers/service/shownotification-invalid-data.html b/LayoutTests/http/tests/workers/service/shownotification-invalid-data.html
+new file mode 100644
+index 0000000000000000000000000000000000000000..31e83df4b3ba7bdc085514a7fe950cad7caab987
+--- /dev/null
++++ b/LayoutTests/http/tests/workers/service/shownotification-invalid-data.html
+@@ -0,0 +1,52 @@
++
++
++
++
++
++
++
+diff --git a/LayoutTests/imported/w3c/ChangeLog b/LayoutTests/imported/w3c/ChangeLog
+index 2d6b0b1c5bab266d8c91a0eb41d5915cd51caf48..e4d5d6965aaf7b9e5dbf570f080898058206ffce 100644
+--- a/LayoutTests/imported/w3c/ChangeLog
++++ b/LayoutTests/imported/w3c/ChangeLog
+@@ -1,3 +1,113 @@
++2022-05-10  Tim Nguyen  
++
++        Fix inertness of pseudo-elements
++        https://bugs.webkit.org/show_bug.cgi?id=239831
++
++        Reviewed by Antti Koivisto.
++
++        When we adjust style for a pseudo-element, `m_element` and `document().activeModalDialog()` are both null. So we accidentally reset inertness to false in those cases.
++
++        Fix this by making checking for m_element's existence too.
++
++        * web-platform-tests/inert/inert-pseudo-element-hittest-expected.txt: Added.
++        * web-platform-tests/inert/inert-pseudo-element-hittest.html: Added.
++
++2022-05-09  Oriol Brufau  
++
++        [cssom] Don't index perspective/transform-origin-* in computed styles
++        https://bugs.webkit.org/show_bug.cgi?id=239670
++
++        Reviewed by Darin Adler.
++
++        Update some test expectations.
++
++        Add serialize-all-longhands.html, it still fails due to
++        https://webkit.org/b/239965 and https://webkit.org/b/239989.
++
++        * web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt:
++        * web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt:
++        * web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt:
++        * web-platform-tests/css/cssom/serialize-all-longhands-expected.txt: Added.
++        * web-platform-tests/css/cssom/serialize-all-longhands.html: Added.
++
++2022-05-09  Tim Nguyen  
++
++        Implement CSS :modal pseudo class
++        https://bugs.webkit.org/show_bug.cgi?id=240109
++
++        Reviewed by Simon Fraser.
++
++        Add and extend tests for :modal pseudo-class.
++
++        * web-platform-tests/css/selectors/invalidation/modal-pseudo-class-in-has-expected.txt: Added.
++        * web-platform-tests/css/selectors/invalidation/modal-pseudo-class-in-has.html: Added.
++        * web-platform-tests/html/semantics/interactive-elements/the-dialog-element/dialog-show-modal.html:
++
++2022-05-06  Rob Buis  
++
++        Use correct document as root for lazy image observer
++        https://bugs.webkit.org/show_bug.cgi?id=240083
++
++        Reviewed by Simon Fraser.
++
++        Add a test for scrolling a lazy loaded image into view in an iframe.
++
++        * web-platform-tests/html/semantics/embedded-content/the-img-element/scrolling-below-viewport-image-lazy-loading-in-iframe-expected.txt: Added.
++        * web-platform-tests/html/semantics/embedded-content/the-img-element/scrolling-below-viewport-image-lazy-loading-in-iframe.html: Added.
++
++2022-05-06  Manuel Rego Casasnovas  
++
++        [selectors] Double script focus after mouse click shouldn't match :focus-visible
++        https://bugs.webkit.org/show_bug.cgi?id=239472
++        
++
++        Reviewed by Antti Koivisto.
++
++        * web-platform-tests/css/selectors/focus-visible-script-focus-020-expected.txt: Added.
++        * web-platform-tests/css/selectors/focus-visible-script-focus-020.html: Added.
++
++2022-05-05  Ben Nham  
++        
++        Add support for Notification objects with custom data
++        https://bugs.webkit.org/show_bug.cgi?id=240153
++
++        Reviewed by Chris Dumez.
++
++        * web-platform-tests/notifications/idlharness.https.any-expected.txt:
++        * web-platform-tests/notifications/idlharness.https.any.serviceworker-expected.txt:
++        * web-platform-tests/wasm/serialization/module/serialization-via-notifications-api.any-expected.txt:
++
++2022-05-05  Manuel Rego Casasnovas  
++
++        ARIA reflection for Element attributes
++        https://bugs.webkit.org/show_bug.cgi?id=239852
++
++        Reviewed by Chris Dumez.
++
++        Small fix on the test and update test results with the new PASS.
++        Add new test case to cover elements moved to a different document.
++
++        * web-platform-tests/dom/nodes/aria-element-reflection.tentative-expected.txt:
++        * web-platform-tests/dom/nodes/aria-element-reflection.tentative.html:
++
++2022-05-05  Ziran Sun  
++
++         should have box-sizing: border-box in UA stylesheet
++        https://bugs.webkit.org/show_bug.cgi?id=197878
++
++        Reviewed by Tim Nguyen.
++
++        * web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt:
++
++2022-05-04  Ziran Sun  
++
++        [InputElement] Selection after type change needs to follow HTML specification
++        https://bugs.webkit.org/show_bug.cgi?id=237361
++
++        Reviewed by Chris Dumez.
++
++        * web-platform-tests/html/semantics/forms/textfieldselection/selection-start-end-extra-expected.txt:
++
+ 2022-05-03  Youenn Fablet  
+ 
+         ServiceWorkerRegistration update should fail if called from an installing service worker context
+diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt
+index 6f720c9ae24e44987e21ee703b17dc42ef812c07..c5cec17b71a654e5705d975356a672889d1a7cc4 100644
+--- a/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt
++++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt
+@@ -239,8 +239,7 @@ PASS page-break-before
+ PASS page-break-inside
+ PASS paint-order
+ PASS perspective
+-PASS perspective-origin-x
+-PASS perspective-origin-y
++PASS perspective-origin
+ PASS pointer-events
+ PASS position
+ PASS print-color-adjust
+@@ -317,9 +316,7 @@ PASS top
+ PASS touch-action
+ PASS transform
+ PASS transform-box
+-PASS transform-origin-x
+-PASS transform-origin-y
+-PASS transform-origin-z
++PASS transform-origin
+ PASS transform-style
+ PASS transition-delay
+ PASS transition-duration
+diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt
+index c249e8d12c202b3326e730d6d20f0331a27b02e6..7abe10c543f7713fd5ce490b689400f3c30907c7 100644
+--- a/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt
++++ b/LayoutTests/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt
+@@ -236,8 +236,7 @@ PASS page-break-before
+ PASS page-break-inside
+ PASS paint-order
+ PASS perspective
+-FAIL perspective-origin-x assert_not_equals: Should have the initial value. got disallowed value ""
+-FAIL perspective-origin-y assert_not_equals: Should have the initial value. got disallowed value ""
++PASS perspective-origin
+ PASS pointer-events
+ PASS position
+ PASS print-color-adjust
+@@ -313,9 +312,7 @@ PASS top
+ PASS touch-action
+ PASS transform
+ PASS transform-box
+-FAIL transform-origin-x assert_not_equals: Should have the initial value. got disallowed value ""
+-FAIL transform-origin-y assert_not_equals: Should have the initial value. got disallowed value ""
+-FAIL transform-origin-z assert_not_equals: Should have the initial value. got disallowed value ""
++PASS transform-origin
+ PASS transform-style
+ PASS transition-delay
+ PASS transition-duration
+diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt
+index c80c4e3d066218cd20fcf976e5beddc83fcdd9e7..f09204a710804df19b633aca6d6c5cbc5a25dcdc 100644
+--- a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt
++++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt
+@@ -1,8 +1,8 @@
+ 
+ PASS getComputedStyle returns no style for detached element
+-FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) assert_equals: expected 0 but got 403
+-FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) from iframe's window assert_equals: expected 0 but got 403
+-FAIL getComputedStyle returns no style for element outside the flat tree assert_equals: expected 0 but got 403
+-FAIL getComputedStyle returns no style for descendant outside the flat tree assert_equals: expected 0 but got 403
++FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) assert_equals: expected 0 but got 400
++FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) from iframe's window assert_equals: expected 0 but got 400
++FAIL getComputedStyle returns no style for element outside the flat tree assert_equals: expected 0 but got 400
++FAIL getComputedStyle returns no style for descendant outside the flat tree assert_equals: expected 0 but got 400
+ PASS getComputedStyle returns no style for shadow tree outside of flattened tree
+ 
+diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-all-longhands-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-all-longhands-expected.txt
+new file mode 100644
+index 0000000000000000000000000000000000000000..66ca461d4feee4aba36b1dff210df30c2c81ee6b
+--- /dev/null
++++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-all-longhands-expected.txt
+@@ -0,0 +1,4 @@
++
++PASS Specified style
++FAIL Computed style assert_array_equals: lengths differ, expected array [] length 0, got ["size", "-webkit-text-combine"] length 2
++
+diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-all-longhands.html b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-all-longhands.html
+new file mode 100644
+index 0000000000000000000000000000000000000000..95204b63613cf73c1b1b146db6d96c874ca68e7d
+--- /dev/null
++++ b/LayoutTests/imported/w3c/web-platform-tests/css/cssom/serialize-all-longhands.html
+@@ -0,0 +1,36 @@
++
++
++Serialize all longhands
++
++
++
++
++
++ ++ ++ ++ +diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-020-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-020-expected.txt +new file mode 100644 +index 0000000000000000000000000000000000000000..bd57fa9c4fbb83f7bce3495d0a594e2146518e0e +--- /dev/null ++++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-020-expected.txt +@@ -0,0 +1,10 @@ ++This test checks that a double script focus after a mouse click on a focusable element that does not match :focus visible, does NOT match :focus-visible. ++ ++Click on the element that says "Click me". ++If the element that says "Focused" has a red outline then the test result is FAILURE, if it has a green background then the test result is SUCCESS. ++Click me ++Focused ++ ++PASS ":focus-visible" should be a valid selector ++PASS Double script focus after mouse click on a focusable element that does not match :focus-visible, does NOT match :focus-visible ++ +diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-020.html b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-020.html +new file mode 100644 +index 0000000000000000000000000000000000000000..eb68efc683012154e970117df9e04295933a97ed +--- /dev/null ++++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/focus-visible-script-focus-020.html +@@ -0,0 +1,70 @@ ++ ++ ++CSS Test (Selectors): Double script focus after mouse click on a focusable element that does not match :focus-visible, does NOT match :focus-visible ++ ++ ++ ++ ++ ++ ++ ++ ++ ++

This test checks that a double script focus after a mouse click on a focusable element that does not match :focus visible, does NOT match :focus-visible.

++
    ++
  1. Click on the element that says "Click me".
  2. ++
  3. If the element that says "Focused" has a red outline then the test result is FAILURE, if it has a green background then the test result is SUCCESS.
  4. ++
++

Your user-agent does not support :focus-visible pseudo-class, please SKIP this test.

++ ++
Click me
++
Focused
++ ++ +diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/modal-pseudo-class-in-has-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/modal-pseudo-class-in-has-expected.txt +new file mode 100644 +index 0000000000000000000000000000000000000000..2bf24feaeb5ebfdce9f18634f39cb5265eb540d2 +--- /dev/null ++++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/modal-pseudo-class-in-has-expected.txt +@@ -0,0 +1,6 @@ ++This is some text. ++ ++PASS :modal pseudo-class is not active with dialog.show() ++PASS :modal pseudo-class invalidation with showModal+close ++PASS :modal pseudo-class invalidation with showModal+remove ++ +diff --git a/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/modal-pseudo-class-in-has.html b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/modal-pseudo-class-in-has.html +new file mode 100644 +index 0000000000000000000000000000000000000000..9c487fba16fdad7d07dfc1b867dfddf7a4a021cb +--- /dev/null ++++ b/LayoutTests/imported/w3c/web-platform-tests/css/selectors/invalidation/modal-pseudo-class-in-has.html +@@ -0,0 +1,44 @@ ++ ++ ++CSS Selectors Invalidation: :modal pseudo class in :has() ++ ++ ++ ++ ++ ++
++ This is some text. ++ This is a dialog ++
++ +\ No newline at end of file +diff --git a/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/aria-element-reflection.tentative-expected.txt b/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/aria-element-reflection.tentative-expected.txt +index dca318b09853abba97d5df75bf343bc153587ac0..16780647167f46aa5d0cc1463a93e200a2cddcc1 100644 +--- a/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/aria-element-reflection.tentative-expected.txt ++++ b/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/aria-element-reflection.tentative-expected.txt +@@ -9,10 +9,7 @@ First description. + Second description. + Item 1 + Item 2 +-Item 1 +-Item 2 + Hello world! +-I am an apple + I am a pear + I am a banana + Billing +@@ -47,17 +44,17 @@ Wonderful + Fantastic + + +-FAIL aria-activedescendant element reflection assert_equals: invalid ID for relationship returns null expected (object) null but got (undefined) undefined +-FAIL If the content attribute is set directly, the IDL attribute getter always returns the first element whose ID matches the content attribute. assert_equals: expected (object) Element node
Item 1
but got (undefined) undefined +-FAIL Setting the IDL attribute to an element which is not the first element in DOM order with its ID causes the content attribute to be an empty string assert_true: expected true got false +-FAIL Setting an element reference that crosses into a shadow tree is disallowed, but setting one that is in a shadow inclusive ancestor is allowed. assert_equals: expected (object) null but got (undefined) undefined +-FAIL aria-errormessage assert_equals: expected (string) "errorMessage" but got (object) null ++PASS aria-activedescendant element reflection ++PASS If the content attribute is set directly, the IDL attribute getter always returns the first element whose ID matches the content attribute. ++PASS Setting the IDL attribute to an element which is not the first element in DOM order with its ID causes the content attribute to be an empty string ++PASS Setting an element reference that crosses into a shadow tree is disallowed, but setting one that is in a shadow inclusive ancestor is allowed. ++PASS aria-errormessage + FAIL aria-details assert_array_equals: value is undefined, expected array +-FAIL Deleting a reflected element should return null for the IDL attribute and cause the content attribute to become stale. assert_equals: expected (object) Element node
Item 1
but got (undefined) undefined +-FAIL Changing the ID of an element causes the content attribute to become out of sync. assert_equals: expected (object) Element node
Item 1
but got (undefined) undefined +-FAIL Reparenting an element into a descendant shadow scope hides the element reference. assert_equals: null before expected (object) null but got (undefined) undefined +-FAIL Reparenting referenced element cannot cause retargeting of reference. assert_equals: expected (string) "apple" but got (object) null +-FAIL Element reference set in invalid scope remains intact throughout move to valid scope. assert_equals: expected null but got Element node
++PASS Deleting a reflected element should return null for the IDL attribute and cause the content attribute to become stale. ++PASS Changing the ID of an element causes the content attribute to become out of sync. ++PASS Reparenting an element into a descendant shadow scope hides the element reference. ++PASS Reparenting referenced element cannot cause retargeting of reference. ++PASS Element reference set in invalid scope remains intact throughout move to valid scope. + FAIL aria-labelledby. assert_array_equals: parsed content attribute sets element references. value is undefined, expected array + FAIL aria-controls. assert_array_equals: value is undefined, expected array + FAIL aria-describedby. assert_array_equals: value is undefined, expected array +@@ -67,6 +64,7 @@ FAIL shadow DOM behaviour for FrozenArray element reflection. assert_array_equal + FAIL Moving explicitly set elements across shadow DOM boundaries. assert_equals: expected (string) "buttonDescription1 buttonDescription2" but got (object) null + FAIL Moving explicitly set elements around within the same scope, and removing from the DOM. assert_array_equals: aria-labeled by is supported by IDL getter. value is undefined, expected array + PASS Reparenting. +-FAIL Attaching element reference before it's inserted into the DOM. assert_equals: Referenced element not inserted into document, so is in an invalid scope. expected null but got Element node +-FAIL Cross-document references and moves. assert_equals: Cross-document is an invalid scope, so reference will not be visible. expected null but got Element node ++PASS Attaching element reference before it's inserted into the DOM. ++PASS Cross-document references and moves. ++PASS Adopting element keeps references. + +diff --git a/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/aria-element-reflection.tentative.html b/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/aria-element-reflection.tentative.html +index 776fff314322b9004e1e6783c626c0356ca8f0a7..f748de1ec1f959ff8e345d3a9b53a00d37370185 100644 +--- a/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/aria-element-reflection.tentative.html ++++ b/LayoutTests/imported/w3c/web-platform-tests/dom/nodes/aria-element-reflection.tentative.html +@@ -164,6 +164,7 @@ + + ++ ++ ++ + + + +diff --git a/LayoutTests/inspector/timeline/line-column-expected.txt b/LayoutTests/inspector/timeline/line-column-expected.txt +index bfcac989eac0fbd80e85acc63c4e7c286b87a385..5e4a858a49cfeda06f9fbbf84d1cf7f24eabd6ba 100644 +--- a/LayoutTests/inspector/timeline/line-column-expected.txt ++++ b/LayoutTests/inspector/timeline/line-column-expected.txt +@@ -64,7 +64,7 @@ PASS: Capturing started. + "functionName": "", + "url": "", + "scriptId": "", +- "lineNumber": 142, ++ "lineNumber": 141, + "columnNumber": 97 + } + ], +@@ -117,7 +117,7 @@ PASS: Capturing started. + "functionName": "", + "url": "", + "scriptId": "", +- "lineNumber": 142, ++ "lineNumber": 141, + "columnNumber": 97 + } + ], +@@ -177,7 +177,7 @@ PASS: Capturing started. + "functionName": "", + "url": "", + "scriptId": "", +- "lineNumber": 142, ++ "lineNumber": 141, + "columnNumber": 97 + } + ], +diff --git a/LayoutTests/media/airplay-wirelessvideoplaybackdisabled-expected.txt b/LayoutTests/media/airplay-wirelessvideoplaybackdisabled-expected.txt +new file mode 100644 +index 0000000000000000000000000000000000000000..5d0e2fb4c5b042eac5aa8525258a5f9e854d06a1 +--- /dev/null ++++ b/LayoutTests/media/airplay-wirelessvideoplaybackdisabled-expected.txt +@@ -0,0 +1,19 @@ ++ ++Test that 'wirelessvideoplaybackdisabled' attribute is set correctly after removing the 'x-webkit-wirelessvideoplaybackdisabled' attribute. ++ ++Test a video element without a source. ++EXPECTED (video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled") == 'true') OK ++EXPECTED (video.webkitWirelessVideoPlaybackDisabled == 'true') OK ++RUN(video.removeAttribute("x-webkit-wirelessvideoplaybackdisabled")) ++EXPECTED (video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled") == 'false') OK ++EXPECTED (video.webkitWirelessVideoPlaybackDisabled == 'true') OK ++Test a video element with a source. ++EVENT(canplaythrough) ++RUN(video.setAttribute("x-webkit-wirelessvideoplaybackdisabled", "")) ++EXPECTED (video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled") == 'true') OK ++EXPECTED (video.webkitWirelessVideoPlaybackDisabled == 'true') OK ++RUN(video.removeAttribute("x-webkit-wirelessvideoplaybackdisabled")) ++EXPECTED (video.hasAttribute("x-webkit-wirelessvideoplaybackdisabled") == 'false') OK ++EXPECTED (video.webkitWirelessVideoPlaybackDisabled == 'false') OK ++END OF TEST ++ +diff --git a/LayoutTests/media/airplay-wirelessvideoplaybackdisabled.html b/LayoutTests/media/airplay-wirelessvideoplaybackdisabled.html +new file mode 100644 +index 0000000000000000000000000000000000000000..d8757f7c52b4d7820451691756cb97ea82c1d20c +--- /dev/null ++++ b/LayoutTests/media/airplay-wirelessvideoplaybackdisabled.html +@@ -0,0 +1,53 @@ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++

Test that 'wirelessvideoplaybackdisabled' attribute is set correctly after ++ removing the 'x-webkit-wirelessvideoplaybackdisabled' attribute.

++ ++ +diff --git a/LayoutTests/media/media-source/content/test-xhe-aac-manifest.json b/LayoutTests/media/media-source/content/test-xhe-aac-manifest.json +new file mode 100644 +index 0000000000000000000000000000000000000000..ccbd0f4bb471d6d21e0006f2146b816768a8d26e +--- /dev/null ++++ b/LayoutTests/media/media-source/content/test-xhe-aac-manifest.json +@@ -0,0 +1,9 @@ ++{ ++ "url": "content/test-xhe-aac.m4a", ++ "type": "audio/mp4; codecs=\"mp4a.40.42\"", ++ "init": { "offset": 0, "size": 756 }, ++ "duration": 33.968, ++ "media": [ ++ { "offset": 756, "size": 280130, "timestamp": 0, "duration": 33.968 } ++ ] ++} +diff --git a/LayoutTests/media/media-source/content/test-xhe-aac.m4a b/LayoutTests/media/media-source/content/test-xhe-aac.m4a +new file mode 100644 +index 0000000000000000000000000000000000000000..d9d5876abc102c365798ecda1bf60362093a404b +Binary files /dev/null and b/LayoutTests/media/media-source/content/test-xhe-aac.m4a differ +diff --git a/LayoutTests/media/media-source/media-mp4-xhe-aac-expected.txt b/LayoutTests/media/media-source/media-mp4-xhe-aac-expected.txt +new file mode 100644 +index 0000000000000000000000000000000000000000..61a93a45d63d8b3a369ab1b806857e6aaa363f1c +--- /dev/null ++++ b/LayoutTests/media/media-source/media-mp4-xhe-aac-expected.txt +@@ -0,0 +1,15 @@ ++ ++RUN(video.src = URL.createObjectURL(source)) ++EVENT(sourceopen) ++RUN(sourceBuffer = source.addSourceBuffer(loader.type())) ++RUN(sourceBuffer.appendBuffer(loader.initSegment())) ++EVENT(update) ++Append media segment. ++RUN(sourceBuffer.appendBuffer(loader.mediaSegment(0))) ++EVENT(update) ++RUN(video.currentTime = video.duration - 0.5) ++EVENT(seeked) ++RUN(video.play()) ++EVENT(ended) ++END OF TEST ++ +diff --git a/LayoutTests/media/media-source/media-mp4-xhe-aac.html b/LayoutTests/media/media-source/media-mp4-xhe-aac.html +new file mode 100644 +index 0000000000000000000000000000000000000000..7fbf8e2a65a62bf03997ad1fd1afc90518a58335 +--- /dev/null ++++ b/LayoutTests/media/media-source/media-mp4-xhe-aac.html +@@ -0,0 +1,53 @@ ++ ++ ++ ++ media-mp4-xhe-aac ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/LayoutTests/platform/glib/TestExpectations b/LayoutTests/platform/glib/TestExpectations +index 3314e7fc415d325f83a636753b7c763dc9a76fd4..ec0ca0e0f4a8de7276d8fb598f24ecfa34557fbf 100644 +--- a/LayoutTests/platform/glib/TestExpectations ++++ b/LayoutTests/platform/glib/TestExpectations +@@ -554,6 +554,9 @@ webkit.org/b/221308 [ Debug ] fast/selectors/is-backtracking.html [ Timeout ] + webkit.org/b/228920 imported/w3c/web-platform-tests/css/css-overflow/clip-006.html [ ImageOnlyFailure ] + webkit.org/b/228920 imported/w3c/web-platform-tests/css/css-overflow/clip-007.html [ ImageOnlyFailure ] + ++webkit.org/b/209080 imported/w3c/web-platform-tests/css/css-writing-modes/line-box-height-vlr-011.xht [ ImageOnlyFailure ] ++webkit.org/b/209080 imported/w3c/web-platform-tests/css/css-writing-modes/line-box-height-vlr-013.xht [ ImageOnlyFailure ] ++ + webkit.org/b/229389 imported/w3c/web-platform-tests/css/css-text/white-space/control-chars-001.html [ ImageOnlyFailure ] + webkit.org/b/229389 imported/w3c/web-platform-tests/css/css-text/white-space/control-chars-002.html [ ImageOnlyFailure ] + webkit.org/b/229389 imported/w3c/web-platform-tests/css/css-text/white-space/control-chars-003.html [ ImageOnlyFailure ] +@@ -781,9 +784,6 @@ webkit.org/b/213699 imported/w3c/web-platform-tests/mediacapture-record/MediaRec + webkit.org/b/230415 fast/mediastream/RTCPeerConnection-iceconnectionstatechange-event.html [ Timeout ] + webkit.org/b/79203 fast/mediastream/RTCRtpSender-replaceTrack.html [ Failure ] + webkit.org/b/187603 fast/mediastream/media-stream-track-source-failure.html [ Timeout Failure Pass ] +-fast/mediastream/media-stream-video-track-interrupted-from-audio.html [ Failure ] +-fast/mediastream/media-stream-track-interrupted.html [ Failure ] +-fast/mediastream/track-ended-while-muted.html [ Failure ] + + webkit.org/b/223508 imported/w3c/web-platform-tests/mediacapture-streams/MediaStream-MediaElement-srcObject.https.html [ Failure Pass ] + +@@ -1297,6 +1297,8 @@ webkit.org/b/234118 imported/mozilla/svg/image/image-filter-01.svg [ ImageOnlyFa + webkit.org/b/234118 svg/custom/filter-update-different-root.html [ ImageOnlyFailure ] + webkit.org/b/234118 svg/filters/color-space-conversion.svg [ ImageOnlyFailure ] + webkit.org/b/234118 svg/filters/container-with-filters.svg [ ImageOnlyFailure ] ++webkit.org/b/234118 imported/w3c/web-platform-tests/css/filter-effects/css-filters-animation-opacity.html [ ImageOnlyFailure ] ++webkit.org/b/234118 imported/w3c/web-platform-tests/css/filter-effects/effect-reference-on-span.html [ ImageOnlyFailure ] + webkit.org/b/234118 imported/w3c/web-platform-tests/css/filter-effects/morphology-mirrored.html [ ImageOnlyFailure ] + webkit.org/b/234118 imported/w3c/web-platform-tests/css/filter-effects/root-element-with-opacity-filter-001.html [ ImageOnlyFailure ] + webkit.org/b/234118 imported/w3c/web-platform-tests/css/filter-effects/svg-sourcegraphic-currentcolor-dynamic-001.html [ ImageOnlyFailure ] +diff --git a/LayoutTests/platform/glib/imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt b/LayoutTests/platform/glib/imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt +index 1f959a2df3381d8d72c342ca7b029605f3b20a95..c13139b54111bb417cad14022f6bd93df831c528 100644 +--- a/LayoutTests/platform/glib/imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt ++++ b/LayoutTests/platform/glib/imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt +@@ -134,7 +134,7 @@ PASS - text-indent + PASS - text-shadow + PASS - text-align + PASS - display +-FAIL - box-sizing assert_equals: expected "border-box" but got "content-box" ++PASS - box-sizing + PASS - letter-spacing + PASS - word-spacing + PASS - line-height +diff --git a/LayoutTests/platform/gtk/TestExpectations b/LayoutTests/platform/gtk/TestExpectations +index 7e363ca12d671306bb9bc395860bb526b64463ad..8cdc44ea7f593adb262d5dfabd4aff025b401d1f 100644 +--- a/LayoutTests/platform/gtk/TestExpectations ++++ b/LayoutTests/platform/gtk/TestExpectations +@@ -906,6 +906,9 @@ webkit.org/b/236298 imported/w3c/web-platform-tests/css/css-pseudo/first-letter- + webkit.org/b/236298 imported/w3c/web-platform-tests/css/css-ui/text-overflow-012.html [ ImageOnlyFailure ] + webkit.org/b/236298 imported/w3c/web-platform-tests/css/css-ui/text-overflow-022.html [ ImageOnlyFailure ] + ++# Requires support for xHE-HAAC audio codec ++webkit.org/b/239750 media/media-source/media-mp4-xhe-aac.html [ Skip ] ++ + #//////////////////////////////////////////////////////////////////////////////////////// + # End of Expected failures. + #//////////////////////////////////////////////////////////////////////////////////////// +@@ -1852,6 +1855,9 @@ webkit.org/b/160119 fast/repaint/selection-gap-flipped-fixed-child.html [ Failur + # UNSORTED Expectations. When in doubt, put it here. + #//////////////////////////////////////////////////////////////////////////////////////// + ++webkit.org/b/240270 imported/w3c/web-platform-tests/css/motion/offset-rotate-001.html [ ImageOnlyFailure ] ++webkit.org/b/240270 imported/w3c/web-platform-tests/css/motion/offset-rotate-002.html [ ImageOnlyFailure ] ++ + accessibility/dialog-properties.html [ Skip ] + accessibility/ignored-aria-role-description.html [ Skip ] + +diff --git a/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt b/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt +index 7e29a476c6a5ea387c6d633bcd34d082f0b7165e..90eac7e1a8249243739a2a233fb3ef8c7a9827e4 100644 +--- a/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt ++++ b/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/css/css-cascade/all-prop-initial-xml-expected.txt +@@ -239,8 +239,7 @@ PASS page-break-before + PASS page-break-inside + PASS paint-order + PASS perspective +-PASS perspective-origin-x +-PASS perspective-origin-y ++PASS perspective-origin + PASS pointer-events + PASS position + PASS print-color-adjust +@@ -317,9 +316,7 @@ PASS top + PASS touch-action + PASS transform + PASS transform-box +-PASS transform-origin-x +-PASS transform-origin-y +-PASS transform-origin-z ++PASS transform-origin + PASS transform-style + PASS transition-delay + PASS transition-duration +diff --git a/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt b/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt +index ab9f673a5ee50378c49ea5010c0d514ff163d70a..a2b849edc44b5d49b130753b91fb73054c3264bf 100644 +--- a/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt ++++ b/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt +@@ -1,8 +1,8 @@ + + PASS getComputedStyle returns no style for detached element +-FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) assert_equals: expected 0 but got 401 +-FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) from iframe's window assert_equals: expected 0 but got 401 +-FAIL getComputedStyle returns no style for element outside the flat tree assert_equals: expected 0 but got 401 +-FAIL getComputedStyle returns no style for descendant outside the flat tree assert_equals: expected 0 but got 401 ++FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) assert_equals: expected 0 but got 398 ++FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) from iframe's window assert_equals: expected 0 but got 398 ++FAIL getComputedStyle returns no style for element outside the flat tree assert_equals: expected 0 but got 398 ++FAIL getComputedStyle returns no style for descendant outside the flat tree assert_equals: expected 0 but got 398 + PASS getComputedStyle returns no style for shadow tree outside of flattened tree + +diff --git a/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt b/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt +index a2456742781fddada3ca8456b29401e8b6c7a442..cf78552949818c2f67691b2442a02231c7175d54 100644 +--- a/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt ++++ b/LayoutTests/platform/gtk/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt +@@ -1,10 +1,10 @@ + +-FAIL change state from hidden to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from hidden to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from hidden to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from hidden to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from hidden to text ++PASS change state from hidden to search ++PASS change state from hidden to tel ++PASS change state from hidden to url + PASS change state from hidden to email +-FAIL change state from hidden to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from hidden to password + PASS change state from hidden to datetime-local + PASS change state from hidden to date + PASS change state from hidden to month +@@ -105,11 +105,11 @@ PASS change state from url to image + PASS change state from url to reset + PASS change state from url to button + PASS change state from email to hidden +-FAIL change state from email to text assert_equals: selectionStart should be 0 expected 0 but got 6 +-FAIL change state from email to search assert_equals: selectionStart should be 0 expected 0 but got 6 +-FAIL change state from email to tel assert_equals: selectionStart should be 0 expected 0 but got 6 +-FAIL change state from email to url assert_equals: selectionStart should be 0 expected 0 but got 6 +-FAIL change state from email to password assert_equals: selectionStart should be 0 expected 0 but got 6 ++PASS change state from email to text ++PASS change state from email to search ++PASS change state from email to tel ++PASS change state from email to url ++PASS change state from email to password + PASS change state from email to datetime-local + PASS change state from email to date + PASS change state from email to month +@@ -147,12 +147,12 @@ PASS change state from password to image + PASS change state from password to reset + PASS change state from password to button + PASS change state from datetime-local to hidden +-FAIL change state from datetime-local to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from datetime-local to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from datetime-local to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from datetime-local to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from datetime-local to text ++PASS change state from datetime-local to search ++PASS change state from datetime-local to tel ++PASS change state from datetime-local to url + PASS change state from datetime-local to email +-FAIL change state from datetime-local to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from datetime-local to password + PASS change state from datetime-local to date + PASS change state from datetime-local to month + PASS change state from datetime-local to week +@@ -168,12 +168,12 @@ PASS change state from datetime-local to image + PASS change state from datetime-local to reset + PASS change state from datetime-local to button + PASS change state from date to hidden +-FAIL change state from date to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from date to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from date to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from date to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from date to text ++PASS change state from date to search ++PASS change state from date to tel ++PASS change state from date to url + PASS change state from date to email +-FAIL change state from date to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from date to password + PASS change state from date to datetime-local + PASS change state from date to month + PASS change state from date to week +@@ -189,12 +189,12 @@ PASS change state from date to image + PASS change state from date to reset + PASS change state from date to button + PASS change state from month to hidden +-FAIL change state from month to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from month to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from month to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from month to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from month to text ++PASS change state from month to search ++PASS change state from month to tel ++PASS change state from month to url + PASS change state from month to email +-FAIL change state from month to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from month to password + PASS change state from month to datetime-local + PASS change state from month to date + PASS change state from month to week +@@ -210,12 +210,12 @@ PASS change state from month to image + PASS change state from month to reset + PASS change state from month to button + PASS change state from week to hidden +-FAIL change state from week to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from week to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from week to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from week to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from week to text ++PASS change state from week to search ++PASS change state from week to tel ++PASS change state from week to url + PASS change state from week to email +-FAIL change state from week to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from week to password + PASS change state from week to datetime-local + PASS change state from week to date + PASS change state from week to month +@@ -231,12 +231,12 @@ PASS change state from week to image + PASS change state from week to reset + PASS change state from week to button + PASS change state from time to hidden +-FAIL change state from time to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from time to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from time to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from time to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from time to text ++PASS change state from time to search ++PASS change state from time to tel ++PASS change state from time to url + PASS change state from time to email +-FAIL change state from time to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from time to password + PASS change state from time to datetime-local + PASS change state from time to date + PASS change state from time to month +@@ -273,12 +273,12 @@ PASS change state from number to image + PASS change state from number to reset + PASS change state from number to button + PASS change state from range to hidden +-FAIL change state from range to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from range to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from range to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from range to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from range to text ++PASS change state from range to search ++PASS change state from range to tel ++PASS change state from range to url + PASS change state from range to email +-FAIL change state from range to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from range to password + PASS change state from range to datetime-local + PASS change state from range to date + PASS change state from range to month +@@ -294,12 +294,12 @@ PASS change state from range to image + PASS change state from range to reset + PASS change state from range to button + PASS change state from color to hidden +-FAIL change state from color to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from color to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from color to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from color to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from color to text ++PASS change state from color to search ++PASS change state from color to tel ++PASS change state from color to url + PASS change state from color to email +-FAIL change state from color to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from color to password + PASS change state from color to datetime-local + PASS change state from color to date + PASS change state from color to month +@@ -315,12 +315,12 @@ PASS change state from color to image + PASS change state from color to reset + PASS change state from color to button + PASS change state from checkbox to hidden +-FAIL change state from checkbox to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from checkbox to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from checkbox to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from checkbox to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from checkbox to text ++PASS change state from checkbox to search ++PASS change state from checkbox to tel ++PASS change state from checkbox to url + PASS change state from checkbox to email +-FAIL change state from checkbox to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from checkbox to password + PASS change state from checkbox to datetime-local + PASS change state from checkbox to date + PASS change state from checkbox to month +@@ -336,12 +336,12 @@ PASS change state from checkbox to image + PASS change state from checkbox to reset + PASS change state from checkbox to button + PASS change state from radio to hidden +-FAIL change state from radio to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from radio to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from radio to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from radio to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from radio to text ++PASS change state from radio to search ++PASS change state from radio to tel ++PASS change state from radio to url + PASS change state from radio to email +-FAIL change state from radio to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from radio to password + PASS change state from radio to datetime-local + PASS change state from radio to date + PASS change state from radio to month +@@ -378,12 +378,12 @@ PASS change state from file to image + PASS change state from file to reset + PASS change state from file to button + PASS change state from submit to hidden +-FAIL change state from submit to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from submit to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from submit to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from submit to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from submit to text ++PASS change state from submit to search ++PASS change state from submit to tel ++PASS change state from submit to url + PASS change state from submit to email +-FAIL change state from submit to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from submit to password + PASS change state from submit to datetime-local + PASS change state from submit to date + PASS change state from submit to month +@@ -399,12 +399,12 @@ PASS change state from submit to image + PASS change state from submit to reset + PASS change state from submit to button + PASS change state from image to hidden +-FAIL change state from image to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from image to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from image to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from image to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from image to text ++PASS change state from image to search ++PASS change state from image to tel ++PASS change state from image to url + PASS change state from image to email +-FAIL change state from image to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from image to password + PASS change state from image to datetime-local + PASS change state from image to date + PASS change state from image to month +@@ -420,12 +420,12 @@ PASS change state from image to submit + PASS change state from image to reset + PASS change state from image to button + PASS change state from reset to hidden +-FAIL change state from reset to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from reset to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from reset to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from reset to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from reset to text ++PASS change state from reset to search ++PASS change state from reset to tel ++PASS change state from reset to url + PASS change state from reset to email +-FAIL change state from reset to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from reset to password + PASS change state from reset to datetime-local + PASS change state from reset to date + PASS change state from reset to month +@@ -441,12 +441,12 @@ PASS change state from reset to submit + PASS change state from reset to image + PASS change state from reset to button + PASS change state from button to hidden +-FAIL change state from button to text assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from button to search assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from button to tel assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" +-FAIL change state from button to url assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from button to text ++PASS change state from button to search ++PASS change state from button to tel ++PASS change state from button to url + PASS change state from button to email +-FAIL change state from button to password assert_equals: selectionDirection should be '{noneDirectionResult}' expected "none" but got "forward" ++PASS change state from button to password + PASS change state from button to datetime-local + PASS change state from button to date + PASS change state from button to month +diff --git a/LayoutTests/platform/gtk/inspector/timeline/line-column-expected.txt b/LayoutTests/platform/gtk/inspector/timeline/line-column-expected.txt +index 25f930e2921f889c16477fbfa102a2d1c7677680..c962d68101cf47315d5e01dc3f0d3fe359d62547 100644 +--- a/LayoutTests/platform/gtk/inspector/timeline/line-column-expected.txt ++++ b/LayoutTests/platform/gtk/inspector/timeline/line-column-expected.txt +@@ -60,7 +60,7 @@ PASS: Capturing started. + "functionName": "", + "url": "", + "scriptId": "", +- "lineNumber": 142, ++ "lineNumber": 141, + "columnNumber": 97 + } + ], +@@ -113,7 +113,7 @@ PASS: Capturing started. + "functionName": "", + "url": "", + "scriptId": "", +- "lineNumber": 142, ++ "lineNumber": 141, + "columnNumber": 97 + } + ], +@@ -165,7 +165,7 @@ PASS: Capturing started. + "functionName": "", + "url": "", + "scriptId": "", +- "lineNumber": 142, ++ "lineNumber": 141, + "columnNumber": 97 + } + ], +diff --git a/LayoutTests/platform/ios-wk2/TestExpectations b/LayoutTests/platform/ios-wk2/TestExpectations +index d85b883d3f5a85792d166b1275e6833a52567b41..8a9e47f716986b38c13ffe77d6787fa1047c6feb 100644 +--- a/LayoutTests/platform/ios-wk2/TestExpectations ++++ b/LayoutTests/platform/ios-wk2/TestExpectations +@@ -1196,9 +1196,6 @@ webkit.org/b/165344 [ Release ] http/tests/security/module-incorrect-mime-types. + + webkit.org/b/162685 [ Release ] http/tests/cache/disk-cache/disk-cache-204-status-code.html [ Pass Failure ] + +-# Hover test does not apply +-fast/css/deferred-parsing/hover-test.html [ Skip ] +- + # Skipped because there is no key to show the context menu + fast/events/context-activated-by-key-event.html [ Skip ] + +diff --git a/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt +index 786e77f1d6a0c4a5dcf6dedb55ca81dcc4573512..cf78552949818c2f67691b2442a02231c7175d54 100644 +--- a/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt ++++ b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/html/semantics/forms/the-input-element/type-change-state-expected.txt +@@ -105,11 +105,11 @@ PASS change state from url to image + PASS change state from url to reset + PASS change state from url to button + PASS change state from email to hidden +-FAIL change state from email to text assert_equals: selectionStart should be 0 expected 0 but got 6 +-FAIL change state from email to search assert_equals: selectionStart should be 0 expected 0 but got 6 +-FAIL change state from email to tel assert_equals: selectionStart should be 0 expected 0 but got 6 +-FAIL change state from email to url assert_equals: selectionStart should be 0 expected 0 but got 6 +-FAIL change state from email to password assert_equals: selectionStart should be 0 expected 0 but got 6 ++PASS change state from email to text ++PASS change state from email to search ++PASS change state from email to tel ++PASS change state from email to url ++PASS change state from email to password + PASS change state from email to datetime-local + PASS change state from email to date + PASS change state from email to month +diff --git a/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-pseudo-element-hittest-expected.txt b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-pseudo-element-hittest-expected.txt +new file mode 100644 +index 0000000000000000000000000000000000000000..d804e22be80d36163473f2761153e38b6f6c675e +--- /dev/null ++++ b/LayoutTests/platform/ios-wk2/imported/w3c/web-platform-tests/inert/inert-pseudo-element-hittest-expected.txt +@@ -0,0 +1,6 @@ ++Manual test: hover the green square, pass if it does not turn red. ++ ++ ++PASS Hit-testing cannot reach pseudo elements of inert nodes ++FAIL Hit-testing can reach pseudo elements of non-inert nodes assert_array_equals: target got all events lengths differ, expected array ["mousedown", "mouseenter", "mousemove", "mouseover", "pointerdown", "pointerenter", "pointermove", "pointerover"] length 8, got [] length 0 ++ +diff --git a/LayoutTests/platform/ios/TestExpectations b/LayoutTests/platform/ios/TestExpectations +index e8476ce1b9fc3e6bed200cccd6445fdae77fa47d..1322ec3aa782f2c39e00f0432a3865d2f89834d0 100644 +--- a/LayoutTests/platform/ios/TestExpectations ++++ b/LayoutTests/platform/ios/TestExpectations +@@ -39,6 +39,7 @@ fast/forms/ios/ipad/open-picker-using-keyboard.html [ Pass Timeout ] + fast/css/appearance-apple-pay-button.html [ Pass ] + fast/css/appearance-apple-pay-button-border-radius.html [ Pass ] + fast/css/appearance-apple-pay-button-border-radius-longhands.html [ Pass ] ++fast/css/appearance-apple-pay-button-border-width.html [ Pass ] + fast/css/appearance-apple-pay-button-default-corners.html [ Pass ] + fast/css/webkit-named-image/apple-pay-logo-black [ Pass ] + fast/css/webkit-named-image/apple-pay-logo-white [ Pass ] +@@ -2462,8 +2463,6 @@ fast/selectors/040.html + + webkit.org/b/165691 http/tests/security/contentSecurityPolicy/block-all-mixed-content/insecure-iframe-in-main-frame.html [ Pass Failure ] + +-fast/css/deferred-parsing/hover-test.html [ Skip ] +- + # Form validation popover does not obey minimum font size setting on iOS but Dynamic Type instead. + fast/forms/validation-message-minimum-font-size.html [ Skip ] + +@@ -3450,7 +3449,6 @@ model-element/model-element-inline-preview-deletion-upon-source-change.html [ Sk + + # webkit.org/b/201982 These are flaky failures on iOS + fast/images/exif-orientation-svg-feimage.html [ Pass Failure ] +-fast/images/exif-orientation-background-image-repeat.html [ Pass Failure ] + fast/images/image-orientation-dynamic-from-image.html [ Pass Failure ] + fast/images/image-orientation-none.html [ Pass Failure ] + +@@ -3593,6 +3591,23 @@ webkit.org/b/239567 tables/mozilla/bugs/bug26178.html [ Pass Failure ] + # iOS has a WebGPU implementation. + http/tests/webgpu [ Pass ] + +-webkit.org/b/240024 http/tests/quicklook/same-origin-xmlhttprequest-allowed.html [ Pass Failure Crash ] ++webkit.org/b/240037 css3/background/background-repeat-space-content.html [ Pass ImageOnlyFailure ] ++ ++webkit.org/b/240069 fast/css/continuationCrash.html [ Pass Failure ] ++ ++webkit.org/b/240074 imported/w3c/web-platform-tests/service-workers/service-worker/registration-updateviacache.https.html [ Pass Failure ] ++ ++webkit.org/b/237552 imported/w3c/web-platform-tests/html/browsers/history/the-location-interface/same-hash.html [ Pass Failure ] ++ ++webkit.org/b/240081 webaudio/AudioBuffer/huge-buffer.html [ Pass Timeout ] ++ ++webkit.org/b/240104 fast/text/international/system-language/navigator-language/navigator-language-fr.html [ Pass Failure ] ++ ++webkit.org/b/240123 imported/w3c/web-platform-tests/webrtc/protocol/rtp-clockrate.html [ Pass Failure ] ++ ++webkit.org/b/239568 imported/w3c/web-platform-tests/content-security-policy/inheritance/blob-url-in-main-window-self-navigate-inherits.sub.html [ Pass Failure ] ++ ++webkit.org/b/240148 fast/images/exif-orientation-background-image-repeat.html [ Pass Failure ImageOnlyFailure ] ++ ++webkit.org/b/240167 [ Release ] fast/css-custom-paint/animate-repaint.html [ Pass Failure ] + +-webkit.org/b/240037 css3/background/background-repeat-space-content.html [ Pass ImageOnlyFailure ] +\ No newline at end of file +diff --git a/LayoutTests/platform/ios/fast/forms/auto-fill-button/input-auto-fill-button-expected.txt b/LayoutTests/platform/ios/fast/forms/auto-fill-button/input-auto-fill-button-expected.txt +index 9ed6dfbe889d1503ed8dd35b542382f8a40bbc9c..a3e83f18f2a67f93110dc01174282a3451419f87 100644 +--- a/LayoutTests/platform/ios/fast/forms/auto-fill-button/input-auto-fill-button-expected.txt ++++ b/LayoutTests/platform/ios/fast/forms/auto-fill-button/input-auto-fill-button-expected.txt +@@ -1,6 +1,6 @@ + layer at (0,0) size 800x600 + RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 ++layer at (0,0) size 800x600 isolatesBlending + RenderBlock {HTML} at (0,0) size 800x600 + RenderBody {BODY} at (8,8) size 784x584 + RenderBlock {P} at (0,0) size 784x20 +@@ -8,21 +8,21 @@ layer at (0,0) size 800x600 + text run at (0,0) width 503: "This tests that the AutoFill button renders. It can only be tested in the test tool." + RenderBlock {DIV} at (0,36) size 784x25 + RenderTextControl {INPUT} at (2,2) size 155x22 [bgcolor=#FFFFFF] [border: (1px solid #3C3C4399)] +- RenderFlexibleBox {DIV} at (6,3) size 143x15 +- RenderBlock {DIV} at (0,0) size 115x14 +- RenderText {#text} at (158,1) size 5x19 +- text run at (158,1) width 5: " " ++ RenderFlexibleBox {DIV} at (6,-1) size 143x22 ++ RenderBlock {DIV} at (0,3) size 115x15 ++ RenderText {#text} at (158,0) size 5x19 ++ text run at (158,0) width 5: " " + RenderTextControl {INPUT} at (164,2) size 156x22 [bgcolor=#FFFFFF] [border: (1px solid #3C3C4399)] +- RenderFlexibleBox {DIV} at (6,3) size 143x15 +- RenderBlock {DIV} at (0,0) size 115x14 +- RenderText {#text} at (321,1) size 5x19 +- text run at (321,1) width 5: " " ++ RenderFlexibleBox {DIV} at (6,-1) size 143x22 ++ RenderBlock {DIV} at (0,3) size 115x15 ++ RenderText {#text} at (321,0) size 5x19 ++ text run at (321,0) width 5: " " + RenderTextControl {INPUT} at (327,2) size 156x22 [bgcolor=#FFFFFF] [border: (1px solid #3C3C4399)] +- RenderFlexibleBox {DIV} at (6,3) size 143x15 +- RenderBlock {DIV} at (0,0) size 115x14 ++ RenderFlexibleBox {DIV} at (6,-1) size 143x22 ++ RenderBlock {DIV} at (0,3) size 115x15 + RenderTextControl {INPUT} at (486,2) size 156x22 [bgcolor=#FFFFFF] [border: (1px solid #3C3C4399)] +- RenderFlexibleBox {DIV} at (6,3) size 143x15 +- RenderBlock {DIV} at (0,0) size 115x14 ++ RenderFlexibleBox {DIV} at (6,-1) size 143x22 ++ RenderBlock {DIV} at (0,3) size 115x15 + layer at (17,49) size 115x14 backgroundClip at (17,49) size 114x14 clip at (17,49) size 114x14 + RenderBlock {DIV} at (0,0) size 115x14 + layer at (179,49) size 115x14 +@@ -31,11 +31,11 @@ layer at (342,49) size 115x14 + RenderBlock {DIV} at (0,0) size 115x14 + layer at (501,49) size 115x14 + RenderBlock {DIV} at (0,0) size 115x14 +-layer at (134,50) size 22x12 +- RenderBlock {DIV} at (117,1) size 23x12 [bgcolor=#000000] +-layer at (297,50) size 22x12 +- RenderBlock {DIV} at (117,1) size 23x12 [bgcolor=#000000] +-layer at (460,50) size 22x12 +- RenderBlock {DIV} at (117,1) size 23x12 [bgcolor=#000000] +-layer at (619,50) size 22x12 +- RenderBlock {DIV} at (117,1) size 23x12 [bgcolor=#000000] ++layer at (133,44) size 24x24 blendMode: luminosity ++ RenderBlock {DIV} at (116,-2) size 25x25 ++layer at (296,44) size 24x24 blendMode: luminosity ++ RenderBlock {DIV} at (116,-2) size 25x25 ++layer at (459,44) size 24x24 blendMode: luminosity ++ RenderBlock {DIV} at (116,-2) size 25x25 ++layer at (618,44) size 24x24 blendMode: luminosity ++ RenderBlock {DIV} at (116,-2) size 25x25 +diff --git a/LayoutTests/platform/ios/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt b/LayoutTests/platform/ios/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt +index 4e2222745a0317185c7a075052a98621821f6d90..5046ae951de6ca87f31f320818ea3ef3b13be54e 100644 +--- a/LayoutTests/platform/ios/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt ++++ b/LayoutTests/platform/ios/imported/w3c/web-platform-tests/css/cssom/getComputedStyle-detached-subtree-expected.txt +@@ -1,8 +1,8 @@ + + PASS getComputedStyle returns no style for detached element +-FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) assert_equals: expected 0 but got 405 +-FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) from iframe's window assert_equals: expected 0 but got 405 +-FAIL getComputedStyle returns no style for element outside the flat tree assert_equals: expected 0 but got 405 +-FAIL getComputedStyle returns no style for descendant outside the flat tree assert_equals: expected 0 but got 405 ++FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) assert_equals: expected 0 but got 402 ++FAIL getComputedStyle returns no style for element in non-rendered iframe (display: none) from iframe's window assert_equals: expected 0 but got 402 ++FAIL getComputedStyle returns no style for element outside the flat tree assert_equals: expected 0 but got 402 ++FAIL getComputedStyle returns no style for descendant outside the flat tree assert_equals: expected 0 but got 402 + PASS getComputedStyle returns no style for shadow tree outside of flattened tree + +diff --git a/LayoutTests/platform/mac-catalina-wk1/TestExpectations b/LayoutTests/platform/mac-catalina-wk1/TestExpectations +deleted file mode 100644 +index 741dbd39cc25f675d1b7545d5475420d2c4add50..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/TestExpectations ++++ /dev/null +@@ -1,5 +0,0 @@ +-# This file should contain entries for expectations that are specific +-# to the Apple Mac Catalina port running WebKit1 (DumpRenderTree) +- +-imported/w3c/web-platform-tests/speech-api/SpeechSynthesis-speak-events.html [ Skip ] +-imported/w3c/web-platform-tests/speech-api/SpeechSynthesis-pause-resume.tentative.html [ Skip ] +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/anchor-element-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/anchor-element-expected.txt +deleted file mode 100644 +index 2f87aeecb27cf8d26b8bd7fe164e7856e3ed74fe..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/anchor-element-expected.txt ++++ /dev/null +@@ -1,39 +0,0 @@ +-Input: +-webkit.org +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[webkit.org] +- NSColor: #0000ee (sRGB) +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSLink: https://webkit.org/ +- NSStrokeColor: #0000ee (sRGB) +- NSStrokeWidth: 0 +- NSUnderline: true +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attrib-string-colors-with-color-filter-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attrib-string-colors-with-color-filter-expected.txt +deleted file mode 100644 +index 7cbb6cc2fa0b71f7b167fc7f6b51d64a1423395e..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attrib-string-colors-with-color-filter-expected.txt ++++ /dev/null +@@ -1,53 +0,0 @@ +-Input: +-
+- This text is blue +- This text is yellow +-
+- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[This text is blue] +- NSBackgroundColor: #eeeeee (sRGB) +- NSColor: #0000ff (sRGB) +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #0000ff (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[This text is yellow] +- NSBackgroundColor: #800000 (sRGB) +- NSColor: #ffff00 (sRGB) +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #ffff00 (sRGB) +- NSStrokeWidth: 0 +-[\n] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attribute-string-for-copy-with-color-filter-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attribute-string-for-copy-with-color-filter-expected.txt +deleted file mode 100644 +index 097d66ec14dd212ab954e6c244d5c8dd3aae7faa..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attribute-string-for-copy-with-color-filter-expected.txt ++++ /dev/null +@@ -1,32 +0,0 @@ +-Test that an NSAttributedString for copy doesn't convert colors through -apple-color-filter. +- +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[is] +- NSBackgroundColor: #336699 (sRGB) +- NSColor: #cccccc (sRGB) +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #cccccc (sRGB) +- NSStrokeWidth: 0 +- +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-1-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-1-expected.txt +deleted file mode 100644 +index 2bc77aa545b342090fa5815d1690a7817cff17c5..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-1-expected.txt ++++ /dev/null +@@ -1,31 +0,0 @@ +-Input: +-hello <#shadow-start> WebKit<#shadow-end>world rocks +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[hello world WebKit rocks] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-2-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-2-expected.txt +deleted file mode 100644 +index d9defa7508f6162244e27ecebc7936068092d2d6..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-2-expected.txt ++++ /dev/null +@@ -1,31 +0,0 @@ +-Input: +-hello <#shadow-start> WebKit<#shadow-end><#start>world rocks<#end> +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[world WebKit rocks] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-3-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-3-expected.txt +deleted file mode 100644 +index e777151915d22bc38675034009a2da545fd93c3f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-3-expected.txt ++++ /dev/null +@@ -1,31 +0,0 @@ +-Input: +-<#shadow-start>hello <#shadow-end><#start>world WebKit rocks<#end> +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[world WebKit rocks] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-4-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-4-expected.txt +deleted file mode 100644 +index 0ab7f8a6ab5fd18bbba8f8266b328477e0c37251..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-4-expected.txt ++++ /dev/null +@@ -1,31 +0,0 @@ +-Input: +-<#shadow-start><#start>hello <#shadow-end>world Web<#end>Kit rocks +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[hello world Web] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-5-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-5-expected.txt +deleted file mode 100644 +index 7308e5b3af09dc2c4f5b34b5bd772925f51b31e1..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-5-expected.txt ++++ /dev/null +@@ -1,31 +0,0 @@ +-Input: +-<#start><#shadow-start>hello <#shadow-end>world WebKit<#end> +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[hello world WebKit] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-with-style-1-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-with-style-1-expected.txt +deleted file mode 100644 +index 89d42aed7ef8faa6b81138a6b5c080beb9482a14..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-with-style-1-expected.txt ++++ /dev/null +@@ -1,42 +0,0 @@ +-Input: +-<#start>hello <#shadow-start> Web<#end>Kit<#shadow-end>world rocks +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[hello ] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[world] +- NSColor: #0000ff (sRGB) +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #0000ff (sRGB) +- NSStrokeWidth: 0 +-[ Web] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-with-style-2-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-with-style-2-expected.txt +deleted file mode 100644 +index b53e71fd7c6242f5e9b46fc473229c617554d1a6..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-across-shadow-boundaries-with-style-2-expected.txt ++++ /dev/null +@@ -1,43 +0,0 @@ +-Input: +-<#start>
<#shadow-start> world<#shadow-end>hello
<#shadow-start>WebKit <#end><#shadow-end>rocks
+- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[hello] +- NSColor: #0000ff (sRGB) +- NSFont: Times-BoldItalic 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #0000ff (sRGB) +- NSStrokeWidth: 0 +-[ world\n] +- NSFont: Times-Italic 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[WebKit ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSUnderline: true +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-for-typing-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-for-typing-expected.txt +deleted file mode 100644 +index 87fdc9ccc3afd3ba91ed8921e1b2be6b37a08dce..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-for-typing-expected.txt ++++ /dev/null +@@ -1,42 +0,0 @@ +-Some text here +-Input: +-
Some text here
+- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: ( 28L, +- 56L, +- 84L, +- 112L, +- 140L, +- 168L, +- 196L, +- 224L, +- 252L, +- 280L, +- 308L, +- 336L +-) +- DefaultTabInterval: 0 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: -1 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[ ] +- NSColor: rgba(23, 45, 56, 0.4) (sRGB) +- NSFont: Times-Roman 16.00 pt. +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-for-typing-with-color-filter-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-for-typing-with-color-filter-expected.txt +deleted file mode 100644 +index f84bcd6a4ac07ae67500e3464535b186dcc265d2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/attributed-string-for-typing-with-color-filter-expected.txt ++++ /dev/null +@@ -1,43 +0,0 @@ +-Some text here +-Input: +-
Some text here
+- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: ( 28L, +- 56L, +- 84L, +- 112L, +- 140L, +- 168L, +- 196L, +- 224L, +- 252L, +- 280L, +- 308L, +- 336L +-) +- DefaultTabInterval: 0 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: -1 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[ ] +- NSBackgroundColor: #5c5c5c (sRGB) +- NSColor: rgba(239, 239, 239, 0.4) (sRGB) +- NSFont: Times-Roman 16.00 pt. +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/basic-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/basic-expected.txt +deleted file mode 100644 +index 92245154e47b41473f8d550363de6fc66ad9fafe..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/basic-expected.txt ++++ /dev/null +@@ -1,100 +0,0 @@ +-Input: +-hello world WebKit.
+-this is a test of attributed string. +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[hello ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[world] +- NSBackgroundColor: #0000ff (sRGB) +- NSColor: #ffffff (sRGB) +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #ffffff (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[WebKit] +- NSColor: #0000ee (sRGB) +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSLink: https://webkit.org/ +- NSStrokeColor: #0000ee (sRGB) +- NSStrokeWidth: 0 +- NSUnderline: true +-[.\n] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[this is a ] +- NSBackgroundColor: #ffff00 (sRGB) +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[t] +- NSBackgroundColor: #ffff00 (sRGB) +- NSFont: Times-Italic 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSUnderline: true +-[est] +- NSBackgroundColor: #ffff00 (sRGB) +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSUnderline: true +-[ of ] +- NSBackgroundColor: #ffff00 (sRGB) +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[attributed] +- NSBackgroundColor: #ffff00 (sRGB) +- NSFont: Times-Italic 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ string.] +- NSBackgroundColor: #ffff00 (sRGB) +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/comment-cdata-section-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/comment-cdata-section-expected.txt +deleted file mode 100644 +index 64b44c5ca54a2219818cfa3de9908853c664020d..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/comment-cdata-section-expected.txt ++++ /dev/null +@@ -1,31 +0,0 @@ +-Input: +-hello world. +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[hello world. ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/font-size-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/font-size-expected.txt +deleted file mode 100644 +index 07f391d2d6dff3372e9ce9a05be674fb371c73fb..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/font-size-expected.txt ++++ /dev/null +@@ -1,125 +0,0 @@ +-Input: +-small element +-xx-small +-x-small +-small +-normal +-large +-x-large +-xx-large +-5pt +-15pt +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[small element] +- NSFont: Times-Roman 13.33 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[xx-small] +- NSFont: Times-Roman 9.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[x-small] +- NSFont: Times-Roman 10.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[small] +- NSFont: Times-Roman 13.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ normal ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[large] +- NSFont: Times-Roman 18.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[x-large] +- NSFont: Times-Roman 24.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[xx-large] +- NSFont: Times-Roman 32.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[5pt] +- NSFont: Times-Roman 6.67 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[15pt] +- NSFont: Times-Roman 20.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/font-style-variant-effect-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/font-style-variant-effect-expected.txt +deleted file mode 100644 +index 374222699877ad1fec6fd5ce44dba7121d35557c..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/font-style-variant-effect-expected.txt ++++ /dev/null +@@ -1,50 +0,0 @@ +-Input: +-italic +-oblique +-small-caps +-outline +-emboss +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[italic] +- NSFont: Times-Italic 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[oblique] +- NSFont: Times-Italic 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ small-caps outline emboss ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/font-weight-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/font-weight-expected.txt +deleted file mode 100644 +index 8cea98017531e42d4e56b7f35390b48e5f080042..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/font-weight-expected.txt ++++ /dev/null +@@ -1,85 +0,0 @@ +-Input: +-bold +-font weight 100 +-font weight 200 +-font weight 300 +-font weight 400 +-font weight 500 +-font weight 600 +-font weight 700 +-font weight 800 +-font weight 900 +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[bold] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ font weight 100 font weight 200 font weight 300 font weight 400 font weight 500 ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[font weight 600] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[font weight 700] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[font weight 800] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[font weight 900] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/letter-spacing-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/letter-spacing-expected.txt +deleted file mode 100644 +index 95328e1cb9bc02d4fd867c44fe6c26a45a82c311..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/letter-spacing-expected.txt ++++ /dev/null +@@ -1,36 +0,0 @@ +-Input: +-3pt +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[3pt] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/text-decorations-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/text-decorations-expected.txt +deleted file mode 100644 +index 8d728eb137162c33bc342d2cf54d48a93d7577b1..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/text-decorations-expected.txt ++++ /dev/null +@@ -1,50 +0,0 @@ +-Input: +-underline +-strike +-underline and strike +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[underline] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSUnderline: true +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[strike] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrikethrough: true +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ underline and strike ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/vertical-align-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/vertical-align-expected.txt +deleted file mode 100644 +index 3812c6c51fa62167d0399949969a51164dafb4a9..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/mac/attributed-string/vertical-align-expected.txt ++++ /dev/null +@@ -1,74 +0,0 @@ +-Input: +-sup element +-sub element +-vertical align super +-vertical align sub +-vertical align 50% +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 LineBreakStrategy 0 +-[sup element] +- NSFont: Times-Roman 13.33 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSSuperScript: 1 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[sub element] +- NSFont: Times-Roman 13.33 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSSuperScript: -1 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[vertical align super] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSSuperScript: 1 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[vertical align sub] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSSuperScript: -1 +-[ vertical align 50% ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/selection/select-across-readonly-input-4-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/selection/select-across-readonly-input-4-expected.txt +deleted file mode 100644 +index c034e765b4784dea01f85fe0e861b91565bf93bc..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/selection/select-across-readonly-input-4-expected.txt ++++ /dev/null +@@ -1,34 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 744x36 +- text run at (0,0) width 744: "This test ensures selection that crosses the shadow DOM boundary of a readonly input element cannot be made by a" +- text run at (0,18) width 79: "mouse drag." +- RenderBlock {P} at (0,52) size 784x36 +- RenderText {#text} at (0,0) size 773x36 +- text run at (0,0) width 773: "To manually test, select text by a mouse drag starting in \"hello\" and ending in \"WebKit\". Selection should extend only in" +- text run at (0,18) width 250: "the input element that contains \"hello\"." +- RenderBlock {DIV} at (0,104) size 784x28 +- RenderTextControl {INPUT} at (0,2) size 59x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (58,6) size 5x18 +- text run at (58,6) width 5: " " +- RenderInline {SPAN} at (0,0) size 39x18 +- RenderText {#text} at (62,6) size 39x18 +- text run at (62,6) width 39: "world" +- RenderText {#text} at (100,6) size 5x18 +- text run at (100,6) width 5: " " +- RenderTextControl {INPUT} at (104,2) size 59x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +-layer at (11,117) size 53x18 +- RenderBlock {DIV} at (3,3) size 53x18 +- RenderText {#text} at (0,0) size 35x18 +- text run at (0,0) width 35: "hello" +-layer at (115,117) size 53x18 +- RenderBlock {DIV} at (3,3) size 53x18 +- RenderText {#text} at (0,0) size 53x18 +- text run at (0,0) width 53: "WebKit" +-selection start: position 4 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 1 {INPUT} of child 5 {DIV} of body +-selection end: position 5 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 1 {INPUT} of child 5 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina-wk1/editing/selection/select-across-readonly-input-5-expected.txt b/LayoutTests/platform/mac-catalina-wk1/editing/selection/select-across-readonly-input-5-expected.txt +deleted file mode 100644 +index 8aaa5f95728091cda03c2c85a9d0f47d3e6ea839..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/editing/selection/select-across-readonly-input-5-expected.txt ++++ /dev/null +@@ -1,34 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 744x36 +- text run at (0,0) width 744: "This test ensures selection that crosses the shadow DOM boundary of a readonly input element cannot be made by a" +- text run at (0,18) width 79: "mouse drag." +- RenderBlock {P} at (0,52) size 784x36 +- RenderText {#text} at (0,0) size 773x36 +- text run at (0,0) width 773: "To manually test, select text by a mouse drag starting in \"WebKit\" and ending in \"hello\". Selection should extend only in" +- text run at (0,18) width 267: "the input element that contains \"WebKit\"." +- RenderBlock {DIV} at (0,104) size 784x28 +- RenderTextControl {INPUT} at (0,2) size 59x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (58,6) size 5x18 +- text run at (58,6) width 5: " " +- RenderInline {SPAN} at (0,0) size 39x18 +- RenderText {#text} at (62,6) size 39x18 +- text run at (62,6) width 39: "world" +- RenderText {#text} at (100,6) size 5x18 +- text run at (100,6) width 5: " " +- RenderTextControl {INPUT} at (104,2) size 59x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +-layer at (11,117) size 53x18 +- RenderBlock {DIV} at (3,3) size 53x18 +- RenderText {#text} at (0,0) size 35x18 +- text run at (0,0) width 35: "hello" +-layer at (115,117) size 53x18 +- RenderBlock {DIV} at (3,3) size 53x18 +- RenderText {#text} at (0,0) size 53x18 +- text run at (0,0) width 53: "WebKit" +-selection start: position 0 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 5 {INPUT} of child 5 {DIV} of body +-selection end: position 2 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 5 {INPUT} of child 5 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina-wk1/http/tests/cookies/js-get-and-set-http-only-cookie-expected.txt b/LayoutTests/platform/mac-catalina-wk1/http/tests/cookies/js-get-and-set-http-only-cookie-expected.txt +deleted file mode 100644 +index da1159290efbbd5a306c31b86836e1e6baeae71d..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/http/tests/cookies/js-get-and-set-http-only-cookie-expected.txt ++++ /dev/null +@@ -1,12 +0,0 @@ +-Test for [BlackBerry] Possible to clobber httpOnly cookie. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +-Check that we can't get or set httpOnly Cookies by JavaScript. +-PASS We can't get httpOnly cookies by JavaScript. +-FAIL We shouldn't set httpOnly cookies by JavaScript. +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-catalina-wk1/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/mo-stretch-properties-dynamic-001-expected.txt b/LayoutTests/platform/mac-catalina-wk1/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/mo-stretch-properties-dynamic-001-expected.txt +deleted file mode 100644 +index 3d74bce6020866a8a424b57f8bfff004125b7b90..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk1/imported/w3c/web-platform-tests/mathml/presentation-markup/operators/mo-stretch-properties-dynamic-001-expected.txt ++++ /dev/null +@@ -1,23 +0,0 @@ +- +-FAIL minsize assert_approx_equals: attach expected 100 +/- 1 but got 25.015625 +-FAIL maxsize assert_approx_equals: attach expected 100 +/- 1 but got 25.015625 +-FAIL largeop assert_approx_equals: set true expected 50 +/- 1 but got 26 +-FAIL symmetric assert_approx_equals: set true expected 150 +/- 1 but got 25.015625 +-PASS stretchy +-⥯ +-⥯ +-⥯ +- +-⥯ +-⥯ +-⥯ +- +-⥯ +-⥯ +- +-⥯ +-⥯ +- +-⥯ +-⥯ +- +diff --git a/LayoutTests/platform/mac-catalina-wk2/fast/events/contextmenu-lookup-action-for-image-expected.txt b/LayoutTests/platform/mac-catalina-wk2/fast/events/contextmenu-lookup-action-for-image-expected.txt +deleted file mode 100644 +index baa2c3a2cdef4394dddd578101f3926c8a4be8a3..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk2/fast/events/contextmenu-lookup-action-for-image-expected.txt ++++ /dev/null +@@ -1,2 +0,0 @@ +- +-Found lookup item? false +diff --git a/LayoutTests/platform/mac-catalina-wk2/http/tests/websocket/tests/hybi/send-object-tostring-check-expected.txt b/LayoutTests/platform/mac-catalina-wk2/http/tests/websocket/tests/hybi/send-object-tostring-check-expected.txt +deleted file mode 100644 +index 6ef1c7332a43b3e70feac0a921768ca5a65a8d5f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk2/http/tests/websocket/tests/hybi/send-object-tostring-check-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-WebSocket: Object's toString method should be called only once. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +-PASS testObj.callCounter is 1 +-PASS closeEvent.wasClean is true +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-catalina-wk2/http/tests/workers/service/serviceworker-websocket.https-expected.txt b/LayoutTests/platform/mac-catalina-wk2/http/tests/workers/service/serviceworker-websocket.https-expected.txt +deleted file mode 100644 +index 67498a5e42b4271a980d6c51e6c5764bbe106a17..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk2/http/tests/workers/service/serviceworker-websocket.https-expected.txt ++++ /dev/null +@@ -1,4 +0,0 @@ +- +-PASS Setup worker +-PASS Open a WebSocket in service worker +- +diff --git a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/media-source/mediasource-invalid-codec-expected.txt b/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/media-source/mediasource-invalid-codec-expected.txt +deleted file mode 100644 +index 430aa981d4fe76223987b075732af58d466c4448..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/media-source/mediasource-invalid-codec-expected.txt ++++ /dev/null +@@ -1,4 +0,0 @@ +- +-PASS Test an MP4 with an invalid codec results in an error. +-FAIL Test a WebM with an invalid codec results in an error. assert_true: Media type not supported in this browser: isTypeSupported('video/webm; codecs="vp8"') expected true got false +- +diff --git a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/service-workers/service-worker/websocket-in-service-worker.https-expected.txt b/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/service-workers/service-worker/websocket-in-service-worker.https-expected.txt +deleted file mode 100644 +index 46108d50e23865234137ed0cc48cea091a0970ec..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/service-workers/service-worker/websocket-in-service-worker.https-expected.txt ++++ /dev/null +@@ -1,3 +0,0 @@ +- +-PASS Verify WebSockets can be created in a Service Worker +- +diff --git a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/service-workers/service-worker/websocket.https-expected.txt b/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/service-workers/service-worker/websocket.https-expected.txt +deleted file mode 100644 +index cd54602b11b93b1da76cf66aa031ca696c9f5a5f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/service-workers/service-worker/websocket.https-expected.txt ++++ /dev/null +@@ -1,3 +0,0 @@ +- +-PASS Verify WebSocket handshake channel does not get intercepted +- +diff --git a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/basic-auth.any-expected.txt b/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/basic-auth.any-expected.txt +deleted file mode 100644 +index 122214997512a11b045b2eaddde7c4185114fa10..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/basic-auth.any-expected.txt ++++ /dev/null +@@ -1,3 +0,0 @@ +- +-FAIL HTTP basic authentication should work with WebSockets assert_unreached: open should succeed Reached unreachable code +- +diff --git a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/basic-auth.any.worker-expected.txt b/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/basic-auth.any.worker-expected.txt +deleted file mode 100644 +index 122214997512a11b045b2eaddde7c4185114fa10..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/basic-auth.any.worker-expected.txt ++++ /dev/null +@@ -1,3 +0,0 @@ +- +-FAIL HTTP basic authentication should work with WebSockets assert_unreached: open should succeed Reached unreachable code +- +diff --git a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/remove-own-iframe-during-onerror.window-expected.txt b/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/remove-own-iframe-during-onerror.window-expected.txt +deleted file mode 100644 +index 9e2aaf25eb14d281f684a7b9edbe40954c642fe5..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina-wk2/imported/w3c/web-platform-tests/websockets/remove-own-iframe-during-onerror.window-expected.txt ++++ /dev/null +@@ -1,3 +0,0 @@ +- +-PASS removing an iframe from within an onerror handler should work +- +diff --git a/LayoutTests/platform/mac-catalina/TestExpectations b/LayoutTests/platform/mac-catalina/TestExpectations +deleted file mode 100644 +index 2e1e5c79cdb3cc218c8cc6e79535df9c66f95148..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/TestExpectations ++++ /dev/null +@@ -1,9 +0,0 @@ +-#////////////////////////////////////////////////////////////////////////////////////////// +-# Platform-specific tests. Enabled globally, then skipped here. +-#////////////////////////////////////////////////////////////////////////////////////////// +- +-accessibility/mac/media-query-values-change.html [ Skip ] +- +-# Skip some canvas tests due to some framework debugging output that interferes. +-imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-createImageBitmap-e_srgb.html [ Skip ] +-imported/w3c/web-platform-tests/html/canvas/element/manual/wide-gamut-canvas/canvas-drawImage-e_srgb.html [ Skip ] +diff --git a/LayoutTests/platform/mac-catalina/editing/input/reveal-caret-of-multiline-input-expected.txt b/LayoutTests/platform/mac-catalina/editing/input/reveal-caret-of-multiline-input-expected.txt +deleted file mode 100644 +index 8371300933be24061b839fbf543bd99a77b21abb..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/input/reveal-caret-of-multiline-input-expected.txt ++++ /dev/null +@@ -1,79 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x178 +- RenderBlock {HTML} at (0,0) size 800x178 +- RenderBody {BODY} at (8,8) size 784x162 +- RenderBlock {DIV} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 610x18 +- text run at (0,0) width 610: "When the caret is scrolled out, on starting typing it must be brought to the center of the control." +- RenderBlock (anonymous) at (0,18) size 784x144 +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +-layer at (10,28) size 91x136 clip at (11,29) size 74x134 scrollY 98 scrollHeight 420 +- RenderTextControl {TEXTAREA} at (2,2) size 91x136 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 70x416 +- RenderText {#text} at (0,0) size 20x403 +- text run at (0,0) width 14: "00" +- text run at (13,0) width 1: " " +- text run at (0,13) width 13: "01" +- text run at (12,13) width 1: " " +- text run at (0,26) width 14: "02" +- text run at (13,26) width 1: " " +- text run at (0,39) width 14: "03" +- text run at (13,39) width 1: " " +- text run at (0,52) width 15: "04" +- text run at (14,52) width 1: " " +- text run at (0,65) width 14: "05" +- text run at (13,65) width 1: " " +- text run at (0,78) width 15: "06" +- text run at (14,78) width 1: " " +- text run at (0,91) width 14: "07" +- text run at (13,91) width 1: " " +- text run at (0,104) width 15: "08" +- text run at (14,104) width 1: " " +- text run at (0,117) width 15: "09" +- text run at (14,117) width 1: " " +- text run at (0,130) width 13: "10" +- text run at (12,130) width 1: " " +- text run at (0,143) width 11: "11" +- text run at (10,143) width 1: " " +- text run at (0,156) width 20: ">12" +- text run at (19,156) width 1: " " +- text run at (0,169) width 13: "13" +- text run at (12,169) width 1: " " +- text run at (0,182) width 13: "14" +- text run at (12,182) width 1: " " +- text run at (0,195) width 13: "15" +- text run at (12,195) width 1: " " +- text run at (0,208) width 13: "16" +- text run at (12,208) width 1: " " +- text run at (0,221) width 12: "17" +- text run at (11,221) width 1: " " +- text run at (0,234) width 13: "18" +- text run at (12,234) width 1: " " +- text run at (0,247) width 13: "19" +- text run at (12,247) width 1: " " +- text run at (0,260) width 14: "20" +- text run at (13,260) width 1: " " +- text run at (0,273) width 12: "21" +- text run at (11,273) width 1: " " +- text run at (0,286) width 14: "22" +- text run at (13,286) width 1: " " +- text run at (0,299) width 14: "23" +- text run at (13,299) width 1: " " +- text run at (0,312) width 14: "24" +- text run at (13,312) width 1: " " +- text run at (0,325) width 14: "25" +- text run at (13,325) width 1: " " +- text run at (0,338) width 14: "26" +- text run at (13,338) width 1: " " +- text run at (0,351) width 14: "27" +- text run at (13,351) width 1: " " +- text run at (0,364) width 14: "28" +- text run at (13,364) width 1: " " +- text run at (0,377) width 14: "29" +- text run at (13,377) width 1: " " +- text run at (0,390) width 14: "30" +- text run at (13,390) width 1: " " +- RenderBR {BR} at (0,403) size 0x13 +-caret: position 37 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 3 {TEXTAREA} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/pasteboard/pasting-tabs-expected.txt b/LayoutTests/platform/mac-catalina/editing/pasteboard/pasting-tabs-expected.txt +deleted file mode 100644 +index 37826da9662d74836aa1cdbc447fcaf458699ec6..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/pasteboard/pasting-tabs-expected.txt ++++ /dev/null +@@ -1,36 +0,0 @@ +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of DIV > #document-fragment to 0 of DIV > #document-fragment toDOMRange:range from 0 of #text > DIV > #document-fragment to 11 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document +-EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: shouldInsertText:Tab-> <-Tab replacingDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document givenAction:WebViewInsertActionPasted +-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of DIV > BODY > HTML > #document to 0 of DIV > BODY > HTML > #document toDOMRange:range from 5 of #text > DIV > BODY > HTML > #document to 5 of #text > DIV > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChange:WebViewDidChangeNotification +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 783x36 +- text run at (0,0) width 663: "This tests copying plain text with tabs and pasting it into an editable region using paste and match tyle. " +- text run at (662,0) width 121: "The tabs should be" +- text run at (0,18) width 67: "preserved." +- RenderBlock (anonymous) at (0,52) size 784x36 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (0,88) size 784x18 +- RenderText {#text} at (0,0) size 39x18 +- text run at (0,0) width 39: "Tab->" +- RenderInline {SPAN} at (0,0) size 26x18 +- RenderText {#text} at (38,0) size 26x18 +- text run at (38,0) width 26: "\x{9}" +- RenderText {#text} at (64,0) size 39x18 +- text run at (64,0) width 39: "<-Tab" +-layer at (10,62) size 161x32 clip at (11,63) size 159x30 +- RenderTextControl {TEXTAREA} at (2,2) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x13 +- RenderText {#text} at (0,0) size 83x13 +- text run at (0,0) width 83: "Tab->\x{9}<-Tab" +-caret: position 5 of child 2 {#text} of child 4 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/3690703-2-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/3690703-2-expected.txt +deleted file mode 100644 +index 7a1ac25d5f9742f29ce9e4844fc8ca1f5d33c906..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/3690703-2-expected.txt ++++ /dev/null +@@ -1,152 +0,0 @@ +-EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of DIV > CENTER > BODY > HTML > #document to 6 of DIV > CENTER > BODY > HTML > #document +-EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,3) size 784x581 [bgcolor=#FFFFFF] +- RenderBlock {CENTER} at (0,0) size 784x258 +- RenderTable {TABLE} at (0,0) size 784x19 +- RenderTableSection {TBODY} at (0,0) size 784x19 +- RenderTableRow {TR} at (0,0) size 784x15 +- RenderTableCell {TD} at (0,0) size 784x15 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 102x15 +- RenderInline {A} at (0,0) size 102x15 [color=#0000CC] +- RenderText {#text} at (682,0) size 102x15 +- text run at (682,0) width 102: "Personalized Home" +- RenderTableRow {TR} at (0,15) size 784x4 +- RenderTableCell {TD} at (0,16) size 784x2 [r=1 c=0 rs=1 cs=1] +- RenderImage {IMG} at (0,0) size 1x1 +- RenderBlock (anonymous) at (0,19) size 784x36 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBlock {DIV} at (0,55) size 784x105 [border: (2px solid #AAAAFF)] +- RenderTable {TABLE} at (214,2) size 355x23 +- RenderTableSection {TBODY} at (0,0) size 355x23 +- RenderTableRow {TR} at (0,0) size 355x23 +- RenderTableCell {TD} at (0,0) size 355x23 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 347x15 +- RenderInline {B} at (0,0) size 26x15 +- RenderText {#text} at (4,4) size 26x15 +- text run at (4,4) width 26: "Web" +- RenderText {#text} at (29,4) size 14x15 +- text run at (29,4) width 14: " " +- RenderInline {A} at (0,0) size 38x15 [color=#0000CC] +- RenderText {#text} at (42,4) size 38x15 +- text run at (42,4) width 38: "Images" +- RenderText {#text} at (79,4) size 14x15 +- text run at (79,4) width 14: " " +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (92,4) size 40x15 +- text run at (92,4) width 40: "Groups" +- RenderText {#text} at (131,4) size 14x15 +- text run at (131,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (144,4) size 30x15 +- text run at (144,4) width 30: "News" +- RenderText {#text} at (173,4) size 14x15 +- text run at (173,4) width 14: " " +- RenderInline {A} at (0,0) size 42x15 [color=#0000CC] +- RenderText {#text} at (186,4) size 42x15 +- text run at (186,4) width 42: "Froogle" +- RenderText {#text} at (227,4) size 14x15 +- text run at (227,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (240,4) size 30x15 +- text run at (240,4) width 30: "Local" +- RenderInline {SUP} at (0,0) size 1x13 +- RenderInline {A} at (0,0) size 30x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (269,4) size 30x15 +- text run at (269,4) width 30: "New!" +- RenderText {#text} at (298,4) size 14x15 +- text run at (298,4) width 14: " " +- RenderInline {B} at (0,0) size 40x15 +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (311,4) size 40x15 +- text run at (311,4) width 40: "more \x{BB}" +- RenderTable {TABLE} at (2,25) size 780x45 +- RenderTableSection {TBODY} at (0,0) size 780x45 +- RenderTableRow {TR} at (0,0) size 780x45 +- RenderTableCell {TD} at (0,13) size 192x19 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (0,-1) size 4x20 +- text run at (0,0) width 4: " " +- RenderTableCell {TD} at (191,0) size 397x45 [r=0 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (2,2) size 392x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (395,2) size 1x18 +- RenderButton {INPUT} at (95,25) size 94x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 77x13 +- RenderText at (0,0) size 77x13 +- text run at (0,0) width 77: "Google Search" +- RenderButton {INPUT} at (192,25) size 108x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 91x13 +- RenderText at (0,0) size 91x13 +- text run at (0,0) width 91: "I'm Feeling Lucky" +- RenderTableCell {TD} at (587,0) size 194x39 [r=0 c=2 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 76x39 +- RenderText {#text} at (0,0) size 5x13 +- text run at (0,0) width 5: " " +- RenderInline {A} at (0,0) size 71x13 [color=#0000CC] +- RenderText {#text} at (5,0) size 71x13 +- text run at (5,0) width 71: "Advanced Search" +- RenderBR {BR} at (75,0) size 1x13 +- RenderText {#text} at (0,13) size 5x13 +- text run at (0,13) width 5: " " +- RenderInline {A} at (0,0) size 47x13 [color=#0000CC] +- RenderText {#text} at (5,13) size 47x13 +- text run at (5,13) width 47: "Preferences" +- RenderBR {BR} at (51,13) size 1x13 +- RenderText {#text} at (0,26) size 5x13 +- text run at (0,26) width 5: " " +- RenderInline {A} at (0,0) size 65x13 [color=#0000CC] +- RenderText {#text} at (5,26) size 65x13 +- text run at (5,26) width 65: "Language Tools" +- RenderBlock (anonymous) at (2,70) size 780x33 +- RenderBR {BR} at (390,0) size 0x18 +- RenderInline {FONT} at (0,0) size 146x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (317,18) size 30x15 +- text run at (317,18) width 30: "New!" +- RenderText {#text} at (346,18) size 4x15 +- text run at (346,18) width 4: " " +- RenderInline {A} at (0,0) size 111x15 [color=#0000CC] +- RenderText {#text} at (349,18) size 111x15 +- text run at (349,18) width 111: "Personalize this page" +- RenderText {#text} at (459,18) size 4x15 +- text run at (459,18) width 4: "." +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,160) size 784x69 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBR {BR} at (392,36) size 0x18 +- RenderInline {FONT} at (0,0) size 310x15 +- RenderInline {A} at (0,0) size 116x15 [color=#0000CC] +- RenderText {#text} at (237,54) size 116x15 +- text run at (237,54) width 116: "Advertising Programs" +- RenderText {#text} at (352,54) size 11x15 +- text run at (352,54) width 11: " - " +- RenderInline {A} at (0,0) size 100x15 [color=#0000CC] +- RenderText {#text} at (362,54) size 100x15 +- text run at (362,54) width 100: "Business Solutions" +- RenderText {#text} at (461,54) size 12x15 +- text run at (461,54) width 12: " - " +- RenderInline {A} at (0,0) size 75x15 [color=#0000CC] +- RenderText {#text} at (472,54) size 75x15 +- text run at (472,54) width 75: "About Google" +- RenderBlock {P} at (0,245) size 784x13 +- RenderInline {FONT} at (0,0) size 60x13 +- RenderText {#text} at (362,0) size 60x13 +- text run at (362,0) width 60: "\x{A9}2005 Google" +-layer at (207,88) size 386x13 backgroundClip at (207,88) size 385x13 clip at (207,88) size 385x13 +- RenderBlock {DIV} at (3,3) size 386x13 +-selection start: position 0 of child 3 {INPUT} of child 1 {TD} of child 0 {TR} of child 0 {TBODY} of child 2 {TABLE} of child 4 {DIV} of child 0 {CENTER} of body +-selection end: position 1 of child 2 {BR} of child 0 {FONT} of child 2 {TD} of child 0 {TR} of child 0 {TBODY} of child 2 {TABLE} of child 4 {DIV} of child 0 {CENTER} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/3690703-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/3690703-expected.txt +deleted file mode 100644 +index 32dad22c5a1e23bde3007e6b09a4daa284dea854..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/3690703-expected.txt ++++ /dev/null +@@ -1,154 +0,0 @@ +-EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of DIV > CENTER > BODY > HTML > #document to 6 of DIV > CENTER > BODY > HTML > #document +-EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,3) size 784x581 [bgcolor=#FFFFFF] +- RenderBlock {CENTER} at (0,0) size 784x258 +- RenderTable {TABLE} at (0,0) size 784x19 +- RenderTableSection {TBODY} at (0,0) size 784x19 +- RenderTableRow {TR} at (0,0) size 784x15 +- RenderTableCell {TD} at (0,0) size 784x15 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 102x15 +- RenderInline {A} at (0,0) size 102x15 [color=#0000CC] +- RenderText {#text} at (682,0) size 102x15 +- text run at (682,0) width 102: "Personalized Home" +- RenderTableRow {TR} at (0,15) size 784x4 +- RenderTableCell {TD} at (0,16) size 784x2 [r=1 c=0 rs=1 cs=1] +- RenderImage {IMG} at (0,0) size 1x1 +- RenderBlock (anonymous) at (0,19) size 784x36 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBlock {DIV} at (0,55) size 784x105 [border: (2px solid #AAAAFF)] +- RenderTable {TABLE} at (214,2) size 355x23 +- RenderTableSection {TBODY} at (0,0) size 355x23 +- RenderTableRow {TR} at (0,0) size 355x23 +- RenderTableCell {TD} at (0,0) size 355x23 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 347x15 +- RenderInline {B} at (0,0) size 26x15 +- RenderText {#text} at (4,4) size 26x15 +- text run at (4,4) width 26: "Web" +- RenderText {#text} at (29,4) size 14x15 +- text run at (29,4) width 14: " " +- RenderInline {A} at (0,0) size 38x15 [color=#0000CC] +- RenderText {#text} at (42,4) size 38x15 +- text run at (42,4) width 38: "Images" +- RenderText {#text} at (79,4) size 14x15 +- text run at (79,4) width 14: " " +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (92,4) size 40x15 +- text run at (92,4) width 40: "Groups" +- RenderText {#text} at (131,4) size 14x15 +- text run at (131,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (144,4) size 30x15 +- text run at (144,4) width 30: "News" +- RenderText {#text} at (173,4) size 14x15 +- text run at (173,4) width 14: " " +- RenderInline {A} at (0,0) size 42x15 [color=#0000CC] +- RenderText {#text} at (186,4) size 42x15 +- text run at (186,4) width 42: "Froogle" +- RenderText {#text} at (227,4) size 14x15 +- text run at (227,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (240,4) size 30x15 +- text run at (240,4) width 30: "Local" +- RenderInline {SUP} at (0,0) size 1x13 +- RenderInline {A} at (0,0) size 30x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (269,4) size 30x15 +- text run at (269,4) width 30: "New!" +- RenderText {#text} at (298,4) size 14x15 +- text run at (298,4) width 14: " " +- RenderInline {B} at (0,0) size 40x15 +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (311,4) size 40x15 +- text run at (311,4) width 40: "more \x{BB}" +- RenderTable {TABLE} at (2,25) size 780x45 +- RenderTableSection {TBODY} at (0,0) size 780x45 +- RenderTableRow {TR} at (0,0) size 780x45 +- RenderTableCell {TD} at (0,13) size 192x19 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (0,-1) size 4x20 +- text run at (0,0) width 4: " " +- RenderTableCell {TD} at (191,0) size 397x45 [r=0 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (2,2) size 392x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (395,2) size 1x18 +- RenderButton {INPUT} at (95,25) size 94x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 77x13 +- RenderText at (0,0) size 77x13 +- text run at (0,0) width 77: "Google Search" +- RenderButton {INPUT} at (192,25) size 108x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 91x13 +- RenderText at (0,0) size 91x13 +- text run at (0,0) width 91: "I'm Feeling Lucky" +- RenderTableCell {TD} at (587,0) size 194x39 [r=0 c=2 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 76x39 +- RenderText {#text} at (0,0) size 5x13 +- text run at (0,0) width 5: " " +- RenderInline {A} at (0,0) size 71x13 [color=#0000CC] +- RenderText {#text} at (5,0) size 71x13 +- text run at (5,0) width 71: "Advanced Search" +- RenderBR {BR} at (75,0) size 1x13 +- RenderText {#text} at (0,13) size 5x13 +- text run at (0,13) width 5: " " +- RenderInline {A} at (0,0) size 47x13 [color=#0000CC] +- RenderText {#text} at (5,13) size 47x13 +- text run at (5,13) width 47: "Preferences" +- RenderBR {BR} at (51,13) size 1x13 +- RenderText {#text} at (0,26) size 5x13 +- text run at (0,26) width 5: " " +- RenderInline {A} at (0,0) size 65x13 [color=#0000CC] +- RenderText {#text} at (5,26) size 65x13 +- text run at (5,26) width 65: "Language Tools" +- RenderBlock (anonymous) at (2,70) size 780x33 +- RenderBR {BR} at (390,0) size 0x18 +- RenderInline {FONT} at (0,0) size 146x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (317,18) size 30x15 +- text run at (317,18) width 30: "New!" +- RenderText {#text} at (346,18) size 4x15 +- text run at (346,18) width 4: " " +- RenderInline {A} at (0,0) size 111x15 [color=#0000CC] +- RenderText {#text} at (349,18) size 111x15 +- text run at (349,18) width 111: "Personalize this page" +- RenderText {#text} at (459,18) size 4x15 +- text run at (459,18) width 4: "." +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,160) size 784x69 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBR {BR} at (392,36) size 0x18 +- RenderInline {FONT} at (0,0) size 310x15 +- RenderInline {A} at (0,0) size 116x15 [color=#0000CC] +- RenderText {#text} at (237,54) size 116x15 +- text run at (237,54) width 116: "Advertising Programs" +- RenderText {#text} at (352,54) size 11x15 +- text run at (352,54) width 11: " - " +- RenderInline {A} at (0,0) size 100x15 [color=#0000CC] +- RenderText {#text} at (362,54) size 100x15 +- text run at (362,54) width 100: "Business Solutions" +- RenderText {#text} at (461,54) size 12x15 +- text run at (461,54) width 12: " - " +- RenderInline {A} at (0,0) size 75x15 [color=#0000CC] +- RenderText {#text} at (472,54) size 75x15 +- text run at (472,54) width 75: "About Google" +- RenderBlock {P} at (0,245) size 784x13 +- RenderInline {FONT} at (0,0) size 60x13 +- RenderText {#text} at (362,0) size 60x13 +- text run at (362,0) width 60: "\x{A9}2005 Google" +-layer at (207,88) size 386x13 backgroundClip at (207,88) size 385x13 clip at (207,88) size 385x13 +- RenderBlock {DIV} at (3,3) size 386x13 +-selection start: position 0 of child 1 {TABLE} of child 4 {DIV} of child 0 {CENTER} of body +-selection end: position 1 of child 3 {#text} of child 4 {FONT} of child 4 {DIV} of child 0 {CENTER} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/3690719-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/3690719-expected.txt +deleted file mode 100644 +index 25e25b38d0bcb7fc7b9ead0faad05c62c539c9e7..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/3690719-expected.txt ++++ /dev/null +@@ -1,146 +0,0 @@ +-EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of DIV > CENTER > BODY > HTML > #document to 6 of DIV > CENTER > BODY > HTML > #document +-EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 1 of DIV > CENTER > BODY > HTML > #document to 1 of DIV > CENTER > BODY > HTML > #document toDOMRange:range from 1 of DIV > CENTER > BODY > HTML > #document to 1 of #text > FONT > DIV > CENTER > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,3) size 784x581 [bgcolor=#FFFFFF] +- RenderBlock {CENTER} at (0,0) size 784x258 +- RenderTable {TABLE} at (0,0) size 784x19 +- RenderTableSection {TBODY} at (0,0) size 784x19 +- RenderTableRow {TR} at (0,0) size 784x15 +- RenderTableCell {TD} at (0,0) size 784x15 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 102x15 +- RenderInline {A} at (0,0) size 102x15 [color=#0000CC] +- RenderText {#text} at (682,0) size 102x15 +- text run at (682,0) width 102: "Personalized Home" +- RenderTableRow {TR} at (0,15) size 784x4 +- RenderTableCell {TD} at (0,16) size 784x2 [r=1 c=0 rs=1 cs=1] +- RenderImage {IMG} at (0,0) size 1x1 +- RenderBlock (anonymous) at (0,19) size 784x36 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBlock {DIV} at (0,55) size 784x105 [border: (2px solid #AAAAFF)] +- RenderTable {TABLE} at (214,2) size 355x23 +- RenderTableSection {TBODY} at (0,0) size 355x23 +- RenderTableRow {TR} at (0,0) size 355x23 +- RenderTableCell {TD} at (0,0) size 355x23 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 347x15 +- RenderInline {B} at (0,0) size 26x15 +- RenderText {#text} at (4,4) size 26x15 +- text run at (4,4) width 26: "Web" +- RenderText {#text} at (29,4) size 14x15 +- text run at (29,4) width 14: " " +- RenderInline {A} at (0,0) size 38x15 [color=#0000CC] +- RenderText {#text} at (42,4) size 38x15 +- text run at (42,4) width 38: "Images" +- RenderText {#text} at (79,4) size 14x15 +- text run at (79,4) width 14: " " +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (92,4) size 40x15 +- text run at (92,4) width 40: "Groups" +- RenderText {#text} at (131,4) size 14x15 +- text run at (131,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (144,4) size 30x15 +- text run at (144,4) width 30: "News" +- RenderText {#text} at (173,4) size 14x15 +- text run at (173,4) width 14: " " +- RenderInline {A} at (0,0) size 42x15 [color=#0000CC] +- RenderText {#text} at (186,4) size 42x15 +- text run at (186,4) width 42: "Froogle" +- RenderText {#text} at (227,4) size 14x15 +- text run at (227,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (240,4) size 30x15 +- text run at (240,4) width 30: "Local" +- RenderInline {SUP} at (0,0) size 1x13 +- RenderInline {A} at (0,0) size 30x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (269,4) size 30x15 +- text run at (269,4) width 30: "New!" +- RenderText {#text} at (298,4) size 14x15 +- text run at (298,4) width 14: " " +- RenderInline {B} at (0,0) size 40x15 +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (311,4) size 40x15 +- text run at (311,4) width 40: "more \x{BB}" +- RenderTable {TABLE} at (2,25) size 780x45 +- RenderTableSection {TBODY} at (0,0) size 780x45 +- RenderTableRow {TR} at (0,0) size 780x45 +- RenderTableCell {TD} at (0,13) size 192x19 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (0,-1) size 4x20 +- text run at (0,0) width 4: " " +- RenderTableCell {TD} at (191,0) size 397x45 [r=0 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (2,2) size 392x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (395,2) size 1x18 +- RenderButton {INPUT} at (95,25) size 94x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 77x13 +- RenderText at (0,0) size 77x13 +- text run at (0,0) width 77: "Google Search" +- RenderButton {INPUT} at (192,25) size 108x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 91x13 +- RenderText at (0,0) size 91x13 +- text run at (0,0) width 91: "I'm Feeling Lucky" +- RenderTableCell {TD} at (587,0) size 194x39 [r=0 c=2 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 76x39 +- RenderText {#text} at (0,0) size 5x13 +- text run at (0,0) width 5: " " +- RenderInline {A} at (0,0) size 71x13 [color=#0000CC] +- RenderText {#text} at (5,0) size 71x13 +- text run at (5,0) width 71: "Advanced Search" +- RenderBR {BR} at (75,0) size 1x13 +- RenderText {#text} at (0,13) size 5x13 +- text run at (0,13) width 5: " " +- RenderInline {A} at (0,0) size 47x13 [color=#0000CC] +- RenderText {#text} at (5,13) size 47x13 +- text run at (5,13) width 47: "Preferences" +- RenderBR {BR} at (51,13) size 1x13 +- RenderText {#text} at (0,26) size 5x13 +- text run at (0,26) width 5: " " +- RenderInline {A} at (0,0) size 65x13 [color=#0000CC] +- RenderText {#text} at (5,26) size 65x13 +- text run at (5,26) width 65: "Language Tools" +- RenderBlock (anonymous) at (2,70) size 780x33 +- RenderBR {BR} at (390,0) size 0x18 +- RenderInline {FONT} at (0,0) size 146x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (317,18) size 30x15 +- text run at (317,18) width 30: "New!" +- RenderText {#text} at (346,18) size 4x15 +- text run at (346,18) width 4: " " +- RenderInline {A} at (0,0) size 111x15 [color=#0000CC] +- RenderText {#text} at (349,18) size 111x15 +- text run at (349,18) width 111: "Personalize this page" +- RenderText {#text} at (459,18) size 4x15 +- text run at (459,18) width 4: "." +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,160) size 784x69 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBR {BR} at (392,36) size 0x18 +- RenderInline {FONT} at (0,0) size 310x15 +- RenderInline {A} at (0,0) size 116x15 [color=#0000CC] +- RenderText {#text} at (237,54) size 116x15 +- text run at (237,54) width 116: "Advertising Programs" +- RenderText {#text} at (352,54) size 11x15 +- text run at (352,54) width 11: " - " +- RenderInline {A} at (0,0) size 100x15 [color=#0000CC] +- RenderText {#text} at (362,54) size 100x15 +- text run at (362,54) width 100: "Business Solutions" +- RenderText {#text} at (461,54) size 12x15 +- text run at (461,54) width 12: " - " +- RenderInline {A} at (0,0) size 75x15 [color=#0000CC] +- RenderText {#text} at (472,54) size 75x15 +- text run at (472,54) width 75: "About Google" +- RenderBlock {P} at (0,245) size 784x13 +- RenderInline {FONT} at (0,0) size 60x13 +- RenderText {#text} at (362,0) size 60x13 +- text run at (362,0) width 60: "\x{A9}2005 Google" +-layer at (207,88) size 386x13 backgroundClip at (207,88) size 385x13 clip at (207,88) size 385x13 +- RenderBlock {DIV} at (3,3) size 386x13 +-selection start: position 0 of child 1 {TABLE} of child 4 {DIV} of child 0 {CENTER} of body +-selection end: position 1 of child 3 {#text} of child 4 {FONT} of child 4 {DIV} of child 0 {CENTER} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/select-from-textfield-outwards-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/select-from-textfield-outwards-expected.txt +deleted file mode 100644 +index 80407d10f1cb03a6a1a57fe5cc4a6c5f9cd33b1f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/select-from-textfield-outwards-expected.txt ++++ /dev/null +@@ -1,51 +0,0 @@ +-EDITING DELEGATE: shouldChangeSelectedDOMRange:(null) toDOMRange:range from 13 of #text > DIV > #document-fragment to 13 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 13 of #text > DIV > #document-fragment to 13 of #text > DIV > #document-fragment toDOMRange:range from 12 of #text > DIV > #document-fragment to 17 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 12 of #text > DIV > #document-fragment to 17 of #text > DIV > #document-fragment toDOMRange:range from 0 of #text > DIV > #document-fragment to 17 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of #text > DIV > #document-fragment to 17 of #text > DIV > #document-fragment toDOMRange:range from 12 of #text > DIV > #document-fragment to 17 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 12 of #text > DIV > #document-fragment to 17 of #text > DIV > #document-fragment toDOMRange:range from 0 of #text > DIV > #document-fragment to 17 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 0 of #text > DIV > #document-fragment to 17 of #text > DIV > #document-fragment toDOMRange:range from 12 of #text > DIV > #document-fragment to 17 of #text > DIV > #document-fragment affinity:NSSelectionAffinityDownstream stillSelecting:FALSE +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 108x18 +- text run at (0,0) width 108: "This is a test for " +- RenderInline {I} at (0,0) size 766x36 +- RenderInline {A} at (0,0) size 353x18 [color=#0000EE] +- RenderText {#text} at (107,0) size 353x18 +- text run at (107,0) width 353: "http://bugzilla.opendarwin.org/show_bug.cgi?id=9312" +- RenderText {#text} at (459,0) size 766x36 +- text run at (459,0) width 5: " " +- text run at (463,0) width 303: "REGRESSION: Selection bug in new text fields" +- text run at (0,18) width 216: "when selecting past the first letter" +- RenderText {#text} at (215,18) size 5x18 +- text run at (215,18) width 5: "." +- RenderBlock {HR} at (0,52) size 784x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,70) size 784x54 +- RenderText {#text} at (0,0) size 771x54 +- text run at (0,0) width 761: "Curabitur pretium, quam quis semper malesuada, est libero feugiat libero, vel fringilla orci nibh sed neque. Quisque eu" +- text run at (0,18) width 771: "nulla non nisi molestie accumsan. Etiam tellus urna, laoreet ac, laoreet non, suscipit sed, sapien. Phasellus vehicula, sem" +- text run at (0,36) width 569: "at posuere vehicula, augue nibh molestie nisl, nec ullamcorper lacus ante vulputate pede." +- RenderBlock (anonymous) at (0,140) size 784x92 +- RenderTextControl {INPUT} at (20,20) size 324x52 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,248) size 784x72 +- RenderText {#text} at (0,0) size 772x72 +- text run at (0,0) width 772: "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris viverra augue vitae purus." +- text run at (0,18) width 728: "Morbi sed sem. Donec dui nisi, ultrices non, pretium quis, hendrerit non, est. Donec tellus. Donec eget dui id eros" +- text run at (0,36) width 767: "pharetra rutrum. Suspendisse sodales lectus sit amet nulla. Morbi tortor arcu, convallis blandit, elementum eu, aliquet a," +- text run at (0,54) width 39: "tellus." +-layer at (40,180) size 299x28 +- RenderBlock {DIV} at (12,12) size 300x28 +- RenderText {#text} at (0,0) size 192x28 +- text run at (0,0) width 192: "Lorem ipsum dolor" +-selection start: position 12 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body +-selection end: position 17 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-br-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-br-expected.txt +deleted file mode 100644 +index 4f97f5f52bc2d977bf0c81d8d17bf863a115c2b0..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-br-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x198 +- RenderBlock {HTML} at (0,0) size 800x199 +- RenderBody {BODY} at (8,16) size 784x170 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "This tests horizontal caret movement in vertical writing mode." +- RenderBlock {DIV} at (0,34) size 88x136 +- RenderBlock {P} at (20,0) size 48x136 +- RenderText {#text} at (1,38) size 23x98 +- text run at (1,38) width 97 RTL: "\x{5D0}\x{5E0}\x{5D9} \x{5D7}\x{5EA}\x{5D5}\x{5DC}." +- RenderBR {BR} at (1,38) size 23x1 +- RenderText {#text} at (25,28) size 23x108 +- text run at (25,28) width 107 RTL: "\x{5D0}\x{5D9}\x{5DF} \x{5DC}\x{5D9} \x{5E9}\x{5DD}." +- RenderBlock {PRE} at (0,182) size 784x0 +-selection start: position 5 of child 0 {#text} of child 1 {P} of child 3 {DIV} of body +-selection end: position 5 of child 2 {#text} of child 1 {P} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-br-mixed-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-br-mixed-expected.txt +deleted file mode 100644 +index 22dfcfffebca0e2562dc6701d40d051bb5a17881..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-br-mixed-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x198 +- RenderBlock {HTML} at (0,0) size 800x199 +- RenderBody {BODY} at (8,16) size 784x170 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "This tests horizontal caret movement in vertical writing mode." +- RenderBlock {DIV} at (0,34) size 86x136 +- RenderBlock {P} at (20,0) size 46x136 +- RenderText {#text} at (0,38) size 23x98 +- text run at (0,38) width 97 RTL: "\x{5D0}\x{5E0}\x{5D9} \x{5D7}\x{5EA}\x{5D5}\x{5DC}." +- RenderBR {BR} at (0,38) size 23x1 +- RenderText {#text} at (23,28) size 23x108 +- text run at (23,28) width 107 RTL: "\x{5D0}\x{5D9}\x{5DF} \x{5DC}\x{5D9} \x{5E9}\x{5DD}." +- RenderBlock {PRE} at (0,182) size 784x0 +-selection start: position 5 of child 0 {#text} of child 1 {P} of child 3 {DIV} of body +-selection end: position 5 of child 2 {#text} of child 1 {P} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-p-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-p-expected.txt +deleted file mode 100644 +index e761f6b7ff9c6cc2cc61aab5ad88a74e4cceae14..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-p-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x198 +- RenderBlock {HTML} at (0,0) size 800x199 +- RenderBody {BODY} at (8,16) size 784x170 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "This tests horizontal caret movement in vertical writing mode." +- RenderBlock {DIV} at (0,34) size 108x136 +- RenderBlock {P} at (20,0) size 24x136 +- RenderText {#text} at (1,38) size 23x98 +- text run at (1,38) width 97 RTL: "\x{5D0}\x{5E0}\x{5D9} \x{5D7}\x{5EA}\x{5D5}\x{5DC}." +- RenderBlock {P} at (64,0) size 24x136 +- RenderText {#text} at (1,28) size 23x108 +- text run at (1,28) width 107 RTL: "\x{5D0}\x{5D9}\x{5DF} \x{5DC}\x{5D9} \x{5E9}\x{5DD}." +- RenderBlock {PRE} at (0,182) size 784x0 +-selection start: position 5 of child 0 {#text} of child 1 {P} of child 3 {DIV} of body +-selection end: position 5 of child 0 {#text} of child 2 {P} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-p-mixed-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-p-mixed-expected.txt +deleted file mode 100644 +index 891c24d831f34ad8f185359425dd01a4221f74ae..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-backward-p-mixed-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x198 +- RenderBlock {HTML} at (0,0) size 800x199 +- RenderBody {BODY} at (8,16) size 784x170 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "This tests horizontal caret movement in vertical writing mode." +- RenderBlock {DIV} at (0,34) size 106x136 +- RenderBlock {P} at (20,0) size 23x136 +- RenderText {#text} at (0,38) size 23x98 +- text run at (0,38) width 97 RTL: "\x{5D0}\x{5E0}\x{5D9} \x{5D7}\x{5EA}\x{5D5}\x{5DC}." +- RenderBlock {P} at (63,0) size 23x136 +- RenderText {#text} at (0,28) size 23x108 +- text run at (0,28) width 107 RTL: "\x{5D0}\x{5D9}\x{5DF} \x{5DC}\x{5D9} \x{5E9}\x{5DD}." +- RenderBlock {PRE} at (0,182) size 784x0 +-selection start: position 5 of child 0 {#text} of child 1 {P} of child 3 {DIV} of body +-selection end: position 5 of child 0 {#text} of child 2 {P} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-br-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-br-expected.txt +deleted file mode 100644 +index 04a3504736fce6af14db733f990869f9d45f254b..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-br-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x198 +- RenderBlock {HTML} at (0,0) size 800x199 +- RenderBody {BODY} at (8,16) size 784x170 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "This tests horizontal caret movement in vertical writing mode." +- RenderBlock {DIV} at (0,34) size 88x136 +- RenderBlock {P} at (20,0) size 48x136 +- RenderText {#text} at (1,38) size 23x98 +- text run at (1,38) width 97 RTL: "\x{5D0}\x{5E0}\x{5D9} \x{5D7}\x{5EA}\x{5D5}\x{5DC}." +- RenderBR {BR} at (1,38) size 23x1 +- RenderText {#text} at (25,28) size 23x108 +- text run at (25,28) width 107 RTL: "\x{5D0}\x{5D9}\x{5DF} \x{5DC}\x{5D9} \x{5E9}\x{5DD}." +- RenderBlock {PRE} at (0,182) size 784x0 +-selection start: position 5 of child 0 {#text} of child 1 {P} of child 3 {DIV} of body +-selection end: position 6 of child 2 {#text} of child 1 {P} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-br-mixed-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-br-mixed-expected.txt +deleted file mode 100644 +index fde18a13956a5f6325ab94082555f98db438bd1d..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-br-mixed-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x198 +- RenderBlock {HTML} at (0,0) size 800x199 +- RenderBody {BODY} at (8,16) size 784x170 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "This tests horizontal caret movement in vertical writing mode." +- RenderBlock {DIV} at (0,34) size 86x136 +- RenderBlock {P} at (20,0) size 46x136 +- RenderText {#text} at (0,38) size 23x98 +- text run at (0,38) width 97 RTL: "\x{5D0}\x{5E0}\x{5D9} \x{5D7}\x{5EA}\x{5D5}\x{5DC}." +- RenderBR {BR} at (0,38) size 23x1 +- RenderText {#text} at (23,28) size 23x108 +- text run at (23,28) width 107 RTL: "\x{5D0}\x{5D9}\x{5DF} \x{5DC}\x{5D9} \x{5E9}\x{5DD}." +- RenderBlock {PRE} at (0,182) size 784x0 +-selection start: position 5 of child 0 {#text} of child 1 {P} of child 3 {DIV} of body +-selection end: position 6 of child 2 {#text} of child 1 {P} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-p-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-p-expected.txt +deleted file mode 100644 +index a22c993a11e0be238e4cd3342f3f09cb99a32210..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-p-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x198 +- RenderBlock {HTML} at (0,0) size 800x199 +- RenderBody {BODY} at (8,16) size 784x170 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "This tests horizontal caret movement in vertical writing mode." +- RenderBlock {DIV} at (0,34) size 108x136 +- RenderBlock {P} at (20,0) size 24x136 +- RenderText {#text} at (1,38) size 23x98 +- text run at (1,38) width 97 RTL: "\x{5D0}\x{5E0}\x{5D9} \x{5D7}\x{5EA}\x{5D5}\x{5DC}." +- RenderBlock {P} at (64,0) size 24x136 +- RenderText {#text} at (1,28) size 23x108 +- text run at (1,28) width 107 RTL: "\x{5D0}\x{5D9}\x{5DF} \x{5DC}\x{5D9} \x{5E9}\x{5DD}." +- RenderBlock {PRE} at (0,182) size 784x0 +-selection start: position 5 of child 0 {#text} of child 1 {P} of child 3 {DIV} of body +-selection end: position 6 of child 0 {#text} of child 2 {P} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-p-mixed-expected.txt b/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-p-mixed-expected.txt +deleted file mode 100644 +index cce89403acaf0917e53f81d700070e9866a82ded..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/editing/selection/vertical-rl-rtl-extend-line-forward-p-mixed-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x198 +- RenderBlock {HTML} at (0,0) size 800x199 +- RenderBody {BODY} at (8,16) size 784x170 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "This tests horizontal caret movement in vertical writing mode." +- RenderBlock {DIV} at (0,34) size 106x136 +- RenderBlock {P} at (20,0) size 23x136 +- RenderText {#text} at (0,38) size 23x98 +- text run at (0,38) width 97 RTL: "\x{5D0}\x{5E0}\x{5D9} \x{5D7}\x{5EA}\x{5D5}\x{5DC}." +- RenderBlock {P} at (63,0) size 23x136 +- RenderText {#text} at (0,28) size 23x108 +- text run at (0,28) width 107 RTL: "\x{5D0}\x{5D9}\x{5DF} \x{5DC}\x{5D9} \x{5E9}\x{5DD}." +- RenderBlock {PRE} at (0,182) size 784x0 +-selection start: position 5 of child 0 {#text} of child 1 {P} of child 3 {DIV} of body +-selection end: position 6 of child 0 {#text} of child 2 {P} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/fast/block/basic/001-expected.txt b/LayoutTests/platform/mac-catalina/fast/block/basic/001-expected.txt +deleted file mode 100644 +index 343ee2caf411d381634cb7638ebceae9e121a52d..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/block/basic/001-expected.txt ++++ /dev/null +@@ -1,33 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {DIV} at (0,0) size 784x185 [border: (2px solid #FF0000)] +- RenderBlock (anonymous) at (2,2) size 780x18 +- RenderInline {I} at (0,0) size 235x18 +- RenderText {#text} at (0,0) size 96x18 +- text run at (0,0) width 96: "Start of a line. " +- RenderInline {FONT} at (0,0) size 140x18 [color=#FF0000] +- RenderText {#text} at (95,0) size 140x18 +- text run at (95,0) width 140: "More red on this line:" +- RenderBlock (anonymous) at (2,38) size 780x71 [color=#FF0000] +- RenderBlock {H3} at (0,0) size 780x22 +- RenderText {#text} at (0,0) size 208x22 +- text run at (0,0) width 208: "Suddenly a block appears!" +- RenderBlock {H2} at (0,41) size 780x29 +- RenderText {#text} at (0,0) size 194x28 +- text run at (0,0) width 194: "And another block!" +- RenderBlock (anonymous) at (2,128) size 780x55 +- RenderInline {I} at (0,0) size 299x36 +- RenderInline {FONT} at (0,0) size 97x36 [color=#FF0000] +- RenderText {#text} at (0,0) size 97x18 +- text run at (0,0) width 97: "Now more text." +- RenderBR {BR} at (96,0) size 1x18 +- RenderText {#text} at (0,18) size 67x18 +- text run at (0,18) width 67: "This is red" +- RenderText {#text} at (66,18) size 233x18 +- text run at (66,18) width 233: " but now only italic on the same line" +- RenderBR {BR} at (298,18) size 1x18 +- RenderText {#text} at (0,36) size 132x18 +- text run at (0,36) width 132: "Plain line at the end." +diff --git a/LayoutTests/platform/mac-catalina/fast/block/float/float-avoidance-expected.txt b/LayoutTests/platform/mac-catalina/fast/block/float/float-avoidance-expected.txt +deleted file mode 100644 +index e248c17ebc279d743eb12a8414367921d29e8f00..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/block/float/float-avoidance-expected.txt ++++ /dev/null +@@ -1,337 +0,0 @@ +-layer at (0,0) size 785x2386 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x2386 +- RenderBlock {HTML} at (0,0) size 785x2386 +- RenderBody {BODY} at (8,8) size 769x2370 +- RenderBlock (anonymous) at (0,0) size 769x36 +- RenderText {#text} at (0,0) size 753x36 +- text run at (0,0) width 546: "Test of objects that avoid floats to see what they do with percentage and auto widths. " +- text run at (545,0) width 208: "This test is designed to illustrate" +- text run at (0,18) width 482: "that we have removed the WinIE quirk and are behaving more like Firefox." +- RenderBlock {HR} at (0,44) size 769x2 [border: (1px inset #000000)] +- RenderBlock (anonymous) at (0,54) size 769x18 +- RenderText {#text} at (0,0) size 517x18 +- text run at (0,0) width 517: "The inline-level button should be below the select and fill the width of the block." +- RenderBlock {P} at (0,88) size 220x82 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderButton {INPUT} at (10,52) size 200x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 184x13 +- RenderText at (86,0) size 12x13 +- text run at (86,0) width 12: "Hi" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,186) size 769x18 +- RenderText {#text} at (0,0) size 481x18 +- text run at (0,0) width 481: "The floating button with a percentage width should be even with the select." +- RenderBlock {P} at (0,220) size 220x60 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderButton {INPUT} at (110,30) size 100x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 84x13 +- RenderText at (36,0) size 12x13 +- text run at (36,0) width 12: "Hi" +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (210,28) size 0x18 +- RenderBlock (anonymous) at (0,296) size 769x18 +- RenderText {#text} at (0,0) size 470x18 +- text run at (0,0) width 470: "The block-level button with an auto width should be even with the select." +- RenderBlock {P} at (0,330) size 220x78 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderButton {INPUT} at (110,30) size 27x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 11x13 +- RenderText at (0,0) size 11x13 +- text run at (0,0) width 11: "Hi" +- RenderBlock (anonymous) at (10,50) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,424) size 769x18 +- RenderText {#text} at (0,0) size 504x18 +- text run at (0,0) width 504: "The block-level button with a percentage width should be even with the select." +- RenderBlock {P} at (0,458) size 220x78 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderButton {INPUT} at (110,30) size 100x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 84x13 +- RenderText at (36,0) size 12x13 +- text run at (36,0) width 12: "Hi" +- RenderBlock (anonymous) at (10,50) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,552) size 769x18 +- RenderText {#text} at (0,0) size 471x18 +- text run at (0,0) width 471: "The floating table with a percentage width should be even with the select." +- RenderBlock {P} at (0,586) size 220x68 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderTable {TABLE} at (110,28) size 100x30 [border: (2px outset #808080)] +- RenderTableSection {TBODY} at (2,2) size 96x26 +- RenderTableRow {TR} at (0,2) size 96x22 +- RenderTableCell {TD} at (2,2) size 92x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 36x18 +- text run at (2,2) width 36: "Table" +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (210,28) size 0x18 +- RenderBlock (anonymous) at (0,670) size 769x36 +- RenderText {#text} at (0,0) size 768x36 +- text run at (0,0) width 768: "The floating table with an auto width should be even with the select and shrinks to use the available line width. THIS IS" +- text run at (0,18) width 157: "CURRENTLY BUGGY." +- RenderBlock {P} at (0,722) size 220x126 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderTable {TABLE} at (10,50) size 200x66 [border: (2px outset #808080)] +- RenderTableSection {TBODY} at (2,2) size 196x62 +- RenderTableRow {TR} at (0,2) size 196x58 +- RenderTableCell {TD} at (2,2) size 192x58 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 165x54 +- text run at (2,2) width 164: "Floating table that should" +- text run at (2,20) width 165: "shrink so it can be next to" +- text run at (2,38) width 92: "previous float." +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (110,28) size 0x18 +- RenderBlock (anonymous) at (0,864) size 769x18 +- RenderText {#text} at (0,0) size 746x18 +- text run at (0,0) width 589: "The block-level table below has a percentage width and should still be even with the select. " +- text run at (588,0) width 158: "It spills out of the block." +- RenderBlock {P} at (0,898) size 220x144 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderTable {TABLE} at (10,50) size 200x66 [border: (2px outset #808080)] +- RenderTableSection {TBODY} at (2,2) size 196x62 +- RenderTableRow {TR} at (0,2) size 196x58 +- RenderTableCell {TD} at (2,2) size 192x58 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 165x54 +- text run at (2,2) width 164: "Floating table that should" +- text run at (2,20) width 165: "shrink so it can be next to" +- text run at (2,38) width 92: "previous float." +- RenderBlock (anonymous) at (10,116) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,1058) size 769x18 +- RenderText {#text} at (0,0) size 759x18 +- text run at (0,0) width 555: "The block-level table below has an auto width and should still be even with the select. " +- text run at (554,0) width 205: "It shrinks to fit inside the block." +- RenderBlock {P} at (0,1092) size 220x194 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderTable {TABLE} at (110,28) size 100x138 [border: (2px outset #808080)] +- RenderTableSection {TBODY} at (2,2) size 96x134 +- RenderTableRow {TR} at (0,2) size 96x130 +- RenderTableCell {TD} at (2,2) size 92x130 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 87x126 +- text run at (2,2) width 54: "Floating" +- text run at (2,20) width 60: "table that" +- text run at (2,38) width 87: "should shrink" +- text run at (2,56) width 73: "so it can be" +- text run at (2,74) width 44: "next to" +- text run at (2,92) width 56: "previous" +- text run at (2,110) width 33: "float." +- RenderBlock (anonymous) at (10,166) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,1302) size 769x18 +- RenderText {#text} at (0,0) size 546x18 +- text run at (0,0) width 546: "The floating overflow section with a percentage width should be even with the select." +- RenderBlock {DIV} at (0,1320) size 220x146 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (210,28) size 0x18 +- RenderBlock (anonymous) at (0,1466) size 769x36 +- RenderText {#text} at (0,0) size 741x36 +- text run at (0,0) width 741: "The floating overflow section with an auto width should be even with the select and shrinks to use the available line" +- text run at (0,18) width 259: "width. THIS IS CURRENTLY BUGGY." +- RenderBlock {DIV} at (0,1502) size 220x114 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (110,28) size 0x18 +- RenderBlock (anonymous) at (0,1616) size 769x18 +- RenderText {#text} at (0,0) size 660x18 +- text run at (0,0) width 660: "The block-level overflow section below has a percentage width and should still be even with the select." +- RenderBlock {DIV} at (0,1634) size 220x164 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (10,136) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,1798) size 769x36 +- RenderText {#text} at (0,0) size 767x36 +- text run at (0,0) width 631: "The block-level overflow section below has an auto width and should still be even with the select. " +- text run at (630,0) width 137: "It shrinks to fit inside" +- text run at (0,18) width 64: "the block." +- RenderBlock {DIV} at (0,1834) size 220x164 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (10,136) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,1998) size 769x18 +- RenderText {#text} at (0,0) size 453x18 +- text run at (0,0) width 453: "The floating hr with a percentage width should be even with the select." +- RenderBlock {DIV} at (0,2016) size 220x60 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (floating) {HR} at (112,30) size 82x2 [border: (1px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (196,28) size 0x18 +- RenderBlock (anonymous) at (0,2076) size 769x36 +- RenderText {#text} at (0,0) size 767x36 +- text run at (0,0) width 767: "The floating hr below should still be even with the select and shrinks to use its intrinsic width (which is basically like 1-" +- text run at (0,18) width 34: "2px)." +- RenderBlock {DIV} at (0,2112) size 220x60 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (floating) {HR} at (112,30) size 2x2 [border: (1px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (116,28) size 0x18 +- RenderBlock (anonymous) at (0,2172) size 769x18 +- RenderText {#text} at (0,0) size 567x18 +- text run at (0,0) width 567: "The block-level hr below has a percentage width and should still be even with the select." +- RenderBlock {DIV} at (0,2190) size 220x88 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (10,50) size 202x2 [border: (1px inset #000000)] +- RenderBlock (anonymous) at (10,60) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,2278) size 769x18 +- RenderText {#text} at (0,0) size 635x18 +- text run at (0,0) width 538: "The block-level hr below has an auto width and should still be even with the select. " +- text run at (537,0) width 98: "It shrinks to fit." +- RenderBlock {DIV} at (0,2296) size 220x74 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (110,36) size 100x2 [border: (1px inset #000000)] +- RenderBlock (anonymous) at (10,46) size 200x18 +- RenderBR {BR} at (100,0) size 0x18 +-layer at (118,1356) size 100x108 +- RenderBlock (floating) {DIV} at (110,28) size 100x108 +- RenderText {#text} at (0,0) size 100x108 +- text run at (0,0) width 63: "This is an" +- text run at (0,18) width 57: "overflow" +- text run at (0,36) width 78: "section with" +- text run at (0,54) width 92: "enough text to" +- text run at (0,72) width 100: "have to wrap to" +- text run at (0,90) width 92: "multiple lines." +-layer at (18,1560) size 200x54 +- RenderBlock (floating) {DIV} at (10,50) size 200x54 +- RenderText {#text} at (0,0) size 175x54 +- text run at (0,0) width 173: "This is an overflow section" +- text run at (0,18) width 175: "with enough text to have to" +- text run at (0,36) width 144: "wrap to multiple lines." +-layer at (118,1670) size 100x108 +- RenderBlock {DIV} at (110,28) size 100x108 +- RenderText {#text} at (0,0) size 100x108 +- text run at (0,0) width 63: "This is an" +- text run at (0,18) width 57: "overflow" +- text run at (0,36) width 78: "section with" +- text run at (0,54) width 92: "enough text to" +- text run at (0,72) width 100: "have to wrap to" +- text run at (0,90) width 92: "multiple lines." +-layer at (118,1870) size 100x108 +- RenderBlock {DIV} at (110,28) size 100x108 +- RenderText {#text} at (0,0) size 100x108 +- text run at (0,0) width 63: "This is an" +- text run at (0,18) width 57: "overflow" +- text run at (0,36) width 78: "section with" +- text run at (0,54) width 92: "enough text to" +- text run at (0,72) width 100: "have to wrap to" +- text run at (0,90) width 92: "multiple lines." +diff --git a/LayoutTests/platform/mac-catalina/fast/css/apple-system-control-colors-expected.txt b/LayoutTests/platform/mac-catalina/fast/css/apple-system-control-colors-expected.txt +deleted file mode 100644 +index 69a0b968ab1a8c641572faa940886c090571727a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/css/apple-system-control-colors-expected.txt ++++ /dev/null +@@ -1,23 +0,0 @@ +--apple-system-header-text : rgba(0, 0, 0, 0.847) +--apple-system-text-background : rgb(255, 255, 255) +--apple-system-control-background : rgb(255, 255, 255) +--apple-system-alternate-selected-text : rgb(255, 255, 255) +--apple-system-control-accent : rgb(0, 122, 255) +--apple-system-even-alternating-content-background : rgb(255, 255, 255) +--apple-system-odd-alternating-content-background : rgb(244, 245, 245) +--apple-system-selected-content-background : rgb(0, 99, 225) +--apple-system-unemphasized-selected-content-background : rgb(220, 220, 220) +--apple-system-selected-text : rgb(0, 0, 0) +--apple-system-unemphasized-selected-text : rgb(0, 0, 0) +--apple-system-selected-text-background : rgba(128, 188, 254, 0.6) +--apple-system-unemphasized-selected-text-background : rgb(220, 220, 220) +--apple-system-placeholder-text : rgba(0, 0, 0, 0.247) +--apple-system-find-highlight-background : rgb(255, 255, 0) +--apple-system-label : rgba(0, 0, 0, 0.847) +--apple-system-secondary-label : rgba(0, 0, 0, 0.498) +--apple-system-tertiary-label : rgba(0, 0, 0, 0.247) +--apple-system-quaternary-label : rgba(0, 0, 0, 0.098) +--apple-system-grid : rgb(204, 204, 204) +--apple-system-separator : rgba(0, 0, 0, 0.098) +--apple-system-container-border : rgba(0, 0, 0, 0.247) +-current-color with inherited -apple-system-label : rgba(0, 0, 0, 0.847) +diff --git a/LayoutTests/platform/mac-catalina/fast/css/continuationCrash-expected.txt b/LayoutTests/platform/mac-catalina/fast/css/continuationCrash-expected.txt +deleted file mode 100644 +index 4e70dac2052e32287cc4e3312b2fd81db2c5ed11..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/css/continuationCrash-expected.txt ++++ /dev/null +@@ -1,66 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock (anonymous) at (0,0) size 784x0 +- RenderInline {SPAN} at (0,0) size 0x0 +- RenderInline {SPAN} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {H4} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 83x18 +- text run at (0,0) width 83: "Instructions" +- RenderBlock {P} at (0,39) size 784x19 +- RenderText {#text} at (0,0) size 180x18 +- text run at (0,0) width 180: "Click the following buttons." +- RenderBlock {OL} at (0,73) size 784x167 +- RenderListItem {LI} at (40,0) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "1" +- RenderText {#text} at (0,0) size 199x18 +- text run at (0,0) width 199: "Start with the outmost left one." +- RenderListItem {LI} at (40,18) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "2" +- RenderText {#text} at (0,0) size 138x18 +- text run at (0,0) width 138: "Click the middle one." +- RenderListItem {LI} at (40,36) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "3" +- RenderText {#text} at (0,0) size 271x18 +- text run at (0,0) width 271: "(The ouline will not be updated correctly.)" +- RenderListItem {LI} at (40,54) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "4" +- RenderText {#text} at (0,0) size 142x18 +- text run at (0,0) width 142: "Click the right button." +- RenderListItem {LI} at (40,72) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "5" +- RenderText {#text} at (0,0) size 473x18 +- text run at (0,0) width 473: "This will crash Safari 1.3 (v176 and v170, no other configurations tested)." +- RenderListItem {LI} at (40,90) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "6" +- RenderText {#text} at (0,0) size 300x18 +- text run at (0,0) width 300: "The combination 2. 1. 3. will also crash Safari." +- RenderListItem {LI} at (40,108) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "7" +- RenderText {#text} at (0,0) size 457x18 +- text run at (0,0) width 457: "1. 3. will not crash Safari. (But the outline should vanish. Shouldn't it?)" +- RenderListItem {LI} at (40,126) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "8" +- RenderText {#text} at (0,0) size 205x18 +- text run at (0,0) width 205: "2. 3. will not crash Safari either." +- RenderBlock (anonymous) at (40,144) size 744x22 +- RenderButton {INPUT} at (2,2) size 133x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 117x13 +- RenderText at (0,0) size 117x13 +- text run at (0,0) width 117: "1. Set outline property" +- RenderText {#text} at (136,1) size 5x18 +- text run at (136,1) width 5: " " +- RenderButton {INPUT} at (142,2) size 136x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 120x13 +- RenderText at (0,0) size 120x13 +- text run at (0,0) width 120: "2. Set display property" +- RenderText {#text} at (279,1) size 5x18 +- text run at (279,1) width 5: " " +- RenderButton {INPUT} at (285,2) size 147x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 131x13 +- RenderText at (0,0) size 131x13 +- text run at (0,0) width 131: "3. Replace span-element" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/css/rtl-ordering-expected.txt b/LayoutTests/platform/mac-catalina/fast/css/rtl-ordering-expected.txt +deleted file mode 100644 +index d53f257a106dd45442276aecf0dd491ddc585781..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/css/rtl-ordering-expected.txt ++++ /dev/null +@@ -1,45 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 218x18 +- text run at (0,0) width 218: "This tests for a regression against " +- RenderInline {I} at (0,0) size 722x36 +- RenderInline {A} at (0,0) size 354x18 [color=#0000EE] +- RenderText {#text} at (217,0) size 354x18 +- text run at (217,0) width 354: "http://bugzilla.opendarwin.org/show_bug.cgi?id=6334" +- RenderText {#text} at (570,0) size 722x36 +- text run at (570,0) width 152: " REGRESSION: text is reversed on \"visual Hebrew\" pages" +- RenderText {#text} at (373,18) size 5x18 +- text run at (373,18) width 5: "." +- RenderBlock {HR} at (0,52) size 784x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,70) size 784x19 +- RenderText {#text} at (0,1) size 310x18 +- text run at (0,1) width 310: "The text on both buttons should like this: \x{5E8}\x{5D5}\x{5EA}\x{5E4}\x{5DB}" +- RenderBlock (anonymous) at (0,105) size 784x44 +- RenderButton {BUTTON} at (2,2) size 46x18 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 30x13 +- RenderText {#text} at (0,0) size 30x13 +- text run at (0,0) width 30: "\x{5E8}\x{5D5}\x{5EA}\x{5E4}\x{5DB}" +- RenderText {#text} at (49,1) size 5x18 +- text run at (49,1) width 5: " " +- RenderBR {BR} at (53,1) size 1x18 +- RenderButton {INPUT} at (2,24) size 46x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 30x13 +- RenderText at (0,0) size 30x13 +- text run at (0,0) width 30 RTL: "\x{5DB}\x{5E4}\x{5EA}\x{5D5}\x{5E8}" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (0,157) size 784x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,175) size 784x18 +- RenderText {#text} at (0,0) size 255x18 +- text run at (0,0) width 255: "The following lines should be identical:" +- RenderBlock {P} at (0,209) size 784x19 +- RenderText {#text} at (0,1) size 81x18 +- text run at (0,1) width 16: "21" +- text run at (16,1) width 65 RTL: "\x{5D4}\x{5DE}\x{5D0}\x{5D4} \x{5D4}-" +- RenderBlock {P} at (0,244) size 784x19 +- RenderText {#text} at (0,1) size 81x18 +- text run at (0,1) width 81: "21-\x{5D4} \x{5D4}\x{5D0}\x{5DE}\x{5D4}" +diff --git a/LayoutTests/platform/mac-catalina/fast/css/text-overflow-input-expected.txt b/LayoutTests/platform/mac-catalina/fast/css/text-overflow-input-expected.txt +deleted file mode 100644 +index ffb1e1501c35fe968678dba2f15a53d795350b42..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/css/text-overflow-input-expected.txt ++++ /dev/null +@@ -1,246 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x382 +- RenderBlock {HTML} at (0,0) size 800x382 +- RenderBody {BODY} at (8,16) size 784x350 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 314x18 +- text run at (0,0) width 314: "This test is a basic check for using text-overflow." +- RenderBlock {P} at (0,34) size 784x110 +- RenderText {#text} at (0,0) size 489x18 +- text run at (0,0) width 489: "Apply \"text-overflow:clip\" to inputs. The following input should be clipped:" +- RenderBR {BR} at (488,0) size 1x18 +- RenderTextControl {INPUT} at (2,20) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (150,20) size 5x18 +- text run at (150,20) width 5: " " +- RenderTextControl {INPUT} at (156,20) size 175x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderText {#text} at (332,20) size 5x18 +- text run at (332,20) width 5: " " +- RenderTextControl {INPUT} at (338,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (487,20) size 5x18 +- text run at (487,20) width 5: " " +- RenderTextControl {INPUT} at (493,20) size 175x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderTextControl {INPUT} at (2,43) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderBR {BR} at (150,43) size 1x18 +- RenderTextControl {INPUT} at (2,66) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (149,66) size 5x18 +- text run at (149,66) width 5: " " +- RenderTextControl {INPUT} at (155,66) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 167x19 +- RenderBlock {DIV} at (158,0) size 9x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderText {#text} at (330,66) size 5x18 +- text run at (330,66) width 5: " " +- RenderTextControl {INPUT} at (336,66) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (484,66) size 5x18 +- text run at (484,66) width 5: " " +- RenderTextControl {INPUT} at (490,66) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 167x19 +- RenderBlock {DIV} at (158,0) size 9x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderTextControl {INPUT} at (2,89) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,160) size 784x110 +- RenderText {#text} at (0,0) size 546x18 +- text run at (0,0) width 546: "Apply \"text-overflow:ellipsis\" to inputs. The following input should show an ellipsis:" +- RenderBR {BR} at (545,0) size 1x18 +- RenderTextControl {INPUT} at (2,20) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (150,20) size 5x18 +- text run at (150,20) width 5: " " +- RenderTextControl {INPUT} at (156,20) size 175x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderText {#text} at (332,20) size 5x18 +- text run at (332,20) width 5: " " +- RenderTextControl {INPUT} at (338,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (487,20) size 5x18 +- text run at (487,20) width 5: " " +- RenderTextControl {INPUT} at (493,20) size 175x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderTextControl {INPUT} at (2,43) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderBR {BR} at (150,43) size 1x18 +- RenderTextControl {INPUT} at (2,66) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (149,66) size 5x18 +- text run at (149,66) width 5: " " +- RenderTextControl {INPUT} at (155,66) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 167x19 +- RenderBlock {DIV} at (158,0) size 9x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderText {#text} at (330,66) size 5x18 +- text run at (330,66) width 5: " " +- RenderTextControl {INPUT} at (336,66) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (484,66) size 5x18 +- text run at (484,66) width 5: " " +- RenderTextControl {INPUT} at (490,66) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 167x19 +- RenderBlock {DIV} at (158,0) size 9x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderTextControl {INPUT} at (2,89) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,286) size 784x64 +- RenderText {#text} at (0,0) size 237x18 +- text run at (0,0) width 237: "Dynamic style change text-overflow:" +- RenderBR {BR} at (236,0) size 1x18 +- RenderText {#text} at (0,20) size 247x18 +- text run at (0,20) width 247: "Clip to ellipsis (should show ellipsis): " +- RenderTextControl {INPUT} at (248,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (397,20) size 5x18 +- text run at (397,20) width 5: " " +- RenderTextControl {INPUT} at (403,20) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (551,20) size 5x18 +- text run at (551,20) width 5: " " +- RenderBR {BR} at (555,20) size 1x18 +- RenderText {#text} at (0,43) size 270x18 +- text run at (0,43) width 270: "Ellipsis to clip (should not show ellipsis): " +- RenderTextControl {INPUT} at (271,43) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (420,43) size 5x18 +- text run at (420,43) width 5: " " +- RenderTextControl {INPUT} at (426,43) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (575,43) size 5x18 +- text run at (575,43) width 5: " " +- RenderBR {BR} at (579,43) size 1x18 +-layer at (13,73) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,73) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (176,73) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (11,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (176,73) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (350,73) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (513,73) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,96) size 141x13 scrollWidth 282 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 282x13 +- text run at (0,0) width 282: "\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}" +-layer at (13,119) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#A9A9A9] +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,119) size 140x13 +- RenderBlock {DIV} at (3,3) size 140x13 +-layer at (186,119) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (22,3) size 140x13 [color=#A9A9A9] +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (186,119) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +-layer at (348,119) size 140x13 scrollX 149 scrollWidth 289 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (521,119) size 140x13 scrollX 149 scrollWidth 289 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,142) size 140x13 scrollX 142 scrollWidth 282 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (-141,0) size 282x13 +- text run at (-141,0) width 281 RTL: "\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}" +-layer at (13,199) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,199) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (176,199) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (11,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (176,199) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (350,199) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (513,199) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,222) size 141x13 scrollWidth 282 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 282x13 +- text run at (0,0) width 282: "\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}" +-layer at (13,245) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#A9A9A9] +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,245) size 140x13 +- RenderBlock {DIV} at (3,3) size 140x13 +-layer at (186,245) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (22,3) size 140x13 [color=#A9A9A9] +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (186,245) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +-layer at (348,245) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (521,245) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,268) size 140x13 scrollX 141 scrollWidth 281 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (-141,0) size 282x13 +- text run at (-141,0) width 281 RTL: "\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}" +-layer at (259,325) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (259,325) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (414,325) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (283,348) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (283,348) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (438,348) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +diff --git a/LayoutTests/platform/mac-catalina/fast/dom/HTMLInputElement/input-slider-update-expected.txt b/LayoutTests/platform/mac-catalina/fast/dom/HTMLInputElement/input-slider-update-expected.txt +deleted file mode 100644 +index bfbe4c2682c20a5144eaa6070e5b8855edaa42d2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/dom/HTMLInputElement/input-slider-update-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderSlider {INPUT} at (2,2) size 129x15 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (114,0) size 15x15 +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/auto-fill-button/hide-auto-fill-strong-password-viewable-treatment-when-form-is-reset-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/auto-fill-button/hide-auto-fill-strong-password-viewable-treatment-when-form-is-reset-expected.txt +deleted file mode 100644 +index 3cea5a5175685a21760181ba4fae8016a3d32b3c..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/auto-fill-button/hide-auto-fill-strong-password-viewable-treatment-when-form-is-reset-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x99 +- RenderBlock {HTML} at (0,0) size 800x99 +- RenderBody {BODY} at (8,16) size 784x75 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 780x36 +- text run at (0,0) width 780: "This tests that that an autofilled and viewable Strong Password decorated text field reverts to its original appearance when" +- text run at (0,18) width 340: "the form is reset. It can only be tested in the test tool." +- RenderBlock {FORM} at (0,52) size 784x23 +- RenderTextControl {INPUT} at (2,2) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 0x0 +-layer at (13,73) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 47x13 +- text run at (0,0) width 47: "\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/basic-inputs-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/basic-inputs-expected.txt +deleted file mode 100644 +index 427e6961011dbe702944e712b4570e302ec846fc..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/basic-inputs-expected.txt ++++ /dev/null +@@ -1,88 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 470x582 +- RenderBlock (anonymous) at (0,0) size 470x306 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "This tests basic inputs. Here's what you should see:" +- RenderBR {BR} at (327,0) size 1x18 +- RenderBR {BR} at (0,18) size 0x18 +- RenderText {#text} at (0,36) size 461x54 +- text run at (0,36) width 442: "first line: the letter \"a\" and then a text input field filled with repeating" +- text run at (0,54) width 86: "\"foobarbaz\", " +- text run at (85,54) width 376: "then the word \"text\" followed by a disabled text input field" +- text run at (0,72) width 331: "filled with \"foo\" and then the letter \"b\" and then \"a\"" +- RenderBR {BR} at (330,72) size 1x18 +- RenderBR {BR} at (0,90) size 0x18 +- RenderText {#text} at (0,108) size 467x54 +- text run at (0,108) width 437: "second line: and then a password input field that's filled and then the" +- text run at (0,126) width 467: "word \"password\" and then a disabled password field that's filled and then" +- text run at (0,144) width 82: "the letter \"b\"" +- RenderBR {BR} at (81,144) size 1x18 +- RenderBR {BR} at (0,162) size 0x18 +- RenderText {#text} at (0,180) size 459x36 +- text run at (0,180) width 459: "third line: the letter \"a\" and then a checkbox (unchecked) with the word" +- text run at (0,198) width 356: "\"checkbox\" and then a disabled checkbox and letter \"b\"" +- RenderBR {BR} at (355,198) size 1x18 +- RenderBR {BR} at (0,216) size 0x18 +- RenderText {#text} at (0,234) size 457x54 +- text run at (0,234) width 411: "fourth line: the last line has the letter \"a\" and then a redio button" +- text run at (0,252) width 457: "(unselected) and then the word \"radio\" and then a disabled radio button" +- text run at (0,270) width 109: "and the letter \"b\"" +- RenderBR {BR} at (108,270) size 1x18 +- RenderBR {BR} at (0,288) size 0x18 +- RenderBlock {DIV} at (10,316) size 450x48 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,3) size 8x18 +- text run at (1,3) width 8: "a" +- RenderTextControl {INPUT} at (10,3) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (158,3) size 29x18 +- text run at (158,3) width 29: "text " +- RenderTextControl {INPUT} at (188,3) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (336,3) size 20x18 +- text run at (336,3) width 13: "b " +- text run at (348,3) width 8: "a" +- RenderTextControl {INPUT} at (3,26) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (151,26) size 66x18 +- text run at (151,26) width 66: "password " +- RenderTextControl {INPUT} at (218,26) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (366,26) size 9x18 +- text run at (366,26) width 9: "b" +- RenderBlock {DIV} at (10,374) size 450x21 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,1) size 8x18 +- text run at (1,1) width 8: "a" +- RenderBlock {INPUT} at (10,5) size 13x12 +- RenderText {#text} at (24,1) size 66x18 +- text run at (24,1) width 66: "checkbox " +- RenderBlock {INPUT} at (91,5) size 13x12 +- RenderText {#text} at (105,1) size 9x18 +- text run at (105,1) width 9: "b" +- RenderBlock {DIV} at (10,405) size 450x21 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,1) size 8x18 +- text run at (1,1) width 8: "a" +- RenderBlock {INPUT} at (10,5) size 13x12 +- RenderText {#text} at (24,1) size 37x18 +- text run at (24,1) width 37: "radio " +- RenderBlock {INPUT} at (62,5) size 13x12 +- RenderText {#text} at (76,1) size 9x18 +- text run at (76,1) width 9: "b" +-layer at (31,330) size 141x13 scrollWidth 160 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 160x13 +- text run at (0,0) width 160: "foobarbazfoobarbazfoobarbaz" +-layer at (210,330) size 140x13 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#545454] +- RenderText {#text} at (0,0) size 17x13 +- text run at (0,0) width 17: "foo" +-layer at (24,353) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 16x13 +- text run at (0,0) width 16: "\x{2022}\x{2022}\x{2022}" +-layer at (239,353) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 [color=#545454] +- RenderText {#text} at (0,0) size 16x13 +- text run at (0,0) width 16: "\x{2022}\x{2022}\x{2022}" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/basic-textareas-quirks-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/basic-textareas-quirks-expected.txt +deleted file mode 100644 +index 06fff546856c204b9b1c17382c5ddc23e8263f50..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/basic-textareas-quirks-expected.txt ++++ /dev/null +@@ -1,829 +0,0 @@ +-layer at (0,0) size 785x1065 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x1065 +- RenderBlock {HTML} at (0,0) size 785x1065 +- RenderBody {BODY} at (8,8) size 769x584 +- RenderBlock (floating) {DIV} at (0,0) size 352x829 [border: (1px solid #FF0000)] +- RenderBlock (anonymous) at (1,1) size 350x14 +- RenderText {#text} at (0,-2) size 179x17 +- text run at (0,-2) width 179: "Plain textarea with little content" +- RenderBlock {DIV} at (1,15) size 352x41 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,24) size 14x17 +- text run at (1,24) width 14: "A " +- RenderText {#text} at (179,24) size 14x17 +- text run at (179,24) width 14: " B" +- RenderBlock (anonymous) at (1,56) size 350x14 +- RenderText {#text} at (0,-2) size 77x17 +- text run at (0,-2) width 77: "Plain textarea" +- RenderBlock {DIV} at (1,70) size 352x41 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,24) size 14x17 +- text run at (1,24) width 14: "A " +- RenderText {#text} at (179,24) size 14x17 +- text run at (179,24) width 14: " B" +- RenderBlock (anonymous) at (1,111) size 350x14 +- RenderText {#text} at (0,-2) size 98x17 +- text run at (0,-2) width 98: "Disabled textarea" +- RenderBlock {DIV} at (1,125) size 352x41 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,24) size 14x17 +- text run at (1,24) width 14: "A " +- RenderText {#text} at (179,24) size 14x17 +- text run at (179,24) width 14: " B" +- RenderBlock (anonymous) at (1,166) size 350x14 +- RenderText {#text} at (0,-2) size 123x17 +- text run at (0,-2) width 123: "style=\"padding:10px\"" +- RenderBlock {DIV} at (1,180) size 352x57 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,40) size 14x17 +- text run at (1,40) width 14: "A " +- RenderText {#text} at (195,40) size 14x17 +- text run at (195,40) width 14: " B" +- RenderBlock (anonymous) at (1,237) size 350x14 +- RenderText {#text} at (0,-2) size 116x17 +- text run at (0,-2) width 116: "style=\"padding:0px\"" +- RenderBlock {DIV} at (1,251) size 352x37 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,20) size 14x17 +- text run at (1,20) width 14: "A " +- RenderText {#text} at (175,20) size 14x17 +- text run at (175,20) width 14: " B" +- RenderBlock (anonymous) at (1,288) size 350x14 +- RenderText {#text} at (0,-2) size 118x17 +- text run at (0,-2) width 118: "style=\"margin:10px\"" +- RenderBlock {DIV} at (1,302) size 352x57 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,40) size 14x17 +- text run at (1,40) width 14: "A " +- RenderText {#text} at (195,40) size 14x17 +- text run at (195,40) width 14: " B" +- RenderBlock (anonymous) at (1,359) size 350x14 +- RenderText {#text} at (0,-2) size 111x17 +- text run at (0,-2) width 111: "style=\"margin:0px\"" +- RenderBlock {DIV} at (1,373) size 352x37 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,20) size 14x17 +- text run at (1,20) width 14: "A " +- RenderText {#text} at (175,20) size 14x17 +- text run at (175,20) width 14: " B" +- RenderBlock (anonymous) at (1,410) size 350x14 +- RenderText {#text} at (0,-2) size 38x17 +- text run at (0,-2) width 38: "cols=3" +- RenderBlock {DIV} at (1,424) size 352x41 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,24) size 14x17 +- text run at (1,24) width 14: "A " +- RenderText {#text} at (60,24) size 14x17 +- text run at (60,24) width 14: " B" +- RenderBlock (anonymous) at (1,465) size 350x14 +- RenderText {#text} at (0,-2) size 43x17 +- text run at (0,-2) width 43: "rows=3" +- RenderBlock {DIV} at (1,479) size 352x54 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,37) size 14x17 +- text run at (1,37) width 14: "A " +- RenderText {#text} at (179,37) size 14x17 +- text run at (179,37) width 14: " B" +- RenderBlock (anonymous) at (1,533) size 350x14 +- RenderText {#text} at (0,-2) size 45x17 +- text run at (0,-2) width 45: "cols=10" +- RenderBlock {DIV} at (1,547) size 352x41 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,24) size 14x17 +- text run at (1,24) width 14: "A " +- RenderText {#text} at (109,24) size 14x17 +- text run at (109,24) width 14: " B" +- RenderBlock (anonymous) at (1,588) size 350x14 +- RenderText {#text} at (0,-2) size 50x17 +- text run at (0,-2) width 50: "rows=10" +- RenderBlock {DIV} at (1,602) size 352x145 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,128) size 14x17 +- text run at (1,128) width 14: "A " +- RenderText {#text} at (179,128) size 14x17 +- text run at (179,128) width 14: " B" +- RenderBlock (anonymous) at (1,747) size 350x14 +- RenderText {#text} at (0,-2) size 84x17 +- text run at (0,-2) width 84: "cols=5 rows=4" +- RenderBlock {DIV} at (1,761) size 352x67 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,50) size 14x17 +- text run at (1,50) width 14: "A " +- RenderText {#text} at (74,50) size 14x17 +- text run at (74,50) width 14: " B" +- RenderBlock (floating) {DIV} at (352,0) size 352x1057 [border: (1px solid #FF0000)] +- RenderBlock (anonymous) at (1,1) size 350x14 +- RenderText {#text} at (0,-2) size 110x17 +- text run at (0,-2) width 110: "style=\"width:60px\"" +- RenderBlock {DIV} at (1,15) size 352x41 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,24) size 14x17 +- text run at (1,24) width 14: "A " +- RenderText {#text} at (74,24) size 14x17 +- text run at (74,24) width 14: " B" +- RenderBlock (anonymous) at (1,56) size 350x14 +- RenderText {#text} at (0,-2) size 191x17 +- text run at (0,-2) width 191: "style=\"width:60px;padding:20px\"" +- RenderBlock {DIV} at (1,70) size 352x77 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,60) size 14x17 +- text run at (1,60) width 14: "A " +- RenderText {#text} at (74,60) size 14x17 +- text run at (74,60) width 14: " B" +- RenderBlock (anonymous) at (1,147) size 350x14 +- RenderText {#text} at (0,-2) size 170x17 +- text run at (0,-2) width 170: "style=\"width:60px;padding:0\"" +- RenderBlock {DIV} at (1,161) size 352x37 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,20) size 14x17 +- text run at (1,20) width 14: "A " +- RenderText {#text} at (74,20) size 14x17 +- text run at (74,20) width 14: " B" +- RenderBlock (anonymous) at (1,198) size 350x14 +- RenderText {#text} at (0,-2) size 113x17 +- text run at (0,-2) width 113: "style=\"height:60px\"" +- RenderBlock {DIV} at (1,212) size 352x65 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,48) size 14x17 +- text run at (1,48) width 14: "A " +- RenderText {#text} at (179,48) size 14x17 +- text run at (179,48) width 14: " B" +- RenderBlock (anonymous) at (1,277) size 350x14 +- RenderText {#text} at (0,-2) size 181x17 +- text run at (0,-2) width 181: "style=\"width:60px;height:60px\"" +- RenderBlock {DIV} at (1,291) size 352x65 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,48) size 14x17 +- text run at (1,48) width 14: "A " +- RenderText {#text} at (74,48) size 14x17 +- text run at (74,48) width 14: " B" +- RenderBlock (anonymous) at (1,356) size 350x14 +- RenderText {#text} at (0,-2) size 138x17 +- text run at (0,-2) width 138: "style=\"overflow:hidden\"" +- RenderBlock {DIV} at (1,370) size 352x41 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,24) size 14x17 +- text run at (1,24) width 14: "A " +- RenderText {#text} at (179,24) size 14x17 +- text run at (179,24) width 14: " B" +- RenderBlock (anonymous) at (1,411) size 350x14 +- RenderText {#text} at (0,-2) size 131x17 +- text run at (0,-2) width 131: "style=\"overflow:scroll\"" +- RenderBlock {DIV} at (1,425) size 352x56 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,39) size 14x17 +- text run at (1,39) width 14: "A " +- RenderText {#text} at (179,39) size 14x17 +- text run at (179,39) width 14: " B" +- RenderBlock (anonymous) at (1,481) size 350x14 +- RenderText {#text} at (0,-2) size 276x17 +- text run at (0,-2) width 276: "style=\"overflow:hidden;width:60px;height:60px\"" +- RenderBlock {DIV} at (1,495) size 352x65 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,48) size 14x17 +- text run at (1,48) width 14: "A " +- RenderText {#text} at (74,48) size 14x17 +- text run at (74,48) width 14: " B" +- RenderBlock (anonymous) at (1,560) size 350x14 +- RenderText {#text} at (0,-2) size 269x17 +- text run at (0,-2) width 269: "style=\"overflow:scroll;width:60px;height:60px\"" +- RenderBlock {DIV} at (1,574) size 352x65 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,48) size 14x17 +- text run at (1,48) width 14: "A " +- RenderText {#text} at (74,48) size 14x17 +- text run at (74,48) width 14: " B" +- RenderBlock (anonymous) at (1,639) size 350x14 +- RenderText {#text} at (0,-2) size 222x17 +- text run at (0,-2) width 222: "cols=5 style=\"width:60px;height:60px\"" +- RenderBlock {DIV} at (1,653) size 352x65 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,48) size 14x17 +- text run at (1,48) width 14: "A " +- RenderText {#text} at (74,48) size 14x17 +- text run at (74,48) width 14: " B" +- RenderBlock (anonymous) at (1,718) size 350x14 +- RenderText {#text} at (0,-2) size 226x17 +- text run at (0,-2) width 226: "rows=4 style=\"width:60px;height:60px\"" +- RenderBlock {DIV} at (1,732) size 352x65 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,48) size 14x17 +- text run at (1,48) width 14: "A " +- RenderText {#text} at (74,48) size 14x17 +- text run at (74,48) width 14: " B" +- RenderBlock (anonymous) at (1,797) size 350x14 +- RenderText {#text} at (0,-2) size 267x17 +- text run at (0,-2) width 267: "cols=5 rows=4 style=\"width:60px;height:60px\"" +- RenderBlock {DIV} at (1,811) size 352x65 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,48) size 14x17 +- text run at (1,48) width 14: "A " +- RenderText {#text} at (74,48) size 14x17 +- text run at (74,48) width 14: " B" +- RenderBlock (anonymous) at (1,876) size 350x14 +- RenderText {#text} at (0,-2) size 64x17 +- text run at (0,-2) width 64: "wrap=\"off\"" +- RenderBlock {DIV} at (1,890) size 352x56 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,39) size 14x17 +- text run at (1,39) width 14: "A " +- RenderText {#text} at (179,39) size 14x17 +- text run at (179,39) width 5: " " +- text run at (183,39) width 10: "B" +- RenderBlock (anonymous) at (1,946) size 350x14 +- RenderText {#text} at (0,-2) size 73x17 +- text run at (0,-2) width 73: "wrap=\"hard\"" +- RenderBlock {DIV} at (1,960) size 352x41 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,24) size 14x17 +- text run at (1,24) width 14: "A " +- RenderText {#text} at (179,24) size 14x17 +- text run at (179,24) width 5: " " +- text run at (183,24) width 10: "B" +- RenderBlock (anonymous) at (1,1001) size 350x14 +- RenderText {#text} at (0,-2) size 69x17 +- text run at (0,-2) width 69: "wrap=\"soft\"" +- RenderBlock {DIV} at (1,1015) size 352x41 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,24) size 14x17 +- text run at (1,24) width 14: "A " +- RenderText {#text} at (179,24) size 14x17 +- text run at (179,24) width 5: " " +- text run at (183,24) width 10: "B" +-layer at (26,26) size 161x32 clip at (27,27) size 159x30 +- RenderTextControl {TEXTAREA} at (16,3) size 162x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x13 +- RenderText {#text} at (0,0) size 98x13 +- text run at (0,0) width 98: "Lorem ipsum dolor" +-layer at (26,81) size 161x32 clip at (27,82) size 144x30 scrollHeight 56 +- RenderTextControl {TEXTAREA} at (16,3) size 162x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 140x52 +- RenderText {#text} at (0,0) size 140x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 140: "ABCDEFGHIJKLMNOPQRS" +- text run at (0,26) width 56: "TUVWXYZ" +- text run at (55,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (26,136) size 161x32 clip at (27,137) size 144x30 scrollHeight 56 +- RenderTextControl {TEXTAREA} at (16,3) size 162x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 140x52 [color=#545454] +- RenderText {#text} at (0,0) size 140x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 140: "ABCDEFGHIJKLMNOPQRS" +- text run at (0,26) width 56: "TUVWXYZ" +- text run at (55,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (26,191) size 177x48 clip at (27,192) size 160x46 scrollHeight 72 +- RenderTextControl {TEXTAREA} at (16,3) size 178x48 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (11,11) size 140x52 +- RenderText {#text} at (0,0) size 140x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 140: "ABCDEFGHIJKLMNOPQRS" +- text run at (0,26) width 56: "TUVWXYZ" +- text run at (55,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (26,262) size 157x28 clip at (27,263) size 140x26 scrollHeight 52 +- RenderTextControl {TEXTAREA} at (16,3) size 158x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (1,1) size 140x52 +- RenderText {#text} at (0,0) size 140x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 140: "ABCDEFGHIJKLMNOPQRS" +- text run at (0,26) width 56: "TUVWXYZ" +- text run at (55,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (34,321) size 161x32 clip at (35,322) size 144x30 scrollHeight 56 +- RenderTextControl {TEXTAREA} at (24,11) size 162x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 140x52 +- RenderText {#text} at (0,0) size 140x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 140: "ABCDEFGHIJKLMNOPQRS" +- text run at (0,26) width 56: "TUVWXYZ" +- text run at (55,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (24,382) size 161x32 clip at (25,383) size 144x30 scrollHeight 56 +- RenderTextControl {TEXTAREA} at (14,1) size 162x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 140x52 +- RenderText {#text} at (0,0) size 140x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 140: "ABCDEFGHIJKLMNOPQRS" +- text run at (0,26) width 56: "TUVWXYZ" +- text run at (55,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (26,435) size 42x32 clip at (27,436) size 25x30 scrollHeight 329 +- RenderTextControl {TEXTAREA} at (16,3) size 43x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 21x325 +- RenderText {#text} at (0,0) size 21x325 +- text run at (0,0) width 17: "Lor" +- text run at (0,13) width 16: "em" +- text run at (15,13) width 5: " " +- text run at (0,26) width 16: "ips" +- text run at (0,39) width 17: "um" +- text run at (16,39) width 4: " " +- text run at (0,52) width 17: "dol" +- text run at (0,65) width 11: "or" +- text run at (10,65) width 4: " " +- text run at (0,78) width 15: "AB" +- text run at (0,91) width 16: "CD" +- text run at (0,104) width 13: "EF" +- text run at (0,117) width 20: "GHI" +- text run at (0,130) width 20: "JKL" +- text run at (0,143) width 18: "MN" +- text run at (0,156) width 16: "OP" +- text run at (0,169) width 16: "QR" +- text run at (0,182) width 15: "ST" +- text run at (0,195) width 16: "UV" +- text run at (0,208) width 19: "WX" +- text run at (0,221) width 15: "YZ" +- text run at (14,221) width 4: " " +- text run at (0,234) width 20: "abc" +- text run at (0,247) width 18: "def" +- text run at (0,260) width 19: "ghij" +- text run at (0,273) width 19: "klm" +- text run at (0,286) width 20: "nop" +- text run at (0,299) width 21: "qrst" +- text run at (0,312) width 13: "uv" +- text run at (12,312) width 4: " " +-layer at (26,490) size 161x45 clip at (27,491) size 144x43 scrollHeight 56 +- RenderTextControl {TEXTAREA} at (16,3) size 162x45 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 140x52 +- RenderText {#text} at (0,0) size 140x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 140: "ABCDEFGHIJKLMNOPQRS" +- text run at (0,26) width 56: "TUVWXYZ" +- text run at (55,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (26,558) size 91x32 clip at (27,559) size 74x30 scrollHeight 95 +- RenderTextControl {TEXTAREA} at (16,3) size 92x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 70x91 +- RenderText {#text} at (0,0) size 70x91 +- text run at (0,0) width 68: "Lorem ipsum" +- text run at (67,0) width 3: " " +- text run at (0,13) width 28: "dolor" +- text run at (27,13) width 4: " " +- text run at (0,26) width 70: "ABCDEFGHIJ" +- text run at (0,39) width 63: "KLMNOPQR" +- text run at (0,52) width 63: "STUVWXYZ" +- text run at (62,52) width 4: " " +- text run at (0,65) width 64: "abcdefghijkl" +- text run at (0,78) width 63: "mnopqrstuv" +- text run at (62,78) width 4: " " +-layer at (26,613) size 161x136 clip at (27,614) size 159x134 +- RenderTextControl {TEXTAREA} at (16,3) size 162x136 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x52 +- RenderText {#text} at (0,0) size 155x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 155: "ABCDEFGHIJKLMNOPQRSTU" +- text run at (0,26) width 41: "VWXYZ" +- text run at (40,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (26,772) size 56x58 clip at (27,773) size 39x56 scrollHeight 186 +- RenderTextControl {TEXTAREA} at (16,3) size 57x58 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 35x182 +- RenderText {#text} at (0,0) size 35x182 +- text run at (0,0) width 33: "Lorem" +- text run at (32,0) width 3: " " +- text run at (0,13) width 32: "ipsum" +- text run at (31,13) width 4: " " +- text run at (0,26) width 28: "dolor" +- text run at (27,26) width 4: " " +- text run at (0,39) width 31: "ABCD" +- text run at (0,52) width 33: "EFGHI" +- text run at (0,65) width 30: "JKLM" +- text run at (0,78) width 33: "NOPQ" +- text run at (0,91) width 30: "RSTU" +- text run at (0,104) width 33: "VWXY" +- text run at (0,117) width 8: "Z" +- text run at (7,117) width 4: " " +- text run at (0,130) width 33: "abcde" +- text run at (0,143) width 32: "fghijkl" +- text run at (0,156) width 30: "mnop" +- text run at (0,169) width 34: "qrstuv" +- text run at (33,169) width 2: " " +-layer at (376,26) size 60x32 clip at (377,27) size 43x30 scrollHeight 173 +- RenderTextControl {TEXTAREA} at (14,3) size 61x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 39x169 +- RenderText {#text} at (0,0) size 39x169 +- text run at (0,0) width 33: "Lorem" +- text run at (32,0) width 4: " " +- text run at (0,13) width 32: "ipsum" +- text run at (31,13) width 4: " " +- text run at (0,26) width 28: "dolor" +- text run at (27,26) width 4: " " +- text run at (0,39) width 38: "ABCDE" +- text run at (0,52) width 32: "FGHIJ" +- text run at (0,65) width 32: "KLMN" +- text run at (0,78) width 39: "OPQRS" +- text run at (0,91) width 34: "TUVW" +- text run at (0,104) width 23: "XYZ" +- text run at (22,104) width 4: " " +- text run at (0,117) width 37: "abcdef" +- text run at (0,130) width 38: "ghijklm" +- text run at (0,143) width 37: "nopqrs" +- text run at (0,156) width 17: "tuv" +- text run at (16,156) width 4: " " +-layer at (376,81) size 60x68 clip at (377,82) size 43x66 scrollHeight 924 +- RenderTextControl {TEXTAREA} at (14,3) size 61x68 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (21,21) size 3x884 +- RenderText {#text} at (0,0) size 11x884 +- text run at (0,0) width 7: "L" +- text run at (0,13) width 7: "o" +- text run at (0,26) width 5: "r" +- text run at (0,39) width 7: "e" +- text run at (0,52) width 10: "m" +- text run at (0,65) width 3: " " +- text run at (0,78) width 3: "i" +- text run at (0,91) width 7: "p" +- text run at (0,104) width 6: "s" +- text run at (0,117) width 7: "u" +- text run at (0,130) width 10: "m" +- text run at (0,143) width 3: " " +- text run at (0,156) width 7: "d" +- text run at (0,169) width 7: "o" +- text run at (0,182) width 3: "l" +- text run at (0,195) width 7: "o" +- text run at (0,208) width 5: "r" +- text run at (0,221) width 3: " " +- text run at (0,234) width 8: "A" +- text run at (0,247) width 8: "B" +- text run at (0,260) width 8: "C" +- text run at (0,273) width 9: "D" +- text run at (0,286) width 7: "E" +- text run at (0,299) width 7: "F" +- text run at (0,312) width 9: "G" +- text run at (0,325) width 9: "H" +- text run at (0,338) width 4: "I" +- text run at (0,351) width 6: "J" +- text run at (0,364) width 8: "K" +- text run at (0,377) width 7: "L" +- text run at (0,390) width 10: "M" +- text run at (0,403) width 9: "N" +- text run at (0,416) width 9: "O" +- text run at (0,429) width 8: "P" +- text run at (0,442) width 9: "Q" +- text run at (0,455) width 8: "R" +- text run at (0,468) width 8: "S" +- text run at (0,481) width 8: "T" +- text run at (0,494) width 9: "U" +- text run at (0,507) width 8: "V" +- text run at (0,520) width 11: "W" +- text run at (0,533) width 8: "X" +- text run at (0,546) width 8: "Y" +- text run at (0,559) width 8: "Z" +- text run at (0,572) width 3: " " +- text run at (0,585) width 7: "a" +- text run at (0,598) width 7: "b" +- text run at (0,611) width 7: "c" +- text run at (0,624) width 7: "d" +- text run at (0,637) width 7: "e" +- text run at (0,650) width 5: "f" +- text run at (0,663) width 7: "g" +- text run at (0,676) width 7: "h" +- text run at (0,689) width 3: "i" +- text run at (0,702) width 3: "j" +- text run at (0,715) width 7: "k" +- text run at (0,728) width 3: "l" +- text run at (0,741) width 10: "m" +- text run at (0,754) width 7: "n" +- text run at (0,767) width 7: "o" +- text run at (0,780) width 7: "p" +- text run at (0,793) width 7: "q" +- text run at (0,806) width 5: "r" +- text run at (0,819) width 6: "s" +- text run at (0,832) width 5: "t" +- text run at (0,845) width 7: "u" +- text run at (0,858) width 7: "v" +- text run at (0,871) width 3: " " +-layer at (376,172) size 60x28 clip at (377,173) size 43x26 scrollHeight 156 +- RenderTextControl {TEXTAREA} at (14,3) size 61x28 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (1,1) size 43x156 +- RenderText {#text} at (0,0) size 43x156 +- text run at (0,0) width 33: "Lorem" +- text run at (32,0) width 4: " " +- text run at (0,13) width 32: "ipsum" +- text run at (31,13) width 4: " " +- text run at (0,26) width 28: "dolor" +- text run at (27,26) width 4: " " +- text run at (0,39) width 38: "ABCDE" +- text run at (0,52) width 40: "FGHIJK" +- text run at (0,65) width 40: "LMNOP" +- text run at (0,78) width 39: "QRSTU" +- text run at (0,91) width 41: "VWXYZ" +- text run at (40,91) width 3: " " +- text run at (0,104) width 43: "abcdefg" +- text run at (0,117) width 38: "hijklmn" +- text run at (0,130) width 41: "opqrstu" +- text run at (0,143) width 7: "v" +- text run at (6,143) width 4: " " +-layer at (378,221) size 161x60 clip at (379,222) size 159x58 +- RenderTextControl {TEXTAREA} at (16,1) size 162x60 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x52 +- RenderText {#text} at (0,0) size 155x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 155: "ABCDEFGHIJKLMNOPQRSTU" +- text run at (0,26) width 41: "VWXYZ" +- text run at (40,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (376,300) size 60x60 clip at (377,301) size 43x58 scrollHeight 173 +- RenderTextControl {TEXTAREA} at (14,1) size 61x60 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 39x169 +- RenderText {#text} at (0,0) size 39x169 +- text run at (0,0) width 33: "Lorem" +- text run at (32,0) width 4: " " +- text run at (0,13) width 32: "ipsum" +- text run at (31,13) width 4: " " +- text run at (0,26) width 28: "dolor" +- text run at (27,26) width 4: " " +- text run at (0,39) width 38: "ABCDE" +- text run at (0,52) width 32: "FGHIJ" +- text run at (0,65) width 32: "KLMN" +- text run at (0,78) width 39: "OPQRS" +- text run at (0,91) width 34: "TUVW" +- text run at (0,104) width 23: "XYZ" +- text run at (22,104) width 4: " " +- text run at (0,117) width 37: "abcdef" +- text run at (0,130) width 38: "ghijklm" +- text run at (0,143) width 37: "nopqrs" +- text run at (0,156) width 17: "tuv" +- text run at (16,156) width 4: " " +-layer at (378,381) size 161x32 clip at (379,382) size 159x30 scrollHeight 56 +- RenderTextControl {TEXTAREA} at (16,3) size 162x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x52 +- RenderText {#text} at (0,0) size 155x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 155: "ABCDEFGHIJKLMNOPQRSTU" +- text run at (0,26) width 41: "VWXYZ" +- text run at (40,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (378,436) size 161x47 clip at (379,437) size 144x30 scrollHeight 56 +- RenderTextControl {TEXTAREA} at (16,3) size 162x47 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 140x52 +- RenderText {#text} at (0,0) size 140x52 +- text run at (0,0) width 98: "Lorem ipsum dolor" +- text run at (97,0) width 4: " " +- text run at (0,13) width 140: "ABCDEFGHIJKLMNOPQRS" +- text run at (0,26) width 56: "TUVWXYZ" +- text run at (55,26) width 4: " " +- text run at (0,39) width 127: "abcdefghijklmnopqrstuv" +- text run at (126,39) width 4: " " +-layer at (376,504) size 60x60 clip at (377,505) size 58x58 scrollHeight 134 +- RenderTextControl {TEXTAREA} at (14,1) size 61x60 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 54x130 +- RenderText {#text} at (0,0) size 54x130 +- text run at (0,0) width 33: "Lorem" +- text run at (32,0) width 4: " " +- text run at (0,13) width 32: "ipsum" +- text run at (31,13) width 4: " " +- text run at (0,26) width 28: "dolor" +- text run at (27,26) width 4: " " +- text run at (0,39) width 53: "ABCDEFG" +- text run at (0,52) width 49: "HIJKLMN" +- text run at (0,65) width 54: "OPQRSTU" +- text run at (0,78) width 41: "VWXYZ" +- text run at (40,78) width 4: " " +- text run at (0,91) width 53: "abcdefghi" +- text run at (0,104) width 53: "jklmnopqr" +- text run at (0,117) width 23: "stuv" +- text run at (22,117) width 4: " " +-layer at (376,583) size 60x60 clip at (377,584) size 43x43 scrollHeight 173 +- RenderTextControl {TEXTAREA} at (14,1) size 61x60 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 39x169 +- RenderText {#text} at (0,0) size 39x169 +- text run at (0,0) width 33: "Lorem" +- text run at (32,0) width 4: " " +- text run at (0,13) width 32: "ipsum" +- text run at (31,13) width 4: " " +- text run at (0,26) width 28: "dolor" +- text run at (27,26) width 4: " " +- text run at (0,39) width 38: "ABCDE" +- text run at (0,52) width 32: "FGHIJ" +- text run at (0,65) width 32: "KLMN" +- text run at (0,78) width 39: "OPQRS" +- text run at (0,91) width 34: "TUVW" +- text run at (0,104) width 23: "XYZ" +- text run at (22,104) width 4: " " +- text run at (0,117) width 37: "abcdef" +- text run at (0,130) width 38: "ghijklm" +- text run at (0,143) width 37: "nopqrs" +- text run at (0,156) width 17: "tuv" +- text run at (16,156) width 4: " " +-layer at (376,662) size 60x60 clip at (377,663) size 43x58 scrollHeight 173 +- RenderTextControl {TEXTAREA} at (14,1) size 61x60 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 39x169 +- RenderText {#text} at (0,0) size 39x169 +- text run at (0,0) width 33: "Lorem" +- text run at (32,0) width 4: " " +- text run at (0,13) width 32: "ipsum" +- text run at (31,13) width 4: " " +- text run at (0,26) width 28: "dolor" +- text run at (27,26) width 4: " " +- text run at (0,39) width 38: "ABCDE" +- text run at (0,52) width 32: "FGHIJ" +- text run at (0,65) width 32: "KLMN" +- text run at (0,78) width 39: "OPQRS" +- text run at (0,91) width 34: "TUVW" +- text run at (0,104) width 23: "XYZ" +- text run at (22,104) width 4: " " +- text run at (0,117) width 37: "abcdef" +- text run at (0,130) width 38: "ghijklm" +- text run at (0,143) width 37: "nopqrs" +- text run at (0,156) width 17: "tuv" +- text run at (16,156) width 4: " " +-layer at (376,741) size 60x60 clip at (377,742) size 43x58 scrollHeight 173 +- RenderTextControl {TEXTAREA} at (14,1) size 61x60 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 39x169 +- RenderText {#text} at (0,0) size 39x169 +- text run at (0,0) width 33: "Lorem" +- text run at (32,0) width 4: " " +- text run at (0,13) width 32: "ipsum" +- text run at (31,13) width 4: " " +- text run at (0,26) width 28: "dolor" +- text run at (27,26) width 4: " " +- text run at (0,39) width 38: "ABCDE" +- text run at (0,52) width 32: "FGHIJ" +- text run at (0,65) width 32: "KLMN" +- text run at (0,78) width 39: "OPQRS" +- text run at (0,91) width 34: "TUVW" +- text run at (0,104) width 23: "XYZ" +- text run at (22,104) width 4: " " +- text run at (0,117) width 37: "abcdef" +- text run at (0,130) width 38: "ghijklm" +- text run at (0,143) width 37: "nopqrs" +- text run at (0,156) width 17: "tuv" +- text run at (16,156) width 4: " " +-layer at (376,820) size 60x60 clip at (377,821) size 43x58 scrollHeight 173 +- RenderTextControl {TEXTAREA} at (14,1) size 61x60 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 39x169 +- RenderText {#text} at (0,0) size 39x169 +- text run at (0,0) width 33: "Lorem" +- text run at (32,0) width 4: " " +- text run at (0,13) width 32: "ipsum" +- text run at (31,13) width 4: " " +- text run at (0,26) width 28: "dolor" +- text run at (27,26) width 4: " " +- text run at (0,39) width 38: "ABCDE" +- text run at (0,52) width 32: "FGHIJ" +- text run at (0,65) width 32: "KLMN" +- text run at (0,78) width 39: "OPQRS" +- text run at (0,91) width 34: "TUVW" +- text run at (0,104) width 23: "XYZ" +- text run at (22,104) width 4: " " +- text run at (0,117) width 37: "abcdef" +- text run at (0,130) width 38: "ghijklm" +- text run at (0,143) width 37: "nopqrs" +- text run at (0,156) width 17: "tuv" +- text run at (16,156) width 4: " " +-layer at (378,901) size 161x47 clip at (379,902) size 144x30 scrollWidth 186 scrollHeight 212 +- RenderTextControl {TEXTAREA} at (16,3) size 162x47 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 140x208 +- RenderText {#text} at (0,0) size 184x195 +- text run at (0,0) width 4: " " +- text run at (3,0) width 1: " " +- text run at (0,13) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,13) width 1: " " +- text run at (0,26) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,26) width 1: " " +- text run at (0,39) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,39) width 1: " " +- text run at (0,52) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,52) width 1: " " +- text run at (0,65) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,65) width 1: " " +- text run at (0,78) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,78) width 1: " " +- text run at (0,91) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,91) width 1: " " +- text run at (0,104) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,104) width 1: " " +- text run at (0,117) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,117) width 1: " " +- text run at (0,130) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,130) width 1: " " +- text run at (0,143) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,143) width 1: " " +- text run at (0,156) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,156) width 1: " " +- text run at (0,169) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,169) width 1: " " +- text run at (0,182) width 184: "This is a text area with wrap=\"soft\"" +- text run at (183,182) width 1: " " +- RenderBR {BR} at (0,195) size 0x13 +-layer at (378,971) size 161x32 clip at (379,972) size 144x30 scrollHeight 394 +- RenderTextControl {TEXTAREA} at (16,3) size 162x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 140x390 +- RenderText {#text} at (0,0) size 121x377 +- text run at (0,0) width 4: " " +- text run at (3,0) width 1: " " +- text run at (0,13) width 118: "This is a text area with" +- text run at (117,13) width 4: " " +- text run at (0,26) width 64: "wrap=\"soft\"" +- text run at (63,26) width 1: " " +- text run at (0,39) width 118: "This is a text area with" +- text run at (117,39) width 4: " " +- text run at (0,52) width 64: "wrap=\"soft\"" +- text run at (63,52) width 1: " " +- text run at (0,65) width 118: "This is a text area with" +- text run at (117,65) width 4: " " +- text run at (0,78) width 64: "wrap=\"soft\"" +- text run at (63,78) width 1: " " +- text run at (0,91) width 118: "This is a text area with" +- text run at (117,91) width 4: " " +- text run at (0,104) width 64: "wrap=\"soft\"" +- text run at (63,104) width 1: " " +- text run at (0,117) width 118: "This is a text area with" +- text run at (117,117) width 4: " " +- text run at (0,130) width 64: "wrap=\"soft\"" +- text run at (63,130) width 1: " " +- text run at (0,143) width 118: "This is a text area with" +- text run at (117,143) width 4: " " +- text run at (0,156) width 64: "wrap=\"soft\"" +- text run at (63,156) width 1: " " +- text run at (0,169) width 118: "This is a text area with" +- text run at (117,169) width 4: " " +- text run at (0,182) width 64: "wrap=\"soft\"" +- text run at (63,182) width 1: " " +- text run at (0,195) width 118: "This is a text area with" +- text run at (117,195) width 4: " " +- text run at (0,208) width 64: "wrap=\"soft\"" +- text run at (63,208) width 1: " " +- text run at (0,221) width 118: "This is a text area with" +- text run at (117,221) width 4: " " +- text run at (0,234) width 64: "wrap=\"soft\"" +- text run at (63,234) width 1: " " +- text run at (0,247) width 118: "This is a text area with" +- text run at (117,247) width 4: " " +- text run at (0,260) width 64: "wrap=\"soft\"" +- text run at (63,260) width 1: " " +- text run at (0,273) width 118: "This is a text area with" +- text run at (117,273) width 4: " " +- text run at (0,286) width 64: "wrap=\"soft\"" +- text run at (63,286) width 1: " " +- text run at (0,299) width 118: "This is a text area with" +- text run at (117,299) width 4: " " +- text run at (0,312) width 64: "wrap=\"soft\"" +- text run at (63,312) width 1: " " +- text run at (0,325) width 118: "This is a text area with" +- text run at (117,325) width 4: " " +- text run at (0,338) width 64: "wrap=\"soft\"" +- text run at (63,338) width 1: " " +- text run at (0,351) width 118: "This is a text area with" +- text run at (117,351) width 4: " " +- text run at (0,364) width 64: "wrap=\"soft\"" +- text run at (63,364) width 1: " " +- RenderBR {BR} at (0,377) size 0x13 +-layer at (378,1026) size 161x32 clip at (379,1027) size 144x30 scrollHeight 394 +- RenderTextControl {TEXTAREA} at (16,3) size 162x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 140x390 +- RenderText {#text} at (0,0) size 121x377 +- text run at (0,0) width 4: " " +- text run at (3,0) width 1: " " +- text run at (0,13) width 118: "This is a text area with" +- text run at (117,13) width 4: " " +- text run at (0,26) width 64: "wrap=\"soft\"" +- text run at (63,26) width 1: " " +- text run at (0,39) width 118: "This is a text area with" +- text run at (117,39) width 4: " " +- text run at (0,52) width 64: "wrap=\"soft\"" +- text run at (63,52) width 1: " " +- text run at (0,65) width 118: "This is a text area with" +- text run at (117,65) width 4: " " +- text run at (0,78) width 64: "wrap=\"soft\"" +- text run at (63,78) width 1: " " +- text run at (0,91) width 118: "This is a text area with" +- text run at (117,91) width 4: " " +- text run at (0,104) width 64: "wrap=\"soft\"" +- text run at (63,104) width 1: " " +- text run at (0,117) width 118: "This is a text area with" +- text run at (117,117) width 4: " " +- text run at (0,130) width 64: "wrap=\"soft\"" +- text run at (63,130) width 1: " " +- text run at (0,143) width 118: "This is a text area with" +- text run at (117,143) width 4: " " +- text run at (0,156) width 64: "wrap=\"soft\"" +- text run at (63,156) width 1: " " +- text run at (0,169) width 118: "This is a text area with" +- text run at (117,169) width 4: " " +- text run at (0,182) width 64: "wrap=\"soft\"" +- text run at (63,182) width 1: " " +- text run at (0,195) width 118: "This is a text area with" +- text run at (117,195) width 4: " " +- text run at (0,208) width 64: "wrap=\"soft\"" +- text run at (63,208) width 1: " " +- text run at (0,221) width 118: "This is a text area with" +- text run at (117,221) width 4: " " +- text run at (0,234) width 64: "wrap=\"soft\"" +- text run at (63,234) width 1: " " +- text run at (0,247) width 118: "This is a text area with" +- text run at (117,247) width 4: " " +- text run at (0,260) width 64: "wrap=\"soft\"" +- text run at (63,260) width 1: " " +- text run at (0,273) width 118: "This is a text area with" +- text run at (117,273) width 4: " " +- text run at (0,286) width 64: "wrap=\"soft\"" +- text run at (63,286) width 1: " " +- text run at (0,299) width 118: "This is a text area with" +- text run at (117,299) width 4: " " +- text run at (0,312) width 64: "wrap=\"soft\"" +- text run at (63,312) width 1: " " +- text run at (0,325) width 118: "This is a text area with" +- text run at (117,325) width 4: " " +- text run at (0,338) width 64: "wrap=\"soft\"" +- text run at (63,338) width 1: " " +- text run at (0,351) width 118: "This is a text area with" +- text run at (117,351) width 4: " " +- text run at (0,364) width 64: "wrap=\"soft\"" +- text run at (63,364) width 1: " " +- RenderBR {BR} at (0,377) size 0x13 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/box-shadow-override-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/box-shadow-override-expected.txt +deleted file mode 100644 +index 644fdff2f3386af632fe4f85736bbe0475180f17..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/box-shadow-override-expected.txt ++++ /dev/null +@@ -1,83 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "Tests that box shadow is not applied to Aqua-themed controls." +- RenderBlock {P} at (0,34) size 784x18 +- RenderText {#text} at (0,0) size 259x18 +- text run at (0,0) width 259: "You should not see any red on this page." +- RenderBlock {DIV} at (0,68) size 784x23 +- RenderTextControl {INPUT} at (2,2) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (0,91) size 784x23 +- RenderTextControl {INPUT} at (2,2) size 183x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 177x19 +- RenderBlock {DIV} at (0,0) size 17x19 +- RenderBlock {DIV} at (17,3) size 141x13 +- RenderBlock {DIV} at (157,0) size 20x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (0,114) size 784x23 +- RenderTextControl {INPUT} at (2,2) size 188x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 182x19 +- RenderBlock {DIV} at (0,0) size 22x19 +- RenderBlock {DIV} at (22,3) size 141x13 +- RenderBlock {DIV} at (162,0) size 20x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,137) size 784x32 +- RenderBlock {INPUT} at (2,13) size 12x12 +- RenderText {#text} at (16,9) size 4x18 +- text run at (16,9) width 4: " " +- RenderBlock {INPUT} at (22,13) size 12x12 +- RenderText {#text} at (36,9) size 4x18 +- text run at (36,9) width 4: " " +- RenderSlider {INPUT} at (42,8) size 129x15 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (57,0) size 15x15 +- RenderText {#text} at (173,9) size 4x18 +- text run at (173,9) width 4: " " +- RenderFileUploadControl {INPUT} at (179,10) size 238x18 "no file selected" +- RenderButton {INPUT} at (0,0) size 78x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 62x13 +- RenderText at (0,0) size 62x13 +- text run at (0,0) width 62: "Choose File" +- RenderText {#text} at (419,9) size 4x18 +- text run at (419,9) width 4: " " +- RenderButton {INPUT} at (425,8) size 57x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 41x16 +- RenderText at (0,0) size 41x16 +- text run at (0,0) width 41: "Button" +- RenderText {#text} at (483,9) size 5x18 +- text run at (483,9) width 5: " " +- RenderButton {INPUT} at (489,10) size 52x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 35x13 +- RenderText at (0,0) size 35x13 +- text run at (0,0) width 35: "Button" +- RenderText {#text} at (542,9) size 5x18 +- text run at (542,9) width 5: " " +- RenderButton {INPUT} at (546,12) size 46x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 30x11 +- RenderText at (0,0) size 30x11 +- text run at (0,0) width 30: "Button" +- RenderText {#text} at (591,9) size 5x18 +- text run at (591,9) width 5: " " +- RenderButton {BUTTON} at (597,2) size 75x28 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 58x23 +- RenderText {#text} at (0,0) size 58x23 +- text run at (0,0) width 58: "Button" +- RenderText {#text} at (0,0) size 0x0 +-layer at (21,81) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 37x13 +- text run at (0,0) width 37: "Search" +-layer at (30,104) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (35,127) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/button-positioned-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/button-positioned-expected.txt +deleted file mode 100644 +index 4053905ac0f0716ddbbc500b2e7153355f28fb92..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/button-positioned-expected.txt ++++ /dev/null +@@ -1,15 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +-layer at (10,10) size 149x18 +- RenderButton {BUTTON} at (10,10) size 150x18 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 134x13 +- RenderText {#text} at (0,0) size 134x13 +- text run at (0,0) width 134: "This button is positioned." +-layer at (10,10) size 170x18 +- RenderButton {INPUT} at (10,10) size 171x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 155x13 +- RenderText at (0,0) size 155x13 +- text run at (0,0) width 155: "This button is also positioned" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/button-sizes-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/button-sizes-expected.txt +deleted file mode 100644 +index 4141bbfb7f1e39c556613b4659d08789f2b9afeb..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/button-sizes-expected.txt ++++ /dev/null +@@ -1,112 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderButton {BUTTON} at (0,8) size 46x15 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,4) size 30x6 +- RenderText {#text} at (0,0) size 30x6 +- text run at (0,0) width 30: "Test Button" +- RenderText {#text} at (45,3) size 5x18 +- text run at (45,3) width 5: " " +- RenderButton {BUTTON} at (49,8) size 52x15 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,3) size 36x8 +- RenderText {#text} at (0,0) size 36x7 +- text run at (0,0) width 36: "Test Button" +- RenderText {#text} at (100,3) size 5x18 +- text run at (100,3) width 5: " " +- RenderButton {BUTTON} at (104,7) size 57x15 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,3) size 41x8 +- RenderText {#text} at (0,0) size 41x8 +- text run at (0,0) width 41: "Test Button" +- RenderText {#text} at (160,3) size 5x18 +- text run at (160,3) width 5: " " +- RenderButton {BUTTON} at (164,7) size 63x15 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 46x10 +- RenderText {#text} at (0,0) size 46x10 +- text run at (0,0) width 46: "Test Button" +- RenderText {#text} at (226,3) size 5x18 +- text run at (226,3) width 5: " " +- RenderButton {BUTTON} at (230,6) size 67x16 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText {#text} at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (296,3) size 5x18 +- text run at (296,3) width 5: " " +- RenderButton {BUTTON} at (300,5) size 73x17 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 56x12 +- RenderText {#text} at (0,0) size 56x12 +- text run at (0,0) width 56: "Test Button" +- RenderText {#text} at (372,3) size 5x18 +- text run at (372,3) width 5: " " +- RenderButton {BUTTON} at (378,4) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText {#text} at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (456,3) size 5x18 +- text run at (456,3) width 5: " " +- RenderButton {INPUT} at (462,4) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (540,3) size 5x18 +- text run at (540,3) width 5: " " +- RenderButton {BUTTON} at (546,3) size 82x20 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 65x15 +- RenderText {#text} at (0,0) size 65x15 +- text run at (0,0) width 65: "Test Button" +- RenderText {#text} at (629,3) size 5x18 +- text run at (629,3) width 5: " " +- RenderButton {BUTTON} at (635,2) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText {#text} at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (722,3) size 5x18 +- text run at (722,3) width 5: " " +- RenderButton {BUTTON} at (2,32) size 91x22 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 75x17 +- RenderText {#text} at (0,0) size 75x17 +- text run at (0,0) width 75: "Test Button" +- RenderText {#text} at (94,34) size 5x18 +- text run at (94,34) width 5: " " +- RenderButton {BUTTON} at (100,31) size 95x23 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 79x18 +- RenderText {#text} at (0,0) size 79x18 +- text run at (0,0) width 79: "Test Button" +- RenderText {#text} at (196,34) size 5x18 +- text run at (196,34) width 5: " " +- RenderButton {BUTTON} at (202,31) size 100x23 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 84x18 +- RenderText {#text} at (0,0) size 84x18 +- text run at (0,0) width 84: "Test Button" +- RenderText {#text} at (303,34) size 5x18 +- text run at (303,34) width 5: " " +- RenderButton {BUTTON} at (309,30) size 105x25 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 88x20 +- RenderText {#text} at (0,0) size 88x20 +- text run at (0,0) width 88: "Test Button" +- RenderText {#text} at (415,34) size 5x18 +- text run at (415,34) width 5: " " +- RenderButton {BUTTON} at (421,29) size 109x26 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 93x21 +- RenderText {#text} at (0,0) size 93x21 +- text run at (0,0) width 93: "Test Button" +- RenderText {#text} at (531,34) size 5x18 +- text run at (531,34) width 5: " " +- RenderButton {BUTTON} at (537,28) size 115x27 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 98x22 +- RenderText {#text} at (0,0) size 98x22 +- text run at (0,0) width 98: "Test Button" +- RenderText {#text} at (653,34) size 5x18 +- text run at (653,34) width 5: " " +- RenderButton {BUTTON} at (659,27) size 115x28 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 99x23 +- RenderText {#text} at (0,0) size 99x23 +- text run at (0,0) width 99: "Test Button" +- RenderText {#text} at (775,34) size 5x18 +- text run at (775,34) width 5: " " +- RenderButton {BUTTON} at (2,59) size 119x29 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 103x24 +- RenderText {#text} at (0,0) size 103x24 +- text run at (0,0) width 103: "Test Button" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/date/date-input-rendering-basic-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/date/date-input-rendering-basic-expected.txt +deleted file mode 100644 +index 281158451a5bb6b90319605a4471a8067589591b..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/date/date-input-rendering-basic-expected.txt ++++ /dev/null +@@ -1,48 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (83,4) size 5x18 +- text run at (83,4) width 5: " " +- RenderText {#text} at (0,0) size 0x0 +-layer at (10,10) size 79x23 clip at (12,12) size 75x19 +- RenderFlexibleBox {INPUT} at (2,2) size 80x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +-layer at (13,13) size 73x17 +- RenderBlock {DIV} at (3,3) size 74x17 +- RenderBlock {DIV} at (1,1) size 72x15 +- RenderBlock {DIV} at (0,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "04" +- RenderInline {DIV} at (0,0) size 5x13 +- RenderText {#text} at (16,1) size 5x13 +- text run at (16,1) width 5: "/" +- RenderBlock {DIV} at (20,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "01" +- RenderInline {DIV} at (0,0) size 5x13 +- RenderText {#text} at (36,1) size 5x13 +- text run at (36,1) width 5: "/" +- RenderBlock {DIV} at (40,0) size 32x15 +- RenderText {#text} at (1,1) size 29x13 +- text run at (1,1) width 29: "1976" +-layer at (97,10) size 79x23 clip at (99,12) size 75x19 +- RenderFlexibleBox {INPUT} at (89,2) size 80x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +-layer at (100,13) size 73x17 +- RenderBlock {DIV} at (3,3) size 74x17 +- RenderBlock {DIV} at (1,1) size 72x15 +- RenderBlock {DIV} at (54,0) size 18x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "04" +- RenderInline {DIV} at (0,0) size 5x13 +- RenderText {#text} at (50,1) size 5x13 +- text run at (50,1) width 5 RTL: "/" +- RenderBlock {DIV} at (34,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "01" +- RenderInline {DIV} at (0,0) size 5x13 +- RenderText {#text} at (30,1) size 5x13 +- text run at (30,1) width 5 RTL: "/" +- RenderBlock {DIV} at (0,0) size 31x15 +- RenderText {#text} at (1,1) size 29x13 +- text run at (1,1) width 29: "1976" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/form-element-geometry-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/form-element-geometry-expected.txt +deleted file mode 100644 +index 7a08a9fdf5d499b4f1fa99d0f9396424401766e5..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/form-element-geometry-expected.txt ++++ /dev/null +@@ -1,261 +0,0 @@ +-layer at (0,0) size 785x636 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x636 +- RenderBlock {HTML} at (0,0) size 785x636 +- RenderBody {BODY} at (8,8) size 769x620 +- RenderBlock {H1} at (0,0) size 769x37 +- RenderText {#text} at (0,0) size 420x37 +- text run at (0,0) width 420: "Form Element Geometry Tests" +- RenderBlock {P} at (0,58) size 769x19 +- RenderText {#text} at (0,0) size 551x18 +- text run at (0,0) width 551: "These tests help us tune the widget classes in KWQ to have all the right fudge factors." +- RenderBlock {H2} at (0,96) size 769x29 +- RenderText {#text} at (0,0) size 167x28 +- text run at (0,0) width 167: "Bounding Boxes" +- RenderTable {TABLE} at (0,144) size 169x29 +- RenderTableSection {TBODY} at (0,0) size 169x28 +- RenderTableRow {TR} at (0,2) size 169x24 +- RenderTableCell {TD} at (2,2) size 57x24 [r=0 c=0 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 55x22 [border: (2px solid #0000FF)] +- RenderInline {FONT} at (0,0) size 51x28 +- RenderButton {INPUT} at (2,2) size 51x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 35x13 +- RenderText at (0,0) size 35x13 +- text run at (0,0) width 35: "button" +- RenderTableCell {TD} at (60,2) size 67x24 [r=0 c=1 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 64x22 [border: (2px solid #0000FF)] +- RenderInline {FONT} at (0,0) size 60x28 +- RenderMenuList {SELECT} at (2,2) size 60x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 60x18 +- RenderText at (8,2) size 29x13 +- text run at (8,2) width 29: "menu" +- RenderTableCell {TD} at (128,5) size 19x18 [r=0 c=2 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 16x16 [border: (2px solid #0000FF)] +- RenderInline {FONT} at (0,0) size 12x28 +- RenderBlock {INPUT} at (2,2) size 12x12 +- RenderTableCell {TD} at (148,5) size 19x18 [r=0 c=3 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 16x16 [border: (2px solid #0000FF)] +- RenderInline {FONT} at (0,0) size 12x28 +- RenderBlock {INPUT} at (2,2) size 12x12 +- RenderTable {TABLE} at (0,172) size 169x29 +- RenderTableSection {TBODY} at (0,0) size 169x28 +- RenderTableRow {TR} at (0,2) size 169x24 +- RenderTableCell {TD} at (2,2) size 57x24 [r=0 c=0 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 55x22 [border: (2px solid #0000FF)] +- RenderButton {INPUT} at (2,2) size 51x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 35x13 +- RenderText at (0,0) size 35x13 +- text run at (0,0) width 35: "button" +- RenderTableCell {TD} at (60,2) size 67x24 [r=0 c=1 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 64x22 [border: (2px solid #0000FF)] +- RenderMenuList {SELECT} at (2,2) size 60x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 60x18 +- RenderText at (8,2) size 29x13 +- text run at (8,2) width 29: "menu" +- RenderTableCell {TD} at (128,5) size 19x18 [r=0 c=2 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 16x16 [border: (2px solid #0000FF)] +- RenderBlock {INPUT} at (2,2) size 12x12 +- RenderTableCell {TD} at (148,5) size 19x18 [r=0 c=3 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 16x16 [border: (2px solid #0000FF)] +- RenderBlock {INPUT} at (2,2) size 12x12 +- RenderTable {TABLE} at (0,200) size 169x29 +- RenderTableSection {TBODY} at (0,0) size 169x28 +- RenderTableRow {TR} at (0,2) size 169x24 +- RenderTableCell {TD} at (2,2) size 57x24 [r=0 c=0 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 55x22 [border: (2px solid #0000FF)] +- RenderInline {FONT} at (0,0) size 51x13 +- RenderButton {INPUT} at (2,2) size 51x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 35x13 +- RenderText at (0,0) size 35x13 +- text run at (0,0) width 35: "button" +- RenderTableCell {TD} at (60,2) size 67x24 [r=0 c=1 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 64x22 [border: (2px solid #0000FF)] +- RenderInline {FONT} at (0,0) size 60x13 +- RenderMenuList {SELECT} at (2,2) size 60x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 60x18 +- RenderText at (8,2) size 29x13 +- text run at (8,2) width 29: "menu" +- RenderTableCell {TD} at (128,5) size 19x18 [r=0 c=2 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 16x16 [border: (2px solid #0000FF)] +- RenderInline {FONT} at (0,0) size 12x13 +- RenderBlock {INPUT} at (2,2) size 12x12 +- RenderTableCell {TD} at (148,5) size 19x18 [r=0 c=3 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 16x16 [border: (2px solid #0000FF)] +- RenderInline {FONT} at (0,0) size 12x13 +- RenderBlock {INPUT} at (2,2) size 12x12 +- RenderTable {TABLE} at (0,228) size 547x68 +- RenderTableSection {TBODY} at (0,0) size 547x67 +- RenderTableRow {TR} at (0,2) size 547x63 +- RenderTableCell {TD} at (2,2) size 83x25 [r=0 c=0 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 81x23 [border: (2px solid #0000FF)] +- RenderTextControl {INPUT} at (2,2) size 77x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderTableCell {TD} at (86,2) size 40x63 [r=0 c=1 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 37x61 [border: (2px solid #0000FF)] +- RenderListBox {SELECT} at (2,2) size 33x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (127,2) size 245x24 [r=0 c=2 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 242x22 [border: (2px solid #0000FF)] +- RenderFileUploadControl {INPUT} at (2,2) size 238x18 "no file selected" +- RenderButton {INPUT} at (0,0) size 78x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 62x13 +- RenderText at (0,0) size 62x13 +- text run at (0,0) width 62: "Choose File" +- RenderTableCell {TD} at (373,2) size 172x42 [r=0 c=3 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 169x40 [border: (2px solid #0000FF)] +- RenderBlock {H2} at (0,315) size 769x29 +- RenderText {#text} at (0,0) size 200x28 +- text run at (0,0) width 200: "Baseline Alignment" +- RenderBlock {DIV} at (0,363) size 769x30 +- RenderInline {FONT} at (0,0) size 211x28 +- RenderText {#text} at (0,0) size 42x28 +- text run at (0,0) width 42: "text " +- RenderButton {INPUT} at (43,9) size 52x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 35x13 +- RenderText at (0,0) size 35x13 +- text run at (0,0) width 35: "button" +- RenderText {#text} at (96,0) size 7x28 +- text run at (96,0) width 7: " " +- RenderMenuList {SELECT} at (104,9) size 61x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 60x18 +- RenderText at (8,2) size 29x13 +- text run at (8,2) width 29: "menu" +- RenderText {#text} at (166,0) size 7x28 +- text run at (166,0) width 7: " " +- RenderBlock {INPUT} at (174,12) size 13x12 +- RenderText {#text} at (188,0) size 7x28 +- text run at (188,0) width 7: " " +- RenderBlock {INPUT} at (196,12) size 13x12 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (0,392) size 769x23 +- RenderText {#text} at (0,1) size 28x18 +- text run at (0,1) width 28: "text " +- RenderButton {INPUT} at (29,2) size 52x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 35x13 +- RenderText at (0,0) size 35x13 +- text run at (0,0) width 35: "button" +- RenderText {#text} at (82,1) size 5x18 +- text run at (82,1) width 5: " " +- RenderMenuList {SELECT} at (88,2) size 61x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 60x18 +- RenderText at (8,2) size 29x13 +- text run at (8,2) width 29: "menu" +- RenderText {#text} at (150,1) size 5x18 +- text run at (150,1) width 5: " " +- RenderBlock {INPUT} at (156,5) size 13x12 +- RenderText {#text} at (170,1) size 5x18 +- text run at (170,1) width 5: " " +- RenderBlock {INPUT} at (176,5) size 13x12 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (0,414) size 769x23 +- RenderInline {FONT} at (0,0) size 176x13 +- RenderText {#text} at (0,5) size 18x13 +- text run at (0,5) width 18: "text " +- RenderButton {INPUT} at (19,2) size 51x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 35x13 +- RenderText at (0,0) size 35x13 +- text run at (0,0) width 35: "button" +- RenderText {#text} at (71,5) size 4x13 +- text run at (71,5) width 4: " " +- RenderMenuList {SELECT} at (76,2) size 61x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 60x18 +- RenderText at (8,2) size 29x13 +- text run at (8,2) width 29: "menu" +- RenderText {#text} at (138,5) size 3x13 +- text run at (138,5) width 3: " " +- RenderBlock {INPUT} at (142,5) size 13x12 +- RenderText {#text} at (156,5) size 4x13 +- text run at (156,5) width 4: " " +- RenderBlock {INPUT} at (161,5) size 13x12 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (0,436) size 769x44 +- RenderText {#text} at (0,22) size 28x18 +- text run at (0,22) width 28: "text " +- RenderTextControl {INPUT} at (29,22) size 78x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (108,22) size 5x18 +- text run at (108,22) width 5: " " +- RenderFileUploadControl {INPUT} at (114,23) size 239x18 "no file selected" +- RenderButton {INPUT} at (0,0) size 78x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 62x13 +- RenderText at (0,0) size 62x13 +- text run at (0,0) width 62: "Choose File" +- RenderText {#text} at (354,22) size 5x18 +- text run at (354,22) width 5: " " +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {H2} at (0,498) size 769x29 +- RenderText {#text} at (0,0) size 198x28 +- text run at (0,0) width 198: "Pop-up Menu Sizes" +- RenderBlock {DIV} at (0,546) size 769x30 +- RenderInline {FONT} at (0,0) size 174x28 +- RenderText {#text} at (0,0) size 0x0 +- RenderMenuList {SELECT} at (2,9) size 36x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 36x18 +- RenderText at (8,2) size 0x13 +- text run at (8,2) width 0: " " +- RenderText {#text} at (40,0) size 6x28 +- text run at (40,0) width 6: " " +- RenderMenuList {SELECT} at (48,9) size 36x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 36x18 +- RenderText at (8,2) size 4x13 +- text run at (8,2) width 4: "|" +- RenderText {#text} at (86,0) size 6x28 +- text run at (86,0) width 6: " " +- RenderMenuList {SELECT} at (94,9) size 78x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 78x18 +- RenderText at (8,2) size 47x13 +- text run at (8,2) width 47: "xxxxxxxx" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (0,575) size 769x23 +- RenderMenuList {SELECT} at (2,2) size 36x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 36x18 +- RenderText at (8,2) size 0x13 +- text run at (8,2) width 0: " " +- RenderText {#text} at (40,1) size 4x18 +- text run at (40,1) width 4: " " +- RenderMenuList {SELECT} at (46,2) size 36x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 36x18 +- RenderText at (8,2) size 4x13 +- text run at (8,2) width 4: "|" +- RenderText {#text} at (84,1) size 4x18 +- text run at (84,1) width 4: " " +- RenderMenuList {SELECT} at (90,2) size 78x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 78x18 +- RenderText at (8,2) size 47x13 +- text run at (8,2) width 47: "xxxxxxxx" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (0,597) size 769x23 +- RenderInline {FONT} at (0,0) size 167x13 +- RenderText {#text} at (0,0) size 0x0 +- RenderMenuList {SELECT} at (2,2) size 36x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 36x18 +- RenderText at (8,2) size 0x13 +- text run at (8,2) width 0: " " +- RenderText {#text} at (40,5) size 3x13 +- text run at (40,5) width 3: " " +- RenderMenuList {SELECT} at (44,2) size 37x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 36x18 +- RenderText at (8,2) size 4x13 +- text run at (8,2) width 4: "|" +- RenderText {#text} at (82,5) size 3x13 +- text run at (82,5) width 3: " " +- RenderMenuList {SELECT} at (87,2) size 78x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 78x18 +- RenderText at (8,2) size 47x13 +- text run at (8,2) width 47: "xxxxxxxx" +- RenderText {#text} at (0,0) size 0x0 +-layer at (16,244) size 71x13 +- RenderBlock {DIV} at (3,3) size 71x13 +- RenderText {#text} at (0,0) size 46x13 +- text run at (0,0) width 46: "text field" +-layer at (387,243) size 161x32 clip at (388,244) size 159x30 +- RenderTextControl {TEXTAREA} at (4,4) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x13 +- RenderText {#text} at (0,0) size 43x13 +- text run at (0,0) width 43: "textarea" +-layer at (41,469) size 71x13 +- RenderBlock {DIV} at (3,3) size 71x13 +- RenderText {#text} at (0,0) size 46x13 +- text run at (0,0) width 46: "text field" +-layer at (369,446) size 161x32 clip at (370,447) size 159x30 +- RenderTextControl {TEXTAREA} at (360,2) size 162x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x13 +- RenderText {#text} at (0,0) size 43x13 +- text run at (0,0) width 43: "textarea" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/hidpi-textfield-background-bleeding-expected.html b/LayoutTests/platform/mac-catalina/fast/forms/hidpi-textfield-background-bleeding-expected.html +deleted file mode 100644 +index 335c2076ebda248acce27ce7ad69545a087a78f2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/hidpi-textfield-background-bleeding-expected.html ++++ /dev/null +@@ -1,24 +0,0 @@ +- +- +- +- +- +- +-
+- +- +- +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-height-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-height-expected.txt +deleted file mode 100644 +index 736b0118a9791eb5e4cd38541321657fb88676c7..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-height-expected.txt ++++ /dev/null +@@ -1,108 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock (anonymous) at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 781x18 +- text run at (0,0) width 781: "This tests the height attribute of form elements. The only element that should honour this value is the Image type of input." +- RenderBlock {FORM} at (0,18) size 784x258 +- RenderText {#text} at (0,2) size 37x18 +- text run at (0,2) width 37: "input " +- RenderTextControl {INPUT} at (38,2) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (187,2) size 5x18 +- text run at (187,2) width 5: " " +- RenderBR {BR} at (191,2) size 1x18 +- RenderText {#text} at (0,25) size 28x18 +- text run at (0,25) width 28: "text " +- RenderTextControl {INPUT} at (29,25) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (178,25) size 5x18 +- text run at (178,25) width 5: " " +- RenderBR {BR} at (182,25) size 1x18 +- RenderText {#text} at (0,46) size 66x18 +- text run at (0,46) width 66: "checkbox " +- RenderBlock {INPUT} at (67,50) size 13x12 +- RenderText {#text} at (81,46) size 5x18 +- text run at (81,46) width 5: " " +- RenderBR {BR} at (85,46) size 1x18 +- RenderText {#text} at (0,66) size 25x18 +- text run at (0,66) width 25: "file " +- RenderFileUploadControl {INPUT} at (26,67) size 239x18 "no file selected" +- RenderButton {INPUT} at (0,0) size 78x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 62x13 +- RenderText at (0,0) size 62x13 +- text run at (0,0) width 62: "Choose File" +- RenderText {#text} at (266,66) size 5x18 +- text run at (266,66) width 5: " " +- RenderBR {BR} at (270,66) size 1x18 +- RenderText {#text} at (0,87) size 44x18 +- text run at (0,87) width 44: "image " +- RenderImage {INPUT} at (43,100) size 11x1 +- RenderText {#text} at (53,87) size 5x18 +- text run at (53,87) width 5: " " +- RenderBR {BR} at (57,87) size 1x18 +- RenderText {#text} at (0,105) size 37x18 +- text run at (0,105) width 37: "radio " +- RenderBlock {INPUT} at (38,109) size 13x12 +- RenderText {#text} at (52,105) size 5x18 +- text run at (52,105) width 5: " " +- RenderBR {BR} at (56,105) size 1x18 +- RenderText {#text} at (0,127) size 40x18 +- text run at (0,127) width 40: "range " +- RenderSlider {INPUT} at (41,126) size 130x15 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (57,0) size 15x15 +- RenderText {#text} at (172,127) size 5x18 +- text run at (172,127) width 5: " " +- RenderBR {BR} at (176,127) size 1x18 +- RenderText {#text} at (0,146) size 35x18 +- text run at (0,146) width 35: "reset " +- RenderButton {INPUT} at (36,147) size 46x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 30x13 +- RenderText at (0,0) size 30x13 +- text run at (0,0) width 30: "Reset" +- RenderText {#text} at (83,146) size 5x18 +- text run at (83,146) width 5: " " +- RenderBR {BR} at (87,146) size 1x18 +- RenderText {#text} at (0,168) size 48x18 +- text run at (0,168) width 48: "submit " +- RenderButton {INPUT} at (49,169) size 54x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 37x13 +- RenderText at (0,0) size 37x13 +- text run at (0,0) width 37: "Submit" +- RenderText {#text} at (104,168) size 5x18 +- text run at (104,168) width 5: " " +- RenderBR {BR} at (108,168) size 1x18 +- RenderText {#text} at (0,191) size 51x18 +- text run at (0,191) width 51: "isindex " +- RenderTextControl {INPUT} at (52,191) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (201,191) size 5x18 +- text run at (201,191) width 5: " " +- RenderBR {BR} at (205,191) size 1x18 +- RenderText {#text} at (0,214) size 65x18 +- text run at (0,214) width 65: "password " +- RenderTextControl {INPUT} at (66,214) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (215,214) size 5x18 +- text run at (215,214) width 5: " " +- RenderBR {BR} at (219,214) size 1x18 +- RenderText {#text} at (0,237) size 45x18 +- text run at (0,237) width 45: "search " +- RenderTextControl {INPUT} at (46,237) size 175x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderText {#text} at (0,0) size 0x0 +-layer at (50,31) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (41,54) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (63,220) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (77,243) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (66,266) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-preventDefault-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-preventDefault-expected.txt +deleted file mode 100644 +index b77f5e5b91609c7c11ff6c93fe1cc8a9bc94cfe9..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-preventDefault-expected.txt ++++ /dev/null +@@ -1,21 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBR {BR} at (0,0) size 0x18 +- RenderText {#text} at (0,18) size 681x18 +- text run at (0,18) width 681: "This tests that preventDefault called onmousedown will prevent a caret from being placed in the text field." +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +-layer at (12,52) size 147x19 +- RenderTextControl {INPUT} at (12,52) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +-layer at (15,55) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 127x13 +- text run at (0,0) width 127: "No caret should be here" +-layer at (10,70) size 328x36 +- RenderBlock (positioned) {DIV} at (10,70) size 328x36 +- RenderBR {BR} at (0,0) size 0x18 +- RenderText {#text} at (0,18) size 328x18 +- text run at (0,18) width 328: "mousedown on target [object HTMLInputElement]" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-spinbutton-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-spinbutton-expected.txt +deleted file mode 100644 +index b6d4350e69c0faf3de8a4837e55d50d5f3e3cc1c..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-spinbutton-expected.txt ++++ /dev/null +@@ -1,207 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 245x18 +- text run at (0,0) width 245: "Test appearances of outer-spin-button." +- RenderBlock {DIV} at (0,34) size 784x0 +- RenderBlock {DIV} at (0,34) size 784x528 +- RenderTable {TABLE} at (0,0) size 503x528 +- RenderTableSection {TBODY} at (0,0) size 503x528 +- RenderTableRow {TR} at (0,2) size 503x524 +- RenderTableCell {TD} at (2,83) size 198x362 [r=0 c=0 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 196x32 +- RenderTextControl {INPUT} at (0,0) size 112x16 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (111,-3) size 1x18 +- RenderTextControl {INPUT} at (0,16) size 112x16 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 106x16 +- RenderBlock {DIV} at (0,2) size 93x11 +- RenderBlock {DIV} at (1,33) size 196x34 +- RenderTextControl {INPUT} at (0,0) size 124x17 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (123,-2) size 1x18 +- RenderTextControl {INPUT} at (0,17) size 124x17 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 118x15 +- RenderBlock {DIV} at (0,2) size 105x11 +- RenderBlock {DIV} at (1,67) size 196x36 +- RenderTextControl {INPUT} at (0,0) size 136x18 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (135,-1) size 1x18 +- RenderTextControl {INPUT} at (0,18) size 136x18 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 130x16 +- RenderBlock {DIV} at (0,1) size 117x13 +- RenderBlock {DIV} at (1,103) size 196x46 +- RenderTextControl {INPUT} at (2,2) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (150,2) size 1x18 +- RenderTextControl {INPUT} at (2,25) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 141x17 +- RenderBlock {DIV} at (0,1) size 128x14 +- RenderBlock {DIV} at (1,149) size 196x50 +- RenderTextControl {INPUT} at (2,2) size 159x21 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (162,3) size 1x18 +- RenderTextControl {INPUT} at (2,27) size 159x21 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 153x19 +- RenderBlock {DIV} at (0,1) size 140x16 +- RenderBlock {DIV} at (1,199) size 196x52 +- RenderTextControl {INPUT} at (2,2) size 170x22 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (173,4) size 1x18 +- RenderTextControl {INPUT} at (2,28) size 170x22 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 164x20 +- RenderBlock {DIV} at (0,1) size 149x17 +- RenderBlock {DIV} at (1,251) size 196x54 +- RenderTextControl {INPUT} at (2,2) size 181x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (184,5) size 1x18 +- RenderTextControl {INPUT} at (2,29) size 181x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 175x21 +- RenderBlock {DIV} at (0,2) size 160x17 +- RenderBlock {DIV} at (1,305) size 196x56 +- RenderTextControl {INPUT} at (2,2) size 192x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (195,6) size 1x18 +- RenderTextControl {INPUT} at (2,30) size 192x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 186x24 +- RenderBlock {DIV} at (0,2) size 171x19 +- RenderTableCell {TD} at (201,2) size 300x524 [r=0 c=1 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 297x56 +- RenderTextControl {INPUT} at (2,2) size 203x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (206,6) size 1x18 +- RenderTextControl {INPUT} at (2,30) size 203x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 197x24 +- RenderBlock {DIV} at (0,3) size 182x18 +- RenderBlock {DIV} at (1,57) size 297x60 +- RenderTextControl {INPUT} at (2,2) size 214x26 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (217,7) size 1x18 +- RenderTextControl {INPUT} at (2,32) size 214x26 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 208x26 +- RenderBlock {DIV} at (0,2) size 193x21 +- RenderBlock {DIV} at (1,117) size 297x62 +- RenderTextControl {INPUT} at (2,2) size 226x27 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (229,8) size 1x18 +- RenderTextControl {INPUT} at (2,33) size 226x27 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 220x27 +- RenderBlock {DIV} at (0,3) size 201x21 +- RenderBlock {DIV} at (1,179) size 297x64 +- RenderTextControl {INPUT} at (2,2) size 237x28 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (240,9) size 1x18 +- RenderTextControl {INPUT} at (2,34) size 237x28 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 231x28 +- RenderBlock {DIV} at (0,3) size 212x22 +- RenderBlock {DIV} at (1,243) size 297x66 +- RenderTextControl {INPUT} at (2,2) size 257x29 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (260,10) size 1x18 +- RenderTextControl {INPUT} at (2,35) size 257x29 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 251x29 +- RenderBlock {DIV} at (0,3) size 232x23 +- RenderBlock {DIV} at (1,309) size 297x68 +- RenderTextControl {INPUT} at (2,2) size 269x30 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (272,11) size 1x18 +- RenderTextControl {INPUT} at (2,36) size 269x30 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 263x30 +- RenderBlock {DIV} at (0,3) size 244x24 +- RenderBlock {DIV} at (1,377) size 297x72 +- RenderTextControl {INPUT} at (2,2) size 281x32 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (284,12) size 1x18 +- RenderTextControl {INPUT} at (2,38) size 281x32 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 275x32 +- RenderBlock {DIV} at (0,3) size 256x26 +- RenderBlock {DIV} at (1,449) size 297x74 +- RenderTextControl {INPUT} at (2,2) size 293x33 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (296,13) size 1x18 +- RenderTextControl {INPUT} at (2,39) size 293x33 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 287x33 +- RenderBlock {DIV} at (0,3) size 268x27 +-layer at (14,129) size 106x10 +- RenderBlock {DIV} at (3,3) size 106x10 +-layer at (14,145) size 93x10 +- RenderBlock {DIV} at (0,0) size 93x10 +-layer at (14,161) size 118x11 +- RenderBlock {DIV} at (3,3) size 118x11 +-layer at (14,178) size 105x11 +- RenderBlock {DIV} at (0,0) size 105x11 +-layer at (14,195) size 129x12 +- RenderBlock {DIV} at (3,3) size 130x12 +-layer at (14,213) size 116x12 +- RenderBlock {DIV} at (0,0) size 117x12 +-layer at (16,233) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (16,256) size 128x13 +- RenderBlock {DIV} at (0,0) size 128x13 +-layer at (16,279) size 152x15 +- RenderBlock {DIV} at (3,3) size 153x15 +-layer at (16,304) size 139x15 +- RenderBlock {DIV} at (0,0) size 140x15 +-layer at (16,329) size 163x16 +- RenderBlock {DIV} at (3,3) size 164x16 +-layer at (16,355) size 148x16 +- RenderBlock {DIV} at (0,0) size 149x16 +-layer at (16,381) size 174x17 +- RenderBlock {DIV} at (3,3) size 175x17 +-layer at (16,408) size 159x17 +- RenderBlock {DIV} at (0,0) size 160x17 +-layer at (16,435) size 185x18 +- RenderBlock {DIV} at (3,3) size 186x18 +-layer at (16,463) size 170x18 +- RenderBlock {DIV} at (0,0) size 171x18 +-layer at (215,50) size 196x18 +- RenderBlock {DIV} at (3,3) size 197x18 +-layer at (215,78) size 181x18 +- RenderBlock {DIV} at (0,0) size 182x18 +-layer at (215,106) size 207x20 +- RenderBlock {DIV} at (3,3) size 208x20 +-layer at (215,136) size 192x20 +- RenderBlock {DIV} at (0,0) size 193x20 +-layer at (215,166) size 219x21 +- RenderBlock {DIV} at (3,3) size 220x21 +-layer at (215,197) size 200x21 +- RenderBlock {DIV} at (0,0) size 201x21 +-layer at (215,228) size 231x22 +- RenderBlock {DIV} at (3,3) size 231x22 +-layer at (215,260) size 212x22 +- RenderBlock {DIV} at (0,0) size 212x22 +-layer at (215,292) size 251x23 +- RenderBlock {DIV} at (3,3) size 251x23 +-layer at (215,325) size 232x23 +- RenderBlock {DIV} at (0,0) size 232x23 +-layer at (215,358) size 263x24 +- RenderBlock {DIV} at (3,3) size 263x24 +-layer at (215,392) size 244x24 +- RenderBlock {DIV} at (0,0) size 244x24 +-layer at (215,426) size 275x26 +- RenderBlock {DIV} at (3,3) size 275x26 +-layer at (215,462) size 256x26 +- RenderBlock {DIV} at (0,0) size 256x26 +-layer at (215,498) size 287x27 +- RenderBlock {DIV} at (3,3) size 287x27 +-layer at (215,535) size 268x27 +- RenderBlock {DIV} at (0,0) size 268x27 +-layer at (107,143) size 13x15 +- RenderBlock (relative positioned) {DIV} at (92,0) size 14x15 +-layer at (119,176) size 13x15 +- RenderBlock (relative positioned) {DIV} at (104,0) size 14x15 +-layer at (130,212) size 13x15 +- RenderBlock (relative positioned) {DIV} at (116,0) size 14x15 +-layer at (144,254) size 13x17 +- RenderBlock (relative positioned) {DIV} at (127,0) size 14x17 +-layer at (155,303) size 13x18 +- RenderBlock (relative positioned) {DIV} at (139,0) size 14x18 +-layer at (164,353) size 15x20 +- RenderBlock (relative positioned) {DIV} at (148,0) size 16x20 +-layer at (175,406) size 15x21 +- RenderBlock (relative positioned) {DIV} at (159,0) size 16x21 +-layer at (186,461) size 15x23 +- RenderBlock (relative positioned) {DIV} at (170,0) size 16x23 +-layer at (397,75) size 15x24 +- RenderBlock (relative positioned) {DIV} at (181,0) size 16x24 +-layer at (408,133) size 15x26 +- RenderBlock (relative positioned) {DIV} at (192,0) size 16x26 +-layer at (415,194) size 19x27 +- RenderBlock (relative positioned) {DIV} at (200,0) size 20x27 +-layer at (427,257) size 19x28 +- RenderBlock (relative positioned) {DIV} at (211,-1) size 20x30 +-layer at (447,322) size 19x30 +- RenderBlock (relative positioned) {DIV} at (231,-1) size 20x31 +-layer at (459,388) size 19x32 +- RenderBlock (relative positioned) {DIV} at (243,-1) size 20x32 +-layer at (471,459) size 19x33 +- RenderBlock (relative positioned) {DIV} at (255,-1) size 20x34 +-layer at (483,531) size 19x35 +- RenderBlock (relative positioned) {DIV} at (267,-1) size 20x35 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-spinbutton-up-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-spinbutton-up-expected.txt +deleted file mode 100644 +index 26f2ca33711d9aea4b8a2e6bcb0af3d18d54544a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-appearance-spinbutton-up-expected.txt ++++ /dev/null +@@ -1,22 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 439x18 +- text run at (0,0) width 439: "Test appearances of outer-spin-button with its up button highlighted." +- RenderBlock {DIV} at (0,34) size 784x0 +- RenderBlock (anonymous) at (0,34) size 784x31 +- RenderTextControl {INPUT} at (2,2) size 226x27 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 220x27 +- RenderBlock {DIV} at (0,3) size 201x21 +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +-layer at (13,47) size 200x21 +- RenderBlock {DIV} at (0,0) size 201x21 +- RenderText {#text} at (0,0) size 8x21 +- text run at (0,0) width 8: "1" +-layer at (213,44) size 19x27 +- RenderBlock (relative positioned) {DIV} at (200,0) size 20x27 +-caret: position 1 of child 0 {#text} of child 0 {DIV} of child 0 {DIV} of child 0 {DIV} of {#document-fragment} of child 5 {INPUT} of body +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-button-sizes-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-button-sizes-expected.txt +deleted file mode 100644 +index 482f95eb0fe315eb4a955f1a9eb088a616c5f9d9..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-button-sizes-expected.txt ++++ /dev/null +@@ -1,106 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderButton {INPUT} at (0,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (66,1) size 5x18 +- text run at (66,1) width 5: " " +- RenderButton {INPUT} at (70,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (137,1) size 4x18 +- text run at (137,1) width 4: " " +- RenderButton {INPUT} at (141,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (207,1) size 5x18 +- text run at (207,1) width 5: " " +- RenderButton {INPUT} at (211,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (278,1) size 4x18 +- text run at (278,1) width 4: " " +- RenderButton {INPUT} at (282,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (348,1) size 5x18 +- text run at (348,1) width 5: " " +- RenderButton {INPUT} at (352,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (419,1) size 4x18 +- text run at (419,1) width 4: " " +- RenderButton {INPUT} at (425,2) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (503,1) size 5x18 +- text run at (503,1) width 5: " " +- RenderButton {INPUT} at (509,2) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (587,1) size 5x18 +- text run at (587,1) width 5: " " +- RenderButton {INPUT} at (593,2) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (671,1) size 5x18 +- text run at (671,1) width 5: " " +- RenderButton {INPUT} at (677,2) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (755,1) size 5x18 +- text run at (755,1) width 5: " " +- RenderButton {INPUT} at (2,26) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (80,25) size 5x18 +- text run at (80,25) width 5: " " +- RenderButton {INPUT} at (86,24) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (173,25) size 5x18 +- text run at (173,25) width 5: " " +- RenderButton {INPUT} at (179,24) size 87x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (267,25) size 5x18 +- text run at (267,25) width 5: " " +- RenderButton {INPUT} at (273,24) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (360,25) size 5x18 +- text run at (360,25) width 5: " " +- RenderButton {INPUT} at (366,24) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (454,25) size 4x18 +- text run at (454,25) width 4: " " +- RenderButton {INPUT} at (460,24) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (547,25) size 5x18 +- text run at (547,25) width 5: " " +- RenderButton {INPUT} at (553,24) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-disabled-color-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-disabled-color-expected.txt +deleted file mode 100644 +index d4e5ebbbf4d98464726a706eaf8b330f2aa90a79..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-disabled-color-expected.txt ++++ /dev/null +@@ -1,190 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 521x18 +- text run at (0,0) width 521: "This tests that the text color changes appropriately when the text field is disabled." +- RenderBR {BR} at (520,0) size 1x18 +- RenderTextControl {INPUT} at (2,20) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (149,20) size 5x18 +- text run at (149,20) width 5: " " +- RenderTextControl {INPUT} at (155,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (304,20) size 1x18 +- RenderTextControl {INPUT} at (2,43) size 146x19 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #FF0000)] +- RenderText {#text} at (149,43) size 5x18 +- text run at (149,43) width 5: " " +- RenderTextControl {INPUT} at (155,43) size 148x19 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #FF0000)] +- RenderBR {BR} at (304,43) size 1x18 +- RenderTextControl {INPUT} at (2,66) size 146x19 [bgcolor=#0000FF] [border: (2px inset #000000)] +- RenderText {#text} at (149,66) size 5x18 +- text run at (149,66) width 5: " " +- RenderTextControl {INPUT} at (155,66) size 148x19 [bgcolor=#0000FF] [border: (2px inset #000000)] +- RenderBR {BR} at (304,66) size 1x18 +- RenderTextControl {INPUT} at (2,89) size 146x19 [color=#FF0000] [bgcolor=#0000FF] [border: (2px inset #FF0000)] +- RenderText {#text} at (149,89) size 5x18 +- text run at (149,89) width 5: " " +- RenderTextControl {INPUT} at (155,89) size 148x19 [color=#FF0000] [bgcolor=#0000FF] [border: (2px inset #FF0000)] +- RenderBR {BR} at (304,89) size 1x18 +- RenderTextControl {INPUT} at (2,112) size 146x19 [bgcolor=#000000] [border: (2px inset #000000)] +- RenderText {#text} at (149,112) size 5x18 +- text run at (149,112) width 5: " " +- RenderTextControl {INPUT} at (155,112) size 148x19 [bgcolor=#000000] [border: (2px inset #000000)] +- RenderBR {BR} at (304,112) size 1x18 +- RenderTextControl {INPUT} at (2,135) size 146x19 [color=#FFFFFF] [bgcolor=#000000] [border: (2px inset #FFFFFF)] +- RenderText {#text} at (149,135) size 5x18 +- text run at (149,135) width 5: " " +- RenderTextControl {INPUT} at (155,135) size 148x19 [color=#FFFFFF] [bgcolor=#000000] [border: (2px inset #FFFFFF)] +- RenderBR {BR} at (304,135) size 1x18 +- RenderTextControl {INPUT} at (2,158) size 146x19 [bgcolor=#808080] [border: (2px inset #000000)] +- RenderText {#text} at (149,158) size 5x18 +- text run at (149,158) width 5: " " +- RenderTextControl {INPUT} at (155,158) size 148x19 [bgcolor=#808080] [border: (2px inset #000000)] +- RenderBR {BR} at (304,158) size 1x18 +- RenderTextControl {INPUT} at (2,181) size 146x19 [color=#FFFFFF] [bgcolor=#A9A9A9] [border: (2px inset #FFFFFF)] +- RenderText {#text} at (149,181) size 5x18 +- text run at (149,181) width 5: " " +- RenderTextControl {INPUT} at (155,181) size 148x19 [color=#FFFFFF] [bgcolor=#A9A9A9] [border: (2px inset #FFFFFF)] +- RenderBR {BR} at (304,181) size 1x18 +- RenderTextControl {INPUT} at (2,204) size 146x19 [color=#808080] [bgcolor=#000000] [border: (2px inset #808080)] +- RenderText {#text} at (149,204) size 5x18 +- text run at (149,204) width 5: " " +- RenderTextControl {INPUT} at (155,204) size 148x19 [color=#808080] [bgcolor=#000000] [border: (2px inset #808080)] +- RenderBR {BR} at (304,204) size 1x18 +- RenderTextControl {INPUT} at (2,227) size 146x19 [color=#FF0000] [bgcolor=#808080] [border: (2px inset #FF0000)] +- RenderText {#text} at (149,227) size 5x18 +- text run at (149,227) width 5: " " +- RenderTextControl {INPUT} at (155,227) size 148x19 [color=#FF0000] [bgcolor=#808080] [border: (2px inset #FF0000)] +- RenderBR {BR} at (304,227) size 1x18 +- RenderTextControl {INPUT} at (2,250) size 146x19 [color=#808080] [bgcolor=#FF0000] [border: (2px inset #808080)] +- RenderText {#text} at (149,250) size 5x18 +- text run at (149,250) width 5: " " +- RenderTextControl {INPUT} at (155,250) size 148x19 [color=#808080] [bgcolor=#FF0000] [border: (2px inset #808080)] +- RenderBR {BR} at (304,250) size 1x18 +- RenderTextControl {INPUT} at (2,273) size 146x19 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #FF0000)] +- RenderText {#text} at (149,273) size 5x18 +- text run at (149,273) width 5: " " +- RenderTextControl {INPUT} at (155,273) size 148x19 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #FF0000)] +- RenderBR {BR} at (304,273) size 1x18 +- RenderTextControl {INPUT} at (2,296) size 146x19 [color=#FF0000] [border: (2px inset #FF0000)] +- RenderText {#text} at (149,296) size 5x18 +- text run at (149,296) width 5: " " +- RenderTextControl {INPUT} at (155,296) size 148x19 [color=#FF0000] [border: (2px inset #FF0000)] +- RenderBR {BR} at (304,296) size 1x18 +- RenderTextControl {INPUT} at (2,319) size 146x19 [color=#ACACAC] [bgcolor=#F2F2F2] [border: (2px inset #ACACAC)] +- RenderText {#text} at (149,319) size 5x18 +- text run at (149,319) width 5: " " +- RenderTextControl {INPUT} at (155,319) size 148x19 [color=#ACACAC] [bgcolor=#F2F2F2] [border: (2px inset #ACACAC)] +- RenderBR {BR} at (304,319) size 1x18 +-layer at (13,31) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#545454] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,31) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,54) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,54) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,77) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,77) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,100) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,100) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,123) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#545454] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,123) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,146) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#ABABAB] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,146) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,169) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#545454] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,169) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,192) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,192) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,215) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#2C2C2C] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,215) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,238) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,238) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,261) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#2C2C2C] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,261) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,284) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,284) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,307) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,307) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,330) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,330) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-placeholder-visibility-1-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-placeholder-visibility-1-expected.txt +deleted file mode 100644 +index 98d2d89c92946e3600f153d073e19fa2f379f36b..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-placeholder-visibility-1-expected.txt ++++ /dev/null +@@ -1,19 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 347x18 +- text run at (0,0) width 347: "Focus the field, focus away, then focus the field again." +- RenderBlock {DIV} at (0,34) size 784x23 +- RenderTextControl {INPUT} at (2,2) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +-layer at (13,47) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 63x13 +- text run at (0,0) width 63: "Placeholder" +-layer at (13,47) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-caret: position 0 of child 1 {DIV} of {#document-fragment} of child 1 {INPUT} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-placeholder-visibility-3-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-placeholder-visibility-3-expected.txt +deleted file mode 100644 +index 2063b09912369e179afbfd0b9c4d04ee7072bb19..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-placeholder-visibility-3-expected.txt ++++ /dev/null +@@ -1,20 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 390x18 +- text run at (0,0) width 390: "Focus field with a placeholder, then type, then delete all text." +- RenderBlock {DIV} at (0,34) size 784x23 +- RenderTextControl {INPUT} at (2,2) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +-layer at (13,47) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 63x13 +- text run at (0,0) width 63: "Placeholder" +-layer at (13,47) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderBR {BR} at (0,0) size 0x13 +-caret: position 0 of child 0 {BR} of child 1 {DIV} of {#document-fragment} of child 1 {INPUT} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-readonly-dimmed-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-readonly-dimmed-expected.txt +deleted file mode 100644 +index 66ecf7c1b280d608c4ea043b9ee50f9b0696ce50..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-readonly-dimmed-expected.txt ++++ /dev/null +@@ -1,14 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 461x18 +- text run at (0,0) width 461: "This tests that the border of a readonly text field should appear dimmed." +- RenderBR {BR} at (460,0) size 1x18 +- RenderTextControl {INPUT} at (2,20) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +-layer at (13,31) size 140x13 scrollWidth 160 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 161x13 +- text run at (0,0) width 161: "This border should be dimmed" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-table-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-table-expected.txt +deleted file mode 100644 +index e32b1dbc1607281f57acc2a6adae063db9e1617d..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-table-expected.txt ++++ /dev/null +@@ -1,98 +0,0 @@ +-layer at (0,0) size 785x705 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x705 +- RenderBlock {HTML} at (0,0) size 785x705 +- RenderBody {BODY} at (8,8) size 769x689 +- RenderBlock (anonymous) at (0,0) size 769x18 +- RenderText {#text} at (0,0) size 252x18 +- text run at (0,0) width 252: "This tests minMaxWidth for text fields." +- RenderBlock {P} at (0,34) size 769x18 +- RenderText {#text} at (0,0) size 70x18 +- text run at (0,0) width 70: "Test case 1" +- RenderTable {TABLE} at (0,68) size 118x41 [border: (3px solid #0000FF)] +- RenderTableSection {TBODY} at (3,3) size 112x35 +- RenderTableRow {TR} at (0,2) size 112x31 +- RenderTableCell {TD} at (2,2) size 108x31 [border: (3px solid #FF0000)] [r=0 c=0 rs=1 cs=1] +- RenderTextControl {INPUT} at (4,6) size 100x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBlock {P} at (0,125) size 769x18 +- RenderText {#text} at (0,0) size 70x18 +- text run at (0,0) width 70: "Test case 2" +- RenderTable {TABLE} at (0,159) size 167x74 [border: (3px solid #0000FF)] +- RenderTableSection {TBODY} at (3,3) size 161x68 +- RenderTableRow {TR} at (0,2) size 161x31 +- RenderTableCell {TD} at (2,7) size 47x21 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,0) size 25x20 +- text run at (1,1) width 25: "first" +- RenderTableCell {TD} at (50,2) size 109x31 [border: (3px solid #FF0000)] [r=0 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (4,6) size 100x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderTableRow {TR} at (0,35) size 161x31 +- RenderTableCell {TD} at (2,40) size 47x21 [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (1,0) size 45x20 +- text run at (1,1) width 45: "second" +- RenderTableCell {TD} at (50,35) size 109x31 [border: (3px solid #FF0000)] [r=1 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (4,6) size 100x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBlock {P} at (0,249) size 769x18 +- RenderText {#text} at (0,0) size 70x18 +- text run at (0,0) width 70: "Test case 3" +- RenderTable {TABLE} at (0,283) size 55x77 [border: (3px solid #0000FF)] +- RenderTableSection {TBODY} at (3,3) size 49x71 +- RenderTableRow {TR} at (0,2) size 49x67 +- RenderTableCell {TD} at (2,2) size 45x67 [border: (3px solid #FF0000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (4,4) size 37x36 +- text run at (4,4) width 37: "width" +- text run at (4,22) width 32: "30px" +- RenderTextControl {INPUT} at (4,42) size 30x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBlock {P} at (0,376) size 769x18 +- RenderText {#text} at (0,0) size 70x18 +- text run at (0,0) width 70: "Test case 4" +- RenderTable {TABLE} at (0,410) size 218x69 [border: (3px solid #0000FF)] +- RenderTableSection {TBODY} at (3,3) size 212x63 +- RenderTableRow {TR} at (0,2) size 212x31 +- RenderTableCell {TD} at (2,2) size 208x31 [border: (3px solid #FF0000)] [r=0 c=0 rs=1 cs=1] +- RenderTextControl {INPUT} at (4,6) size 200x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderTableRow {TR} at (0,35) size 212x26 +- RenderTableCell {TD} at (2,35) size 208x26 [border: (3px solid #FF0000)] [r=1 c=0 rs=1 cs=1] +- RenderBlock {DIV} at (4,4) size 200x18 +- RenderText {#text} at (0,0) size 40x18 +- text run at (0,0) width 40: "200px" +- RenderBlock {P} at (0,495) size 769x18 +- RenderText {#text} at (0,0) size 70x18 +- text run at (0,0) width 70: "Test case 5" +- RenderTable {TABLE} at (0,529) size 92x41 [border: (3px solid #0000FF)] +- RenderTableSection {TBODY} at (3,3) size 86x35 +- RenderTableRow {TR} at (0,2) size 86x31 +- RenderTableCell {TD} at (2,2) size 82x31 [border: (3px solid #FF0000)] [r=0 c=0 rs=1 cs=1] +- RenderTextControl {INPUT} at (6,6) size 70x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBlock {P} at (0,586) size 769x18 +- RenderText {#text} at (0,0) size 70x18 +- text run at (0,0) width 70: "Test case 6" +- RenderTable {TABLE} at (0,620) size 169x69 [border: (3px solid #0000FF)] +- RenderTableSection {TBODY} at (3,3) size 163x63 +- RenderTableRow {TR} at (0,2) size 163x31 +- RenderTableCell {TD} at (2,2) size 159x31 [border: (3px solid #FF0000)] [r=0 c=0 rs=1 cs=1] +- RenderTextControl {INPUT} at (6,6) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderTableRow {TR} at (0,35) size 163x26 +- RenderTableCell {TD} at (2,35) size 159x26 [border: (3px solid #FF0000)] [r=1 c=0 rs=1 cs=1] +- RenderBlock {DIV} at (4,4) size 70x18 +- RenderText {#text} at (0,0) size 32x18 +- text run at (0,0) width 32: "70px" +-layer at (20,90) size 94x13 +- RenderBlock {DIV} at (3,3) size 94x13 +-layer at (68,181) size 94x13 +- RenderBlock {DIV} at (3,3) size 94x13 +-layer at (68,214) size 94x13 +- RenderBlock {DIV} at (3,3) size 94x13 +-layer at (20,341) size 24x13 +- RenderBlock {DIV} at (3,3) size 24x13 +-layer at (20,432) size 194x13 +- RenderBlock {DIV} at (3,3) size 194x13 +- RenderText {#text} at (0,0) size 61x13 +- text run at (0,0) width 61: "width 100%" +-layer at (22,551) size 64x13 +- RenderBlock {DIV} at (3,3) size 64x13 +- RenderText {#text} at (0,0) size 51x13 +- text run at (0,0) width 51: "max 70px" +-layer at (22,642) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 88x13 +- text run at (0,0) width 88: "min-width 100px" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-text-word-wrap-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-text-word-wrap-expected.txt +deleted file mode 100644 +index 4d077ac7b01c9ff9e2ecbf0cc9093ea2f3332df2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-text-word-wrap-expected.txt ++++ /dev/null +@@ -1,20 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 117x18 +- text run at (0,0) width 117: "This tests that the " +- RenderInline {CODE} at (0,0) size 71x15 +- RenderText {#text} at (116,2) size 71x15 +- text run at (116,2) width 71: "word-wrap" +- RenderText {#text} at (186,0) size 309x18 +- text run at (186,0) width 309: " property is ignored for single-line text controls." +- RenderBlock (anonymous) at (0,34) size 784x33 +- RenderTextControl {INPUT} at (2,0) size 147x33 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +-layer at (13,52) size 141x13 scrollWidth 256 +- RenderBlock {DIV} at (3,10) size 141x13 +- RenderText {#text} at (0,0) size 255x13 +- text run at (0,0) width 255: "This sentence should not wrap into the next line." +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/input-value-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/input-value-expected.txt +deleted file mode 100644 +index 74e137058ac4377312e79b3cab6f0e5ca8929048..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/input-value-expected.txt ++++ /dev/null +@@ -1,224 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 765x36 +- text run at (0,0) width 765: "Results that match WinIE are two columns on the right that say \"after\" every time, except for the last row which should" +- text run at (0,18) width 196: "have nothing in either column." +- RenderBlock {P} at (0,52) size 784x18 +- RenderText {#text} at (0,0) size 725x18 +- text run at (0,0) width 725: "Results that match Gecko are like WinIE, but with \"before\" for the attribute in the first two rows and the last row." +- RenderBlock {HR} at (0,86) size 784x2 [border: (1px inset #000000)] +- RenderBlock {FORM} at (0,96) size 784x365 +- RenderTable {TABLE} at (0,0) size 770x365 +- RenderTableSection {THEAD} at (0,0) size 770x24 +- RenderTableRow {TR} at (0,2) size 770x20 +- RenderTableCell {TH} at (2,2) size 392x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 57x18 +- text run at (1,1) width 57: "test case" +- RenderTableCell {TH} at (395,2) size 245x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 92x18 +- text run at (1,1) width 92: "form element" +- RenderTableCell {TH} at (641,2) size 63x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 61x18 +- text run at (1,1) width 61: "property" +- RenderTableCell {TH} at (705,2) size 63x20 [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 61x18 +- text run at (1,1) width 61: "attribute" +- RenderTableSection {TBODY} at (0,24) size 770x341 +- RenderTableRow {TR} at (0,0) size 770x25 +- RenderTableCell {TD} at (2,2) size 392x21 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,0) size 211x20 +- text run at (1,1) width 211: "text with value property changed" +- RenderTableCell {TD} at (395,0) size 245x25 [r=0 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (3,3) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderTableCell {TD} at (641,2) size 63x21 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,0) size 30x20 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,2) size 63x21 [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (1,0) size 41x20 +- text run at (1,1) width 41: "before" +- RenderTableRow {TR} at (0,27) size 770x25 +- RenderTableCell {TD} at (2,29) size 392x21 [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (1,0) size 248x20 +- text run at (1,1) width 248: "password with value property changed" +- RenderTableCell {TD} at (395,27) size 245x25 [r=1 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (3,3) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderTableCell {TD} at (641,29) size 63x21 [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (1,0) size 30x20 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,29) size 63x21 [r=1 c=3 rs=1 cs=1] +- RenderText {#text} at (1,0) size 41x20 +- text run at (1,1) width 41: "before" +- RenderTableRow {TR} at (0,54) size 770x20 +- RenderTableCell {TD} at (2,54) size 392x20 [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 252x18 +- text run at (1,1) width 252: "check box with value property changed" +- RenderTableCell {TD} at (395,54) size 245x20 [r=2 c=1 rs=1 cs=1] +- RenderBlock {INPUT} at (3,4) size 12x12 +- RenderTableCell {TD} at (641,54) size 63x20 [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,54) size 63x20 [r=2 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,76) size 770x20 +- RenderTableCell {TD} at (2,76) size 392x20 [r=3 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 231x18 +- text run at (1,1) width 231: "hidden with value property changed" +- RenderTableCell {TD} at (395,85) size 245x2 [r=3 c=1 rs=1 cs=1] +- RenderTableCell {TD} at (641,76) size 63x20 [r=3 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,76) size 63x20 [r=3 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,98) size 770x24 +- RenderTableCell {TD} at (2,100) size 392x20 [r=4 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 228x18 +- text run at (1,1) width 228: "button with value property changed" +- RenderTableCell {TD} at (395,98) size 245x24 [r=4 c=1 rs=1 cs=1] +- RenderButton {INPUT} at (3,3) size 41x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 25x13 +- RenderText at (0,0) size 25x13 +- text run at (0,0) width 25: "after" +- RenderTableCell {TD} at (641,100) size 63x20 [r=4 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,100) size 63x20 [r=4 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,124) size 770x20 +- RenderTableCell {TD} at (2,124) size 392x20 [r=5 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 226x18 +- text run at (1,1) width 226: "image with value property changed" +- RenderTableCell {TD} at (395,124) size 245x20 [r=5 c=1 rs=1 cs=1] +- RenderImage {INPUT} at (1,1) size 38x17 +- RenderTableCell {TD} at (641,124) size 63x20 [r=5 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,124) size 63x20 [r=5 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,146) size 770x20 +- RenderTableCell {TD} at (2,146) size 392x20 [r=6 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 220x18 +- text run at (1,1) width 220: "radio with value property changed" +- RenderTableCell {TD} at (395,146) size 245x20 [r=6 c=1 rs=1 cs=1] +- RenderBlock {INPUT} at (3,4) size 12x12 +- RenderTableCell {TD} at (641,146) size 63x20 [r=6 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,146) size 63x20 [r=6 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,168) size 770x25 +- RenderTableCell {TD} at (2,170) size 392x21 [r=7 c=0 rs=1 cs=1] +- RenderText {#text} at (1,0) size 210x20 +- text run at (1,1) width 210: "text with value attribute changed" +- RenderTableCell {TD} at (395,168) size 245x25 [r=7 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (3,3) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderTableCell {TD} at (641,170) size 63x21 [r=7 c=2 rs=1 cs=1] +- RenderText {#text} at (1,0) size 30x20 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,170) size 63x21 [r=7 c=3 rs=1 cs=1] +- RenderText {#text} at (1,0) size 30x20 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,195) size 770x20 +- RenderTableCell {TD} at (2,195) size 392x20 [r=8 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 252x18 +- text run at (1,1) width 252: "check box with value attribute changed" +- RenderTableCell {TD} at (395,195) size 245x20 [r=8 c=1 rs=1 cs=1] +- RenderBlock {INPUT} at (3,4) size 12x12 +- RenderTableCell {TD} at (641,195) size 63x20 [r=8 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,195) size 63x20 [r=8 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,217) size 770x20 +- RenderTableCell {TD} at (2,217) size 392x20 [r=9 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 390x18 +- text run at (1,1) width 390: "text with value property changed, then turned into check box" +- RenderTableCell {TD} at (395,217) size 245x20 [r=9 c=1 rs=1 cs=1] +- RenderBlock {INPUT} at (3,4) size 12x12 +- RenderTableCell {TD} at (641,217) size 63x20 [r=9 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,217) size 63x20 [r=9 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,239) size 770x25 +- RenderTableCell {TD} at (2,241) size 392x21 [r=10 c=0 rs=1 cs=1] +- RenderText {#text} at (1,0) size 390x20 +- text run at (1,1) width 390: "check box with value property changed, then turned into text" +- RenderTableCell {TD} at (395,239) size 245x25 [r=10 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (3,3) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderTableCell {TD} at (641,241) size 63x21 [r=10 c=2 rs=1 cs=1] +- RenderText {#text} at (1,0) size 30x20 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,241) size 63x21 [r=10 c=3 rs=1 cs=1] +- RenderText {#text} at (1,0) size 30x20 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,266) size 770x20 +- RenderTableCell {TD} at (2,266) size 392x20 [r=11 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 389x18 +- text run at (1,1) width 389: "text with value attribute changed, then turned into check box" +- RenderTableCell {TD} at (395,266) size 245x20 [r=11 c=1 rs=1 cs=1] +- RenderBlock {INPUT} at (3,4) size 12x12 +- RenderTableCell {TD} at (641,266) size 63x20 [r=11 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,266) size 63x20 [r=11 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 30x18 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,288) size 770x25 +- RenderTableCell {TD} at (2,290) size 392x21 [r=12 c=0 rs=1 cs=1] +- RenderText {#text} at (1,0) size 389x20 +- text run at (1,1) width 389: "check box with value attribute changed, then turned into text" +- RenderTableCell {TD} at (395,288) size 245x25 [r=12 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (3,3) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderTableCell {TD} at (641,290) size 63x21 [r=12 c=2 rs=1 cs=1] +- RenderText {#text} at (1,0) size 30x20 +- text run at (1,1) width 30: "after" +- RenderTableCell {TD} at (705,290) size 63x21 [r=12 c=3 rs=1 cs=1] +- RenderText {#text} at (1,0) size 30x20 +- text run at (1,1) width 30: "after" +- RenderTableRow {TR} at (0,315) size 770x24 +- RenderTableCell {TD} at (2,317) size 392x20 [r=13 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 208x18 +- text run at (1,1) width 208: "file with value property changed" +- RenderTableCell {TD} at (395,315) size 245x24 [r=13 c=1 rs=1 cs=1] +- RenderFileUploadControl {INPUT} at (3,3) size 238x18 "no file selected" +- RenderButton {INPUT} at (0,0) size 78x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 62x13 +- RenderText at (0,0) size 62x13 +- text run at (0,0) width 62: "Choose File" +- RenderTableCell {TD} at (641,326) size 63x2 [r=13 c=2 rs=1 cs=1] +- RenderTableCell {TD} at (705,317) size 63x20 [r=13 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 41x18 +- text run at (1,1) width 41: "before" +-layer at (409,134) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 34x13 +- text run at (0,0) width 34: "before" +-layer at (409,161) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 31x13 +- text run at (0,0) width 31: "\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}" +-layer at (409,302) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 25x13 +- text run at (0,0) width 25: "after" +-layer at (409,373) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 25x13 +- text run at (0,0) width 25: "after" +-layer at (409,422) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 25x13 +- text run at (0,0) width 25: "after" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/listbox-bidi-align-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/listbox-bidi-align-expected.txt +deleted file mode 100644 +index a8ecac1461a2efde62ba523174b6493f5bf7eba7..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/listbox-bidi-align-expected.txt ++++ /dev/null +@@ -1,74 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x504 +- RenderBlock {HTML} at (0,0) size 800x504 +- RenderBody {BODY} at (8,8) size 784x488 +- RenderBlock (anonymous) at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 614x18 +- text run at (0,0) width 614: "This test verifies the visual alignment of items in a select element while changing text direction." +- RenderBR {BR} at (613,0) size 1x18 +- RenderText {#text} at (0,18) size 438x18 +- text run at (0,18) width 438: "All the items in the following select elements should be left-aligned." +- RenderTable {TABLE} at (0,36) size 658x132 +- RenderTableSection {TBODY} at (0,0) size 658x132 +- RenderTableRow {TR} at (0,2) size 658x63 +- RenderTableCell {TD} at (2,2) size 157x63 [r=0 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 151x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (161,2) size 167x63 [r=0 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 161x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (330,2) size 157x63 [r=0 c=2 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 151x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (489,2) size 167x63 [r=0 c=3 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 161x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableRow {TR} at (0,67) size 658x63 +- RenderTableCell {TD} at (2,67) size 157x63 [r=1 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 151x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (161,67) size 167x63 [r=1 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 161x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderBlock (anonymous) at (0,168) size 784x18 +- RenderText {#text} at (0,0) size 447x18 +- text run at (0,0) width 447: "All the items in the following select elements should be right-aligned." +- RenderTable {TABLE} at (0,186) size 652x132 +- RenderTableSection {TBODY} at (0,0) size 652x132 +- RenderTableRow {TR} at (0,2) size 652x63 +- RenderTableCell {TD} at (2,2) size 165x63 [r=0 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 159x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (169,2) size 156x63 [r=0 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 150x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (327,2) size 165x63 [r=0 c=2 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 159x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (494,2) size 156x63 [r=0 c=3 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 150x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableRow {TR} at (0,67) size 652x63 +- RenderTableCell {TD} at (2,67) size 165x63 [r=1 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 159x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (169,67) size 156x63 [r=1 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 150x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderBlock (anonymous) at (0,318) size 784x18 +- RenderText {#text} at (0,0) size 456x18 +- text run at (0,0) width 456: "All the items in the following select elements should be center-aligned." +- RenderTable {TABLE} at (0,336) size 690x67 +- RenderTableSection {TBODY} at (0,0) size 690x67 +- RenderTableRow {TR} at (0,2) size 690x63 +- RenderTableCell {TD} at (2,2) size 174x63 [r=0 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 168x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (178,2) size 166x63 [r=0 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 160x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (346,2) size 174x63 [r=0 c=2 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 168x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (522,2) size 166x63 [r=0 c=3 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 160x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderBlock (anonymous) at (0,403) size 784x18 +- RenderText {#text} at (0,0) size 296x18 +- text run at (0,0) width 296: "The following tables check mixed alignments." +- RenderTable {TABLE} at (0,421) size 732x67 +- RenderTableSection {TBODY} at (0,0) size 732x67 +- RenderTableRow {TR} at (0,2) size 732x63 +- RenderTableCell {TD} at (2,2) size 169x63 [r=0 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 163x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (173,2) size 169x63 [r=0 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 163x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (344,2) size 192x63 [r=0 c=2 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 186x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (538,2) size 192x63 [r=0 c=3 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 186x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/listbox-width-change-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/listbox-width-change-expected.txt +deleted file mode 100644 +index c762ed433c8cd8d70f8e7ff0301badd869ad3ac9..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/listbox-width-change-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 661x18 +- text run at (0,0) width 661: "This tests that when a list box's options get updated, the list box will recalculate its width, and relayout." +- RenderBR {BR} at (660,0) size 1x18 +- RenderListBox {SELECT} at (2,20) size 189x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.txt +deleted file mode 100644 +index c2adde1d4ac8a40af04818fe5e89927ddc607f0a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/number/number-appearance-spinbutton-disabled-readonly-expected.txt ++++ /dev/null +@@ -1,48 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 762x36 +- text run at (0,0) width 762: "Test appearances of spin buttons. Disabled state and read-only state should have appearances different from the normal" +- text run at (0,18) width 34: "state." +- RenderBlock {DIV} at (0,52) size 784x33 +- RenderInline {LABEL} at (0,0) size 348x18 +- RenderTextControl {INPUT} at (2,2) size 257x29 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 251x29 +- RenderBlock {DIV} at (0,3) size 232x23 +- RenderText {#text} at (260,10) size 88x18 +- text run at (260,10) width 88: " Normal state" +- RenderBlock {DIV} at (0,85) size 784x33 +- RenderInline {LABEL} at (0,0) size 355x18 +- RenderTextControl {INPUT} at (2,2) size 256x29 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 250x29 +- RenderBlock {DIV} at (0,3) size 231x23 +- RenderText {#text} at (259,10) size 96x18 +- text run at (259,10) width 96: " Disabled state" +- RenderBlock {DIV} at (0,118) size 784x33 +- RenderInline {LABEL} at (0,0) size 364x18 +- RenderTextControl {INPUT} at (2,2) size 256x29 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 250x29 +- RenderBlock {DIV} at (0,3) size 231x23 +- RenderText {#text} at (259,10) size 105x18 +- text run at (259,10) width 105: " Read-only state" +-layer at (13,65) size 232x23 +- RenderBlock {DIV} at (0,0) size 232x23 +- RenderText {#text} at (0,0) size 13x23 +- text run at (0,0) width 13: "0" +-layer at (13,98) size 231x23 +- RenderBlock {DIV} at (0,0) size 231x23 [color=#545454] +- RenderText {#text} at (0,0) size 13x23 +- text run at (0,0) width 13: "0" +-layer at (13,131) size 231x23 +- RenderBlock {DIV} at (0,0) size 231x23 +- RenderText {#text} at (0,0) size 13x23 +- text run at (0,0) width 13: "0" +-layer at (245,62) size 19x30 +- RenderBlock (relative positioned) {DIV} at (231,-1) size 20x31 +-layer at (244,95) size 19x30 +- RenderBlock (relative positioned) {DIV} at (230,-1) size 20x31 +-layer at (244,128) size 19x30 +- RenderBlock (relative positioned) {DIV} at (230,-1) size 20x31 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/option-text-clip-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/option-text-clip-expected.txt +deleted file mode 100644 +index f3d99b81ebde07d5772f2be7a8425961dcec9b86..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/option-text-clip-expected.txt ++++ /dev/null +@@ -1,13 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 713x18 +- text run at (0,0) width 713: "This tests that the option text is clipped properly, and doesn't spill over into the arrow part of the popup control." +- RenderBR {BR} at (712,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 150x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 150x18 +- RenderText at (8,2) size 131x13 +- text run at (8,2) width 131: "12345 6789 ABCD EFGH" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/plaintext-mode-2-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/plaintext-mode-2-expected.txt +deleted file mode 100644 +index a316f4b575195290cb38989e3cbac9e561480b00..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/plaintext-mode-2-expected.txt ++++ /dev/null +@@ -1,41 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock (anonymous) at (0,0) size 784x23 +- RenderTextControl {INPUT} at (0,2) size 600x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (600,2) size 4x18 +- text run at (600,2) width 4: " " +- RenderBR {BR} at (604,2) size 0x18 +- RenderBlock {DIV} at (0,23) size 784x18 +- RenderText {#text} at (0,0) size 33x18 +- text run at (0,0) width 33: "This " +- RenderInline {B} at (0,0) size 69x18 +- RenderText {#text} at (32,0) size 45x18 +- text run at (32,0) width 45: "styled " +- RenderInline {I} at (0,0) size 25x18 +- RenderText {#text} at (76,0) size 25x18 +- text run at (76,0) width 25: "text" +- RenderText {#text} at (100,0) size 36x18 +- text run at (100,0) width 36: ", and " +- RenderInline {A} at (0,0) size 26x18 [color=#0000EE] +- RenderText {#text} at (135,0) size 26x18 +- text run at (135,0) width 26: "link" +- RenderText {#text} at (160,0) size 413x18 +- text run at (160,0) width 211: " will be pasted into the textfield. " +- text run at (370,0) width 203: "All richness should be stripped." +- RenderBlock {OL} at (0,57) size 784x36 +- RenderListItem {LI} at (40,0) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "1" +- RenderText {#text} at (0,0) size 332x18 +- text run at (0,0) width 332: "Success: document.execCommand(\"Copy\") == true" +- RenderListItem {LI} at (40,18) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "2" +- RenderText {#text} at (0,0) size 331x18 +- text run at (0,0) width 331: "Success: document.execCommand(\"Paste\") == true" +-layer at (11,13) size 594x13 +- RenderBlock {DIV} at (3,3) size 594x13 +- RenderText {#text} at (0,0) size 465x13 +- text run at (0,0) width 465: "This styled text, and link will be pasted into the textfield. All richness should be stripped." +-caret: position 94 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 0 {INPUT} of body +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/range/input-appearance-range-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/range/input-appearance-range-expected.txt +deleted file mode 100644 +index 8e32f827bfa3b82b9b406cb442ce29cfa071ebaa..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/range/input-appearance-range-expected.txt ++++ /dev/null +@@ -1,31 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x261 +- RenderBlock {HTML} at (0,0) size 800x261 +- RenderBody {BODY} at (8,8) size 784x245 +- RenderBlock {DIV} at (0,0) size 784x36 +- RenderSlider {INPUT} at (2,2) size 129x30 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (0,0) size 129x30 +- RenderBlock {DIV} at (0,7) size 129x16 +- RenderBlock {DIV} at (57,0) size 15x15 +- RenderBlock {DIV} at (0,36) size 784x21 +- RenderSlider {INPUT} at (2,2) size 129x15 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (0,0) size 15x15 +- RenderBlock {DIV} at (0,57) size 784x21 +- RenderSlider {INPUT} at (2,2) size 129x15 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (114,0) size 15x15 +- RenderBlock {DIV} at (0,78) size 784x146 +- RenderSlider {INPUT} at (64,2) size 129x140 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (0,0) size 129x140 +- RenderBlock {DIV} at (57,0) size 15x140 +- RenderBlock {DIV} at (0,62) size 15x16 +- RenderBlock {DIV} at (0,224) size 784x21 +-layer at (10,234) size 129x15 +- RenderSlider {INPUT} at (2,2) size 129x15 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (85,0) size 16x15 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/range/slider-padding-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/range/slider-padding-expected.txt +deleted file mode 100644 +index 2cbf0a246fdd3405f1088f4a2cbebd4ec9fb19c7..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/range/slider-padding-expected.txt ++++ /dev/null +@@ -1,16 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x579 +- RenderBlock (anonymous) at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "This tests that the slider control considers padding." +- RenderBR {BR} at (325,0) size 1x18 +- RenderBlock {DIV} at (0,18) size 784x39 [bgcolor=#ADD8E6] +- RenderSlider {INPUT} at (2,2) size 100x35 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (10,10) size 80x15 +- RenderBlock {DIV} at (0,0) size 80x15 +- RenderBlock {DIV} at (0,0) size 15x15 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {PRE} at (0,70) size 784x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/range/slider-thumb-shared-style-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/range/slider-thumb-shared-style-expected.txt +deleted file mode 100644 +index dcc06d0a9e7040b7bfda83d48b2acf721bcd718e..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/range/slider-thumb-shared-style-expected.txt ++++ /dev/null +@@ -1,31 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 54x18 +- text run at (0,0) width 54: "Test for " +- RenderInline {I} at (0,0) size 717x18 +- RenderInline {A} at (0,0) size 305x18 [color=#0000EE] +- RenderText {#text} at (53,0) size 305x18 +- text run at (53,0) width 305: "http://bugs.webkit.org/show_bug.cgi?id=13800" +- RenderText {#text} at (357,0) size 413x18 +- text run at (357,0) width 5: " " +- text run at (361,0) width 409: "REGRESSION: Moving a slider moves another unrelated slider" +- RenderText {#text} at (769,0) size 5x18 +- text run at (769,0) width 5: "." +- RenderBlock {P} at (0,34) size 784x18 +- RenderText {#text} at (0,0) size 289x18 +- text run at (0,0) width 289: "The first slider\x{2019}s thumb should be on the left." +- RenderBlock {DIV} at (0,68) size 784x38 +- RenderSlider {INPUT} at (2,2) size 129x15 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (0,0) size 15x15 +- RenderBR {BR} at (133,3) size 0x18 +- RenderSlider {INPUT} at (2,21) size 129x15 [color=#909090] [bgcolor=#FFFFFF] +- RenderFlexibleBox {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (0,0) size 129x15 +- RenderBlock {DIV} at (114,0) size 15x15 +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/range/thumbslider-no-parent-slider-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/range/thumbslider-no-parent-slider-expected.txt +deleted file mode 100644 +index fbb0dc74be95c771c8a48e99dc95739f940c9676..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/range/thumbslider-no-parent-slider-expected.txt ++++ /dev/null +@@ -1,9 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {SPAN} at (0,0) size 15x15 +- RenderBR {BR} at (15,1) size 0x18 +- RenderBlock {SPAN} at (0,15) size 15x15 +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/search-rtl-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/search-rtl-expected.txt +deleted file mode 100644 +index 183ae8a007ab1bb0318ed9172a7559e5d648726a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/search-rtl-expected.txt ++++ /dev/null +@@ -1,58 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 54x18 +- text run at (0,0) width 54: "Test for " +- RenderInline {I} at (0,0) size 702x18 +- RenderInline {A} at (0,0) size 304x18 [color=#0000EE] +- RenderText {#text} at (53,0) size 304x18 +- text run at (53,0) width 304: "http://bugs.webkit.org/show_bug.cgi?id=11916" +- RenderText {#text} at (356,0) size 399x18 +- text run at (356,0) width 5: " " +- text run at (360,0) width 395: "REGRESSION (SearchField): RTL search fields are mixed up" +- RenderText {#text} at (754,0) size 5x18 +- text run at (754,0) width 5: "." +- RenderBlock {P} at (0,34) size 784x69 +- RenderTextControl {INPUT} at (2,2) size 187x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 181x19 +- RenderBlock {DIV} at (158,0) size 23x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderBR {BR} at (190,2) size 1x18 +- RenderTextControl {INPUT} at (2,25) size 257x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 251x19 +- RenderBlock {DIV} at (228,0) size 23x19 +- RenderBlock {DIV} at (19,3) size 210x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderBR {BR} at (260,25) size 1x18 +- RenderTextControl {INPUT} at (2,48) size 187x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 181x19 +- RenderBlock {DIV} at (158,0) size 23x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,119) size 784x18 +- RenderText {#text} at (0,0) size 37x18 +- text run at (0,0) width 37: "PASS" +-layer at (32,47) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (7,0) size 133x13 +- text run at (7,0) width 22 RTL: " \x{5D5}\x{5D6}\x{5D4}\x{5D5}" +- text run at (28,0) width 20: "she" +- text run at (47,0) width 44 RTL: " \x{5D5}\x{5D4}\x{5D9}\x{5D0} \x{5D6}\x{5D4} " +- text run at (90,0) width 14: "he" +- text run at (103,0) width 37 RTL: "\x{5D4}\x{5D5}\x{5D0} \x{5D6}\x{5D4} " +-layer at (32,70) size 210x13 +- RenderBlock {DIV} at (0,0) size 210x13 +- RenderText {#text} at (76,0) size 134x13 +- text run at (76,0) width 23 RTL: " \x{5D5}\x{5D6}\x{5D4}\x{5D5}" +- text run at (98,0) width 20: "she" +- text run at (117,0) width 44 RTL: " \x{5D5}\x{5D4}\x{5D9}\x{5D0} \x{5D6}\x{5D4} " +- text run at (160,0) width 14: "he" +- text run at (173,0) width 37 RTL: "\x{5D4}\x{5D5}\x{5D0} \x{5D6}\x{5D4} " +-layer at (32,93) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +-caret: position 0 of child 0 {DIV} of child 1 {DIV} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of child 3 {P} of body +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/search/search-size-with-decorations-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/search/search-size-with-decorations-expected.txt +deleted file mode 100644 +index 7adee50489e8c4b4c47c31582cd5acb53311b23c..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/search/search-size-with-decorations-expected.txt ++++ /dev/null +@@ -1,69 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x177 +- RenderBlock {HTML} at (0,0) size 800x177 +- RenderBody {BODY} at (8,8) size 784x161 +- RenderTextControl {INPUT} at (2,2) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderBR {BR} at (177,2) size 1x18 +- RenderTextControl {INPUT} at (2,25) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderBR {BR} at (177,25) size 1x18 +- RenderTextControl {INPUT} at (2,48) size 183x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 177x19 +- RenderBlock {DIV} at (0,0) size 17x19 +- RenderBlock {DIV} at (17,3) size 141x13 +- RenderBlock {DIV} at (157,0) size 20x19 +- RenderBR {BR} at (186,48) size 1x18 +- RenderTextControl {INPUT} at (2,71) size 183x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 177x19 +- RenderBlock {DIV} at (0,0) size 17x19 +- RenderBlock {DIV} at (17,3) size 141x13 +- RenderBlock {DIV} at (157,0) size 20x19 +- RenderBR {BR} at (186,71) size 1x18 +- RenderTextControl {INPUT} at (2,94) size 188x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 182x19 +- RenderBlock {DIV} at (0,0) size 22x19 +- RenderBlock {DIV} at (22,3) size 141x13 +- RenderBlock {DIV} at (162,0) size 20x19 +- RenderBR {BR} at (191,94) size 1x18 +- RenderTextControl {INPUT} at (2,117) size 188x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 182x19 +- RenderBlock {DIV} at (0,0) size 22x19 +- RenderBlock {DIV} at (22,3) size 141x13 +- RenderBlock {DIV} at (162,0) size 20x19 +- RenderBR {BR} at (191,117) size 1x18 +- RenderTextControl {INPUT} at (2,140) size 328x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 322x19 +- RenderBlock {DIV} at (0,0) size 22x19 +- RenderBlock {DIV} at (22,3) size 281x13 +- RenderBlock {DIV} at (302,0) size 20x19 +- RenderText {#text} at (0,0) size 0x0 +-layer at (21,13) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (21,36) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 135x13 +- text run at (0,0) width 135: "12345678901234567890" +-layer at (30,59) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (30,82) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 135x13 +- text run at (0,0) width 135: "12345678901234567890" +-layer at (35,105) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (35,128) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 135x13 +- text run at (0,0) width 135: "12345678901234567890" +-layer at (35,151) size 281x13 +- RenderBlock {DIV} at (0,0) size 281x13 +- RenderText {#text} at (0,0) size 270x13 +- text run at (0,0) width 270: "1234567890123456789012345678901234567890" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/search/search-zoom-computed-style-height-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/search/search-zoom-computed-style-height-expected.txt +deleted file mode 100644 +index 1045dc18a82b3fed89d2e543b1612bce9d2e81c7..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/search/search-zoom-computed-style-height-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-Test for computed style height of a zoomed-in search field +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +-Computed style height: 22px +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/select-change-listbox-to-popup-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/select-change-listbox-to-popup-expected.txt +deleted file mode 100644 +index eeee40faad064d0f888b4a853402afb0d67251e4..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/select-change-listbox-to-popup-expected.txt ++++ /dev/null +@@ -1,13 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 450x18 +- text run at (0,0) width 450: "This tests that you can dynamically change a list box to a popup menu" +- RenderBR {BR} at (449,0) size 1x18 +- RenderMenuList {SELECT} at (2,20) size 218x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 218x18 +- RenderText at (8,2) size 187x13 +- text run at (8,2) width 187: "This should turn into a popup menu" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/select-change-popup-to-listbox-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/select-change-popup-to-listbox-expected.txt +deleted file mode 100644 +index 440a1d3b31ebeca3eebd4013fd0c0ccae75205e1..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/select-change-popup-to-listbox-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 454x18 +- text run at (0,0) width 454: "This tests that you can dynamically change a popup menu to a list box." +- RenderBR {BR} at (453,0) size 1x18 +- RenderListBox {SELECT} at (2,20) size 176x71 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/select-selected-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/select-selected-expected.txt +deleted file mode 100644 +index bb0ac0eabcc6ddff98cd8f5e1f39c74cf48d0277..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/select-selected-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderMenuList {SELECT} at (2,2) size 259x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 259x18 +- RenderText at (8,2) size 164x13 +- text run at (8,2) width 164: "should see this option selected" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/select-visual-hebrew-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/select-visual-hebrew-expected.txt +deleted file mode 100644 +index 3f453d317b043bc9397b4bc330cc66194332ddf0..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/select-visual-hebrew-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 632x18 +- text run at (0,0) width 632: "This tests that native pop-ups are rendered in logical order even in visually-ordered Hebrew pages." +- RenderBlock {HR} at (0,34) size 784x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,52) size 784x19 +- RenderText {#text} at (0,1) size 398x18 +- text run at (0,1) width 398: "Text on the pop-up and in the list should look like this: \x{5E8}\x{5D5}\x{5EA}\x{5E4}\x{5DB}" +- RenderBlock (anonymous) at (0,87) size 784x22 +- RenderMenuList {SELECT} at (2,2) size 61x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 61x18 +- RenderText at (8,2) size 30x13 +- text run at (8,2) width 30 RTL: "\x{5DB}\x{5E4}\x{5EA}\x{5D5}\x{5E8}" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/select/optgroup-rendering-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/select/optgroup-rendering-expected.txt +deleted file mode 100644 +index a6f3033c365ef98019cbb4ee337bed1b3aa8a90f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/select/optgroup-rendering-expected.txt ++++ /dev/null +@@ -1,15 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x323 +- RenderBlock {HTML} at (0,0) size 800x323 +- RenderBody {BODY} at (8,8) size 784x307 +- RenderBlock {FORM} at (0,0) size 784x307 +- RenderListBox {SELECT} at (2,2) size 70x281 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderText {#text} at (74,264) size 4x18 +- text run at (74,264) width 4: " " +- RenderBR {BR} at (78,264) size 0x18 +- RenderMenuList {SELECT} at (2,287) size 75x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 75x18 +- RenderText at (8,2) size 31x13 +- text run at (8,2) width 31: "Three" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/textAreaLineHeight-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/textAreaLineHeight-expected.txt +deleted file mode 100644 +index ddb1c6208fbfc43f73d5afb48376167d77700edf..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/textAreaLineHeight-expected.txt ++++ /dev/null +@@ -1,78 +0,0 @@ +-layer at (0,0) size 785x1207 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x1207 +- RenderBlock {HTML} at (0,0) size 785x1208 +- RenderBody {BODY} at (8,8) size 769x1184 +- RenderBlock (anonymous) at (0,0) size 769x18 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "line-height settings not reflected in textarea" +- RenderBR {BR} at (276,0) size 1x18 +- RenderBlock {P} at (0,34) size 769x264 +- RenderText {#text} at (0,0) size 84x18 +- text run at (0,0) width 84: "TEXTAREA" +- RenderBR {BR} at (83,0) size 1x18 +- RenderText {#text} at (406,210) size 4x18 +- text run at (406,210) width 4: " " +- RenderBR {BR} at (0,0) size 0x0 +- RenderBR {BR} at (0,228) size 0x18 +- RenderText {#text} at (0,246) size 148x18 +- text run at (0,246) width 148: "PARAGRAPH - works" +- RenderBlock {P} at (0,314) size 402x202 [border: (1px dotted #C0C0C0)] +- RenderText {#text} at (1,19) size 400x69 +- text run at (1,19) width 400: "Demo text here that wraps a bit and should demonstrate the" +- text run at (1,72) width 154: "goodness of line-height" +- RenderBlock (anonymous) at (0,529) size 769x37 +- RenderBR {BR} at (0,0) size 0x18 +- RenderText {#text} at (0,18) size 81x18 +- text run at (0,18) width 81: "DIV - works" +- RenderBR {BR} at (80,18) size 1x18 +- RenderBlock {DIV} at (0,565) size 402x203 [border: (1px dotted #C0C0C0)] +- RenderText {#text} at (1,19) size 400x69 +- text run at (1,19) width 400: "Demo text here that wraps a bit and should demonstrate the" +- text run at (1,72) width 154: "goodness of line-height" +- RenderBlock (anonymous) at (0,767) size 769x417 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBR {BR} at (0,18) size 0x18 +- RenderText {#text} at (0,36) size 125x18 +- text run at (0,36) width 125: "Un-Styled Textarea" +- RenderBR {BR} at (124,36) size 1x18 +- RenderText {#text} at (165,76) size 4x18 +- text run at (165,76) width 4: " " +- RenderBR {BR} at (0,0) size 0x0 +- RenderBR {BR} at (0,94) size 0x18 +- RenderText {#text} at (0,112) size 216x18 +- text run at (0,112) width 216: "Totally Blank Un-Styled Textarea" +- RenderBR {BR} at (215,112) size 1x18 +- RenderText {#text} at (165,152) size 4x18 +- text run at (165,152) width 4: " " +- RenderBR {BR} at (0,0) size 0x0 +- RenderBR {BR} at (0,170) size 0x18 +- RenderText {#text} at (0,188) size 212x18 +- text run at (0,188) width 212: "Totally Blank STYLED Textarea" +- RenderBR {BR} at (211,188) size 1x18 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,1199) size 769x0 +-layer at (8,60) size 406x206 clip at (9,61) size 404x204 +- RenderTextControl {TEXTAREA} at (0,18) size 406x206 [bgcolor=#FFFFFF] [border: (1px dotted #C0C0C0)] +- RenderBlock {DIV} at (3,3) size 400x106 +- RenderText {#text} at (0,18) size 400x69 +- text run at (0,18) width 400: "Demo text here that wraps a bit and should demonstrate the" +- text run at (399,18) width 1: " " +- text run at (0,71) width 154: "goodness of line-height" +-layer at (10,831) size 161x32 clip at (11,832) size 144x30 scrollHeight 56 +- RenderTextControl {TEXTAREA} at (2,56) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 140x52 +- RenderText {#text} at (0,0) size 140x52 +- text run at (0,0) width 140: "Demo text here that wraps" +- text run at (139,0) width 1: " " +- text run at (0,13) width 84: "a bit and should" +- text run at (83,13) width 5: " " +- text run at (0,26) width 87: "demonstrate the" +- text run at (86,26) width 4: " " +- text run at (0,39) width 125: "goodness of line-height" +-layer at (10,907) size 161x32 clip at (11,908) size 159x30 +- RenderTextControl {TEXTAREA} at (2,132) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x13 +-layer at (8,981) size 406x206 clip at (9,982) size 404x204 +- RenderTextControl {TEXTAREA} at (0,206) size 406x206 [bgcolor=#FFFFFF] [border: (1px dotted #C0C0C0)] +- RenderBlock {DIV} at (3,3) size 400x53 +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/textarea-placeholder-visibility-1-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/textarea-placeholder-visibility-1-expected.txt +deleted file mode 100644 +index 466147338638e9197df447c7bf684ed60a02ddb1..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/textarea-placeholder-visibility-1-expected.txt ++++ /dev/null +@@ -1,19 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 390x18 +- text run at (0,0) width 390: "Focus field with a placeholder, then type, then delete all text." +- RenderBlock {DIV} at (0,34) size 784x36 +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +-layer at (10,44) size 161x32 clip at (11,45) size 159x30 +- RenderTextControl {TEXTAREA} at (2,2) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x13 +- RenderBR {BR} at (0,0) size 0x13 +- RenderBlock {DIV} at (3,3) size 155x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 63x13 +- text run at (0,0) width 63: "Placeholder" +-caret: position 0 of child 0 {BR} of child 0 {DIV} of {#document-fragment} of child 1 {TEXTAREA} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/textarea-placeholder-visibility-2-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/textarea-placeholder-visibility-2-expected.txt +deleted file mode 100644 +index 85a3ed75b57a14baff4af777873800a6d17753dc..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/textarea-placeholder-visibility-2-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Focus field with a placeholder, then type, then clear the value." +- RenderBlock {DIV} at (0,34) size 784x36 +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +-layer at (10,44) size 161x32 clip at (11,45) size 159x30 +- RenderTextControl {TEXTAREA} at (2,2) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x13 +- RenderBlock {DIV} at (3,3) size 155x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 63x13 +- text run at (0,0) width 63: "Placeholder" +-caret: position 0 of child 0 {DIV} of {#document-fragment} of child 1 {TEXTAREA} of child 3 {DIV} of body +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/textfield-outline-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/textfield-outline-expected.txt +deleted file mode 100644 +index a513235df3fb993879d4117400449bfca42940f2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/textfield-outline-expected.txt ++++ /dev/null +@@ -1,15 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 563x18 +- text run at (0,0) width 563: "This tests that a negative outline-offset won't get in the way of a cursor in a text control." +- RenderBR {BR} at (562,0) size 1x18 +- RenderTextControl {INPUT} at (2,20) size 255x27 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderText {#text} at (0,0) size 0x0 +-layer at (12,30) size 251x23 +- RenderBlock {DIV} at (2,2) size 251x23 +- RenderText {#text} at (0,0) size 33x23 +- text run at (0,0) width 33: "abc" +-caret: position 3 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 3 {INPUT} of body +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/time/time-input-rendering-basic-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/time/time-input-rendering-basic-expected.txt +deleted file mode 100644 +index f9f1bfafa4a9f8d0637c5f9b68426ba2e7bde0d2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/time/time-input-rendering-basic-expected.txt ++++ /dev/null +@@ -1,48 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (68,4) size 5x18 +- text run at (68,4) width 5: " " +- RenderText {#text} at (0,0) size 0x0 +-layer at (10,10) size 64x23 clip at (12,12) size 60x19 +- RenderFlexibleBox {INPUT} at (2,2) size 65x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +-layer at (13,13) size 58x17 +- RenderBlock {DIV} at (3,3) size 59x17 +- RenderBlock {DIV} at (1,1) size 57x15 +- RenderBlock {DIV} at (0,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "09" +- RenderInline {DIV} at (0,0) size 4x13 +- RenderText {#text} at (16,1) size 4x13 +- text run at (16,1) width 4: ":" +- RenderBlock {DIV} at (19,0) size 18x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "41" +- RenderInline {DIV} at (0,0) size 4x13 +- RenderText {#text} at (35,1) size 4x13 +- text run at (35,1) width 4: " " +- RenderBlock {DIV} at (37,0) size 20x15 +- RenderText {#text} at (1,1) size 18x13 +- text run at (1,1) width 18: "AM" +-layer at (82,10) size 65x23 clip at (84,12) size 61x19 +- RenderFlexibleBox {INPUT} at (74,2) size 65x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +-layer at (85,13) size 58x17 +- RenderBlock {DIV} at (3,3) size 59x17 +- RenderBlock {DIV} at (1,1) size 57x15 +- RenderBlock {DIV} at (40,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "09" +- RenderInline {DIV} at (0,0) size 5x13 +- RenderText {#text} at (36,1) size 5x13 +- text run at (36,1) width 5 RTL: ":" +- RenderBlock {DIV} at (20,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "41" +- RenderInline {DIV} at (0,0) size 4x13 +- RenderText {#text} at (18,1) size 4x13 +- text run at (18,1) width 4 RTL: " " +- RenderBlock {DIV} at (0,0) size 20x15 +- RenderText {#text} at (1,1) size 18x13 +- text run at (1,1) width 18: "AM" +diff --git a/LayoutTests/platform/mac-catalina/fast/forms/visual-hebrew-text-field-expected.txt b/LayoutTests/platform/mac-catalina/fast/forms/visual-hebrew-text-field-expected.txt +deleted file mode 100644 +index 7724c8ce7dff8e71918d5ed92293dc1a1c0be70f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/forms/visual-hebrew-text-field-expected.txt ++++ /dev/null +@@ -1,28 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 218x18 +- text run at (0,0) width 218: "This tests for a regression against " +- RenderInline {I} at (0,0) size 783x36 +- RenderInline {A} at (0,0) size 354x18 [color=#0000EE] +- RenderText {#text} at (217,0) size 354x18 +- text run at (217,0) width 354: "http://bugzilla.opendarwin.org/show_bug.cgi?id=8076" +- RenderText {#text} at (570,0) size 783x36 +- text run at (570,0) width 213: " REGRESSION: native text fields" +- text run at (0,18) width 251: "are reversed on \"visual Hebrew\" pages" +- RenderText {#text} at (250,18) size 5x18 +- text run at (250,18) width 5: "." +- RenderBlock {HR} at (0,52) size 784x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,70) size 784x19 +- RenderText {#text} at (0,1) size 286x18 +- text run at (0,1) width 286: "Text in the field should look like this: \x{5E8}\x{5D5}\x{5EA}\x{5E4}\x{5DB}" +- RenderBlock (anonymous) at (0,105) size 784x23 +- RenderTextControl {INPUT} at (2,2) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +-layer at (13,118) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 30x13 +- text run at (0,0) width 30 RTL: "\x{5DB}\x{5E4}\x{5EA}\x{5D5}\x{5E8}" +diff --git a/LayoutTests/platform/mac-catalina/fast/parser/document-write-option-expected.txt b/LayoutTests/platform/mac-catalina/fast/parser/document-write-option-expected.txt +deleted file mode 100644 +index cac7ff8eff08a7557f5460db734030f1ce3ffc73..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/parser/document-write-option-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderMenuList {SELECT} at (2,2) size 317x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 317x18 +- RenderText at (8,2) size 286x13 +- text run at (8,2) width 286: "This is a very long string so it makes the select bigger." +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-catalina/fast/parser/entity-comment-in-textarea-expected.txt b/LayoutTests/platform/mac-catalina/fast/parser/entity-comment-in-textarea-expected.txt +deleted file mode 100644 +index c95447a3b64a3411dd5f0ae4ff93b7ebdc4c445a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-catalina/fast/parser/entity-comment-in-textarea-expected.txt ++++ /dev/null +@@ -1,12 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (165,22) size 255x18 +- text run at (165,22) width 255: " --> This should be outside the textarea." +-layer at (10,10) size 161x32 clip at (11,11) size 159x30 +- RenderTextControl {TEXTAREA} at (2,2) size 161x32 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 155x13 +- RenderText {#text} at (0,0) size 22x13 +- text run at (0,0) width 22: " world. +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 +-[hello world. ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/font-size-expected.txt b/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/font-size-expected.txt +deleted file mode 100644 +index ca52fdd063faaa10fa712c1d7bb560ce69797527..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/font-size-expected.txt ++++ /dev/null +@@ -1,125 +0,0 @@ +-Input: +-small element +-xx-small +-x-small +-small +-normal +-large +-x-large +-xx-large +-5pt +-15pt +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 +-[small element] +- NSFont: Times-Roman 13.33 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[xx-small] +- NSFont: Times-Roman 9.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[x-small] +- NSFont: Times-Roman 10.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[small] +- NSFont: Times-Roman 13.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ normal ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[large] +- NSFont: Times-Roman 18.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[x-large] +- NSFont: Times-Roman 24.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[xx-large] +- NSFont: Times-Roman 32.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[5pt] +- NSFont: Times-Roman 6.67 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[15pt] +- NSFont: Times-Roman 20.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/font-style-variant-effect-expected.txt b/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/font-style-variant-effect-expected.txt +deleted file mode 100644 +index 2d35c81c3c52015d14ebfc72c730575419f08251..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/font-style-variant-effect-expected.txt ++++ /dev/null +@@ -1,60 +0,0 @@ +-Input: +-italic +-oblique +-small-caps +-outline +-emboss +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 +-[italic] +- NSFont: Times-Italic 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[oblique] +- NSFont: Times-Italic 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[small-caps] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ outline emboss ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/font-weight-expected.txt b/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/font-weight-expected.txt +deleted file mode 100644 +index be72a540d1acc5beef24a024e38fd5b3621e9fe8..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/font-weight-expected.txt ++++ /dev/null +@@ -1,85 +0,0 @@ +-Input: +-bold +-font weight 100 +-font weight 200 +-font weight 300 +-font weight 400 +-font weight 500 +-font weight 600 +-font weight 700 +-font weight 800 +-font weight 900 +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 +-[bold] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ font weight 100 font weight 200 font weight 300 font weight 400 font weight 500 ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[font weight 600] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[font weight 700] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[font weight 800] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[font weight 900] +- NSFont: Times-Bold 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/letter-spacing-expected.txt b/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/letter-spacing-expected.txt +deleted file mode 100644 +index 14c9a9efa74a5469f33d4d0245cfd6e1ff0f8918..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/letter-spacing-expected.txt ++++ /dev/null +@@ -1,36 +0,0 @@ +-Input: +-3pt +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 +-[3pt] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/text-decorations-expected.txt b/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/text-decorations-expected.txt +deleted file mode 100644 +index c911ce26874ac95cd27d6cced31a1c001b3e5a03..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/text-decorations-expected.txt ++++ /dev/null +@@ -1,50 +0,0 @@ +-Input: +-underline +-strike +-underline and strike +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 +-[underline] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSUnderline: true +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[strike] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrikethrough: true +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[ underline and strike ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/vertical-align-expected.txt b/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/vertical-align-expected.txt +deleted file mode 100644 +index 678c630ba4c673065671292238771855b373dc72..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave-wk1/editing/mac/attributed-string/vertical-align-expected.txt ++++ /dev/null +@@ -1,74 +0,0 @@ +-Input: +-sup element +-sub element +-vertical align super +-vertical align sub +-vertical align 50% +- +-Output: +-NSParagraphStyle: +-Alignment 4 +- LineSpacing: 0 +- ParagraphSpacing: 0 +- ParagraphSpacingBefore: 0 +- HeadIndent: 0 +- TailIndent: 0 +- FirstLineHeadIndent: 0 +- LineHeight: 0/0 +- LineHeightMultiple: 0 +- LineBreakMode: 0 +- Tabs: () +- DefaultTabInterval: 36 +- Blocks: ( +-) +- Lists: ( +-) +- BaseWritingDirection: 0 +- HyphenationFactor: 0 +- TighteningForTruncation: YES +- HeaderLevel: 0 +-[sup element] +- NSFont: Times-Roman 13.33 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSSuperScript: 1 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[sub element] +- NSFont: Times-Roman 13.33 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSSuperScript: -1 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[vertical align super] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSSuperScript: 1 +-[ ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +-[vertical align sub] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- NSSuperScript: -1 +-[ vertical align 50% ] +- NSFont: Times-Roman 16.00 pt. +- NSKern: 0pt +- NSStrokeColor: #000000 (sRGB) +- NSStrokeWidth: 0 +- +diff --git a/LayoutTests/platform/mac-mojave-wk1/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any-expected.txt b/LayoutTests/platform/mac-mojave-wk1/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any-expected.txt +deleted file mode 100644 +index a5d982577b01453f562d4c5cee149d627d818d0e..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave-wk1/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any-expected.txt ++++ /dev/null +@@ -1,17 +0,0 @@ +- +-PASS Response.redirected should be false on not-redirected responses +-PASS Redirect 301 with GET +-PASS Redirect 301 with POST +-FAIL Redirect 301 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 302 with GET +-PASS Redirect 302 with POST +-FAIL Redirect 302 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 303 with GET +-PASS Redirect 303 with POST +-FAIL Redirect 303 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 303 with TESTING +-PASS Redirect 307 with GET +-PASS Redirect 307 with POST (string body) +-PASS Redirect 307 with POST (blob body) +-FAIL Redirect 307 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +- +diff --git a/LayoutTests/platform/mac-mojave-wk1/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any.worker-expected.txt b/LayoutTests/platform/mac-mojave-wk1/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any.worker-expected.txt +deleted file mode 100644 +index a5d982577b01453f562d4c5cee149d627d818d0e..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave-wk1/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any.worker-expected.txt ++++ /dev/null +@@ -1,17 +0,0 @@ +- +-PASS Response.redirected should be false on not-redirected responses +-PASS Redirect 301 with GET +-PASS Redirect 301 with POST +-FAIL Redirect 301 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 302 with GET +-PASS Redirect 302 with POST +-FAIL Redirect 302 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 303 with GET +-PASS Redirect 303 with POST +-FAIL Redirect 303 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 303 with TESTING +-PASS Redirect 307 with GET +-PASS Redirect 307 with POST (string body) +-PASS Redirect 307 with POST (blob body) +-FAIL Redirect 307 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +- +diff --git a/LayoutTests/platform/mac-mojave/css1/basic/inheritance-expected.txt b/LayoutTests/platform/mac-mojave/css1/basic/inheritance-expected.txt +deleted file mode 100644 +index bbee1a343e7ee107dd312a99ec6197efa4a6baf4..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/css1/basic/inheritance-expected.txt ++++ /dev/null +@@ -1,189 +0,0 @@ +-layer at (0,0) size 785x730 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x730 +- RenderBlock {HTML} at (0,0) size 785x731 +- RenderBody {BODY} at (8,8) size 769x715 [color=#008000] [bgcolor=#CCCCCC] +- RenderBlock {P} at (0,0) size 769x18 +- RenderText {#text} at (0,0) size 363x18 +- text run at (0,0) width 363: "The style declarations which apply to the text below are:" +- RenderBlock {PRE} at (0,34) size 769x105 +- RenderText {#text} at (0,0) size 266x105 +- text run at (0,0) width 157: "BODY {color: green;}" +- text run at (156,0) width 1: " " +- text run at (0,15) width 133: "H3 {color: blue;}" +- text run at (132,15) width 1: " " +- text run at (0,30) width 149: "EM {color: purple;}" +- text run at (148,30) width 1: " " +- text run at (0,45) width 203: ".one {font-style: italic;}" +- text run at (202,45) width 1: " " +- text run at (0,60) width 266: ".two {text-decoration: underline;}" +- text run at (265,60) width 1: " " +- text run at (0,75) width 149: "#two {color: navy;}" +- text run at (148,75) width 1: " " +- text run at (0,90) width 180: ".three {color: purple;}" +- text run at (179,90) width 1: " " +- RenderBlock {HR} at (0,152) size 769x2 [border: (1px inset #008000)] +- RenderBlock {H3} at (0,172) size 769x23 [color=#0000FF] +- RenderText {#text} at (0,0) size 219x22 +- text run at (0,0) width 219: "This sentence should show " +- RenderInline {STRONG} at (0,0) size 36x22 +- RenderText {#text} at (218,0) size 36x22 +- text run at (218,0) width 36: "blue" +- RenderText {#text} at (253,0) size 41x22 +- text run at (253,0) width 41: " and " +- RenderInline {EM} at (0,0) size 57x22 [color=#800080] +- RenderText {#text} at (293,0) size 57x22 +- text run at (293,0) width 57: "purple" +- RenderText {#text} at (349,0) size 5x22 +- text run at (349,0) width 5: "." +- RenderBlock {H3} at (0,213) size 769x23 [color=#0000FF] +- RenderText {#text} at (0,0) size 197x22 +- text run at (0,0) width 197: "This sentence should be " +- RenderInline {SPAN} at (0,0) size 38x22 +- RenderText {#text} at (196,0) size 38x22 +- text run at (196,0) width 38: "blue" +- RenderText {#text} at (233,0) size 102x22 +- text run at (233,0) width 102: " throughout." +- RenderBlock {P} at (0,254) size 769x19 +- RenderText {#text} at (0,0) size 230x18 +- text run at (0,0) width 230: "This should be green except for the " +- RenderInline {EM} at (0,0) size 118x18 [color=#800080] +- RenderText {#text} at (229,0) size 118x18 +- text run at (229,0) width 118: "emphasized words" +- RenderText {#text} at (346,0) size 163x18 +- text run at (346,0) width 163: ", which should be purple." +- RenderBlock {H3} at (0,290) size 769x23 [color=#0000FF] +- RenderText {#text} at (0,0) size 292x22 +- text run at (0,0) width 292: "This should be blue and underlined." +- RenderBlock {P} at (0,331) size 769x19 +- RenderText {#text} at (0,0) size 299x18 +- text run at (0,0) width 299: "This sentence should be underlined, including " +- RenderInline {TT} at (0,0) size 71x15 +- RenderText {#text} at (298,2) size 71x15 +- text run at (298,2) width 71: "this part" +- RenderText {#text} at (368,0) size 9x18 +- text run at (368,0) width 9: ", " +- RenderInline {I} at (0,0) size 55x18 +- RenderText {#text} at (376,0) size 55x18 +- text run at (376,0) width 55: "this part" +- RenderText {#text} at (430,0) size 9x18 +- text run at (430,0) width 9: ", " +- RenderInline {EM} at (0,0) size 54x18 [color=#800080] +- RenderText {#text} at (438,0) size 54x18 +- text run at (438,0) width 54: "this part" +- RenderText {#text} at (491,0) size 37x18 +- text run at (491,0) width 37: ", and " +- RenderInline {STRONG} at (0,0) size 59x18 +- RenderText {#text} at (527,0) size 59x18 +- text run at (527,0) width 59: "this part" +- RenderText {#text} at (585,0) size 5x18 +- text run at (585,0) width 5: "." +- RenderBlock {P} at (0,365) size 769x19 [color=#000080] +- RenderText {#text} at (0,0) size 444x18 +- text run at (0,0) width 444: "This sentence should also be underlined, as well as dark blue (navy), " +- RenderInline {TT} at (0,0) size 149x15 +- RenderText {#text} at (443,2) size 149x15 +- text run at (443,2) width 149: "including this part" +- RenderText {#text} at (591,0) size 5x18 +- text run at (591,0) width 5: "." +- RenderBlock {P} at (0,399) size 769x19 [color=#800080] +- RenderText {#text} at (0,0) size 271x18 +- text run at (0,0) width 271: "This sentence should be purple, including " +- RenderInline {STRONG} at (0,0) size 59x18 +- RenderText {#text} at (270,0) size 59x18 +- text run at (270,0) width 59: "this part" +- RenderText {#text} at (328,0) size 32x18 +- text run at (328,0) width 32: " and " +- RenderInline {SPAN} at (0,0) size 178x18 +- RenderText {#text} at (359,0) size 178x18 +- text run at (359,0) width 178: "this part (which is spanned)" +- RenderText {#text} at (536,0) size 5x18 +- text run at (536,0) width 5: "." +- RenderTable {TABLE} at (0,433) size 618x282 [border: (1px outset #808080)] +- RenderTableSection {TBODY} at (1,1) size 616x279 +- RenderTableRow {TR} at (0,0) size 616x26 +- RenderTableCell {TD} at (0,0) size 616x26 [bgcolor=#C0C0C0] [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=2] +- RenderInline {STRONG} at (0,0) size 161x18 +- RenderText {#text} at (4,4) size 161x18 +- text run at (4,4) width 161: "TABLE Testing Section" +- RenderTableRow {TR} at (0,26) size 616x253 +- RenderTableCell {TD} at (0,139) size 12x27 [bgcolor=#C0C0C0] [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (4,3) size 4x19 +- text run at (4,4) width 4: " " +- RenderTableCell {TD} at (12,26) size 604x253 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1] +- RenderBlock {H3} at (4,4) size 596x22 [color=#0000FF] +- RenderText {#text} at (0,0) size 219x22 +- text run at (0,0) width 219: "This sentence should show " +- RenderInline {STRONG} at (0,0) size 36x22 +- RenderText {#text} at (218,0) size 36x22 +- text run at (218,0) width 36: "blue" +- RenderText {#text} at (253,0) size 41x22 +- text run at (253,0) width 41: " and " +- RenderInline {EM} at (0,0) size 57x22 [color=#800080] +- RenderText {#text} at (293,0) size 57x22 +- text run at (293,0) width 57: "purple" +- RenderText {#text} at (349,0) size 5x22 +- text run at (349,0) width 5: "." +- RenderBlock {H3} at (4,44) size 596x23 [color=#0000FF] +- RenderText {#text} at (0,0) size 197x22 +- text run at (0,0) width 197: "This sentence should be " +- RenderInline {SPAN} at (0,0) size 38x22 +- RenderText {#text} at (196,0) size 38x22 +- text run at (196,0) width 38: "blue" +- RenderText {#text} at (233,0) size 102x22 +- text run at (233,0) width 102: " throughout." +- RenderBlock {P} at (4,85) size 596x19 +- RenderText {#text} at (0,0) size 230x18 +- text run at (0,0) width 230: "This should be green except for the " +- RenderInline {EM} at (0,0) size 118x18 [color=#800080] +- RenderText {#text} at (229,0) size 118x18 +- text run at (229,0) width 118: "emphasized words" +- RenderText {#text} at (346,0) size 163x18 +- text run at (346,0) width 163: ", which should be purple." +- RenderBlock {H3} at (4,122) size 596x23 [color=#0000FF] +- RenderText {#text} at (0,0) size 292x22 +- text run at (0,0) width 292: "This should be blue and underlined." +- RenderBlock {P} at (4,162) size 596x19 +- RenderText {#text} at (0,0) size 299x18 +- text run at (0,0) width 299: "This sentence should be underlined, including " +- RenderInline {TT} at (0,0) size 71x15 +- RenderText {#text} at (298,2) size 71x15 +- text run at (298,2) width 71: "this part" +- RenderText {#text} at (368,0) size 9x18 +- text run at (368,0) width 9: ", " +- RenderInline {I} at (0,0) size 55x18 +- RenderText {#text} at (376,0) size 55x18 +- text run at (376,0) width 55: "this part" +- RenderText {#text} at (430,0) size 9x18 +- text run at (430,0) width 9: ", " +- RenderInline {EM} at (0,0) size 54x18 [color=#800080] +- RenderText {#text} at (438,0) size 54x18 +- text run at (438,0) width 54: "this part" +- RenderText {#text} at (491,0) size 37x18 +- text run at (491,0) width 37: ", and " +- RenderInline {STRONG} at (0,0) size 59x18 +- RenderText {#text} at (527,0) size 59x18 +- text run at (527,0) width 59: "this part" +- RenderText {#text} at (585,0) size 5x18 +- text run at (585,0) width 5: "." +- RenderBlock {P} at (4,196) size 596x19 [color=#000080] +- RenderText {#text} at (0,0) size 444x18 +- text run at (0,0) width 444: "This sentence should also be underlined, as well as dark blue (navy), " +- RenderInline {TT} at (0,0) size 149x15 +- RenderText {#text} at (443,2) size 149x15 +- text run at (443,2) width 149: "including this part" +- RenderText {#text} at (591,0) size 5x18 +- text run at (591,0) width 5: "." +- RenderBlock {P} at (4,230) size 596x19 [color=#800080] +- RenderText {#text} at (0,0) size 271x18 +- text run at (0,0) width 271: "This sentence should be purple, including " +- RenderInline {STRONG} at (0,0) size 59x18 +- RenderText {#text} at (270,0) size 59x18 +- text run at (270,0) width 59: "this part" +- RenderText {#text} at (328,0) size 32x18 +- text run at (328,0) width 32: " and " +- RenderInline {SPAN} at (0,0) size 178x18 +- RenderText {#text} at (359,0) size 178x18 +- text run at (359,0) width 178: "this part (which is spanned)" +- RenderText {#text} at (536,0) size 5x18 +- text run at (536,0) width 5: "." +diff --git a/LayoutTests/platform/mac-mojave/css2.1/t0602-c13-inh-underlin-00-e-expected.txt b/LayoutTests/platform/mac-mojave/css2.1/t0602-c13-inh-underlin-00-e-expected.txt +deleted file mode 100644 +index 2c3cb1e84e2a757b1c30595228d5b20cb43d3133..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/css2.1/t0602-c13-inh-underlin-00-e-expected.txt ++++ /dev/null +@@ -1,54 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x152 +- RenderBlock {HTML} at (0,0) size 800x152 +- RenderBody {BODY} at (8,16) size 784x120 [color=#000080] +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 230x18 +- text run at (0,0) width 230: "This should be blue and underlined." +- RenderBlock {P} at (0,34) size 784x18 +- RenderText {#text} at (0,0) size 299x18 +- text run at (0,0) width 299: "This sentence should be underlined, including " +- RenderInline {CODE} at (0,0) size 71x15 +- RenderText {#text} at (298,2) size 71x15 +- text run at (298,2) width 71: "this part" +- RenderText {#text} at (368,0) size 9x18 +- text run at (368,0) width 9: ", " +- RenderInline {CITE} at (0,0) size 55x18 +- RenderText {#text} at (376,0) size 55x18 +- text run at (376,0) width 55: "this part" +- RenderText {#text} at (430,0) size 9x18 +- text run at (430,0) width 9: ", " +- RenderInline {EM} at (0,0) size 54x18 +- RenderText {#text} at (438,0) size 54x18 +- text run at (438,0) width 54: "this part" +- RenderText {#text} at (491,0) size 37x18 +- text run at (491,0) width 9: ", " +- text run at (499,0) width 29: "and " +- RenderInline {STRONG} at (0,0) size 59x18 +- RenderText {#text} at (527,0) size 59x18 +- text run at (527,0) width 59: "this part" +- RenderText {#text} at (585,0) size 5x18 +- text run at (585,0) width 5: "." +- RenderBlock {P} at (0,68) size 784x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 283: "This sentence should also be underlined, as " +- text run at (282,0) width 97: "well as italics, " +- RenderInline {STRONG} at (0,0) size 138x18 +- RenderText {#text} at (378,0) size 138x18 +- text run at (378,0) width 138: "including this part" +- RenderText {#text} at (515,0) size 5x18 +- text run at (515,0) width 5: "." +- RenderBlock {P} at (0,102) size 784x18 +- RenderText {#text} at (0,0) size 343x18 +- text run at (0,0) width 343: "This sentence should be blue but not underlined, like " +- RenderInline {STRONG} at (0,0) size 59x18 +- RenderText {#text} at (342,0) size 59x18 +- text run at (342,0) width 59: "this part" +- RenderText {#text} at (400,0) size 33x18 +- text run at (400,0) width 33: ", but " +- RenderInline {EM} at (0,0) size 194x18 +- RenderText {#text} at (432,0) size 194x18 +- text run at (432,0) width 194: "this part should be underlined" +- RenderText {#text} at (625,0) size 5x18 +- text run at (625,0) width 5: "." +diff --git a/LayoutTests/platform/mac-mojave/css2.1/t0805-c5522-brdr-02-e-expected.txt b/LayoutTests/platform/mac-mojave/css2.1/t0805-c5522-brdr-02-e-expected.txt +deleted file mode 100644 +index f83d6166f78204407e18829ad73a6bb53cf7cbd9..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/css2.1/t0805-c5522-brdr-02-e-expected.txt ++++ /dev/null +@@ -1,30 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x80 +- RenderBlock {HTML} at (0,0) size 800x80 +- RenderBody {BODY} at (8,8) size 784x64 [color=#0000FF] +- RenderTable {TABLE} at (0,0) size 721x64 +- RenderTableSection {TBODY} at (0,0) size 721x64 +- RenderTableRow {TR} at (0,2) size 721x24 +- RenderTableCell {TD} at (2,2) size 717x24 [border: (2px solid #0000FF)] [r=0 c=0 rs=1 cs=2] +- RenderText {#text} at (3,3) size 331x18 +- text run at (3,3) width 331: "There should be a blue border around this sentence." +- RenderTableRow {TR} at (0,28) size 721x34 +- RenderTableCell {TD} at (2,33) size 337x24 [border: (2px solid #0000FF)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (3,3) size 331x18 +- text run at (3,3) width 331: "There should be a blue border around this sentence." +- RenderTableCell {TD} at (340,28) size 379x34 [border: (2px solid #0000FF)] [r=1 c=1 rs=1 cs=1] +- RenderTable {TABLE} at (3,3) size 373x28 +- RenderTableSection {TBODY} at (0,0) size 373x28 +- RenderTableRow {TR} at (0,2) size 373x24 +- RenderTableCell {TD} at (2,2) size 369x24 [border: (2px solid #0000FF)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (3,3) size 108x18 +- text run at (3,3) width 108: "There should be " +- RenderInline {STRONG} at (0,0) size 117x18 +- RenderInline {EM} at (0,0) size 27x18 +- RenderText {#text} at (110,3) size 27x18 +- text run at (110,3) width 27: "two" +- RenderText {#text} at (136,3) size 91x18 +- text run at (136,3) width 91: " blue borders" +- RenderText {#text} at (226,3) size 140x18 +- text run at (226,3) width 140: " around this sentence." +diff --git a/LayoutTests/platform/mac-mojave/css2.1/t1202-counter-09-b-expected.txt b/LayoutTests/platform/mac-mojave/css2.1/t1202-counter-09-b-expected.txt +deleted file mode 100644 +index ca2b1ed7d24645060310a3c9124cc27c1f364512..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/css2.1/t1202-counter-09-b-expected.txt ++++ /dev/null +@@ -1,290 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x94 +- RenderBlock {HTML} at (0,0) size 800x94 +- RenderBody {BODY} at (8,16) size 784x70 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 298x18 +- text run at (0,0) width 298: "The following two lines should look the same:" +- RenderBlock {DIV} at (0,34) size 784x18 +- RenderInline {SPAN} at (0,0) size 8x18 +- RenderInline (generated) at (0,0) size 8x18 +- RenderCounter at (0,0) size 8x18 +- text run at (0,0) width 8: "\x{10D0}" +- RenderText {#text} at (7,0) size 5x18 +- text run at (7,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 10x18 +- RenderInline (generated) at (0,0) size 10x18 +- RenderCounter at (11,0) size 10x18 +- text run at (11,0) width 10: "\x{10D1}" +- RenderText {#text} at (20,0) size 5x18 +- text run at (20,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 10x18 +- RenderInline (generated) at (0,0) size 10x18 +- RenderCounter at (24,0) size 10x18 +- text run at (24,0) width 10: "\x{10D2}" +- RenderText {#text} at (33,0) size 5x18 +- text run at (33,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 17x18 +- RenderInline (generated) at (0,0) size 17x18 +- RenderCounter at (37,0) size 17x18 +- text run at (37,0) width 17: "\x{10D3}" +- RenderText {#text} at (53,0) size 5x18 +- text run at (53,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (57,0) size 9x18 +- text run at (57,0) width 9: "\x{10D4}" +- RenderText {#text} at (65,0) size 5x18 +- text run at (65,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 10x18 +- RenderInline (generated) at (0,0) size 10x18 +- RenderCounter at (69,0) size 10x18 +- text run at (69,0) width 10: "\x{10D5}" +- RenderText {#text} at (78,0) size 5x18 +- text run at (78,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 12x18 +- RenderInline (generated) at (0,0) size 12x18 +- RenderCounter at (82,0) size 12x18 +- text run at (82,0) width 12: "\x{10D6}" +- RenderText {#text} at (93,0) size 5x18 +- text run at (93,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 12x18 +- RenderInline (generated) at (0,0) size 12x18 +- RenderCounter at (97,0) size 12x18 +- text run at (97,0) width 12: "\x{10F1}" +- RenderText {#text} at (108,0) size 5x18 +- text run at (108,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 16x18 +- RenderInline (generated) at (0,0) size 16x18 +- RenderCounter at (112,0) size 16x18 +- text run at (112,0) width 16: "\x{10D7}" +- RenderText {#text} at (127,0) size 5x18 +- text run at (127,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 11x18 +- RenderInline (generated) at (0,0) size 11x18 +- RenderCounter at (131,0) size 11x18 +- text run at (131,0) width 11: "\x{10D8}" +- RenderText {#text} at (141,0) size 5x18 +- text run at (141,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 18x18 +- RenderInline (generated) at (0,0) size 18x18 +- RenderCounter at (145,0) size 18x18 +- text run at (145,0) width 18: "\x{10D8}\x{10D0}" +- RenderText {#text} at (162,0) size 5x18 +- text run at (162,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 19x18 +- RenderInline (generated) at (0,0) size 19x18 +- RenderCounter at (166,0) size 19x18 +- text run at (166,0) width 19: "\x{10D8}\x{10D1}" +- RenderText {#text} at (184,0) size 5x18 +- text run at (184,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (188,0) size 9x18 +- text run at (188,0) width 9: "\x{10D9}" +- RenderText {#text} at (196,0) size 5x18 +- text run at (196,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderInline (generated) at (0,0) size 20x18 +- RenderCounter at (200,0) size 20x18 +- text run at (200,0) width 20: "\x{10DA}" +- RenderText {#text} at (219,0) size 5x18 +- text run at (219,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (223,0) size 9x18 +- text run at (223,0) width 9: "\x{10DB}" +- RenderText {#text} at (231,0) size 5x18 +- text run at (231,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (235,0) size 9x18 +- text run at (235,0) width 9: "\x{10DC}" +- RenderText {#text} at (243,0) size 5x18 +- text run at (243,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 10x18 +- RenderInline (generated) at (0,0) size 10x18 +- RenderCounter at (247,0) size 10x18 +- text run at (247,0) width 10: "\x{10F2}" +- RenderText {#text} at (256,0) size 5x18 +- text run at (256,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 15x18 +- RenderInline (generated) at (0,0) size 15x18 +- RenderCounter at (260,0) size 15x18 +- text run at (260,0) width 15: "\x{10DD}" +- RenderText {#text} at (274,0) size 5x18 +- text run at (274,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (278,0) size 9x18 +- text run at (278,0) width 9: "\x{10DE}" +- RenderText {#text} at (286,0) size 5x18 +- text run at (286,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 10x18 +- RenderInline (generated) at (0,0) size 10x18 +- RenderCounter at (290,0) size 10x18 +- text run at (290,0) width 10: "\x{10DF}" +- RenderText {#text} at (299,0) size 5x18 +- text run at (299,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 14x18 +- RenderInline (generated) at (0,0) size 14x18 +- RenderCounter at (303,0) size 14x18 +- text run at (303,0) width 14: "\x{10E0}" +- RenderText {#text} at (316,0) size 5x18 +- text run at (316,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (320,0) size 9x18 +- text run at (320,0) width 9: "\x{10E1}" +- RenderText {#text} at (328,0) size 5x18 +- text run at (328,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 14x18 +- RenderInline (generated) at (0,0) size 14x18 +- RenderCounter at (332,0) size 14x18 +- text run at (332,0) width 14: "\x{10E2}" +- RenderText {#text} at (345,0) size 5x18 +- text run at (345,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (349,0) size 9x18 +- text run at (349,0) width 9: "\x{10F3}" +- RenderText {#text} at (357,0) size 5x18 +- text run at (357,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 14x18 +- RenderInline (generated) at (0,0) size 14x18 +- RenderCounter at (361,0) size 14x18 +- text run at (361,0) width 14: "\x{10E4}" +- RenderText {#text} at (374,0) size 5x18 +- text run at (374,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (378,0) size 9x18 +- text run at (378,0) width 9: "\x{10E5}" +- RenderText {#text} at (386,0) size 5x18 +- text run at (386,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 14x18 +- RenderInline (generated) at (0,0) size 14x18 +- RenderCounter at (390,0) size 14x18 +- text run at (390,0) width 14: "\x{10E6}" +- RenderText {#text} at (403,0) size 5x18 +- text run at (403,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 8x18 +- RenderInline (generated) at (0,0) size 8x18 +- RenderCounter at (407,0) size 8x18 +- text run at (407,0) width 8: "\x{10E7}" +- RenderText {#text} at (414,0) size 5x18 +- text run at (414,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 10x18 +- RenderInline (generated) at (0,0) size 10x18 +- RenderCounter at (418,0) size 10x18 +- text run at (418,0) width 10: "\x{10E8}" +- RenderText {#text} at (427,0) size 5x18 +- text run at (427,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 8x18 +- RenderInline (generated) at (0,0) size 8x18 +- RenderCounter at (431,0) size 8x18 +- text run at (431,0) width 8: "\x{10E9}" +- RenderText {#text} at (438,0) size 5x18 +- text run at (438,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 10x18 +- RenderInline (generated) at (0,0) size 10x18 +- RenderCounter at (442,0) size 10x18 +- text run at (442,0) width 10: "\x{10EA}" +- RenderText {#text} at (451,0) size 5x18 +- text run at (451,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 10x18 +- RenderInline (generated) at (0,0) size 10x18 +- RenderCounter at (455,0) size 10x18 +- text run at (455,0) width 10: "\x{10EB}" +- RenderText {#text} at (464,0) size 5x18 +- text run at (464,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (468,0) size 9x18 +- text run at (468,0) width 9: "\x{10EC}" +- RenderText {#text} at (476,0) size 5x18 +- text run at (476,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 10x18 +- RenderInline (generated) at (0,0) size 10x18 +- RenderCounter at (480,0) size 10x18 +- text run at (480,0) width 10: "\x{10ED}" +- RenderText {#text} at (489,0) size 5x18 +- text run at (489,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (493,0) size 9x18 +- text run at (493,0) width 9: "\x{10EE}" +- RenderText {#text} at (501,0) size 5x18 +- text run at (501,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (505,0) size 9x18 +- text run at (505,0) width 9: "\x{10F4}" +- RenderText {#text} at (513,0) size 5x18 +- text run at (513,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 13x18 +- RenderInline (generated) at (0,0) size 13x18 +- RenderCounter at (517,0) size 13x18 +- text run at (517,0) width 13: "\x{10EF}" +- RenderText {#text} at (529,0) size 5x18 +- text run at (529,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 9x18 +- RenderInline (generated) at (0,0) size 9x18 +- RenderCounter at (533,0) size 9x18 +- text run at (533,0) width 9: "\x{10F0}" +- RenderText {#text} at (541,0) size 5x18 +- text run at (541,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 10x18 +- RenderInline (generated) at (0,0) size 10x18 +- RenderCounter at (545,0) size 10x18 +- text run at (545,0) width 10: "\x{10F5}" +- RenderText {#text} at (554,0) size 5x18 +- text run at (554,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 49x18 +- RenderInline (generated) at (0,0) size 49x18 +- RenderCounter at (558,0) size 49x18 +- text run at (558,0) width 49: "\x{10F5}\x{10F0}\x{10E8}\x{10DF}\x{10D7}" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (0,52) size 784x18 +- RenderText {#text} at (0,0) size 607x18 +- text run at (0,0) width 12: "\x{10D0} " +- text run at (11,0) width 14: "\x{10D1} " +- text run at (24,0) width 14: "\x{10D2} " +- text run at (37,0) width 21: "\x{10D3} " +- text run at (57,0) width 13: "\x{10D4} " +- text run at (69,0) width 14: "\x{10D5} " +- text run at (82,0) width 16: "\x{10D6} " +- text run at (97,0) width 16: "\x{10F1} " +- text run at (112,0) width 20: "\x{10D7} " +- text run at (131,0) width 15: "\x{10D8} " +- text run at (145,0) width 22: "\x{10D8}\x{10D0} " +- text run at (166,0) width 23: "\x{10D8}\x{10D1} " +- text run at (188,0) width 13: "\x{10D9} " +- text run at (200,0) width 24: "\x{10DA} " +- text run at (223,0) width 13: "\x{10DB} " +- text run at (235,0) width 13: "\x{10DC} " +- text run at (247,0) width 14: "\x{10F2} " +- text run at (260,0) width 19: "\x{10DD} " +- text run at (278,0) width 13: "\x{10DE} " +- text run at (290,0) width 14: "\x{10DF} " +- text run at (303,0) width 18: "\x{10E0} " +- text run at (320,0) width 13: "\x{10E1} " +- text run at (332,0) width 18: "\x{10E2} " +- text run at (349,0) width 13: "\x{10F3} " +- text run at (361,0) width 18: "\x{10E4} " +- text run at (378,0) width 13: "\x{10E5} " +- text run at (390,0) width 18: "\x{10E6} " +- text run at (407,0) width 12: "\x{10E7} " +- text run at (418,0) width 14: "\x{10E8} " +- text run at (431,0) width 12: "\x{10E9} " +- text run at (442,0) width 14: "\x{10EA} " +- text run at (455,0) width 14: "\x{10EB} " +- text run at (468,0) width 13: "\x{10EC} " +- text run at (480,0) width 14: "\x{10ED} " +- text run at (493,0) width 13: "\x{10EE} " +- text run at (505,0) width 13: "\x{10F4} " +- text run at (517,0) width 17: "\x{10EF} " +- text run at (533,0) width 13: "\x{10F0} " +- text run at (545,0) width 14: "\x{10F5} " +- text run at (558,0) width 49: "\x{10F5}\x{10F0}\x{10E8}\x{10DF}\x{10D7}" +diff --git a/LayoutTests/platform/mac-mojave/css2.1/t1202-counters-09-b-expected.txt b/LayoutTests/platform/mac-mojave/css2.1/t1202-counters-09-b-expected.txt +deleted file mode 100644 +index 3804249b10cd3d22702b3ac77cf432d0427668f5..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/css2.1/t1202-counters-09-b-expected.txt ++++ /dev/null +@@ -1,290 +0,0 @@ +-layer at (0,0) size 1072x585 +- RenderView at (0,0) size 800x585 +-layer at (0,0) size 800x94 +- RenderBlock {HTML} at (0,0) size 800x94 +- RenderBody {BODY} at (8,16) size 784x70 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 298x18 +- text run at (0,0) width 298: "The following two lines should look the same:" +- RenderBlock {DIV} at (0,34) size 784x18 +- RenderInline {SPAN} at (0,0) size 19x18 +- RenderInline (generated) at (0,0) size 19x18 +- RenderCounter at (0,0) size 19x18 +- text run at (0,0) width 19: "\x{10D0}.\x{10D0}" +- RenderText {#text} at (18,0) size 5x18 +- text run at (18,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 22x18 +- RenderInline (generated) at (0,0) size 22x18 +- RenderCounter at (22,0) size 22x18 +- text run at (22,0) width 22: "\x{10D0}.\x{10D1}" +- RenderText {#text} at (43,0) size 5x18 +- text run at (43,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 22x18 +- RenderInline (generated) at (0,0) size 22x18 +- RenderCounter at (47,0) size 22x18 +- text run at (47,0) width 22: "\x{10D0}.\x{10D2}" +- RenderText {#text} at (68,0) size 5x18 +- text run at (68,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 27x18 +- RenderInline (generated) at (0,0) size 27x18 +- RenderCounter at (72,0) size 27x18 +- text run at (72,0) width 27: "\x{10D0}.\x{10D3}" +- RenderText {#text} at (98,0) size 5x18 +- text run at (98,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 21x18 +- RenderInline (generated) at (0,0) size 21x18 +- RenderCounter at (102,0) size 21x18 +- text run at (102,0) width 21: "\x{10D0}.\x{10D4}" +- RenderText {#text} at (122,0) size 5x18 +- text run at (122,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 21x18 +- RenderInline (generated) at (0,0) size 21x18 +- RenderCounter at (126,0) size 21x18 +- text run at (126,0) width 21: "\x{10D0}.\x{10D5}" +- RenderText {#text} at (146,0) size 5x18 +- text run at (146,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 24x18 +- RenderInline (generated) at (0,0) size 24x18 +- RenderCounter at (150,0) size 24x18 +- text run at (150,0) width 24: "\x{10D0}.\x{10D6}" +- RenderText {#text} at (173,0) size 5x18 +- text run at (173,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 23x18 +- RenderInline (generated) at (0,0) size 23x18 +- RenderCounter at (177,0) size 23x18 +- text run at (177,0) width 23: "\x{10D0}.\x{10F1}" +- RenderText {#text} at (199,0) size 5x18 +- text run at (199,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 28x18 +- RenderInline (generated) at (0,0) size 28x18 +- RenderCounter at (203,0) size 28x18 +- text run at (203,0) width 28: "\x{10D0}.\x{10D7}" +- RenderText {#text} at (230,0) size 5x18 +- text run at (230,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 22x18 +- RenderInline (generated) at (0,0) size 22x18 +- RenderCounter at (234,0) size 22x18 +- text run at (234,0) width 22: "\x{10D0}.\x{10D8}" +- RenderText {#text} at (255,0) size 5x18 +- text run at (255,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 29x18 +- RenderInline (generated) at (0,0) size 29x18 +- RenderCounter at (259,0) size 29x18 +- text run at (259,0) width 29: "\x{10D0}.\x{10D8}\x{10D0}" +- RenderText {#text} at (287,0) size 5x18 +- text run at (287,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 32x18 +- RenderInline (generated) at (0,0) size 32x18 +- RenderCounter at (291,0) size 32x18 +- text run at (291,0) width 32: "\x{10D0}.\x{10D8}\x{10D1}" +- RenderText {#text} at (322,0) size 5x18 +- text run at (322,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderInline (generated) at (0,0) size 20x18 +- RenderCounter at (326,0) size 20x18 +- text run at (326,0) width 20: "\x{10D0}.\x{10D9}" +- RenderText {#text} at (345,0) size 5x18 +- text run at (345,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 31x18 +- RenderInline (generated) at (0,0) size 31x18 +- RenderCounter at (349,0) size 31x18 +- text run at (349,0) width 31: "\x{10D0}.\x{10DA}" +- RenderText {#text} at (379,0) size 5x18 +- text run at (379,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderInline (generated) at (0,0) size 20x18 +- RenderCounter at (383,0) size 20x18 +- text run at (383,0) width 20: "\x{10D0}.\x{10DB}" +- RenderText {#text} at (402,0) size 5x18 +- text run at (402,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 21x18 +- RenderInline (generated) at (0,0) size 21x18 +- RenderCounter at (406,0) size 21x18 +- text run at (406,0) width 21: "\x{10D0}.\x{10DC}" +- RenderText {#text} at (426,0) size 5x18 +- text run at (426,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 22x18 +- RenderInline (generated) at (0,0) size 22x18 +- RenderCounter at (430,0) size 22x18 +- text run at (430,0) width 22: "\x{10D0}.\x{10F2}" +- RenderText {#text} at (451,0) size 5x18 +- text run at (451,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 26x18 +- RenderInline (generated) at (0,0) size 26x18 +- RenderCounter at (455,0) size 26x18 +- text run at (455,0) width 26: "\x{10D0}.\x{10DD}" +- RenderText {#text} at (480,0) size 5x18 +- text run at (480,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderInline (generated) at (0,0) size 20x18 +- RenderCounter at (484,0) size 20x18 +- text run at (484,0) width 20: "\x{10D0}.\x{10DE}" +- RenderText {#text} at (503,0) size 5x18 +- text run at (503,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 22x18 +- RenderInline (generated) at (0,0) size 22x18 +- RenderCounter at (507,0) size 22x18 +- text run at (507,0) width 22: "\x{10D0}.\x{10DF}" +- RenderText {#text} at (528,0) size 5x18 +- text run at (528,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 25x18 +- RenderInline (generated) at (0,0) size 25x18 +- RenderCounter at (532,0) size 25x18 +- text run at (532,0) width 25: "\x{10D0}.\x{10E0}" +- RenderText {#text} at (556,0) size 5x18 +- text run at (556,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 21x18 +- RenderInline (generated) at (0,0) size 21x18 +- RenderCounter at (560,0) size 21x18 +- text run at (560,0) width 21: "\x{10D0}.\x{10E1}" +- RenderText {#text} at (580,0) size 5x18 +- text run at (580,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 24x18 +- RenderInline (generated) at (0,0) size 24x18 +- RenderCounter at (584,0) size 24x18 +- text run at (584,0) width 24: "\x{10D0}.\x{10E2}" +- RenderText {#text} at (607,0) size 5x18 +- text run at (607,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 22x18 +- RenderInline (generated) at (0,0) size 22x18 +- RenderCounter at (611,0) size 22x18 +- text run at (611,0) width 22: "\x{10D0}.\x{10F3}" +- RenderText {#text} at (632,0) size 5x18 +- text run at (632,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 24x18 +- RenderInline (generated) at (0,0) size 24x18 +- RenderCounter at (636,0) size 24x18 +- text run at (636,0) width 24: "\x{10D0}.\x{10E4}" +- RenderText {#text} at (659,0) size 5x18 +- text run at (659,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 21x18 +- RenderInline (generated) at (0,0) size 21x18 +- RenderCounter at (663,0) size 21x18 +- text run at (663,0) width 21: "\x{10D0}.\x{10E5}" +- RenderText {#text} at (683,0) size 5x18 +- text run at (683,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 25x18 +- RenderInline (generated) at (0,0) size 25x18 +- RenderCounter at (687,0) size 25x18 +- text run at (687,0) width 25: "\x{10D0}.\x{10E6}" +- RenderText {#text} at (711,0) size 5x18 +- text run at (711,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderInline (generated) at (0,0) size 20x18 +- RenderCounter at (715,0) size 20x18 +- text run at (715,0) width 20: "\x{10D0}.\x{10E7}" +- RenderText {#text} at (734,0) size 5x18 +- text run at (734,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 21x18 +- RenderInline (generated) at (0,0) size 21x18 +- RenderCounter at (738,0) size 21x18 +- text run at (738,0) width 21: "\x{10D0}.\x{10E8}" +- RenderText {#text} at (758,0) size 5x18 +- text run at (758,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderInline (generated) at (0,0) size 20x18 +- RenderCounter at (762,0) size 20x18 +- text run at (762,0) width 20: "\x{10D0}.\x{10E9}" +- RenderText {#text} at (781,0) size 5x18 +- text run at (781,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 22x18 +- RenderInline (generated) at (0,0) size 22x18 +- RenderCounter at (785,0) size 22x18 +- text run at (785,0) width 22: "\x{10D0}.\x{10EA}" +- RenderText {#text} at (806,0) size 5x18 +- text run at (806,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderInline (generated) at (0,0) size 20x18 +- RenderCounter at (810,0) size 20x18 +- text run at (810,0) width 20: "\x{10D0}.\x{10EB}" +- RenderText {#text} at (829,0) size 5x18 +- text run at (829,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 21x18 +- RenderInline (generated) at (0,0) size 21x18 +- RenderCounter at (833,0) size 21x18 +- text run at (833,0) width 21: "\x{10D0}.\x{10EC}" +- RenderText {#text} at (853,0) size 5x18 +- text run at (853,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 22x18 +- RenderInline (generated) at (0,0) size 22x18 +- RenderCounter at (857,0) size 22x18 +- text run at (857,0) width 22: "\x{10D0}.\x{10ED}" +- RenderText {#text} at (878,0) size 5x18 +- text run at (878,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderInline (generated) at (0,0) size 20x18 +- RenderCounter at (882,0) size 20x18 +- text run at (882,0) width 20: "\x{10D0}.\x{10EE}" +- RenderText {#text} at (901,0) size 5x18 +- text run at (901,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderInline (generated) at (0,0) size 20x18 +- RenderCounter at (905,0) size 20x18 +- text run at (905,0) width 20: "\x{10D0}.\x{10F4}" +- RenderText {#text} at (924,0) size 5x18 +- text run at (924,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 25x18 +- RenderInline (generated) at (0,0) size 25x18 +- RenderCounter at (928,0) size 25x18 +- text run at (928,0) width 25: "\x{10D0}.\x{10EF}" +- RenderText {#text} at (952,0) size 5x18 +- text run at (952,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderInline (generated) at (0,0) size 20x18 +- RenderCounter at (956,0) size 20x18 +- text run at (956,0) width 20: "\x{10D0}.\x{10F0}" +- RenderText {#text} at (975,0) size 5x18 +- text run at (975,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 21x18 +- RenderInline (generated) at (0,0) size 21x18 +- RenderCounter at (979,0) size 21x18 +- text run at (979,0) width 21: "\x{10D0}.\x{10F5}" +- RenderText {#text} at (999,0) size 5x18 +- text run at (999,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 62x18 +- RenderInline (generated) at (0,0) size 62x18 +- RenderCounter at (1003,0) size 62x18 +- text run at (1003,0) width 62: "\x{10D0}.\x{10F5}\x{10F0}\x{10E8}\x{10DF}\x{10D7}" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (0,52) size 784x18 +- RenderText {#text} at (0,0) size 1065x18 +- text run at (0,0) width 23: "\x{10D0}.\x{10D0} " +- text run at (22,0) width 26: "\x{10D0}.\x{10D1} " +- text run at (47,0) width 26: "\x{10D0}.\x{10D2} " +- text run at (72,0) width 31: "\x{10D0}.\x{10D3} " +- text run at (102,0) width 25: "\x{10D0}.\x{10D4} " +- text run at (126,0) width 25: "\x{10D0}.\x{10D5} " +- text run at (150,0) width 28: "\x{10D0}.\x{10D6} " +- text run at (177,0) width 27: "\x{10D0}.\x{10F1} " +- text run at (203,0) width 32: "\x{10D0}.\x{10D7} " +- text run at (234,0) width 26: "\x{10D0}.\x{10D8} " +- text run at (259,0) width 33: "\x{10D0}.\x{10D8}\x{10D0} " +- text run at (291,0) width 36: "\x{10D0}.\x{10D8}\x{10D1} " +- text run at (326,0) width 24: "\x{10D0}.\x{10D9} " +- text run at (349,0) width 35: "\x{10D0}.\x{10DA} " +- text run at (383,0) width 24: "\x{10D0}.\x{10DB} " +- text run at (406,0) width 25: "\x{10D0}.\x{10DC} " +- text run at (430,0) width 26: "\x{10D0}.\x{10F2} " +- text run at (455,0) width 30: "\x{10D0}.\x{10DD} " +- text run at (484,0) width 24: "\x{10D0}.\x{10DE} " +- text run at (507,0) width 26: "\x{10D0}.\x{10DF} " +- text run at (532,0) width 29: "\x{10D0}.\x{10E0} " +- text run at (560,0) width 25: "\x{10D0}.\x{10E1} " +- text run at (584,0) width 28: "\x{10D0}.\x{10E2} " +- text run at (611,0) width 26: "\x{10D0}.\x{10F3} " +- text run at (636,0) width 28: "\x{10D0}.\x{10E4} " +- text run at (663,0) width 25: "\x{10D0}.\x{10E5} " +- text run at (687,0) width 29: "\x{10D0}.\x{10E6} " +- text run at (715,0) width 24: "\x{10D0}.\x{10E7} " +- text run at (738,0) width 25: "\x{10D0}.\x{10E8} " +- text run at (762,0) width 24: "\x{10D0}.\x{10E9} " +- text run at (785,0) width 26: "\x{10D0}.\x{10EA} " +- text run at (810,0) width 24: "\x{10D0}.\x{10EB} " +- text run at (833,0) width 25: "\x{10D0}.\x{10EC} " +- text run at (857,0) width 26: "\x{10D0}.\x{10ED} " +- text run at (882,0) width 24: "\x{10D0}.\x{10EE} " +- text run at (905,0) width 24: "\x{10D0}.\x{10F4} " +- text run at (928,0) width 29: "\x{10D0}.\x{10EF} " +- text run at (956,0) width 24: "\x{10D0}.\x{10F0} " +- text run at (979,0) width 25: "\x{10D0}.\x{10F5} " +- text run at (1003,0) width 62: "\x{10D0}.\x{10F5}\x{10F0}\x{10E8}\x{10DF}\x{10D7}" +diff --git a/LayoutTests/platform/mac-mojave/editing/input/reveal-caret-of-multiline-input-expected.txt b/LayoutTests/platform/mac-mojave/editing/input/reveal-caret-of-multiline-input-expected.txt +deleted file mode 100644 +index 8371300933be24061b839fbf543bd99a77b21abb..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/editing/input/reveal-caret-of-multiline-input-expected.txt ++++ /dev/null +@@ -1,79 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x178 +- RenderBlock {HTML} at (0,0) size 800x178 +- RenderBody {BODY} at (8,8) size 784x162 +- RenderBlock {DIV} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 610x18 +- text run at (0,0) width 610: "When the caret is scrolled out, on starting typing it must be brought to the center of the control." +- RenderBlock (anonymous) at (0,18) size 784x144 +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +-layer at (10,28) size 91x136 clip at (11,29) size 74x134 scrollY 98 scrollHeight 420 +- RenderTextControl {TEXTAREA} at (2,2) size 91x136 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 70x416 +- RenderText {#text} at (0,0) size 20x403 +- text run at (0,0) width 14: "00" +- text run at (13,0) width 1: " " +- text run at (0,13) width 13: "01" +- text run at (12,13) width 1: " " +- text run at (0,26) width 14: "02" +- text run at (13,26) width 1: " " +- text run at (0,39) width 14: "03" +- text run at (13,39) width 1: " " +- text run at (0,52) width 15: "04" +- text run at (14,52) width 1: " " +- text run at (0,65) width 14: "05" +- text run at (13,65) width 1: " " +- text run at (0,78) width 15: "06" +- text run at (14,78) width 1: " " +- text run at (0,91) width 14: "07" +- text run at (13,91) width 1: " " +- text run at (0,104) width 15: "08" +- text run at (14,104) width 1: " " +- text run at (0,117) width 15: "09" +- text run at (14,117) width 1: " " +- text run at (0,130) width 13: "10" +- text run at (12,130) width 1: " " +- text run at (0,143) width 11: "11" +- text run at (10,143) width 1: " " +- text run at (0,156) width 20: ">12" +- text run at (19,156) width 1: " " +- text run at (0,169) width 13: "13" +- text run at (12,169) width 1: " " +- text run at (0,182) width 13: "14" +- text run at (12,182) width 1: " " +- text run at (0,195) width 13: "15" +- text run at (12,195) width 1: " " +- text run at (0,208) width 13: "16" +- text run at (12,208) width 1: " " +- text run at (0,221) width 12: "17" +- text run at (11,221) width 1: " " +- text run at (0,234) width 13: "18" +- text run at (12,234) width 1: " " +- text run at (0,247) width 13: "19" +- text run at (12,247) width 1: " " +- text run at (0,260) width 14: "20" +- text run at (13,260) width 1: " " +- text run at (0,273) width 12: "21" +- text run at (11,273) width 1: " " +- text run at (0,286) width 14: "22" +- text run at (13,286) width 1: " " +- text run at (0,299) width 14: "23" +- text run at (13,299) width 1: " " +- text run at (0,312) width 14: "24" +- text run at (13,312) width 1: " " +- text run at (0,325) width 14: "25" +- text run at (13,325) width 1: " " +- text run at (0,338) width 14: "26" +- text run at (13,338) width 1: " " +- text run at (0,351) width 14: "27" +- text run at (13,351) width 1: " " +- text run at (0,364) width 14: "28" +- text run at (13,364) width 1: " " +- text run at (0,377) width 14: "29" +- text run at (13,377) width 1: " " +- text run at (0,390) width 14: "30" +- text run at (13,390) width 1: " " +- RenderBR {BR} at (0,403) size 0x13 +-caret: position 37 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 3 {TEXTAREA} of body +diff --git a/LayoutTests/platform/mac-mojave/editing/mac/selection/context-menu-select-editability-expected.txt b/LayoutTests/platform/mac-mojave/editing/mac/selection/context-menu-select-editability-expected.txt +deleted file mode 100644 +index ab1a5b58b88846211a308b966d90868c86acb21f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/editing/mac/selection/context-menu-select-editability-expected.txt ++++ /dev/null +@@ -1,15 +0,0 @@ +-This test checks that conext menu selection allows whitespace for non-editable fields. To test manually, right click on the blank text in the input box. +- +-The crowd says: New York, New York is a helluva town! +-The crowd says: New York, New York is a helluva town! +- +- +- +- +-PASS getSelectionForId('inputWhitespace') is "" +-FAIL getSelectionForId('readOnlyWhitespace') should be . Was New York, New York. +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/editing/selection/3690703-2-expected.txt b/LayoutTests/platform/mac-mojave/editing/selection/3690703-2-expected.txt +deleted file mode 100644 +index 283acc28ea0f3bd919e904086c0f8e3a7b2d1201..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/editing/selection/3690703-2-expected.txt ++++ /dev/null +@@ -1,152 +0,0 @@ +-EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of DIV > CENTER > BODY > HTML > #document to 6 of DIV > CENTER > BODY > HTML > #document +-EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,3) size 784x581 [bgcolor=#FFFFFF] +- RenderBlock {CENTER} at (0,0) size 784x258 +- RenderTable {TABLE} at (0,0) size 784x19 +- RenderTableSection {TBODY} at (0,0) size 784x19 +- RenderTableRow {TR} at (0,0) size 784x15 +- RenderTableCell {TD} at (0,0) size 784x15 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 102x15 +- RenderInline {A} at (0,0) size 102x15 [color=#0000CC] +- RenderText {#text} at (682,0) size 102x15 +- text run at (682,0) width 102: "Personalized Home" +- RenderTableRow {TR} at (0,15) size 784x4 +- RenderTableCell {TD} at (0,16) size 784x2 [r=1 c=0 rs=1 cs=1] +- RenderImage {IMG} at (0,0) size 1x1 +- RenderBlock (anonymous) at (0,19) size 784x36 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBlock {DIV} at (0,55) size 784x105 [border: (2px solid #AAAAFF)] +- RenderTable {TABLE} at (214,2) size 355x23 +- RenderTableSection {TBODY} at (0,0) size 355x23 +- RenderTableRow {TR} at (0,0) size 355x23 +- RenderTableCell {TD} at (0,0) size 355x23 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 347x15 +- RenderInline {B} at (0,0) size 26x15 +- RenderText {#text} at (4,4) size 26x15 +- text run at (4,4) width 26: "Web" +- RenderText {#text} at (29,4) size 14x15 +- text run at (29,4) width 14: " " +- RenderInline {A} at (0,0) size 38x15 [color=#0000CC] +- RenderText {#text} at (42,4) size 38x15 +- text run at (42,4) width 38: "Images" +- RenderText {#text} at (79,4) size 14x15 +- text run at (79,4) width 14: " " +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (92,4) size 40x15 +- text run at (92,4) width 40: "Groups" +- RenderText {#text} at (131,4) size 14x15 +- text run at (131,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (144,4) size 30x15 +- text run at (144,4) width 30: "News" +- RenderText {#text} at (173,4) size 14x15 +- text run at (173,4) width 14: " " +- RenderInline {A} at (0,0) size 42x15 [color=#0000CC] +- RenderText {#text} at (186,4) size 42x15 +- text run at (186,4) width 42: "Froogle" +- RenderText {#text} at (227,4) size 14x15 +- text run at (227,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (240,4) size 30x15 +- text run at (240,4) width 30: "Local" +- RenderInline {SUP} at (0,0) size 1x13 +- RenderInline {A} at (0,0) size 30x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (269,4) size 30x15 +- text run at (269,4) width 30: "New!" +- RenderText {#text} at (298,4) size 14x15 +- text run at (298,4) width 14: " " +- RenderInline {B} at (0,0) size 40x15 +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (311,4) size 40x15 +- text run at (311,4) width 40: "more \x{BB}" +- RenderTable {TABLE} at (2,25) size 780x45 +- RenderTableSection {TBODY} at (0,0) size 780x45 +- RenderTableRow {TR} at (0,0) size 780x45 +- RenderTableCell {TD} at (0,13) size 192x19 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (0,0) size 4x19 +- text run at (0,1) width 4: " " +- RenderTableCell {TD} at (191,0) size 397x45 [r=0 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (2,2) size 392x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (395,2) size 1x18 +- RenderButton {INPUT} at (95,25) size 94x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 77x13 +- RenderText at (0,0) size 77x13 +- text run at (0,0) width 77: "Google Search" +- RenderButton {INPUT} at (192,25) size 108x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 91x13 +- RenderText at (0,0) size 91x13 +- text run at (0,0) width 91: "I'm Feeling Lucky" +- RenderTableCell {TD} at (587,0) size 194x39 [r=0 c=2 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 76x39 +- RenderText {#text} at (0,0) size 5x13 +- text run at (0,0) width 5: " " +- RenderInline {A} at (0,0) size 71x13 [color=#0000CC] +- RenderText {#text} at (5,0) size 71x13 +- text run at (5,0) width 71: "Advanced Search" +- RenderBR {BR} at (75,0) size 1x13 +- RenderText {#text} at (0,13) size 5x13 +- text run at (0,13) width 5: " " +- RenderInline {A} at (0,0) size 47x13 [color=#0000CC] +- RenderText {#text} at (5,13) size 47x13 +- text run at (5,13) width 47: "Preferences" +- RenderBR {BR} at (51,13) size 1x13 +- RenderText {#text} at (0,26) size 5x13 +- text run at (0,26) width 5: " " +- RenderInline {A} at (0,0) size 65x13 [color=#0000CC] +- RenderText {#text} at (5,26) size 65x13 +- text run at (5,26) width 65: "Language Tools" +- RenderBlock (anonymous) at (2,70) size 780x33 +- RenderBR {BR} at (390,0) size 0x18 +- RenderInline {FONT} at (0,0) size 146x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (317,18) size 30x15 +- text run at (317,18) width 30: "New!" +- RenderText {#text} at (346,18) size 4x15 +- text run at (346,18) width 4: " " +- RenderInline {A} at (0,0) size 111x15 [color=#0000CC] +- RenderText {#text} at (349,18) size 111x15 +- text run at (349,18) width 111: "Personalize this page" +- RenderText {#text} at (459,18) size 4x15 +- text run at (459,18) width 4: "." +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,160) size 784x69 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBR {BR} at (392,36) size 0x18 +- RenderInline {FONT} at (0,0) size 310x15 +- RenderInline {A} at (0,0) size 116x15 [color=#0000CC] +- RenderText {#text} at (237,54) size 116x15 +- text run at (237,54) width 116: "Advertising Programs" +- RenderText {#text} at (352,54) size 11x15 +- text run at (352,54) width 11: " - " +- RenderInline {A} at (0,0) size 100x15 [color=#0000CC] +- RenderText {#text} at (362,54) size 100x15 +- text run at (362,54) width 100: "Business Solutions" +- RenderText {#text} at (461,54) size 12x15 +- text run at (461,54) width 12: " - " +- RenderInline {A} at (0,0) size 75x15 [color=#0000CC] +- RenderText {#text} at (472,54) size 75x15 +- text run at (472,54) width 75: "About Google" +- RenderBlock {P} at (0,245) size 784x13 +- RenderInline {FONT} at (0,0) size 60x13 +- RenderText {#text} at (362,0) size 60x13 +- text run at (362,0) width 60: "\x{A9}2005 Google" +-layer at (207,88) size 386x13 backgroundClip at (207,88) size 385x13 clip at (207,88) size 385x13 +- RenderBlock {DIV} at (3,3) size 386x13 +-selection start: position 0 of child 3 {INPUT} of child 1 {TD} of child 0 {TR} of child 0 {TBODY} of child 2 {TABLE} of child 4 {DIV} of child 0 {CENTER} of body +-selection end: position 1 of child 2 {BR} of child 0 {FONT} of child 2 {TD} of child 0 {TR} of child 0 {TBODY} of child 2 {TABLE} of child 4 {DIV} of child 0 {CENTER} of body +diff --git a/LayoutTests/platform/mac-mojave/editing/selection/3690703-expected.txt b/LayoutTests/platform/mac-mojave/editing/selection/3690703-expected.txt +deleted file mode 100644 +index cca65092cb1c64ccada839d2471963238c9aa4ea..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/editing/selection/3690703-expected.txt ++++ /dev/null +@@ -1,154 +0,0 @@ +-EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of DIV > CENTER > BODY > HTML > #document to 6 of DIV > CENTER > BODY > HTML > #document +-EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,3) size 784x581 [bgcolor=#FFFFFF] +- RenderBlock {CENTER} at (0,0) size 784x258 +- RenderTable {TABLE} at (0,0) size 784x19 +- RenderTableSection {TBODY} at (0,0) size 784x19 +- RenderTableRow {TR} at (0,0) size 784x15 +- RenderTableCell {TD} at (0,0) size 784x15 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 102x15 +- RenderInline {A} at (0,0) size 102x15 [color=#0000CC] +- RenderText {#text} at (682,0) size 102x15 +- text run at (682,0) width 102: "Personalized Home" +- RenderTableRow {TR} at (0,15) size 784x4 +- RenderTableCell {TD} at (0,16) size 784x2 [r=1 c=0 rs=1 cs=1] +- RenderImage {IMG} at (0,0) size 1x1 +- RenderBlock (anonymous) at (0,19) size 784x36 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBlock {DIV} at (0,55) size 784x105 [border: (2px solid #AAAAFF)] +- RenderTable {TABLE} at (214,2) size 355x23 +- RenderTableSection {TBODY} at (0,0) size 355x23 +- RenderTableRow {TR} at (0,0) size 355x23 +- RenderTableCell {TD} at (0,0) size 355x23 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 347x15 +- RenderInline {B} at (0,0) size 26x15 +- RenderText {#text} at (4,4) size 26x15 +- text run at (4,4) width 26: "Web" +- RenderText {#text} at (29,4) size 14x15 +- text run at (29,4) width 14: " " +- RenderInline {A} at (0,0) size 38x15 [color=#0000CC] +- RenderText {#text} at (42,4) size 38x15 +- text run at (42,4) width 38: "Images" +- RenderText {#text} at (79,4) size 14x15 +- text run at (79,4) width 14: " " +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (92,4) size 40x15 +- text run at (92,4) width 40: "Groups" +- RenderText {#text} at (131,4) size 14x15 +- text run at (131,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (144,4) size 30x15 +- text run at (144,4) width 30: "News" +- RenderText {#text} at (173,4) size 14x15 +- text run at (173,4) width 14: " " +- RenderInline {A} at (0,0) size 42x15 [color=#0000CC] +- RenderText {#text} at (186,4) size 42x15 +- text run at (186,4) width 42: "Froogle" +- RenderText {#text} at (227,4) size 14x15 +- text run at (227,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (240,4) size 30x15 +- text run at (240,4) width 30: "Local" +- RenderInline {SUP} at (0,0) size 1x13 +- RenderInline {A} at (0,0) size 30x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (269,4) size 30x15 +- text run at (269,4) width 30: "New!" +- RenderText {#text} at (298,4) size 14x15 +- text run at (298,4) width 14: " " +- RenderInline {B} at (0,0) size 40x15 +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (311,4) size 40x15 +- text run at (311,4) width 40: "more \x{BB}" +- RenderTable {TABLE} at (2,25) size 780x45 +- RenderTableSection {TBODY} at (0,0) size 780x45 +- RenderTableRow {TR} at (0,0) size 780x45 +- RenderTableCell {TD} at (0,13) size 192x19 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (0,0) size 4x19 +- text run at (0,1) width 4: " " +- RenderTableCell {TD} at (191,0) size 397x45 [r=0 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (2,2) size 392x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (395,2) size 1x18 +- RenderButton {INPUT} at (95,25) size 94x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 77x13 +- RenderText at (0,0) size 77x13 +- text run at (0,0) width 77: "Google Search" +- RenderButton {INPUT} at (192,25) size 108x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 91x13 +- RenderText at (0,0) size 91x13 +- text run at (0,0) width 91: "I'm Feeling Lucky" +- RenderTableCell {TD} at (587,0) size 194x39 [r=0 c=2 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 76x39 +- RenderText {#text} at (0,0) size 5x13 +- text run at (0,0) width 5: " " +- RenderInline {A} at (0,0) size 71x13 [color=#0000CC] +- RenderText {#text} at (5,0) size 71x13 +- text run at (5,0) width 71: "Advanced Search" +- RenderBR {BR} at (75,0) size 1x13 +- RenderText {#text} at (0,13) size 5x13 +- text run at (0,13) width 5: " " +- RenderInline {A} at (0,0) size 47x13 [color=#0000CC] +- RenderText {#text} at (5,13) size 47x13 +- text run at (5,13) width 47: "Preferences" +- RenderBR {BR} at (51,13) size 1x13 +- RenderText {#text} at (0,26) size 5x13 +- text run at (0,26) width 5: " " +- RenderInline {A} at (0,0) size 65x13 [color=#0000CC] +- RenderText {#text} at (5,26) size 65x13 +- text run at (5,26) width 65: "Language Tools" +- RenderBlock (anonymous) at (2,70) size 780x33 +- RenderBR {BR} at (390,0) size 0x18 +- RenderInline {FONT} at (0,0) size 146x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (317,18) size 30x15 +- text run at (317,18) width 30: "New!" +- RenderText {#text} at (346,18) size 4x15 +- text run at (346,18) width 4: " " +- RenderInline {A} at (0,0) size 111x15 [color=#0000CC] +- RenderText {#text} at (349,18) size 111x15 +- text run at (349,18) width 111: "Personalize this page" +- RenderText {#text} at (459,18) size 4x15 +- text run at (459,18) width 4: "." +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,160) size 784x69 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBR {BR} at (392,36) size 0x18 +- RenderInline {FONT} at (0,0) size 310x15 +- RenderInline {A} at (0,0) size 116x15 [color=#0000CC] +- RenderText {#text} at (237,54) size 116x15 +- text run at (237,54) width 116: "Advertising Programs" +- RenderText {#text} at (352,54) size 11x15 +- text run at (352,54) width 11: " - " +- RenderInline {A} at (0,0) size 100x15 [color=#0000CC] +- RenderText {#text} at (362,54) size 100x15 +- text run at (362,54) width 100: "Business Solutions" +- RenderText {#text} at (461,54) size 12x15 +- text run at (461,54) width 12: " - " +- RenderInline {A} at (0,0) size 75x15 [color=#0000CC] +- RenderText {#text} at (472,54) size 75x15 +- text run at (472,54) width 75: "About Google" +- RenderBlock {P} at (0,245) size 784x13 +- RenderInline {FONT} at (0,0) size 60x13 +- RenderText {#text} at (362,0) size 60x13 +- text run at (362,0) width 60: "\x{A9}2005 Google" +-layer at (207,88) size 386x13 backgroundClip at (207,88) size 385x13 clip at (207,88) size 385x13 +- RenderBlock {DIV} at (3,3) size 386x13 +-selection start: position 0 of child 1 {TABLE} of child 4 {DIV} of child 0 {CENTER} of body +-selection end: position 1 of child 3 {#text} of child 4 {FONT} of child 4 {DIV} of child 0 {CENTER} of body +diff --git a/LayoutTests/platform/mac-mojave/editing/selection/3690719-expected.txt b/LayoutTests/platform/mac-mojave/editing/selection/3690719-expected.txt +deleted file mode 100644 +index b70a3cfa8ca7336e299c46af73a9a031905729c6..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/editing/selection/3690719-expected.txt ++++ /dev/null +@@ -1,146 +0,0 @@ +-EDITING DELEGATE: shouldBeginEditingInDOMRange:range from 0 of DIV > CENTER > BODY > HTML > #document to 6 of DIV > CENTER > BODY > HTML > #document +-EDITING DELEGATE: webViewDidBeginEditing:WebViewDidBeginEditingNotification +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-EDITING DELEGATE: shouldChangeSelectedDOMRange:range from 1 of DIV > CENTER > BODY > HTML > #document to 1 of DIV > CENTER > BODY > HTML > #document toDOMRange:range from 1 of DIV > CENTER > BODY > HTML > #document to 1 of #text > FONT > DIV > CENTER > BODY > HTML > #document affinity:NSSelectionAffinityDownstream stillSelecting:FALSE +-EDITING DELEGATE: webViewDidChangeSelection:WebViewDidChangeSelectionNotification +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,3) size 784x581 [bgcolor=#FFFFFF] +- RenderBlock {CENTER} at (0,0) size 784x258 +- RenderTable {TABLE} at (0,0) size 784x19 +- RenderTableSection {TBODY} at (0,0) size 784x19 +- RenderTableRow {TR} at (0,0) size 784x15 +- RenderTableCell {TD} at (0,0) size 784x15 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 102x15 +- RenderInline {A} at (0,0) size 102x15 [color=#0000CC] +- RenderText {#text} at (682,0) size 102x15 +- text run at (682,0) width 102: "Personalized Home" +- RenderTableRow {TR} at (0,15) size 784x4 +- RenderTableCell {TD} at (0,16) size 784x2 [r=1 c=0 rs=1 cs=1] +- RenderImage {IMG} at (0,0) size 1x1 +- RenderBlock (anonymous) at (0,19) size 784x36 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBlock {DIV} at (0,55) size 784x105 [border: (2px solid #AAAAFF)] +- RenderTable {TABLE} at (214,2) size 355x23 +- RenderTableSection {TBODY} at (0,0) size 355x23 +- RenderTableRow {TR} at (0,0) size 355x23 +- RenderTableCell {TD} at (0,0) size 355x23 [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 347x15 +- RenderInline {B} at (0,0) size 26x15 +- RenderText {#text} at (4,4) size 26x15 +- text run at (4,4) width 26: "Web" +- RenderText {#text} at (29,4) size 14x15 +- text run at (29,4) width 14: " " +- RenderInline {A} at (0,0) size 38x15 [color=#0000CC] +- RenderText {#text} at (42,4) size 38x15 +- text run at (42,4) width 38: "Images" +- RenderText {#text} at (79,4) size 14x15 +- text run at (79,4) width 14: " " +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (92,4) size 40x15 +- text run at (92,4) width 40: "Groups" +- RenderText {#text} at (131,4) size 14x15 +- text run at (131,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (144,4) size 30x15 +- text run at (144,4) width 30: "News" +- RenderText {#text} at (173,4) size 14x15 +- text run at (173,4) width 14: " " +- RenderInline {A} at (0,0) size 42x15 [color=#0000CC] +- RenderText {#text} at (186,4) size 42x15 +- text run at (186,4) width 42: "Froogle" +- RenderText {#text} at (227,4) size 14x15 +- text run at (227,4) width 14: " " +- RenderInline {A} at (0,0) size 30x15 [color=#0000CC] +- RenderText {#text} at (240,4) size 30x15 +- text run at (240,4) width 30: "Local" +- RenderInline {SUP} at (0,0) size 1x13 +- RenderInline {A} at (0,0) size 30x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (269,4) size 30x15 +- text run at (269,4) width 30: "New!" +- RenderText {#text} at (298,4) size 14x15 +- text run at (298,4) width 14: " " +- RenderInline {B} at (0,0) size 40x15 +- RenderInline {A} at (0,0) size 40x15 [color=#0000CC] +- RenderText {#text} at (311,4) size 40x15 +- text run at (311,4) width 40: "more \x{BB}" +- RenderTable {TABLE} at (2,25) size 780x45 +- RenderTableSection {TBODY} at (0,0) size 780x45 +- RenderTableRow {TR} at (0,0) size 780x45 +- RenderTableCell {TD} at (0,13) size 192x19 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (0,0) size 4x19 +- text run at (0,1) width 4: " " +- RenderTableCell {TD} at (191,0) size 397x45 [r=0 c=1 rs=1 cs=1] +- RenderTextControl {INPUT} at (2,2) size 392x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (395,2) size 1x18 +- RenderButton {INPUT} at (95,25) size 94x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 77x13 +- RenderText at (0,0) size 77x13 +- text run at (0,0) width 77: "Google Search" +- RenderButton {INPUT} at (192,25) size 108x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 91x13 +- RenderText at (0,0) size 91x13 +- text run at (0,0) width 91: "I'm Feeling Lucky" +- RenderTableCell {TD} at (587,0) size 194x39 [r=0 c=2 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 76x39 +- RenderText {#text} at (0,0) size 5x13 +- text run at (0,0) width 5: " " +- RenderInline {A} at (0,0) size 71x13 [color=#0000CC] +- RenderText {#text} at (5,0) size 71x13 +- text run at (5,0) width 71: "Advanced Search" +- RenderBR {BR} at (75,0) size 1x13 +- RenderText {#text} at (0,13) size 5x13 +- text run at (0,13) width 5: " " +- RenderInline {A} at (0,0) size 47x13 [color=#0000CC] +- RenderText {#text} at (5,13) size 47x13 +- text run at (5,13) width 47: "Preferences" +- RenderBR {BR} at (51,13) size 1x13 +- RenderText {#text} at (0,26) size 5x13 +- text run at (0,26) width 5: " " +- RenderInline {A} at (0,0) size 65x13 [color=#0000CC] +- RenderText {#text} at (5,26) size 65x13 +- text run at (5,26) width 65: "Language Tools" +- RenderBlock (anonymous) at (2,70) size 780x33 +- RenderBR {BR} at (390,0) size 0x18 +- RenderInline {FONT} at (0,0) size 146x15 +- RenderInline {FONT} at (0,0) size 30x15 [color=#FF0000] +- RenderText {#text} at (317,18) size 30x15 +- text run at (317,18) width 30: "New!" +- RenderText {#text} at (346,18) size 4x15 +- text run at (346,18) width 4: " " +- RenderInline {A} at (0,0) size 111x15 [color=#0000CC] +- RenderText {#text} at (349,18) size 111x15 +- text run at (349,18) width 111: "Personalize this page" +- RenderText {#text} at (459,18) size 4x15 +- text run at (459,18) width 4: "." +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,160) size 784x69 +- RenderBR {BR} at (392,0) size 0x18 +- RenderBR {BR} at (392,18) size 0x18 +- RenderBR {BR} at (392,36) size 0x18 +- RenderInline {FONT} at (0,0) size 310x15 +- RenderInline {A} at (0,0) size 116x15 [color=#0000CC] +- RenderText {#text} at (237,54) size 116x15 +- text run at (237,54) width 116: "Advertising Programs" +- RenderText {#text} at (352,54) size 11x15 +- text run at (352,54) width 11: " - " +- RenderInline {A} at (0,0) size 100x15 [color=#0000CC] +- RenderText {#text} at (362,54) size 100x15 +- text run at (362,54) width 100: "Business Solutions" +- RenderText {#text} at (461,54) size 12x15 +- text run at (461,54) width 12: " - " +- RenderInline {A} at (0,0) size 75x15 [color=#0000CC] +- RenderText {#text} at (472,54) size 75x15 +- text run at (472,54) width 75: "About Google" +- RenderBlock {P} at (0,245) size 784x13 +- RenderInline {FONT} at (0,0) size 60x13 +- RenderText {#text} at (362,0) size 60x13 +- text run at (362,0) width 60: "\x{A9}2005 Google" +-layer at (207,88) size 386x13 backgroundClip at (207,88) size 385x13 clip at (207,88) size 385x13 +- RenderBlock {DIV} at (3,3) size 386x13 +-selection start: position 0 of child 1 {TABLE} of child 4 {DIV} of child 0 {CENTER} of body +-selection end: position 1 of child 3 {#text} of child 4 {FONT} of child 4 {DIV} of child 0 {CENTER} of body +diff --git a/LayoutTests/platform/mac-mojave/fast/block/basic/001-expected.txt b/LayoutTests/platform/mac-mojave/fast/block/basic/001-expected.txt +deleted file mode 100644 +index ba9529ae23fcbb2176c70d4b2272351b970ffa41..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/block/basic/001-expected.txt ++++ /dev/null +@@ -1,33 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {DIV} at (0,0) size 784x185 [border: (2px solid #FF0000)] +- RenderBlock (anonymous) at (2,2) size 780x18 +- RenderInline {I} at (0,0) size 235x18 +- RenderText {#text} at (0,0) size 96x18 +- text run at (0,0) width 96: "Start of a line. " +- RenderInline {FONT} at (0,0) size 140x18 [color=#FF0000] +- RenderText {#text} at (95,0) size 140x18 +- text run at (95,0) width 140: "More red on this line:" +- RenderBlock (anonymous) at (2,38) size 780x71 [color=#FF0000] +- RenderBlock {H3} at (0,0) size 780x22 +- RenderText {#text} at (0,0) size 228x22 +- text run at (0,0) width 228: "Suddenly a block appears!" +- RenderBlock {H2} at (0,41) size 780x29 +- RenderText {#text} at (0,0) size 204x28 +- text run at (0,0) width 204: "And another block!" +- RenderBlock (anonymous) at (2,128) size 780x55 +- RenderInline {I} at (0,0) size 299x36 +- RenderInline {FONT} at (0,0) size 97x36 [color=#FF0000] +- RenderText {#text} at (0,0) size 97x18 +- text run at (0,0) width 97: "Now more text." +- RenderBR {BR} at (96,0) size 1x18 +- RenderText {#text} at (0,18) size 67x18 +- text run at (0,18) width 67: "This is red" +- RenderText {#text} at (66,18) size 233x18 +- text run at (66,18) width 233: " but now only italic on the same line" +- RenderBR {BR} at (298,18) size 1x18 +- RenderText {#text} at (0,36) size 132x18 +- text run at (0,36) width 132: "Plain line at the end." +diff --git a/LayoutTests/platform/mac-mojave/fast/block/float/float-avoidance-expected.txt b/LayoutTests/platform/mac-mojave/fast/block/float/float-avoidance-expected.txt +deleted file mode 100644 +index e248c17ebc279d743eb12a8414367921d29e8f00..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/block/float/float-avoidance-expected.txt ++++ /dev/null +@@ -1,337 +0,0 @@ +-layer at (0,0) size 785x2386 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x2386 +- RenderBlock {HTML} at (0,0) size 785x2386 +- RenderBody {BODY} at (8,8) size 769x2370 +- RenderBlock (anonymous) at (0,0) size 769x36 +- RenderText {#text} at (0,0) size 753x36 +- text run at (0,0) width 546: "Test of objects that avoid floats to see what they do with percentage and auto widths. " +- text run at (545,0) width 208: "This test is designed to illustrate" +- text run at (0,18) width 482: "that we have removed the WinIE quirk and are behaving more like Firefox." +- RenderBlock {HR} at (0,44) size 769x2 [border: (1px inset #000000)] +- RenderBlock (anonymous) at (0,54) size 769x18 +- RenderText {#text} at (0,0) size 517x18 +- text run at (0,0) width 517: "The inline-level button should be below the select and fill the width of the block." +- RenderBlock {P} at (0,88) size 220x82 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderButton {INPUT} at (10,52) size 200x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 184x13 +- RenderText at (86,0) size 12x13 +- text run at (86,0) width 12: "Hi" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,186) size 769x18 +- RenderText {#text} at (0,0) size 481x18 +- text run at (0,0) width 481: "The floating button with a percentage width should be even with the select." +- RenderBlock {P} at (0,220) size 220x60 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderButton {INPUT} at (110,30) size 100x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 84x13 +- RenderText at (36,0) size 12x13 +- text run at (36,0) width 12: "Hi" +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (210,28) size 0x18 +- RenderBlock (anonymous) at (0,296) size 769x18 +- RenderText {#text} at (0,0) size 470x18 +- text run at (0,0) width 470: "The block-level button with an auto width should be even with the select." +- RenderBlock {P} at (0,330) size 220x78 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderButton {INPUT} at (110,30) size 27x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 11x13 +- RenderText at (0,0) size 11x13 +- text run at (0,0) width 11: "Hi" +- RenderBlock (anonymous) at (10,50) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,424) size 769x18 +- RenderText {#text} at (0,0) size 504x18 +- text run at (0,0) width 504: "The block-level button with a percentage width should be even with the select." +- RenderBlock {P} at (0,458) size 220x78 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderButton {INPUT} at (110,30) size 100x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 84x13 +- RenderText at (36,0) size 12x13 +- text run at (36,0) width 12: "Hi" +- RenderBlock (anonymous) at (10,50) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,552) size 769x18 +- RenderText {#text} at (0,0) size 471x18 +- text run at (0,0) width 471: "The floating table with a percentage width should be even with the select." +- RenderBlock {P} at (0,586) size 220x68 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderTable {TABLE} at (110,28) size 100x30 [border: (2px outset #808080)] +- RenderTableSection {TBODY} at (2,2) size 96x26 +- RenderTableRow {TR} at (0,2) size 96x22 +- RenderTableCell {TD} at (2,2) size 92x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 36x18 +- text run at (2,2) width 36: "Table" +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (210,28) size 0x18 +- RenderBlock (anonymous) at (0,670) size 769x36 +- RenderText {#text} at (0,0) size 768x36 +- text run at (0,0) width 768: "The floating table with an auto width should be even with the select and shrinks to use the available line width. THIS IS" +- text run at (0,18) width 157: "CURRENTLY BUGGY." +- RenderBlock {P} at (0,722) size 220x126 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderTable {TABLE} at (10,50) size 200x66 [border: (2px outset #808080)] +- RenderTableSection {TBODY} at (2,2) size 196x62 +- RenderTableRow {TR} at (0,2) size 196x58 +- RenderTableCell {TD} at (2,2) size 192x58 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 165x54 +- text run at (2,2) width 164: "Floating table that should" +- text run at (2,20) width 165: "shrink so it can be next to" +- text run at (2,38) width 92: "previous float." +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (110,28) size 0x18 +- RenderBlock (anonymous) at (0,864) size 769x18 +- RenderText {#text} at (0,0) size 746x18 +- text run at (0,0) width 589: "The block-level table below has a percentage width and should still be even with the select. " +- text run at (588,0) width 158: "It spills out of the block." +- RenderBlock {P} at (0,898) size 220x144 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderTable {TABLE} at (10,50) size 200x66 [border: (2px outset #808080)] +- RenderTableSection {TBODY} at (2,2) size 196x62 +- RenderTableRow {TR} at (0,2) size 196x58 +- RenderTableCell {TD} at (2,2) size 192x58 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 165x54 +- text run at (2,2) width 164: "Floating table that should" +- text run at (2,20) width 165: "shrink so it can be next to" +- text run at (2,38) width 92: "previous float." +- RenderBlock (anonymous) at (10,116) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,1058) size 769x18 +- RenderText {#text} at (0,0) size 759x18 +- text run at (0,0) width 555: "The block-level table below has an auto width and should still be even with the select. " +- text run at (554,0) width 205: "It shrinks to fit inside the block." +- RenderBlock {P} at (0,1092) size 220x194 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderTable {TABLE} at (110,28) size 100x138 [border: (2px outset #808080)] +- RenderTableSection {TBODY} at (2,2) size 96x134 +- RenderTableRow {TR} at (0,2) size 96x130 +- RenderTableCell {TD} at (2,2) size 92x130 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 87x126 +- text run at (2,2) width 54: "Floating" +- text run at (2,20) width 60: "table that" +- text run at (2,38) width 87: "should shrink" +- text run at (2,56) width 73: "so it can be" +- text run at (2,74) width 44: "next to" +- text run at (2,92) width 56: "previous" +- text run at (2,110) width 33: "float." +- RenderBlock (anonymous) at (10,166) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,1302) size 769x18 +- RenderText {#text} at (0,0) size 546x18 +- text run at (0,0) width 546: "The floating overflow section with a percentage width should be even with the select." +- RenderBlock {DIV} at (0,1320) size 220x146 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (210,28) size 0x18 +- RenderBlock (anonymous) at (0,1466) size 769x36 +- RenderText {#text} at (0,0) size 741x36 +- text run at (0,0) width 741: "The floating overflow section with an auto width should be even with the select and shrinks to use the available line" +- text run at (0,18) width 259: "width. THIS IS CURRENTLY BUGGY." +- RenderBlock {DIV} at (0,1502) size 220x114 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (110,28) size 0x18 +- RenderBlock (anonymous) at (0,1616) size 769x18 +- RenderText {#text} at (0,0) size 660x18 +- text run at (0,0) width 660: "The block-level overflow section below has a percentage width and should still be even with the select." +- RenderBlock {DIV} at (0,1634) size 220x164 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (10,136) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,1798) size 769x36 +- RenderText {#text} at (0,0) size 767x36 +- text run at (0,0) width 631: "The block-level overflow section below has an auto width and should still be even with the select. " +- text run at (630,0) width 137: "It shrinks to fit inside" +- text run at (0,18) width 64: "the block." +- RenderBlock {DIV} at (0,1834) size 220x164 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (10,136) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,1998) size 769x18 +- RenderText {#text} at (0,0) size 453x18 +- text run at (0,0) width 453: "The floating hr with a percentage width should be even with the select." +- RenderBlock {DIV} at (0,2016) size 220x60 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (floating) {HR} at (112,30) size 82x2 [border: (1px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (196,28) size 0x18 +- RenderBlock (anonymous) at (0,2076) size 769x36 +- RenderText {#text} at (0,0) size 767x36 +- text run at (0,0) width 767: "The floating hr below should still be even with the select and shrinks to use its intrinsic width (which is basically like 1-" +- text run at (0,18) width 34: "2px)." +- RenderBlock {DIV} at (0,2112) size 220x60 [border: (10px solid #FF0000)] +- RenderText {#text} at (10,10) size 60x18 +- text run at (10,10) width 60: "Line One" +- RenderBR {BR} at (69,10) size 1x18 +- RenderMenuList {SELECT} at (10,30) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (floating) {HR} at (112,30) size 2x2 [border: (1px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +- RenderBR {BR} at (116,28) size 0x18 +- RenderBlock (anonymous) at (0,2172) size 769x18 +- RenderText {#text} at (0,0) size 567x18 +- text run at (0,0) width 567: "The block-level hr below has a percentage width and should still be even with the select." +- RenderBlock {DIV} at (0,2190) size 220x88 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (10,50) size 202x2 [border: (1px inset #000000)] +- RenderBlock (anonymous) at (10,60) size 200x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock (anonymous) at (0,2278) size 769x18 +- RenderText {#text} at (0,0) size 635x18 +- text run at (0,0) width 538: "The block-level hr below has an auto width and should still be even with the select. " +- text run at (537,0) width 98: "It shrinks to fit." +- RenderBlock {DIV} at (0,2296) size 220x74 [border: (10px solid #FF0000)] +- RenderBlock (anonymous) at (10,10) size 200x18 +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "Line One" +- RenderBR {BR} at (59,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 100x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 100x18 +- RenderText at (8,2) size 22x13 +- text run at (8,2) width 22: "One" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (110,36) size 100x2 [border: (1px inset #000000)] +- RenderBlock (anonymous) at (10,46) size 200x18 +- RenderBR {BR} at (100,0) size 0x18 +-layer at (118,1356) size 100x108 +- RenderBlock (floating) {DIV} at (110,28) size 100x108 +- RenderText {#text} at (0,0) size 100x108 +- text run at (0,0) width 63: "This is an" +- text run at (0,18) width 57: "overflow" +- text run at (0,36) width 78: "section with" +- text run at (0,54) width 92: "enough text to" +- text run at (0,72) width 100: "have to wrap to" +- text run at (0,90) width 92: "multiple lines." +-layer at (18,1560) size 200x54 +- RenderBlock (floating) {DIV} at (10,50) size 200x54 +- RenderText {#text} at (0,0) size 175x54 +- text run at (0,0) width 173: "This is an overflow section" +- text run at (0,18) width 175: "with enough text to have to" +- text run at (0,36) width 144: "wrap to multiple lines." +-layer at (118,1670) size 100x108 +- RenderBlock {DIV} at (110,28) size 100x108 +- RenderText {#text} at (0,0) size 100x108 +- text run at (0,0) width 63: "This is an" +- text run at (0,18) width 57: "overflow" +- text run at (0,36) width 78: "section with" +- text run at (0,54) width 92: "enough text to" +- text run at (0,72) width 100: "have to wrap to" +- text run at (0,90) width 92: "multiple lines." +-layer at (118,1870) size 100x108 +- RenderBlock {DIV} at (110,28) size 100x108 +- RenderText {#text} at (0,0) size 100x108 +- text run at (0,0) width 63: "This is an" +- text run at (0,18) width 57: "overflow" +- text run at (0,36) width 78: "section with" +- text run at (0,54) width 92: "enough text to" +- text run at (0,72) width 100: "have to wrap to" +- text run at (0,90) width 92: "multiple lines." +diff --git a/LayoutTests/platform/mac-mojave/fast/css-generated-content/014-expected.png b/LayoutTests/platform/mac-mojave/fast/css-generated-content/014-expected.png +deleted file mode 100644 +index d7606cfed46594f0437930c6b68a2f8f62fbe967..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/fast/css-generated-content/014-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/fast/css-generated-content/014-expected.txt b/LayoutTests/platform/mac-mojave/fast/css-generated-content/014-expected.txt +deleted file mode 100644 +index bda1422ef3bdcc5720b785446efab252424424b5..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/css-generated-content/014-expected.txt ++++ /dev/null +@@ -1,106 +0,0 @@ +-layer at (0,0) size 785x887 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x887 +- RenderBlock {HTML} at (0,0) size 785x887 +- RenderBody {BODY} at (8,21) size 769x841 +- RenderBlock {H1} at (0,0) size 769x74 +- RenderText {#text} at (0,0) size 747x74 +- text run at (0,0) width 747: "Problem: Safari improperly handles generated content" +- text run at (0,37) width 717: "in certain cases when used with multiple class names" +- RenderBlock {P} at (0,95) size 769x37 +- RenderInline {EM} at (0,0) size 767x36 +- RenderText {#text} at (0,0) size 767x36 +- text run at (0,0) width 767: "When referencing an element by two class names simultaneously, Safari won't generate content (using :before or :after)" +- text run at (0,18) width 122: "within the element." +- RenderBlock {P} at (0,147) size 769x37 +- RenderText {#text} at (0,0) size 124x18 +- text run at (0,0) width 124: "Assume we have a " +- RenderInline {CODE} at (0,0) size 24x15 +- RenderText {#text} at (123,2) size 24x15 +- text run at (123,2) width 24: "div" +- RenderText {#text} at (146,0) size 150x18 +- text run at (146,0) width 150: " with two class names: " +- RenderInline {CODE} at (0,0) size 25x15 +- RenderText {#text} at (295,2) size 25x15 +- text run at (295,2) width 25: "box" +- RenderText {#text} at (319,0) size 32x18 +- text run at (319,0) width 32: " and " +- RenderInline {CODE} at (0,0) size 24x15 +- RenderText {#text} at (350,2) size 24x15 +- text run at (350,2) width 24: "one" +- RenderText {#text} at (373,0) size 85x18 +- text run at (373,0) width 85: ". Within that " +- RenderInline {CODE} at (0,0) size 24x15 +- RenderText {#text} at (457,2) size 24x15 +- text run at (457,2) width 24: "div" +- RenderText {#text} at (480,0) size 77x18 +- text run at (480,0) width 77: ", we have a " +- RenderInline {CODE} at (0,0) size 9x15 +- RenderText {#text} at (556,2) size 9x15 +- text run at (556,2) width 9: "p" +- RenderText {#text} at (564,0) size 748x36 +- text run at (564,0) width 184: " (paragraph) tag, after which" +- text run at (0,18) width 509: "we'd like to insert generated content. One way to do so would be the following:" +- RenderBlock {PRE} at (20,199) size 749x16 [color=#FF0000] +- RenderInline {CODE} at (0,0) size 445x15 +- RenderText {#text} at (0,0) size 445x15 +- text run at (0,0) width 445: "div.box.one p:after{ content:'generated content here!'; }" +- RenderBlock {P} at (0,230) size 769x19 +- RenderText {#text} at (0,0) size 741x18 +- text run at (0,0) width 741: "But that doesn't work in Safari. However, if you drop one of the class names, as shown below, it works as expected:" +- RenderBlock {PRE} at (20,264) size 749x16 [color=#008000] +- RenderInline {CODE} at (0,0) size 414x15 +- RenderText {#text} at (0,0) size 414x15 +- text run at (0,0) width 414: "div.box p:after{ content:'generated content here!'; }" +- RenderBlock {P} at (0,295) size 769x37 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Note also that the bug only applies to content " +- RenderInline {EM} at (0,0) size 41x18 +- RenderText {#text} at (293,0) size 41x18 +- text run at (293,0) width 41: "within" +- RenderText {#text} at (333,0) size 276x18 +- text run at (333,0) width 276: " the classed element \x{2014} generating content " +- RenderInline {EM} at (0,0) size 726x36 +- RenderText {#text} at (608,0) size 726x36 +- text run at (608,0) width 118: "before or after the" +- text run at (0,18) width 85: "element itself" +- RenderText {#text} at (84,18) size 77x18 +- text run at (84,18) width 77: " works fine:" +- RenderBlock {PRE} at (20,347) size 749x16 [color=#008000] +- RenderInline {CODE} at (0,0) size 430x15 +- RenderText {#text} at (0,0) size 430x15 +- text run at (0,0) width 430: "div.box.one:after{ content:'generated content here!'; }" +- RenderBlock {HR} at (0,375) size 769x3 [border: (1px inset #000000)] +- RenderBlock {H2} at (0,397) size 769x29 +- RenderText {#text} at (0,0) size 477x28 +- text run at (0,0) width 477: "Example (view source to see CSS and HTML):" +- RenderBlock {P} at (0,445) size 769x19 +- RenderText {#text} at (0,0) size 340x18 +- text run at (0,0) width 340: "Both boxes below should contain generated content (" +- RenderInline {SPAN} at (0,0) size 53x18 [color=#008000] +- RenderText {#text} at (339,0) size 53x18 +- text run at (339,0) width 53: "in green" +- RenderText {#text} at (391,0) size 11x18 +- text run at (391,0) width 11: "):" +- RenderBlock {DIV} at (0,488) size 769x164 [border: (1px solid #000000)] +- RenderBlock {H3} at (26,44) size 717x23 +- RenderText {#text} at (0,0) size 46x22 +- text run at (0,0) width 46: "Box 1" +- RenderBlock {P} at (26,85) size 717x37 +- RenderBlock (anonymous) at (0,0) size 717x18 +- RenderText {#text} at (0,0) size 661x18 +- text run at (0,0) width 661: "This box should contain the text \"generated content\" in CSS2-compliant browsers (but won't in Safari)." +- RenderBlock (generated) at (0,18) size 717x18 [color=#008000] +- RenderText at (0,0) size 114x18 +- text run at (0,0) width 114: "generated content" +- RenderBlock {DIV} at (0,676) size 769x165 [border: (1px solid #000000)] +- RenderBlock {H3} at (26,44) size 717x23 +- RenderText {#text} at (0,0) size 46x22 +- text run at (0,0) width 46: "Box 2" +- RenderBlock {P} at (26,85) size 717x37 +- RenderBlock (anonymous) at (0,0) size 717x18 +- RenderText {#text} at (0,0) size 639x18 +- text run at (0,0) width 639: "This box should contain the text \"generated content\" in CSS2-compliant browsers, including Safari." +- RenderBlock (generated) at (0,18) size 717x18 [color=#008000] +- RenderText at (0,0) size 114x18 +- text run at (0,0) width 114: "generated content" +diff --git a/LayoutTests/platform/mac-mojave/fast/css/apple-system-control-colors-expected.txt b/LayoutTests/platform/mac-mojave/fast/css/apple-system-control-colors-expected.txt +deleted file mode 100644 +index 69a0b968ab1a8c641572faa940886c090571727a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/css/apple-system-control-colors-expected.txt ++++ /dev/null +@@ -1,23 +0,0 @@ +--apple-system-header-text : rgba(0, 0, 0, 0.847) +--apple-system-text-background : rgb(255, 255, 255) +--apple-system-control-background : rgb(255, 255, 255) +--apple-system-alternate-selected-text : rgb(255, 255, 255) +--apple-system-control-accent : rgb(0, 122, 255) +--apple-system-even-alternating-content-background : rgb(255, 255, 255) +--apple-system-odd-alternating-content-background : rgb(244, 245, 245) +--apple-system-selected-content-background : rgb(0, 99, 225) +--apple-system-unemphasized-selected-content-background : rgb(220, 220, 220) +--apple-system-selected-text : rgb(0, 0, 0) +--apple-system-unemphasized-selected-text : rgb(0, 0, 0) +--apple-system-selected-text-background : rgba(128, 188, 254, 0.6) +--apple-system-unemphasized-selected-text-background : rgb(220, 220, 220) +--apple-system-placeholder-text : rgba(0, 0, 0, 0.247) +--apple-system-find-highlight-background : rgb(255, 255, 0) +--apple-system-label : rgba(0, 0, 0, 0.847) +--apple-system-secondary-label : rgba(0, 0, 0, 0.498) +--apple-system-tertiary-label : rgba(0, 0, 0, 0.247) +--apple-system-quaternary-label : rgba(0, 0, 0, 0.098) +--apple-system-grid : rgb(204, 204, 204) +--apple-system-separator : rgba(0, 0, 0, 0.098) +--apple-system-container-border : rgba(0, 0, 0, 0.247) +-current-color with inherited -apple-system-label : rgba(0, 0, 0, 0.847) +diff --git a/LayoutTests/platform/mac-mojave/fast/css/continuationCrash-expected.txt b/LayoutTests/platform/mac-mojave/fast/css/continuationCrash-expected.txt +deleted file mode 100644 +index 4e70dac2052e32287cc4e3312b2fd81db2c5ed11..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/css/continuationCrash-expected.txt ++++ /dev/null +@@ -1,66 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock (anonymous) at (0,0) size 784x0 +- RenderInline {SPAN} at (0,0) size 0x0 +- RenderInline {SPAN} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {H4} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 83x18 +- text run at (0,0) width 83: "Instructions" +- RenderBlock {P} at (0,39) size 784x19 +- RenderText {#text} at (0,0) size 180x18 +- text run at (0,0) width 180: "Click the following buttons." +- RenderBlock {OL} at (0,73) size 784x167 +- RenderListItem {LI} at (40,0) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "1" +- RenderText {#text} at (0,0) size 199x18 +- text run at (0,0) width 199: "Start with the outmost left one." +- RenderListItem {LI} at (40,18) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "2" +- RenderText {#text} at (0,0) size 138x18 +- text run at (0,0) width 138: "Click the middle one." +- RenderListItem {LI} at (40,36) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "3" +- RenderText {#text} at (0,0) size 271x18 +- text run at (0,0) width 271: "(The ouline will not be updated correctly.)" +- RenderListItem {LI} at (40,54) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "4" +- RenderText {#text} at (0,0) size 142x18 +- text run at (0,0) width 142: "Click the right button." +- RenderListItem {LI} at (40,72) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "5" +- RenderText {#text} at (0,0) size 473x18 +- text run at (0,0) width 473: "This will crash Safari 1.3 (v176 and v170, no other configurations tested)." +- RenderListItem {LI} at (40,90) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "6" +- RenderText {#text} at (0,0) size 300x18 +- text run at (0,0) width 300: "The combination 2. 1. 3. will also crash Safari." +- RenderListItem {LI} at (40,108) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "7" +- RenderText {#text} at (0,0) size 457x18 +- text run at (0,0) width 457: "1. 3. will not crash Safari. (But the outline should vanish. Shouldn't it?)" +- RenderListItem {LI} at (40,126) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "8" +- RenderText {#text} at (0,0) size 205x18 +- text run at (0,0) width 205: "2. 3. will not crash Safari either." +- RenderBlock (anonymous) at (40,144) size 744x22 +- RenderButton {INPUT} at (2,2) size 133x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 117x13 +- RenderText at (0,0) size 117x13 +- text run at (0,0) width 117: "1. Set outline property" +- RenderText {#text} at (136,1) size 5x18 +- text run at (136,1) width 5: " " +- RenderButton {INPUT} at (142,2) size 136x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 120x13 +- RenderText at (0,0) size 120x13 +- text run at (0,0) width 120: "2. Set display property" +- RenderText {#text} at (279,1) size 5x18 +- text run at (279,1) width 5: " " +- RenderButton {INPUT} at (285,2) size 147x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 131x13 +- RenderText at (0,0) size 131x13 +- text run at (0,0) width 131: "3. Replace span-element" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/css/css3-nth-child-expected.txt b/LayoutTests/platform/mac-mojave/fast/css/css3-nth-child-expected.txt +deleted file mode 100644 +index 1f56db3b96038f2ccb31684d321003789cf6f25a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/css/css3-nth-child-expected.txt ++++ /dev/null +@@ -1,68 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock {DIV} at (0,0) size 784x162 +- RenderTable {TABLE} at (0,0) size 784x162 +- RenderTableSection {TBODY} at (0,0) size 784x162 +- RenderTableRow {TR} at (0,2) size 784x38 [color=#008000] +- RenderTableCell {TD} at (2,2) size 383x38 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 352x36 +- text run at (1,1) width 352: "This is the first cell in the first row of this table, and" +- text run at (1,19) width 176: "should be green, and bold" +- RenderTableCell {TD} at (386,2) size 397x38 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 370x36 +- text run at (1,1) width 370: "This is the second cell in the first row of this table, and" +- text run at (1,19) width 172: "should be green and bold" +- RenderTableRow {TR} at (0,42) size 784x38 [color=#800080] +- RenderTableCell {TD} at (2,42) size 383x38 [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 370x36 +- text run at (1,1) width 370: "This is the first cell in the second row of this table, and" +- text run at (1,19) width 179: "should be purple and bold" +- RenderTableCell {TD} at (386,42) size 397x38 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 389x36 +- text run at (1,1) width 389: "This is the second cell in the second row of this table, and" +- text run at (1,19) width 179: "should be purple and bold" +- RenderTableRow {TR} at (0,82) size 784x38 [color=#008000] +- RenderTableCell {TD} at (2,82) size 383x38 [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 337x36 +- text run at (1,1) width 337: "This is the first cell in the third row of this table, and" +- text run at (1,19) width 102: "should be green" +- RenderTableCell {TD} at (386,82) size 397x38 [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 356x36 +- text run at (1,1) width 356: "This is the second cell in the third row of this table, and" +- text run at (1,19) width 102: "should be green" +- RenderTableRow {TR} at (0,122) size 784x38 [color=#800080] +- RenderTableCell {TD} at (2,122) size 383x38 [r=3 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 346x36 +- text run at (1,1) width 346: "This is the first cell in the fourth row of this table, and" +- text run at (1,19) width 107: "should be purple" +- RenderTableCell {TD} at (386,122) size 397x38 [r=3 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 365x36 +- text run at (1,1) width 365: "This is the second cell in the fourth row of this table, and" +- text run at (1,19) width 107: "should be purple" +- RenderBlock {DIV} at (0,178) size 784x120 +- RenderBlock {P} at (0,0) size 784x18 [color=#000080] +- RenderText {#text} at (0,0) size 394x18 +- text run at (0,0) width 394: "This should be navy, as this is the first paragraph in this page." +- RenderBlock {P} at (0,34) size 784x18 [color=#FF0000] +- RenderText {#text} at (0,0) size 404x18 +- text run at (0,0) width 404: "This should be red, as this is the second paragraph in this page." +- RenderBlock {P} at (0,68) size 784x18 [color=#000080] +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "This should be navy, as this is the third paragraph in this page." +- RenderBlock {P} at (0,102) size 784x18 [color=#FF0000] +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "This should be red, as this is the fourth paragraph in this page." +- RenderBlock {DIV} at (0,314) size 784x18 +- RenderBlock {P} at (0,0) size 784x18 [color=#000080] +- RenderInline {SPAN} at (0,0) size 249x18 +- RenderInline {I} at (0,0) size 249x18 +- RenderText {#text} at (0,0) size 249x18 +- text run at (0,0) width 249: "This whole paragraph should be italic." +- RenderText {#text} at (248,0) size 5x18 +- text run at (248,0) width 5: " " +- RenderInline {SPAN} at (0,0) size 282x18 +- RenderText {#text} at (252,0) size 282x18 +- text run at (252,0) width 282: "But only this sentence should be bold." +diff --git a/LayoutTests/platform/mac-mojave/fast/css/line-height-font-order-expected.png b/LayoutTests/platform/mac-mojave/fast/css/line-height-font-order-expected.png +deleted file mode 100644 +index 7305287b00a62d3fc84f0d593d5cd575f5ec84ed..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/fast/css/line-height-font-order-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/fast/css/line-height-font-order-expected.txt b/LayoutTests/platform/mac-mojave/fast/css/line-height-font-order-expected.txt +deleted file mode 100644 +index cad7b8c091e280b5c463d1bbcac2117a053ace4a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/css/line-height-font-order-expected.txt ++++ /dev/null +@@ -1,21 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x196 +- RenderBlock {HTML} at (0,0) size 800x196 +- RenderBody {BODY} at (8,15) size 784x166 +- RenderBlock {P} at (0,0) size 784x75 +- RenderText {#text} at (0,29) size 95x17 +- text run at (0,29) width 95: "This tests bug " +- RenderInline {A} at (0,0) size 651x17 [color=#0000EE] +- RenderText {#text} at (94,29) size 651x17 +- text run at (94,29) width 651: "Bug 13174: line-height in font shorthand does not override a previously stated line-height property" +- RenderText {#text} at (744,29) size 6x17 +- text run at (744,29) width 6: "." +- RenderBlock {P} at (0,90) size 784x76 +- RenderText {#text} at (0,29) size 130x17 +- text run at (0,29) width 130: "This text should be " +- RenderInline {CODE} at (0,0) size 190x17 +- RenderText {#text} at (129,30) size 190x17 +- text run at (129,30) width 190: "font:15px/5em Georgia" +- RenderText {#text} at (318,29) size 5x17 +- text run at (318,29) width 5: "." +diff --git a/LayoutTests/platform/mac-mojave/fast/css/rtl-ordering-expected.txt b/LayoutTests/platform/mac-mojave/fast/css/rtl-ordering-expected.txt +deleted file mode 100644 +index d53f257a106dd45442276aecf0dd491ddc585781..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/css/rtl-ordering-expected.txt ++++ /dev/null +@@ -1,45 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 218x18 +- text run at (0,0) width 218: "This tests for a regression against " +- RenderInline {I} at (0,0) size 722x36 +- RenderInline {A} at (0,0) size 354x18 [color=#0000EE] +- RenderText {#text} at (217,0) size 354x18 +- text run at (217,0) width 354: "http://bugzilla.opendarwin.org/show_bug.cgi?id=6334" +- RenderText {#text} at (570,0) size 722x36 +- text run at (570,0) width 152: " REGRESSION: text is reversed on \"visual Hebrew\" pages" +- RenderText {#text} at (373,18) size 5x18 +- text run at (373,18) width 5: "." +- RenderBlock {HR} at (0,52) size 784x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,70) size 784x19 +- RenderText {#text} at (0,1) size 310x18 +- text run at (0,1) width 310: "The text on both buttons should like this: \x{5E8}\x{5D5}\x{5EA}\x{5E4}\x{5DB}" +- RenderBlock (anonymous) at (0,105) size 784x44 +- RenderButton {BUTTON} at (2,2) size 46x18 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 30x13 +- RenderText {#text} at (0,0) size 30x13 +- text run at (0,0) width 30: "\x{5E8}\x{5D5}\x{5EA}\x{5E4}\x{5DB}" +- RenderText {#text} at (49,1) size 5x18 +- text run at (49,1) width 5: " " +- RenderBR {BR} at (53,1) size 1x18 +- RenderButton {INPUT} at (2,24) size 46x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 30x13 +- RenderText at (0,0) size 30x13 +- text run at (0,0) width 30 RTL: "\x{5DB}\x{5E4}\x{5EA}\x{5D5}\x{5E8}" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (0,157) size 784x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,175) size 784x18 +- RenderText {#text} at (0,0) size 255x18 +- text run at (0,0) width 255: "The following lines should be identical:" +- RenderBlock {P} at (0,209) size 784x19 +- RenderText {#text} at (0,1) size 81x18 +- text run at (0,1) width 16: "21" +- text run at (16,1) width 65 RTL: "\x{5D4}\x{5DE}\x{5D0}\x{5D4} \x{5D4}-" +- RenderBlock {P} at (0,244) size 784x19 +- RenderText {#text} at (0,1) size 81x18 +- text run at (0,1) width 81: "21-\x{5D4} \x{5D4}\x{5D0}\x{5DE}\x{5D4}" +diff --git a/LayoutTests/platform/mac-mojave/fast/css/text-overflow-input-expected.txt b/LayoutTests/platform/mac-mojave/fast/css/text-overflow-input-expected.txt +deleted file mode 100644 +index 4b71ad9e0a7731c831409a2412354dab90822a92..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/css/text-overflow-input-expected.txt ++++ /dev/null +@@ -1,246 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x382 +- RenderBlock {HTML} at (0,0) size 800x382 +- RenderBody {BODY} at (8,16) size 784x350 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 314x18 +- text run at (0,0) width 314: "This test is a basic check for using text-overflow." +- RenderBlock {P} at (0,34) size 784x110 +- RenderText {#text} at (0,0) size 489x18 +- text run at (0,0) width 489: "Apply \"text-overflow:clip\" to inputs. The following input should be clipped:" +- RenderBR {BR} at (488,0) size 1x18 +- RenderTextControl {INPUT} at (2,20) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (150,20) size 5x18 +- text run at (150,20) width 5: " " +- RenderTextControl {INPUT} at (156,20) size 175x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderText {#text} at (332,20) size 5x18 +- text run at (332,20) width 5: " " +- RenderTextControl {INPUT} at (338,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (487,20) size 5x18 +- text run at (487,20) width 5: " " +- RenderTextControl {INPUT} at (493,20) size 175x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderTextControl {INPUT} at (2,43) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderBR {BR} at (150,43) size 1x18 +- RenderTextControl {INPUT} at (2,66) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (149,66) size 5x18 +- text run at (149,66) width 5: " " +- RenderTextControl {INPUT} at (155,66) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 167x19 +- RenderBlock {DIV} at (158,0) size 9x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderText {#text} at (330,66) size 5x18 +- text run at (330,66) width 5: " " +- RenderTextControl {INPUT} at (336,66) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (484,66) size 5x18 +- text run at (484,66) width 5: " " +- RenderTextControl {INPUT} at (490,66) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 167x19 +- RenderBlock {DIV} at (158,0) size 9x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderTextControl {INPUT} at (2,89) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,160) size 784x110 +- RenderText {#text} at (0,0) size 546x18 +- text run at (0,0) width 546: "Apply \"text-overflow:ellipsis\" to inputs. The following input should show an ellipsis:" +- RenderBR {BR} at (545,0) size 1x18 +- RenderTextControl {INPUT} at (2,20) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (150,20) size 5x18 +- text run at (150,20) width 5: " " +- RenderTextControl {INPUT} at (156,20) size 175x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderText {#text} at (332,20) size 5x18 +- text run at (332,20) width 5: " " +- RenderTextControl {INPUT} at (338,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (487,20) size 5x18 +- text run at (487,20) width 5: " " +- RenderTextControl {INPUT} at (493,20) size 175x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderTextControl {INPUT} at (2,43) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderBR {BR} at (150,43) size 1x18 +- RenderTextControl {INPUT} at (2,66) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (149,66) size 5x18 +- text run at (149,66) width 5: " " +- RenderTextControl {INPUT} at (155,66) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 167x19 +- RenderBlock {DIV} at (158,0) size 9x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderText {#text} at (330,66) size 5x18 +- text run at (330,66) width 5: " " +- RenderTextControl {INPUT} at (336,66) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (484,66) size 5x18 +- text run at (484,66) width 5: " " +- RenderTextControl {INPUT} at (490,66) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 167x19 +- RenderBlock {DIV} at (158,0) size 9x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderTextControl {INPUT} at (2,89) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,286) size 784x64 +- RenderText {#text} at (0,0) size 237x18 +- text run at (0,0) width 237: "Dynamic style change text-overflow:" +- RenderBR {BR} at (236,0) size 1x18 +- RenderText {#text} at (0,20) size 247x18 +- text run at (0,20) width 247: "Clip to ellipsis (should show ellipsis): " +- RenderTextControl {INPUT} at (248,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (397,20) size 5x18 +- text run at (397,20) width 5: " " +- RenderTextControl {INPUT} at (403,20) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (551,20) size 5x18 +- text run at (551,20) width 5: " " +- RenderBR {BR} at (555,20) size 1x18 +- RenderText {#text} at (0,43) size 270x18 +- text run at (0,43) width 270: "Ellipsis to clip (should not show ellipsis): " +- RenderTextControl {INPUT} at (271,43) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (420,43) size 5x18 +- text run at (420,43) width 5: " " +- RenderTextControl {INPUT} at (426,43) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (575,43) size 5x18 +- text run at (575,43) width 5: " " +- RenderBR {BR} at (579,43) size 1x18 +-layer at (13,73) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,73) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (176,73) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (11,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (176,73) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (350,73) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (513,73) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,96) size 141x13 scrollWidth 282 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 282x13 +- text run at (0,0) width 282: "\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}" +-layer at (13,119) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#A9A9A9] +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,119) size 140x13 +- RenderBlock {DIV} at (3,3) size 140x13 +-layer at (186,119) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (22,3) size 140x13 [color=#A9A9A9] +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (186,119) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +-layer at (348,119) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (521,119) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,142) size 140x13 scrollX 141 scrollWidth 281 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (-141,0) size 282x13 +- text run at (-141,0) width 281 RTL: "\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}" +-layer at (13,199) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,199) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (176,199) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (11,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (176,199) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (350,199) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (513,199) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,222) size 141x13 scrollWidth 282 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 282x13 +- text run at (0,0) width 282: "\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}" +-layer at (13,245) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#A9A9A9] +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,245) size 140x13 +- RenderBlock {DIV} at (3,3) size 140x13 +-layer at (186,245) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (22,3) size 140x13 [color=#A9A9A9] +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (186,245) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +-layer at (348,245) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (521,245) size 140x13 scrollX 148 scrollWidth 288 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (-147,0) size 288x13 +- text run at (-147,0) width 287: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (13,268) size 140x13 scrollX 141 scrollWidth 281 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (-141,0) size 282x13 +- text run at (-141,0) width 281 RTL: "\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}\x{2022}" +-layer at (259,325) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (259,325) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (414,325) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (283,348) size 141x13 scrollWidth 288 +- RenderBlock {DIV} at (3,3) size 141x13 [color=#A9A9A9] +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +-layer at (283,348) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (438,348) size 141x13 scrollWidth 289 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 288x13 +- text run at (0,0) width 288: "Lorem ipsum dolor sit amet, consectetur adipiscing elit" +diff --git a/LayoutTests/platform/mac-mojave/fast/dom/34176-expected.txt b/LayoutTests/platform/mac-mojave/fast/dom/34176-expected.txt +deleted file mode 100644 +index a00b08bb06b23c6b873f77ec5a2e05a70efa1f0d..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/dom/34176-expected.txt ++++ /dev/null +@@ -1,389 +0,0 @@ +-layer at (0,0) size 785x1458 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x1458 +- RenderBlock {HTML} at (0,0) size 785x1458 +- RenderBody {BODY} at (8,16) size 769x1426 +- RenderBlock {P} at (0,0) size 769x54 +- RenderText {#text} at (8,0) size 761x54 +- text run at (8,0) width 405: "Test rendering of 3 text runs -- TextRun1 TextRun2 TextRun3, " +- text run at (412,0) width 357: "in which TextRun1 and TextRun2's bidi level are 2, and" +- text run at (39,18) width 730: "TextRun3's bidi level is 1. TextRun2 and TextRun3 are siblings. But their ancestor (not their parent) is a sibling of" +- text run at (93,36) width 72: "TextRun1. " +- text run at (164,36) width 605: "The visual order should be TextRun3 TextRun1 TextRun2, not TextRun3 TextRun2 TextRun1." +- RenderBlock {HR} at (0,70) size 769x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,88) size 769x19 +- RenderText {#text} at (299,1) size 470x18 +- text run at (299,1) width 348: "Pure text. The following 3 lines should all display as \"" +- text run at (646,1) width 28 RTL: "\x{5E9}\x{5E0}\x{5D1}" +- text run at (673,1) width 96: " This is a Test\"" +- RenderBlock {DIV} at (0,123) size 769x19 [bgcolor=#FF0000] +- RenderText {#text} at (684,1) size 59x18 +- text run at (684,1) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 116x18 +- RenderInline {SPAN} at (0,0) size 116x18 +- RenderText {#text} at (680,1) size 89x18 +- text run at (680,1) width 5 RTL: " " +- text run at (742,1) width 27: "Test" +- RenderInline {SPAN} at (0,0) size 28x18 +- RenderText {#text} at (653,1) size 28x18 +- text run at (653,1) width 28 RTL: "\x{5E9}\x{5E0}\x{5D1}" +- RenderBlock {DIV} at (0,142) size 769x19 [bgcolor=#FF0000] +- RenderText {#text} at (684,1) size 59x18 +- text run at (684,1) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 116x18 +- RenderInline {SPAN} at (0,0) size 116x18 +- RenderInline {SPAN} at (0,0) size 116x18 +- RenderText {#text} at (680,1) size 89x18 +- text run at (680,1) width 5 RTL: " " +- text run at (742,1) width 27: "Test" +- RenderInline {SPAN} at (0,0) size 28x18 +- RenderText {#text} at (653,1) size 28x18 +- text run at (653,1) width 28 RTL: "\x{5E9}\x{5E0}\x{5D1}" +- RenderBlock {DIV} at (0,161) size 769x19 +- RenderText {#text} at (684,1) size 59x18 +- text run at (684,1) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 116x18 +- RenderText {#text} at (680,1) size 89x18 +- text run at (680,1) width 5 RTL: " " +- text run at (742,1) width 27: "Test" +- RenderInline {SPAN} at (0,0) size 28x18 +- RenderText {#text} at (653,1) size 28x18 +- text run at (653,1) width 28 RTL: "\x{5E9}\x{5E0}\x{5D1}" +- RenderBlock {HR} at (0,188) size 769x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,206) size 769x18 +- RenderText {#text} at (314,0) size 455x18 +- text run at (314,0) width 455: "Text in . The English text should be displayed as \"This is a Test\"." +- RenderBlock {DIV} at (0,240) size 769x18 [bgcolor=#FF0000] +- RenderText {#text} at (685,0) size 59x18 +- text run at (685,0) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 84x18 +- RenderInline {EM} at (0,0) size 84x18 +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderText {#text} at (743,0) size 26x18 +- text run at (743,0) width 26: "Test" +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderBlock {DIV} at (0,258) size 769x18 [bgcolor=#FF0000] +- RenderText {#text} at (685,0) size 59x18 +- text run at (685,0) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 84x18 +- RenderInline {EM} at (0,0) size 84x18 +- RenderText {#text} at (743,0) size 26x18 +- text run at (743,0) width 26: "Test" +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderBlock {DIV} at (0,276) size 769x19 [bgcolor=#FF0000] +- RenderText {#text} at (685,1) size 59x18 +- text run at (685,1) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 118x18 +- RenderInline {EM} at (0,0) size 118x18 +- RenderText {#text} at (681,1) size 88x18 +- text run at (681,1) width 5 RTL: " " +- text run at (743,1) width 26: "Test" +- RenderInline {SPAN} at (0,0) size 31x18 +- RenderText {#text} at (651,1) size 31x18 +- text run at (651,1) width 31 RTL: "\x{5D3}\x{5DE}\x{5D4}" +- RenderBlock {DIV} at (0,295) size 769x18 +- RenderText {#text} at (685,0) size 59x18 +- text run at (685,0) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 26x18 +- RenderInline {EM} at (0,0) size 26x18 +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderText {#text} at (743,0) size 26x18 +- text run at (743,0) width 26: "Test" +- RenderBlock {DIV} at (0,313) size 769x18 +- RenderText {#text} at (685,0) size 59x18 +- text run at (685,0) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 26x18 +- RenderInline {EM} at (0,0) size 26x18 +- RenderText {#text} at (743,0) size 26x18 +- text run at (743,0) width 26: "Test" +- RenderBlock {HR} at (0,339) size 769x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,357) size 769x18 +- RenderText {#text} at (289,0) size 480x18 +- text run at (289,0) width 480: "Text in . The following lines should all display as \"This is a Test\"." +- RenderBlock {DIV} at (0,391) size 769x18 [bgcolor=#FF0000] +- RenderText {#text} at (682,0) size 60x18 +- text run at (682,0) width 60: "This is a " +- RenderInline {SPAN} at (0,0) size 87x18 +- RenderInline {STRONG} at (0,0) size 87x18 +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderText {#text} at (741,0) size 28x18 +- text run at (741,0) width 28: "Test" +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderBlock {DIV} at (0,409) size 769x18 [bgcolor=#FF0000] +- RenderText {#text} at (682,0) size 60x18 +- text run at (682,0) width 60: "This is a " +- RenderInline {SPAN} at (0,0) size 87x18 +- RenderInline {STRONG} at (0,0) size 87x18 +- RenderText {#text} at (741,0) size 28x18 +- text run at (741,0) width 28: "Test" +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderBlock {DIV} at (0,427) size 769x18 +- RenderText {#text} at (682,0) size 60x18 +- text run at (682,0) width 60: "This is a " +- RenderInline {SPAN} at (0,0) size 28x18 +- RenderInline {STRONG} at (0,0) size 28x18 +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderText {#text} at (741,0) size 28x18 +- text run at (741,0) width 28: "Test" +- RenderBlock {DIV} at (0,445) size 769x18 +- RenderText {#text} at (682,0) size 60x18 +- text run at (682,0) width 60: "This is a " +- RenderInline {SPAN} at (0,0) size 28x18 +- RenderInline {STRONG} at (0,0) size 28x18 +- RenderText {#text} at (741,0) size 28x18 +- text run at (741,0) width 28: "Test" +- RenderBlock {HR} at (0,471) size 769x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,489) size 769x18 +- RenderText {#text} at (324,0) size 445x18 +- text run at (324,0) width 445: "Text in . The following lines should all display as \"This is a Test\"." +- RenderBlock {DIV} at (0,523) size 769x18 [bgcolor=#FF0000] +- RenderText {#text} at (685,0) size 59x18 +- text run at (685,0) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 84x18 +- RenderInline {I} at (0,0) size 84x18 +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderText {#text} at (743,0) size 26x18 +- text run at (743,0) width 26: "Test" +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderBlock {DIV} at (0,541) size 769x18 [bgcolor=#FF0000] +- RenderText {#text} at (685,0) size 59x18 +- text run at (685,0) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 84x18 +- RenderInline {I} at (0,0) size 84x18 +- RenderText {#text} at (743,0) size 26x18 +- text run at (743,0) width 26: "Test" +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderBlock {DIV} at (0,559) size 769x18 +- RenderText {#text} at (685,0) size 59x18 +- text run at (685,0) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 26x18 +- RenderInline {I} at (0,0) size 26x18 +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderText {#text} at (743,0) size 26x18 +- text run at (743,0) width 26: "Test" +- RenderBlock {DIV} at (0,577) size 769x18 +- RenderText {#text} at (685,0) size 59x18 +- text run at (685,0) width 59: "This is a " +- RenderInline {SPAN} at (0,0) size 26x18 +- RenderInline {I} at (0,0) size 26x18 +- RenderText {#text} at (743,0) size 26x18 +- text run at (743,0) width 26: "Test" +- RenderBlock {HR} at (0,603) size 769x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,621) size 769x18 +- RenderText {#text} at (321,0) size 448x18 +- text run at (321,0) width 448: "Text in . The following lines should all display as \"This is a Test\"." +- RenderBlock {DIV} at (0,655) size 769x18 [bgcolor=#FF0000] +- RenderText {#text} at (682,0) size 60x18 +- text run at (682,0) width 60: "This is a " +- RenderInline {SPAN} at (0,0) size 87x18 +- RenderInline {B} at (0,0) size 87x18 +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderText {#text} at (741,0) size 28x18 +- text run at (741,0) width 28: "Test" +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderBlock {DIV} at (0,673) size 769x18 [bgcolor=#FF0000] +- RenderText {#text} at (682,0) size 60x18 +- text run at (682,0) width 60: "This is a " +- RenderInline {SPAN} at (0,0) size 87x18 +- RenderInline {B} at (0,0) size 87x18 +- RenderText {#text} at (741,0) size 28x18 +- text run at (741,0) width 28: "Test" +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderBlock {DIV} at (0,691) size 769x18 +- RenderText {#text} at (682,0) size 60x18 +- text run at (682,0) width 60: "This is a " +- RenderInline {SPAN} at (0,0) size 28x18 +- RenderInline {B} at (0,0) size 28x18 +- RenderInline {SPAN} at (0,0) size 1x18 +- RenderText {#text} at (741,0) size 28x18 +- text run at (741,0) width 28: "Test" +- RenderBlock {DIV} at (0,709) size 769x18 +- RenderText {#text} at (682,0) size 60x18 +- text run at (682,0) width 60: "This is a " +- RenderInline {SPAN} at (0,0) size 28x18 +- RenderInline {B} at (0,0) size 28x18 +- RenderText {#text} at (741,0) size 28x18 +- text run at (741,0) width 28: "Test" +- RenderBlock (anonymous) at (0,727) size 769x0 +- RenderInline {B} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,735) size 769x691 +- RenderBlock {HR} at (0,0) size 769x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,18) size 769x18 +- RenderText {#text} at (91,0) size 678x18 +- text run at (91,0) width 678: "Text in , , , . The following English text should all display as \"This is a Test\"." +- RenderBlock {DIV} at (0,52) size 769x24 [bgcolor=#FF0000] +- RenderText {#text} at (680,6) size 62x18 +- text run at (680,6) width 62: "This is a " +- RenderInline {SPAN} at (0,0) size 109x18 +- RenderInline {A} at (0,0) size 109x18 [color=#551A8B] +- RenderText {#text} at (741,6) size 28x18 +- text run at (741,6) width 28: "Test" +- RenderInline {SPAN} at (0,0) size 21x18 +- RenderImage {IMG} at (660,0) size 21x20 +- RenderBlock {DIV} at (0,76) size 769x19 [bgcolor=#FF0000] +- RenderText {#text} at (680,1) size 62x18 +- text run at (680,1) width 62: "This is a " +- RenderInline {SPAN} at (0,0) size 122x18 +- RenderInline {A} at (0,0) size 122x18 [color=#551A8B] +- RenderText {#text} at (676,1) size 93x18 +- text run at (676,1) width 5 RTL: " " +- text run at (741,1) width 28: "Test" +- RenderInline {SPAN} at (0,0) size 30x18 +- RenderText {#text} at (647,1) size 30x18 +- text run at (647,1) width 30 RTL: "\x{5E9}\x{5E0}\x{5D1}" +- RenderBlock {DIV} at (0,95) size 769x18 [bgcolor=#FF0000] +- RenderText {#text} at (678,0) size 62x18 +- text run at (678,0) width 62: "This is a " +- RenderInline {SPAN} at (0,0) size 91x18 +- RenderInline {EM} at (0,0) size 91x18 +- RenderText {#text} at (739,0) size 30x18 +- text run at (739,0) width 30: "Test" +- RenderInline {A} at (0,0) size 1x18 [color=#551A8B] +- RenderBlock {DIV} at (0,113) size 769x24 [bgcolor=#FF0000] +- RenderText {#text} at (678,6) size 62x18 +- text run at (678,6) width 62: "This is a " +- RenderInline {SPAN} at (0,0) size 111x18 +- RenderInline {EM} at (0,0) size 111x18 +- RenderText {#text} at (739,6) size 30x18 +- text run at (739,6) width 30: "Test" +- RenderInline {SPAN} at (0,0) size 21x18 +- RenderImage {IMG} at (658,0) size 21x20 +- RenderBlock {DIV} at (0,137) size 769x18 +- RenderText {#text} at (638,0) size 62x18 +- text run at (638,0) width 62: "This is a " +- RenderInline {SPAN} at (0,0) size 70x18 +- RenderInline {A} at (0,0) size 70x18 [color=#551A8B] +- RenderText {#text} at (699,0) size 33x18 +- text run at (699,0) width 33: "Test " +- RenderInline {SPAN} at (0,0) size 38x18 +- RenderText {#text} at (731,0) size 38x18 +- text run at (731,0) width 38: "again" +- RenderBlock {DIV} at (0,155) size 769x42 +- RenderBlock (anonymous) at (0,0) size 769x18 +- RenderText {#text} at (678,0) size 62x18 +- text run at (678,0) width 62: "This is a " +- RenderInline {SPAN} at (0,0) size 30x18 +- RenderInline {EM} at (0,0) size 30x18 +- RenderText {#text} at (739,0) size 30x18 +- text run at (739,0) width 30: "Test" +- RenderBlock (anonymous) at (0,18) size 769x24 +- RenderTable {TABLE} at (754,0) size 15x24 +- RenderTableSection {TBODY} at (0,0) size 15x24 +- RenderTableRow {TR} at (0,2) size 15x20 +- RenderTableCell {TD} at (2,2) size 11x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 9x18 +- text run at (1,1) width 9: "a" +- RenderBlock (anonymous) at (0,42) size 769x0 +- RenderInline {SPAN} at (0,0) size 0x0 +- RenderInline {EM} at (0,0) size 0x0 +- RenderBlock {HR} at (0,205) size 769x2 [border: (1px inset #000000)] +- RenderBlock {UL} at (0,223) size 769x468 +- RenderListItem {LI} at (40,0) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Test 0: : Success" +- RenderListItem {LI} at (40,18) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Test 1: : Success" +- RenderListItem {LI} at (40,36) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Test 2: : Success" +- RenderListItem {LI} at (40,54) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Test 3: : Success" +- RenderListItem {LI} at (40,72) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Test 4: : Success" +- RenderListItem {LI} at (40,90) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Test 5: : Success" +- RenderListItem {LI} at (40,108) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Test 6: : Success" +- RenderListItem {LI} at (40,126) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Test 7: : Success" +- RenderListItem {LI} at (40,144) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Test 8: : Success" +- RenderListItem {LI} at (40,162) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Test 9: : Success" +- RenderListItem {LI} at (40,180) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 10: : Success" +- RenderListItem {LI} at (40,198) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 118x18 +- text run at (0,0) width 118: "Test 11: : Success" +- RenderListItem {LI} at (40,216) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 12: : Success" +- RenderListItem {LI} at (40,234) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 13: : Success" +- RenderListItem {LI} at (40,252) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 14: : Success" +- RenderListItem {LI} at (40,270) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 15: : Success" +- RenderListItem {LI} at (40,288) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 16: : Success" +- RenderListItem {LI} at (40,306) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 17: : Success" +- RenderListItem {LI} at (40,324) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 18: : Success" +- RenderListItem {LI} at (40,342) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 19: : Success" +- RenderListItem {LI} at (40,360) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 20: : Success" +- RenderListItem {LI} at (40,378) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 21: : Success" +- RenderListItem {LI} at (40,396) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 22: : Success" +- RenderListItem {LI} at (40,414) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 23: : Success" +- RenderListItem {LI} at (40,432) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 24: : Success" +- RenderListItem {LI} at (40,450) size 729x18 +- RenderListMarker at (-17,0) size 7x18: bullet +- RenderText {#text} at (0,0) size 119x18 +- text run at (0,0) width 119: "Test 25: : Success" +- RenderBlock (anonymous) at (0,1442) size 769x0 +- RenderInline {B} at (0,0) size 0x0 +-selection start: position 0 of child 0 {#text} of child 14 {DIV} of child 56 {B} of body +-selection end: position 4 of child 0 {#text} of child 14 {DIV} of child 56 {B} of body +diff --git a/LayoutTests/platform/mac-mojave/fast/dom/clone-node-dynamic-style-expected.txt b/LayoutTests/platform/mac-mojave/fast/dom/clone-node-dynamic-style-expected.txt +deleted file mode 100644 +index 4b9e2ca2c954a5282ea482fb3ffa6c30bcb3a36f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/dom/clone-node-dynamic-style-expected.txt ++++ /dev/null +@@ -1,46 +0,0 @@ +-layer at (0,0) size 861x585 +- RenderView at (0,0) size 800x585 +-layer at (0,0) size 800x585 +- RenderBlock {HTML} at (0,0) size 800x585 +- RenderBody {BODY} at (8,8) size 784x569 +- RenderBlock {H1} at (0,0) size 784x37 +- RenderText {#text} at (0,0) size 195x37 +- text run at (0,0) width 195: "Cloning nodes" +- RenderBlock {DIV} at (0,58) size 784x41 [bgcolor=#FFFF00] [border: (2px ridge #000000)] +- RenderInline {SPAN} at (0,0) size 851x36 +- RenderText {#text} at (2,2) size 61x36 +- text run at (2,2) width 61: "Bold" +- RenderInline {SPAN} at (0,0) size 731x36 +- RenderText {#text} at (62,2) size 206x36 +- text run at (62,2) width 206: "Bold+Underline" +- RenderInline {SPAN} at (0,0) size 304x36 +- RenderText {#text} at (267,2) size 304x36 +- text run at (267,2) width 304: "Bold+Underline+Italic" +- RenderText {#text} at (570,2) size 223x36 +- text run at (570,2) width 223: "Bold+Uunderline" +- RenderText {#text} at (792,2) size 61x36 +- text run at (792,2) width 61: "Bold" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,98) size 784x19 +- RenderText {#text} at (0,0) size 191x18 +- text run at (0,0) width 191: "Cloned Node with deep=false" +- RenderBlock {DIV} at (0,116) size 784x41 [bgcolor=#FFFF00] [border: (2px ridge #000000)] +- RenderBR {BR} at (2,2) size 0x36 +- RenderBlock (anonymous) at (0,156) size 784x19 +- RenderText {#text} at (0,0) size 186x18 +- text run at (0,0) width 186: "Cloned Node with deep=true" +- RenderBlock {DIV} at (0,174) size 784x41 [bgcolor=#FFFF00] [border: (2px ridge #000000)] +- RenderInline {SPAN} at (0,0) size 851x36 +- RenderText {#text} at (2,2) size 61x36 +- text run at (2,2) width 61: "Bold" +- RenderInline {SPAN} at (0,0) size 731x36 +- RenderText {#text} at (62,2) size 206x36 +- text run at (62,2) width 206: "Bold+Underline" +- RenderInline {SPAN} at (0,0) size 304x36 +- RenderText {#text} at (267,2) size 304x36 +- text run at (267,2) width 304: "Bold+Underline+Italic" +- RenderText {#text} at (570,2) size 223x36 +- text run at (570,2) width 223: "Bold+Uunderline" +- RenderText {#text} at (792,2) size 61x36 +- text run at (792,2) width 61: "Bold" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/basic-inputs-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/basic-inputs-expected.txt +deleted file mode 100644 +index 427e6961011dbe702944e712b4570e302ec846fc..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/basic-inputs-expected.txt ++++ /dev/null +@@ -1,88 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 470x582 +- RenderBlock (anonymous) at (0,0) size 470x306 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "This tests basic inputs. Here's what you should see:" +- RenderBR {BR} at (327,0) size 1x18 +- RenderBR {BR} at (0,18) size 0x18 +- RenderText {#text} at (0,36) size 461x54 +- text run at (0,36) width 442: "first line: the letter \"a\" and then a text input field filled with repeating" +- text run at (0,54) width 86: "\"foobarbaz\", " +- text run at (85,54) width 376: "then the word \"text\" followed by a disabled text input field" +- text run at (0,72) width 331: "filled with \"foo\" and then the letter \"b\" and then \"a\"" +- RenderBR {BR} at (330,72) size 1x18 +- RenderBR {BR} at (0,90) size 0x18 +- RenderText {#text} at (0,108) size 467x54 +- text run at (0,108) width 437: "second line: and then a password input field that's filled and then the" +- text run at (0,126) width 467: "word \"password\" and then a disabled password field that's filled and then" +- text run at (0,144) width 82: "the letter \"b\"" +- RenderBR {BR} at (81,144) size 1x18 +- RenderBR {BR} at (0,162) size 0x18 +- RenderText {#text} at (0,180) size 459x36 +- text run at (0,180) width 459: "third line: the letter \"a\" and then a checkbox (unchecked) with the word" +- text run at (0,198) width 356: "\"checkbox\" and then a disabled checkbox and letter \"b\"" +- RenderBR {BR} at (355,198) size 1x18 +- RenderBR {BR} at (0,216) size 0x18 +- RenderText {#text} at (0,234) size 457x54 +- text run at (0,234) width 411: "fourth line: the last line has the letter \"a\" and then a redio button" +- text run at (0,252) width 457: "(unselected) and then the word \"radio\" and then a disabled radio button" +- text run at (0,270) width 109: "and the letter \"b\"" +- RenderBR {BR} at (108,270) size 1x18 +- RenderBR {BR} at (0,288) size 0x18 +- RenderBlock {DIV} at (10,316) size 450x48 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,3) size 8x18 +- text run at (1,3) width 8: "a" +- RenderTextControl {INPUT} at (10,3) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (158,3) size 29x18 +- text run at (158,3) width 29: "text " +- RenderTextControl {INPUT} at (188,3) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (336,3) size 20x18 +- text run at (336,3) width 13: "b " +- text run at (348,3) width 8: "a" +- RenderTextControl {INPUT} at (3,26) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (151,26) size 66x18 +- text run at (151,26) width 66: "password " +- RenderTextControl {INPUT} at (218,26) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (366,26) size 9x18 +- text run at (366,26) width 9: "b" +- RenderBlock {DIV} at (10,374) size 450x21 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,1) size 8x18 +- text run at (1,1) width 8: "a" +- RenderBlock {INPUT} at (10,5) size 13x12 +- RenderText {#text} at (24,1) size 66x18 +- text run at (24,1) width 66: "checkbox " +- RenderBlock {INPUT} at (91,5) size 13x12 +- RenderText {#text} at (105,1) size 9x18 +- text run at (105,1) width 9: "b" +- RenderBlock {DIV} at (10,405) size 450x21 [border: (1px solid #FF0000)] +- RenderText {#text} at (1,1) size 8x18 +- text run at (1,1) width 8: "a" +- RenderBlock {INPUT} at (10,5) size 13x12 +- RenderText {#text} at (24,1) size 37x18 +- text run at (24,1) width 37: "radio " +- RenderBlock {INPUT} at (62,5) size 13x12 +- RenderText {#text} at (76,1) size 9x18 +- text run at (76,1) width 9: "b" +-layer at (31,330) size 141x13 scrollWidth 160 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 160x13 +- text run at (0,0) width 160: "foobarbazfoobarbazfoobarbaz" +-layer at (210,330) size 140x13 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#545454] +- RenderText {#text} at (0,0) size 17x13 +- text run at (0,0) width 17: "foo" +-layer at (24,353) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 16x13 +- text run at (0,0) width 16: "\x{2022}\x{2022}\x{2022}" +-layer at (239,353) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 [color=#545454] +- RenderText {#text} at (0,0) size 16x13 +- text run at (0,0) width 16: "\x{2022}\x{2022}\x{2022}" +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/button-positioned-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/button-positioned-expected.txt +deleted file mode 100644 +index 4053905ac0f0716ddbbc500b2e7153355f28fb92..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/button-positioned-expected.txt ++++ /dev/null +@@ -1,15 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +-layer at (10,10) size 149x18 +- RenderButton {BUTTON} at (10,10) size 150x18 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 134x13 +- RenderText {#text} at (0,0) size 134x13 +- text run at (0,0) width 134: "This button is positioned." +-layer at (10,10) size 170x18 +- RenderButton {INPUT} at (10,10) size 171x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 155x13 +- RenderText at (0,0) size 155x13 +- text run at (0,0) width 155: "This button is also positioned" +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/button-sizes-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/button-sizes-expected.txt +deleted file mode 100644 +index 4141bbfb7f1e39c556613b4659d08789f2b9afeb..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/button-sizes-expected.txt ++++ /dev/null +@@ -1,112 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderButton {BUTTON} at (0,8) size 46x15 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,4) size 30x6 +- RenderText {#text} at (0,0) size 30x6 +- text run at (0,0) width 30: "Test Button" +- RenderText {#text} at (45,3) size 5x18 +- text run at (45,3) width 5: " " +- RenderButton {BUTTON} at (49,8) size 52x15 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,3) size 36x8 +- RenderText {#text} at (0,0) size 36x7 +- text run at (0,0) width 36: "Test Button" +- RenderText {#text} at (100,3) size 5x18 +- text run at (100,3) width 5: " " +- RenderButton {BUTTON} at (104,7) size 57x15 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,3) size 41x8 +- RenderText {#text} at (0,0) size 41x8 +- text run at (0,0) width 41: "Test Button" +- RenderText {#text} at (160,3) size 5x18 +- text run at (160,3) width 5: " " +- RenderButton {BUTTON} at (164,7) size 63x15 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 46x10 +- RenderText {#text} at (0,0) size 46x10 +- text run at (0,0) width 46: "Test Button" +- RenderText {#text} at (226,3) size 5x18 +- text run at (226,3) width 5: " " +- RenderButton {BUTTON} at (230,6) size 67x16 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText {#text} at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (296,3) size 5x18 +- text run at (296,3) width 5: " " +- RenderButton {BUTTON} at (300,5) size 73x17 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 56x12 +- RenderText {#text} at (0,0) size 56x12 +- text run at (0,0) width 56: "Test Button" +- RenderText {#text} at (372,3) size 5x18 +- text run at (372,3) width 5: " " +- RenderButton {BUTTON} at (378,4) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText {#text} at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (456,3) size 5x18 +- text run at (456,3) width 5: " " +- RenderButton {INPUT} at (462,4) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (540,3) size 5x18 +- text run at (540,3) width 5: " " +- RenderButton {BUTTON} at (546,3) size 82x20 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 65x15 +- RenderText {#text} at (0,0) size 65x15 +- text run at (0,0) width 65: "Test Button" +- RenderText {#text} at (629,3) size 5x18 +- text run at (629,3) width 5: " " +- RenderButton {BUTTON} at (635,2) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText {#text} at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (722,3) size 5x18 +- text run at (722,3) width 5: " " +- RenderButton {BUTTON} at (2,32) size 91x22 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 75x17 +- RenderText {#text} at (0,0) size 75x17 +- text run at (0,0) width 75: "Test Button" +- RenderText {#text} at (94,34) size 5x18 +- text run at (94,34) width 5: " " +- RenderButton {BUTTON} at (100,31) size 95x23 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 79x18 +- RenderText {#text} at (0,0) size 79x18 +- text run at (0,0) width 79: "Test Button" +- RenderText {#text} at (196,34) size 5x18 +- text run at (196,34) width 5: " " +- RenderButton {BUTTON} at (202,31) size 100x23 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 84x18 +- RenderText {#text} at (0,0) size 84x18 +- text run at (0,0) width 84: "Test Button" +- RenderText {#text} at (303,34) size 5x18 +- text run at (303,34) width 5: " " +- RenderButton {BUTTON} at (309,30) size 105x25 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 88x20 +- RenderText {#text} at (0,0) size 88x20 +- text run at (0,0) width 88: "Test Button" +- RenderText {#text} at (415,34) size 5x18 +- text run at (415,34) width 5: " " +- RenderButton {BUTTON} at (421,29) size 109x26 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 93x21 +- RenderText {#text} at (0,0) size 93x21 +- text run at (0,0) width 93: "Test Button" +- RenderText {#text} at (531,34) size 5x18 +- text run at (531,34) width 5: " " +- RenderButton {BUTTON} at (537,28) size 115x27 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 98x22 +- RenderText {#text} at (0,0) size 98x22 +- text run at (0,0) width 98: "Test Button" +- RenderText {#text} at (653,34) size 5x18 +- text run at (653,34) width 5: " " +- RenderButton {BUTTON} at (659,27) size 115x28 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 99x23 +- RenderText {#text} at (0,0) size 99x23 +- text run at (0,0) width 99: "Test Button" +- RenderText {#text} at (775,34) size 5x18 +- text run at (775,34) width 5: " " +- RenderButton {BUTTON} at (2,59) size 119x29 [color=#000000D8] [bgcolor=#C0C0C0] [border: none (2px outset #C0C0C0) none (2px outset #C0C0C0)] +- RenderBlock (anonymous) at (8,2) size 103x24 +- RenderText {#text} at (0,0) size 103x24 +- text run at (0,0) width 103: "Test Button" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/date/date-input-rendering-basic-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/date/date-input-rendering-basic-expected.txt +deleted file mode 100644 +index 281158451a5bb6b90319605a4471a8067589591b..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/date/date-input-rendering-basic-expected.txt ++++ /dev/null +@@ -1,48 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (83,4) size 5x18 +- text run at (83,4) width 5: " " +- RenderText {#text} at (0,0) size 0x0 +-layer at (10,10) size 79x23 clip at (12,12) size 75x19 +- RenderFlexibleBox {INPUT} at (2,2) size 80x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +-layer at (13,13) size 73x17 +- RenderBlock {DIV} at (3,3) size 74x17 +- RenderBlock {DIV} at (1,1) size 72x15 +- RenderBlock {DIV} at (0,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "04" +- RenderInline {DIV} at (0,0) size 5x13 +- RenderText {#text} at (16,1) size 5x13 +- text run at (16,1) width 5: "/" +- RenderBlock {DIV} at (20,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "01" +- RenderInline {DIV} at (0,0) size 5x13 +- RenderText {#text} at (36,1) size 5x13 +- text run at (36,1) width 5: "/" +- RenderBlock {DIV} at (40,0) size 32x15 +- RenderText {#text} at (1,1) size 29x13 +- text run at (1,1) width 29: "1976" +-layer at (97,10) size 79x23 clip at (99,12) size 75x19 +- RenderFlexibleBox {INPUT} at (89,2) size 80x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +-layer at (100,13) size 73x17 +- RenderBlock {DIV} at (3,3) size 74x17 +- RenderBlock {DIV} at (1,1) size 72x15 +- RenderBlock {DIV} at (54,0) size 18x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "04" +- RenderInline {DIV} at (0,0) size 5x13 +- RenderText {#text} at (50,1) size 5x13 +- text run at (50,1) width 5 RTL: "/" +- RenderBlock {DIV} at (34,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "01" +- RenderInline {DIV} at (0,0) size 5x13 +- RenderText {#text} at (30,1) size 5x13 +- text run at (30,1) width 5 RTL: "/" +- RenderBlock {DIV} at (0,0) size 31x15 +- RenderText {#text} at (1,1) size 29x13 +- text run at (1,1) width 29: "1976" +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/input-appearance-spinbutton-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/input-appearance-spinbutton-expected.txt +deleted file mode 100644 +index b6d4350e69c0faf3de8a4837e55d50d5f3e3cc1c..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/input-appearance-spinbutton-expected.txt ++++ /dev/null +@@ -1,207 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 245x18 +- text run at (0,0) width 245: "Test appearances of outer-spin-button." +- RenderBlock {DIV} at (0,34) size 784x0 +- RenderBlock {DIV} at (0,34) size 784x528 +- RenderTable {TABLE} at (0,0) size 503x528 +- RenderTableSection {TBODY} at (0,0) size 503x528 +- RenderTableRow {TR} at (0,2) size 503x524 +- RenderTableCell {TD} at (2,83) size 198x362 [r=0 c=0 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 196x32 +- RenderTextControl {INPUT} at (0,0) size 112x16 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (111,-3) size 1x18 +- RenderTextControl {INPUT} at (0,16) size 112x16 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 106x16 +- RenderBlock {DIV} at (0,2) size 93x11 +- RenderBlock {DIV} at (1,33) size 196x34 +- RenderTextControl {INPUT} at (0,0) size 124x17 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (123,-2) size 1x18 +- RenderTextControl {INPUT} at (0,17) size 124x17 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 118x15 +- RenderBlock {DIV} at (0,2) size 105x11 +- RenderBlock {DIV} at (1,67) size 196x36 +- RenderTextControl {INPUT} at (0,0) size 136x18 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (135,-1) size 1x18 +- RenderTextControl {INPUT} at (0,18) size 136x18 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 130x16 +- RenderBlock {DIV} at (0,1) size 117x13 +- RenderBlock {DIV} at (1,103) size 196x46 +- RenderTextControl {INPUT} at (2,2) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (150,2) size 1x18 +- RenderTextControl {INPUT} at (2,25) size 147x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 141x17 +- RenderBlock {DIV} at (0,1) size 128x14 +- RenderBlock {DIV} at (1,149) size 196x50 +- RenderTextControl {INPUT} at (2,2) size 159x21 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (162,3) size 1x18 +- RenderTextControl {INPUT} at (2,27) size 159x21 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 153x19 +- RenderBlock {DIV} at (0,1) size 140x16 +- RenderBlock {DIV} at (1,199) size 196x52 +- RenderTextControl {INPUT} at (2,2) size 170x22 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (173,4) size 1x18 +- RenderTextControl {INPUT} at (2,28) size 170x22 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 164x20 +- RenderBlock {DIV} at (0,1) size 149x17 +- RenderBlock {DIV} at (1,251) size 196x54 +- RenderTextControl {INPUT} at (2,2) size 181x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (184,5) size 1x18 +- RenderTextControl {INPUT} at (2,29) size 181x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,1) size 175x21 +- RenderBlock {DIV} at (0,2) size 160x17 +- RenderBlock {DIV} at (1,305) size 196x56 +- RenderTextControl {INPUT} at (2,2) size 192x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (195,6) size 1x18 +- RenderTextControl {INPUT} at (2,30) size 192x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 186x24 +- RenderBlock {DIV} at (0,2) size 171x19 +- RenderTableCell {TD} at (201,2) size 300x524 [r=0 c=1 rs=1 cs=1] +- RenderBlock {DIV} at (1,1) size 297x56 +- RenderTextControl {INPUT} at (2,2) size 203x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (206,6) size 1x18 +- RenderTextControl {INPUT} at (2,30) size 203x24 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 197x24 +- RenderBlock {DIV} at (0,3) size 182x18 +- RenderBlock {DIV} at (1,57) size 297x60 +- RenderTextControl {INPUT} at (2,2) size 214x26 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (217,7) size 1x18 +- RenderTextControl {INPUT} at (2,32) size 214x26 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 208x26 +- RenderBlock {DIV} at (0,2) size 193x21 +- RenderBlock {DIV} at (1,117) size 297x62 +- RenderTextControl {INPUT} at (2,2) size 226x27 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (229,8) size 1x18 +- RenderTextControl {INPUT} at (2,33) size 226x27 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 220x27 +- RenderBlock {DIV} at (0,3) size 201x21 +- RenderBlock {DIV} at (1,179) size 297x64 +- RenderTextControl {INPUT} at (2,2) size 237x28 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (240,9) size 1x18 +- RenderTextControl {INPUT} at (2,34) size 237x28 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 231x28 +- RenderBlock {DIV} at (0,3) size 212x22 +- RenderBlock {DIV} at (1,243) size 297x66 +- RenderTextControl {INPUT} at (2,2) size 257x29 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (260,10) size 1x18 +- RenderTextControl {INPUT} at (2,35) size 257x29 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 251x29 +- RenderBlock {DIV} at (0,3) size 232x23 +- RenderBlock {DIV} at (1,309) size 297x68 +- RenderTextControl {INPUT} at (2,2) size 269x30 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (272,11) size 1x18 +- RenderTextControl {INPUT} at (2,36) size 269x30 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 263x30 +- RenderBlock {DIV} at (0,3) size 244x24 +- RenderBlock {DIV} at (1,377) size 297x72 +- RenderTextControl {INPUT} at (2,2) size 281x32 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (284,12) size 1x18 +- RenderTextControl {INPUT} at (2,38) size 281x32 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 275x32 +- RenderBlock {DIV} at (0,3) size 256x26 +- RenderBlock {DIV} at (1,449) size 297x74 +- RenderTextControl {INPUT} at (2,2) size 293x33 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (296,13) size 1x18 +- RenderTextControl {INPUT} at (2,39) size 293x33 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 287x33 +- RenderBlock {DIV} at (0,3) size 268x27 +-layer at (14,129) size 106x10 +- RenderBlock {DIV} at (3,3) size 106x10 +-layer at (14,145) size 93x10 +- RenderBlock {DIV} at (0,0) size 93x10 +-layer at (14,161) size 118x11 +- RenderBlock {DIV} at (3,3) size 118x11 +-layer at (14,178) size 105x11 +- RenderBlock {DIV} at (0,0) size 105x11 +-layer at (14,195) size 129x12 +- RenderBlock {DIV} at (3,3) size 130x12 +-layer at (14,213) size 116x12 +- RenderBlock {DIV} at (0,0) size 117x12 +-layer at (16,233) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +-layer at (16,256) size 128x13 +- RenderBlock {DIV} at (0,0) size 128x13 +-layer at (16,279) size 152x15 +- RenderBlock {DIV} at (3,3) size 153x15 +-layer at (16,304) size 139x15 +- RenderBlock {DIV} at (0,0) size 140x15 +-layer at (16,329) size 163x16 +- RenderBlock {DIV} at (3,3) size 164x16 +-layer at (16,355) size 148x16 +- RenderBlock {DIV} at (0,0) size 149x16 +-layer at (16,381) size 174x17 +- RenderBlock {DIV} at (3,3) size 175x17 +-layer at (16,408) size 159x17 +- RenderBlock {DIV} at (0,0) size 160x17 +-layer at (16,435) size 185x18 +- RenderBlock {DIV} at (3,3) size 186x18 +-layer at (16,463) size 170x18 +- RenderBlock {DIV} at (0,0) size 171x18 +-layer at (215,50) size 196x18 +- RenderBlock {DIV} at (3,3) size 197x18 +-layer at (215,78) size 181x18 +- RenderBlock {DIV} at (0,0) size 182x18 +-layer at (215,106) size 207x20 +- RenderBlock {DIV} at (3,3) size 208x20 +-layer at (215,136) size 192x20 +- RenderBlock {DIV} at (0,0) size 193x20 +-layer at (215,166) size 219x21 +- RenderBlock {DIV} at (3,3) size 220x21 +-layer at (215,197) size 200x21 +- RenderBlock {DIV} at (0,0) size 201x21 +-layer at (215,228) size 231x22 +- RenderBlock {DIV} at (3,3) size 231x22 +-layer at (215,260) size 212x22 +- RenderBlock {DIV} at (0,0) size 212x22 +-layer at (215,292) size 251x23 +- RenderBlock {DIV} at (3,3) size 251x23 +-layer at (215,325) size 232x23 +- RenderBlock {DIV} at (0,0) size 232x23 +-layer at (215,358) size 263x24 +- RenderBlock {DIV} at (3,3) size 263x24 +-layer at (215,392) size 244x24 +- RenderBlock {DIV} at (0,0) size 244x24 +-layer at (215,426) size 275x26 +- RenderBlock {DIV} at (3,3) size 275x26 +-layer at (215,462) size 256x26 +- RenderBlock {DIV} at (0,0) size 256x26 +-layer at (215,498) size 287x27 +- RenderBlock {DIV} at (3,3) size 287x27 +-layer at (215,535) size 268x27 +- RenderBlock {DIV} at (0,0) size 268x27 +-layer at (107,143) size 13x15 +- RenderBlock (relative positioned) {DIV} at (92,0) size 14x15 +-layer at (119,176) size 13x15 +- RenderBlock (relative positioned) {DIV} at (104,0) size 14x15 +-layer at (130,212) size 13x15 +- RenderBlock (relative positioned) {DIV} at (116,0) size 14x15 +-layer at (144,254) size 13x17 +- RenderBlock (relative positioned) {DIV} at (127,0) size 14x17 +-layer at (155,303) size 13x18 +- RenderBlock (relative positioned) {DIV} at (139,0) size 14x18 +-layer at (164,353) size 15x20 +- RenderBlock (relative positioned) {DIV} at (148,0) size 16x20 +-layer at (175,406) size 15x21 +- RenderBlock (relative positioned) {DIV} at (159,0) size 16x21 +-layer at (186,461) size 15x23 +- RenderBlock (relative positioned) {DIV} at (170,0) size 16x23 +-layer at (397,75) size 15x24 +- RenderBlock (relative positioned) {DIV} at (181,0) size 16x24 +-layer at (408,133) size 15x26 +- RenderBlock (relative positioned) {DIV} at (192,0) size 16x26 +-layer at (415,194) size 19x27 +- RenderBlock (relative positioned) {DIV} at (200,0) size 20x27 +-layer at (427,257) size 19x28 +- RenderBlock (relative positioned) {DIV} at (211,-1) size 20x30 +-layer at (447,322) size 19x30 +- RenderBlock (relative positioned) {DIV} at (231,-1) size 20x31 +-layer at (459,388) size 19x32 +- RenderBlock (relative positioned) {DIV} at (243,-1) size 20x32 +-layer at (471,459) size 19x33 +- RenderBlock (relative positioned) {DIV} at (255,-1) size 20x34 +-layer at (483,531) size 19x35 +- RenderBlock (relative positioned) {DIV} at (267,-1) size 20x35 +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/input-button-sizes-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/input-button-sizes-expected.txt +deleted file mode 100644 +index 482f95eb0fe315eb4a955f1a9eb088a616c5f9d9..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/input-button-sizes-expected.txt ++++ /dev/null +@@ -1,106 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderButton {INPUT} at (0,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (66,1) size 5x18 +- text run at (66,1) width 5: " " +- RenderButton {INPUT} at (70,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (137,1) size 4x18 +- text run at (137,1) width 4: " " +- RenderButton {INPUT} at (141,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (207,1) size 5x18 +- text run at (207,1) width 5: " " +- RenderButton {INPUT} at (211,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (278,1) size 4x18 +- text run at (278,1) width 4: " " +- RenderButton {INPUT} at (282,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (348,1) size 5x18 +- text run at (348,1) width 5: " " +- RenderButton {INPUT} at (352,4) size 67x15 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 51x11 +- RenderText at (0,0) size 51x11 +- text run at (0,0) width 51: "Test Button" +- RenderText {#text} at (419,1) size 4x18 +- text run at (419,1) width 4: " " +- RenderButton {INPUT} at (425,2) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (503,1) size 5x18 +- text run at (503,1) width 5: " " +- RenderButton {INPUT} at (509,2) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (587,1) size 5x18 +- text run at (587,1) width 5: " " +- RenderButton {INPUT} at (593,2) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (671,1) size 5x18 +- text run at (671,1) width 5: " " +- RenderButton {INPUT} at (677,2) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (755,1) size 5x18 +- text run at (755,1) width 5: " " +- RenderButton {INPUT} at (2,26) size 77x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 61x13 +- RenderText at (0,0) size 61x13 +- text run at (0,0) width 61: "Test Button" +- RenderText {#text} at (80,25) size 5x18 +- text run at (80,25) width 5: " " +- RenderButton {INPUT} at (86,24) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (173,25) size 5x18 +- text run at (173,25) width 5: " " +- RenderButton {INPUT} at (179,24) size 87x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (267,25) size 5x18 +- text run at (267,25) width 5: " " +- RenderButton {INPUT} at (273,24) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (360,25) size 5x18 +- text run at (360,25) width 5: " " +- RenderButton {INPUT} at (366,24) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (454,25) size 4x18 +- text run at (454,25) width 4: " " +- RenderButton {INPUT} at (460,24) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (547,25) size 5x18 +- text run at (547,25) width 5: " " +- RenderButton {INPUT} at (553,24) size 86x21 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 70x16 +- RenderText at (0,0) size 70x16 +- text run at (0,0) width 70: "Test Button" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/input-disabled-color-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/input-disabled-color-expected.txt +deleted file mode 100644 +index d4e5ebbbf4d98464726a706eaf8b330f2aa90a79..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/input-disabled-color-expected.txt ++++ /dev/null +@@ -1,190 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 521x18 +- text run at (0,0) width 521: "This tests that the text color changes appropriately when the text field is disabled." +- RenderBR {BR} at (520,0) size 1x18 +- RenderTextControl {INPUT} at (2,20) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (149,20) size 5x18 +- text run at (149,20) width 5: " " +- RenderTextControl {INPUT} at (155,20) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderBR {BR} at (304,20) size 1x18 +- RenderTextControl {INPUT} at (2,43) size 146x19 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #FF0000)] +- RenderText {#text} at (149,43) size 5x18 +- text run at (149,43) width 5: " " +- RenderTextControl {INPUT} at (155,43) size 148x19 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #FF0000)] +- RenderBR {BR} at (304,43) size 1x18 +- RenderTextControl {INPUT} at (2,66) size 146x19 [bgcolor=#0000FF] [border: (2px inset #000000)] +- RenderText {#text} at (149,66) size 5x18 +- text run at (149,66) width 5: " " +- RenderTextControl {INPUT} at (155,66) size 148x19 [bgcolor=#0000FF] [border: (2px inset #000000)] +- RenderBR {BR} at (304,66) size 1x18 +- RenderTextControl {INPUT} at (2,89) size 146x19 [color=#FF0000] [bgcolor=#0000FF] [border: (2px inset #FF0000)] +- RenderText {#text} at (149,89) size 5x18 +- text run at (149,89) width 5: " " +- RenderTextControl {INPUT} at (155,89) size 148x19 [color=#FF0000] [bgcolor=#0000FF] [border: (2px inset #FF0000)] +- RenderBR {BR} at (304,89) size 1x18 +- RenderTextControl {INPUT} at (2,112) size 146x19 [bgcolor=#000000] [border: (2px inset #000000)] +- RenderText {#text} at (149,112) size 5x18 +- text run at (149,112) width 5: " " +- RenderTextControl {INPUT} at (155,112) size 148x19 [bgcolor=#000000] [border: (2px inset #000000)] +- RenderBR {BR} at (304,112) size 1x18 +- RenderTextControl {INPUT} at (2,135) size 146x19 [color=#FFFFFF] [bgcolor=#000000] [border: (2px inset #FFFFFF)] +- RenderText {#text} at (149,135) size 5x18 +- text run at (149,135) width 5: " " +- RenderTextControl {INPUT} at (155,135) size 148x19 [color=#FFFFFF] [bgcolor=#000000] [border: (2px inset #FFFFFF)] +- RenderBR {BR} at (304,135) size 1x18 +- RenderTextControl {INPUT} at (2,158) size 146x19 [bgcolor=#808080] [border: (2px inset #000000)] +- RenderText {#text} at (149,158) size 5x18 +- text run at (149,158) width 5: " " +- RenderTextControl {INPUT} at (155,158) size 148x19 [bgcolor=#808080] [border: (2px inset #000000)] +- RenderBR {BR} at (304,158) size 1x18 +- RenderTextControl {INPUT} at (2,181) size 146x19 [color=#FFFFFF] [bgcolor=#A9A9A9] [border: (2px inset #FFFFFF)] +- RenderText {#text} at (149,181) size 5x18 +- text run at (149,181) width 5: " " +- RenderTextControl {INPUT} at (155,181) size 148x19 [color=#FFFFFF] [bgcolor=#A9A9A9] [border: (2px inset #FFFFFF)] +- RenderBR {BR} at (304,181) size 1x18 +- RenderTextControl {INPUT} at (2,204) size 146x19 [color=#808080] [bgcolor=#000000] [border: (2px inset #808080)] +- RenderText {#text} at (149,204) size 5x18 +- text run at (149,204) width 5: " " +- RenderTextControl {INPUT} at (155,204) size 148x19 [color=#808080] [bgcolor=#000000] [border: (2px inset #808080)] +- RenderBR {BR} at (304,204) size 1x18 +- RenderTextControl {INPUT} at (2,227) size 146x19 [color=#FF0000] [bgcolor=#808080] [border: (2px inset #FF0000)] +- RenderText {#text} at (149,227) size 5x18 +- text run at (149,227) width 5: " " +- RenderTextControl {INPUT} at (155,227) size 148x19 [color=#FF0000] [bgcolor=#808080] [border: (2px inset #FF0000)] +- RenderBR {BR} at (304,227) size 1x18 +- RenderTextControl {INPUT} at (2,250) size 146x19 [color=#808080] [bgcolor=#FF0000] [border: (2px inset #808080)] +- RenderText {#text} at (149,250) size 5x18 +- text run at (149,250) width 5: " " +- RenderTextControl {INPUT} at (155,250) size 148x19 [color=#808080] [bgcolor=#FF0000] [border: (2px inset #808080)] +- RenderBR {BR} at (304,250) size 1x18 +- RenderTextControl {INPUT} at (2,273) size 146x19 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #FF0000)] +- RenderText {#text} at (149,273) size 5x18 +- text run at (149,273) width 5: " " +- RenderTextControl {INPUT} at (155,273) size 148x19 [color=#FF0000] [bgcolor=#FFFFFF] [border: (2px inset #FF0000)] +- RenderBR {BR} at (304,273) size 1x18 +- RenderTextControl {INPUT} at (2,296) size 146x19 [color=#FF0000] [border: (2px inset #FF0000)] +- RenderText {#text} at (149,296) size 5x18 +- text run at (149,296) width 5: " " +- RenderTextControl {INPUT} at (155,296) size 148x19 [color=#FF0000] [border: (2px inset #FF0000)] +- RenderBR {BR} at (304,296) size 1x18 +- RenderTextControl {INPUT} at (2,319) size 146x19 [color=#ACACAC] [bgcolor=#F2F2F2] [border: (2px inset #ACACAC)] +- RenderText {#text} at (149,319) size 5x18 +- text run at (149,319) width 5: " " +- RenderTextControl {INPUT} at (155,319) size 148x19 [color=#ACACAC] [bgcolor=#F2F2F2] [border: (2px inset #ACACAC)] +- RenderBR {BR} at (304,319) size 1x18 +-layer at (13,31) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#545454] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,31) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,54) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,54) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,77) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,77) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,100) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,100) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,123) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#545454] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,123) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,146) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#ABABAB] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,146) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,169) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#545454] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,169) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,192) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,192) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,215) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#2C2C2C] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,215) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,238) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,238) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,261) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 [color=#2C2C2C] +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,261) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,284) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,284) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,307) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,307) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +-layer at (13,330) size 140x13 scrollWidth 344 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 344x13 +- text run at (0,0) width 344: "The text in this disabled field should displayed as dimmed or grey" +-layer at (167,330) size 141x13 scrollWidth 152 +- RenderBlock {DIV} at (3,3) size 141x13 +- RenderText {#text} at (0,0) size 151x13 +- text run at (0,0) width 151: "This text field is not disabled" +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/input-readonly-dimmed-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/input-readonly-dimmed-expected.txt +deleted file mode 100644 +index 66ecf7c1b280d608c4ea043b9ee50f9b0696ce50..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/input-readonly-dimmed-expected.txt ++++ /dev/null +@@ -1,14 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 461x18 +- text run at (0,0) width 461: "This tests that the border of a readonly text field should appear dimmed." +- RenderBR {BR} at (460,0) size 1x18 +- RenderTextControl {INPUT} at (2,20) size 146x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +-layer at (13,31) size 140x13 scrollWidth 160 +- RenderBlock {DIV} at (3,3) size 140x13 +- RenderText {#text} at (0,0) size 161x13 +- text run at (0,0) width 161: "This border should be dimmed" +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/input-text-word-wrap-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/input-text-word-wrap-expected.txt +deleted file mode 100644 +index 4d077ac7b01c9ff9e2ecbf0cc9093ea2f3332df2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/input-text-word-wrap-expected.txt ++++ /dev/null +@@ -1,20 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 117x18 +- text run at (0,0) width 117: "This tests that the " +- RenderInline {CODE} at (0,0) size 71x15 +- RenderText {#text} at (116,2) size 71x15 +- text run at (116,2) width 71: "word-wrap" +- RenderText {#text} at (186,0) size 309x18 +- text run at (186,0) width 309: " property is ignored for single-line text controls." +- RenderBlock (anonymous) at (0,34) size 784x33 +- RenderTextControl {INPUT} at (2,0) size 147x33 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +-layer at (13,52) size 141x13 scrollWidth 256 +- RenderBlock {DIV} at (3,10) size 141x13 +- RenderText {#text} at (0,0) size 255x13 +- text run at (0,0) width 255: "This sentence should not wrap into the next line." +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/listbox-bidi-align-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/listbox-bidi-align-expected.txt +deleted file mode 100644 +index a8ecac1461a2efde62ba523174b6493f5bf7eba7..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/listbox-bidi-align-expected.txt ++++ /dev/null +@@ -1,74 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x504 +- RenderBlock {HTML} at (0,0) size 800x504 +- RenderBody {BODY} at (8,8) size 784x488 +- RenderBlock (anonymous) at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 614x18 +- text run at (0,0) width 614: "This test verifies the visual alignment of items in a select element while changing text direction." +- RenderBR {BR} at (613,0) size 1x18 +- RenderText {#text} at (0,18) size 438x18 +- text run at (0,18) width 438: "All the items in the following select elements should be left-aligned." +- RenderTable {TABLE} at (0,36) size 658x132 +- RenderTableSection {TBODY} at (0,0) size 658x132 +- RenderTableRow {TR} at (0,2) size 658x63 +- RenderTableCell {TD} at (2,2) size 157x63 [r=0 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 151x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (161,2) size 167x63 [r=0 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 161x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (330,2) size 157x63 [r=0 c=2 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 151x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (489,2) size 167x63 [r=0 c=3 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 161x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableRow {TR} at (0,67) size 658x63 +- RenderTableCell {TD} at (2,67) size 157x63 [r=1 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 151x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (161,67) size 167x63 [r=1 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 161x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderBlock (anonymous) at (0,168) size 784x18 +- RenderText {#text} at (0,0) size 447x18 +- text run at (0,0) width 447: "All the items in the following select elements should be right-aligned." +- RenderTable {TABLE} at (0,186) size 652x132 +- RenderTableSection {TBODY} at (0,0) size 652x132 +- RenderTableRow {TR} at (0,2) size 652x63 +- RenderTableCell {TD} at (2,2) size 165x63 [r=0 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 159x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (169,2) size 156x63 [r=0 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 150x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (327,2) size 165x63 [r=0 c=2 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 159x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (494,2) size 156x63 [r=0 c=3 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 150x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableRow {TR} at (0,67) size 652x63 +- RenderTableCell {TD} at (2,67) size 165x63 [r=1 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 159x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (169,67) size 156x63 [r=1 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 150x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderBlock (anonymous) at (0,318) size 784x18 +- RenderText {#text} at (0,0) size 456x18 +- text run at (0,0) width 456: "All the items in the following select elements should be center-aligned." +- RenderTable {TABLE} at (0,336) size 690x67 +- RenderTableSection {TBODY} at (0,0) size 690x67 +- RenderTableRow {TR} at (0,2) size 690x63 +- RenderTableCell {TD} at (2,2) size 174x63 [r=0 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 168x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (178,2) size 166x63 [r=0 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 160x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (346,2) size 174x63 [r=0 c=2 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 168x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (522,2) size 166x63 [r=0 c=3 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 160x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderBlock (anonymous) at (0,403) size 784x18 +- RenderText {#text} at (0,0) size 296x18 +- text run at (0,0) width 296: "The following tables check mixed alignments." +- RenderTable {TABLE} at (0,421) size 732x67 +- RenderTableSection {TBODY} at (0,0) size 732x67 +- RenderTableRow {TR} at (0,2) size 732x63 +- RenderTableCell {TD} at (2,2) size 169x63 [r=0 c=0 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 163x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (173,2) size 169x63 [r=0 c=1 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 163x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (344,2) size 192x63 [r=0 c=2 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 186x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderTableCell {TD} at (538,2) size 192x63 [r=0 c=3 rs=1 cs=1] +- RenderListBox {SELECT} at (3,3) size 186x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/listbox-width-change-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/listbox-width-change-expected.txt +deleted file mode 100644 +index c762ed433c8cd8d70f8e7ff0301badd869ad3ac9..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/listbox-width-change-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 661x18 +- text run at (0,0) width 661: "This tests that when a list box's options get updated, the list box will recalculate its width, and relayout." +- RenderBR {BR} at (660,0) size 1x18 +- RenderListBox {SELECT} at (2,20) size 189x57 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/option-text-clip-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/option-text-clip-expected.txt +deleted file mode 100644 +index f3d99b81ebde07d5772f2be7a8425961dcec9b86..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/option-text-clip-expected.txt ++++ /dev/null +@@ -1,13 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 713x18 +- text run at (0,0) width 713: "This tests that the option text is clipped properly, and doesn't spill over into the arrow part of the popup control." +- RenderBR {BR} at (712,0) size 1x18 +- RenderMenuList {SELECT} at (0,20) size 150x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 150x18 +- RenderText at (8,2) size 131x13 +- text run at (8,2) width 131: "12345 6789 ABCD EFGH" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/plaintext-mode-2-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/plaintext-mode-2-expected.txt +deleted file mode 100644 +index 243c7ce1ba5a2f5a2e798d0f7eb856e4c0a81def..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/plaintext-mode-2-expected.txt ++++ /dev/null +@@ -1,41 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock (anonymous) at (0,0) size 784x23 +- RenderTextControl {INPUT} at (0,2) size 600x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (600,2) size 4x18 +- text run at (600,2) width 4: " " +- RenderBR {BR} at (604,2) size 0x18 +- RenderBlock {DIV} at (0,23) size 784x18 +- RenderText {#text} at (0,0) size 33x18 +- text run at (0,0) width 33: "This " +- RenderInline {B} at (0,0) size 72x18 +- RenderText {#text} at (32,0) size 45x18 +- text run at (32,0) width 45: "styled " +- RenderInline {I} at (0,0) size 28x18 +- RenderText {#text} at (76,0) size 28x18 +- text run at (76,0) width 28: "text" +- RenderText {#text} at (103,0) size 36x18 +- text run at (103,0) width 36: ", and " +- RenderInline {A} at (0,0) size 26x18 [color=#0000EE] +- RenderText {#text} at (138,0) size 26x18 +- text run at (138,0) width 26: "link" +- RenderText {#text} at (163,0) size 413x18 +- text run at (163,0) width 211: " will be pasted into the textfield. " +- text run at (373,0) width 203: "All richness should be stripped." +- RenderBlock {OL} at (0,57) size 784x36 +- RenderListItem {LI} at (40,0) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "1" +- RenderText {#text} at (0,0) size 332x18 +- text run at (0,0) width 332: "Success: document.execCommand(\"Copy\") == true" +- RenderListItem {LI} at (40,18) size 744x18 +- RenderListMarker at (-20,0) size 16x18: "2" +- RenderText {#text} at (0,0) size 331x18 +- text run at (0,0) width 331: "Success: document.execCommand(\"Paste\") == true" +-layer at (11,13) size 594x13 +- RenderBlock {DIV} at (3,3) size 594x13 +- RenderText {#text} at (0,0) size 465x13 +- text run at (0,0) width 465: "This styled text, and link will be pasted into the textfield. All richness should be stripped." +-caret: position 94 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 0 {INPUT} of body +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/search-rtl-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/search-rtl-expected.txt +deleted file mode 100644 +index 183ae8a007ab1bb0318ed9172a7559e5d648726a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/search-rtl-expected.txt ++++ /dev/null +@@ -1,58 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 54x18 +- text run at (0,0) width 54: "Test for " +- RenderInline {I} at (0,0) size 702x18 +- RenderInline {A} at (0,0) size 304x18 [color=#0000EE] +- RenderText {#text} at (53,0) size 304x18 +- text run at (53,0) width 304: "http://bugs.webkit.org/show_bug.cgi?id=11916" +- RenderText {#text} at (356,0) size 399x18 +- text run at (356,0) width 5: " " +- text run at (360,0) width 395: "REGRESSION (SearchField): RTL search fields are mixed up" +- RenderText {#text} at (754,0) size 5x18 +- text run at (754,0) width 5: "." +- RenderBlock {P} at (0,34) size 784x69 +- RenderTextControl {INPUT} at (2,2) size 187x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 181x19 +- RenderBlock {DIV} at (158,0) size 23x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderBR {BR} at (190,2) size 1x18 +- RenderTextControl {INPUT} at (2,25) size 257x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 251x19 +- RenderBlock {DIV} at (228,0) size 23x19 +- RenderBlock {DIV} at (19,3) size 210x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderBR {BR} at (260,25) size 1x18 +- RenderTextControl {INPUT} at (2,48) size 187x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 181x19 +- RenderBlock {DIV} at (158,0) size 23x19 +- RenderBlock {DIV} at (19,3) size 140x13 +- RenderBlock {DIV} at (0,0) size 19x19 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,119) size 784x18 +- RenderText {#text} at (0,0) size 37x18 +- text run at (0,0) width 37: "PASS" +-layer at (32,47) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +- RenderText {#text} at (7,0) size 133x13 +- text run at (7,0) width 22 RTL: " \x{5D5}\x{5D6}\x{5D4}\x{5D5}" +- text run at (28,0) width 20: "she" +- text run at (47,0) width 44 RTL: " \x{5D5}\x{5D4}\x{5D9}\x{5D0} \x{5D6}\x{5D4} " +- text run at (90,0) width 14: "he" +- text run at (103,0) width 37 RTL: "\x{5D4}\x{5D5}\x{5D0} \x{5D6}\x{5D4} " +-layer at (32,70) size 210x13 +- RenderBlock {DIV} at (0,0) size 210x13 +- RenderText {#text} at (76,0) size 134x13 +- text run at (76,0) width 23 RTL: " \x{5D5}\x{5D6}\x{5D4}\x{5D5}" +- text run at (98,0) width 20: "she" +- text run at (117,0) width 44 RTL: " \x{5D5}\x{5D4}\x{5D9}\x{5D0} \x{5D6}\x{5D4} " +- text run at (160,0) width 14: "he" +- text run at (173,0) width 37 RTL: "\x{5D4}\x{5D5}\x{5D0} \x{5D6}\x{5D4} " +-layer at (32,93) size 140x13 +- RenderBlock {DIV} at (0,0) size 140x13 +-caret: position 0 of child 0 {DIV} of child 1 {DIV} of child 0 {DIV} of {#document-fragment} of child 7 {INPUT} of child 3 {P} of body +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/search/search-size-with-decorations-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/search/search-size-with-decorations-expected.txt +deleted file mode 100644 +index 7adee50489e8c4b4c47c31582cd5acb53311b23c..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/search/search-size-with-decorations-expected.txt ++++ /dev/null +@@ -1,69 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x177 +- RenderBlock {HTML} at (0,0) size 800x177 +- RenderBody {BODY} at (8,8) size 784x161 +- RenderTextControl {INPUT} at (2,2) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderBR {BR} at (177,2) size 1x18 +- RenderTextControl {INPUT} at (2,25) size 174x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 168x19 +- RenderBlock {DIV} at (0,0) size 8x19 +- RenderBlock {DIV} at (8,3) size 141x13 +- RenderBlock {DIV} at (148,0) size 20x19 +- RenderBR {BR} at (177,25) size 1x18 +- RenderTextControl {INPUT} at (2,48) size 183x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 177x19 +- RenderBlock {DIV} at (0,0) size 17x19 +- RenderBlock {DIV} at (17,3) size 141x13 +- RenderBlock {DIV} at (157,0) size 20x19 +- RenderBR {BR} at (186,48) size 1x18 +- RenderTextControl {INPUT} at (2,71) size 183x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 177x19 +- RenderBlock {DIV} at (0,0) size 17x19 +- RenderBlock {DIV} at (17,3) size 141x13 +- RenderBlock {DIV} at (157,0) size 20x19 +- RenderBR {BR} at (186,71) size 1x18 +- RenderTextControl {INPUT} at (2,94) size 188x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 182x19 +- RenderBlock {DIV} at (0,0) size 22x19 +- RenderBlock {DIV} at (22,3) size 141x13 +- RenderBlock {DIV} at (162,0) size 20x19 +- RenderBR {BR} at (191,94) size 1x18 +- RenderTextControl {INPUT} at (2,117) size 188x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 182x19 +- RenderBlock {DIV} at (0,0) size 22x19 +- RenderBlock {DIV} at (22,3) size 141x13 +- RenderBlock {DIV} at (162,0) size 20x19 +- RenderBR {BR} at (191,117) size 1x18 +- RenderTextControl {INPUT} at (2,140) size 328x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderFlexibleBox {DIV} at (3,0) size 322x19 +- RenderBlock {DIV} at (0,0) size 22x19 +- RenderBlock {DIV} at (22,3) size 281x13 +- RenderBlock {DIV} at (302,0) size 20x19 +- RenderText {#text} at (0,0) size 0x0 +-layer at (21,13) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (21,36) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 135x13 +- text run at (0,0) width 135: "12345678901234567890" +-layer at (30,59) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (30,82) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 135x13 +- text run at (0,0) width 135: "12345678901234567890" +-layer at (35,105) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +-layer at (35,128) size 141x13 +- RenderBlock {DIV} at (0,0) size 141x13 +- RenderText {#text} at (0,0) size 135x13 +- text run at (0,0) width 135: "12345678901234567890" +-layer at (35,151) size 281x13 +- RenderBlock {DIV} at (0,0) size 281x13 +- RenderText {#text} at (0,0) size 270x13 +- text run at (0,0) width 270: "1234567890123456789012345678901234567890" +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/select-change-listbox-to-popup-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/select-change-listbox-to-popup-expected.txt +deleted file mode 100644 +index eeee40faad064d0f888b4a853402afb0d67251e4..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/select-change-listbox-to-popup-expected.txt ++++ /dev/null +@@ -1,13 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 450x18 +- text run at (0,0) width 450: "This tests that you can dynamically change a list box to a popup menu" +- RenderBR {BR} at (449,0) size 1x18 +- RenderMenuList {SELECT} at (2,20) size 218x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 218x18 +- RenderText at (8,2) size 187x13 +- text run at (8,2) width 187: "This should turn into a popup menu" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/select-change-popup-to-listbox-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/select-change-popup-to-listbox-expected.txt +deleted file mode 100644 +index 440a1d3b31ebeca3eebd4013fd0c0ccae75205e1..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/select-change-popup-to-listbox-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 454x18 +- text run at (0,0) width 454: "This tests that you can dynamically change a popup menu to a list box." +- RenderBR {BR} at (453,0) size 1x18 +- RenderListBox {SELECT} at (2,20) size 176x71 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/select-selected-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/select-selected-expected.txt +deleted file mode 100644 +index bb0ac0eabcc6ddff98cd8f5e1f39c74cf48d0277..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/select-selected-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderMenuList {SELECT} at (2,2) size 259x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 259x18 +- RenderText at (8,2) size 164x13 +- text run at (8,2) width 164: "should see this option selected" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/select/optgroup-rendering-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/select/optgroup-rendering-expected.txt +deleted file mode 100644 +index a6f3033c365ef98019cbb4ee337bed1b3aa8a90f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/select/optgroup-rendering-expected.txt ++++ /dev/null +@@ -1,15 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x323 +- RenderBlock {HTML} at (0,0) size 800x323 +- RenderBody {BODY} at (8,8) size 784x307 +- RenderBlock {FORM} at (0,0) size 784x307 +- RenderListBox {SELECT} at (2,2) size 70x281 [bgcolor=#FFFFFF] [border: (1px inset #808080)] +- RenderText {#text} at (74,264) size 4x18 +- text run at (74,264) width 4: " " +- RenderBR {BR} at (78,264) size 0x18 +- RenderMenuList {SELECT} at (2,287) size 75x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 75x18 +- RenderText at (8,2) size 31x13 +- text run at (8,2) width 31: "Three" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/textfield-outline-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/textfield-outline-expected.txt +deleted file mode 100644 +index a513235df3fb993879d4117400449bfca42940f2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/textfield-outline-expected.txt ++++ /dev/null +@@ -1,15 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 563x18 +- text run at (0,0) width 563: "This tests that a negative outline-offset won't get in the way of a cursor in a text control." +- RenderBR {BR} at (562,0) size 1x18 +- RenderTextControl {INPUT} at (2,20) size 255x27 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderText {#text} at (0,0) size 0x0 +-layer at (12,30) size 251x23 +- RenderBlock {DIV} at (2,2) size 251x23 +- RenderText {#text} at (0,0) size 33x23 +- text run at (0,0) width 33: "abc" +-caret: position 3 of child 0 {#text} of child 0 {DIV} of {#document-fragment} of child 3 {INPUT} of body +diff --git a/LayoutTests/platform/mac-mojave/fast/forms/time/time-input-rendering-basic-expected.txt b/LayoutTests/platform/mac-mojave/fast/forms/time/time-input-rendering-basic-expected.txt +deleted file mode 100644 +index f9f1bfafa4a9f8d0637c5f9b68426ba2e7bde0d2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/forms/time/time-input-rendering-basic-expected.txt ++++ /dev/null +@@ -1,48 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (68,4) size 5x18 +- text run at (68,4) width 5: " " +- RenderText {#text} at (0,0) size 0x0 +-layer at (10,10) size 64x23 clip at (12,12) size 60x19 +- RenderFlexibleBox {INPUT} at (2,2) size 65x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +-layer at (13,13) size 58x17 +- RenderBlock {DIV} at (3,3) size 59x17 +- RenderBlock {DIV} at (1,1) size 57x15 +- RenderBlock {DIV} at (0,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "09" +- RenderInline {DIV} at (0,0) size 4x13 +- RenderText {#text} at (16,1) size 4x13 +- text run at (16,1) width 4: ":" +- RenderBlock {DIV} at (19,0) size 18x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "41" +- RenderInline {DIV} at (0,0) size 4x13 +- RenderText {#text} at (35,1) size 4x13 +- text run at (35,1) width 4: " " +- RenderBlock {DIV} at (37,0) size 20x15 +- RenderText {#text} at (1,1) size 18x13 +- text run at (1,1) width 18: "AM" +-layer at (82,10) size 65x23 clip at (84,12) size 61x19 +- RenderFlexibleBox {INPUT} at (74,2) size 65x23 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +-layer at (85,13) size 58x17 +- RenderBlock {DIV} at (3,3) size 59x17 +- RenderBlock {DIV} at (1,1) size 57x15 +- RenderBlock {DIV} at (40,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "09" +- RenderInline {DIV} at (0,0) size 5x13 +- RenderText {#text} at (36,1) size 5x13 +- text run at (36,1) width 5 RTL: ":" +- RenderBlock {DIV} at (20,0) size 17x15 +- RenderText {#text} at (1,1) size 15x13 +- text run at (1,1) width 15: "41" +- RenderInline {DIV} at (0,0) size 4x13 +- RenderText {#text} at (18,1) size 4x13 +- text run at (18,1) width 4 RTL: " " +- RenderBlock {DIV} at (0,0) size 20x15 +- RenderText {#text} at (1,1) size 18x13 +- text run at (1,1) width 18: "AM" +diff --git a/LayoutTests/platform/mac-mojave/fast/images/image-controls-basic-expected.png b/LayoutTests/platform/mac-mojave/fast/images/image-controls-basic-expected.png +deleted file mode 100644 +index bfca92c27333de61644a8c571b683fe158e5e36e..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/fast/images/image-controls-basic-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/fast/indic-expected.txt b/LayoutTests/platform/mac-mojave/fast/indic-expected.txt +deleted file mode 100644 +index f5957ab56e15aa12f8de628de7d7b09458af4333..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/indic-expected.txt ++++ /dev/null +@@ -1,11 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 636x18 +- text run at (0,0) width 636: "This page renders some indic text and makes sure that the text metrics match the expected metrics. " +- RenderBR {BR} at (635,14) size 1x0 +- RenderText {#text} at (0,22) size 753x43 +- text run at (0,22) width 753: "\x{AA0}\x{AB3}\x{AA8}\x{ABE} \x{A87}\x{AB0}\x{ABE}\x{A95}\x{AC0} \x{AAA}\x{ACD}\x{AB0}\x{AA6}\x{AC7}\x{AB6}\x{ACB}\x{AA8}\x{AC7} \x{A87}\x{AB8}\x{ACD}\x{AB2}\x{ABE}\x{AAE}\x{ABF}\x{A95} \x{AB0}\x{ABE}\x{AB7}\x{ACD}\x{A9F}\x{ACD}\x{AB0} \x{A9C}\x{ABE}\x{AB9}\x{AC7}\x{AB0} \x{A95}\x{AB0}\x{ACD}\x{AAF}\x{AC1}\x{A82} \x{A9B}\x{AC7} \x{A85}\x{AA8}\x{AC7} \x{AAA}\x{ACB}\x{AA4}\x{ABE}\x{AA8}\x{ACB} \x{AB5}\x{ACD}\x{AAF}\x{ABE}\x{AAA} \x{AB5}\x{AA7}\x{ABE}\x{AB0}\x{AB5}\x{ABE} \x{AA4}\x{AC7}\x{AAE}\x{AA8}\x{ABE} \x{AB5}\x{AA1}\x{ABE} \x{AAA}\x{ACD}\x{AB0}\x{AA4}\x{ACD}\x{AAF}\x{AC7} \x{AB5}\x{AAB}\x{ABE}\x{AA6}\x{ABE}\x{AB0}\x{AC0}\x{AA8}\x{AC1}\x{A82} \x{AB5}\x{ABF}\x{AB6}\x{ACD}\x{AB5}\x{AAD}\x{AB0}\x{AA8}\x{ABE} \x{AAE}\x{AC1}\x{AB8}\x{ACD}\x{AB2}\x{ABF}\x{AAE}\x{ACB}\x{AA8}\x{AC7}" +- text run at (0,47) width 325: "\x{A86}\x{AB9}\x{ACD}\x{AB5}\x{ABE}\x{AA8} \x{A95}\x{AB0}\x{ACD}\x{AAF}\x{AC1}\x{A82} \x{A9B}\x{AC7}. \x{A87}\x{AB8}\x{ACD}\x{AB2}\x{ABE}\x{AAE}\x{ABF}\x{A95} \x{AB8}\x{ACD}\x{A9F}\x{AC7}\x{A9F} \x{A93}\x{AAB} \x{A87}\x{AB0}\x{ABE}\x{A95} \x{A8F}\x{AA8}\x{ACD}\x{AA1} \x{AB8}\x{ABF}\x{AB0}\x{ABF}\x{AAF}\x{ABE}" +diff --git a/LayoutTests/platform/mac-mojave/fast/invalid/003-expected.txt b/LayoutTests/platform/mac-mojave/fast/invalid/003-expected.txt +deleted file mode 100644 +index 1419bd697d862030bcf60b84c9590e6df7b22886..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/invalid/003-expected.txt ++++ /dev/null +@@ -1,58 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock (anonymous) at (0,0) size 784x18 +- RenderInline {FONT} at (0,0) size 91x18 [color=#FF0000] +- RenderInline {I} at (0,0) size 91x18 +- RenderText {#text} at (0,0) size 91x18 +- text run at (0,0) width 91: "Italic and Red" +- RenderInline {I} at (0,0) size 1x18 +- RenderBlock (anonymous) at (0,34) size 784x18 +- RenderBlock {P} at (0,0) size 784x18 +- RenderInline {FONT} at (0,0) size 95x18 [color=#FF0000] +- RenderText {#text} at (0,0) size 95x18 +- text run at (0,0) width 95: "Italic and Red " +- RenderText {#text} at (94,0) size 68x18 +- text run at (94,0) width 68: "Just italic." +- RenderBlock (anonymous) at (0,68) size 784x18 +- RenderInline {I} at (0,0) size 69x18 +- RenderText {#text} at (0,0) size 69x18 +- text run at (0,0) width 69: "Italic only." +- RenderText {#text} at (68,0) size 38x18 +- text run at (68,0) width 38: " Plain" +- RenderBlock {P} at (0,102) size 784x18 +- RenderText {#text} at (0,0) size 128x18 +- text run at (0,0) width 128: "I should not be red. " +- RenderInline {FONT} at (0,0) size 126x18 [color=#FF0000] +- RenderText {#text} at (127,0) size 35x18 +- text run at (127,0) width 35: "Red. " +- RenderInline {I} at (0,0) size 92x18 +- RenderText {#text} at (161,0) size 92x18 +- text run at (161,0) width 92: "Italic and red." +- RenderBlock (anonymous) at (0,136) size 784x0 +- RenderInline {FONT} at (0,0) size 0x0 [color=#FF0000] +- RenderInline {I} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,136) size 784x18 +- RenderInline {FONT} at (0,0) size 125x18 [color=#FF0000] +- RenderInline {I} at (0,0) size 95x18 +- RenderText {#text} at (0,0) size 95x18 +- text run at (0,0) width 95: "Italic and red. " +- RenderText {#text} at (94,0) size 31x18 +- text run at (94,0) width 31: "Red." +- RenderText {#text} at (124,0) size 129x18 +- text run at (124,0) width 129: " I should not be red." +- RenderBlock (anonymous) at (0,170) size 784x18 +- RenderInline {B} at (0,0) size 147x18 +- RenderText {#text} at (0,0) size 37x18 +- text run at (0,0) width 37: "Bold " +- RenderInline {I} at (0,0) size 111x18 +- RenderText {#text} at (36,0) size 111x18 +- text run at (36,0) width 111: "Bold and italic" +- RenderInline {I} at (0,0) size 77x18 +- RenderText {#text} at (146,0) size 77x18 +- text run at (146,0) width 77: " Only Italic " +- RenderText {#text} at (222,0) size 34x18 +- text run at (222,0) width 34: "Plain" +diff --git a/LayoutTests/platform/mac-mojave/fast/invalid/004-expected.txt b/LayoutTests/platform/mac-mojave/fast/invalid/004-expected.txt +deleted file mode 100644 +index a7283e2482f991957ad86250f8d7927b03a18c80..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/invalid/004-expected.txt ++++ /dev/null +@@ -1,28 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock {P} at (0,0) size 784x55 +- RenderInline {FONT} at (0,0) size 304x55 +- RenderText {#text} at (0,0) size 304x55 +- text run at (0,0) width 304: "First paragraph." +- RenderBlock (anonymous) at (0,71) size 784x0 +- RenderInline {FONT} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock (anonymous) at (0,103) size 784x55 +- RenderBlock {P} at (0,0) size 784x55 +- RenderText {#text} at (0,0) size 358x55 +- text run at (0,0) width 358: "Second paragraph." +- RenderBlock (anonymous) at (0,206) size 784x0 +- RenderInline {FONT} at (0,0) size 0x0 +- RenderText {#text} at (0,0) size 0x0 +- RenderInline {B} at (0,0) size 0x0 +- RenderBlock {P} at (0,206) size 784x18 +- RenderInline {B} at (0,0) size 111x18 +- RenderInline {I} at (0,0) size 111x18 +- RenderText {#text} at (0,0) size 111x18 +- text run at (0,0) width 111: "Bold and Italic" +- RenderInline {I} at (0,0) size 39x18 +- RenderText {#text} at (110,0) size 39x18 +- text run at (110,0) width 39: " Italic" +diff --git a/LayoutTests/platform/mac-mojave/fast/invalid/nestedh3s-expected.txt b/LayoutTests/platform/mac-mojave/fast/invalid/nestedh3s-expected.txt +deleted file mode 100644 +index c343b9fcfe6b2204dc5988cceea80458be2a298d..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/invalid/nestedh3s-expected.txt ++++ /dev/null +@@ -1,36 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x574 +- RenderBlock (anonymous) at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 574x18 +- text run at (0,0) width 574: "In this sample, the H3s should be nested. This matches Firefox, IE, and the HTML5 spec." +- RenderBlock {H3} at (0,36) size 784x303 [border: (2px solid #FF0000)] +- RenderBlock (anonymous) at (4,4) size 776x22 +- RenderInline {I} at (0,0) size 35x22 +- RenderText {#text} at (0,0) size 35x22 +- text run at (0,0) width 35: "One" +- RenderBlock (anonymous) at (4,47) size 776x230 +- RenderBlock {H3} at (0,0) size 776x229 [border: (2px solid #FF0000)] +- RenderBlock (anonymous) at (4,4) size 768x26 +- RenderInline {I} at (0,0) size 40x26 +- RenderText {#text} at (0,0) size 40x26 +- text run at (0,0) width 40: "Two" +- RenderBlock (anonymous) at (4,55) size 768x144 +- RenderBlock {H3} at (0,0) size 768x143 [border: (2px solid #FF0000)] +- RenderBlock (anonymous) at (4,4) size 760x31 +- RenderInline {I} at (0,0) size 65x31 +- RenderText {#text} at (0,0) size 65x31 +- text run at (0,0) width 65: "Three" +- RenderBlock (anonymous) at (4,64) size 760x45 +- RenderBlock {H3} at (0,0) size 760x44 [border: (2px solid #FF0000)] +- RenderInline {I} at (0,0) size 64x36 +- RenderText {#text} at (4,4) size 64x36 +- text run at (4,4) width 64: "Four" +- RenderBlock (anonymous) at (4,138) size 760x0 +- RenderInline {I} at (0,0) size 0x0 +- RenderBlock (anonymous) at (4,224) size 768x0 +- RenderInline {I} at (0,0) size 0x0 +- RenderBlock (anonymous) at (4,297) size 776x0 +- RenderInline {I} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/overflow/007-expected.png b/LayoutTests/platform/mac-mojave/fast/overflow/007-expected.png +deleted file mode 100644 +index 9669be531fa88ea3627222c0d646ca144c5012e6..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/fast/overflow/007-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/fast/overflow/007-expected.txt b/LayoutTests/platform/mac-mojave/fast/overflow/007-expected.txt +deleted file mode 100644 +index c76725c4dcd2451e5806ae89253ad967d7f724b6..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/overflow/007-expected.txt ++++ /dev/null +@@ -1,84 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x388 +- RenderBlock {HTML} at (0,0) size 800x388 +- RenderBody {BODY} at (32,32) size 736x324 [bgcolor=#CCCCCC] +-layer at (143,32) size 514x146 clip at (144,33) size 497x144 scrollHeight 313 +- RenderBlock {DIV} at (111,0) size 514x146 [bgcolor=#FFFFFF] [border: (1px solid #999999)] +- RenderBlock {P} at (17,17) size 465x72 +- RenderText {#text} at (0,0) size 225x18 +- text run at (0,0) width 225: "This page is to test the behavior of " +- RenderInline {CODE} at (0,0) size 134x15 +- RenderText {#text} at (224,2) size 134x15 +- text run at (224,2) width 134: "position:absolute" +- RenderText {#text} at (357,0) size 452x36 +- text run at (357,0) width 95: " content which" +- text run at (0,18) width 294: "is a child of an overflowed parent object with " +- RenderInline {CODE} at (0,0) size 103x15 +- RenderText {#text} at (293,20) size 103x15 +- text run at (293,20) width 103: "overflow:auto" +- RenderText {#text} at (395,18) size 432x36 +- text run at (395,18) width 37: ", both" +- text run at (0,36) width 176: "when the parent element is " +- RenderInline {CODE} at (0,0) size 118x15 +- RenderText {#text} at (175,38) size 118x15 +- text run at (175,38) width 118: "position:static" +- RenderText {#text} at (292,36) size 95x18 +- text run at (292,36) width 95: " (top case) and" +- RenderInline {CODE} at (0,0) size 133x15 +- RenderText {#text} at (0,56) size 133x15 +- text run at (0,56) width 133: "position:relative" +- RenderText {#text} at (132,54) size 97x18 +- text run at (132,54) width 97: " (bottom case)." +- RenderBlock {P} at (17,105) size 465x180 [color=#999999] +- RenderText {#text} at (0,0) size 461x180 +- text run at (0,0) width 448: "Following extra content exists to ensure that the parent box overflows properly. Sed ut" +- text run at (0,15) width 417: "perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque" +- text run at (0,30) width 435: "laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi" +- text run at (0,45) width 461: "architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas" +- text run at (0,60) width 446: "sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione" +- text run at (0,75) width 456: "voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit" +- text run at (0,90) width 451: "amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut" +- text run at (0,105) width 457: "labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis" +- text run at (0,120) width 418: "nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea" +- text run at (0,135) width 452: "commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit" +- text run at (0,150) width 447: "esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas" +- text run at (0,165) width 80: "nulla pariatur?" +-layer at (0,0) size 40x34 +- RenderBlock (positioned) {P} at (0,0) size 41x34 [bgcolor=#FF0000] +- RenderText {#text} at (8,8) size 25x18 +- text run at (8,8) width 25: "hi 1" +-layer at (143,210) size 514x146 clip at (144,211) size 497x144 scrollHeight 365 +- RenderBlock (relative positioned) {DIV} at (111,178) size 514x146 [bgcolor=#FFFFFF] [border: (1px solid #999999)] +- RenderBlock {P} at (17,17) size 465x36 +- RenderText {#text} at (0,0) size 459x36 +- text run at (0,0) width 459: "Safari v1.2.2 incorrectly scrolls the 'hi 1' div when its parent is scrolled." +- text run at (0,18) width 350: "If you resize the page even a little, this bug fixes itself." +- RenderBlock {P} at (17,69) size 465x72 +- RenderText {#text} at (0,0) size 410x18 +- text run at (0,0) width 410: "Safari v1.2.2 also (really odd) causes the entire second div to be" +- RenderInline {CODE} at (0,0) size 86x15 +- RenderText {#text} at (0,20) size 86x15 +- text run at (0,20) width 86: "opacity:0.5" +- RenderText {#text} at (85,18) size 450x54 +- text run at (85,18) width 358: ", despite the fact that this property is only applied to the" +- text run at (0,36) width 450: "child item. This problem fixes itself if you resize the window and then" +- text run at (0,54) width 87: "scroll the div." +- RenderBlock {P} at (17,157) size 465x180 [color=#999999] +- RenderText {#text} at (0,0) size 461x180 +- text run at (0,0) width 448: "Following extra content exists to ensure that the parent box overflows properly. Sed ut" +- text run at (0,15) width 417: "perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque" +- text run at (0,30) width 435: "laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi" +- text run at (0,45) width 461: "architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas" +- text run at (0,60) width 446: "sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione" +- text run at (0,75) width 456: "voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit" +- text run at (0,90) width 451: "amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut" +- text run at (0,105) width 457: "labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis" +- text run at (0,120) width 418: "nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea" +- text run at (0,135) width 452: "commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit" +- text run at (0,150) width 447: "esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas" +- text run at (0,165) width 80: "nulla pariatur?" +-layer at (144,211) size 40x34 +- RenderBlock (positioned) {P} at (1,1) size 41x34 [bgcolor=#FF0000] +- RenderText {#text} at (8,8) size 25x18 +- text run at (8,8) width 25: "hi 2" +diff --git a/LayoutTests/platform/mac-mojave/fast/parser/document-write-option-expected.txt b/LayoutTests/platform/mac-mojave/fast/parser/document-write-option-expected.txt +deleted file mode 100644 +index cac7ff8eff08a7557f5460db734030f1ce3ffc73..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/parser/document-write-option-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderMenuList {SELECT} at (2,2) size 317x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 317x18 +- RenderText at (8,2) size 286x13 +- text run at (8,2) width 286: "This is a very long string so it makes the select bigger." +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/sandbox/mac/sandbox-mach-lookup-expected.txt b/LayoutTests/platform/mac-mojave/fast/sandbox/mac/sandbox-mach-lookup-expected.txt +deleted file mode 100644 +index c6d8adc976cd5b361b2e2dd95326c9509575aa4b..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/sandbox/mac/sandbox-mach-lookup-expected.txt ++++ /dev/null +@@ -1,19 +0,0 @@ +-Regression tests for mach lookup sandbox changes on macOS +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +-FAIL internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.cfprefsd.agent") should be false. Was true. +-FAIL internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.cfprefsd.daemon") should be false. Was true. +-PASS internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.nehelper") is false +-PASS internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.nesessionmanager") is false +-PASS internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.nesessionmanager.content-filter") is false +-PASS internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.system.logger") is false +-PASS internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.awdd") is false +-PASS internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.cookied") is false +-PASS internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.audio.SystemSoundServer-OSX") is false +-PASS internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.iconservices") is false +-PASS internals.hasSandboxMachLookupAccessToGlobalName("com.apple.WebKit.WebContent", "com.apple.iconservices.store") is false +-PASS internals.hasSandboxMachLookupAccessToXPCServiceName("com.apple.WebKit.WebContent", "com.apple.PerformanceAnalysis.animationperfd") is false +-PASS internals.hasSandboxMachLookupAccessToXPCServiceName("com.apple.WebKit.WebContent", "com.apple.hiservices-xpcservice") is false +- +diff --git a/LayoutTests/platform/mac-mojave/fast/selectors/018-expected.txt b/LayoutTests/platform/mac-mojave/fast/selectors/018-expected.txt +deleted file mode 100644 +index 5e09a9e447b212a146cda7045729de5b14b9b959..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/selectors/018-expected.txt ++++ /dev/null +@@ -1,119 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x299 +- RenderBlock {HTML} at (0,0) size 800x299 +- RenderBody {BODY} at (8,16) size 784x275 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 687x18 +- text run at (0,0) width 429: "The background color of this paragraph should turn to green when " +- text run at (428,0) width 259: "the mouse pointer hovers either its text (" +- RenderInline {STRONG} at (0,0) size 31x18 +- RenderText {#text} at (686,0) size 31x18 +- text run at (686,0) width 31: "here" +- RenderText {#text} at (716,0) size 759x36 +- text run at (716,0) width 43: ") or its" +- text run at (0,18) width 159: "whitespace background, " +- RenderInline {STRONG} at (0,0) size 31x18 +- RenderText {#text} at (158,18) size 31x18 +- text run at (158,18) width 31: "here" +- RenderText {#text} at (188,18) size 5x18 +- text run at (188,18) width 5: ":" +- RenderBlock {ADDRESS} at (0,52) size 784x18 +- RenderText {#text} at (0,0) size 163x18 +- text run at (0,0) width 163: "The background color of " +- RenderInline {A} at (0,0) size 120x18 [color=#0000EE] +- RenderText {#text} at (162,0) size 82x18 +- text run at (162,0) width 82: "this anchor (" +- RenderInline {STRONG} at (0,0) size 33x18 +- RenderText {#text} at (243,0) size 33x18 +- text run at (243,0) width 33: "here" +- RenderText {#text} at (275,0) size 7x18 +- text run at (275,0) width 7: ")" +- RenderText {#text} at (281,0) size 394x18 +- text run at (281,0) width 394: " should turn to green when the pointing device hovers over it." +- RenderTable {TABLE} at (0,70) size 314x205 +- RenderTableSection {TBODY} at (0,0) size 314x205 +- RenderTableRow {TR} at (0,5) size 314x20 +- RenderTableCell {TD} at (5,5) size 102x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 75x18 +- text run at (1,1) width 75: "The cells in" +- RenderTableCell {TD} at (111,5) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 59x18 +- text run at (1,1) width 59: "this table" +- RenderTableCell {TD} at (207,5) size 102x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 63x18 +- text run at (1,1) width 63: "should go" +- RenderTableRow {TR} at (0,30) size 314x20 +- RenderTableCell {TD} at (5,30) size 102x20 [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 75x18 +- text run at (1,1) width 75: "green when" +- RenderTableCell {TD} at (111,30) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 65x18 +- text run at (1,1) width 65: "you hover" +- RenderTableCell {TD} at (207,30) size 102x20 [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 77x18 +- text run at (1,1) width 77: "the pointing" +- RenderTableRow {TR} at (0,55) size 314x20 +- RenderTableCell {TD} at (5,55) size 102x20 [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 75x18 +- text run at (1,1) width 75: "device over" +- RenderTableCell {TD} at (111,55) size 92x20 [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 42x18 +- text run at (1,1) width 42: "them (" +- RenderInline {STRONG} at (0,0) size 31x18 +- RenderText {#text} at (42,1) size 31x18 +- text run at (42,1) width 31: "here" +- RenderText {#text} at (72,1) size 10x18 +- text run at (72,1) width 10: ")." +- RenderTableCell {TD} at (207,64) size 102x2 [r=2 c=2 rs=1 cs=1] +- RenderTableRow {TR} at (0,80) size 314x20 +- RenderTableCell {TD} at (5,80) size 102x20 [r=3 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 77x18 +- text run at (1,1) width 77: "The rows in" +- RenderTableCell {TD} at (111,80) size 92x20 [r=3 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 59x18 +- text run at (1,1) width 59: "this table" +- RenderTableCell {TD} at (207,80) size 102x20 [r=3 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 63x18 +- text run at (1,1) width 63: "should go" +- RenderTableRow {TR} at (0,105) size 314x20 +- RenderTableCell {TD} at (5,105) size 102x20 [r=4 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 68x18 +- text run at (1,1) width 68: "dark green" +- RenderTableCell {TD} at (111,105) size 92x20 [r=4 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 59x18 +- text run at (1,1) width 59: "when the" +- RenderTableCell {TD} at (207,105) size 102x20 [r=4 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 100x18 +- text run at (1,1) width 100: "pointing device" +- RenderTableRow {TR} at (0,130) size 314x20 +- RenderTableCell {TD} at (5,130) size 102x20 [r=5 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 67x18 +- text run at (1,1) width 67: "is over the" +- RenderTableCell {TD} at (111,130) size 92x20 [r=5 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 60x18 +- text run at (1,1) width 60: "five pixel" +- RenderTableCell {TD} at (207,130) size 102x20 [r=5 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 95x18 +- text run at (1,1) width 95: "border spacing" +- RenderTableRow {TR} at (0,155) size 314x20 +- RenderTableCell {TD} at (5,155) size 102x20 [r=6 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 90x18 +- text run at (1,1) width 90: "and when it is" +- RenderTableCell {TD} at (111,155) size 92x20 [r=6 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 90x18 +- text run at (1,1) width 90: "over the cells." +- RenderTableCell {TD} at (207,164) size 102x2 [r=6 c=2 rs=1 cs=1] +- RenderTableRow {TR} at (0,180) size 314x20 +- RenderTableCell {TD} at (5,180) size 102x20 [r=7 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 66x18 +- text run at (1,1) width 66: "Including " +- RenderInline {STRONG} at (0,0) size 31x18 +- RenderText {#text} at (66,1) size 31x18 +- text run at (66,1) width 31: "here" +- RenderText {#text} at (96,1) size 5x18 +- text run at (96,1) width 5: "," +- RenderTableCell {TD} at (111,189) size 92x2 [r=7 c=1 rs=1 cs=1] +- RenderTableCell {TD} at (207,180) size 102x20 [r=7 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 73x18 +- text run at (1,1) width 73: "blank cells." +diff --git a/LayoutTests/platform/mac-mojave/fast/table/frame-and-rules-expected.txt b/LayoutTests/platform/mac-mojave/fast/table/frame-and-rules-expected.txt +deleted file mode 100644 +index 2a070be401cdb5fd89db93d57e20901162dda2d1..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/table/frame-and-rules-expected.txt ++++ /dev/null +@@ -1,2472 +0,0 @@ +-layer at (0,0) size 785x7842 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x7842 +- RenderBlock {HTML} at (0,0) size 785x7842 +- RenderBody {BODY} at (8,8) size 769x7786 +- RenderTable {TABLE} at (0,0) size 273x118 +- RenderBlock {CAPTION} at (0,0) size 273x18 +- RenderInline {A} at (0,0) size 256x18 +- RenderText {#text} at (5,0) size 256x18 +- text run at (5,0) width 256: "Frame=\x{201C}void\x{201D} and Rules=\x{201C}none\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (260,0) size 8x18 +- text run at (260,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 273x60 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,10) size 91x20 [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x20 [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 273x20 +- RenderTableCell {TD} at (90,20) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,30) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 273x20 +- RenderTableCell {TD} at (0,40) size 182x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,98) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,166) size 273x137 +- RenderBlock {CAPTION} at (0,0) size 273x36 +- RenderInline {A} at (0,0) size 155x36 +- RenderText {#text} at (59,0) size 155x36 +- text run at (59,0) width 155: "Frame=\x{201C}above\x{201D} and" +- text run at (79,18) width 108: "Rules=\x{201C}none\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (186,18) size 8x18 +- text run at (186,18) width 8: ":" +- RenderTableSection {THEAD} at (0,36) size 273x21 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,57) size 273x60 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,10) size 91x20 [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x20 [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 273x20 +- RenderTableCell {TD} at (90,20) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,30) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 273x20 +- RenderTableCell {TD} at (0,40) size 182x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,117) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,351) size 273x137 [border: none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 273x36 +- RenderInline {A} at (0,0) size 155x36 +- RenderText {#text} at (59,0) size 155x36 +- text run at (59,0) width 155: "Frame=\x{201C}below\x{201D} and" +- text run at (79,18) width 108: "Rules=\x{201C}none\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (186,18) size 8x18 +- text run at (186,18) width 8: ":" +- RenderTableSection {THEAD} at (0,36) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,56) size 273x60 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,10) size 91x20 [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x20 [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 273x20 +- RenderTableCell {TD} at (90,20) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,30) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 273x20 +- RenderTableCell {TD} at (0,40) size 182x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,116) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,536) size 273x138 [border: none none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 273x36 +- RenderInline {A} at (0,0) size 158x36 +- RenderText {#text} at (57,0) size 158x36 +- text run at (57,0) width 158: "Frame=\x{201C}hsides\x{201D} and" +- text run at (79,18) width 108: "Rules=\x{201C}none\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (186,18) size 8x18 +- text run at (186,18) width 8: ":" +- RenderTableSection {THEAD} at (0,36) size 273x21 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,57) size 273x60 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,10) size 91x20 [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x20 [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 273x20 +- RenderTableCell {TD} at (90,20) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,30) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 273x20 +- RenderTableCell {TD} at (0,40) size 182x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,117) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,722) size 275x136 [border: none (1px solid #808080) none none] +- RenderBlock {CAPTION} at (0,0) size 275x36 +- RenderInline {A} at (0,0) size 157x36 +- RenderText {#text} at (59,0) size 157x36 +- text run at (59,0) width 157: "Frame=\x{201C}vsides\x{201D} and" +- text run at (80,18) width 108: "Rules=\x{201C}none\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (187,18) size 8x18 +- text run at (187,18) width 8: ":" +- RenderTableSection {THEAD} at (0,36) size 274x20 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,56) size 274x60 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,10) size 92x20 [border: none] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x20 [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 274x20 +- RenderTableCell {TD} at (91,20) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,30) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 274x20 +- RenderTableCell {TD} at (0,40) size 183x20 [border: none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,116) size 274x20 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,906) size 274x118 +- RenderBlock {CAPTION} at (0,0) size 274x18 +- RenderInline {A} at (0,0) size 246x18 +- RenderText {#text} at (11,0) size 246x18 +- text run at (11,0) width 246: "Frame=\x{201C}lhs\x{201D} and Rules=\x{201C}none\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (256,0) size 7x18 +- text run at (256,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 274x20 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 274x60 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,10) size 92x20 [border: none] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x20 [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 274x20 +- RenderTableCell {TD} at (91,20) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,30) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 274x20 +- RenderTableCell {TD} at (0,40) size 183x20 [border: none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,98) size 274x20 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,1072) size 274x118 [border: none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 274x18 +- RenderInline {A} at (0,0) size 248x18 +- RenderText {#text} at (10,0) size 248x18 +- text run at (10,0) width 248: "Frame=\x{201C}rhs\x{201D} and Rules=\x{201C}none\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (257,0) size 7x18 +- text run at (257,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 273x60 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,10) size 91x20 [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x20 [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 273x20 +- RenderTableCell {TD} at (90,20) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,30) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 273x20 +- RenderTableCell {TD} at (0,40) size 182x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,98) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,1238) size 275x120 [border: none] +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 250x18 +- RenderText {#text} at (9,0) size 250x18 +- text run at (9,0) width 250: "Frame=\x{201C}box\x{201D} and Rules=\x{201C}none\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (258,0) size 8x18 +- text run at (258,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 274x21 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 274x60 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,10) size 92x20 [border: none] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x20 [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 274x20 +- RenderTableCell {TD} at (91,20) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,30) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 274x20 +- RenderTableCell {TD} at (0,40) size 183x20 [border: none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,99) size 274x20 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,1406) size 275x138 [border: none] +- RenderBlock {CAPTION} at (0,0) size 275x36 +- RenderInline {A} at (0,0) size 161x36 +- RenderText {#text} at (57,0) size 161x36 +- text run at (57,0) width 161: "Frame=\x{201C}border\x{201D} and" +- text run at (80,18) width 108: "Rules=\x{201C}none\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (187,18) size 8x18 +- text run at (187,18) width 8: ":" +- RenderTableSection {THEAD} at (0,36) size 274x21 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,57) size 274x60 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,10) size 92x20 [border: none] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x20 [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 274x20 +- RenderTableCell {TD} at (91,20) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,30) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 274x20 +- RenderTableCell {TD} at (0,40) size 183x20 [border: none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,117) size 274x20 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,1592) size 273x138 +- RenderBlock {CAPTION} at (0,0) size 273x36 +- RenderInline {A} at (0,0) size 144x36 +- RenderText {#text} at (64,0) size 144x36 +- text run at (64,0) width 144: "Frame=\x{201C}void\x{201D} and" +- text run at (72,18) width 123: "Rules=\x{201C}groups\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (194,18) size 7x18 +- text run at (194,18) width 7: ":" +- RenderTableSection {THEAD} at (0,36) size 273x20 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,56) size 273x61 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,10) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 273x20 +- RenderTableCell {TD} at (90,21) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,31) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,41) size 273x20 +- RenderTableCell {TD} at (0,41) size 182x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,117) size 273x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,1778) size 273x139 +- RenderBlock {CAPTION} at (0,0) size 273x36 +- RenderInline {A} at (0,0) size 155x36 +- RenderText {#text} at (59,0) size 155x36 +- text run at (59,0) width 155: "Frame=\x{201C}above\x{201D} and" +- text run at (72,18) width 123: "Rules=\x{201C}groups\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (194,18) size 7x18 +- text run at (194,18) width 7: ":" +- RenderTableSection {THEAD} at (0,36) size 273x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,57) size 273x61 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,10) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 273x20 +- RenderTableCell {TD} at (90,21) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,31) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,41) size 273x20 +- RenderTableCell {TD} at (0,41) size 182x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,118) size 273x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,1965) size 273x139 [border: none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 273x36 +- RenderInline {A} at (0,0) size 155x36 +- RenderText {#text} at (59,0) size 155x36 +- text run at (59,0) width 155: "Frame=\x{201C}below\x{201D} and" +- text run at (72,18) width 123: "Rules=\x{201C}groups\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (194,18) size 7x18 +- text run at (194,18) width 7: ":" +- RenderTableSection {THEAD} at (0,36) size 273x20 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,56) size 273x61 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,10) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 273x20 +- RenderTableCell {TD} at (90,21) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,31) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,41) size 273x20 +- RenderTableCell {TD} at (0,41) size 182x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,117) size 273x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,2152) size 273x140 [border: none none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 273x36 +- RenderInline {A} at (0,0) size 158x36 +- RenderText {#text} at (57,0) size 158x36 +- text run at (57,0) width 158: "Frame=\x{201C}hsides\x{201D} and" +- text run at (72,18) width 123: "Rules=\x{201C}groups\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (194,18) size 7x18 +- text run at (194,18) width 7: ":" +- RenderTableSection {THEAD} at (0,36) size 273x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,57) size 273x61 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,10) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 273x20 +- RenderTableCell {TD} at (90,21) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,31) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,41) size 273x20 +- RenderTableCell {TD} at (0,41) size 182x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,118) size 273x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,2340) size 275x138 [border: none (1px solid #808080) none none] +- RenderBlock {CAPTION} at (0,0) size 275x36 +- RenderInline {A} at (0,0) size 157x36 +- RenderText {#text} at (59,0) size 157x36 +- text run at (59,0) width 157: "Frame=\x{201C}vsides\x{201D} and" +- text run at (73,18) width 123: "Rules=\x{201C}groups\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (195,18) size 7x18 +- text run at (195,18) width 7: ":" +- RenderTableSection {THEAD} at (0,36) size 274x20 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,56) size 274x61 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,10) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 274x20 +- RenderTableCell {TD} at (91,21) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,41) size 274x20 +- RenderTableCell {TD} at (0,41) size 183x20 [border: none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,117) size 274x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,2526) size 274x120 +- RenderBlock {CAPTION} at (0,0) size 274x18 +- RenderInline {A} at (0,0) size 261x18 +- RenderText {#text} at (3,0) size 261x18 +- text run at (3,0) width 261: "Frame=\x{201C}lhs\x{201D} and Rules=\x{201C}groups\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (263,0) size 7x18 +- text run at (263,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 274x20 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 274x61 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,10) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 274x20 +- RenderTableCell {TD} at (91,21) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,41) size 274x20 +- RenderTableCell {TD} at (0,41) size 183x20 [border: none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,99) size 274x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,2694) size 274x120 [border: none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 274x18 +- RenderInline {A} at (0,0) size 263x18 +- RenderText {#text} at (2,0) size 263x18 +- text run at (2,0) width 263: "Frame=\x{201C}rhs\x{201D} and Rules=\x{201C}groups\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (264,0) size 7x18 +- text run at (264,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 273x20 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 273x61 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,10) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 273x20 +- RenderTableCell {TD} at (90,21) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,31) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,41) size 273x20 +- RenderTableCell {TD} at (0,41) size 182x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,99) size 273x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,2862) size 275x122 [border: none] +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 266x18 +- RenderText {#text} at (1,0) size 266x18 +- text run at (1,0) width 266: "Frame=\x{201C}box\x{201D} and Rules=\x{201C}groups\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (266,0) size 7x18 +- text run at (266,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 274x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 274x61 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,10) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 274x20 +- RenderTableCell {TD} at (91,21) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,41) size 274x20 +- RenderTableCell {TD} at (0,41) size 183x20 [border: none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,100) size 274x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,3032) size 275x140 [border: none] +- RenderBlock {CAPTION} at (0,0) size 275x36 +- RenderInline {A} at (0,0) size 161x36 +- RenderText {#text} at (57,0) size 161x36 +- text run at (57,0) width 161: "Frame=\x{201C}border\x{201D} and" +- text run at (73,18) width 123: "Rules=\x{201C}groups\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (195,18) size 7x18 +- text run at (195,18) width 7: ":" +- RenderTableSection {THEAD} at (0,36) size 274x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,57) size 274x61 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,10) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 274x20 +- RenderTableCell {TD} at (91,21) size 92x20 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 92x20 [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,41) size 274x20 +- RenderTableCell {TD} at (0,41) size 183x20 [border: none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,118) size 274x21 [border: (1px solid #808080) none (1px solid #808080) none] +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px none #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px none #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px none #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,3220) size 273x122 +- RenderBlock {CAPTION} at (0,0) size 273x18 +- RenderInline {A} at (0,0) size 256x18 +- RenderText {#text} at (5,0) size 256x18 +- text run at (5,0) width 256: "Frame=\x{201C}void\x{201D} and Rules=\x{201C}rows\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (260,0) size 7x18 +- text run at (260,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 273x63 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,10) size 91x22 [border: (1px solid #808080) none none none] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 273x21 +- RenderTableCell {TD} at (90,21) size 92x21 [border: (1px solid #808080) none none none] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,31) size 92x22 [border: (1px solid #808080) none none none] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 273x21 +- RenderTableCell {TD} at (0,42) size 182x21 [border: (1px solid #808080) none none none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,101) size 273x21 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080) none none none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,3390) size 273x123 +- RenderBlock {CAPTION} at (0,0) size 273x18 +- RenderInline {A} at (0,0) size 267x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Frame=\x{201C}above\x{201D} and Rules=\x{201C}rows\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (266,0) size 7x18 +- text run at (266,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 273x21 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080) none none none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 273x63 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,10) size 91x22 [border: (1px solid #808080) none none none] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 273x21 +- RenderTableCell {TD} at (90,21) size 92x21 [border: (1px solid #808080) none none none] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,31) size 92x22 [border: (1px solid #808080) none none none] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 273x21 +- RenderTableCell {TD} at (0,42) size 182x21 [border: (1px solid #808080) none none none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,102) size 273x21 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080) none none none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,3561) size 273x123 [border: none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 273x18 +- RenderInline {A} at (0,0) size 267x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Frame=\x{201C}below\x{201D} and Rules=\x{201C}rows\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (266,0) size 7x18 +- text run at (266,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 273x63 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,10) size 91x22 [border: (1px solid #808080) none none none] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 273x21 +- RenderTableCell {TD} at (90,21) size 92x21 [border: (1px solid #808080) none none none] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,31) size 92x22 [border: (1px solid #808080) none none none] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 273x21 +- RenderTableCell {TD} at (0,42) size 182x21 [border: (1px solid #808080) none none none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,101) size 273x21 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080) none none none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,3732) size 273x142 [border: none none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 273x36 +- RenderInline {A} at (0,0) size 158x36 +- RenderText {#text} at (57,0) size 158x36 +- text run at (57,0) width 158: "Frame=\x{201C}hsides\x{201D} and" +- text run at (79,18) width 108: "Rules=\x{201C}rows\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (186,18) size 7x18 +- text run at (186,18) width 7: ":" +- RenderTableSection {THEAD} at (0,36) size 273x21 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080) none none none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,57) size 273x63 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,10) size 91x22 [border: (1px solid #808080) none none none] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 273x21 +- RenderTableCell {TD} at (90,21) size 92x21 [border: (1px solid #808080) none none none] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,31) size 92x22 [border: (1px solid #808080) none none none] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 273x21 +- RenderTableCell {TD} at (0,42) size 182x21 [border: (1px solid #808080) none none none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,120) size 273x21 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080) none none none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,3922) size 275x122 [border: none (1px solid #808080) none none] +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 269x18 +- RenderText {#text} at (0,0) size 269x18 +- text run at (0,0) width 269: "Frame=\x{201C}vsides\x{201D} and Rules=\x{201C}rows\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (268,0) size 7x18 +- text run at (268,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 274x20 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none none none (1px none #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 274x63 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,10) size 92x22 [border: (1px solid #808080) none none (1px none #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 274x21 +- RenderTableCell {TD} at (91,21) size 92x21 [border: (1px solid #808080) none none none] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 92x22 [border: (1px solid #808080) none none none] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 274x21 +- RenderTableCell {TD} at (0,42) size 183x21 [border: (1px solid #808080) none none (1px none #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,101) size 274x21 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080) none none (1px none #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,4092) size 274x122 +- RenderBlock {CAPTION} at (0,0) size 274x18 +- RenderInline {A} at (0,0) size 245x18 +- RenderText {#text} at (11,0) size 245x18 +- text run at (11,0) width 245: "Frame=\x{201C}lhs\x{201D} and Rules=\x{201C}rows\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (255,0) size 8x18 +- text run at (255,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 274x20 +- RenderTableRow {TR} at (0,0) size 274x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none none none (1px none #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 274x63 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,10) size 92x22 [border: (1px solid #808080) none none (1px none #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 274x21 +- RenderTableCell {TD} at (91,21) size 92x21 [border: (1px solid #808080) none none none] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 92x22 [border: (1px solid #808080) none none none] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 274x21 +- RenderTableCell {TD} at (0,42) size 183x21 [border: (1px solid #808080) none none (1px none #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,101) size 274x21 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080) none none (1px none #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,4262) size 274x122 [border: none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 274x18 +- RenderInline {A} at (0,0) size 247x18 +- RenderText {#text} at (10,0) size 247x18 +- text run at (10,0) width 247: "Frame=\x{201C}rhs\x{201D} and Rules=\x{201C}rows\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (256,0) size 8x18 +- text run at (256,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 273x20 +- RenderTableRow {TR} at (0,0) size 273x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x20 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x20 [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 273x63 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,10) size 91x22 [border: (1px solid #808080) none none none] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 183x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 273x21 +- RenderTableCell {TD} at (90,21) size 92x21 [border: (1px solid #808080) none none none] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (181,31) size 92x22 [border: (1px solid #808080) none none none] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 273x21 +- RenderTableCell {TD} at (0,42) size 182x21 [border: (1px solid #808080) none none none] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,101) size 273x21 +- RenderTableRow {TR} at (0,0) size 273x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080) none none none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (181,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,4432) size 275x124 [border: none] +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 250x18 +- RenderText {#text} at (9,0) size 250x18 +- text run at (9,0) width 250: "Frame=\x{201C}box\x{201D} and Rules=\x{201C}rows\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (258,0) size 8x18 +- text run at (258,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 274x21 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080) none none (1px none #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 274x63 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,10) size 92x22 [border: (1px solid #808080) none none (1px none #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 274x21 +- RenderTableCell {TD} at (91,21) size 92x21 [border: (1px solid #808080) none none none] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 92x22 [border: (1px solid #808080) none none none] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 274x21 +- RenderTableCell {TD} at (0,42) size 183x21 [border: (1px solid #808080) none none (1px none #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,102) size 274x21 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080) none none (1px none #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,4604) size 275x142 [border: none] +- RenderBlock {CAPTION} at (0,0) size 275x36 +- RenderInline {A} at (0,0) size 161x36 +- RenderText {#text} at (57,0) size 161x36 +- text run at (57,0) width 161: "Frame=\x{201C}border\x{201D} and" +- text run at (80,18) width 108: "Rules=\x{201C}rows\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (187,18) size 7x18 +- text run at (187,18) width 7: ":" +- RenderTableSection {THEAD} at (0,36) size 274x21 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080) none none (1px none #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,57) size 274x63 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,10) size 92x22 [border: (1px solid #808080) none none (1px none #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 183x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 274x21 +- RenderTableCell {TD} at (91,21) size 92x21 [border: (1px solid #808080) none none none] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 92x22 [border: (1px solid #808080) none none none] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 274x21 +- RenderTableCell {TD} at (0,42) size 183x21 [border: (1px solid #808080) none none (1px none #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,120) size 274x21 +- RenderTableRow {TR} at (0,0) size 274x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080) none none (1px none #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 92x21 [border: (1px solid #808080) none none none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,4794) size 275x118 +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 251x18 +- RenderText {#text} at (9,0) size 251x18 +- text run at (9,0) width 251: "Frame=\x{201C}void\x{201D} and Rules=\x{201C}cols\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (259,0) size 7x18 +- text run at (259,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 275x60 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,10) size 91x20 [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 185x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 275x20 +- RenderTableCell {TD} at (90,20) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,30) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 275x20 +- RenderTableCell {TD} at (0,40) size 183x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,98) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,4960) size 275x119 +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 262x18 +- RenderText {#text} at (3,0) size 262x18 +- text run at (3,0) width 262: "Frame=\x{201C}above\x{201D} and Rules=\x{201C}cols\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (264,0) size 8x18 +- text run at (264,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 275x21 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #808080) none none none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x21 [border: (1px none #808080) none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x21 [border: (1px none #808080) none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 275x60 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,10) size 91x20 [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 185x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 275x20 +- RenderTableCell {TD} at (90,20) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,30) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 275x20 +- RenderTableCell {TD} at (0,40) size 183x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,99) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,5127) size 275x119 [border: none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 262x18 +- RenderText {#text} at (3,0) size 262x18 +- text run at (3,0) width 262: "Frame=\x{201C}below\x{201D} and Rules=\x{201C}cols\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (264,0) size 8x18 +- text run at (264,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 275x60 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,10) size 91x20 [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 185x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 275x20 +- RenderTableCell {TD} at (90,20) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,30) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 275x20 +- RenderTableCell {TD} at (0,40) size 183x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,98) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,5294) size 275x120 [border: none none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 265x18 +- RenderText {#text} at (2,0) size 265x18 +- text run at (2,0) width 265: "Frame=\x{201C}hsides\x{201D} and Rules=\x{201C}cols\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (266,0) size 7x18 +- text run at (266,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 275x21 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px none #808080) none none none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x21 [border: (1px none #808080) none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x21 [border: (1px none #808080) none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 275x60 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,10) size 91x20 [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 185x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 275x20 +- RenderTableCell {TD} at (90,20) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,30) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 275x20 +- RenderTableCell {TD} at (0,40) size 183x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,99) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,5462) size 277x118 [border: none (1px solid #808080) none none] +- RenderBlock {CAPTION} at (0,0) size 277x18 +- RenderInline {A} at (0,0) size 264x18 +- RenderText {#text} at (3,0) size 264x18 +- text run at (3,0) width 264: "Frame=\x{201C}vsides\x{201D} and Rules=\x{201C}cols\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (266,0) size 8x18 +- text run at (266,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 276x20 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none none none (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 276x60 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,10) size 92x20 [border: none none none (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 185x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 276x20 +- RenderTableCell {TD} at (91,20) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (183,30) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 276x20 +- RenderTableCell {TD} at (0,40) size 184x20 [border: none none none (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,98) size 276x20 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none none none (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,5628) size 276x118 +- RenderBlock {CAPTION} at (0,0) size 276x18 +- RenderInline {A} at (0,0) size 241x18 +- RenderText {#text} at (14,0) size 241x18 +- text run at (14,0) width 241: "Frame=\x{201C}lhs\x{201D} and Rules=\x{201C}cols\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (254,0) size 7x18 +- text run at (254,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 276x20 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none none none (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 276x60 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,10) size 92x20 [border: none none none (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 185x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 276x20 +- RenderTableCell {TD} at (91,20) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (183,30) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 276x20 +- RenderTableCell {TD} at (0,40) size 184x20 [border: none none none (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,98) size 276x20 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none none none (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,5794) size 276x118 [border: none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 276x18 +- RenderInline {A} at (0,0) size 242x18 +- RenderText {#text} at (14,0) size 242x18 +- text run at (14,0) width 242: "Frame=\x{201C}rhs\x{201D} and Rules=\x{201C}cols\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (255,0) size 7x18 +- text run at (255,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 275x60 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,10) size 91x20 [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 185x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 275x20 +- RenderTableCell {TD} at (90,20) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,30) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 275x20 +- RenderTableCell {TD} at (0,40) size 183x20 [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,98) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,5960) size 277x120 [border: none] +- RenderBlock {CAPTION} at (0,0) size 277x18 +- RenderInline {A} at (0,0) size 245x18 +- RenderText {#text} at (13,0) size 245x18 +- text run at (13,0) width 245: "Frame=\x{201C}box\x{201D} and Rules=\x{201C}cols\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (257,0) size 7x18 +- text run at (257,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 276x21 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px none #808080) none none (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x21 [border: (1px none #808080) none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x21 [border: (1px none #808080) none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 276x60 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,10) size 92x20 [border: none none none (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 185x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 276x20 +- RenderTableCell {TD} at (91,20) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (183,30) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 276x20 +- RenderTableCell {TD} at (0,40) size 184x20 [border: none none none (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,99) size 276x20 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none none none (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,6128) size 277x120 [border: none] +- RenderBlock {CAPTION} at (0,0) size 277x18 +- RenderInline {A} at (0,0) size 268x18 +- RenderText {#text} at (1,0) size 268x18 +- text run at (1,0) width 268: "Frame=\x{201C}border\x{201D} and Rules=\x{201C}cols\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (268,0) size 8x18 +- text run at (268,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 276x21 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px none #808080) none none (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x21 [border: (1px none #808080) none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x21 [border: (1px none #808080) none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 276x60 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,10) size 92x20 [border: none none none (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 185x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,20) size 276x20 +- RenderTableCell {TD} at (91,20) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (183,30) size 93x20 [border: none none none (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,40) size 276x20 +- RenderTableCell {TD} at (0,40) size 184x20 [border: none none none (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,99) size 276x20 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none none none (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x20 [border: none none none (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,6296) size 275x122 +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 241x18 +- RenderText {#text} at (14,0) size 241x18 +- text run at (14,0) width 241: "Frame=\x{201C}void\x{201D} and Rules=\x{201C}all\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (254,0) size 7x18 +- text run at (254,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 275x63 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,10) size 91x22 [border: (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 185x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 275x21 +- RenderTableCell {TD} at (90,21) size 93x21 [border: (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 93x22 [border: (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 275x21 +- RenderTableCell {TD} at (0,42) size 183x21 [border: (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,101) size 275x21 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,6466) size 275x123 +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 252x18 +- RenderText {#text} at (8,0) size 252x18 +- text run at (8,0) width 252: "Frame=\x{201C}above\x{201D} and Rules=\x{201C}all\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (259,0) size 8x18 +- text run at (259,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 275x21 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 275x63 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,10) size 91x22 [border: (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 185x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 275x21 +- RenderTableCell {TD} at (90,21) size 93x21 [border: (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 93x22 [border: (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 275x21 +- RenderTableCell {TD} at (0,42) size 183x21 [border: (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,102) size 275x21 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,6637) size 275x123 [border: none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 252x18 +- RenderText {#text} at (8,0) size 252x18 +- text run at (8,0) width 252: "Frame=\x{201C}below\x{201D} and Rules=\x{201C}all\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (259,0) size 8x18 +- text run at (259,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 275x63 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,10) size 91x22 [border: (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 185x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 275x21 +- RenderTableCell {TD} at (90,21) size 93x21 [border: (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 93x22 [border: (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 275x21 +- RenderTableCell {TD} at (0,42) size 183x21 [border: (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,101) size 275x21 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,6808) size 275x124 [border: none none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 275x18 +- RenderInline {A} at (0,0) size 255x18 +- RenderText {#text} at (7,0) size 255x18 +- text run at (7,0) width 255: "Frame=\x{201C}hsides\x{201D} and Rules=\x{201C}all\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (261,0) size 7x18 +- text run at (261,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 275x21 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 275x63 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,10) size 91x22 [border: (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 185x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 275x21 +- RenderTableCell {TD} at (90,21) size 93x21 [border: (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 93x22 [border: (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 275x21 +- RenderTableCell {TD} at (0,42) size 183x21 [border: (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,102) size 275x21 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,6980) size 277x122 [border: none (1px solid #808080) none none] +- RenderBlock {CAPTION} at (0,0) size 277x18 +- RenderInline {A} at (0,0) size 254x18 +- RenderText {#text} at (8,0) size 254x18 +- text run at (8,0) width 254: "Frame=\x{201C}vsides\x{201D} and Rules=\x{201C}all\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (261,0) size 8x18 +- text run at (261,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 276x20 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x20 [border: none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x20 [border: none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 276x63 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,10) size 92x22 [border: (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 185x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 276x21 +- RenderTableCell {TD} at (91,21) size 93x21 [border: (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (183,31) size 93x22 [border: (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 276x21 +- RenderTableCell {TD} at (0,42) size 184x21 [border: (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,101) size 276x21 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,7150) size 276x122 +- RenderBlock {CAPTION} at (0,0) size 276x18 +- RenderInline {A} at (0,0) size 231x18 +- RenderText {#text} at (19,0) size 231x18 +- text run at (19,0) width 231: "Frame=\x{201C}lhs\x{201D} and Rules=\x{201C}all\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (249,0) size 7x18 +- text run at (249,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 276x20 +- RenderTableRow {TR} at (0,0) size 276x20 +- RenderTableCell {TD} at (0,0) size 92x20 [border: none] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x20 [border: none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x20 [border: none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 276x63 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,10) size 92x22 [border: (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 185x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 276x21 +- RenderTableCell {TD} at (91,21) size 93x21 [border: (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (183,31) size 93x22 [border: (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 276x21 +- RenderTableCell {TD} at (0,42) size 184x21 [border: (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,101) size 276x21 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,7320) size 276x122 [border: none (1px solid #808080) none] +- RenderBlock {CAPTION} at (0,0) size 276x18 +- RenderInline {A} at (0,0) size 233x18 +- RenderText {#text} at (18,0) size 233x18 +- text run at (18,0) width 233: "Frame=\x{201C}rhs\x{201D} and Rules=\x{201C}all\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (250,0) size 7x18 +- text run at (250,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 275x20 +- RenderTableRow {TR} at (0,0) size 275x20 +- RenderTableCell {TD} at (0,0) size 91x20 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,1) size 89x18 +- text run at (1,1) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x20 [border: none] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x20 [border: none] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,1) size 89x18 +- text run at (2,1) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,38) size 275x63 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,10) size 91x22 [border: (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (1,2) size 89x19 +- text run at (1,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (90,0) size 185x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 275x21 +- RenderTableCell {TD} at (90,21) size 93x21 [border: (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (182,31) size 93x22 [border: (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 275x21 +- RenderTableCell {TD} at (0,42) size 183x21 [border: (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,101) size 275x21 +- RenderTableRow {TR} at (0,0) size 275x21 +- RenderTableCell {TD} at (0,0) size 91x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (1,2) size 89x18 +- text run at (1,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (90,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (182,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,7490) size 277x124 [border: none] +- RenderBlock {CAPTION} at (0,0) size 277x18 +- RenderInline {A} at (0,0) size 236x18 +- RenderText {#text} at (17,0) size 236x18 +- text run at (17,0) width 236: "Frame=\x{201C}box\x{201D} and Rules=\x{201C}all\x{201D}" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (252,0) size 7x18 +- text run at (252,0) width 7: ":" +- RenderTableSection {THEAD} at (0,18) size 276x21 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 276x63 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,10) size 92x22 [border: (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 185x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 276x21 +- RenderTableCell {TD} at (91,21) size 93x21 [border: (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (183,31) size 93x22 [border: (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 276x21 +- RenderTableCell {TD} at (0,42) size 184x21 [border: (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,102) size 276x21 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 3" +- RenderTable {TABLE} at (0,7662) size 277x124 [border: none] +- RenderBlock {CAPTION} at (0,0) size 277x18 +- RenderInline {A} at (0,0) size 258x18 +- RenderText {#text} at (6,0) size 258x18 +- text run at (6,0) width 258: "Frame=\x{201C}border\x{201D} and Rules=\x{201C}all\x{201D}" +- RenderInline (generated) at (0,0) size 8x18 +- RenderText at (263,0) size 8x18 +- text run at (263,0) width 8: ":" +- RenderTableSection {THEAD} at (0,18) size 276x21 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 1, Cell 3" +- RenderTableSection {TBODY} at (0,39) size 276x63 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,10) size 92x22 [border: (1px solid #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 2, Cell 1" +- RenderTableCell {TD} at (91,0) size 185x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 2, Cell 2" +- RenderTableRow {TR} at (0,21) size 276x21 +- RenderTableCell {TD} at (91,21) size 93x21 [border: (1px solid #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 3, Cell 2" +- RenderTableCell {TD} at (183,31) size 93x22 [border: (1px solid #808080)] [r=1 c=2 rs=2 cs=1] +- RenderText {#text} at (2,2) size 89x19 +- text run at (2,3) width 89: "Row 3, Cell 3" +- RenderTableRow {TR} at (0,42) size 276x21 +- RenderTableCell {TD} at (0,42) size 184x21 [border: (1px solid #808080)] [r=2 c=0 rs=1 cs=2] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 4, Cell 1" +- RenderTableSection {TFOOT} at (0,102) size 276x21 +- RenderTableRow {TR} at (0,0) size 276x21 +- RenderTableCell {TD} at (0,0) size 92x21 [border: (1px solid #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 1" +- RenderTableCell {TD} at (91,0) size 93x21 [border: (1px solid #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 2" +- RenderTableCell {TD} at (183,0) size 93x21 [border: (1px solid #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 89x18 +- text run at (2,2) width 89: "Row 5, Cell 3" +-layer at (393,24) size 392x150 +- RenderBlock (positioned) {TABLE} at (392,24) size 393x150 +- RenderTable at (0,0) size 347x153 +- RenderBlock {CAPTION} at (0,0) size 347x18 +- RenderText {#text} at (33,0) size 274x18 +- text run at (33,0) width 274: "Local links to specific testcase tables" +- RenderInline (generated) at (0,0) size 7x18 +- RenderText at (306,0) size 7x18 +- text run at (306,0) width 7: ":" +- RenderTableCol {COLGROUP} at (0,0) size 0x0 +- RenderTableCol {COLGROUP} at (0,0) size 0x0 +- RenderTableSection {THEAD} at (0,18) size 347x40 +- RenderTableRow {TR} at (0,2) size 347x17 +- RenderTableCell {TH} at (2,19) size 72x2 [r=0 c=0 rs=2 cs=2] +- RenderTableCell {TH} at (75,2) size 270x17 [r=0 c=2 rs=1 cs=9] +- RenderText {#text} at (118,1) size 34x15 +- text run at (118,1) width 34: "Frame" +- RenderTableRow {TR} at (0,21) size 347x17 +- RenderTableCell {TH} at (75,21) size 26x17 [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 24x15 +- text run at (1,1) width 24: "void" +- RenderTableCell {TH} at (102,21) size 34x17 [r=1 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 32x15 +- text run at (1,1) width 32: "above" +- RenderTableCell {TH} at (137,21) size 34x17 [r=1 c=4 rs=1 cs=1] +- RenderText {#text} at (1,1) size 32x15 +- text run at (1,1) width 32: "below" +- RenderTableCell {TH} at (172,21) size 36x17 [r=1 c=5 rs=1 cs=1] +- RenderText {#text} at (1,1) size 33x15 +- text run at (1,1) width 33: "hsides" +- RenderTableCell {TH} at (209,21) size 35x17 [r=1 c=6 rs=1 cs=1] +- RenderText {#text} at (1,1) size 33x15 +- text run at (1,1) width 33: "vsides" +- RenderTableCell {TH} at (245,21) size 19x17 [r=1 c=7 rs=1 cs=1] +- RenderText {#text} at (1,1) size 16x15 +- text run at (1,1) width 16: "lhs" +- RenderTableCell {TH} at (265,21) size 19x17 [r=1 c=8 rs=1 cs=1] +- RenderText {#text} at (1,1) size 16x15 +- text run at (1,1) width 16: "rhs" +- RenderTableCell {TH} at (285,21) size 22x17 [r=1 c=9 rs=1 cs=1] +- RenderText {#text} at (1,1) size 20x15 +- text run at (1,1) width 20: "box" +- RenderTableCell {TH} at (308,21) size 37x17 [r=1 c=10 rs=1 cs=1] +- RenderText {#text} at (1,1) size 34x15 +- text run at (1,1) width 34: "border" +- RenderTableSection {TBODY} at (0,58) size 347x95 +- RenderTableRow {TR} at (0,0) size 347x17 +- RenderTableCell {TH} at (2,38) size 32x17 [r=0 c=0 rs=5 cs=1] +- RenderText {#text} at (1,1) size 30x15 +- text run at (1,1) width 30: "Rules" +- RenderTableCell {TH} at (35,0) size 39x17 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (11,1) size 26x15 +- text run at (11,1) width 26: "none" +- RenderTableCell {TD} at (75,0) size 26x17 [bgcolor=#CCCCCC] [r=0 c=2 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (5,1) size 15x15 +- text run at (5,2) width 15: "Go" +- RenderTableCell {TD} at (102,0) size 34x17 [bgcolor=#CCCCCC] [r=0 c=3 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 15x15 +- text run at (9,2) width 15: "Go" +- RenderTableCell {TD} at (137,0) size 34x17 [bgcolor=#CCCCCC] [r=0 c=4 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (172,0) size 36x17 [bgcolor=#CCCCCC] [r=0 c=5 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (209,0) size 35x17 [bgcolor=#CCCCCC] [r=0 c=6 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (245,0) size 19x17 [bgcolor=#CCCCCC] [r=0 c=7 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (1,1) size 15x15 +- text run at (1,2) width 15: "Go" +- RenderTableCell {TD} at (265,0) size 19x17 [bgcolor=#CCCCCC] [r=0 c=8 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (1,1) size 16x15 +- text run at (1,2) width 16: "Go" +- RenderTableCell {TD} at (285,0) size 22x17 [bgcolor=#CCCCCC] [r=0 c=9 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (3,1) size 16x15 +- text run at (3,2) width 16: "Go" +- RenderTableCell {TD} at (308,0) size 37x17 [bgcolor=#CCCCCC] [r=0 c=10 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (10,1) size 16x15 +- text run at (10,2) width 16: "Go" +- RenderTableRow {TR} at (0,19) size 347x17 +- RenderTableCell {TH} at (35,19) size 39x17 [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 36x15 +- text run at (1,1) width 36: "groups" +- RenderTableCell {TD} at (75,19) size 26x17 [bgcolor=#CCCCCC] [r=1 c=2 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (5,1) size 15x15 +- text run at (5,2) width 15: "Go" +- RenderTableCell {TD} at (102,19) size 34x17 [bgcolor=#CCCCCC] [r=1 c=3 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 15x15 +- text run at (9,2) width 15: "Go" +- RenderTableCell {TD} at (137,19) size 34x17 [bgcolor=#CCCCCC] [r=1 c=4 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (172,19) size 36x17 [bgcolor=#CCCCCC] [r=1 c=5 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (209,19) size 35x17 [bgcolor=#CCCCCC] [r=1 c=6 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (245,19) size 19x17 [bgcolor=#CCCCCC] [r=1 c=7 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (1,1) size 15x15 +- text run at (1,2) width 15: "Go" +- RenderTableCell {TD} at (265,19) size 19x17 [bgcolor=#CCCCCC] [r=1 c=8 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (1,1) size 16x15 +- text run at (1,2) width 16: "Go" +- RenderTableCell {TD} at (285,19) size 22x17 [bgcolor=#CCCCCC] [r=1 c=9 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (3,1) size 16x15 +- text run at (3,2) width 16: "Go" +- RenderTableCell {TD} at (308,19) size 37x17 [bgcolor=#CCCCCC] [r=1 c=10 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (10,1) size 16x15 +- text run at (10,2) width 16: "Go" +- RenderTableRow {TR} at (0,38) size 347x17 +- RenderTableCell {TH} at (35,38) size 39x17 [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (11,1) size 26x15 +- text run at (11,1) width 26: "rows" +- RenderTableCell {TD} at (75,38) size 26x17 [bgcolor=#CCCCCC] [r=2 c=2 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (5,1) size 15x15 +- text run at (5,2) width 15: "Go" +- RenderTableCell {TD} at (102,38) size 34x17 [bgcolor=#CCCCCC] [r=2 c=3 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 15x15 +- text run at (9,2) width 15: "Go" +- RenderTableCell {TD} at (137,38) size 34x17 [bgcolor=#CCCCCC] [r=2 c=4 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (172,38) size 36x17 [bgcolor=#CCCCCC] [r=2 c=5 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (209,38) size 35x17 [bgcolor=#CCCCCC] [r=2 c=6 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (245,38) size 19x17 [bgcolor=#CCCCCC] [r=2 c=7 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (1,1) size 15x15 +- text run at (1,2) width 15: "Go" +- RenderTableCell {TD} at (265,38) size 19x17 [bgcolor=#CCCCCC] [r=2 c=8 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (1,1) size 16x15 +- text run at (1,2) width 16: "Go" +- RenderTableCell {TD} at (285,38) size 22x17 [bgcolor=#CCCCCC] [r=2 c=9 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (3,1) size 16x15 +- text run at (3,2) width 16: "Go" +- RenderTableCell {TD} at (308,38) size 37x17 [bgcolor=#CCCCCC] [r=2 c=10 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (10,1) size 16x15 +- text run at (10,2) width 16: "Go" +- RenderTableRow {TR} at (0,57) size 347x17 +- RenderTableCell {TH} at (35,57) size 39x17 [r=3 c=1 rs=1 cs=1] +- RenderText {#text} at (15,1) size 22x15 +- text run at (15,1) width 22: "cols" +- RenderTableCell {TD} at (75,57) size 26x17 [bgcolor=#CCCCCC] [r=3 c=2 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (5,1) size 15x15 +- text run at (5,2) width 15: "Go" +- RenderTableCell {TD} at (102,57) size 34x17 [bgcolor=#CCCCCC] [r=3 c=3 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 15x15 +- text run at (9,2) width 15: "Go" +- RenderTableCell {TD} at (137,57) size 34x17 [bgcolor=#CCCCCC] [r=3 c=4 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (172,57) size 36x17 [bgcolor=#CCCCCC] [r=3 c=5 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (209,57) size 35x17 [bgcolor=#CCCCCC] [r=3 c=6 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (245,57) size 19x17 [bgcolor=#CCCCCC] [r=3 c=7 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (1,1) size 15x15 +- text run at (1,2) width 15: "Go" +- RenderTableCell {TD} at (265,57) size 19x17 [bgcolor=#CCCCCC] [r=3 c=8 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (1,1) size 16x15 +- text run at (1,2) width 16: "Go" +- RenderTableCell {TD} at (285,57) size 22x17 [bgcolor=#CCCCCC] [r=3 c=9 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (3,1) size 16x15 +- text run at (3,2) width 16: "Go" +- RenderTableCell {TD} at (308,57) size 37x17 [bgcolor=#CCCCCC] [r=3 c=10 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (10,1) size 16x15 +- text run at (10,2) width 16: "Go" +- RenderTableRow {TR} at (0,76) size 347x17 +- RenderTableCell {TH} at (35,76) size 39x17 [r=4 c=1 rs=1 cs=1] +- RenderText {#text} at (23,1) size 14x15 +- text run at (23,1) width 14: "all" +- RenderTableCell {TD} at (75,76) size 26x17 [bgcolor=#CCCCCC] [r=4 c=2 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (5,1) size 15x15 +- text run at (5,2) width 15: "Go" +- RenderTableCell {TD} at (102,76) size 34x17 [bgcolor=#CCCCCC] [r=4 c=3 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 15x15 +- text run at (9,2) width 15: "Go" +- RenderTableCell {TD} at (137,76) size 34x17 [bgcolor=#CCCCCC] [r=4 c=4 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (172,76) size 36x17 [bgcolor=#CCCCCC] [r=4 c=5 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (209,76) size 35x17 [bgcolor=#CCCCCC] [r=4 c=6 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (9,1) size 16x15 +- text run at (9,2) width 16: "Go" +- RenderTableCell {TD} at (245,76) size 19x17 [bgcolor=#CCCCCC] [r=4 c=7 rs=1 cs=1] +- RenderInline {A} at (0,0) size 15x14 [color=#0000EE] +- RenderText {#text} at (1,1) size 15x15 +- text run at (1,2) width 15: "Go" +- RenderTableCell {TD} at (265,76) size 19x17 [bgcolor=#CCCCCC] [r=4 c=8 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (1,1) size 16x15 +- text run at (1,2) width 16: "Go" +- RenderTableCell {TD} at (285,76) size 22x17 [bgcolor=#CCCCCC] [r=4 c=9 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (3,1) size 16x15 +- text run at (3,2) width 16: "Go" +- RenderTableCell {TD} at (308,76) size 37x17 [bgcolor=#CCCCCC] [r=4 c=10 rs=1 cs=1] +- RenderInline {A} at (0,0) size 16x14 [color=#0000EE] +- RenderText {#text} at (10,1) size 16x15 +- text run at (10,2) width 16: "Go" +diff --git a/LayoutTests/platform/mac-mojave/fast/text/atsui-multiple-renderers-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/atsui-multiple-renderers-expected.txt +deleted file mode 100644 +index 6cc4053ddcc968df77e2f17e2d55a695d00097f6..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/atsui-multiple-renderers-expected.txt ++++ /dev/null +@@ -1,101 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock {P} at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 108x18 +- text run at (0,0) width 108: "This is a test for " +- RenderInline {I} at (0,0) size 767x36 +- RenderText {#text} at (107,0) size 767x36 +- text run at (107,0) width 660: "http://bugzilla.opendarwin.org/show_bug.cgi?id=6139 ATSUI code path should implement small caps," +- text run at (0,18) width 412: "synthetic bold and oblique and correct metrics for fallback fonts" +- RenderText {#text} at (411,18) size 5x18 +- text run at (411,18) width 5: "." +- RenderBlock {HR} at (0,52) size 784x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,70) size 784x18 +- RenderText {#text} at (0,0) size 611x18 +- text run at (0,0) width 611: "The two columns should be identical except for the accent over the e and the umlaut over the u." +- RenderTable {TABLE} at (0,104) size 260x147 [border: none] +- RenderTableSection {TBODY} at (0,0) size 259x146 +- RenderTableRow {TR} at (0,0) size 259x30 +- RenderTableCell {TD} at (0,0) size 130x30 [border: (1px solid #008000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,3) size 68x25 +- text run at (2,3) width 68: "Lore\x{300}m " +- RenderInline {SPAN} at (0,0) size 50x23 +- RenderText {#text} at (69,5) size 50x23 +- text run at (69,5) width 50: "ipsu\x{308}m" +- RenderText {#text} at (0,0) size 0x0 +- RenderTableCell {TD} at (129,0) size 130x30 [border: (1px solid #008000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,3) size 68x25 +- text run at (2,3) width 68: "Lorem " +- RenderInline {SPAN} at (0,0) size 50x23 +- RenderText {#text} at (69,5) size 50x23 +- text run at (69,5) width 50: "ipsum" +- RenderText {#text} at (0,0) size 0x0 +- RenderTableRow {TR} at (0,30) size 259x30 +- RenderTableCell {TD} at (0,30) size 130x30 [border: (1px solid #008000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,3) size 74x25 +- text run at (2,3) width 74: "Lore\x{300}m " +- RenderInline {SPAN} at (0,0) size 53x23 +- RenderText {#text} at (75,5) size 53x23 +- text run at (75,5) width 53: "ipsu\x{308}m" +- RenderText {#text} at (0,0) size 0x0 +- RenderTableCell {TD} at (129,30) size 130x30 [border: (1px solid #008000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,3) size 74x25 +- text run at (2,3) width 74: "Lorem " +- RenderInline {SPAN} at (0,0) size 53x23 +- RenderText {#text} at (75,5) size 53x23 +- text run at (75,5) width 53: "ipsum" +- RenderText {#text} at (0,0) size 0x0 +- RenderTableRow {TR} at (0,60) size 259x30 +- RenderTableCell {TD} at (0,60) size 130x30 [border: (1px solid #008000)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,3) size 68x25 +- text run at (2,3) width 68: "Lore\x{300}m " +- RenderInline {SPAN} at (0,0) size 49x23 +- RenderText {#text} at (69,5) size 49x23 +- text run at (69,5) width 49: "ipsu\x{308}m" +- RenderText {#text} at (0,0) size 0x0 +- RenderTableCell {TD} at (129,60) size 130x30 [border: (1px solid #008000)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,3) size 68x25 +- text run at (2,3) width 68: "Lorem " +- RenderInline {SPAN} at (0,0) size 49x23 +- RenderText {#text} at (69,5) size 49x23 +- text run at (69,5) width 49: "ipsum" +- RenderText {#text} at (0,0) size 0x0 +- RenderTableRow {TR} at (0,90) size 259x30 +- RenderTableCell {TD} at (0,90) size 130x30 [border: (1px solid #008000)] [r=3 c=0 rs=1 cs=1] +- RenderText {#text} at (2,3) size 74x25 +- text run at (2,3) width 74: "Lore\x{300}m " +- RenderInline {SPAN} at (0,0) size 54x23 +- RenderText {#text} at (75,5) size 54x23 +- text run at (75,5) width 54: "ipsu\x{308}m" +- RenderText {#text} at (0,0) size 0x0 +- RenderTableCell {TD} at (129,90) size 130x30 [border: (1px solid #008000)] [r=3 c=1 rs=1 cs=1] +- RenderText {#text} at (2,3) size 74x25 +- text run at (2,3) width 74: "Lorem " +- RenderInline {SPAN} at (0,0) size 54x23 +- RenderText {#text} at (75,5) size 54x23 +- text run at (75,5) width 54: "ipsum" +- RenderText {#text} at (0,0) size 0x0 +- RenderTableRow {TR} at (0,120) size 259x26 +- RenderTableCell {TD} at (0,120) size 130x26 [border: (1px solid #008000)] [r=4 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 101x23 +- text run at (2,2) width 101: "Lore\x{300}m ipsu\x{308}m" +- RenderTableCell {TD} at (129,120) size 130x26 [border: (1px solid #008000)] [r=4 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 101x23 +- text run at (2,2) width 101: "Lorem ipsum" +- RenderBlock {HR} at (0,259) size 784x2 [border: (1px inset #000000)] +- RenderBlock {P} at (0,277) size 784x18 +- RenderText {#text} at (0,0) size 283x18 +- text run at (0,0) width 283: "The following two lines should be identical." +- RenderBlock {P} at (0,311) size 784x24 +- RenderInline {SPAN} at (0,0) size 337x24 [border: (1px solid #008000)] +- RenderText {#text} at (1,2) size 335x22 +- text run at (1,2) width 335: "\x{E01}\x{E02}\x{E03}\x{E04}\x{E05}\x{E06}\x{E07}\x{E08}\x{E01}\x{E02}\x{E03}\x{E04}\x{E05}\x{E06}\x{E07}\x{E08}\x{E01}\x{E02}\x{E03}\x{E04}\x{E05}\x{E06}\x{E07}\x{E08}\x{E01}\x{E02}\x{E03}\x{E04}\x{E05}\x{E06}\x{E07}\x{E08}" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,351) size 784x24 +- RenderInline {SPAN} at (0,0) size 337x23 [border: (1px solid #008000)] +- RenderText {#text} at (1,2) size 335x21 +- text run at (1,2) width 335: "\x{E01}\x{E02}\x{E03}\x{E04}\x{E05}\x{E06}\x{E07}\x{E08}\x{E01}\x{E02}\x{E03}\x{E04}\x{E05}\x{E06}\x{E07}\x{E08}\x{E01}\x{E02}\x{E03}\x{E04}\x{E05}\x{E06}\x{E07}\x{E08}\x{E01}\x{E02}\x{E03}\x{E04}\x{E05}\x{E06}\x{E07}\x{E08}" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/text/bidi-embedding-pop-and-push-same-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/bidi-embedding-pop-and-push-same-expected.txt +deleted file mode 100644 +index 17651ef8373be4f5566f18697f5b1e6c6531e386..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/bidi-embedding-pop-and-push-same-expected.txt ++++ /dev/null +@@ -1,143 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 520x18 +- text run at (0,0) width 520: "In each box below, the words or letters should be in the same order on every line." +- RenderBlock {DIV} at (8,34) size 768x64 [border: (1px solid #ADD8E6)] +- RenderBlock {DIV} at (5,5) size 758x18 +- RenderText {#text} at (0,0) size 47x18 +- text run at (0,0) width 47: "Lorem " +- RenderInline {SPAN} at (0,0) size 78x18 +- RenderText {#text} at (46,0) size 78x18 +- text run at (46,0) width 78: "ipsum dolor" +- RenderText {#text} at (123,0) size 59x18 +- text run at (123,0) width 59: " sit amet." +- RenderBlock {DIV} at (5,23) size 758x18 +- RenderText {#text} at (0,0) size 47x18 +- text run at (0,0) width 47: "Lorem " +- RenderInline {SPAN} at (0,0) size 40x18 +- RenderText {#text} at (46,0) size 40x18 +- text run at (46,0) width 40: "ipsum" +- RenderInline {SPAN} at (0,0) size 39x18 +- RenderText {#text} at (85,0) size 39x18 +- text run at (85,0) width 39: " dolor" +- RenderText {#text} at (123,0) size 59x18 +- text run at (123,0) width 59: " sit amet." +- RenderBlock {DIV} at (5,41) size 758x18 +- RenderText {#text} at (0,0) size 47x18 +- text run at (0,0) width 47: "Lorem " +- RenderInline {SPAN} at (0,0) size 44x18 +- RenderText {#text} at (46,0) size 44x18 +- text run at (46,0) width 44: "ipsum " +- RenderInline {B} at (0,0) size 98x18 +- RenderInline {SPAN} at (0,0) size 38x18 +- RenderText {#text} at (89,0) size 38x18 +- text run at (89,0) width 38: "dolor" +- RenderText {#text} at (126,0) size 5x18 +- text run at (126,0) width 5: " " +- RenderInline {I} at (0,0) size 19x18 +- RenderText {#text} at (130,0) size 19x18 +- text run at (130,0) width 19: "sit" +- RenderText {#text} at (148,0) size 39x18 +- text run at (148,0) width 39: " amet" +- RenderText {#text} at (186,0) size 5x18 +- text run at (186,0) width 5: "." +- RenderBlock {DIV} at (8,106) size 768x67 [border: (1px solid #ADD8E6)] +- RenderBlock {DIV} at (5,5) size 758x19 +- RenderText {#text} at (0,1) size 47x18 +- text run at (0,1) width 47: "Lorem " +- RenderInline {SPAN} at (0,0) size 66x18 +- RenderText {#text} at (46,1) size 66x18 +- text run at (46,1) width 23 RTL: " \x{5DB}\x{5DC}" +- text run at (68,1) width 11: "if" +- text run at (78,1) width 34 RTL: "\x{5D9}\x{5D5}\x{5EA}\x{5E8} " +- RenderText {#text} at (111,1) size 59x18 +- text run at (111,1) width 59: " sit amet." +- RenderBlock {DIV} at (5,24) size 758x19 +- RenderText {#text} at (0,1) size 47x18 +- text run at (0,1) width 47: "Lorem " +- RenderInline {SPAN} at (0,0) size 34x18 +- RenderText {#text} at (78,1) size 34x18 +- text run at (78,1) width 34 RTL: "\x{5D9}\x{5D5}\x{5EA}\x{5E8} " +- RenderInline {SPAN} at (0,0) size 33x18 +- RenderText {#text} at (46,1) size 33x18 +- text run at (46,1) width 23 RTL: " \x{5DB}\x{5DC}" +- text run at (68,1) width 11: "if" +- RenderText {#text} at (111,1) size 59x18 +- text run at (111,1) width 59: " sit amet." +- RenderBlock {DIV} at (5,43) size 758x19 +- RenderText {#text} at (0,1) size 47x18 +- text run at (0,1) width 47: "Lorem " +- RenderInline {SPAN} at (0,0) size 34x18 +- RenderText {#text} at (78,1) size 34x18 +- text run at (78,1) width 34 RTL: "\x{5D9}\x{5D5}\x{5EA}\x{5E8} " +- RenderInline {B} at (0,0) size 126x18 +- RenderInline {SPAN} at (0,0) size 33x18 +- RenderText {#text} at (46,1) size 33x18 +- text run at (46,1) width 23 RTL: " \x{5DB}\x{5DC}" +- text run at (68,1) width 11: "if" +- RenderText {#text} at (111,1) size 5x18 +- text run at (111,1) width 5: " " +- RenderInline {I} at (0,0) size 19x18 +- RenderText {#text} at (115,1) size 19x18 +- text run at (115,1) width 19: "sit" +- RenderText {#text} at (133,1) size 39x18 +- text run at (133,1) width 39: " amet" +- RenderText {#text} at (171,1) size 5x18 +- text run at (171,1) width 5: "." +- RenderBlock {DIV} at (8,181) size 768x46 [border: (1px solid #ADD8E6)] +- RenderBlock {DIV} at (5,5) size 758x18 +- RenderInline {SPAN} at (0,0) size 20x18 +- RenderText {#text} at (0,0) size 20x18 +- text run at (0,0) width 20: "a b" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (5,23) size 758x18 +- RenderInline {SPAN} at (0,0) size 8x18 +- RenderText {#text} at (0,0) size 8x18 +- text run at (0,0) width 8: "a" +- RenderInline {SPAN} at (0,0) size 13x18 +- RenderText {#text} at (7,0) size 13x18 +- text run at (7,0) width 13: " b" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {DIV} at (8,235) size 768x67 [border: (1px solid #ADD8E6)] +- RenderBlock {DIV} at (5,5) size 758x19 +- RenderText {#text} at (721,1) size 37x18 +- text run at (721,1) width 37 RTL: "\x{5D0}\x{5D7}\x{5EA} " +- RenderInline {SPAN} at (0,0) size 86x18 +- RenderText {#text} at (636,1) size 86x18 +- text run at (636,1) width 86 RTL: "\x{5E9}\x{5EA}\x{5D9}\x{5D9}\x{5DD} \x{5E9}\x{5DC}\x{5D5}\x{5E9}" +- RenderText {#text} at (553,1) size 84x18 +- text run at (553,1) width 84 RTL: " \x{5D0}\x{5E8}\x{5D1}\x{5E2} \x{5D7}\x{5DE}\x{5E9}." +- RenderBlock {DIV} at (5,24) size 758x19 +- RenderText {#text} at (721,1) size 37x18 +- text run at (721,1) width 37 RTL: "\x{5D0}\x{5D7}\x{5EA} " +- RenderInline {SPAN} at (0,0) size 45x18 +- RenderText {#text} at (677,1) size 45x18 +- text run at (677,1) width 45 RTL: "\x{5E9}\x{5EA}\x{5D9}\x{5D9}\x{5DD}" +- RenderInline {SPAN} at (0,0) size 42x18 +- RenderText {#text} at (636,1) size 42x18 +- text run at (636,1) width 42 RTL: " \x{5E9}\x{5DC}\x{5D5}\x{5E9}" +- RenderText {#text} at (553,1) size 84x18 +- text run at (553,1) width 84 RTL: " \x{5D0}\x{5E8}\x{5D1}\x{5E2} \x{5D7}\x{5DE}\x{5E9}." +- RenderBlock {DIV} at (5,43) size 758x19 +- RenderText {#text} at (721,1) size 37x18 +- text run at (721,1) width 37 RTL: "\x{5D0}\x{5D7}\x{5EA} " +- RenderInline {SPAN} at (0,0) size 49x18 +- RenderText {#text} at (673,1) size 49x18 +- text run at (673,1) width 49 RTL: "\x{5E9}\x{5EA}\x{5D9}\x{5D9}\x{5DD} " +- RenderInline {B} at (0,0) size 122x18 +- RenderInline {SPAN} at (0,0) size 39x18 +- RenderText {#text} at (635,1) size 39x18 +- text run at (635,1) width 39 RTL: "\x{5E9}\x{5DC}\x{5D5}\x{5E9}" +- RenderText {#text} at (631,1) size 5x18 +- text run at (631,1) width 5 RTL: " " +- RenderInline {I} at (0,0) size 42x18 +- RenderText {#text} at (590,1) size 42x18 +- text run at (590,1) width 42 RTL: "\x{5D0}\x{5E8}\x{5D1}\x{5E2}" +- RenderText {#text} at (552,1) size 39x18 +- text run at (552,1) width 39 RTL: " \x{5D7}\x{5DE}\x{5E9}" +- RenderText {#text} at (548,1) size 5x18 +- text run at (548,1) width 5 RTL: "." +diff --git a/LayoutTests/platform/mac-mojave/fast/text/font-weights-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/font-weights-expected.txt +deleted file mode 100644 +index 8b06add5a580ee5a49c28d6b916862ae6ffc5862..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/font-weights-expected.txt ++++ /dev/null +@@ -1,1097 +0,0 @@ +-layer at (0,0) size 785x6747 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x6747 +- RenderBlock {HTML} at (0,0) size 785x6747 +- RenderBody {BODY} at (8,8) size 769x6731 +- RenderBlock (anonymous) at (0,0) size 769x144 +- RenderText {#text} at (0,0) size 769x72 +- text run at (0,0) width 746: "This test is designed to test the interaction between font-family and font-weight. In particular, our implementation of" +- text run at (0,18) width 759: "font-family accepts PostScript names, which may name a font with a particular weight. However, there is another CSS" +- text run at (0,36) width 769: "property, font-weight, in which the author may also name a particular weight. Our font selection algorithm takes both of" +- text run at (0,54) width 305: "these signals into account when choosing fonts." +- RenderBR {BR} at (304,54) size 1x18 +- RenderBR {BR} at (0,72) size 0x18 +- RenderText {#text} at (0,90) size 767x54 +- text run at (0,90) width 767: "There is currently no good way in JavaScript to find the actual font chosen for some text. Therefore, the best way to test" +- text run at (0,108) width 732: "this aspect of the font selection algorithm is to dump the render tree, therefore testing glyph advances (which are a" +- text run at (0,126) width 159: "property of font weight)." +- RenderBlock {DIV} at (0,144) size 769x18 +- RenderText {#text} at (0,0) size 303x18 +- text run at (0,0) width 303: "Font: Helvetica Neue Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,162) size 769x18 +- RenderText {#text} at (0,0) size 315x18 +- text run at (0,0) width 315: "Font: Helvetica Neue Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,180) size 769x18 +- RenderText {#text} at (0,0) size 325x18 +- text run at (0,0) width 325: "Font: Helvetica Neue Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,198) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: Helvetica Neue Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,216) size 769x19 +- RenderText {#text} at (0,0) size 347x19 +- text run at (0,0) width 347: "Font: Helvetica Neue Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,235) size 769x19 +- RenderText {#text} at (0,0) size 355x19 +- text run at (0,0) width 355: "Font: Helvetica Neue Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,254) size 769x19 +- RenderText {#text} at (0,0) size 355x19 +- text run at (0,0) width 355: "Font: Helvetica Neue Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,273) size 769x19 +- RenderText {#text} at (0,0) size 355x19 +- text run at (0,0) width 355: "Font: Helvetica Neue Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,292) size 769x19 +- RenderText {#text} at (0,0) size 355x19 +- text run at (0,0) width 355: "Font: Helvetica Neue Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,311) size 769x18 +- RenderText {#text} at (0,0) size 362x18 +- text run at (0,0) width 362: "Font: HelveticaNeue-UltraLight Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,329) size 769x18 +- RenderText {#text} at (0,0) size 362x18 +- text run at (0,0) width 362: "Font: HelveticaNeue-UltraLight Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,347) size 769x18 +- RenderText {#text} at (0,0) size 362x18 +- text run at (0,0) width 362: "Font: HelveticaNeue-UltraLight Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,365) size 769x18 +- RenderText {#text} at (0,0) size 362x18 +- text run at (0,0) width 362: "Font: HelveticaNeue-UltraLight Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,383) size 769x18 +- RenderText {#text} at (0,0) size 362x18 +- text run at (0,0) width 362: "Font: HelveticaNeue-UltraLight Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,401) size 769x19 +- RenderText {#text} at (0,0) size 433x19 +- text run at (0,0) width 433: "Font: HelveticaNeue-UltraLight Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,420) size 769x19 +- RenderText {#text} at (0,0) size 433x19 +- text run at (0,0) width 433: "Font: HelveticaNeue-UltraLight Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,439) size 769x19 +- RenderText {#text} at (0,0) size 433x19 +- text run at (0,0) width 433: "Font: HelveticaNeue-UltraLight Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,458) size 769x19 +- RenderText {#text} at (0,0) size 433x19 +- text run at (0,0) width 433: "Font: HelveticaNeue-UltraLight Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,477) size 769x18 +- RenderText {#text} at (0,0) size 361x18 +- text run at (0,0) width 361: "Font: HelveticaNeue-Light Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,495) size 769x18 +- RenderText {#text} at (0,0) size 361x18 +- text run at (0,0) width 361: "Font: HelveticaNeue-Light Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,513) size 769x18 +- RenderText {#text} at (0,0) size 361x18 +- text run at (0,0) width 361: "Font: HelveticaNeue-Light Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,531) size 769x18 +- RenderText {#text} at (0,0) size 361x18 +- text run at (0,0) width 361: "Font: HelveticaNeue-Light Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,549) size 769x18 +- RenderText {#text} at (0,0) size 361x18 +- text run at (0,0) width 361: "Font: HelveticaNeue-Light Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,567) size 769x19 +- RenderText {#text} at (0,0) size 396x19 +- text run at (0,0) width 396: "Font: HelveticaNeue-Light Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,586) size 769x19 +- RenderText {#text} at (0,0) size 396x19 +- text run at (0,0) width 396: "Font: HelveticaNeue-Light Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,605) size 769x19 +- RenderText {#text} at (0,0) size 396x19 +- text run at (0,0) width 396: "Font: HelveticaNeue-Light Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,624) size 769x19 +- RenderText {#text} at (0,0) size 396x19 +- text run at (0,0) width 396: "Font: HelveticaNeue-Light Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,643) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: HelveticaNeue Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,661) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: HelveticaNeue Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,679) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: HelveticaNeue Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,697) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: HelveticaNeue Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,715) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: HelveticaNeue Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,733) size 769x19 +- RenderText {#text} at (0,0) size 351x19 +- text run at (0,0) width 351: "Font: HelveticaNeue Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,752) size 769x19 +- RenderText {#text} at (0,0) size 351x19 +- text run at (0,0) width 351: "Font: HelveticaNeue Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,771) size 769x19 +- RenderText {#text} at (0,0) size 351x19 +- text run at (0,0) width 351: "Font: HelveticaNeue Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,790) size 769x19 +- RenderText {#text} at (0,0) size 351x19 +- text run at (0,0) width 351: "Font: HelveticaNeue Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,809) size 769x19 +- RenderText {#text} at (0,0) size 409x19 +- text run at (0,0) width 409: "Font: HelveticaNeue-Medium Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,828) size 769x19 +- RenderText {#text} at (0,0) size 409x19 +- text run at (0,0) width 409: "Font: HelveticaNeue-Medium Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,847) size 769x19 +- RenderText {#text} at (0,0) size 409x19 +- text run at (0,0) width 409: "Font: HelveticaNeue-Medium Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,866) size 769x19 +- RenderText {#text} at (0,0) size 409x19 +- text run at (0,0) width 409: "Font: HelveticaNeue-Medium Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,885) size 769x19 +- RenderText {#text} at (0,0) size 409x19 +- text run at (0,0) width 409: "Font: HelveticaNeue-Medium Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,904) size 769x19 +- RenderText {#text} at (0,0) size 419x19 +- text run at (0,0) width 419: "Font: HelveticaNeue-Medium Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,923) size 769x19 +- RenderText {#text} at (0,0) size 419x19 +- text run at (0,0) width 419: "Font: HelveticaNeue-Medium Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,942) size 769x19 +- RenderText {#text} at (0,0) size 419x19 +- text run at (0,0) width 419: "Font: HelveticaNeue-Medium Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,961) size 769x19 +- RenderText {#text} at (0,0) size 419x19 +- text run at (0,0) width 419: "Font: HelveticaNeue-Medium Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,980) size 769x19 +- RenderText {#text} at (0,0) size 392x19 +- text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,999) size 769x19 +- RenderText {#text} at (0,0) size 392x19 +- text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,1018) size 769x19 +- RenderText {#text} at (0,0) size 392x19 +- text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,1037) size 769x19 +- RenderText {#text} at (0,0) size 392x19 +- text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,1056) size 769x19 +- RenderText {#text} at (0,0) size 392x19 +- text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,1075) size 769x19 +- RenderText {#text} at (0,0) size 392x19 +- text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,1094) size 769x19 +- RenderText {#text} at (0,0) size 392x19 +- text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,1113) size 769x19 +- RenderText {#text} at (0,0) size 392x19 +- text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,1132) size 769x19 +- RenderText {#text} at (0,0) size 392x19 +- text run at (0,0) width 392: "Font: HelveticaNeue-Bold Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,1151) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: HelveticaNeue-UltraLightItalic Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,1169) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: HelveticaNeue-UltraLightItalic Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,1187) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: HelveticaNeue-UltraLightItalic Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,1205) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: HelveticaNeue-UltraLightItalic Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,1223) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: HelveticaNeue-UltraLightItalic Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,1241) size 769x19 +- RenderText {#text} at (0,0) size 470x19 +- text run at (0,0) width 470: "Font: HelveticaNeue-UltraLightItalic Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,1260) size 769x19 +- RenderText {#text} at (0,0) size 470x19 +- text run at (0,0) width 470: "Font: HelveticaNeue-UltraLightItalic Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,1279) size 769x19 +- RenderText {#text} at (0,0) size 470x19 +- text run at (0,0) width 470: "Font: HelveticaNeue-UltraLightItalic Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,1298) size 769x19 +- RenderText {#text} at (0,0) size 470x19 +- text run at (0,0) width 470: "Font: HelveticaNeue-UltraLightItalic Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,1317) size 769x18 +- RenderText {#text} at (0,0) size 391x18 +- text run at (0,0) width 391: "Font: HelveticaNeue-LightItalic Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,1335) size 769x18 +- RenderText {#text} at (0,0) size 391x18 +- text run at (0,0) width 391: "Font: HelveticaNeue-LightItalic Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,1353) size 769x18 +- RenderText {#text} at (0,0) size 391x18 +- text run at (0,0) width 391: "Font: HelveticaNeue-LightItalic Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,1371) size 769x18 +- RenderText {#text} at (0,0) size 391x18 +- text run at (0,0) width 391: "Font: HelveticaNeue-LightItalic Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,1389) size 769x18 +- RenderText {#text} at (0,0) size 391x18 +- text run at (0,0) width 391: "Font: HelveticaNeue-LightItalic Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,1407) size 769x19 +- RenderText {#text} at (0,0) size 433x19 +- text run at (0,0) width 433: "Font: HelveticaNeue-LightItalic Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,1426) size 769x19 +- RenderText {#text} at (0,0) size 433x19 +- text run at (0,0) width 433: "Font: HelveticaNeue-LightItalic Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,1445) size 769x19 +- RenderText {#text} at (0,0) size 433x19 +- text run at (0,0) width 433: "Font: HelveticaNeue-LightItalic Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,1464) size 769x19 +- RenderText {#text} at (0,0) size 433x19 +- text run at (0,0) width 433: "Font: HelveticaNeue-LightItalic Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,1483) size 769x18 +- RenderText {#text} at (0,0) size 371x18 +- text run at (0,0) width 371: "Font: HelveticaNeue-Italic Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,1501) size 769x18 +- RenderText {#text} at (0,0) size 371x18 +- text run at (0,0) width 371: "Font: HelveticaNeue-Italic Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,1519) size 769x18 +- RenderText {#text} at (0,0) size 371x18 +- text run at (0,0) width 371: "Font: HelveticaNeue-Italic Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,1537) size 769x18 +- RenderText {#text} at (0,0) size 371x18 +- text run at (0,0) width 371: "Font: HelveticaNeue-Italic Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,1555) size 769x18 +- RenderText {#text} at (0,0) size 371x18 +- text run at (0,0) width 371: "Font: HelveticaNeue-Italic Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,1573) size 769x19 +- RenderText {#text} at (0,0) size 394x19 +- text run at (0,0) width 394: "Font: HelveticaNeue-Italic Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,1592) size 769x19 +- RenderText {#text} at (0,0) size 394x19 +- text run at (0,0) width 394: "Font: HelveticaNeue-Italic Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,1611) size 769x19 +- RenderText {#text} at (0,0) size 394x19 +- text run at (0,0) width 394: "Font: HelveticaNeue-Italic Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,1630) size 769x19 +- RenderText {#text} at (0,0) size 394x19 +- text run at (0,0) width 394: "Font: HelveticaNeue-Italic Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,1649) size 769x19 +- RenderText {#text} at (0,0) size 431x19 +- text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,1668) size 769x19 +- RenderText {#text} at (0,0) size 431x19 +- text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,1687) size 769x19 +- RenderText {#text} at (0,0) size 431x19 +- text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,1706) size 769x19 +- RenderText {#text} at (0,0) size 431x19 +- text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,1725) size 769x19 +- RenderText {#text} at (0,0) size 431x19 +- text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,1744) size 769x19 +- RenderText {#text} at (0,0) size 431x19 +- text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,1763) size 769x19 +- RenderText {#text} at (0,0) size 431x19 +- text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,1782) size 769x19 +- RenderText {#text} at (0,0) size 431x19 +- text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,1801) size 769x19 +- RenderText {#text} at (0,0) size 431x19 +- text run at (0,0) width 431: "Font: HelveticaNeue-BoldItalic Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,1820) size 769x18 +- RenderText {#text} at (0,0) size 287x18 +- text run at (0,0) width 287: "Font: Helvetica Neue Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,1838) size 769x18 +- RenderText {#text} at (0,0) size 299x18 +- text run at (0,0) width 299: "Font: Helvetica Neue Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,1856) size 769x18 +- RenderText {#text} at (0,0) size 308x18 +- text run at (0,0) width 308: "Font: Helvetica Neue Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,1874) size 769x18 +- RenderText {#text} at (0,0) size 320x18 +- text run at (0,0) width 320: "Font: Helvetica Neue Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,1892) size 769x19 +- RenderText {#text} at (0,0) size 329x19 +- text run at (0,0) width 329: "Font: Helvetica Neue Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,1911) size 769x19 +- RenderText {#text} at (0,0) size 340x19 +- text run at (0,0) width 340: "Font: Helvetica Neue Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,1930) size 769x19 +- RenderText {#text} at (0,0) size 340x19 +- text run at (0,0) width 340: "Font: Helvetica Neue Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,1949) size 769x19 +- RenderText {#text} at (0,0) size 340x19 +- text run at (0,0) width 340: "Font: Helvetica Neue Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,1968) size 769x19 +- RenderText {#text} at (0,0) size 340x19 +- text run at (0,0) width 340: "Font: Helvetica Neue Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,1987) size 769x18 +- RenderText {#text} at (0,0) size 345x18 +- text run at (0,0) width 345: "Font: HelveticaNeue-UltraLight Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,2005) size 769x18 +- RenderText {#text} at (0,0) size 361x18 +- text run at (0,0) width 361: "Font: HelveticaNeue-UltraLight Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,2023) size 769x18 +- RenderText {#text} at (0,0) size 376x18 +- text run at (0,0) width 376: "Font: HelveticaNeue-UltraLight Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,2041) size 769x18 +- RenderText {#text} at (0,0) size 391x18 +- text run at (0,0) width 391: "Font: HelveticaNeue-UltraLight Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,2059) size 769x19 +- RenderText {#text} at (0,0) size 404x19 +- text run at (0,0) width 404: "Font: HelveticaNeue-UltraLight Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,2078) size 769x19 +- RenderText {#text} at (0,0) size 418x19 +- text run at (0,0) width 418: "Font: HelveticaNeue-UltraLight Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,2097) size 769x19 +- RenderText {#text} at (0,0) size 418x19 +- text run at (0,0) width 418: "Font: HelveticaNeue-UltraLight Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,2116) size 769x19 +- RenderText {#text} at (0,0) size 418x19 +- text run at (0,0) width 418: "Font: HelveticaNeue-UltraLight Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,2135) size 769x19 +- RenderText {#text} at (0,0) size 418x19 +- text run at (0,0) width 418: "Font: HelveticaNeue-UltraLight Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,2154) size 769x18 +- RenderText {#text} at (0,0) size 317x18 +- text run at (0,0) width 317: "Font: HelveticaNeue-Light Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,2172) size 769x18 +- RenderText {#text} at (0,0) size 331x18 +- text run at (0,0) width 331: "Font: HelveticaNeue-Light Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,2190) size 769x18 +- RenderText {#text} at (0,0) size 344x18 +- text run at (0,0) width 344: "Font: HelveticaNeue-Light Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,2208) size 769x18 +- RenderText {#text} at (0,0) size 357x18 +- text run at (0,0) width 357: "Font: HelveticaNeue-Light Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,2226) size 769x19 +- RenderText {#text} at (0,0) size 368x19 +- text run at (0,0) width 368: "Font: HelveticaNeue-Light Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,2245) size 769x19 +- RenderText {#text} at (0,0) size 381x19 +- text run at (0,0) width 381: "Font: HelveticaNeue-Light Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,2264) size 769x19 +- RenderText {#text} at (0,0) size 381x19 +- text run at (0,0) width 381: "Font: HelveticaNeue-Light Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,2283) size 769x19 +- RenderText {#text} at (0,0) size 381x19 +- text run at (0,0) width 381: "Font: HelveticaNeue-Light Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,2302) size 769x19 +- RenderText {#text} at (0,0) size 381x19 +- text run at (0,0) width 381: "Font: HelveticaNeue-Light Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,2321) size 769x18 +- RenderText {#text} at (0,0) size 282x18 +- text run at (0,0) width 282: "Font: HelveticaNeue Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,2339) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: HelveticaNeue Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,2357) size 769x18 +- RenderText {#text} at (0,0) size 304x18 +- text run at (0,0) width 304: "Font: HelveticaNeue Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,2375) size 769x18 +- RenderText {#text} at (0,0) size 315x18 +- text run at (0,0) width 315: "Font: HelveticaNeue Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,2393) size 769x19 +- RenderText {#text} at (0,0) size 325x19 +- text run at (0,0) width 325: "Font: HelveticaNeue Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,2412) size 769x19 +- RenderText {#text} at (0,0) size 336x19 +- text run at (0,0) width 336: "Font: HelveticaNeue Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,2431) size 769x19 +- RenderText {#text} at (0,0) size 336x19 +- text run at (0,0) width 336: "Font: HelveticaNeue Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,2450) size 769x19 +- RenderText {#text} at (0,0) size 336x19 +- text run at (0,0) width 336: "Font: HelveticaNeue Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,2469) size 769x19 +- RenderText {#text} at (0,0) size 336x19 +- text run at (0,0) width 336: "Font: HelveticaNeue Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,2488) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: HelveticaNeue-Medium Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,2506) size 769x18 +- RenderText {#text} at (0,0) size 354x18 +- text run at (0,0) width 354: "Font: HelveticaNeue-Medium Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,2524) size 769x18 +- RenderText {#text} at (0,0) size 366x18 +- text run at (0,0) width 366: "Font: HelveticaNeue-Medium Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,2542) size 769x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 379: "Font: HelveticaNeue-Medium Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,2560) size 769x19 +- RenderText {#text} at (0,0) size 391x19 +- text run at (0,0) width 391: "Font: HelveticaNeue-Medium Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,2579) size 769x19 +- RenderText {#text} at (0,0) size 404x19 +- text run at (0,0) width 404: "Font: HelveticaNeue-Medium Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,2598) size 769x19 +- RenderText {#text} at (0,0) size 404x19 +- text run at (0,0) width 404: "Font: HelveticaNeue-Medium Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,2617) size 769x19 +- RenderText {#text} at (0,0) size 404x19 +- text run at (0,0) width 404: "Font: HelveticaNeue-Medium Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,2636) size 769x19 +- RenderText {#text} at (0,0) size 404x19 +- text run at (0,0) width 404: "Font: HelveticaNeue-Medium Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,2655) size 769x18 +- RenderText {#text} at (0,0) size 316x18 +- text run at (0,0) width 316: "Font: HelveticaNeue-Bold Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,2673) size 769x18 +- RenderText {#text} at (0,0) size 330x18 +- text run at (0,0) width 330: "Font: HelveticaNeue-Bold Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,2691) size 769x18 +- RenderText {#text} at (0,0) size 342x18 +- text run at (0,0) width 342: "Font: HelveticaNeue-Bold Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,2709) size 769x18 +- RenderText {#text} at (0,0) size 355x18 +- text run at (0,0) width 355: "Font: HelveticaNeue-Bold Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,2727) size 769x19 +- RenderText {#text} at (0,0) size 365x19 +- text run at (0,0) width 365: "Font: HelveticaNeue-Bold Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,2746) size 769x19 +- RenderText {#text} at (0,0) size 377x19 +- text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,2765) size 769x19 +- RenderText {#text} at (0,0) size 377x19 +- text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,2784) size 769x19 +- RenderText {#text} at (0,0) size 377x19 +- text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,2803) size 769x19 +- RenderText {#text} at (0,0) size 377x19 +- text run at (0,0) width 377: "Font: HelveticaNeue-Bold Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,2822) size 769x18 +- RenderText {#text} at (0,0) size 372x18 +- text run at (0,0) width 372: "Font: HelveticaNeue-UltraLightItalic Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,2840) size 769x18 +- RenderText {#text} at (0,0) size 372x18 +- text run at (0,0) width 372: "Font: HelveticaNeue-UltraLightItalic Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,2858) size 769x18 +- RenderText {#text} at (0,0) size 372x18 +- text run at (0,0) width 372: "Font: HelveticaNeue-UltraLightItalic Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,2876) size 769x18 +- RenderText {#text} at (0,0) size 372x18 +- text run at (0,0) width 372: "Font: HelveticaNeue-UltraLightItalic Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,2894) size 769x18 +- RenderText {#text} at (0,0) size 372x18 +- text run at (0,0) width 372: "Font: HelveticaNeue-UltraLightItalic Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,2912) size 769x19 +- RenderText {#text} at (0,0) size 455x19 +- text run at (0,0) width 455: "Font: HelveticaNeue-UltraLightItalic Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,2931) size 769x19 +- RenderText {#text} at (0,0) size 455x19 +- text run at (0,0) width 455: "Font: HelveticaNeue-UltraLightItalic Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,2950) size 769x19 +- RenderText {#text} at (0,0) size 455x19 +- text run at (0,0) width 455: "Font: HelveticaNeue-UltraLightItalic Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,2969) size 769x19 +- RenderText {#text} at (0,0) size 455x19 +- text run at (0,0) width 455: "Font: HelveticaNeue-UltraLightItalic Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,2988) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: HelveticaNeue-LightItalic Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,3006) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: HelveticaNeue-LightItalic Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,3024) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: HelveticaNeue-LightItalic Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,3042) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: HelveticaNeue-LightItalic Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,3060) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: HelveticaNeue-LightItalic Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,3078) size 769x19 +- RenderText {#text} at (0,0) size 418x19 +- text run at (0,0) width 418: "Font: HelveticaNeue-LightItalic Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,3097) size 769x19 +- RenderText {#text} at (0,0) size 418x19 +- text run at (0,0) width 418: "Font: HelveticaNeue-LightItalic Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,3116) size 769x19 +- RenderText {#text} at (0,0) size 418x19 +- text run at (0,0) width 418: "Font: HelveticaNeue-LightItalic Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,3135) size 769x19 +- RenderText {#text} at (0,0) size 418x19 +- text run at (0,0) width 418: "Font: HelveticaNeue-LightItalic Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,3154) size 769x18 +- RenderText {#text} at (0,0) size 355x18 +- text run at (0,0) width 355: "Font: HelveticaNeue-Italic Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,3172) size 769x18 +- RenderText {#text} at (0,0) size 355x18 +- text run at (0,0) width 355: "Font: HelveticaNeue-Italic Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,3190) size 769x18 +- RenderText {#text} at (0,0) size 355x18 +- text run at (0,0) width 355: "Font: HelveticaNeue-Italic Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,3208) size 769x18 +- RenderText {#text} at (0,0) size 355x18 +- text run at (0,0) width 355: "Font: HelveticaNeue-Italic Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,3226) size 769x18 +- RenderText {#text} at (0,0) size 355x18 +- text run at (0,0) width 355: "Font: HelveticaNeue-Italic Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,3244) size 769x19 +- RenderText {#text} at (0,0) size 379x19 +- text run at (0,0) width 379: "Font: HelveticaNeue-Italic Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,3263) size 769x19 +- RenderText {#text} at (0,0) size 379x19 +- text run at (0,0) width 379: "Font: HelveticaNeue-Italic Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,3282) size 769x19 +- RenderText {#text} at (0,0) size 379x19 +- text run at (0,0) width 379: "Font: HelveticaNeue-Italic Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,3301) size 769x19 +- RenderText {#text} at (0,0) size 379x19 +- text run at (0,0) width 379: "Font: HelveticaNeue-Italic Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,3320) size 769x19 +- RenderText {#text} at (0,0) size 414x19 +- text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,3339) size 769x19 +- RenderText {#text} at (0,0) size 414x19 +- text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,3358) size 769x19 +- RenderText {#text} at (0,0) size 414x19 +- text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,3377) size 769x19 +- RenderText {#text} at (0,0) size 414x19 +- text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,3396) size 769x19 +- RenderText {#text} at (0,0) size 414x19 +- text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,3415) size 769x19 +- RenderText {#text} at (0,0) size 414x19 +- text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,3434) size 769x19 +- RenderText {#text} at (0,0) size 414x19 +- text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,3453) size 769x19 +- RenderText {#text} at (0,0) size 414x19 +- text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,3472) size 769x19 +- RenderText {#text} at (0,0) size 414x19 +- text run at (0,0) width 414: "Font: HelveticaNeue-BoldItalic Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,3491) size 769x18 +- RenderText {#text} at (0,0) size 254x18 +- text run at (0,0) width 254: "Font: Avenir Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,3509) size 769x18 +- RenderText {#text} at (0,0) size 254x18 +- text run at (0,0) width 254: "Font: Avenir Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,3527) size 769x18 +- RenderText {#text} at (0,0) size 254x18 +- text run at (0,0) width 254: "Font: Avenir Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,3545) size 769x18 +- RenderText {#text} at (0,0) size 254x18 +- text run at (0,0) width 254: "Font: Avenir Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,3563) size 769x18 +- RenderText {#text} at (0,0) size 254x18 +- text run at (0,0) width 254: "Font: Avenir Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,3581) size 769x18 +- RenderText {#text} at (0,0) size 271x18 +- text run at (0,0) width 271: "Font: Avenir Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,3599) size 769x18 +- RenderText {#text} at (0,0) size 271x18 +- text run at (0,0) width 271: "Font: Avenir Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,3617) size 769x18 +- RenderText {#text} at (0,0) size 271x18 +- text run at (0,0) width 271: "Font: Avenir Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,3635) size 769x18 +- RenderText {#text} at (0,0) size 271x18 +- text run at (0,0) width 271: "Font: Avenir Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,3653) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: Avenir-Light Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,3671) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: Avenir-Light Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,3689) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: Avenir-Light Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,3707) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: Avenir-Light Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,3725) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: Avenir-Light Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,3743) size 769x18 +- RenderText {#text} at (0,0) size 313x18 +- text run at (0,0) width 313: "Font: Avenir-Light Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,3761) size 769x18 +- RenderText {#text} at (0,0) size 313x18 +- text run at (0,0) width 313: "Font: Avenir-Light Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,3779) size 769x18 +- RenderText {#text} at (0,0) size 313x18 +- text run at (0,0) width 313: "Font: Avenir-Light Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,3797) size 769x18 +- RenderText {#text} at (0,0) size 313x18 +- text run at (0,0) width 313: "Font: Avenir-Light Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,3815) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: Avenir-Book Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,3833) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: Avenir-Book Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,3851) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: Avenir-Book Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,3869) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: Avenir-Book Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,3887) size 769x18 +- RenderText {#text} at (0,0) size 294x18 +- text run at (0,0) width 294: "Font: Avenir-Book Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,3905) size 769x18 +- RenderText {#text} at (0,0) size 311x18 +- text run at (0,0) width 311: "Font: Avenir-Book Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,3923) size 769x18 +- RenderText {#text} at (0,0) size 311x18 +- text run at (0,0) width 311: "Font: Avenir-Book Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,3941) size 769x18 +- RenderText {#text} at (0,0) size 311x18 +- text run at (0,0) width 311: "Font: Avenir-Book Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,3959) size 769x18 +- RenderText {#text} at (0,0) size 311x18 +- text run at (0,0) width 311: "Font: Avenir-Book Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,3977) size 769x18 +- RenderText {#text} at (0,0) size 314x18 +- text run at (0,0) width 314: "Font: Avenir-Medium Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,3995) size 769x18 +- RenderText {#text} at (0,0) size 314x18 +- text run at (0,0) width 314: "Font: Avenir-Medium Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,4013) size 769x18 +- RenderText {#text} at (0,0) size 314x18 +- text run at (0,0) width 314: "Font: Avenir-Medium Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,4031) size 769x18 +- RenderText {#text} at (0,0) size 314x18 +- text run at (0,0) width 314: "Font: Avenir-Medium Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,4049) size 769x18 +- RenderText {#text} at (0,0) size 314x18 +- text run at (0,0) width 314: "Font: Avenir-Medium Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,4067) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: Avenir-Medium Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,4085) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: Avenir-Medium Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,4103) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: Avenir-Medium Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,4121) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: Avenir-Medium Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,4139) size 769x18 +- RenderText {#text} at (0,0) size 297x18 +- text run at (0,0) width 297: "Font: Avenir-Black Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,4157) size 769x18 +- RenderText {#text} at (0,0) size 297x18 +- text run at (0,0) width 297: "Font: Avenir-Black Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,4175) size 769x18 +- RenderText {#text} at (0,0) size 297x18 +- text run at (0,0) width 297: "Font: Avenir-Black Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,4193) size 769x18 +- RenderText {#text} at (0,0) size 297x18 +- text run at (0,0) width 297: "Font: Avenir-Black Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,4211) size 769x18 +- RenderText {#text} at (0,0) size 297x18 +- text run at (0,0) width 297: "Font: Avenir-Black Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,4229) size 769x18 +- RenderText {#text} at (0,0) size 315x18 +- text run at (0,0) width 315: "Font: Avenir-Black Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,4247) size 769x18 +- RenderText {#text} at (0,0) size 315x18 +- text run at (0,0) width 315: "Font: Avenir-Black Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,4265) size 769x18 +- RenderText {#text} at (0,0) size 315x18 +- text run at (0,0) width 315: "Font: Avenir-Black Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,4283) size 769x18 +- RenderText {#text} at (0,0) size 315x18 +- text run at (0,0) width 315: "Font: Avenir-Black Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,4301) size 769x18 +- RenderText {#text} at (0,0) size 301x18 +- text run at (0,0) width 301: "Font: Avenir-Heavy Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,4319) size 769x18 +- RenderText {#text} at (0,0) size 301x18 +- text run at (0,0) width 301: "Font: Avenir-Heavy Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,4337) size 769x18 +- RenderText {#text} at (0,0) size 301x18 +- text run at (0,0) width 301: "Font: Avenir-Heavy Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,4355) size 769x18 +- RenderText {#text} at (0,0) size 301x18 +- text run at (0,0) width 301: "Font: Avenir-Heavy Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,4373) size 769x18 +- RenderText {#text} at (0,0) size 301x18 +- text run at (0,0) width 301: "Font: Avenir-Heavy Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,4391) size 769x18 +- RenderText {#text} at (0,0) size 319x18 +- text run at (0,0) width 319: "Font: Avenir-Heavy Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,4409) size 769x18 +- RenderText {#text} at (0,0) size 319x18 +- text run at (0,0) width 319: "Font: Avenir-Heavy Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,4427) size 769x18 +- RenderText {#text} at (0,0) size 319x18 +- text run at (0,0) width 319: "Font: Avenir-Heavy Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,4445) size 769x18 +- RenderText {#text} at (0,0) size 319x18 +- text run at (0,0) width 319: "Font: Avenir-Heavy Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,4463) size 769x18 +- RenderText {#text} at (0,0) size 346x18 +- text run at (0,0) width 346: "Font: Avenir-LightOblique Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,4481) size 769x18 +- RenderText {#text} at (0,0) size 346x18 +- text run at (0,0) width 346: "Font: Avenir-LightOblique Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,4499) size 769x18 +- RenderText {#text} at (0,0) size 346x18 +- text run at (0,0) width 346: "Font: Avenir-LightOblique Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,4517) size 769x18 +- RenderText {#text} at (0,0) size 346x18 +- text run at (0,0) width 346: "Font: Avenir-LightOblique Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,4535) size 769x18 +- RenderText {#text} at (0,0) size 346x18 +- text run at (0,0) width 346: "Font: Avenir-LightOblique Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,4553) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: Avenir-LightOblique Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,4571) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: Avenir-LightOblique Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,4589) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: Avenir-LightOblique Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,4607) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: Avenir-LightOblique Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,4625) size 769x18 +- RenderText {#text} at (0,0) size 346x18 +- text run at (0,0) width 346: "Font: Avenir-BookOblique Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,4643) size 769x18 +- RenderText {#text} at (0,0) size 346x18 +- text run at (0,0) width 346: "Font: Avenir-BookOblique Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,4661) size 769x18 +- RenderText {#text} at (0,0) size 346x18 +- text run at (0,0) width 346: "Font: Avenir-BookOblique Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,4679) size 769x18 +- RenderText {#text} at (0,0) size 346x18 +- text run at (0,0) width 346: "Font: Avenir-BookOblique Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,4697) size 769x18 +- RenderText {#text} at (0,0) size 346x18 +- text run at (0,0) width 346: "Font: Avenir-BookOblique Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,4715) size 769x18 +- RenderText {#text} at (0,0) size 366x18 +- text run at (0,0) width 366: "Font: Avenir-BookOblique Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,4733) size 769x18 +- RenderText {#text} at (0,0) size 366x18 +- text run at (0,0) width 366: "Font: Avenir-BookOblique Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,4751) size 769x18 +- RenderText {#text} at (0,0) size 366x18 +- text run at (0,0) width 366: "Font: Avenir-BookOblique Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,4769) size 769x18 +- RenderText {#text} at (0,0) size 366x18 +- text run at (0,0) width 366: "Font: Avenir-BookOblique Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,4787) size 769x18 +- RenderText {#text} at (0,0) size 365x18 +- text run at (0,0) width 365: "Font: Avenir-MediumOblique Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,4805) size 769x18 +- RenderText {#text} at (0,0) size 365x18 +- text run at (0,0) width 365: "Font: Avenir-MediumOblique Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,4823) size 769x18 +- RenderText {#text} at (0,0) size 365x18 +- text run at (0,0) width 365: "Font: Avenir-MediumOblique Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,4841) size 769x18 +- RenderText {#text} at (0,0) size 365x18 +- text run at (0,0) width 365: "Font: Avenir-MediumOblique Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,4859) size 769x18 +- RenderText {#text} at (0,0) size 365x18 +- text run at (0,0) width 365: "Font: Avenir-MediumOblique Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,4877) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: Avenir-MediumOblique Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,4895) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: Avenir-MediumOblique Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,4913) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: Avenir-MediumOblique Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,4931) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: Avenir-MediumOblique Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,4949) size 769x18 +- RenderText {#text} at (0,0) size 348x18 +- text run at (0,0) width 348: "Font: Avenir-BlackOblique Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,4967) size 769x18 +- RenderText {#text} at (0,0) size 348x18 +- text run at (0,0) width 348: "Font: Avenir-BlackOblique Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,4985) size 769x18 +- RenderText {#text} at (0,0) size 348x18 +- text run at (0,0) width 348: "Font: Avenir-BlackOblique Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,5003) size 769x18 +- RenderText {#text} at (0,0) size 348x18 +- text run at (0,0) width 348: "Font: Avenir-BlackOblique Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,5021) size 769x18 +- RenderText {#text} at (0,0) size 348x18 +- text run at (0,0) width 348: "Font: Avenir-BlackOblique Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,5039) size 769x18 +- RenderText {#text} at (0,0) size 370x18 +- text run at (0,0) width 370: "Font: Avenir-BlackOblique Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,5057) size 769x18 +- RenderText {#text} at (0,0) size 370x18 +- text run at (0,0) width 370: "Font: Avenir-BlackOblique Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,5075) size 769x18 +- RenderText {#text} at (0,0) size 370x18 +- text run at (0,0) width 370: "Font: Avenir-BlackOblique Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,5093) size 769x18 +- RenderText {#text} at (0,0) size 370x18 +- text run at (0,0) width 370: "Font: Avenir-BlackOblique Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,5111) size 769x18 +- RenderText {#text} at (0,0) size 240x18 +- text run at (0,0) width 240: "Font: Avenir Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,5129) size 769x18 +- RenderText {#text} at (0,0) size 240x18 +- text run at (0,0) width 240: "Font: Avenir Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,5147) size 769x18 +- RenderText {#text} at (0,0) size 240x18 +- text run at (0,0) width 240: "Font: Avenir Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,5165) size 769x18 +- RenderText {#text} at (0,0) size 240x18 +- text run at (0,0) width 240: "Font: Avenir Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,5183) size 769x18 +- RenderText {#text} at (0,0) size 240x18 +- text run at (0,0) width 240: "Font: Avenir Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,5201) size 769x18 +- RenderText {#text} at (0,0) size 278x18 +- text run at (0,0) width 278: "Font: Avenir Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,5219) size 769x18 +- RenderText {#text} at (0,0) size 278x18 +- text run at (0,0) width 278: "Font: Avenir Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,5237) size 769x18 +- RenderText {#text} at (0,0) size 278x18 +- text run at (0,0) width 278: "Font: Avenir Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,5255) size 769x18 +- RenderText {#text} at (0,0) size 278x18 +- text run at (0,0) width 278: "Font: Avenir Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,5273) size 769x18 +- RenderText {#text} at (0,0) size 279x18 +- text run at (0,0) width 279: "Font: Avenir-Light Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,5291) size 769x18 +- RenderText {#text} at (0,0) size 279x18 +- text run at (0,0) width 279: "Font: Avenir-Light Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,5309) size 769x18 +- RenderText {#text} at (0,0) size 279x18 +- text run at (0,0) width 279: "Font: Avenir-Light Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,5327) size 769x18 +- RenderText {#text} at (0,0) size 279x18 +- text run at (0,0) width 279: "Font: Avenir-Light Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,5345) size 769x18 +- RenderText {#text} at (0,0) size 279x18 +- text run at (0,0) width 279: "Font: Avenir-Light Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,5363) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: Avenir-Light Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,5381) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: Avenir-Light Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,5399) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: Avenir-Light Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,5417) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: Avenir-Light Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,5435) size 769x18 +- RenderText {#text} at (0,0) size 278x18 +- text run at (0,0) width 278: "Font: Avenir-Book Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,5453) size 769x18 +- RenderText {#text} at (0,0) size 278x18 +- text run at (0,0) width 278: "Font: Avenir-Book Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,5471) size 769x18 +- RenderText {#text} at (0,0) size 278x18 +- text run at (0,0) width 278: "Font: Avenir-Book Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,5489) size 769x18 +- RenderText {#text} at (0,0) size 278x18 +- text run at (0,0) width 278: "Font: Avenir-Book Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,5507) size 769x18 +- RenderText {#text} at (0,0) size 278x18 +- text run at (0,0) width 278: "Font: Avenir-Book Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,5525) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: Avenir-Book Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,5543) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: Avenir-Book Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,5561) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: Avenir-Book Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,5579) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: Avenir-Book Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,5597) size 769x18 +- RenderText {#text} at (0,0) size 298x18 +- text run at (0,0) width 298: "Font: Avenir-Medium Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,5615) size 769x18 +- RenderText {#text} at (0,0) size 298x18 +- text run at (0,0) width 298: "Font: Avenir-Medium Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,5633) size 769x18 +- RenderText {#text} at (0,0) size 298x18 +- text run at (0,0) width 298: "Font: Avenir-Medium Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,5651) size 769x18 +- RenderText {#text} at (0,0) size 298x18 +- text run at (0,0) width 298: "Font: Avenir-Medium Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,5669) size 769x18 +- RenderText {#text} at (0,0) size 298x18 +- text run at (0,0) width 298: "Font: Avenir-Medium Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,5687) size 769x18 +- RenderText {#text} at (0,0) size 343x18 +- text run at (0,0) width 343: "Font: Avenir-Medium Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,5705) size 769x18 +- RenderText {#text} at (0,0) size 343x18 +- text run at (0,0) width 343: "Font: Avenir-Medium Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,5723) size 769x18 +- RenderText {#text} at (0,0) size 343x18 +- text run at (0,0) width 343: "Font: Avenir-Medium Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,5741) size 769x18 +- RenderText {#text} at (0,0) size 343x18 +- text run at (0,0) width 343: "Font: Avenir-Medium Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,5759) size 769x18 +- RenderText {#text} at (0,0) size 282x18 +- text run at (0,0) width 282: "Font: Avenir-Black Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,5777) size 769x18 +- RenderText {#text} at (0,0) size 282x18 +- text run at (0,0) width 282: "Font: Avenir-Black Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,5795) size 769x18 +- RenderText {#text} at (0,0) size 282x18 +- text run at (0,0) width 282: "Font: Avenir-Black Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,5813) size 769x18 +- RenderText {#text} at (0,0) size 282x18 +- text run at (0,0) width 282: "Font: Avenir-Black Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,5831) size 769x18 +- RenderText {#text} at (0,0) size 282x18 +- text run at (0,0) width 282: "Font: Avenir-Black Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,5849) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: Avenir-Black Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,5867) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: Avenir-Black Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,5885) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: Avenir-Black Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,5903) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: Avenir-Black Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,5921) size 769x18 +- RenderText {#text} at (0,0) size 286x18 +- text run at (0,0) width 286: "Font: Avenir-Heavy Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,5939) size 769x18 +- RenderText {#text} at (0,0) size 286x18 +- text run at (0,0) width 286: "Font: Avenir-Heavy Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,5957) size 769x18 +- RenderText {#text} at (0,0) size 286x18 +- text run at (0,0) width 286: "Font: Avenir-Heavy Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,5975) size 769x18 +- RenderText {#text} at (0,0) size 286x18 +- text run at (0,0) width 286: "Font: Avenir-Heavy Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,5993) size 769x18 +- RenderText {#text} at (0,0) size 286x18 +- text run at (0,0) width 286: "Font: Avenir-Heavy Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,6011) size 769x18 +- RenderText {#text} at (0,0) size 330x18 +- text run at (0,0) width 330: "Font: Avenir-Heavy Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,6029) size 769x18 +- RenderText {#text} at (0,0) size 330x18 +- text run at (0,0) width 330: "Font: Avenir-Heavy Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,6047) size 769x18 +- RenderText {#text} at (0,0) size 330x18 +- text run at (0,0) width 330: "Font: Avenir-Heavy Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,6065) size 769x18 +- RenderText {#text} at (0,0) size 330x18 +- text run at (0,0) width 330: "Font: Avenir-Heavy Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,6083) size 769x18 +- RenderText {#text} at (0,0) size 331x18 +- text run at (0,0) width 331: "Font: Avenir-LightOblique Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,6101) size 769x18 +- RenderText {#text} at (0,0) size 331x18 +- text run at (0,0) width 331: "Font: Avenir-LightOblique Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,6119) size 769x18 +- RenderText {#text} at (0,0) size 331x18 +- text run at (0,0) width 331: "Font: Avenir-LightOblique Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,6137) size 769x18 +- RenderText {#text} at (0,0) size 331x18 +- text run at (0,0) width 331: "Font: Avenir-LightOblique Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,6155) size 769x18 +- RenderText {#text} at (0,0) size 331x18 +- text run at (0,0) width 331: "Font: Avenir-LightOblique Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,6173) size 769x18 +- RenderText {#text} at (0,0) size 382x18 +- text run at (0,0) width 382: "Font: Avenir-LightOblique Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,6191) size 769x18 +- RenderText {#text} at (0,0) size 382x18 +- text run at (0,0) width 382: "Font: Avenir-LightOblique Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,6209) size 769x18 +- RenderText {#text} at (0,0) size 382x18 +- text run at (0,0) width 382: "Font: Avenir-LightOblique Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,6227) size 769x18 +- RenderText {#text} at (0,0) size 382x18 +- text run at (0,0) width 382: "Font: Avenir-LightOblique Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,6245) size 769x18 +- RenderText {#text} at (0,0) size 330x18 +- text run at (0,0) width 330: "Font: Avenir-BookOblique Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,6263) size 769x18 +- RenderText {#text} at (0,0) size 330x18 +- text run at (0,0) width 330: "Font: Avenir-BookOblique Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,6281) size 769x18 +- RenderText {#text} at (0,0) size 330x18 +- text run at (0,0) width 330: "Font: Avenir-BookOblique Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,6299) size 769x18 +- RenderText {#text} at (0,0) size 330x18 +- text run at (0,0) width 330: "Font: Avenir-BookOblique Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,6317) size 769x18 +- RenderText {#text} at (0,0) size 330x18 +- text run at (0,0) width 330: "Font: Avenir-BookOblique Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,6335) size 769x18 +- RenderText {#text} at (0,0) size 380x18 +- text run at (0,0) width 380: "Font: Avenir-BookOblique Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,6353) size 769x18 +- RenderText {#text} at (0,0) size 380x18 +- text run at (0,0) width 380: "Font: Avenir-BookOblique Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,6371) size 769x18 +- RenderText {#text} at (0,0) size 380x18 +- text run at (0,0) width 380: "Font: Avenir-BookOblique Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,6389) size 769x18 +- RenderText {#text} at (0,0) size 380x18 +- text run at (0,0) width 380: "Font: Avenir-BookOblique Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,6407) size 769x18 +- RenderText {#text} at (0,0) size 349x18 +- text run at (0,0) width 349: "Font: Avenir-MediumOblique Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,6425) size 769x18 +- RenderText {#text} at (0,0) size 349x18 +- text run at (0,0) width 349: "Font: Avenir-MediumOblique Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,6443) size 769x18 +- RenderText {#text} at (0,0) size 349x18 +- text run at (0,0) width 349: "Font: Avenir-MediumOblique Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,6461) size 769x18 +- RenderText {#text} at (0,0) size 349x18 +- text run at (0,0) width 349: "Font: Avenir-MediumOblique Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,6479) size 769x18 +- RenderText {#text} at (0,0) size 349x18 +- text run at (0,0) width 349: "Font: Avenir-MediumOblique Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,6497) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: Avenir-MediumOblique Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,6515) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: Avenir-MediumOblique Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,6533) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: Avenir-MediumOblique Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,6551) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: Avenir-MediumOblique Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,6569) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: Avenir-BlackOblique Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,6587) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: Avenir-BlackOblique Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,6605) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: Avenir-BlackOblique Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,6623) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: Avenir-BlackOblique Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,6641) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: Avenir-BlackOblique Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,6659) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: Avenir-BlackOblique Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,6677) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: Avenir-BlackOblique Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,6695) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: Avenir-BlackOblique Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,6713) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: Avenir-BlackOblique Weight: 900 Style: italic" +diff --git a/LayoutTests/platform/mac-mojave/fast/text/font-weights-zh-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/font-weights-zh-expected.txt +deleted file mode 100644 +index 0f899851c18013a6d8af4d30cf90f8f6c11ffd70..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/font-weights-zh-expected.txt ++++ /dev/null +@@ -1,2285 +0,0 @@ +-layer at (0,0) size 785x15064 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x15064 +- RenderBlock {HTML} at (0,0) size 785x15064 +- RenderBody {BODY} at (8,8) size 769x15048 +- RenderBlock (anonymous) at (0,0) size 769x144 +- RenderText {#text} at (0,0) size 769x72 +- text run at (0,0) width 746: "This test is designed to test the interaction between font-family and font-weight. In particular, our implementation of" +- text run at (0,18) width 759: "font-family accepts PostScript names, which may name a font with a particular weight. However, there is another CSS" +- text run at (0,36) width 769: "property, font-weight, in which the author may also name a particular weight. Our font selection algorithm takes both of" +- text run at (0,54) width 305: "these signals into account when choosing fonts." +- RenderBR {BR} at (304,54) size 1x18 +- RenderBR {BR} at (0,72) size 0x18 +- RenderText {#text} at (0,90) size 767x54 +- text run at (0,90) width 767: "There is currently no good way in JavaScript to find the actual font chosen for some text. Therefore, the best way to test" +- text run at (0,108) width 732: "this aspect of the font selection algorithm is to dump the render tree, therefore testing glyph advances (which are a" +- text run at (0,126) width 159: "property of font weight)." +- RenderBlock {DIV} at (0,144) size 769x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Font: Heiti SC Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,162) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,178) size 769x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Font: Heiti SC Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,196) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,212) size 769x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Font: Heiti SC Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,230) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,246) size 769x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Font: Heiti SC Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,264) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,280) size 769x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Font: Heiti SC Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,298) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,314) size 769x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Font: Heiti SC Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,332) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,348) size 769x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Font: Heiti SC Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,366) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,382) size 769x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Font: Heiti SC Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,400) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,416) size 769x18 +- RenderText {#text} at (0,0) size 267x18 +- text run at (0,0) width 267: "Font: Heiti SC Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,434) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,450) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: STHeitiSC-Light Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,468) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,484) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: STHeitiSC-Light Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,502) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,518) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: STHeitiSC-Light Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,536) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,552) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: STHeitiSC-Light Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,570) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,586) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: STHeitiSC-Light Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,604) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,620) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: STHeitiSC-Light Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,638) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,654) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: STHeitiSC-Light Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,672) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,688) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: STHeitiSC-Light Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,706) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,722) size 769x18 +- RenderText {#text} at (0,0) size 321x18 +- text run at (0,0) width 321: "Font: STHeitiSC-Light Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,740) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,756) size 769x18 +- RenderText {#text} at (0,0) size 341x18 +- text run at (0,0) width 341: "Font: STHeitiSC-Medium Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,774) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,790) size 769x18 +- RenderText {#text} at (0,0) size 341x18 +- text run at (0,0) width 341: "Font: STHeitiSC-Medium Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,808) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,824) size 769x18 +- RenderText {#text} at (0,0) size 341x18 +- text run at (0,0) width 341: "Font: STHeitiSC-Medium Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,842) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,858) size 769x18 +- RenderText {#text} at (0,0) size 341x18 +- text run at (0,0) width 341: "Font: STHeitiSC-Medium Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,876) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,892) size 769x18 +- RenderText {#text} at (0,0) size 341x18 +- text run at (0,0) width 341: "Font: STHeitiSC-Medium Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,910) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,926) size 769x18 +- RenderText {#text} at (0,0) size 341x18 +- text run at (0,0) width 341: "Font: STHeitiSC-Medium Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,944) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,960) size 769x18 +- RenderText {#text} at (0,0) size 341x18 +- text run at (0,0) width 341: "Font: STHeitiSC-Medium Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,978) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,994) size 769x18 +- RenderText {#text} at (0,0) size 341x18 +- text run at (0,0) width 341: "Font: STHeitiSC-Medium Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,1012) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1028) size 769x18 +- RenderText {#text} at (0,0) size 341x18 +- text run at (0,0) width 341: "Font: STHeitiSC-Medium Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,1046) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1062) size 769x18 +- RenderText {#text} at (0,0) size 253x18 +- text run at (0,0) width 253: "Font: Heiti SC Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,1080) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1096) size 769x18 +- RenderText {#text} at (0,0) size 253x18 +- text run at (0,0) width 253: "Font: Heiti SC Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,1114) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1130) size 769x18 +- RenderText {#text} at (0,0) size 253x18 +- text run at (0,0) width 253: "Font: Heiti SC Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,1148) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1164) size 769x18 +- RenderText {#text} at (0,0) size 253x18 +- text run at (0,0) width 253: "Font: Heiti SC Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,1182) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1198) size 769x18 +- RenderText {#text} at (0,0) size 253x18 +- text run at (0,0) width 253: "Font: Heiti SC Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,1216) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1232) size 769x18 +- RenderText {#text} at (0,0) size 253x18 +- text run at (0,0) width 253: "Font: Heiti SC Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,1250) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1266) size 769x18 +- RenderText {#text} at (0,0) size 253x18 +- text run at (0,0) width 253: "Font: Heiti SC Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,1284) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1300) size 769x18 +- RenderText {#text} at (0,0) size 253x18 +- text run at (0,0) width 253: "Font: Heiti SC Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,1318) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1334) size 769x18 +- RenderText {#text} at (0,0) size 253x18 +- text run at (0,0) width 253: "Font: Heiti SC Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,1352) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1368) size 769x18 +- RenderText {#text} at (0,0) size 308x18 +- text run at (0,0) width 308: "Font: STHeitiSC-Light Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,1386) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1402) size 769x18 +- RenderText {#text} at (0,0) size 308x18 +- text run at (0,0) width 308: "Font: STHeitiSC-Light Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,1420) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1436) size 769x18 +- RenderText {#text} at (0,0) size 308x18 +- text run at (0,0) width 308: "Font: STHeitiSC-Light Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,1454) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1470) size 769x18 +- RenderText {#text} at (0,0) size 308x18 +- text run at (0,0) width 308: "Font: STHeitiSC-Light Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,1488) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1504) size 769x18 +- RenderText {#text} at (0,0) size 308x18 +- text run at (0,0) width 308: "Font: STHeitiSC-Light Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,1522) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1538) size 769x18 +- RenderText {#text} at (0,0) size 308x18 +- text run at (0,0) width 308: "Font: STHeitiSC-Light Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,1556) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1572) size 769x18 +- RenderText {#text} at (0,0) size 308x18 +- text run at (0,0) width 308: "Font: STHeitiSC-Light Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,1590) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1606) size 769x18 +- RenderText {#text} at (0,0) size 308x18 +- text run at (0,0) width 308: "Font: STHeitiSC-Light Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,1624) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1640) size 769x18 +- RenderText {#text} at (0,0) size 308x18 +- text run at (0,0) width 308: "Font: STHeitiSC-Light Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,1658) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1674) size 769x18 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "Font: STHeitiSC-Medium Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,1692) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1708) size 769x18 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "Font: STHeitiSC-Medium Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,1726) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1742) size 769x18 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "Font: STHeitiSC-Medium Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,1760) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1776) size 769x18 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "Font: STHeitiSC-Medium Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,1794) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1810) size 769x18 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "Font: STHeitiSC-Medium Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,1828) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1844) size 769x18 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "Font: STHeitiSC-Medium Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,1862) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1878) size 769x18 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "Font: STHeitiSC-Medium Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,1896) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1912) size 769x18 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "Font: STHeitiSC-Medium Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,1930) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1946) size 769x18 +- RenderText {#text} at (0,0) size 328x18 +- text run at (0,0) width 328: "Font: STHeitiSC-Medium Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,1964) size 769x16 +- RenderText {#text} at (0,0) size 144x16 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,1980) size 769x18 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "Font: Songti SC Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,1998) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2020) size 769x18 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "Font: Songti SC Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,2038) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2060) size 769x18 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "Font: Songti SC Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,2078) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2100) size 769x18 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "Font: Songti SC Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,2118) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2140) size 769x18 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "Font: Songti SC Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,2158) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2180) size 769x18 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "Font: Songti SC Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,2198) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2220) size 769x18 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "Font: Songti SC Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,2238) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2260) size 769x18 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "Font: Songti SC Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,2278) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2300) size 769x18 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "Font: Songti SC Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,2318) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2340) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: STSongti-SC-Regular Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,2358) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2380) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: STSongti-SC-Regular Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,2398) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2420) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: STSongti-SC-Regular Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,2438) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2460) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: STSongti-SC-Regular Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,2478) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2500) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: STSongti-SC-Regular Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,2518) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2540) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: STSongti-SC-Regular Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,2558) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2580) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: STSongti-SC-Regular Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,2598) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2620) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: STSongti-SC-Regular Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,2638) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2660) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: STSongti-SC-Regular Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,2678) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2700) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: STSongti-SC-Light Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,2718) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2740) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: STSongti-SC-Light Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,2758) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2780) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: STSongti-SC-Light Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,2798) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2820) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: STSongti-SC-Light Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,2838) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2860) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: STSongti-SC-Light Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,2878) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2900) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: STSongti-SC-Light Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,2918) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2940) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: STSongti-SC-Light Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,2958) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,2980) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: STSongti-SC-Light Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,2998) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3020) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: STSongti-SC-Light Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,3038) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3060) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: STSongti-SC-Bold Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,3078) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3100) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: STSongti-SC-Bold Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,3118) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3140) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: STSongti-SC-Bold Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,3158) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3180) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: STSongti-SC-Bold Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,3198) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3220) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: STSongti-SC-Bold Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,3238) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3260) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: STSongti-SC-Bold Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,3278) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3300) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: STSongti-SC-Bold Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,3318) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3340) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: STSongti-SC-Bold Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,3358) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3380) size 769x18 +- RenderText {#text} at (0,0) size 333x18 +- text run at (0,0) width 333: "Font: STSongti-SC-Bold Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,3398) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3420) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Black Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,3438) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3460) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Black Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,3478) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3500) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Black Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,3518) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3540) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Black Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,3558) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3580) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Black Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,3598) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3620) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Black Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,3638) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3660) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Black Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,3678) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3700) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Black Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,3718) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3740) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Black Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,3758) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3780) size 769x18 +- RenderText {#text} at (0,0) size 263x18 +- text run at (0,0) width 263: "Font: Songti SC Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,3798) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3820) size 769x18 +- RenderText {#text} at (0,0) size 263x18 +- text run at (0,0) width 263: "Font: Songti SC Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,3838) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3860) size 769x18 +- RenderText {#text} at (0,0) size 263x18 +- text run at (0,0) width 263: "Font: Songti SC Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,3878) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3900) size 769x18 +- RenderText {#text} at (0,0) size 263x18 +- text run at (0,0) width 263: "Font: Songti SC Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,3918) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3940) size 769x18 +- RenderText {#text} at (0,0) size 263x18 +- text run at (0,0) width 263: "Font: Songti SC Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,3958) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,3980) size 769x18 +- RenderText {#text} at (0,0) size 263x18 +- text run at (0,0) width 263: "Font: Songti SC Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,3998) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4020) size 769x18 +- RenderText {#text} at (0,0) size 263x18 +- text run at (0,0) width 263: "Font: Songti SC Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,4038) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4060) size 769x18 +- RenderText {#text} at (0,0) size 263x18 +- text run at (0,0) width 263: "Font: Songti SC Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,4078) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4100) size 769x18 +- RenderText {#text} at (0,0) size 263x18 +- text run at (0,0) width 263: "Font: Songti SC Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,4118) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4140) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Regular Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,4158) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4180) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Regular Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,4198) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4220) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Regular Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,4238) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4260) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Regular Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,4278) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4300) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Regular Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,4318) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4340) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Regular Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,4358) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4380) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Regular Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,4398) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4420) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Regular Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,4438) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4460) size 769x18 +- RenderText {#text} at (0,0) size 339x18 +- text run at (0,0) width 339: "Font: STSongti-SC-Regular Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,4478) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4500) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: STSongti-SC-Light Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,4518) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4540) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: STSongti-SC-Light Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,4558) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4580) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: STSongti-SC-Light Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,4598) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4620) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: STSongti-SC-Light Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,4638) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4660) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: STSongti-SC-Light Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,4678) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4700) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: STSongti-SC-Light Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,4718) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4740) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: STSongti-SC-Light Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,4758) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4780) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: STSongti-SC-Light Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,4798) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4820) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: STSongti-SC-Light Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,4838) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4860) size 769x18 +- RenderText {#text} at (0,0) size 320x18 +- text run at (0,0) width 320: "Font: STSongti-SC-Bold Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,4878) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4900) size 769x18 +- RenderText {#text} at (0,0) size 320x18 +- text run at (0,0) width 320: "Font: STSongti-SC-Bold Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,4918) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4940) size 769x18 +- RenderText {#text} at (0,0) size 320x18 +- text run at (0,0) width 320: "Font: STSongti-SC-Bold Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,4958) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,4980) size 769x18 +- RenderText {#text} at (0,0) size 320x18 +- text run at (0,0) width 320: "Font: STSongti-SC-Bold Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,4998) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5020) size 769x18 +- RenderText {#text} at (0,0) size 320x18 +- text run at (0,0) width 320: "Font: STSongti-SC-Bold Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,5038) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5060) size 769x18 +- RenderText {#text} at (0,0) size 320x18 +- text run at (0,0) width 320: "Font: STSongti-SC-Bold Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,5078) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5100) size 769x18 +- RenderText {#text} at (0,0) size 320x18 +- text run at (0,0) width 320: "Font: STSongti-SC-Bold Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,5118) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5140) size 769x18 +- RenderText {#text} at (0,0) size 320x18 +- text run at (0,0) width 320: "Font: STSongti-SC-Bold Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,5158) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5180) size 769x18 +- RenderText {#text} at (0,0) size 320x18 +- text run at (0,0) width 320: "Font: STSongti-SC-Bold Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,5198) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5220) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: STSongti-SC-Black Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,5238) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5260) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: STSongti-SC-Black Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,5278) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5300) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: STSongti-SC-Black Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,5318) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5340) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: STSongti-SC-Black Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,5358) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5380) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: STSongti-SC-Black Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,5398) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5420) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: STSongti-SC-Black Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,5438) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5460) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: STSongti-SC-Black Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,5478) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5500) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: STSongti-SC-Black Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,5518) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5540) size 769x18 +- RenderText {#text} at (0,0) size 326x18 +- text run at (0,0) width 326: "Font: STSongti-SC-Black Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,5558) size 769x22 +- RenderText {#text} at (0,0) size 144x22 +- text run at (0,0) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5580) size 769x18 +- RenderText {#text} at (0,0) size 392x18 +- text run at (0,0) width 392: "Font: Hiragino Kaku Gothic ProN Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,5598) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5622) size 769x18 +- RenderText {#text} at (0,0) size 392x18 +- text run at (0,0) width 392: "Font: Hiragino Kaku Gothic ProN Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,5640) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5664) size 769x18 +- RenderText {#text} at (0,0) size 392x18 +- text run at (0,0) width 392: "Font: Hiragino Kaku Gothic ProN Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,5682) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5706) size 769x18 +- RenderText {#text} at (0,0) size 392x18 +- text run at (0,0) width 392: "Font: Hiragino Kaku Gothic ProN Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,5724) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5748) size 769x18 +- RenderText {#text} at (0,0) size 392x18 +- text run at (0,0) width 392: "Font: Hiragino Kaku Gothic ProN Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,5766) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5790) size 769x18 +- RenderText {#text} at (0,0) size 392x18 +- text run at (0,0) width 392: "Font: Hiragino Kaku Gothic ProN Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,5808) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5832) size 769x18 +- RenderText {#text} at (0,0) size 392x18 +- text run at (0,0) width 392: "Font: Hiragino Kaku Gothic ProN Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,5850) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5874) size 769x18 +- RenderText {#text} at (0,0) size 392x18 +- text run at (0,0) width 392: "Font: Hiragino Kaku Gothic ProN Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,5892) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5916) size 769x18 +- RenderText {#text} at (0,0) size 392x18 +- text run at (0,0) width 392: "Font: Hiragino Kaku Gothic ProN Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,5934) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,5958) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W3 Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,5976) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6000) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W3 Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,6018) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6042) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W3 Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,6060) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6084) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W3 Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,6102) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6126) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W3 Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,6144) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6168) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W3 Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,6186) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6210) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W3 Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,6228) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6252) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W3 Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,6270) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6294) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W3 Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,6312) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6336) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W6 Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,6354) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6378) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W6 Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,6396) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6420) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W6 Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,6438) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6462) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W6 Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,6480) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6504) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W6 Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,6522) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6546) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W6 Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,6564) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6588) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W6 Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,6606) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6630) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W6 Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,6648) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6672) size 769x18 +- RenderText {#text} at (0,0) size 337x18 +- text run at (0,0) width 337: "Font: HiraKakuProN-W6 Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,6690) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6714) size 769x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 379: "Font: Hiragino Kaku Gothic ProN Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,6732) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6756) size 769x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 379: "Font: Hiragino Kaku Gothic ProN Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,6774) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6798) size 769x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 379: "Font: Hiragino Kaku Gothic ProN Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,6816) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6840) size 769x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 379: "Font: Hiragino Kaku Gothic ProN Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,6858) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6882) size 769x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 379: "Font: Hiragino Kaku Gothic ProN Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,6900) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6924) size 769x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 379: "Font: Hiragino Kaku Gothic ProN Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,6942) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,6966) size 769x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 379: "Font: Hiragino Kaku Gothic ProN Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,6984) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7008) size 769x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 379: "Font: Hiragino Kaku Gothic ProN Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,7026) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7050) size 769x18 +- RenderText {#text} at (0,0) size 379x18 +- text run at (0,0) width 379: "Font: Hiragino Kaku Gothic ProN Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,7068) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7092) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W3 Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,7110) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7134) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W3 Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,7152) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7176) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W3 Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,7194) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7218) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W3 Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,7236) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7260) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W3 Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,7278) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7302) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W3 Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,7320) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7344) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W3 Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,7362) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7386) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W3 Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,7404) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7428) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W3 Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,7446) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7470) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W6 Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,7488) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7512) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W6 Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,7530) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7554) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W6 Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,7572) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7596) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W6 Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,7614) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7638) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W6 Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,7656) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7680) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W6 Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,7698) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7722) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W6 Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,7740) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7764) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W6 Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,7782) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7806) size 769x18 +- RenderText {#text} at (0,0) size 323x18 +- text run at (0,0) width 323: "Font: HiraKakuProN-W6 Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,7824) size 769x24 +- RenderText {#text} at (0,3) size 144x17 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7848) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: Apple SD Gothic Neo Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,7866) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7888) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: Apple SD Gothic Neo Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,7906) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7928) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: Apple SD Gothic Neo Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,7946) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,7968) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: Apple SD Gothic Neo Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,7986) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8008) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: Apple SD Gothic Neo Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,8026) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8048) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: Apple SD Gothic Neo Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,8066) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8088) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: Apple SD Gothic Neo Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,8106) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8128) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: Apple SD Gothic Neo Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,8146) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8168) size 769x18 +- RenderText {#text} at (0,0) size 353x18 +- text run at (0,0) width 353: "Font: Apple SD Gothic Neo Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,8186) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8208) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-Regular Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,8226) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8248) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-Regular Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,8266) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8288) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-Regular Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,8306) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8328) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-Regular Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,8346) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8368) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-Regular Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,8386) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8408) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-Regular Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,8426) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8448) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-Regular Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,8466) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8488) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-Regular Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,8506) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8528) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-Regular Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,8546) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8568) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: AppleSDGothicNeo-Medium Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,8586) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8608) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: AppleSDGothicNeo-Medium Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,8626) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8648) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: AppleSDGothicNeo-Medium Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,8666) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8688) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: AppleSDGothicNeo-Medium Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,8706) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8728) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: AppleSDGothicNeo-Medium Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,8746) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8768) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: AppleSDGothicNeo-Medium Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,8786) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8808) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: AppleSDGothicNeo-Medium Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,8826) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8848) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: AppleSDGothicNeo-Medium Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,8866) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8888) size 769x18 +- RenderText {#text} at (0,0) size 401x18 +- text run at (0,0) width 401: "Font: AppleSDGothicNeo-Medium Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,8906) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8928) size 769x18 +- RenderText {#text} at (0,0) size 381x18 +- text run at (0,0) width 381: "Font: AppleSDGothicNeo-Light Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,8946) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,8968) size 769x18 +- RenderText {#text} at (0,0) size 381x18 +- text run at (0,0) width 381: "Font: AppleSDGothicNeo-Light Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,8986) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9008) size 769x18 +- RenderText {#text} at (0,0) size 381x18 +- text run at (0,0) width 381: "Font: AppleSDGothicNeo-Light Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,9026) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9048) size 769x18 +- RenderText {#text} at (0,0) size 381x18 +- text run at (0,0) width 381: "Font: AppleSDGothicNeo-Light Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,9066) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9088) size 769x18 +- RenderText {#text} at (0,0) size 381x18 +- text run at (0,0) width 381: "Font: AppleSDGothicNeo-Light Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,9106) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9128) size 769x18 +- RenderText {#text} at (0,0) size 381x18 +- text run at (0,0) width 381: "Font: AppleSDGothicNeo-Light Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,9146) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9168) size 769x18 +- RenderText {#text} at (0,0) size 381x18 +- text run at (0,0) width 381: "Font: AppleSDGothicNeo-Light Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,9186) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9208) size 769x18 +- RenderText {#text} at (0,0) size 381x18 +- text run at (0,0) width 381: "Font: AppleSDGothicNeo-Light Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,9226) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9248) size 769x18 +- RenderText {#text} at (0,0) size 381x18 +- text run at (0,0) width 381: "Font: AppleSDGothicNeo-Light Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,9266) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9288) size 769x18 +- RenderText {#text} at (0,0) size 414x18 +- text run at (0,0) width 414: "Font: AppleSDGothicNeo-UltraLight Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,9306) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9328) size 769x18 +- RenderText {#text} at (0,0) size 414x18 +- text run at (0,0) width 414: "Font: AppleSDGothicNeo-UltraLight Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,9346) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9368) size 769x18 +- RenderText {#text} at (0,0) size 414x18 +- text run at (0,0) width 414: "Font: AppleSDGothicNeo-UltraLight Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,9386) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9408) size 769x18 +- RenderText {#text} at (0,0) size 414x18 +- text run at (0,0) width 414: "Font: AppleSDGothicNeo-UltraLight Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,9426) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9448) size 769x18 +- RenderText {#text} at (0,0) size 414x18 +- text run at (0,0) width 414: "Font: AppleSDGothicNeo-UltraLight Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,9466) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9488) size 769x18 +- RenderText {#text} at (0,0) size 414x18 +- text run at (0,0) width 414: "Font: AppleSDGothicNeo-UltraLight Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,9506) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9528) size 769x18 +- RenderText {#text} at (0,0) size 414x18 +- text run at (0,0) width 414: "Font: AppleSDGothicNeo-UltraLight Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,9546) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9568) size 769x18 +- RenderText {#text} at (0,0) size 414x18 +- text run at (0,0) width 414: "Font: AppleSDGothicNeo-UltraLight Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,9586) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9608) size 769x18 +- RenderText {#text} at (0,0) size 414x18 +- text run at (0,0) width 414: "Font: AppleSDGothicNeo-UltraLight Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,9626) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9648) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Thin Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,9666) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9688) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Thin Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,9706) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9728) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Thin Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,9746) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9768) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Thin Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,9786) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9808) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Thin Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,9826) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9848) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Thin Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,9866) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9888) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Thin Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,9906) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9928) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Thin Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,9946) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,9968) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Thin Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,9986) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10008) size 769x18 +- RenderText {#text} at (0,0) size 410x18 +- text run at (0,0) width 410: "Font: AppleSDGothicNeo-SemiBold Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,10026) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10048) size 769x18 +- RenderText {#text} at (0,0) size 410x18 +- text run at (0,0) width 410: "Font: AppleSDGothicNeo-SemiBold Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,10066) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10088) size 769x18 +- RenderText {#text} at (0,0) size 410x18 +- text run at (0,0) width 410: "Font: AppleSDGothicNeo-SemiBold Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,10106) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10128) size 769x18 +- RenderText {#text} at (0,0) size 410x18 +- text run at (0,0) width 410: "Font: AppleSDGothicNeo-SemiBold Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,10146) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10168) size 769x18 +- RenderText {#text} at (0,0) size 410x18 +- text run at (0,0) width 410: "Font: AppleSDGothicNeo-SemiBold Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,10186) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10208) size 769x18 +- RenderText {#text} at (0,0) size 410x18 +- text run at (0,0) width 410: "Font: AppleSDGothicNeo-SemiBold Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,10226) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10248) size 769x18 +- RenderText {#text} at (0,0) size 410x18 +- text run at (0,0) width 410: "Font: AppleSDGothicNeo-SemiBold Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,10266) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10288) size 769x18 +- RenderText {#text} at (0,0) size 410x18 +- text run at (0,0) width 410: "Font: AppleSDGothicNeo-SemiBold Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,10306) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10328) size 769x18 +- RenderText {#text} at (0,0) size 410x18 +- text run at (0,0) width 410: "Font: AppleSDGothicNeo-SemiBold Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,10346) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10368) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Bold Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,10386) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10408) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Bold Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,10426) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10448) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Bold Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,10466) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10488) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Bold Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,10506) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10528) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Bold Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,10546) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10568) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Bold Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,10586) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10608) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Bold Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,10626) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10648) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Bold Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,10666) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10688) size 769x18 +- RenderText {#text} at (0,0) size 377x18 +- text run at (0,0) width 377: "Font: AppleSDGothicNeo-Bold Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,10706) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10728) size 769x18 +- RenderText {#text} at (0,0) size 412x18 +- text run at (0,0) width 412: "Font: AppleSDGothicNeo-ExtraBold Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,10746) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10768) size 769x18 +- RenderText {#text} at (0,0) size 412x18 +- text run at (0,0) width 412: "Font: AppleSDGothicNeo-ExtraBold Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,10786) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10808) size 769x18 +- RenderText {#text} at (0,0) size 412x18 +- text run at (0,0) width 412: "Font: AppleSDGothicNeo-ExtraBold Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,10826) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10848) size 769x18 +- RenderText {#text} at (0,0) size 412x18 +- text run at (0,0) width 412: "Font: AppleSDGothicNeo-ExtraBold Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,10866) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10888) size 769x18 +- RenderText {#text} at (0,0) size 412x18 +- text run at (0,0) width 412: "Font: AppleSDGothicNeo-ExtraBold Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,10906) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10928) size 769x18 +- RenderText {#text} at (0,0) size 412x18 +- text run at (0,0) width 412: "Font: AppleSDGothicNeo-ExtraBold Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,10946) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,10968) size 769x18 +- RenderText {#text} at (0,0) size 412x18 +- text run at (0,0) width 412: "Font: AppleSDGothicNeo-ExtraBold Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,10986) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11008) size 769x18 +- RenderText {#text} at (0,0) size 412x18 +- text run at (0,0) width 412: "Font: AppleSDGothicNeo-ExtraBold Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,11026) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11048) size 769x18 +- RenderText {#text} at (0,0) size 412x18 +- text run at (0,0) width 412: "Font: AppleSDGothicNeo-ExtraBold Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,11066) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11088) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: AppleSDGothicNeo-Heavy Weight: 100 Style: normal" +- RenderBlock {DIV} at (0,11106) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11128) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: AppleSDGothicNeo-Heavy Weight: 200 Style: normal" +- RenderBlock {DIV} at (0,11146) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11168) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: AppleSDGothicNeo-Heavy Weight: 300 Style: normal" +- RenderBlock {DIV} at (0,11186) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11208) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: AppleSDGothicNeo-Heavy Weight: 400 Style: normal" +- RenderBlock {DIV} at (0,11226) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11248) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: AppleSDGothicNeo-Heavy Weight: 500 Style: normal" +- RenderBlock {DIV} at (0,11266) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11288) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: AppleSDGothicNeo-Heavy Weight: 600 Style: normal" +- RenderBlock {DIV} at (0,11306) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11328) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: AppleSDGothicNeo-Heavy Weight: 700 Style: normal" +- RenderBlock {DIV} at (0,11346) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11368) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: AppleSDGothicNeo-Heavy Weight: 800 Style: normal" +- RenderBlock {DIV} at (0,11386) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11408) size 769x18 +- RenderText {#text} at (0,0) size 388x18 +- text run at (0,0) width 388: "Font: AppleSDGothicNeo-Heavy Weight: 900 Style: normal" +- RenderBlock {DIV} at (0,11426) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11448) size 769x18 +- RenderText {#text} at (0,0) size 340x18 +- text run at (0,0) width 340: "Font: Apple SD Gothic Neo Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,11466) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11488) size 769x18 +- RenderText {#text} at (0,0) size 340x18 +- text run at (0,0) width 340: "Font: Apple SD Gothic Neo Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,11506) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11528) size 769x18 +- RenderText {#text} at (0,0) size 340x18 +- text run at (0,0) width 340: "Font: Apple SD Gothic Neo Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,11546) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11568) size 769x18 +- RenderText {#text} at (0,0) size 340x18 +- text run at (0,0) width 340: "Font: Apple SD Gothic Neo Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,11586) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11608) size 769x18 +- RenderText {#text} at (0,0) size 340x18 +- text run at (0,0) width 340: "Font: Apple SD Gothic Neo Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,11626) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11648) size 769x18 +- RenderText {#text} at (0,0) size 340x18 +- text run at (0,0) width 340: "Font: Apple SD Gothic Neo Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,11666) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11688) size 769x18 +- RenderText {#text} at (0,0) size 340x18 +- text run at (0,0) width 340: "Font: Apple SD Gothic Neo Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,11706) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11728) size 769x18 +- RenderText {#text} at (0,0) size 340x18 +- text run at (0,0) width 340: "Font: Apple SD Gothic Neo Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,11746) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11768) size 769x18 +- RenderText {#text} at (0,0) size 340x18 +- text run at (0,0) width 340: "Font: Apple SD Gothic Neo Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,11786) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11808) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: AppleSDGothicNeo-Regular Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,11826) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11848) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: AppleSDGothicNeo-Regular Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,11866) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11888) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: AppleSDGothicNeo-Regular Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,11906) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11928) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: AppleSDGothicNeo-Regular Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,11946) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,11968) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: AppleSDGothicNeo-Regular Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,11986) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12008) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: AppleSDGothicNeo-Regular Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,12026) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12048) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: AppleSDGothicNeo-Regular Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,12066) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12088) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: AppleSDGothicNeo-Regular Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,12106) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12128) size 769x18 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "Font: AppleSDGothicNeo-Regular Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,12146) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12168) size 769x18 +- RenderText {#text} at (0,0) size 387x18 +- text run at (0,0) width 387: "Font: AppleSDGothicNeo-Medium Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,12186) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12208) size 769x18 +- RenderText {#text} at (0,0) size 387x18 +- text run at (0,0) width 387: "Font: AppleSDGothicNeo-Medium Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,12226) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12248) size 769x18 +- RenderText {#text} at (0,0) size 387x18 +- text run at (0,0) width 387: "Font: AppleSDGothicNeo-Medium Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,12266) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12288) size 769x18 +- RenderText {#text} at (0,0) size 387x18 +- text run at (0,0) width 387: "Font: AppleSDGothicNeo-Medium Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,12306) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12328) size 769x18 +- RenderText {#text} at (0,0) size 387x18 +- text run at (0,0) width 387: "Font: AppleSDGothicNeo-Medium Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,12346) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12368) size 769x18 +- RenderText {#text} at (0,0) size 387x18 +- text run at (0,0) width 387: "Font: AppleSDGothicNeo-Medium Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,12386) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12408) size 769x18 +- RenderText {#text} at (0,0) size 387x18 +- text run at (0,0) width 387: "Font: AppleSDGothicNeo-Medium Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,12426) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12448) size 769x18 +- RenderText {#text} at (0,0) size 387x18 +- text run at (0,0) width 387: "Font: AppleSDGothicNeo-Medium Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,12466) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12488) size 769x18 +- RenderText {#text} at (0,0) size 387x18 +- text run at (0,0) width 387: "Font: AppleSDGothicNeo-Medium Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,12506) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12528) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: AppleSDGothicNeo-Light Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,12546) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12568) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: AppleSDGothicNeo-Light Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,12586) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12608) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: AppleSDGothicNeo-Light Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,12626) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12648) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: AppleSDGothicNeo-Light Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,12666) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12688) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: AppleSDGothicNeo-Light Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,12706) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12728) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: AppleSDGothicNeo-Light Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,12746) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12768) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: AppleSDGothicNeo-Light Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,12786) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12808) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: AppleSDGothicNeo-Light Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,12826) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12848) size 769x18 +- RenderText {#text} at (0,0) size 368x18 +- text run at (0,0) width 368: "Font: AppleSDGothicNeo-Light Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,12866) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12888) size 769x18 +- RenderText {#text} at (0,0) size 400x18 +- text run at (0,0) width 400: "Font: AppleSDGothicNeo-UltraLight Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,12906) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12928) size 769x18 +- RenderText {#text} at (0,0) size 400x18 +- text run at (0,0) width 400: "Font: AppleSDGothicNeo-UltraLight Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,12946) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,12968) size 769x18 +- RenderText {#text} at (0,0) size 400x18 +- text run at (0,0) width 400: "Font: AppleSDGothicNeo-UltraLight Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,12986) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13008) size 769x18 +- RenderText {#text} at (0,0) size 400x18 +- text run at (0,0) width 400: "Font: AppleSDGothicNeo-UltraLight Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,13026) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13048) size 769x18 +- RenderText {#text} at (0,0) size 400x18 +- text run at (0,0) width 400: "Font: AppleSDGothicNeo-UltraLight Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,13066) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13088) size 769x18 +- RenderText {#text} at (0,0) size 400x18 +- text run at (0,0) width 400: "Font: AppleSDGothicNeo-UltraLight Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,13106) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13128) size 769x18 +- RenderText {#text} at (0,0) size 400x18 +- text run at (0,0) width 400: "Font: AppleSDGothicNeo-UltraLight Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,13146) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13168) size 769x18 +- RenderText {#text} at (0,0) size 400x18 +- text run at (0,0) width 400: "Font: AppleSDGothicNeo-UltraLight Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,13186) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13208) size 769x18 +- RenderText {#text} at (0,0) size 400x18 +- text run at (0,0) width 400: "Font: AppleSDGothicNeo-UltraLight Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,13226) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13248) size 769x18 +- RenderText {#text} at (0,0) size 363x18 +- text run at (0,0) width 363: "Font: AppleSDGothicNeo-Thin Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,13266) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13288) size 769x18 +- RenderText {#text} at (0,0) size 363x18 +- text run at (0,0) width 363: "Font: AppleSDGothicNeo-Thin Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,13306) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13328) size 769x18 +- RenderText {#text} at (0,0) size 363x18 +- text run at (0,0) width 363: "Font: AppleSDGothicNeo-Thin Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,13346) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13368) size 769x18 +- RenderText {#text} at (0,0) size 363x18 +- text run at (0,0) width 363: "Font: AppleSDGothicNeo-Thin Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,13386) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13408) size 769x18 +- RenderText {#text} at (0,0) size 363x18 +- text run at (0,0) width 363: "Font: AppleSDGothicNeo-Thin Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,13426) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13448) size 769x18 +- RenderText {#text} at (0,0) size 363x18 +- text run at (0,0) width 363: "Font: AppleSDGothicNeo-Thin Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,13466) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13488) size 769x18 +- RenderText {#text} at (0,0) size 363x18 +- text run at (0,0) width 363: "Font: AppleSDGothicNeo-Thin Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,13506) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13528) size 769x18 +- RenderText {#text} at (0,0) size 363x18 +- text run at (0,0) width 363: "Font: AppleSDGothicNeo-Thin Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,13546) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13568) size 769x18 +- RenderText {#text} at (0,0) size 363x18 +- text run at (0,0) width 363: "Font: AppleSDGothicNeo-Thin Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,13586) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13608) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-SemiBold Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,13626) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13648) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-SemiBold Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,13666) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13688) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-SemiBold Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,13706) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13728) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-SemiBold Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,13746) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13768) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-SemiBold Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,13786) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13808) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-SemiBold Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,13826) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13848) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-SemiBold Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,13866) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13888) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-SemiBold Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,13906) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13928) size 769x18 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "Font: AppleSDGothicNeo-SemiBold Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,13946) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,13968) size 769x18 +- RenderText {#text} at (0,0) size 364x18 +- text run at (0,0) width 364: "Font: AppleSDGothicNeo-Bold Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,13986) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14008) size 769x18 +- RenderText {#text} at (0,0) size 364x18 +- text run at (0,0) width 364: "Font: AppleSDGothicNeo-Bold Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,14026) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14048) size 769x18 +- RenderText {#text} at (0,0) size 364x18 +- text run at (0,0) width 364: "Font: AppleSDGothicNeo-Bold Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,14066) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14088) size 769x18 +- RenderText {#text} at (0,0) size 364x18 +- text run at (0,0) width 364: "Font: AppleSDGothicNeo-Bold Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,14106) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14128) size 769x18 +- RenderText {#text} at (0,0) size 364x18 +- text run at (0,0) width 364: "Font: AppleSDGothicNeo-Bold Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,14146) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14168) size 769x18 +- RenderText {#text} at (0,0) size 364x18 +- text run at (0,0) width 364: "Font: AppleSDGothicNeo-Bold Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,14186) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14208) size 769x18 +- RenderText {#text} at (0,0) size 364x18 +- text run at (0,0) width 364: "Font: AppleSDGothicNeo-Bold Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,14226) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14248) size 769x18 +- RenderText {#text} at (0,0) size 364x18 +- text run at (0,0) width 364: "Font: AppleSDGothicNeo-Bold Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,14266) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14288) size 769x18 +- RenderText {#text} at (0,0) size 364x18 +- text run at (0,0) width 364: "Font: AppleSDGothicNeo-Bold Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,14306) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14328) size 769x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "Font: AppleSDGothicNeo-ExtraBold Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,14346) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14368) size 769x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "Font: AppleSDGothicNeo-ExtraBold Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,14386) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14408) size 769x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "Font: AppleSDGothicNeo-ExtraBold Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,14426) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14448) size 769x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "Font: AppleSDGothicNeo-ExtraBold Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,14466) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14488) size 769x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "Font: AppleSDGothicNeo-ExtraBold Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,14506) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14528) size 769x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "Font: AppleSDGothicNeo-ExtraBold Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,14546) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14568) size 769x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "Font: AppleSDGothicNeo-ExtraBold Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,14586) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14608) size 769x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "Font: AppleSDGothicNeo-ExtraBold Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,14626) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14648) size 769x18 +- RenderText {#text} at (0,0) size 399x18 +- text run at (0,0) width 399: "Font: AppleSDGothicNeo-ExtraBold Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,14666) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14688) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: AppleSDGothicNeo-Heavy Weight: 100 Style: italic" +- RenderBlock {DIV} at (0,14706) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14728) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: AppleSDGothicNeo-Heavy Weight: 200 Style: italic" +- RenderBlock {DIV} at (0,14746) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14768) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: AppleSDGothicNeo-Heavy Weight: 300 Style: italic" +- RenderBlock {DIV} at (0,14786) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14808) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: AppleSDGothicNeo-Heavy Weight: 400 Style: italic" +- RenderBlock {DIV} at (0,14826) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14848) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: AppleSDGothicNeo-Heavy Weight: 500 Style: italic" +- RenderBlock {DIV} at (0,14866) size 769x22 +- RenderText {#text} at (0,3) size 144x18 +- text run at (0,3) width 144: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14888) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: AppleSDGothicNeo-Heavy Weight: 600 Style: italic" +- RenderBlock {DIV} at (0,14906) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14928) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: AppleSDGothicNeo-Heavy Weight: 700 Style: italic" +- RenderBlock {DIV} at (0,14946) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,14968) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: AppleSDGothicNeo-Heavy Weight: 800 Style: italic" +- RenderBlock {DIV} at (0,14986) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +- RenderBlock {DIV} at (0,15008) size 769x18 +- RenderText {#text} at (0,0) size 375x18 +- text run at (0,0) width 375: "Font: AppleSDGothicNeo-Heavy Weight: 900 Style: italic" +- RenderBlock {DIV} at (0,15026) size 769x22 +- RenderText {#text} at (0,3) size 153x18 +- text run at (0,3) width 153: "\x{679C}\x{57CE}\x{7684}\x{7F8E}\x{8B7D}\x{3002}\x{4E2D}\x{56FD}\x{53E4}" +diff --git a/LayoutTests/platform/mac-mojave/fast/text/hyphenate-avoid-orphaned-word-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/hyphenate-avoid-orphaned-word-expected.txt +deleted file mode 100644 +index 2131efb3f61ba352bb750c73796cbd8a5bdc389c..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/hyphenate-avoid-orphaned-word-expected.txt ++++ /dev/null +@@ -1,93 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock (floating) {DIV} at (4,0) size 344x240 +- RenderBlock {P} at (0,16) size 344x18 +- RenderText {#text} at (0,0) size 208x18 +- text run at (0,0) width 208: "The initial value (should be like " +- RenderInline {TT} at (0,0) size 33x15 +- RenderText {#text} at (207,2) size 33x15 +- text run at (207,2) width 33: "auto" +- RenderText {#text} at (239,0) size 6x18 +- text run at (239,0) width 6: ")" +- RenderBlock {DIV} at (0,50) size 344x190 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x176 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in get" + hyphen string "-" +- text run at (7,73) width 209: "ting its body tucked away, " +- text run at (215,73) width 37: "com" + hyphen string "-" +- text run at (7,95) width 245: "fortably enough, under her arm," +- text run at (7,117) width 228: "with its legs hanging down, " +- text run at (234,117) width 103: "but generally," +- text run at (7,139) width 330: "just as she had got its neck nicely" +- text run at (7,161) width 93: "straightened." +- RenderBlock (floating) {DIV} at (356,0) size 344x240 +- RenderBlock {P} at (0,16) size 344x18 +- RenderText {#text} at (0,0) size 83x18 +- text run at (0,0) width 83: "The default (" +- RenderInline {TT} at (0,0) size 196x15 +- RenderText {#text} at (82,2) size 196x15 +- text run at (82,2) width 196: "hyphenate-character: auto" +- RenderText {#text} at (277,0) size 6x18 +- text run at (277,0) width 6: ")" +- RenderBlock {DIV} at (0,50) size 344x190 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x176 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in get" + hyphen string "-" +- text run at (7,73) width 209: "ting its body tucked away, " +- text run at (215,73) width 37: "com" + hyphen string "-" +- text run at (7,95) width 245: "fortably enough, under her arm," +- text run at (7,117) width 228: "with its legs hanging down, " +- text run at (234,117) width 103: "but generally," +- text run at (7,139) width 330: "just as she had got its neck nicely" +- text run at (7,161) width 93: "straightened." +- RenderBlock (floating) {DIV} at (4,240) size 344x240 +- RenderBlock {P} at (0,16) size 344x18 +- RenderText {#text} at (0,0) size 49x18 +- text run at (0,0) width 49: "Bullet (" +- RenderInline {TT} at (0,0) size 219x15 +- RenderText {#text} at (48,2) size 219x15 +- text run at (48,2) width 219: "hyphenate-character: \"\\2022\"" +- RenderText {#text} at (266,0) size 7x18 +- text run at (266,0) width 7: ")" +- RenderBlock {DIV} at (0,50) size 344x190 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x176 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in get" + hyphen string "\x{2022}" +- text run at (7,73) width 208: "ting its body tucked away, " +- text run at (214,73) width 38: "com" + hyphen string "\x{2022}" +- text run at (7,95) width 245: "fortably enough, under her arm," +- text run at (7,117) width 228: "with its legs hanging down, " +- text run at (234,117) width 103: "but generally," +- text run at (7,139) width 330: "just as she had got its neck nicely" +- text run at (7,161) width 93: "straightened." +- RenderBlock (floating) {DIV} at (356,240) size 356x240 +- RenderBlock {P} at (0,16) size 356x18 +- RenderText {#text} at (0,0) size 140x18 +- text run at (0,0) width 140: "Middle dot and tilde (" +- RenderInline {TT} at (0,0) size 212x15 +- RenderText {#text} at (139,2) size 212x15 +- text run at (139,2) width 212: "hyphenate-character: \"\\B7~\"" +- RenderText {#text} at (350,0) size 6x18 +- text run at (350,0) width 6: ")" +- RenderBlock {DIV} at (0,50) size 344x190 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x176 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in get" + hyphen string "\x{B7}~" +- text run at (7,73) width 200: "ting its body tucked away, " +- text run at (206,73) width 46: "com" + hyphen string "\x{B7}~" +- text run at (7,95) width 245: "fortably enough, under her arm," +- text run at (7,117) width 228: "with its legs hanging down, " +- text run at (234,117) width 103: "but generally," +- text run at (7,139) width 330: "just as she had got its neck nicely" +- text run at (7,161) width 93: "straightened." +diff --git a/LayoutTests/platform/mac-mojave/fast/text/hyphenate-character-expected.png b/LayoutTests/platform/mac-mojave/fast/text/hyphenate-character-expected.png +deleted file mode 100644 +index 551411e6ba2f42e44bc13baca2bd9658e82b9bd7..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/fast/text/hyphenate-character-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/fast/text/hyphenate-character-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/hyphenate-character-expected.txt +deleted file mode 100644 +index edb29f462314eaa4e4e61403b5fdae00dcb86f9d..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/hyphenate-character-expected.txt ++++ /dev/null +@@ -1,109 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock (floating) {DIV} at (4,0) size 344x284 +- RenderBlock {P} at (0,16) size 344x18 +- RenderText {#text} at (0,0) size 208x18 +- text run at (0,0) width 208: "The initial value (should be like " +- RenderInline {TT} at (0,0) size 33x15 +- RenderText {#text} at (207,2) size 33x15 +- text run at (207,2) width 33: "auto" +- RenderText {#text} at (239,0) size 6x18 +- text run at (239,0) width 6: ")" +- RenderBlock {DIV} at (0,50) size 344x234 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x220 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in get" + hyphen string "-" +- text run at (7,73) width 209: "ting its body tucked away, " +- text run at (215,73) width 37: "com" + hyphen string "-" +- text run at (7,95) width 245: "fortably enough, under her arm," +- text run at (7,117) width 228: "with its legs hanging down, " +- text run at (234,117) width 103: "but generally," +- text run at (7,139) width 330: "just as she had got its neck nicely straight" + hyphen string "-" +- text run at (7,161) width 39: "ened " +- text run at (45,161) width 292: "out, and was going to give the hedgehog" +- text run at (7,183) width 196: "a blow with its head, it " +- text run at (202,183) width 135: "would twist itself" +- text run at (7,205) width 230: "round and look up in her face\x{2026}" +- RenderBlock (floating) {DIV} at (356,0) size 344x284 +- RenderBlock {P} at (0,16) size 344x18 +- RenderText {#text} at (0,0) size 83x18 +- text run at (0,0) width 83: "The default (" +- RenderInline {TT} at (0,0) size 196x15 +- RenderText {#text} at (82,2) size 196x15 +- text run at (82,2) width 196: "hyphenate-character: auto" +- RenderText {#text} at (277,0) size 6x18 +- text run at (277,0) width 6: ")" +- RenderBlock {DIV} at (0,50) size 344x234 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x220 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in get" + hyphen string "-" +- text run at (7,73) width 209: "ting its body tucked away, " +- text run at (215,73) width 37: "com" + hyphen string "-" +- text run at (7,95) width 245: "fortably enough, under her arm," +- text run at (7,117) width 228: "with its legs hanging down, " +- text run at (234,117) width 103: "but generally," +- text run at (7,139) width 330: "just as she had got its neck nicely straight" + hyphen string "-" +- text run at (7,161) width 39: "ened " +- text run at (45,161) width 292: "out, and was going to give the hedgehog" +- text run at (7,183) width 196: "a blow with its head, it " +- text run at (202,183) width 135: "would twist itself" +- text run at (7,205) width 230: "round and look up in her face\x{2026}" +- RenderBlock (floating) {DIV} at (4,284) size 344x284 +- RenderBlock {P} at (0,16) size 344x18 +- RenderText {#text} at (0,0) size 49x18 +- text run at (0,0) width 49: "Bullet (" +- RenderInline {TT} at (0,0) size 219x15 +- RenderText {#text} at (48,2) size 219x15 +- text run at (48,2) width 219: "hyphenate-character: \"\\2022\"" +- RenderText {#text} at (266,0) size 7x18 +- text run at (266,0) width 7: ")" +- RenderBlock {DIV} at (0,50) size 344x234 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x220 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in get" + hyphen string "\x{2022}" +- text run at (7,73) width 208: "ting its body tucked away, " +- text run at (214,73) width 38: "com" + hyphen string "\x{2022}" +- text run at (7,95) width 245: "fortably enough, under her arm," +- text run at (7,117) width 228: "with its legs hanging down, " +- text run at (234,117) width 103: "but generally," +- text run at (7,139) width 330: "just as she had got its neck nicely straight" + hyphen string "\x{2022}" +- text run at (7,161) width 39: "ened " +- text run at (45,161) width 292: "out, and was going to give the hedgehog" +- text run at (7,183) width 196: "a blow with its head, it " +- text run at (202,183) width 135: "would twist itself" +- text run at (7,205) width 230: "round and look up in her face\x{2026}" +- RenderBlock (floating) {DIV} at (356,284) size 356x284 +- RenderBlock {P} at (0,16) size 356x18 +- RenderText {#text} at (0,0) size 140x18 +- text run at (0,0) width 140: "Middle dot and tilde (" +- RenderInline {TT} at (0,0) size 212x15 +- RenderText {#text} at (139,2) size 212x15 +- text run at (139,2) width 212: "hyphenate-character: \"\\B7~\"" +- RenderText {#text} at (350,0) size 6x18 +- text run at (350,0) width 6: ")" +- RenderBlock {DIV} at (0,50) size 344x234 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x220 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in get" + hyphen string "\x{B7}~" +- text run at (7,73) width 200: "ting its body tucked away, " +- text run at (206,73) width 46: "com" + hyphen string "\x{B7}~" +- text run at (7,95) width 245: "fortably enough, under her arm," +- text run at (7,117) width 228: "with its legs hanging down, " +- text run at (234,117) width 103: "but generally," +- text run at (7,139) width 330: "just as she had got its neck nicely straight" + hyphen string "\x{B7}~" +- text run at (7,161) width 39: "ened " +- text run at (45,161) width 292: "out, and was going to give the hedgehog" +- text run at (7,183) width 196: "a blow with its head, it " +- text run at (202,183) width 135: "would twist itself" +- text run at (7,205) width 230: "round and look up in her face\x{2026}" +diff --git a/LayoutTests/platform/mac-mojave/fast/text/hyphens-expected.png b/LayoutTests/platform/mac-mojave/fast/text/hyphens-expected.png +deleted file mode 100644 +index 781fd5403d0d4a6e120b6e5b01a67a0d52c06370..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/fast/text/hyphens-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/fast/text/hyphens-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/hyphens-expected.txt +deleted file mode 100644 +index 1c762c9b857cb40e6a5bd99004d01179552bf9b5..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/hyphens-expected.txt ++++ /dev/null +@@ -1,99 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock (floating) {DIV} at (4,0) size 344x284 +- RenderBlock {P} at (0,16) size 344x18 +- RenderInline {TT} at (0,0) size 118x15 +- RenderText {#text} at (0,2) size 118x15 +- text run at (0,2) width 118: "hyphens: manual" +- RenderText {#text} at (117,0) size 139x18 +- text run at (117,0) width 139: " without soft hyphens" +- RenderBlock {DIV} at (0,50) size 344x234 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x220 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in" +- text run at (7,73) width 245: "getting its body tucked away," +- text run at (7,95) width 245: "comfortably enough, under her" +- text run at (7,117) width 307: "arm, with its legs hanging down, " +- text run at (313,117) width 24: "but" +- text run at (7,139) width 330: "generally, just as she had got its neck nicely" +- text run at (7,161) width 96: "straightened " +- text run at (102,161) width 235: "out, and was going to give the" +- text run at (7,183) width 246: "hedgehog a blow with its head, it " +- text run at (252,183) width 85: "would twist" +- text run at (7,205) width 271: "itself round and look up in her face\x{2026}" +- RenderBlock (floating) {DIV} at (356,0) size 344x284 +- RenderBlock {P} at (0,16) size 344x18 +- RenderInline {TT} at (0,0) size 102x15 +- RenderText {#text} at (0,2) size 102x15 +- text run at (0,2) width 102: "hyphens: none" +- RenderText {#text} at (101,0) size 119x18 +- text run at (101,0) width 119: " with soft hyphens" +- RenderBlock {DIV} at (0,50) size 344x234 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x220 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in" +- text run at (7,73) width 245: "get\x{AD}ting its body tucked away," +- text run at (7,95) width 245: "com\x{AD}fortably enough, under her" +- text run at (7,117) width 307: "arm, with its legs hanging down, " +- text run at (313,117) width 24: "but" +- text run at (7,139) width 330: "generally, just as she had got its neck nicely" +- text run at (7,161) width 96: "straight\x{AD}ened " +- text run at (102,161) width 235: "out, and was going to give the" +- text run at (7,183) width 246: "hedge\x{AD}hog a blow with its head, it " +- text run at (252,183) width 85: "would twist" +- text run at (7,205) width 271: "itself round and look up in her face\x{2026}" +- RenderBlock (floating) {DIV} at (4,284) size 344x284 +- RenderBlock {P} at (0,16) size 344x18 +- RenderInline {TT} at (0,0) size 118x15 +- RenderText {#text} at (0,2) size 118x15 +- text run at (0,2) width 118: "hyphens: manual" +- RenderText {#text} at (117,0) size 118x18 +- text run at (117,0) width 118: " with soft hyphens" +- RenderBlock {DIV} at (0,50) size 344x234 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x220 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in get\x{AD}" + hyphen string "-" +- text run at (7,73) width 209: "ting its body tucked away, " +- text run at (215,73) width 37: "com\x{AD}" + hyphen string "-" +- text run at (7,95) width 245: "fortably enough, under her arm," +- text run at (7,117) width 228: "with its legs hanging down, " +- text run at (234,117) width 103: "but generally," +- text run at (7,139) width 330: "just as she had got its neck nicely straight\x{AD}" + hyphen string "-" +- text run at (7,161) width 39: "ened " +- text run at (45,161) width 292: "out, and was going to give the hedge\x{AD}hog" +- text run at (7,183) width 196: "a blow with its head, it " +- text run at (202,183) width 135: "would twist itself" +- text run at (7,205) width 230: "round and look up in her face\x{2026}" +- RenderBlock (floating) {DIV} at (356,284) size 344x284 +- RenderBlock {P} at (0,16) size 344x18 +- RenderInline {TT} at (0,0) size 102x15 +- RenderText {#text} at (0,2) size 102x15 +- text run at (0,2) width 102: "hyphens: auto" +- RenderText {#text} at (101,0) size 139x18 +- text run at (101,0) width 139: " without soft hyphens" +- RenderBlock {DIV} at (0,50) size 344x234 [border: (3px solid #000000)] +- RenderBlock (floating) {DIV} at (262,7) size 75x90 [bgcolor=#F0F8FF] +- RenderText {#text} at (7,7) size 330x220 +- text run at (7,7) width 245: "The chief difficulty Alice found" +- text run at (7,29) width 245: "at first was in managing her" +- text run at (7,51) width 245: "flamingo: she succeeded in get" + hyphen string "-" +- text run at (7,73) width 209: "ting its body tucked away, " +- text run at (215,73) width 37: "com" + hyphen string "-" +- text run at (7,95) width 245: "fortably enough, under her arm," +- text run at (7,117) width 228: "with its legs hanging down, " +- text run at (234,117) width 103: "but generally," +- text run at (7,139) width 330: "just as she had got its neck nicely straight" + hyphen string "-" +- text run at (7,161) width 39: "ened " +- text run at (45,161) width 292: "out, and was going to give the hedgehog" +- text run at (7,183) width 196: "a blow with its head, it " +- text run at (202,183) width 135: "would twist itself" +- text run at (7,205) width 230: "round and look up in her face\x{2026}" +diff --git a/LayoutTests/platform/mac-mojave/fast/text/indic-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/indic-expected.txt +deleted file mode 100644 +index 735512b2e866fc7f67e21670b8415055da2171e4..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/indic-expected.txt ++++ /dev/null +@@ -1,11 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderText {#text} at (0,0) size 632x18 +- text run at (0,0) width 632: "This page renders some indic text and makes sure that the text metrics match the expected metrics." +- RenderBR {BR} at (631,0) size 1x18 +- RenderText {#text} at (0,22) size 753x43 +- text run at (0,22) width 753: "\x{AA0}\x{AB3}\x{AA8}\x{ABE} \x{A87}\x{AB0}\x{ABE}\x{A95}\x{AC0} \x{AAA}\x{ACD}\x{AB0}\x{AA6}\x{AC7}\x{AB6}\x{ACB}\x{AA8}\x{AC7} \x{A87}\x{AB8}\x{ACD}\x{AB2}\x{ABE}\x{AAE}\x{ABF}\x{A95} \x{AB0}\x{ABE}\x{AB7}\x{ACD}\x{A9F}\x{ACD}\x{AB0} \x{A9C}\x{ABE}\x{AB9}\x{AC7}\x{AB0} \x{A95}\x{AB0}\x{ACD}\x{AAF}\x{AC1}\x{A82} \x{A9B}\x{AC7} \x{A85}\x{AA8}\x{AC7} \x{AAA}\x{ACB}\x{AA4}\x{ABE}\x{AA8}\x{ACB} \x{AB5}\x{ACD}\x{AAF}\x{ABE}\x{AAA} \x{AB5}\x{AA7}\x{ABE}\x{AB0}\x{AB5}\x{ABE} \x{AA4}\x{AC7}\x{AAE}\x{AA8}\x{ABE} \x{AB5}\x{AA1}\x{ABE} \x{AAA}\x{ACD}\x{AB0}\x{AA4}\x{ACD}\x{AAF}\x{AC7} \x{AB5}\x{AAB}\x{ABE}\x{AA6}\x{ABE}\x{AB0}\x{AC0}\x{AA8}\x{AC1}\x{A82} \x{AB5}\x{ABF}\x{AB6}\x{ACD}\x{AB5}\x{AAD}\x{AB0}\x{AA8}\x{ABE} \x{AAE}\x{AC1}\x{AB8}\x{ACD}\x{AB2}\x{ABF}\x{AAE}\x{ACB}\x{AA8}\x{AC7}" +- text run at (0,47) width 325: "\x{A86}\x{AB9}\x{ACD}\x{AB5}\x{ABE}\x{AA8} \x{A95}\x{AB0}\x{ACD}\x{AAF}\x{AC1}\x{A82} \x{A9B}\x{AC7}. \x{A87}\x{AB8}\x{ACD}\x{AB2}\x{ABE}\x{AAE}\x{ABF}\x{A95} \x{AB8}\x{ACD}\x{A9F}\x{AC7}\x{A9F} \x{A93}\x{AAB} \x{A87}\x{AB0}\x{ABE}\x{A95} \x{A8F}\x{AA8}\x{ACD}\x{AA1} \x{AB8}\x{ABF}\x{AB0}\x{ABF}\x{AAF}\x{ABE}" +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/bidi-fallback-font-weight-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/bidi-fallback-font-weight-expected.txt +deleted file mode 100644 +index b9161c61f4da0240d89a724414ed8e922442307f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/bidi-fallback-font-weight-expected.txt ++++ /dev/null +@@ -1,41 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x173 +- RenderBlock {HTML} at (0,0) size 800x173 +- RenderBody {BODY} at (8,16) size 784x141 +- RenderBlock {P} at (0,0) size 784x37 +- RenderText {#text} at (0,1) size 777x36 +- text run at (0,1) width 318: "In each of the following lines, the Hebrew letters " +- text run at (317,1) width 35 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- text run at (351,1) width 426: " in the end should be in boldface (compare with the same letters in" +- text run at (0,19) width 147: "the middle of the line)." +- RenderBlock {P} at (0,53) size 784x18 +- RenderText {#text} at (0,0) size 82x18 +- text run at (0,0) width 43: "abcd " +- text run at (42,0) width 35 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- text run at (76,0) width 6: " " +- RenderInline {B} at (0,0) size 82x18 +- RenderText {#text} at (81,0) size 82x18 +- text run at (81,0) width 45: "abcd " +- text run at (125,0) width 38 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,87) size 784x19 +- RenderText {#text} at (0,1) size 92x18 +- text run at (0,1) width 49: "abcd " +- text run at (48,1) width 35 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- text run at (82,1) width 10: " " +- RenderInline {B} at (0,0) size 86x18 +- RenderText {#text} at (91,1) size 86x18 +- text run at (91,1) width 49: "abcd " +- text run at (139,1) width 38 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,122) size 784x19 +- RenderText {#text} at (0,1) size 73x18 +- text run at (0,1) width 35: "abcd " +- text run at (34,1) width 35 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- text run at (68,1) width 5: " " +- RenderInline {B} at (0,0) size 74x18 +- RenderText {#text} at (72,1) size 74x18 +- text run at (72,1) width 38: "abcd " +- text run at (109,1) width 37 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/bidi-mirror-he-ar-expected.png b/LayoutTests/platform/mac-mojave/fast/text/international/bidi-mirror-he-ar-expected.png +deleted file mode 100644 +index 9ca5c260b83559b0c23b3da42da8d7c87a9d6376..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/fast/text/international/bidi-mirror-he-ar-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/bidi-mirror-he-ar-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/bidi-mirror-he-ar-expected.txt +deleted file mode 100644 +index f14d173146d8cb9438e93fd75a601fb772f3bd32..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/bidi-mirror-he-ar-expected.txt ++++ /dev/null +@@ -1,20 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (456,0) size 328x18 +- text run at (456,0) width 328: "This test tests bidi mirroring in Hebrew and Arabic" +- RenderBlock {P} at (0,34) size 784x18 +- RenderText {#text} at (317,0) size 467x18 +- text run at (317,0) width 467: "The parenthesis should be displayed as \"(...)...\" visually from left to right" +- RenderBlock {DIV} at (0,68) size 784x19 +- RenderText {#text} at (750,1) size 34x18 +- text run at (750,1) width 34 RTL: "\x{5E9}(\x{5E9})" +- RenderBlock {DIV} at (0,87) size 784x18 +- RenderText {#text} at (762,0) size 22x18 +- text run at (762,0) width 22 RTL: "\x{5C6}(\x{5C6})" +- RenderBlock {DIV} at (0,105) size 784x21 +- RenderText {#text} at (758,1) size 26x18 +- text run at (758,1) width 26 RTL: "\x{644}(\x{644})" +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/danda-space-expected.png b/LayoutTests/platform/mac-mojave/fast/text/international/danda-space-expected.png +deleted file mode 100644 +index 00ae73d1cb3601109340472b9de3261cab02f563..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/fast/text/international/danda-space-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/danda-space-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/danda-space-expected.txt +deleted file mode 100644 +index f30cc9935c40b5d81d64a70fe45e5a084fae5b1f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/danda-space-expected.txt ++++ /dev/null +@@ -1,16 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 54x18 +- text run at (0,0) width 54: "Test for " +- RenderInline {A} at (0,0) size 69x18 [color=#0000EE] +- RenderText {#text} at (53,0) size 69x18 +- text run at (53,0) width 69: "bug 25464" +- RenderText {#text} at (121,0) size 389x18 +- text run at (121,0) width 389: ": Test for rendering of Danda (U+0964) followed by a space." +- RenderBlock {P} at (0,34) size 784x25 +- RenderText {#text} at (0,4) size 286x18 +- text run at (0,4) width 286: "\x{A39}\x{A41}\x{A70}\x{A26}\x{A40} \x{A39}\x{A48}\x{964} \x{A07}\x{A38} \x{A32}\x{A3F}\x{A2A}\x{A40} \x{A26}\x{A47} \x{A35}\x{A3F}\x{A1A} \x{A69}\x{A6B} (35) \x{A05}\x{A71}\x{A16}\x{A30} \x{A39}\x{A41}\x{A70}\x{A26}\x{A47} \x{A39}\x{A28}\x{964}" +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/pop-up-button-text-alignment-and-direction-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/pop-up-button-text-alignment-and-direction-expected.txt +deleted file mode 100644 +index be67c8d505a91ff456df12d7a81f3e9318879002..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/pop-up-button-text-alignment-and-direction-expected.txt ++++ /dev/null +@@ -1,99 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x544 +- RenderBlock {HTML} at (0,0) size 800x544 +- RenderBody {BODY} at (8,16) size 784x520 +- RenderBlock {P} at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 709x18 +- text run at (0,0) width 497: "Verify that the alignment and writing direction of each selected item matches " +- text run at (496,0) width 213: "the one below the pop-up button." +- RenderBlock {DIV} at (0,34) size 784x242 +- RenderMenuList {SELECT} at (0,0) size 500x21 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 500x21 +- RenderText at (8,2) size 159x16 +- text run at (8,2) width 31: "First " +- text run at (38,2) width 48 RTL: ") \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA}" +- text run at (85,2) width 17: "03" +- text run at (101,2) width 38 RTL: "\x{5E9}\x{5E0}\x{5D9}\x{5D4} (" +- text run at (138,2) width 29: " fifth" +- RenderBlock {DIV} at (0,23) size 470x36 +- RenderText {#text} at (10,10) size 163x16 +- text run at (10,10) width 32: "First " +- text run at (41,10) width 49 RTL: ") \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA}" +- text run at (89,10) width 17: "03" +- text run at (105,10) width 37 RTL: "\x{5E9}\x{5E0}\x{5D9}\x{5D4} (" +- text run at (141,10) width 32: " fifth" +- RenderMenuList {SELECT} at (0,61) size 500x21 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 500x21 +- RenderText at (8,2) size 159x16 +- text run at (8,2) width 25: "fifth" +- text run at (32,2) width 52 RTL: ") \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} " +- text run at (83,2) width 17: "03" +- text run at (99,2) width 42 RTL: " \x{5E9}\x{5E0}\x{5D9}\x{5D4} (" +- text run at (140,2) width 27: "First" +- RenderBlock {DIV} at (0,84) size 470x36 +- RenderText {#text} at (10,10) size 163x16 +- text run at (10,10) width 27: "fifth" +- text run at (36,10) width 52 RTL: ") \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} " +- text run at (87,10) width 18: "03" +- text run at (104,10) width 41 RTL: " \x{5E9}\x{5E0}\x{5D9}\x{5D4} (" +- text run at (144,10) width 29: "First" +- RenderMenuList {SELECT} at (0,122) size 500x21 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 500x21 +- RenderText at (8,2) size 159x16 +- text run at (8,2) width 159: "First \x{5E9}\x{5E0}\x{5D9}\x{5D4} (03) \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} fifth" +- RenderBlock {DIV} at (0,145) size 470x36 +- RenderText {#text} at (10,10) size 163x16 +- text run at (10,10) width 163: "First \x{5E9}\x{5E0}\x{5D9}\x{5D4} (03) \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} fifth" +- RenderMenuList {SELECT} at (0,183) size 500x21 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 500x21 +- RenderText at (8,2) size 159x16 +- text run at (8,2) width 159 RTL: "First \x{5E9}\x{5E0}\x{5D9}\x{5D4} (03) \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} fifth" +- RenderBlock {DIV} at (0,206) size 470x36 +- RenderText {#text} at (10,10) size 163x16 +- text run at (10,10) width 163 RTL: "First \x{5E9}\x{5E0}\x{5D9}\x{5D4} (03) \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} fifth" +- RenderBlock {DIV} at (0,278) size 784x242 +- RenderMenuList {SELECT} at (0,0) size 500x21 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 500x21 +- RenderText at (333,2) size 159x16 +- text run at (333,2) width 31: "First " +- text run at (363,2) width 49 RTL: ") \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA}" +- text run at (411,2) width 17: "03" +- text run at (427,2) width 37 RTL: "\x{5E9}\x{5E0}\x{5D9}\x{5D4} (" +- text run at (463,2) width 29: " fifth" +- RenderBlock {DIV} at (0,23) size 470x36 +- RenderText {#text} at (297,10) size 163x16 +- text run at (297,10) width 33: "First " +- text run at (329,10) width 48 RTL: ") \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA}" +- text run at (376,10) width 18: "03" +- text run at (393,10) width 37 RTL: "\x{5E9}\x{5E0}\x{5D9}\x{5D4} (" +- text run at (429,10) width 31: " fifth" +- RenderMenuList {SELECT} at (0,61) size 500x21 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 500x21 +- RenderText at (333,2) size 159x16 +- text run at (333,2) width 26: "fifth" +- text run at (358,2) width 52 RTL: ") \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} " +- text run at (409,2) width 17: "03" +- text run at (425,2) width 41 RTL: " \x{5E9}\x{5E0}\x{5D9}\x{5D4} (" +- text run at (465,2) width 27: "First" +- RenderBlock {DIV} at (0,84) size 470x36 +- RenderText {#text} at (297,10) size 163x16 +- text run at (297,10) width 28: "fifth" +- text run at (324,10) width 52 RTL: ") \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} " +- text run at (375,10) width 17: "03" +- text run at (391,10) width 42 RTL: " \x{5E9}\x{5E0}\x{5D9}\x{5D4} (" +- text run at (432,10) width 28: "First" +- RenderMenuList {SELECT} at (0,122) size 500x21 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 500x21 +- RenderText at (333,2) size 159x16 +- text run at (333,2) width 159: "First \x{5E9}\x{5E0}\x{5D9}\x{5D4} (03) \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} fifth" +- RenderBlock {DIV} at (0,145) size 470x36 +- RenderText {#text} at (297,10) size 163x16 +- text run at (297,10) width 163: "First \x{5E9}\x{5E0}\x{5D9}\x{5D4} (03) \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} fifth" +- RenderMenuList {SELECT} at (0,183) size 500x21 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 500x21 +- RenderText at (333,2) size 159x16 +- text run at (333,2) width 159 RTL: "First \x{5E9}\x{5E0}\x{5D9}\x{5D4} (03) \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} fifth" +- RenderBlock {DIV} at (0,206) size 470x36 +- RenderText {#text} at (297,10) size 163x16 +- text run at (297,10) width 163 RTL: "First \x{5E9}\x{5E0}\x{5D9}\x{5D4} (03) \x{5E8}\x{5D1}\x{5D9}\x{5E2}\x{5D9}\x{5EA} fifth" +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-en-US-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-en-US-expected.txt +deleted file mode 100644 +index 8e0527754869dff354f61ae562f1b021ca40d1ab..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-en-US-expected.txt ++++ /dev/null +@@ -1,5 +0,0 @@ +-PASS navigator.language is "en-US" +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-en-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-en-expected.txt +deleted file mode 100644 +index 8e0527754869dff354f61ae562f1b021ca40d1ab..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-en-expected.txt ++++ /dev/null +@@ -1,5 +0,0 @@ +-PASS navigator.language is "en-US" +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-419-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-419-expected.txt +deleted file mode 100644 +index 5684fa3e6e044b8cf100d8a90dda4dcff6cacc49..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-419-expected.txt ++++ /dev/null +@@ -1,6 +0,0 @@ +-FAIL navigator.language should be es-419. Was es-XL. +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-ES-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-ES-expected.txt +deleted file mode 100644 +index 8762d39a81ea4984ce26b9d6cbf3ef49c573f7a1..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-ES-expected.txt ++++ /dev/null +@@ -1,5 +0,0 @@ +-PASS navigator.language is "es-ES" +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-MX-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-MX-expected.txt +deleted file mode 100644 +index 8c6d29fccb87f9dec8123a9170dc4b9baa2bc21d..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-MX-expected.txt ++++ /dev/null +@@ -1,6 +0,0 @@ +-FAIL navigator.language should be es-MX. Was es-XL. +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-expected.txt +deleted file mode 100644 +index 8762d39a81ea4984ce26b9d6cbf3ef49c573f7a1..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-es-expected.txt ++++ /dev/null +@@ -1,5 +0,0 @@ +-PASS navigator.language is "es-ES" +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-fr-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-fr-expected.txt +deleted file mode 100644 +index eb49ac8da3a65e48c42ad96ee2c814812ccae9da..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-fr-expected.txt ++++ /dev/null +@@ -1,5 +0,0 @@ +-PASS navigator.language is "fr-FR" +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-hi-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-hi-expected.txt +deleted file mode 100644 +index 6842e059243f2f924b9e4575f1ed6754477d28a2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-hi-expected.txt ++++ /dev/null +@@ -1,5 +0,0 @@ +-PASS navigator.language is "hi-IN" +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-ja-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-ja-expected.txt +deleted file mode 100644 +index 95faf1e0145c4f38c671b41c849da1dc69fc3fba..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-ja-expected.txt ++++ /dev/null +@@ -1,6 +0,0 @@ +-FAIL navigator.language should be ja. Was ja-JP. +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-pt-BR-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-pt-BR-expected.txt +deleted file mode 100644 +index b58e0175ef96a5474d51ca75a83e1c0175095308..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-pt-BR-expected.txt ++++ /dev/null +@@ -1,5 +0,0 @@ +-PASS navigator.language is "pt-BR" +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-ru-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-ru-expected.txt +deleted file mode 100644 +index d687e43867130906355da2b3155127beef4785de..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-ru-expected.txt ++++ /dev/null +@@ -1,5 +0,0 @@ +-PASS navigator.language is "ru-RU" +-PASS successfullyParsed is true +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-zh-HK-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-zh-HK-expected.txt +deleted file mode 100644 +index 31cedcf15682c7963df337348f1151bb2c17fff2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-zh-HK-expected.txt ++++ /dev/null +@@ -1,6 +0,0 @@ +-FAIL navigator.language should be zh-HK. Was zh-TW. +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-zh-Hant-HK-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-zh-Hant-HK-expected.txt +deleted file mode 100644 +index 31cedcf15682c7963df337348f1151bb2c17fff2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/navigator-language/navigator-language-zh-Hant-HK-expected.txt ++++ /dev/null +@@ -1,6 +0,0 @@ +-FAIL navigator.language should be zh-HK. Was zh-TW. +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/system-font-punctuation-expected.txt b/LayoutTests/platform/mac-mojave/fast/text/international/system-language/system-font-punctuation-expected.txt +deleted file mode 100644 +index 5037909ed750d73f133b4db1a0c822bd89a0cb87..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/fast/text/international/system-language/system-font-punctuation-expected.txt ++++ /dev/null +@@ -1,12 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x112 +- RenderBlock {HTML} at (0,0) size 800x112 +- RenderBody {BODY} at (8,8) size 784x96 +- RenderBlock (anonymous) at (0,0) size 784x36 +- RenderText {#text} at (0,0) size 720x36 +- text run at (0,0) width 720: "This test makes sure punctuation laid out with the system font does not use vertical glyphs. The test passes if the" +- text run at (0,18) width 527: "semicolon below looks like a regular horizontal semicolon (;) and is not sideways." +- RenderBlock {DIV} at (0,36) size 784x60 +- RenderText {#text} at (0,0) size 14x59 +- text run at (0,0) width 14: ";" +diff --git a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-navigating-iframe-in-cross-origin-page-expected.txt b/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-navigating-iframe-in-cross-origin-page-expected.txt +deleted file mode 100644 +index 29cca1b58a9b09eb0549d67b7b27d7348e42a7c4..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-navigating-iframe-in-cross-origin-page-expected.txt ++++ /dev/null +@@ -1,26 +0,0 @@ +- +- +--------- +-Frame: '' +--------- +-Tests that Same-Site cookies for 127.0.0.1 are not sent with a frame navigation for a frame embedded in a page with a different origin. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +-Cookies sent with HTTP request: +-PASS Do not have cookie "strict". +-FAIL Should have cookie "implicit-strict". But do not. +-FAIL Should have cookie "strict-because-invalid-SameSite-value". But do not. +-PASS Do not have cookie "lax". +- +-Cookies visible in DOM: +-PASS Do not have DOM cookie "strict". +-FAIL Should have DOM cookie "implicit-strict". But do not. +-FAIL Should have DOM cookie "strict-because-invalid-SameSite-value". But do not. +-PASS Do not have DOM cookie "lax". +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-cross-origin-redirect-expected.txt b/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-cross-origin-redirect-expected.txt +deleted file mode 100644 +index f670b02b4cc5a23c6ceafc55d4fd2299e536401a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-cross-origin-redirect-expected.txt ++++ /dev/null +@@ -1,21 +0,0 @@ +-Tests that a SameSite Lax cookie for 127.0.0.1 is sent with a redirect from a page with a different origin. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +-Cookies sent with HTTP request: +-PASS Do not have cookie "strict". +-FAIL Should have cookie "implicit-strict". But do not. +-FAIL Should have cookie "strict-because-invalid-SameSite-value". But do not. +-PASS Has cookie "lax" with value 19. +- +-Cookies visible in DOM: +-PASS Do not have DOM cookie "strict". +-FAIL Should have DOM cookie "implicit-strict". But do not. +-FAIL Should have DOM cookie "strict-because-invalid-SameSite-value". But do not. +-PASS Has DOM cookie "lax" with value 19. +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-navigation-from-cross-origin-page-expected.txt b/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-navigation-from-cross-origin-page-expected.txt +deleted file mode 100644 +index 18d6798e5eb403af913b3c8de2df6fdee9606e0f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-navigation-from-cross-origin-page-expected.txt ++++ /dev/null +@@ -1,21 +0,0 @@ +-Tests that a SameSite Lax cookie for 127.0.0.1 is sent with a top-level navigation initiated from a page with a different origin. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +-Cookies sent with HTTP request: +-PASS Do not have cookie "strict". +-FAIL Should have cookie "implicit-strict". But do not. +-FAIL Should have cookie "strict-because-invalid-SameSite-value". But do not. +-PASS Has cookie "lax" with value 5. +- +-Cookies visible in DOM: +-PASS Do not have DOM cookie "strict". +-FAIL Should have DOM cookie "implicit-strict". But do not. +-FAIL Should have DOM cookie "strict-because-invalid-SameSite-value". But do not. +-PASS Has DOM cookie "lax" with value 5. +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-navigation-initiated-from-iframe-in-cross-origin-page-expected.txt b/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-navigation-initiated-from-iframe-in-cross-origin-page-expected.txt +deleted file mode 100644 +index 05e5c7d33d1c478392abefc2c5d92eb8beeb30e2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-after-top-level-navigation-initiated-from-iframe-in-cross-origin-page-expected.txt ++++ /dev/null +@@ -1,21 +0,0 @@ +-Tests that a SameSite Lax cookie for 127.0.0.1 is sent with a top-level navigation initiated from a frame embedded in a page with a different origin. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +-Cookies sent with HTTP request: +-PASS Do not have cookie "strict". +-FAIL Should have cookie "implicit-strict". But do not. +-FAIL Should have cookie "strict-because-invalid-SameSite-value". But do not. +-PASS Has cookie "lax" with value 4. +- +-Cookies visible in DOM: +-PASS Do not have DOM cookie "strict". +-FAIL Should have DOM cookie "implicit-strict". But do not. +-FAIL Should have DOM cookie "strict-because-invalid-SameSite-value". But do not. +-PASS Has DOM cookie "lax" with value 4. +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-in-cross-origin-service-worker-expected.txt b/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-in-cross-origin-service-worker-expected.txt +deleted file mode 100644 +index d88fb8383e05c567eb211813d3c59571fb65fd5f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/fetch-in-cross-origin-service-worker-expected.txt ++++ /dev/null +@@ -1,26 +0,0 @@ +- +- +--------- +-Frame: '' +--------- +-Tests that Same-Site cookies for 127.0.0.1 are not sent with a request initiated from an iframe- and processed by a service worker- with a different origin. +- +-On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". +- +- +-Cookies sent with HTTP request: +-PASS Do not have cookie "strict". +-FAIL Should have cookie "implicit-strict". But do not. +-FAIL Should have cookie "strict-because-invalid-SameSite-value". But do not. +-PASS Do not have cookie "lax". +- +-Cookies visible in DOM: +-PASS Do not have DOM cookie "strict". +-PASS Do not have DOM cookie "implicit-strict". +-PASS Do not have DOM cookie "strict-because-invalid-SameSite-value". +-PASS Do not have DOM cookie "lax". +-PASS successfullyParsed is true +-Some tests failed. +- +-TEST COMPLETE +- +diff --git a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/popup-cross-site-expected.txt b/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/popup-cross-site-expected.txt +deleted file mode 100644 +index cab7524c4efa98b1afb1d444d590d3508f028d68..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/popup-cross-site-expected.txt ++++ /dev/null +@@ -1,3 +0,0 @@ +- +-FAIL '127.0.0.1' is not same-site with 'localhost', so strict samesite cookies are not sent. assert_equals: implicit-strict expected (string) "1" but got (undefined) undefined +- +diff --git a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/popup-cross-site-post-expected.txt b/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/popup-cross-site-post-expected.txt +deleted file mode 100644 +index 6e84f07028c4bbf24c22aca95bbb28d7521c93e0..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/popup-cross-site-post-expected.txt ++++ /dev/null +@@ -1,3 +0,0 @@ +- +-FAIL '127.0.0.1' is not same-site with 'localhost', so samesite cookies are not sent via POST. assert_equals: implicit-strict expected (string) "1" but got (undefined) undefined +- +diff --git a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/popup-same-site-via-cross-site-redirect-expected.txt b/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/popup-same-site-via-cross-site-redirect-expected.txt +deleted file mode 100644 +index 76631e0ced8ad17d0e08e0edb366311927451e0b..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/http/tests/cookies/same-site/popup-same-site-via-cross-site-redirect-expected.txt ++++ /dev/null +@@ -1,3 +0,0 @@ +- +-FAIL '127.0.0.1' is same-site with itself, so samesite cookies are sent. assert_equals: implicit-strict expected (string) "1" but got (undefined) undefined +- +diff --git a/LayoutTests/platform/mac-mojave/http/tests/inspector/network/resource-sizes-network-expected.txt b/LayoutTests/platform/mac-mojave/http/tests/inspector/network/resource-sizes-network-expected.txt +deleted file mode 100644 +index c41e67c814d620bf72f3e534b4dd6bc82987937a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/http/tests/inspector/network/resource-sizes-network-expected.txt ++++ /dev/null +@@ -1,103 +0,0 @@ +-Test for Resource size values (transfer size, decoded size, header size, request and response) for resources served over the network. +- +- +-== Running test suite: Resource.Size.Network +--- Running test case: Resource.Size.Network.text +-PASS: statusCode should be 200. +-PASS: compressed should be false. +-PASS: responseSource should be Symbol(network). +-size: 2955 +-requestBodyTransferSize: 0 +-responseBodyTransferSize: 2955 +-estimatedNetworkEncodedSize: 2955 +-networkEncodedSize: 2955 +-PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). +-PASS: networkTotalTransferSize should be >= (encoded body size + headers). +-PASS: requestHeadersTransferSize should be non-empty. +-PASS: responseHeadersTransferSize should be non-empty. +- +--- Running test case: Resource.Size.Network.text.empty +-PASS: statusCode should be 200. +-PASS: compressed should be false. +-PASS: responseSource should be Symbol(network). +-size: 0 +-requestBodyTransferSize: 0 +-responseBodyTransferSize: 0 +-estimatedNetworkEncodedSize: 0 +-networkEncodedSize: 0 +-PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). +-PASS: networkTotalTransferSize should be >= (encoded body size + headers). +-PASS: requestHeadersTransferSize should be non-empty. +-PASS: responseHeadersTransferSize should be non-empty. +- +--- Running test case: Resource.Size.Network.text.gzipped +-PASS: statusCode should be 200. +-PASS: compressed should be true. +-PASS: responseSource should be Symbol(network). +-size: 2955 +-requestBodyTransferSize: 0 +-responseBodyTransferSize: 1229 +-estimatedNetworkEncodedSize: 1229 +-networkEncodedSize: 1229 +-PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). +-PASS: networkTotalTransferSize should be >= (encoded body size + headers). +-PASS: requestHeadersTransferSize should be non-empty. +-PASS: responseHeadersTransferSize should be non-empty. +- +--- Running test case: Resource.Size.Network.text.gzipped.no-content-length +-PASS: statusCode should be 200. +-PASS: compressed should be true. +-PASS: responseSource should be Symbol(network). +-size: 2955 +-requestBodyTransferSize: 0 +-responseBodyTransferSize: 1229 +-estimatedNetworkEncodedSize: 1229 +-networkEncodedSize: 1229 +-PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). +-PASS: networkTotalTransferSize should be >= (encoded body size + headers). +-PASS: requestHeadersTransferSize should be non-empty. +-PASS: responseHeadersTransferSize should be non-empty. +- +--- Running test case: Resource.Size.Network.image +-PASS: statusCode should be 200. +-PASS: compressed should be false. +-PASS: responseSource should be Symbol(network). +-size: 12940 +-requestBodyTransferSize: 0 +-responseBodyTransferSize: 12940 +-estimatedNetworkEncodedSize: 12940 +-networkEncodedSize: 12940 +-PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). +-PASS: networkTotalTransferSize should be >= (encoded body size + headers). +-PASS: requestHeadersTransferSize should be non-empty. +-PASS: responseHeadersTransferSize should be non-empty. +- +--- Running test case: Resource.Size.Network.404 +-PASS: statusCode should be 404. +-PASS: compressed should be false. +-PASS: responseSource should be Symbol(network). +-size: 512 +-requestBodyTransferSize: 0 +-responseBodyTransferSize: 512 +-estimatedNetworkEncodedSize: 512 +-networkEncodedSize: 512 +-PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). +-PASS: networkTotalTransferSize should be >= (encoded body size + headers). +-PASS: requestHeadersTransferSize should be non-empty. +-PASS: responseHeadersTransferSize should be non-empty. +- +--- Running test case: Resource.Size.Network.requestData +-PASS: statusCode should be 200. +-PASS: compressed should be false. +-PASS: responseSource should be Symbol(network). +-size: 28 +-requestBodyTransferSize: 1027 +-responseBodyTransferSize: 28 +-estimatedNetworkEncodedSize: 28 +-networkEncodedSize: 28 +-PASS: estimatedTotalTransferSize should be >= (encoded body size + headers). +-PASS: networkTotalTransferSize should be >= (encoded body size + headers). +-PASS: requestHeadersTransferSize should be non-empty. +-PASS: responseHeadersTransferSize should be non-empty. +-PASS: requestHeadersTransferSize should be > 1060 bytes. +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/cors/access-control-expose-headers-parsing.window-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/cors/access-control-expose-headers-parsing.window-expected.txt +deleted file mode 100644 +index c629f5d8eb9235723331c8eb2ef6dcbfbc72d2e4..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/cors/access-control-expose-headers-parsing.window-expected.txt ++++ /dev/null +@@ -1,18 +0,0 @@ +- +-PASS Loading JSON… +-PASS Parsing: access-control-expose-headers%3A%20BB-8 +-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11! +-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%2C%20no%20no +-PASS Parsing: Access-Control-Expose-Headers%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cbb-8 +-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%0D%0AAccess-Control-Expose-Headers%3A%20no +-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%0D%0AAccess-Control-Expose-Headers%3A%20no%20no +-PASS Parsing: Access-Control-Expose-Headers%3A%20no%0D%0AAccess-Control-Expose-Headers%3A%20bb-8 +-PASS Parsing: Access-Control-Expose-Headers%3A%0D%0AAccess-Control-Expose-Headers%3A%20bb-8 +-PASS Parsing: Access-Control-Expose-Headers%3A%20%2Cbb-8 +-FAIL Parsing: Access-Control-Expose-Headers%3A%20bb-8%0C assert_equals: expected (object) null but got (string) "hey" +-FAIL Parsing: Access-Control-Expose-Headers%3A%20bb-8%0B assert_equals: expected (object) null but got (string) "hey" +-PASS Parsing: Access-Control-Expose-Headers%3A%20bb-8%0B%2Cbb-8 +-PASS Parsing: Access-Control-Expose-Headers%3A%20'bb-8' +-PASS Parsing: Access-Control-Expose-Headers%3A%20'bb-8'%2Cbb-8 +-PASS Parsing: Access-Control-Expose-Headers%3A%20%22bb-8%22%2Cbb-8 +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/cors/credentials-flag-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/cors/credentials-flag-expected.txt +deleted file mode 100644 +index 63505c07aa1c500427d4d9e4f80d6e6fcb78ddeb..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/cors/credentials-flag-expected.txt ++++ /dev/null +@@ -1,19 +0,0 @@ +-CORS - Access-Control-Allow-Credentials +- +- +-PASS Setting withCredentials on a sync XHR object should not throw +-PASS Don't send cookie by default +-FAIL Don't send cookie part 2 assert_equals: Cookie sent in withCredentials=true sync request expected "COOKIE" but got "NO_COOKIE" +-FAIL Don't obey Set-Cookie when withCredentials=false assert_equals: third expected "COOKIE" but got "NO_COOKIE" +-PASS Access-Control-Allow-Credentials: TRUE should be disallowed (async) +-PASS Access-Control-Allow-Credentials: True should be disallowed (async) +-PASS Access-Control-Allow-Credentials: "true" should be disallowed (async) +-PASS Access-Control-Allow-Credentials: 'true' should be disallowed (async) +-PASS Access-Control-Allow-Credentials: false should be disallowed (async) +-PASS Access-Control-Allow-Credentials: 1 should be disallowed (async) +-PASS Access-Control-Allow-Credentials: 0 should be disallowed (async) +-PASS Access-Control-Allow-Credentials: ,true should be disallowed (async) +-PASS Access-Control-Allow-Credentials: true, should be disallowed (async) +-FAIL Access-Control-Allow-Credentials: true%0B should be disallowed (async) assert_unreached: onload Reached unreachable code +-FAIL Access-Control-Allow-Credentials: true%0C should be disallowed (async) assert_unreached: onload Reached unreachable code +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/cors/origin-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/cors/origin-expected.txt +deleted file mode 100644 +index 360fa432262d9ecd9ca5c6ddcc4c55805500af81..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/cors/origin-expected.txt ++++ /dev/null +@@ -1,70 +0,0 @@ +-Access-Control-Allow-Origin handling +- +- +-Harness Error (FAIL), message = 1 duplicate test name: "Disallow origin: localhost:8800" +- +-PASS Allow origin: * +-PASS Allow origin: _*__ +-PASS Allow origin: [tab]* +-PASS Allow origin: http://localhost:8800 +-PASS Allow origin: _http://localhost:8800 +-PASS Allow origin: _http://localhost:8800___[tab]_ +-PASS Allow origin: [tab]http://localhost:8800 +-PASS Disallow origin: http://127.0.0.1.localhost:8800 +-PASS Disallow origin: //localhost:8800 +-PASS Disallow origin: ://localhost:8800 +-PASS Disallow origin: ftp://localhost:8800 +-PASS Disallow origin: http:://localhost:8800 +-PASS Disallow origin: http:/localhost:8800 +-PASS Disallow origin: http:localhost:8800 +-PASS Disallow origin: localhost:8800 +-PASS Disallow origin: http://localhost:8800? +-PASS Disallow origin: http://localhost:8800/ +-PASS Disallow origin: http://localhost:8800 / +-PASS Disallow origin: http://localhost:8800# +-PASS Disallow origin: http://localhost:8800%23 +-PASS Disallow origin: http://localhost:8800:80 +-PASS Disallow origin: http://localhost:8800, * +-PASS Disallow origin: http://localhost:8800\0 +-PASS Disallow origin: HTTP://LOCALHOST:8800 +-PASS Disallow origin: HTTP://localhost:8800 +-PASS Disallow origin: - +-PASS Disallow origin: ** +-PASS Disallow origin: ,* +-PASS Disallow origin: *, +-PASS Disallow origin: \0* +-FAIL Disallow origin: * assert_throws_dom: send function "function () { client.send() }" did not throw +-FAIL Disallow origin: * assert_throws_dom: send function "function () { client.send() }" did not throw +-PASS Disallow origin: *\0 +-FAIL Disallow origin: * assert_throws_dom: send function "function () { client.send() }" did not throw +-FAIL Disallow origin: * assert_throws_dom: send function "function () { client.send() }" did not throw +-PASS Disallow origin: '*' +-PASS Disallow origin: "*" +-PASS Disallow origin: * * +-PASS Disallow origin: * null +-PASS Disallow origin: *http://* +-PASS Disallow origin: *http://localhost:8800 +-PASS Disallow origin: * http://localhost:8800 +-PASS Disallow origin: *, http://localhost:8800 +-PASS Disallow origin: \0http://localhost:8800 +-PASS Disallow origin: null http://localhost:8800 +-PASS Disallow origin: http://example.net +-PASS Disallow origin: null +-PASS Disallow origin: null * +-PASS Disallow origin: +-PASS Disallow origin: http://localhost:8800/cors/origin.htm +-PASS Disallow origin: http://localhost:8800/cors/ +-PASS Disallow origin: http://127.0.0.1:8800/cors/ +-PASS Disallow origin: localhost:8800 +-PASS Disallow origin: .localhost:8800 +-PASS Disallow origin: *.localhost:8800 +-FAIL Disallow origin: http://localhost:8800 assert_throws_dom: send function "function () { client.send() }" did not throw +-PASS Disallow origin: http://.localhost:8800 +-PASS Disallow origin: http://*.localhost:8800 +-PASS Disallow multiple headers (, *) +-PASS Disallow multiple headers (*, ) +-PASS Disallow multiple headers (*, *) +-PASS Disallow multiple headers (, http://localhost:8800) +-PASS Disallow multiple headers (*, http://localhost:8800) +-PASS Disallow multiple headers (http://localhost:8800, http://localhost:8800) +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/css/css-fonts/generic-family-keywords-001-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/css/css-fonts/generic-family-keywords-001-expected.txt +deleted file mode 100644 +index 5166e7f579c7307426a4635a3071046f67e837f4..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/css/css-fonts/generic-family-keywords-001-expected.txt ++++ /dev/null +@@ -1,17 +0,0 @@ +-00000 +-00000 +- +-PASS @font-face matching for quoted and unquoted serif +-PASS @font-face matching for quoted and unquoted sans-serif +-PASS @font-face matching for quoted and unquoted cursive +-PASS @font-face matching for quoted and unquoted fantasy +-PASS @font-face matching for quoted and unquoted monospace +-FAIL @font-face matching for quoted and unquoted system assert_equals: unquoted system does not match @font-face rule expected 25 but got 50 +-FAIL @font-face matching for quoted and unquoted emoji assert_equals: unquoted emoji does not match @font-face rule expected 25 but got 50 +-FAIL @font-face matching for quoted and unquoted math assert_equals: unquoted math does not match @font-face rule expected 25 but got 50 +-FAIL @font-face matching for quoted and unquoted fangsong assert_equals: unquoted fangsong does not match @font-face rule expected 25 but got 50 +-FAIL @font-face matching for quoted and unquoted ui-serif assert_equals: unquoted ui-serif does not match @font-face rule expected 25 but got 50 +-FAIL @font-face matching for quoted and unquoted ui-sans-serif assert_equals: quoted ui-sans-serif matches @font-face rule expected 50 but got 33 +-FAIL @font-face matching for quoted and unquoted ui-monospace assert_equals: unquoted ui-monospace does not match @font-face rule expected 25 but got 50 +-FAIL @font-face matching for quoted and unquoted ui-rounded assert_equals: unquoted ui-rounded does not match @font-face rule expected 25 but got 50 +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/css/css-pseudo/text-selection-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/css/css-pseudo/text-selection-expected.txt +deleted file mode 100644 +index 584d97e9d7f0e2c2842b63835f4129f1180c3ee2..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/css/css-pseudo/text-selection-expected.txt ++++ /dev/null +@@ -1,11 +0,0 @@ +-helloworld +-helloworld +-helloworld +- +-FAIL Selection ending in ::before assert_equals: toString expected "hello" but got "" +-PASS Selection contained in ::before +-FAIL Selection ending in ::marker assert_equals: toString expected "hello" but got "" +-PASS Selection contained in ::marker +-FAIL Selection ending in ::before-marker assert_equals: toString expected "hello" but got "" +-FAIL Selection contained in ::before-marker assert_equals: toString expected "" but got "h" +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/basic/header-value-combining.any-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/basic/header-value-combining.any-expected.txt +deleted file mode 100644 +index 002c1053ce9ddc00ecb48c988434b2b3f60dd98c..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/basic/header-value-combining.any-expected.txt ++++ /dev/null +@@ -1,8 +0,0 @@ +- +-PASS response.headers.get('content-length') expects 0 +-PASS response.headers.get('content-length') expects 0, 0 +-PASS response.headers.get('double-trouble') expects , +-PASS response.headers.get('foo-test') expects 1, 2, 3 +-FAIL response.headers.get('heya') expects , , 1, , , 2 assert_equals: expected ", \v\f, 1, , , 2" but got ", , 1, , , 2" +-PASS response.headers.get('www-authenticate') expects 1, 2, 3, 4 +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/basic/header-value-combining.any.worker-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/basic/header-value-combining.any.worker-expected.txt +deleted file mode 100644 +index 002c1053ce9ddc00ecb48c988434b2b3f60dd98c..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/basic/header-value-combining.any.worker-expected.txt ++++ /dev/null +@@ -1,8 +0,0 @@ +- +-PASS response.headers.get('content-length') expects 0 +-PASS response.headers.get('content-length') expects 0, 0 +-PASS response.headers.get('double-trouble') expects , +-PASS response.headers.get('foo-test') expects 1, 2, 3 +-FAIL response.headers.get('heya') expects , , 1, , , 2 assert_equals: expected ", \v\f, 1, , , 2" but got ", , 1, , , 2" +-PASS response.headers.get('www-authenticate') expects 1, 2, 3, 4 +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any-expected.txt +deleted file mode 100644 +index b9f923713f8272db78ae5959e384ad7551a6e6f1..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any-expected.txt ++++ /dev/null +@@ -1,17 +0,0 @@ +- +-PASS Response.redirected should be false on not-redirected responses +-PASS Redirect 301 with GET +-PASS Redirect 301 with POST +-FAIL Redirect 301 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 302 with GET +-PASS Redirect 302 with POST +-FAIL Redirect 302 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 303 with GET +-PASS Redirect 303 with POST +-FAIL Redirect 303 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 303 with TESTING +-PASS Redirect 307 with GET +-PASS Redirect 307 with POST (string body) +-FAIL Redirect 307 with POST (blob body) assert_equals: Request Content-Type after redirection is NO expected "NO" but got "application/x-www-form-urlencoded" +-FAIL Redirect 307 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any.worker-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any.worker-expected.txt +deleted file mode 100644 +index b9f923713f8272db78ae5959e384ad7551a6e6f1..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/api/redirect/redirect-method.any.worker-expected.txt ++++ /dev/null +@@ -1,17 +0,0 @@ +- +-PASS Response.redirected should be false on not-redirected responses +-PASS Redirect 301 with GET +-PASS Redirect 301 with POST +-FAIL Redirect 301 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 302 with GET +-PASS Redirect 302 with POST +-FAIL Redirect 302 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 303 with GET +-PASS Redirect 303 with POST +-FAIL Redirect 303 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +-PASS Redirect 303 with TESTING +-PASS Redirect 307 with GET +-PASS Redirect 307 with POST (string body) +-FAIL Redirect 307 with POST (blob body) assert_equals: Request Content-Type after redirection is NO expected "NO" but got "application/x-www-form-urlencoded" +-FAIL Redirect 307 with HEAD assert_equals: Request Content-Length after redirection is NO expected "NO" but got "0" +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/content-type/script.window-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/content-type/script.window-expected.txt +deleted file mode 100644 +index e4431cc88654ee7226f3c880efefefa6f046619f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/content-type/script.window-expected.txt ++++ /dev/null +@@ -1,33 +0,0 @@ +- +-PASS Loading JSON… +-PASS separate text/javascript;charset=windows-1252 +-PASS separate text/javascript;";charset=windows-1252 +-FAIL separate text/javascript assert_unreached: Reached unreachable code +-PASS separate "text/javascript" +-PASS separate text/ javascript +-PASS separate text /javascript +-PASS separate x/x text/javascript +-FAIL combined x/x text/javascript assert_unreached: Reached unreachable code +-PASS separate x/x;charset=windows-1252 text/javascript +-FAIL combined x/x;charset=windows-1252 text/javascript assert_unreached: Reached unreachable code +-PASS separate text/javascript x/x +-FAIL combined text/javascript x/x assert_unreached: Reached unreachable code +-FAIL separate text/javascript; charset=windows-1252 text/javascript assert_equals: expected "€" but got "€" +-PASS combined text/javascript; charset=windows-1252 text/javascript +-FAIL separate text/javascript;" x/x assert_unreached: Reached unreachable code +-PASS combined text/javascript;" x/x +-FAIL separate text/javascript assert_unreached: Reached unreachable code +-PASS combined text/javascript +-FAIL separate text/javascript error assert_unreached: Reached unreachable code +-PASS combined text/javascript error +-PASS separate text/javascript;charset=windows-1252 x/x text/javascript +-FAIL combined text/javascript;charset=windows-1252 x/x text/javascript assert_equals: expected "€" but got "€" +-FAIL separate text/javascript;charset=windows-1252 error text/javascript assert_equals: expected "€" but got "€" +-PASS combined text/javascript;charset=windows-1252 error text/javascript +-FAIL separate text/javascript;charset=windows-1252 text/javascript assert_equals: expected "€" but got "€" +-PASS combined text/javascript;charset=windows-1252 text/javascript +-FAIL separate text/javascript;charset=windows-1252;" \" x/x assert_unreached: Reached unreachable code +-PASS combined text/javascript;charset=windows-1252;" \" x/x +-PASS separate x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript +-FAIL combined x/x;" x/y;\" text/javascript;charset=windows-1252;" text/javascript assert_unreached: Reached unreachable code +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/nosniff/parsing-nosniff.window-actual.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/nosniff/parsing-nosniff.window-actual.txt +deleted file mode 100644 +index 3c35544f5c8d4ab8d57831c9181e3509aad3fab7..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/nosniff/parsing-nosniff.window-actual.txt ++++ /dev/null +@@ -1,17 +0,0 @@ +- +-PASS Loading JSON… +-PASS X-Content-Type-Options%3A%20NOSNIFF +-PASS x-content-type-OPTIONS%3A%20nosniff +-PASS X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11! +-PASS X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff +-PASS X-Content-Type-Options%3A%20nosniff%0D%0AX-Content-Type-Options%3A%20no +-PASS X-Content-Type-Options%3A%20no%0D%0AX-Content-Type-Options%3A%20nosniff +-PASS X-Content-Type-Options%3A%0D%0AX-Content-Type-Options%3A%20nosniff +-PASS X-Content-Type-Options%3A%20%2Cnosniff +-FAIL X-Content-Type-Options%3A%20nosniff%0C assert_unreached: Script should have loaded Reached unreachable code +-FAIL X-Content-Type-Options%3A%20nosniff%0B assert_unreached: Script should have loaded Reached unreachable code +-PASS X-Content-Type-Options%3A%20nosniff%0B%2Cnosniff +-PASS X-Content-Type-Options%3A%20'NosniFF' +-PASS X-Content-Type-Options%3A%20%22nosniFF%22 +-PASS Content-Type-Options%3A%20nosniff +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/nosniff/parsing-nosniff.window-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/nosniff/parsing-nosniff.window-expected.txt +deleted file mode 100644 +index 63e5ab6ca229a1c31f34ff616f13c3331b0d128f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/fetch/nosniff/parsing-nosniff.window-expected.txt ++++ /dev/null +@@ -1,17 +0,0 @@ +- +-PASS Loading JSON… +-PASS X-Content-Type-Options%3A%20NOSNIFF +-PASS x-content-type-OPTIONS%3A%20nosniff +-PASS X-Content-Type-Options%3A%20nosniff%2C%2C%40%23%24%23%25%25%26%5E%26%5E*()()11! +-PASS X-Content-Type-Options%3A%20%40%23%24%23%25%25%26%5E%26%5E*()()11!%2Cnosniff +-PASS X-Content-Type-Options%3A%20nosniff%0D%0AX-Content-Type-Options%3A%20no +-PASS X-Content-Type-Options%3A%20no%0D%0AX-Content-Type-Options%3A%20nosniff +-PASS X-Content-Type-Options%3A%0D%0AX-Content-Type-Options%3A%20nosniff +-PASS X-Content-Type-Options%3A%20%2Cnosniff +-FAIL X-Content-Type-Options%3A%20nosniff%0C assert_unreached: Script should have loaded Reached unreachable code +-FAIL X-Content-Type-Options%3A%20nosniff%0B assert_unreached: Script should have loaded Reached unreachable code +-PASS X-Content-Type-Options%3A%20nosniff%0B%2Cnosniff +-PASS X-Content-Type-Options%3A%20'NosniFF' +-PASS X-Content-Type-Options%3A%20%22nosniFF%22 +-PASS Content-Type-Options%3A%20nosniff +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/mathml/relations/css-styling/ignored-properties-001-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/mathml/relations/css-styling/ignored-properties-001-expected.txt +deleted file mode 100644 +index 897c5d0b47d35487bac2bbd67be11b3f87aee914..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/mathml/relations/css-styling/ignored-properties-001-expected.txt ++++ /dev/null +@@ -1,300 +0,0 @@ +- +-PASS maction preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL maction layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 1) expected -88.3125 +/- 1 but got -15 +-PASS maction preferred width calculation is not affected by white-space: normal; +-FAIL maction layout is not affected by white-space: normal; assert_approx_equals: inline position (child 1) expected -88.3125 +/- 1 but got -8 +-PASS maction preferred width calculation is not affected by float: right; +-FAIL maction layout is not affected by float: right; assert_approx_equals: inline position (child 1) expected -88.3125 +/- 1 but got -8 +-PASS maction preferred width calculation is not affected by align-content: end; justify-content: end; +-FAIL maction layout is not affected by align-content: end; justify-content: end; assert_approx_equals: inline position (child 1) expected -88.3125 +/- 1 but got -8 +-PASS maction preferred width calculation is not affected by align-self: end; justify-self: end; +-FAIL maction layout is not affected by align-self: end; justify-self: end; assert_approx_equals: inline position (child 1) expected -88.3125 +/- 1 but got -8 +-PASS maction preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL maction layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: block size expected 7.21875 +/- 1 but got 200 +-PASS menclose preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL menclose layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 0) expected 7.96875 +/- 1 but got 3.984375 +-PASS menclose preferred width calculation is not affected by white-space: normal; +-PASS menclose layout is not affected by white-space: normal; +-PASS menclose preferred width calculation is not affected by float: right; +-PASS menclose layout is not affected by float: right; +-PASS menclose preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS menclose layout is not affected by align-content: end; justify-content: end; +-PASS menclose preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS menclose layout is not affected by align-self: end; justify-self: end; +-PASS menclose preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS menclose layout is not affected by width: 100px !important; height: 200px !important; +-PASS merror preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL merror layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 1) expected 9.03125 +/- 1 but got 0 +-PASS merror preferred width calculation is not affected by white-space: normal; +-PASS merror layout is not affected by white-space: normal; +-PASS merror preferred width calculation is not affected by float: right; +-PASS merror layout is not affected by float: right; +-PASS merror preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS merror layout is not affected by align-content: end; justify-content: end; +-PASS merror preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS merror layout is not affected by align-self: end; justify-self: end; +-PASS merror preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL merror layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: block size expected 7.21875 +/- 1 but got 200 +-PASS mfrac preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mfrac layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 1) expected 0 +/- 1 but got 9.59375 +-PASS mfrac preferred width calculation is not affected by white-space: normal; +-PASS mfrac layout is not affected by white-space: normal; +-PASS mfrac preferred width calculation is not affected by float: right; +-PASS mfrac layout is not affected by float: right; +-PASS mfrac preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mfrac layout is not affected by align-content: end; justify-content: end; +-PASS mfrac preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mfrac layout is not affected by align-self: end; justify-self: end; +-PASS mfrac preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS mfrac layout is not affected by width: 100px !important; height: 200px !important; +-PASS mi preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mi layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline size expected 9 +/- 1 but got 71.046875 +-PASS mi preferred width calculation is not affected by white-space: normal; +-PASS mi layout is not affected by white-space: normal; +-PASS mi preferred width calculation is not affected by float: right; +-PASS mi layout is not affected by float: right; +-PASS mi preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mi layout is not affected by align-content: end; justify-content: end; +-PASS mi preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mi layout is not affected by align-self: end; justify-self: end; +-PASS mi preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL mi layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: inline size expected 72.640625 +/- 1 but got 101.59375 +-PASS mmultiscripts preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mmultiscripts layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 0) expected 0 +/- 1 but got 5.1875 +-PASS mmultiscripts preferred width calculation is not affected by white-space: normal; +-PASS mmultiscripts layout is not affected by white-space: normal; +-PASS mmultiscripts preferred width calculation is not affected by float: right; +-PASS mmultiscripts layout is not affected by float: right; +-PASS mmultiscripts preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mmultiscripts layout is not affected by align-content: end; justify-content: end; +-PASS mmultiscripts preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mmultiscripts layout is not affected by align-self: end; justify-self: end; +-PASS mmultiscripts preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS mmultiscripts layout is not affected by width: 100px !important; height: 200px !important; +-PASS mn preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mn layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline size expected 9 +/- 1 but got 71.046875 +-PASS mn preferred width calculation is not affected by white-space: normal; +-PASS mn layout is not affected by white-space: normal; +-PASS mn preferred width calculation is not affected by float: right; +-PASS mn layout is not affected by float: right; +-PASS mn preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mn layout is not affected by align-content: end; justify-content: end; +-PASS mn preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mn layout is not affected by align-self: end; justify-self: end; +-PASS mn preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL mn layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: inline size expected 71.046875 +/- 1 but got 100 +-PASS mo preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mo layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline size expected 9 +/- 1 but got 71.046875 +-PASS mo preferred width calculation is not affected by white-space: normal; +-PASS mo layout is not affected by white-space: normal; +-PASS mo preferred width calculation is not affected by float: right; +-PASS mo layout is not affected by float: right; +-PASS mo preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mo layout is not affected by align-content: end; justify-content: end; +-PASS mo preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mo layout is not affected by align-self: end; justify-self: end; +-PASS mo preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL mo layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: inline size expected 79.921875 +/- 1 but got 100 +-PASS mover preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mover layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 0) expected 0 +/- 1 but got 8.609375 +-PASS mover preferred width calculation is not affected by white-space: normal; +-PASS mover layout is not affected by white-space: normal; +-PASS mover preferred width calculation is not affected by float: right; +-PASS mover layout is not affected by float: right; +-PASS mover preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mover layout is not affected by align-content: end; justify-content: end; +-PASS mover preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mover layout is not affected by align-self: end; justify-self: end; +-PASS mover preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS mover layout is not affected by width: 100px !important; height: 200px !important; +-PASS mpadded preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mpadded layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 1) expected 8.03125 +/- 1 but got 0 +-PASS mpadded preferred width calculation is not affected by white-space: normal; +-PASS mpadded layout is not affected by white-space: normal; +-PASS mpadded preferred width calculation is not affected by float: right; +-PASS mpadded layout is not affected by float: right; +-PASS mpadded preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mpadded layout is not affected by align-content: end; justify-content: end; +-PASS mpadded preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mpadded layout is not affected by align-self: end; justify-self: end; +-PASS mpadded preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS mpadded layout is not affected by width: 100px !important; height: 200px !important; +-PASS mphantom preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mphantom layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 1) expected 8.03125 +/- 1 but got 0 +-PASS mphantom preferred width calculation is not affected by white-space: normal; +-PASS mphantom layout is not affected by white-space: normal; +-PASS mphantom preferred width calculation is not affected by float: right; +-PASS mphantom layout is not affected by float: right; +-PASS mphantom preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mphantom layout is not affected by align-content: end; justify-content: end; +-PASS mphantom preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mphantom layout is not affected by align-self: end; justify-self: end; +-PASS mphantom preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL mphantom layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: block size expected 7.21875 +/- 1 but got 200 +-PASS mroot preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mroot layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline size expected 20.515625 +/- 1 but got 9.796875 +-PASS mroot preferred width calculation is not affected by white-space: normal; +-PASS mroot layout is not affected by white-space: normal; +-PASS mroot preferred width calculation is not affected by float: right; +-PASS mroot layout is not affected by float: right; +-PASS mroot preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mroot layout is not affected by align-content: end; justify-content: end; +-PASS mroot preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mroot layout is not affected by align-self: end; justify-self: end; +-PASS mroot preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS mroot layout is not affected by width: 100px !important; height: 200px !important; +-PASS mrow preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mrow layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 1) expected 8.03125 +/- 1 but got 0 +-PASS mrow preferred width calculation is not affected by white-space: normal; +-PASS mrow layout is not affected by white-space: normal; +-PASS mrow preferred width calculation is not affected by float: right; +-PASS mrow layout is not affected by float: right; +-PASS mrow preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mrow layout is not affected by align-content: end; justify-content: end; +-PASS mrow preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mrow layout is not affected by align-self: end; justify-self: end; +-PASS mrow preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL mrow layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: block size expected 7.21875 +/- 1 but got 200 +-PASS ms preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL ms layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline size expected 9 +/- 1 but got 71.046875 +-PASS ms preferred width calculation is not affected by white-space: normal; +-PASS ms layout is not affected by white-space: normal; +-PASS ms preferred width calculation is not affected by float: right; +-PASS ms layout is not affected by float: right; +-PASS ms preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS ms layout is not affected by align-content: end; justify-content: end; +-PASS ms preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS ms layout is not affected by align-self: end; justify-self: end; +-PASS ms preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL ms layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: inline size expected 71.046875 +/- 1 but got 100 +-PASS mspace preferred width calculation is not affected by writing-mode: vertical-rl; +-PASS mspace layout is not affected by writing-mode: vertical-rl; +-PASS mspace preferred width calculation is not affected by white-space: normal; +-PASS mspace layout is not affected by white-space: normal; +-PASS mspace preferred width calculation is not affected by float: right; +-PASS mspace layout is not affected by float: right; +-PASS mspace preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mspace layout is not affected by align-content: end; justify-content: end; +-PASS mspace preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mspace layout is not affected by align-self: end; justify-self: end; +-PASS mspace preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS mspace layout is not affected by width: 100px !important; height: 200px !important; +-PASS msqrt preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL msqrt layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline size expected 19.71875 +/- 1 but got 9 +-PASS msqrt preferred width calculation is not affected by white-space: normal; +-PASS msqrt layout is not affected by white-space: normal; +-PASS msqrt preferred width calculation is not affected by float: right; +-PASS msqrt layout is not affected by float: right; +-PASS msqrt preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS msqrt layout is not affected by align-content: end; justify-content: end; +-PASS msqrt preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS msqrt layout is not affected by align-self: end; justify-self: end; +-PASS msqrt preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS msqrt layout is not affected by width: 100px !important; height: 200px !important; +-PASS mstyle preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mstyle layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 1) expected 8.03125 +/- 1 but got 0 +-PASS mstyle preferred width calculation is not affected by white-space: normal; +-PASS mstyle layout is not affected by white-space: normal; +-PASS mstyle preferred width calculation is not affected by float: right; +-PASS mstyle layout is not affected by float: right; +-PASS mstyle preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mstyle layout is not affected by align-content: end; justify-content: end; +-PASS mstyle preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mstyle layout is not affected by align-self: end; justify-self: end; +-PASS mstyle preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL mstyle layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: block size expected 7.21875 +/- 1 but got 200 +-PASS msub preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL msub layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 1) expected 80.3125 +/- 1 but got 5.8125 +-PASS msub preferred width calculation is not affected by white-space: normal; +-PASS msub layout is not affected by white-space: normal; +-PASS msub preferred width calculation is not affected by float: right; +-PASS msub layout is not affected by float: right; +-PASS msub preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS msub layout is not affected by align-content: end; justify-content: end; +-PASS msub preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS msub layout is not affected by align-self: end; justify-self: end; +-PASS msub preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS msub layout is not affected by width: 100px !important; height: 200px !important; +-PASS msubsup preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL msubsup layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 0) expected 0 +/- 1 but got 5.1875 +-PASS msubsup preferred width calculation is not affected by white-space: normal; +-PASS msubsup layout is not affected by white-space: normal; +-PASS msubsup preferred width calculation is not affected by float: right; +-PASS msubsup layout is not affected by float: right; +-PASS msubsup preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS msubsup layout is not affected by align-content: end; justify-content: end; +-PASS msubsup preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS msubsup layout is not affected by align-self: end; justify-self: end; +-PASS msubsup preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS msubsup layout is not affected by width: 100px !important; height: 200px !important; +-PASS msup preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL msup layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 0) expected 0 +/- 1 but got 5.1875 +-PASS msup preferred width calculation is not affected by white-space: normal; +-PASS msup layout is not affected by white-space: normal; +-PASS msup preferred width calculation is not affected by float: right; +-PASS msup layout is not affected by float: right; +-PASS msup preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS msup layout is not affected by align-content: end; justify-content: end; +-PASS msup preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS msup layout is not affected by align-self: end; justify-self: end; +-PASS msup preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS msup layout is not affected by width: 100px !important; height: 200px !important; +-PASS mtable preferred width calculation is not affected by writing-mode: vertical-rl; +-PASS mtable layout is not affected by writing-mode: vertical-rl; +-PASS mtable preferred width calculation is not affected by white-space: normal; +-PASS mtable layout is not affected by white-space: normal; +-PASS mtable preferred width calculation is not affected by float: right; +-PASS mtable layout is not affected by float: right; +-PASS mtable preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mtable layout is not affected by align-content: end; justify-content: end; +-PASS mtable preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mtable layout is not affected by align-self: end; justify-self: end; +-PASS mtext preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL mtext layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline size expected 9 +/- 1 but got 71.046875 +-PASS mtext preferred width calculation is not affected by white-space: normal; +-PASS mtext layout is not affected by white-space: normal; +-PASS mtext preferred width calculation is not affected by float: right; +-PASS mtext layout is not affected by float: right; +-PASS mtext preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS mtext layout is not affected by align-content: end; justify-content: end; +-PASS mtext preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS mtext layout is not affected by align-self: end; justify-self: end; +-PASS mtext preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL mtext layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: inline size expected 71.046875 +/- 1 but got 100 +-PASS munder preferred width calculation is not affected by writing-mode: vertical-rl; +-PASS munder layout is not affected by writing-mode: vertical-rl; +-PASS munder preferred width calculation is not affected by white-space: normal; +-PASS munder layout is not affected by white-space: normal; +-PASS munder preferred width calculation is not affected by float: right; +-PASS munder layout is not affected by float: right; +-PASS munder preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS munder layout is not affected by align-content: end; justify-content: end; +-PASS munder preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS munder layout is not affected by align-self: end; justify-self: end; +-PASS munder preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS munder layout is not affected by width: 100px !important; height: 200px !important; +-PASS munderover preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL munderover layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 0) expected 0 +/- 1 but got 8.609375 +-PASS munderover preferred width calculation is not affected by white-space: normal; +-PASS munderover layout is not affected by white-space: normal; +-PASS munderover preferred width calculation is not affected by float: right; +-PASS munderover layout is not affected by float: right; +-PASS munderover preferred width calculation is not affected by align-content: end; justify-content: end; +-PASS munderover layout is not affected by align-content: end; justify-content: end; +-PASS munderover preferred width calculation is not affected by align-self: end; justify-self: end; +-PASS munderover layout is not affected by align-self: end; justify-self: end; +-PASS munderover preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-PASS munderover layout is not affected by width: 100px !important; height: 200px !important; +-PASS semantics preferred width calculation is not affected by writing-mode: vertical-rl; +-FAIL semantics layout is not affected by writing-mode: vertical-rl; assert_approx_equals: inline position (child 1) expected -88.3125 +/- 1 but got -15 +-PASS semantics preferred width calculation is not affected by white-space: normal; +-FAIL semantics layout is not affected by white-space: normal; assert_approx_equals: inline position (child 1) expected -88.3125 +/- 1 but got -8 +-PASS semantics preferred width calculation is not affected by float: right; +-FAIL semantics layout is not affected by float: right; assert_approx_equals: inline position (child 1) expected -88.3125 +/- 1 but got -8 +-PASS semantics preferred width calculation is not affected by align-content: end; justify-content: end; +-FAIL semantics layout is not affected by align-content: end; justify-content: end; assert_approx_equals: inline position (child 1) expected -88.3125 +/- 1 but got -8 +-PASS semantics preferred width calculation is not affected by align-self: end; justify-self: end; +-FAIL semantics layout is not affected by align-self: end; justify-self: end; assert_approx_equals: inline position (child 1) expected -88.3125 +/- 1 but got -8 +-PASS semantics preferred width calculation is not affected by width: 100px !important; height: 200px !important; +-FAIL semantics layout is not affected by width: 100px !important; height: 200px !important; assert_approx_equals: block size expected 7.21875 +/- 1 but got 200 +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/mathml/relations/css-styling/padding-border-margin/padding-002-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/mathml/relations/css-styling/padding-border-margin/padding-002-expected.txt +deleted file mode 100644 +index 172ba71695fcb6f713b06c83e8eabee72ce48d5e..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/mathml/relations/css-styling/padding-border-margin/padding-002-expected.txt ++++ /dev/null +@@ -1,51 +0,0 @@ +- +-PASS Padding properties on maction +-PASS Padding properties on maction (rtl) +-FAIL Padding properties on menclose assert_approx_equals: bottom padding expected 60 +/- 1 but got -4.1875 +-FAIL Padding properties on menclose (rtl) assert_approx_equals: bottom padding expected 60 +/- 1 but got -4.1875 +-PASS Padding properties on merror +-PASS Padding properties on merror (rtl) +-FAIL Padding properties on mfrac assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on mfrac (rtl) assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on mi assert_approx_equals: right padding expected 40 +/- 1 but got 38.406253814697266 +-FAIL Padding properties on mi (rtl) assert_approx_equals: right padding expected 40 +/- 1 but got 38.406253814697266 +-FAIL Padding properties on mmultiscripts assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on mmultiscripts (rtl) assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-PASS Padding properties on mn +-PASS Padding properties on mn (rtl) +-PASS Padding properties on mo +-PASS Padding properties on mo (rtl) +-FAIL Padding properties on mover assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on mover (rtl) assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on mpadded assert_approx_equals: bottom padding expected 60 +/- 1 but got -0.21875 +-FAIL Padding properties on mpadded (rtl) assert_approx_equals: bottom padding expected 60 +/- 1 but got -0.21875 +-PASS Padding properties on mphantom +-PASS Padding properties on mphantom (rtl) +-FAIL Padding properties on mroot assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on mroot (rtl) assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-PASS Padding properties on mrow +-PASS Padding properties on mrow (rtl) +-PASS Padding properties on ms +-PASS Padding properties on ms (rtl) +-FAIL Padding properties on mspace assert_approx_equals: left/right padding expected 70 +/- 1 but got 0 +-FAIL Padding properties on msqrt assert_approx_equals: bottom padding expected 60 +/- 1 but got -10.71875 +-FAIL Padding properties on msqrt (rtl) assert_approx_equals: bottom padding expected 60 +/- 1 but got -10.71875 +-PASS Padding properties on mstyle +-PASS Padding properties on mstyle (rtl) +-FAIL Padding properties on msub assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on msub (rtl) assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on msubsup assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on msubsup (rtl) assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on msup assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on msup (rtl) assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-PASS Padding properties on mtable +-PASS Padding properties on mtable (rtl) +-PASS Padding properties on mtext +-PASS Padding properties on mtext (rtl) +-FAIL Padding properties on munder assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on munder (rtl) assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on munderover assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-FAIL Padding properties on munderover (rtl) assert_approx_equals: left padding expected 30 +/- 1 but got 0 +-PASS Padding properties on semantics +-PASS Padding properties on semantics (rtl) +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getallresponseheaders-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getallresponseheaders-expected.txt +deleted file mode 100644 +index 887549c0706149eddbb1e8549a86a7a9d648a50b..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getallresponseheaders-expected.txt ++++ /dev/null +@@ -1,9 +0,0 @@ +- +-PASS XMLHttpRequest: getAllResponseHeaders() +-PASS XMLHttpRequest: getAllResponseHeaders() 1 +-PASS XMLHttpRequest: getAllResponseHeaders() 2 +-PASS XMLHttpRequest: getAllResponseHeaders() 3 +-PASS XMLHttpRequest: getAllResponseHeaders() 4 +-FAIL XMLHttpRequest: getAllResponseHeaders() 5 assert_equals: expected "heya: , \v\f, 1, , , 2\r\n" but got "heya: , , 1, , , 2\r\n" +-PASS XMLHttpRequest: getAllResponseHeaders() 6 +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getresponseheader.any-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getresponseheader.any-expected.txt +deleted file mode 100644 +index 848d1736d56a21daf2847d66d587541d23f01115..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getresponseheader.any-expected.txt ++++ /dev/null +@@ -1,8 +0,0 @@ +- +-PASS getResponseHeader('content-length') expects 0 +-PASS getResponseHeader('content-length') expects 0, 0 +-PASS getResponseHeader('double-trouble') expects , +-PASS getResponseHeader('foo-test') expects 1, 2, 3 +-FAIL getResponseHeader('heya') expects , , 1, , , 2 assert_equals: expected ", \v\f, 1, , , 2" but got ", , 1, , , 2" +-PASS getResponseHeader('www-authenticate') expects 1, 2, 3, 4 +- +diff --git a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getresponseheader.any.worker-expected.txt b/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getresponseheader.any.worker-expected.txt +deleted file mode 100644 +index 848d1736d56a21daf2847d66d587541d23f01115..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/imported/w3c/web-platform-tests/xhr/getresponseheader.any.worker-expected.txt ++++ /dev/null +@@ -1,8 +0,0 @@ +- +-PASS getResponseHeader('content-length') expects 0 +-PASS getResponseHeader('content-length') expects 0, 0 +-PASS getResponseHeader('double-trouble') expects , +-PASS getResponseHeader('foo-test') expects 1, 2, 3 +-FAIL getResponseHeader('heya') expects , , 1, , , 2 assert_equals: expected ", \v\f, 1, , , 2" but got ", , 1, , , 2" +-PASS getResponseHeader('www-authenticate') expects 1, 2, 3, 4 +- +diff --git a/LayoutTests/platform/mac-mojave/platform/mac/fast/text/international/bidi-fallback-font-weight-expected.txt b/LayoutTests/platform/mac-mojave/platform/mac/fast/text/international/bidi-fallback-font-weight-expected.txt +deleted file mode 100644 +index b9161c61f4da0240d89a724414ed8e922442307f..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/platform/mac/fast/text/international/bidi-fallback-font-weight-expected.txt ++++ /dev/null +@@ -1,41 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x173 +- RenderBlock {HTML} at (0,0) size 800x173 +- RenderBody {BODY} at (8,16) size 784x141 +- RenderBlock {P} at (0,0) size 784x37 +- RenderText {#text} at (0,1) size 777x36 +- text run at (0,1) width 318: "In each of the following lines, the Hebrew letters " +- text run at (317,1) width 35 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- text run at (351,1) width 426: " in the end should be in boldface (compare with the same letters in" +- text run at (0,19) width 147: "the middle of the line)." +- RenderBlock {P} at (0,53) size 784x18 +- RenderText {#text} at (0,0) size 82x18 +- text run at (0,0) width 43: "abcd " +- text run at (42,0) width 35 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- text run at (76,0) width 6: " " +- RenderInline {B} at (0,0) size 82x18 +- RenderText {#text} at (81,0) size 82x18 +- text run at (81,0) width 45: "abcd " +- text run at (125,0) width 38 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,87) size 784x19 +- RenderText {#text} at (0,1) size 92x18 +- text run at (0,1) width 49: "abcd " +- text run at (48,1) width 35 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- text run at (82,1) width 10: " " +- RenderInline {B} at (0,0) size 86x18 +- RenderText {#text} at (91,1) size 86x18 +- text run at (91,1) width 49: "abcd " +- text run at (139,1) width 38 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,122) size 784x19 +- RenderText {#text} at (0,1) size 73x18 +- text run at (0,1) width 35: "abcd " +- text run at (34,1) width 35 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- text run at (68,1) width 5: " " +- RenderInline {B} at (0,0) size 74x18 +- RenderText {#text} at (72,1) size 74x18 +- text run at (72,1) width 38: "abcd " +- text run at (109,1) width 37 RTL: "\x{5D0}\x{5D1}\x{5D2}\x{5D3}" +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/svg/W3C-SVG-1.1/animate-elem-46-t-expected.txt b/LayoutTests/platform/mac-mojave/svg/W3C-SVG-1.1/animate-elem-46-t-expected.txt +deleted file mode 100644 +index 25719de9fad784ef42b9ac8ebd820d214a56c43a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/svg/W3C-SVG-1.1/animate-elem-46-t-expected.txt ++++ /dev/null +@@ -1,332 +0,0 @@ +-layer at (0,0) size 480x360 +- RenderView at (0,0) size 480x360 +-layer at (0,0) size 480x360 +- RenderSVGRoot {svg} at (0,0) size 480x360 +- RenderSVGContainer {g} at (39,60) size 423x193 [transform={m=((1.00,0.00)(0.00,1.00)) t=(80.00,80.00)}] +- RenderSVGContainer {g} at (39,92) size 66x157 [transform={m=((1.00,0.00)(0.00,1.00)) t=(20.00,10.00)}] +- RenderSVGText {text} at (-59,2) size 64x17 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 64x16 +- chunk 1 (end anchor) text run 1 at (-58.75,15.00) startOffset 0 endOffset 11 width 63.75: "text-anchor" +- RenderSVGText {text} at (-44,37) size 49x17 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 49x16 +- chunk 1 (end anchor) text run 1 at (-43.98,50.00) startOffset 0 endOffset 9 width 48.98: "font-size" +- RenderSVGText {text} at (-59,72) size 64x17 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 64x16 +- chunk 1 (end anchor) text run 1 at (-58.76,85.00) startOffset 0 endOffset 11 width 63.76: "font-family" +- RenderSVGText {text} at (-49,107) size 54x17 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 54x16 +- chunk 1 (end anchor) text run 1 at (-48.66,120.00) startOffset 0 endOffset 10 width 53.66: "font-style" +- RenderSVGText {text} at (-61,142) size 66x17 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 66x16 +- chunk 1 (end anchor) text run 1 at (-60.32,155.00) startOffset 0 endOffset 11 width 65.32: "font-weight" +- RenderSVGContainer {g} at (171,60) size 261x17 [transform={m=((1.00,0.00)(0.00,1.00)) t=(90.00,-10.00)}] +- RenderSVGText {text} at (1,-10) size 38x17 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 37x16 +- chunk 1 (middle anchor) text run 1 at (1.61,3.00) startOffset 0 endOffset 6 width 36.78: "" +- RenderSVGText {text} at (123,-10) size 24x17 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 23x16 +- chunk 1 (middle anchor) text run 1 at (123.60,3.00) startOffset 0 endOffset 3 width 22.79: "" +- RenderSVGText {text} at (238,-10) size 23x17 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 23x16 +- chunk 1 (middle anchor) text run 1 at (239.00,3.00) startOffset 0 endOffset 3 width 22.00: "" +- RenderSVGContainer {g} at (138,77) size 324x176 [transform={m=((1.00,0.00)(0.00,1.00)) t=(80.00,5.00)}] +- RenderSVGContainer {g} at (138,77) size 324x36 +- RenderSVGHiddenContainer {defs} at (0,0) size 0x0 +- RenderSVGContainer {g} at (138,77) size 104x36 +- RenderSVGText {text} at (-22,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (end anchor) text run 1 at (-21.67,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (158,103) size 4x4 [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGText {text} at (-11,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (middle anchor) text run 1 at (-10.83,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (188,103) size 4x4 [transform={m=((1.00,0.00)(0.00,1.00)) t=(30.00,0.00)}] [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (218,103) size 4x4 [transform={m=((1.00,0.00)(0.00,1.00)) t=(60.00,0.00)}] [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGRect {rect} at (158,103) size 4x4 [fill={[type=SOLID] [color=#CC0066]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGContainer {use} at (138,77) size 104x36 +- RenderSVGContainer {g} at (138,77) size 104x36 +- RenderSVGText {text} at (-22,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (end anchor) text run 1 at (-21.67,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (158,103) size 4x4 [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGText {text} at (-11,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (middle anchor) text run 1 at (-10.83,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (188,103) size 4x4 [transform={m=((1.00,0.00)(0.00,1.00)) t=(30.00,0.00)}] [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (218,103) size 4x4 [transform={m=((1.00,0.00)(0.00,1.00)) t=(60.00,0.00)}] [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGRect {rect} at (158,103) size 4x4 [fill={[type=SOLID] [color=#CC0066]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGContainer {use} at (248,77) size 104x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,0.00)}] +- RenderSVGContainer {g} at (248,77) size 104x36 +- RenderSVGText {text} at (-22,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (end anchor) text run 1 at (-21.67,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (268,103) size 4x4 [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGText {text} at (-11,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (middle anchor) text run 1 at (-10.83,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (298,103) size 4x4 [transform={m=((1.00,0.00)(0.00,1.00)) t=(30.00,0.00)}] [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (328,103) size 4x4 [transform={m=((1.00,0.00)(0.00,1.00)) t=(60.00,0.00)}] [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGRect {rect} at (268,103) size 4x4 [fill={[type=SOLID] [color=#CC0066]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGContainer {use} at (358,77) size 104x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(220.00,0.00)}] +- RenderSVGContainer {g} at (358,77) size 104x36 +- RenderSVGText {text} at (-22,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (end anchor) text run 1 at (-21.67,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (378,103) size 4x4 [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGText {text} at (-11,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (middle anchor) text run 1 at (-10.83,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (408,103) size 4x4 [transform={m=((1.00,0.00)(0.00,1.00)) t=(30.00,0.00)}] [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGRect {rect} at (438,103) size 4x4 [transform={m=((1.00,0.00)(0.00,1.00)) t=(60.00,0.00)}] [fill={[type=SOLID] [color=#AAAAAA]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGRect {rect} at (378,103) size 4x4 [fill={[type=SOLID] [color=#CC0066]}] [x=-2.00] [y=18.00] [width=4.00] [height=4.00] +- RenderSVGText {text} at (-22,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (end anchor) text run 1 at (-21.67,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {g} at (248,77) size 22x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,0.00)}] +- RenderSVGText {text} at (-22,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (end anchor) text run 1 at (-21.67,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {a} at (358,77) size 22x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(220.00,0.00)}] +- RenderSVGText {text} at (-22,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 (end anchor) text run 1 at (-21.67,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {g} at (160,112) size 302x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,35.00)}] +- RenderSVGHiddenContainer {defs} at (0,0) size 0x0 +- RenderSVGContainer {g} at (160,112) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (0,9) size 9x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 9x14 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 8.67: "A" +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (160,112) size 82x36 +- RenderSVGContainer {g} at (160,112) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (0,9) size 9x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 9x14 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 8.67: "A" +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (270,112) size 82x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,0.00)}] +- RenderSVGContainer {g} at (270,112) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (0,9) size 9x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 9x14 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 8.67: "A" +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (380,112) size 82x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(220.00,0.00)}] +- RenderSVGContainer {g} at (380,112) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (0,9) size 9x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 9x14 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 8.67: "A" +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {g} at (270,112) size 22x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,0.00)}] +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {a} at (380,112) size 22x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(220.00,0.00)}] +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {g} at (160,146) size 302x37 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,70.00)}] +- RenderSVGHiddenContainer {defs} at (0,0) size 0x0 +- RenderSVGContainer {g} at (160,146) size 82x37 +- RenderSVGText {text} at (0,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (60,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (160,146) size 82x37 +- RenderSVGContainer {g} at (160,146) size 82x37 +- RenderSVGText {text} at (0,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (60,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (270,146) size 82x37 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,0.00)}] +- RenderSVGContainer {g} at (270,146) size 82x37 +- RenderSVGText {text} at (0,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (60,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (380,146) size 82x37 [transform={m=((1.00,0.00)(0.00,1.00)) t=(220.00,0.00)}] +- RenderSVGContainer {g} at (380,146) size 82x37 +- RenderSVGText {text} at (0,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (60,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (0,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {g} at (270,146) size 22x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,0.00)}] +- RenderSVGText {text} at (0,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {a} at (380,146) size 22x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(220.00,0.00)}] +- RenderSVGText {text} at (0,-9) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {g} at (160,182) size 302x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,105.00)}] +- RenderSVGHiddenContainer {defs} at (0,0) size 0x0 +- RenderSVGContainer {g} at (160,182) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 20x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 20x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 19.33: "A" +- RenderSVGText {text} at (60,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (160,182) size 82x36 +- RenderSVGContainer {g} at (160,182) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 20x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 20x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 19.33: "A" +- RenderSVGText {text} at (60,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (270,182) size 82x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,0.00)}] +- RenderSVGContainer {g} at (270,182) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 20x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 20x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 19.33: "A" +- RenderSVGText {text} at (60,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (380,182) size 82x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(220.00,0.00)}] +- RenderSVGContainer {g} at (380,182) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 20x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 20x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 19.33: "A" +- RenderSVGText {text} at (60,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {g} at (270,182) size 22x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,0.00)}] +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {a} at (380,182) size 22x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(220.00,0.00)}] +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {g} at (160,217) size 302x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,140.00)}] +- RenderSVGHiddenContainer {defs} at (0,0) size 0x0 +- RenderSVGContainer {g} at (160,217) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (60,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (160,217) size 82x36 +- RenderSVGContainer {g} at (160,217) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (60,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (270,217) size 82x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,0.00)}] +- RenderSVGContainer {g} at (270,217) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (60,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {use} at (380,217) size 82x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(220.00,0.00)}] +- RenderSVGContainer {g} at (380,217) size 82x36 +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (30,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (30.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (60,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (60.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {g} at (270,217) size 22x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(110.00,0.00)}] +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGContainer {g} at (380,217) size 22x36 [transform={m=((1.00,0.00)(0.00,1.00)) t=(220.00,0.00)}] +- RenderSVGText {text} at (0,-8) size 22x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 22x35 +- chunk 1 text run 1 at (0.00,20.00) startOffset 0 endOffset 1 width 21.67: "A" +- RenderSVGText {text} at (10,304) size 264x46 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 264x46 +- chunk 1 text run 1 at (10.00,340.00) startOffset 0 endOffset 16 width 263.34: "$Revision: 1.8 $" +- RenderSVGRect {rect} at (0,0) size 480x360 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=478.00] [height=358.00] +diff --git a/LayoutTests/platform/mac-mojave/svg/W3C-SVG-1.1/struct-use-01-t-expected.txt b/LayoutTests/platform/mac-mojave/svg/W3C-SVG-1.1/struct-use-01-t-expected.txt +deleted file mode 100644 +index fc19d72e263c460c4d260e5a0b6683931a2d82a6..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/svg/W3C-SVG-1.1/struct-use-01-t-expected.txt ++++ /dev/null +@@ -1,91 +0,0 @@ +-layer at (0,0) size 480x360 +- RenderView at (0,0) size 480x360 +-layer at (0,0) size 480x360 +- RenderSVGRoot {svg} at (0,0) size 480x360 +- RenderSVGContainer {g} at (41,22) size 309x270 +- RenderSVGHiddenContainer {defs} at (0,0) size 0x0 +- RenderSVGContainer {g} at (0,0) size 33x22 +- RenderSVGRect {rect} at (0,0) size 22x22 [stroke={[type=SOLID] [color=#FFFF00] [stroke width=3.00]}] [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=20.00] [height=20.00] +- RenderSVGEllipse {circle} at (0,0) size 22x22 [stroke={[type=SOLID] [color=#FFFF00] [stroke width=3.00]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=10.00] [cy=10.00] [r=10.00] +- RenderSVGEllipse {ellipse} at (0,0) size 22x22 [stroke={[type=SOLID] [color=#FFFF00] [stroke width=3.00]}] [fill={[type=SOLID] [color=#FF0000]}] [cx=10.00] [cy=10.00] [rx=10.00] [ry=10.00] +- RenderSVGPath {line} at (0,8) size 20x4 [stroke={[type=SOLID] [color=#FFFF00] [stroke width=3.00]}] [fill={[type=SOLID] [color=#FF0000]}] [x1=0.00] [y1=10.00] [x2=20.00] [y2=10.00] +- RenderSVGPath {path} at (0,0) size 22x22 [stroke={[type=SOLID] [color=#FFFF00] [stroke width=3.00]}] [fill={[type=SOLID] [color=#FF0000]}] [data="M 0 0 L 20 0 L 20 20 L 0 20 Z"] +- RenderSVGPath {polygon} at (0,0) size 22x22 [stroke={[type=SOLID] [color=#FFFF00] [stroke width=3.00]}] [fill={[type=SOLID] [color=#FF0000]}] [points="0 0 20 0 20 20 0 20 0 0"] +- RenderSVGPath {polyline} at (0,0) size 22x20 [stroke={[type=SOLID] [color=#FFFF00] [stroke width=3.00]}] [fill={[type=SOLID] [color=#FF0000]}] [points="0 0 20 0 20 20"] +- RenderSVGContainer {g} at (0,0) size 22x22 +- RenderSVGRect {rect} at (0,0) size 12x22 [stroke={[type=SOLID] [color=#FFFF00] [stroke width=3.00]}] [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=10.00] [height=20.00] +- RenderSVGRect {rect} at (8,0) size 14x22 [stroke={[type=SOLID] [color=#FFFF00] [stroke width=3.00]}] [fill={[type=SOLID] [color=#008000]}] [x=10.00] [y=0.00] [width=10.00] [height=20.00] +- RenderSVGContainer {use} at (0,0) size 22x22 +- RenderSVGRect {rect} at (0,0) size 22x22 [stroke={[type=SOLID] [color=#FFFF00] [stroke width=3.00]}] [fill={[type=SOLID] [color=#FF0000]}] [x=0.00] [y=0.00] [width=20.00] [height=20.00] +- RenderSVGImage {image} at (0,0) size 20x20 +- RenderSVGText {text} at (0,-14) size 30x18 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 30x18 +- chunk 1 text run 1 at (0.00,0.00) startOffset 0 endOffset 4 width 29.32: "Text" +- RenderSVGContainer {g} at (41,22) size 269x263 +- RenderSVGContainer {g} at (41,22) size 89x263 [transform={m=((1.00,0.00)(0.00,1.00)) t=(130.00,40.00)}] +- RenderSVGText {text} at (-53,-18) size 53x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 53x23 +- chunk 1 (end anchor) text run 1 at (-52.53,0.00) startOffset 0 endOffset 6 width 52.53: "" +- RenderSVGText {text} at (-67,12) size 67x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 67x23 +- chunk 1 (end anchor) text run 1 at (-66.96,30.00) startOffset 0 endOffset 8 width 66.96: "" +- RenderSVGText {text} at (-75,42) size 75x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 75x23 +- chunk 1 (end anchor) text run 1 at (-74.77,60.00) startOffset 0 endOffset 9 width 74.77: "" +- RenderSVGText {text} at (-53,72) size 53x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 53x23 +- chunk 1 (end anchor) text run 1 at (-52.55,90.00) startOffset 0 endOffset 6 width 52.55: "" +- RenderSVGText {text} at (-89,102) size 89x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 89x23 +- chunk 1 (end anchor) text run 1 at (-88.11,120.00) startOffset 0 endOffset 10 width 88.11: "" +- RenderSVGText {text} at (-89,132) size 89x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 89x23 +- chunk 1 (end anchor) text run 1 at (-88.12,150.00) startOffset 0 endOffset 9 width 88.12: "" +- RenderSVGText {text} at (-57,162) size 57x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 57x23 +- chunk 1 (end anchor) text run 1 at (-56.99,180.00) startOffset 0 endOffset 6 width 56.99: "" +- RenderSVGText {text} at (-72,192) size 72x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 72x23 +- chunk 1 (end anchor) text run 1 at (-71.43,210.00) startOffset 0 endOffset 7 width 71.43: "" +- RenderSVGText {text} at (-53,222) size 53x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 53x23 +- chunk 1 (end anchor) text run 1 at (-52.55,240.00) startOffset 0 endOffset 6 width 52.55: "" +- RenderSVGContainer {g} at (260,22) size 50x53 [transform={m=((1.00,0.00)(0.00,1.00)) t=(310.00,40.00)}] +- RenderSVGText {text} at (-33,-18) size 33x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 33x23 +- chunk 1 (end anchor) text run 1 at (-32.56,0.00) startOffset 0 endOffset 3 width 32.56: "" +- RenderSVGText {text} at (-50,12) size 50x23 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 50x23 +- chunk 1 (end anchor) text run 1 at (-49.22,30.00) startOffset 0 endOffset 5 width 49.22: "" +- RenderSVGContainer {g} at (150,25) size 200x267 [transform={m=((1.00,0.00)(0.00,1.00)) t=(150.00,25.00)}] +- RenderSVGContainer {use} at (150,25) size 20x20 +- RenderSVGRect {rect} at (150,25) size 20x20 [fill={[type=SOLID] [color=#00FF00]}] [x=0.00] [y=0.00] [width=20.00] [height=20.00] +- RenderSVGContainer {use} at (150,55) size 20x20 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,30.00)}] +- RenderSVGEllipse {circle} at (150,55) size 20x20 [fill={[type=SOLID] [color=#00FF00]}] [cx=10.00] [cy=10.00] [r=10.00] +- RenderSVGContainer {use} at (150,85) size 20x20 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,60.00)}] +- RenderSVGEllipse {ellipse} at (150,85) size 20x20 [fill={[type=SOLID] [color=#00FF00]}] [cx=10.00] [cy=10.00] [rx=10.00] [ry=10.00] +- RenderSVGContainer {use} at (150,124) size 20x2 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,90.00)}] +- RenderSVGPath {line} at (150,124) size 20x2 [stroke={[type=SOLID] [color=#00FF00] [stroke width=2.00]}] [fill={[type=SOLID] [color=#000000]}] [x1=0.00] [y1=10.00] [x2=20.00] [y2=10.00] +- RenderSVGContainer {use} at (150,144) size 21x21 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,120.00)}] +- RenderSVGPath {polyline} at (150,144) size 21x21 [stroke={[type=SOLID] [color=#00FF00] [stroke width=2.00]}] [points="0 0 20 0 20 20"] +- RenderSVGContainer {use} at (150,175) size 20x20 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,150.00)}] +- RenderSVGPath {polygon} at (150,175) size 20x20 [fill={[type=SOLID] [color=#00FF00]}] [points="0 0 20 0 20 20 0 20 0 0"] +- RenderSVGContainer {use} at (150,205) size 20x20 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,180.00)}] +- RenderSVGPath {path} at (150,205) size 20x20 [fill={[type=SOLID] [color=#00FF00]}] [data="M 0 0 L 20 0 L 20 20 L 0 20 Z"] +- RenderSVGContainer {use} at (150,235) size 20x20 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,210.00)}] +- RenderSVGImage {image} at (150,235) size 20x20 +- RenderSVGContainer {use} at (150,262) size 48x30 [transform={m=((1.00,0.00)(0.00,1.00)) t=(0.00,260.00)}] +- RenderSVGText {text} at (0,-23) size 48x30 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 48x29 +- chunk 1 text run 1 at (0.00,0.00) startOffset 0 endOffset 4 width 47.04: "Text" +- RenderSVGContainer {use} at (330,25) size 20x20 [transform={m=((1.00,0.00)(0.00,1.00)) t=(180.00,0.00)}] +- RenderSVGContainer {g} at (330,25) size 20x20 +- RenderSVGRect {rect} at (330,25) size 10x20 [fill={[type=SOLID] [color=#00FF00]}] [x=0.00] [y=0.00] [width=10.00] [height=20.00] +- RenderSVGRect {rect} at (340,25) size 10x20 [fill={[type=SOLID] [color=#008000]}] [x=10.00] [y=0.00] [width=10.00] [height=20.00] +- RenderSVGContainer {use} at (330,55) size 20x20 [transform={m=((1.00,0.00)(0.00,1.00)) t=(180.00,30.00)}] +- RenderSVGContainer {g} at (330,55) size 20x20 +- RenderSVGRect {rect} at (330,55) size 20x20 [fill={[type=SOLID] [color=#00CC00]}] [x=0.00] [y=0.00] [width=20.00] [height=20.00] +- RenderSVGText {text} at (10,304) size 284x46 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 284x46 +- chunk 1 text run 1 at (10.00,340.00) startOffset 0 endOffset 17 width 283.34: "$Revision: 1.14 $" +- RenderSVGRect {rect} at (0,0) size 480x360 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=478.00] [height=358.00] +diff --git a/LayoutTests/platform/mac-mojave/svg/batik/text/textStyles-expected.txt b/LayoutTests/platform/mac-mojave/svg/batik/text/textStyles-expected.txt +deleted file mode 100644 +index a8f76f9e3d35891e7d22e9590e03240d114c6adc..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/svg/batik/text/textStyles-expected.txt ++++ /dev/null +@@ -1,173 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 450x500 +- RenderSVGRoot {svg} at (0,0) size 448x498 +- RenderSVGHiddenContainer {defs} at (0,0) size 0x0 +- RenderSVGText {text} at (-23,-14) size 46x18 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 46x18 +- chunk 1 (middle anchor) text run 1 at (-22.66,0.00) startOffset 0 endOffset 6 width 45.32: "sample" +- RenderSVGContainer {g} at (31,36) size 384x392 +- RenderSVGText {text} at (133,36) size 184x18 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 183x17 +- chunk 1 (middle anchor) text run 1 at (133.71,50.00) startOffset 0 endOffset 26 width 182.58: "Text Font Faces and Styles" +- RenderSVGText {text} at (184,65) size 82x13 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 82x12 +- chunk 1 (middle anchor) text run 1 at (184.17,75.00) startOffset 0 endOffset 19 width 81.66: "Standard Font Faces" +- RenderSVGContainer {g} at (39,82) size 122x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(100.00,110.00)}] +- RenderSVGContainer {use} at (57,82) size 86x36 +- RenderSVGText {text} at (-43,-28) size 86x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 85x35 +- chunk 1 (middle anchor) text run 1 at (-42.49,0.00) startOffset 0 endOffset 6 width 84.98: "sample" +- RenderSVGText {text} at (-61,4) size 122x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 122x14 +- chunk 1 (middle anchor) text run 1 at (-60.82,15.00) startOffset 0 endOffset 24 width 121.65: "SansSerif, normal weight" +- RenderSVGContainer {g} at (180,82) size 90x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(225.00,110.00)}] +- RenderSVGContainer {use} at (180,82) size 90x36 +- RenderSVGText {text} at (-45,-28) size 90x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 90x35 +- chunk 1 (middle anchor) text run 1 at (-45.00,0.00) startOffset 0 endOffset 6 width 90.00: "sample" +- RenderSVGText {text} at (-37,4) size 74x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 74x14 +- chunk 1 (middle anchor) text run 1 at (-36.67,15.00) startOffset 0 endOffset 15 width 73.33: "SansSerif, bold" +- RenderSVGContainer {g} at (306,82) size 88x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(350.00,110.00)}] +- RenderSVGContainer {use} at (307,82) size 86x36 +- RenderSVGText {text} at (-43,-28) size 86x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 85x35 +- chunk 1 (middle anchor) text run 1 at (-42.50,0.00) startOffset 0 endOffset 6 width 84.99: "sample" +- RenderSVGText {text} at (-44,4) size 88x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 88x14 +- chunk 1 (middle anchor) text run 1 at (-44.00,15.00) startOffset 0 endOffset 18 width 87.99: "SansSerif, oblique" +- RenderSVGContainer {g} at (50,132) size 100x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(100.00,160.00)}] +- RenderSVGContainer {use} at (57,132) size 86x36 +- RenderSVGText {text} at (-43,-28) size 86x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 85x35 +- chunk 1 (middle anchor) text run 1 at (-42.49,0.00) startOffset 0 endOffset 6 width 84.98: "sample" +- RenderSVGText {text} at (-50,4) size 100x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 99x14 +- chunk 1 (middle anchor) text run 1 at (-49.49,15.00) startOffset 0 endOffset 20 width 98.98: "Serif, normal weight" +- RenderSVGContainer {g} at (180,132) size 90x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(225.00,160.00)}] +- RenderSVGContainer {use} at (180,132) size 90x36 +- RenderSVGText {text} at (-45,-28) size 90x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 90x35 +- chunk 1 (middle anchor) text run 1 at (-45.00,0.00) startOffset 0 endOffset 6 width 90.00: "sample" +- RenderSVGText {text} at (-26,4) size 52x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 51x14 +- chunk 1 (middle anchor) text run 1 at (-25.33,15.00) startOffset 0 endOffset 11 width 50.66: "Serif, bold" +- RenderSVGContainer {g} at (307,132) size 86x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(350.00,160.00)}] +- RenderSVGContainer {use} at (307,132) size 86x36 +- RenderSVGText {text} at (-43,-28) size 86x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 85x35 +- chunk 1 (middle anchor) text run 1 at (-42.50,0.00) startOffset 0 endOffset 6 width 84.99: "sample" +- RenderSVGText {text} at (-33,4) size 66x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 66x14 +- chunk 1 (middle anchor) text run 1 at (-32.66,15.00) startOffset 0 endOffset 14 width 65.32: "Serif, oblique" +- RenderSVGContainer {g} at (31,182) size 138x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(100.00,210.00)}] +- RenderSVGContainer {use} at (57,182) size 86x36 +- RenderSVGText {text} at (-43,-28) size 86x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 85x35 +- chunk 1 (middle anchor) text run 1 at (-42.49,0.00) startOffset 0 endOffset 6 width 84.98: "sample" +- RenderSVGText {text} at (-69,4) size 138x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 137x14 +- chunk 1 (middle anchor) text run 1 at (-68.48,15.00) startOffset 0 endOffset 25 width 136.97: "Monospaced, normal weight" +- RenderSVGContainer {g} at (180,182) size 90x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(225.00,210.00)}] +- RenderSVGContainer {use} at (180,182) size 90x36 +- RenderSVGText {text} at (-45,-28) size 90x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 90x35 +- chunk 1 (middle anchor) text run 1 at (-45.00,0.00) startOffset 0 endOffset 6 width 90.00: "sample" +- RenderSVGText {text} at (-45,4) size 90x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 89x14 +- chunk 1 (middle anchor) text run 1 at (-44.33,15.00) startOffset 0 endOffset 16 width 88.65: "Monospaced, bold" +- RenderSVGContainer {g} at (298,182) size 104x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(350.00,210.00)}] +- RenderSVGContainer {use} at (307,182) size 86x36 +- RenderSVGText {text} at (-43,-28) size 86x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 85x35 +- chunk 1 (middle anchor) text run 1 at (-42.50,0.00) startOffset 0 endOffset 6 width 84.99: "sample" +- RenderSVGText {text} at (-52,4) size 104x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 104x14 +- chunk 1 (middle anchor) text run 1 at (-51.66,15.00) startOffset 0 endOffset 19 width 103.31: "Monospaced, oblique" +- RenderSVGContainer {g} at (57,232) size 86x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(100.00,260.00)}] +- RenderSVGContainer {use} at (57,232) size 86x36 +- RenderSVGText {text} at (-43,-28) size 86x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 85x35 +- chunk 1 (middle anchor) text run 1 at (-42.49,0.00) startOffset 0 endOffset 6 width 84.98: "sample" +- RenderSVGText {text} at (-21,4) size 42x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 42x14 +- chunk 1 (middle anchor) text run 1 at (-20.65,15.00) startOffset 0 endOffset 9 width 41.31: "(default)" +- RenderSVGContainer {g} at (173,232) size 104x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(225.00,260.00)}] +- RenderSVGContainer {use} at (179,232) size 92x36 +- RenderSVGText {text} at (-46,-28) size 92x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 91x35 +- chunk 1 (middle anchor) text run 1 at (-45.50,0.00) startOffset 0 endOffset 6 width 90.99: "sample" +- RenderSVGText {text} at (-52,4) size 104x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 103x14 +- chunk 1 (middle anchor) text run 1 at (-51.32,15.00) startOffset 0 endOffset 22 width 102.64: "default, bold, oblique" +- RenderSVGContainer {g} at (288,231) size 124x47 [transform={m=((1.00,0.00)(0.00,1.00)) t=(350.00,260.00)}] +- RenderSVGContainer {use} at (306,231) size 88x38 +- RenderSVGText {text} at (-43,-28) size 86x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 85x35 +- chunk 1 (middle anchor) text run 1 at (-42.49,0.00) startOffset 0 endOffset 6 width 84.98: "sample" +- RenderSVGText {text} at (-62,4) size 124x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 124x14 +- chunk 1 (middle anchor) text run 1 at (-61.76,15.00) startOffset 0 endOffset 25 width 123.52: "stroke-width=1, fill=none" +- RenderSVGText {text} at (181,300) size 88x13 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 87x12 +- chunk 1 (middle anchor) text run 1 at (181.67,310.00) startOffset 0 endOffset 19 width 86.66: "Named Font Families" +- RenderSVGText {text} at (129,315) size 192x13 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 191x12 +- chunk 1 (middle anchor) text run 1 at (129.74,325.00) startOffset 0 endOffset 49 width 190.52: "(Not all typefaces are available on all systems.)" +- RenderSVGContainer {g} at (57,332) size 86x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(100.00,360.00)}] +- RenderSVGContainer {use} at (57,332) size 86x36 +- RenderSVGText {text} at (-43,-28) size 86x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 85x35 +- chunk 1 (middle anchor) text run 1 at (-42.49,0.00) startOffset 0 endOffset 6 width 84.98: "sample" +- RenderSVGText {text} at (-15,4) size 30x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 30x14 +- chunk 1 (middle anchor) text run 1 at (-15.00,15.00) startOffset 0 endOffset 5 width 29.99: "Times" +- RenderSVGContainer {g} at (171,329) size 108x49 [transform={m=((1.00,0.00)(0.00,1.00)) t=(225.00,360.00)}] +- RenderSVGContainer {use} at (171,329) size 108x38 +- RenderSVGText {text} at (-54,-31) size 108x38 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 108x37 +- chunk 1 (middle anchor) text run 1 at (-53.81,0.00) startOffset 0 endOffset 6 width 107.62: "sample" +- RenderSVGText {text} at (-21,4) size 42x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 41x14 +- chunk 1 (middle anchor) text run 1 at (-20.32,15.00) startOffset 0 endOffset 7 width 40.64: "Verdana" +- RenderSVGContainer {g} at (301,331) size 98x47 [transform={m=((1.00,0.00)(0.00,1.00)) t=(350.00,360.00)}] +- RenderSVGContainer {use} at (301,331) size 98x36 +- RenderSVGText {text} at (-49,-29) size 98x36 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 97x35 +- chunk 1 (middle anchor) text run 1 at (-48.35,0.00) startOffset 0 endOffset 6 width 96.71: "sample" +- RenderSVGText {text} at (-23,4) size 46x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 46x14 +- chunk 1 (middle anchor) text run 1 at (-22.99,15.00) startOffset 0 endOffset 9 width 45.97: "Helvetica" +- RenderSVGContainer {g} at (51,382) size 98x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(100.00,410.00)}] +- RenderSVGText {text} at (-49,-28) size 98x35 contains 1 chunk(s) +- RenderSVGInline {tref} at (0,0) size 97x34 +- RenderSVGInlineText {#text} at (0,0) size 97x34 +- chunk 1 (middle anchor) text run 1 at (-48.35,0.00) startOffset 0 endOffset 6 width 96.71: "sample" +- RenderSVGText {text} at (-44,4) size 88x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 87x14 +- chunk 1 (middle anchor) text run 1 at (-43.48,15.00) startOffset 0 endOffset 18 width 86.96: "Arial (underlined)" +- RenderSVGContainer {g} at (179,379) size 92x49 [transform={m=((1.00,0.00)(0.00,1.00)) t=(225.00,410.00)}] +- RenderSVGContainer {use} at (179,379) size 92x38 +- RenderSVGText {text} at (-46,-31) size 92x38 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 92x37 +- chunk 1 (middle anchor) text run 1 at (-45.75,0.00) startOffset 0 endOffset 6 width 91.49: "sample" +- RenderSVGText {text} at (-17,4) size 34x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 34x14 +- chunk 1 (middle anchor) text run 1 at (-16.66,15.00) startOffset 0 endOffset 6 width 33.32: "Impact" +- RenderSVGContainer {g} at (285,382) size 130x46 [transform={m=((1.00,0.00)(0.00,1.00)) t=(350.00,410.00)}] +- RenderSVGText {text} at (-43,-28) size 86x36 contains 1 chunk(s) +- RenderSVGInline {tref} at (0,0) size 85x35 +- RenderSVGInlineText {#text} at (0,0) size 85x35 +- chunk 1 (middle anchor) text run 1 at (-42.49,0.00) startOffset 0 endOffset 6 width 84.98: "sample" +- RenderSVGText {text} at (-65,4) size 130x14 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 129x14 +- chunk 1 (middle anchor) text run 1 at (-64.48,15.00) startOffset 0 endOffset 25 width 128.95: "AvantGarde (line-through)" +- RenderSVGContainer {use} at (0,0) size 448x498 +- RenderSVGContainer {g} at (0,0) size 448x498 +- RenderSVGRect {rect} at (0,0) size 448x498 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=446.00] [height=496.00] +- RenderSVGContainer {g} at (418,466) size 27x29 [transform={m=((1.00,0.00)(0.00,1.00)) t=(418.00,467.00)}] +- RenderSVGViewportContainer {svg} at (418,466) size 27x29 +- RenderSVGPath {path} at (418,469) size 13x18 [fill={[type=SOLID] [color=#6666FF]}] [data="M 172 44 C 137 60 31 135 11 199 C 3 226 33 247 55 232 C 14 306 -1 332 0 356 C 0 370 13 398 44 383 C 52 379 79 358 96 342 C 110 341 120 331 138 314 C 155 328 174 324 190 307 C 212 309 272 229 234 199 C 231 175 204 162 181 181 C 175 179 168 180 163 182 C 185 147 206 100 212 77 C 219 47 188 36 172 44 Z"] +- RenderSVGPath {path} at (432,466) size 13x16 [fill={[type=SOLID] [color=#FF0000]}] [data="M 400 0 C 382 3 351 31 351 31 C 322 54 308 89 323 126 C 310 140 294 170 294 193 C 294 221 314 245 344 222 C 351 230 365 238 381 227 C 376 256 384 275 407 276 C 408 286 420 307 443 293 C 459 283 501 254 522 237 C 547 214 547 143 504 148 C 537 89 501 52 477 64 C 467 68 431 89 425 94 C 424 87 420 82 414 80 C 436 45 436 -5 401 0 Z"] +- RenderSVGPath {path} at (426,484) size 15x11 [fill={[type=SOLID] [color=#33CC33]}] [data="M 275 353 C 229 365 187 396 161 444 C 152 460 167 481 186 477 C 172 501 146 544 171 558 C 199 574 223 550 231 543 C 249 564 281 553 312 526 C 353 540 380 524 415 473 C 423 461 445 430 445 408 C 445 392 430 378 410 387 C 409 375 401 349 357 368 C 347 362 326 363 303 385 C 308 375 300 347 275 353 Z"] +diff --git a/LayoutTests/platform/mac-mojave/svg/custom/glyph-selection-arabic-forms-expected.txt b/LayoutTests/platform/mac-mojave/svg/custom/glyph-selection-arabic-forms-expected.txt +deleted file mode 100644 +index d4c5f0bc3e343ef7e43b161270eae5541b69eb0e..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/svg/custom/glyph-selection-arabic-forms-expected.txt ++++ /dev/null +@@ -1,10 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 400x50 +- RenderSVGRoot {svg} at (10,7) size 366x18 +- RenderSVGHiddenContainer {defs} at (0,0) size 0x0 +- RenderSVGContainer {g} at (10,7) size 366x18 +- RenderSVGText {text} at (10,7) size 366x18 contains 1 chunk(s) +- RenderSVGInlineText {#text} at (0,0) size 366x18 +- chunk 1 text run 1 at (10.00,20.00) startOffset 0 endOffset 56 width 358.79 RTL: "\x{62E}] [\x{62E}][\x{62E}][\x{62E}] | [\x{62E}] [\x{62E}\x{62E}][\x{62E}] | [\x{62E}] [\x{62E}\x{62E}\x{62E}] | [\x{62E} \x{62E}\x{62E}\x{62E}] | \x{62E} \x{62E}\x{62E}\x{62E}" +- chunk 1 text run 1 at (368.79,20.00) startOffset 0 endOffset 1 width 6.88: "]" +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug10296-1-expected.png b/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug10296-1-expected.png +deleted file mode 100644 +index a082dc91820a52b2d46650ebbf107bb1789e8cd5..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug10296-1-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug10296-1-expected.txt b/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug10296-1-expected.txt +deleted file mode 100644 +index d75ff05c5cc5922eed6bcf651f71762d7d8c9106..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug10296-1-expected.txt ++++ /dev/null +@@ -1,1041 +0,0 @@ +-layer at (0,0) size 785x5950 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x5950 +- RenderBlock {HTML} at (0,0) size 785x5950 +- RenderBody {BODY} at (8,21) size 769x5913 +- RenderBlock {H1} at (0,0) size 769x37 +- RenderText {#text} at (0,0) size 481x37 +- text run at (0,0) width 481: "Vertical alignment and table height" +- RenderBlock {P} at (0,58) size 769x55 +- RenderText {#text} at (0,0) size 275x18 +- text run at (0,0) width 275: "The following three tables have heights of " +- RenderInline {CODE} at (0,0) size 32x15 +- RenderText {#text} at (274,2) size 32x15 +- text run at (274,2) width 32: "auto" +- RenderText {#text} at (305,0) size 9x18 +- text run at (305,0) width 9: ", " +- RenderInline {CODE} at (0,0) size 32x15 +- RenderText {#text} at (313,2) size 32x15 +- text run at (313,2) width 32: "30px" +- RenderText {#text} at (344,0) size 36x18 +- text run at (344,0) width 36: ", and " +- RenderInline {CODE} at (0,0) size 40x15 +- RenderText {#text} at (379,2) size 40x15 +- text run at (379,2) width 40: "500px" +- RenderText {#text} at (418,0) size 764x54 +- text run at (418,0) width 9: ". " +- text run at (426,0) width 338: "The first one should have the height of the sum of its" +- text run at (0,18) width 40: "rows. " +- text run at (39,18) width 670: "The second and third can be handled however the browser wants, but there just here to make sure it does" +- text run at (0,36) width 144: "something reasonable." +- RenderTable {TABLE} at (0,128) size 111x147 +- RenderTableSection {TBODY} at (0,0) size 111x146 +- RenderTableRow {TR} at (0,2) size 111x22 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,26) size 111x22 +- RenderTableCell {TD} at (2,26) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,26) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,26) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,50) size 111x22 +- RenderTableCell {TD} at (2,50) size 35x22 [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,50) size 35x22 [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,50) size 35x22 [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,74) size 111x22 +- RenderTableCell {TD} at (2,74) size 35x22 [border: (1px solid #000000)] [r=3 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,74) size 35x22 [border: (1px solid #000000)] [r=3 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,74) size 35x22 [border: (1px solid #000000)] [r=3 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,98) size 111x22 +- RenderTableCell {TD} at (2,98) size 35x22 [border: (1px solid #000000)] [r=4 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,98) size 35x22 [border: (1px solid #000000)] [r=4 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,98) size 35x22 [border: (1px solid #000000)] [r=4 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,122) size 111x22 +- RenderTableCell {TD} at (2,122) size 35x22 [border: (1px solid #000000)] [r=5 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,122) size 35x22 [border: (1px solid #000000)] [r=5 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,122) size 35x22 [border: (1px solid #000000)] [r=5 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTable {TABLE} at (0,274) size 111x147 +- RenderTableSection {TBODY} at (0,0) size 111x146 +- RenderTableRow {TR} at (0,2) size 111x22 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,26) size 111x22 +- RenderTableCell {TD} at (2,26) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,26) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,26) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,50) size 111x22 +- RenderTableCell {TD} at (2,50) size 35x22 [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,50) size 35x22 [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,50) size 35x22 [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,74) size 111x22 +- RenderTableCell {TD} at (2,74) size 35x22 [border: (1px solid #000000)] [r=3 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,74) size 35x22 [border: (1px solid #000000)] [r=3 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,74) size 35x22 [border: (1px solid #000000)] [r=3 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,98) size 111x22 +- RenderTableCell {TD} at (2,98) size 35x22 [border: (1px solid #000000)] [r=4 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,98) size 35x22 [border: (1px solid #000000)] [r=4 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,98) size 35x22 [border: (1px solid #000000)] [r=4 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,122) size 111x22 +- RenderTableCell {TD} at (2,122) size 35x22 [border: (1px solid #000000)] [r=5 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,122) size 35x22 [border: (1px solid #000000)] [r=5 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,122) size 35x22 [border: (1px solid #000000)] [r=5 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTable {TABLE} at (0,420) size 111x501 +- RenderTableSection {TBODY} at (0,0) size 111x500 +- RenderTableRow {TR} at (0,2) size 111x81 +- RenderTableCell {TD} at (2,31) size 35x23 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,31) size 35x23 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,31) size 35x23 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableRow {TR} at (0,85) size 111x81 +- RenderTableCell {TD} at (2,114) size 35x23 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,114) size 35x23 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,114) size 35x23 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableRow {TR} at (0,168) size 111x81 +- RenderTableCell {TD} at (2,197) size 35x23 [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,197) size 35x23 [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,197) size 35x23 [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableRow {TR} at (0,251) size 111x81 +- RenderTableCell {TD} at (2,280) size 35x23 [border: (1px solid #000000)] [r=3 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,280) size 35x23 [border: (1px solid #000000)] [r=3 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,280) size 35x23 [border: (1px solid #000000)] [r=3 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableRow {TR} at (0,334) size 111x81 +- RenderTableCell {TD} at (2,363) size 35x23 [border: (1px solid #000000)] [r=4 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,363) size 35x23 [border: (1px solid #000000)] [r=4 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,363) size 35x23 [border: (1px solid #000000)] [r=4 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableRow {TR} at (0,417) size 111x81 +- RenderTableCell {TD} at (2,446) size 35x23 [border: (1px solid #000000)] [r=5 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,446) size 35x23 [border: (1px solid #000000)] [r=5 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,446) size 35x23 [border: (1px solid #000000)] [r=5 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderBlock {P} at (0,936) size 769x37 +- RenderText {#text} at (0,0) size 747x36 +- text run at (0,0) width 238: "These tables test percentage heights. " +- text run at (237,0) width 510: "The first should be its natural height; the second should be 50% of the height of" +- text run at (0,18) width 209: "the div (600px), which is 300px." +- RenderTable {TABLE} at (0,988) size 111x147 +- RenderTableSection {TBODY} at (0,0) size 111x146 +- RenderTableRow {TR} at (0,2) size 111x22 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,26) size 111x22 +- RenderTableCell {TD} at (2,26) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,26) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,26) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,50) size 111x22 +- RenderTableCell {TD} at (2,50) size 35x22 [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,50) size 35x22 [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,50) size 35x22 [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,74) size 111x22 +- RenderTableCell {TD} at (2,74) size 35x22 [border: (1px solid #000000)] [r=3 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,74) size 35x22 [border: (1px solid #000000)] [r=3 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,74) size 35x22 [border: (1px solid #000000)] [r=3 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,98) size 111x22 +- RenderTableCell {TD} at (2,98) size 35x22 [border: (1px solid #000000)] [r=4 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,98) size 35x22 [border: (1px solid #000000)] [r=4 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,98) size 35x22 [border: (1px solid #000000)] [r=4 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,122) size 111x22 +- RenderTableCell {TD} at (2,122) size 35x22 [border: (1px solid #000000)] [r=5 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,122) size 35x22 [border: (1px solid #000000)] [r=5 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,122) size 35x22 [border: (1px solid #000000)] [r=5 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBlock {DIV} at (0,1134) size 769x607 [border: (3px solid #800080)] +- RenderTable {TABLE} at (3,3) size 111x300 +- RenderTableSection {TBODY} at (0,0) size 111x300 +- RenderTableRow {TR} at (0,2) size 111x48 +- RenderTableCell {TD} at (2,14) size 35x23 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,14) size 35x23 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,14) size 35x23 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableRow {TR} at (0,51) size 111x49 +- RenderTableCell {TD} at (2,64) size 35x23 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,64) size 35x23 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,64) size 35x23 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableRow {TR} at (0,101) size 111x48 +- RenderTableCell {TD} at (2,114) size 35x23 [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,114) size 35x23 [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,114) size 35x23 [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableRow {TR} at (0,150) size 111x49 +- RenderTableCell {TD} at (2,163) size 35x23 [border: (1px solid #000000)] [r=3 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,163) size 35x23 [border: (1px solid #000000)] [r=3 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,163) size 35x23 [border: (1px solid #000000)] [r=3 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableRow {TR} at (0,200) size 111x49 +- RenderTableCell {TD} at (2,213) size 35x23 [border: (1px solid #000000)] [r=4 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,213) size 35x23 [border: (1px solid #000000)] [r=4 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,213) size 35x23 [border: (1px solid #000000)] [r=4 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableRow {TR} at (0,250) size 111x48 +- RenderTableCell {TD} at (2,263) size 35x23 [border: (1px solid #000000)] [r=5 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (38,263) size 35x23 [border: (1px solid #000000)] [r=5 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,263) size 35x23 [border: (1px solid #000000)] [r=5 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderBlock {P} at (0,1756) size 769x55 +- RenderText {#text} at (0,0) size 154x18 +- text run at (0,0) width 154: "The following tests test " +- RenderInline {CODE} at (0,0) size 48x15 +- RenderText {#text} at (153,2) size 48x15 +- text run at (153,2) width 48: "height" +- RenderText {#text} at (200,0) size 170x18 +- text run at (200,0) width 170: " on table rows. A value of " +- RenderInline {CODE} at (0,0) size 32x15 +- RenderText {#text} at (369,2) size 32x15 +- text run at (369,2) width 32: "auto" +- RenderText {#text} at (400,0) size 761x54 +- text run at (400,0) width 325: " requires the minimum height needed by the cells. " +- text run at (724,0) width 25: "In a" +- text run at (0,18) width 761: "simple case, this is just the height of the tallest cell (excluding the increased padding, of course, since with the padding" +- text run at (0,36) width 202: "the cells have the same height):" +- RenderTable {TABLE} at (0,1826) size 111x45 +- RenderTableSection {TBODY} at (0,0) size 111x44 +- RenderTableRow {TR} at (0,2) size 111x40 +- RenderTableCell {TD} at (2,11) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x40 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBR {BR} at (32,2) size 1x18 +- RenderText {#text} at (2,20) size 31x18 +- text run at (2,20) width 31: "Data" +- RenderTableCell {TD} at (74,11) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBlock {P} at (0,1886) size 769x37 +- RenderText {#text} at (0,0) size 218x18 +- text run at (0,0) width 218: "However, vertical-align values of " +- RenderInline {CODE} at (0,0) size 63x15 +- RenderText {#text} at (217,2) size 63x15 +- text run at (217,2) width 63: "baseline" +- RenderText {#text} at (279,0) size 759x36 +- text run at (279,0) width 480: " (the default, but could be overridden in a UA stylesheet) can make it taller" +- text run at (0,18) width 60: "than that:" +- RenderTable {TABLE} at (0,1938) size 292x145 +- RenderTableSection {TBODY} at (0,0) size 292x144 +- RenderTableRow {TR} at (0,2) size 292x140 +- RenderTableCell {TD} at (2,46) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 126x96 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderInline {SPAN} at (0,0) size 121x74 +- RenderText {#text} at (2,2) size 121x74 +- text run at (2,2) width 121: "Data" +- RenderBR {BR} at (122,46) size 1x18 +- RenderText {#text} at (2,76) size 31x18 +- text run at (2,76) width 31: "Data" +- RenderTableCell {TD} at (165,46) size 125x96 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBR {BR} at (32,2) size 1x18 +- RenderInline {SPAN} at (0,0) size 121x74 +- RenderText {#text} at (2,20) size 121x74 +- text run at (2,20) width 121: "Data" +- RenderBlock {P} at (0,2098) size 769x19 +- RenderText {#text} at (0,0) size 537x18 +- text run at (0,0) width 537: "The exact same thing should happen when the given height for the row is too small:" +- RenderTable {TABLE} at (0,2132) size 292x145 +- RenderTableSection {TBODY} at (0,0) size 292x144 +- RenderTableRow {TR} at (0,2) size 292x140 +- RenderTableCell {TD} at (2,46) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 126x96 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderInline {SPAN} at (0,0) size 121x74 +- RenderText {#text} at (2,2) size 121x74 +- text run at (2,2) width 121: "Data" +- RenderBR {BR} at (122,46) size 1x18 +- RenderText {#text} at (2,76) size 31x18 +- text run at (2,76) width 31: "Data" +- RenderTableCell {TD} at (165,46) size 125x96 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBR {BR} at (32,2) size 1x18 +- RenderInline {SPAN} at (0,0) size 121x74 +- RenderText {#text} at (2,20) size 121x74 +- text run at (2,20) width 121: "Data" +- RenderBlock {P} at (0,2292) size 769x37 +- RenderText {#text} at (0,0) size 756x36 +- text run at (0,0) width 756: "Padding should also be able to increase the height (here the first cell has 20px padding-top and the second has 20px of" +- text run at (0,18) width 112: "padding-bottom):" +- RenderTable {TABLE} at (0,2344) size 111x46 +- RenderTableSection {TBODY} at (0,0) size 111x45 +- RenderTableRow {TR} at (0,2) size 111x41 +- RenderTableCell {TD} at (2,2) size 35x41 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,21) size 31x18 +- text run at (2,21) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x41 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,11) size 35x23 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTable {TABLE} at (0,2389) size 111x46 +- RenderTableSection {TBODY} at (0,0) size 111x45 +- RenderTableRow {TR} at (0,2) size 111x41 +- RenderTableCell {TD} at (2,2) size 35x41 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,21) size 31x18 +- text run at (2,21) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x41 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,11) size 35x23 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderBlock {P} at (0,2450) size 769x37 +- RenderText {#text} at (0,0) size 764x36 +- text run at (0,0) width 488: "These two tables should be 200px tall, because of a height on the table row. " +- text run at (487,0) width 277: "The second one should have its second and" +- text run at (0,18) width 452: "third cell's contents offset from the middle by 10px (bottom, then top):" +- RenderTable {TABLE} at (0,2502) size 292x205 +- RenderTableSection {TBODY} at (0,0) size 292x204 +- RenderTableRow {TR} at (0,2) size 292x200 +- RenderTableCell {TD} at (2,46) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 126x96 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderInline {SPAN} at (0,0) size 121x74 +- RenderText {#text} at (2,2) size 121x74 +- text run at (2,2) width 121: "Data" +- RenderBR {BR} at (122,46) size 1x18 +- RenderText {#text} at (2,76) size 31x18 +- text run at (2,76) width 31: "Data" +- RenderTableCell {TD} at (165,46) size 125x96 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBR {BR} at (32,2) size 1x18 +- RenderInline {SPAN} at (0,0) size 121x74 +- RenderText {#text} at (2,20) size 121x74 +- text run at (2,20) width 121: "Data" +- RenderTable {TABLE} at (0,2706) size 111x205 +- RenderTableSection {TBODY} at (0,0) size 111x204 +- RenderTableRow {TR} at (0,2) size 111x200 +- RenderTableCell {TD} at (2,81) size 35x42 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,21) size 31x19 +- text run at (2,22) width 31: "Data" +- RenderTableCell {TD} at (38,81) size 35x42 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x19 +- text run at (2,3) width 31: "Data" +- RenderTableCell {TD} at (74,91) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBlock {P} at (0,2926) size 769x37 +- RenderText {#text} at (0,0) size 732x36 +- text run at (0,0) width 527: "The behavior of percentage heights on table-row or table-row-group is undefined. " +- text run at (526,0) width 206: "However, I think they should be" +- text run at (0,18) width 283: "ignored, so these tables should look normal:" +- RenderTable {TABLE} at (0,2978) size 111x75 +- RenderTableSection {TBODY} at (0,0) size 111x74 +- RenderTableRow {TR} at (0,2) size 111x22 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,26) size 111x22 +- RenderTableCell {TD} at (2,26) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,26) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,26) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,50) size 111x22 +- RenderTableCell {TD} at (2,50) size 35x22 [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,50) size 35x22 [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,50) size 35x22 [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTable {TABLE} at (0,3052) size 111x75 +- RenderTableSection {TBODY} at (0,0) size 111x74 +- RenderTableRow {TR} at (0,2) size 111x22 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,26) size 111x22 +- RenderTableCell {TD} at (2,26) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,26) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,26) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,50) size 111x22 +- RenderTableCell {TD} at (2,50) size 35x22 [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,50) size 35x22 [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,50) size 35x22 [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTable {TABLE} at (0,3126) size 111x171 +- RenderTableSection {THEAD} at (0,0) size 111x50 +- RenderTableRow {TR} at (0,2) size 111x22 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,26) size 111x22 +- RenderTableCell {TD} at (2,26) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,26) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,26) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableSection {TFOOT} at (0,122) size 111x48 +- RenderTableRow {TR} at (0,0) size 111x22 +- RenderTableCell {TD} at (2,0) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,0) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,0) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,24) size 111x22 +- RenderTableCell {TD} at (2,24) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,24) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,24) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableSection {TBODY} at (0,50) size 111x72 +- RenderTableRow {TR} at (0,0) size 111x22 +- RenderTableCell {TD} at (2,0) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,0) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,0) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,24) size 111x22 +- RenderTableCell {TD} at (2,24) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,24) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,24) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,48) size 111x22 +- RenderTableCell {TD} at (2,48) size 35x22 [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,48) size 35x22 [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,48) size 35x22 [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTable {TABLE} at (0,3296) size 111x171 +- RenderTableSection {THEAD} at (0,0) size 111x50 +- RenderTableRow {TR} at (0,2) size 111x22 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,26) size 111x22 +- RenderTableCell {TD} at (2,26) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,26) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,26) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableSection {TFOOT} at (0,122) size 111x48 +- RenderTableRow {TR} at (0,0) size 111x22 +- RenderTableCell {TD} at (2,0) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,0) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,0) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,24) size 111x22 +- RenderTableCell {TD} at (2,24) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,24) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,24) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableSection {TBODY} at (0,50) size 111x72 +- RenderTableRow {TR} at (0,0) size 111x22 +- RenderTableCell {TD} at (2,0) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,0) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,0) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,24) size 111x22 +- RenderTableCell {TD} at (2,24) size 35x22 [border: (1px solid #000000)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,24) size 35x22 [border: (1px solid #000000)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,24) size 35x22 [border: (1px solid #000000)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableRow {TR} at (0,48) size 111x22 +- RenderTableCell {TD} at (2,48) size 35x22 [border: (1px solid #000000)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,48) size 35x22 [border: (1px solid #000000)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,48) size 35x22 [border: (1px solid #000000)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBlock {P} at (0,3482) size 769x19 +- RenderText {#text} at (0,0) size 498x18 +- text run at (0,0) width 498: "The following table should look normal, since very small heights get ignored:" +- RenderTable {TABLE} at (0,3516) size 111x27 +- RenderTableSection {TBODY} at (0,0) size 111x26 +- RenderTableRow {TR} at (0,2) size 111x22 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBlock {P} at (0,3558) size 769x19 +- RenderText {#text} at (0,0) size 258x18 +- text run at (0,0) width 258: "So should this one, for auto cell heights:" +- RenderTable {TABLE} at (0,3592) size 111x27 +- RenderTableSection {TBODY} at (0,0) size 111x26 +- RenderTableRow {TR} at (0,2) size 111x22 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBlock {P} at (0,3634) size 769x19 +- RenderText {#text} at (0,0) size 643x18 +- text run at (0,0) width 643: "These tables should look the same - all cells should be 100px tall with the text at the top of the cells:" +- RenderTable {TABLE} at (0,3668) size 111x109 +- RenderTableSection {TBODY} at (0,0) size 111x108 +- RenderTableRow {TR} at (0,2) size 111x104 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTable {TABLE} at (0,3776) size 111x109 +- RenderTableSection {TBODY} at (0,0) size 111x108 +- RenderTableRow {TR} at (0,2) size 111x104 +- RenderTableCell {TD} at (2,43) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,43) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,43) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTable {TABLE} at (0,3884) size 111x109 +- RenderTableSection {TBODY} at (0,0) size 111x108 +- RenderTableRow {TR} at (0,2) size 111x104 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTable {TABLE} at (0,3992) size 111x109 +- RenderTableSection {TBODY} at (0,0) size 111x108 +- RenderTableRow {TR} at (0,2) size 111x104 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,2) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBlock {P} at (0,4116) size 769x19 +- RenderText {#text} at (0,0) size 730x18 +- text run at (0,0) width 730: "In these four tables, the text should be 20px lower each cell, but should otherwise look like the above three tables:" +- RenderTable {TABLE} at (0,4150) size 107x109 +- RenderTableSection {TBODY} at (0,0) size 107x108 +- RenderTableRow {TR} at (0,2) size 107x104 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 33x60 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,21) size 31x18 +- text run at (1,21) width 31: "Data" +- RenderTableCell {TD} at (72,2) size 33x100 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,41) size 31x18 +- text run at (1,41) width 31: "Data" +- RenderTable {TABLE} at (0,4258) size 107x109 +- RenderTableSection {TBODY} at (0,0) size 107x108 +- RenderTableRow {TR} at (0,2) size 107x104 +- RenderTableCell {TD} at (2,2) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,2) size 33x40 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,21) size 31x18 +- text run at (1,21) width 31: "Data" +- RenderTableCell {TD} at (72,2) size 33x60 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,41) size 31x18 +- text run at (1,41) width 31: "Data" +- RenderTable {TABLE} at (0,4366) size 107x109 +- RenderTableSection {TBODY} at (0,0) size 107x108 +- RenderTableRow {TR} at (0,2) size 107x104 +- RenderTableCell {TD} at (2,43) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,24) size 33x60 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,21) size 31x18 +- text run at (1,21) width 31: "Data" +- RenderTableCell {TD} at (72,4) size 33x100 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,41) size 31x18 +- text run at (1,41) width 31: "Data" +- RenderTable {TABLE} at (0,4474) size 111x109 +- RenderTableSection {TBODY} at (0,0) size 111x108 +- RenderTableRow {TR} at (0,2) size 111x104 +- RenderTableCell {TD} at (2,43) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,43) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (74,43) size 35x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderBlock {P} at (0,4598) size 769x19 +- RenderText {#text} at (0,0) size 378x18 +- text run at (0,0) width 378: "These should have the text 40px from the top in every cell:" +- RenderTable {TABLE} at (0,4632) size 107x108 +- RenderTableSection {TBODY} at (0,0) size 107x107 +- RenderTableRow {TR} at (0,2) size 107x103 +- RenderTableCell {TD} at (2,41) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,22) size 33x60 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,21) size 31x18 +- text run at (1,21) width 31: "Data" +- RenderTableCell {TD} at (72,2) size 33x100 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,41) size 31x18 +- text run at (1,41) width 31: "Data" +- RenderTable {TABLE} at (0,4739) size 107x107 +- RenderTableSection {TBODY} at (0,0) size 107x106 +- RenderTableRow {TR} at (0,2) size 107x102 +- RenderTableCell {TD} at (2,41) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,22) size 33x40 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,21) size 31x18 +- text run at (1,21) width 31: "Data" +- RenderTableCell {TD} at (72,2) size 33x60 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,41) size 31x18 +- text run at (1,41) width 31: "Data" +- RenderTable {TABLE} at (0,4845) size 107x107 +- RenderTableSection {TBODY} at (0,0) size 107x106 +- RenderTableRow {TR} at (0,2) size 107x102 +- RenderTableCell {TD} at (2,42) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,23) size 33x60 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,21) size 31x18 +- text run at (1,21) width 31: "Data" +- RenderTableCell {TD} at (72,3) size 33x100 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,41) size 31x18 +- text run at (1,41) width 31: "Data" +- RenderTable {TABLE} at (0,4951) size 107x107 +- RenderTableSection {TBODY} at (0,0) size 107x106 +- RenderTableRow {TR} at (0,2) size 107x102 +- RenderTableCell {TD} at (2,82) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,44) size 33x60 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,21) size 31x18 +- text run at (1,21) width 31: "Data" +- RenderTableCell {TD} at (72,4) size 33x100 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,41) size 31x18 +- text run at (1,41) width 31: "Data" +- RenderTable {TABLE} at (0,5057) size 107x69 +- RenderTableSection {TBODY} at (0,0) size 107x68 +- RenderTableRow {TR} at (0,2) size 107x64 +- RenderTableCell {TD} at (2,44) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,26) size 33x40 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (1,1) size 31x18 +- text run at (1,1) width 31: "Data" +- RenderTableCell {TD} at (72,6) size 33x60 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (1,1) size 31x18 +- text run at (1,1) width 31: "Data" +- RenderBlock {P} at (0,5141) size 769x37 +- RenderText {#text} at (0,0) size 766x36 +- text run at (0,0) width 766: "In each of the following tables, three of the cells should have the same baseline of the first line, and the three so marked" +- text run at (0,18) width 275: "should be aligned top, middle, and bottom:" +- RenderTable {TABLE} at (0,5193) size 459x119 +- RenderTableSection {TBODY} at (0,0) size 459x118 +- RenderTableRow {TR} at (0,2) size 459x114 +- RenderTableCell {TD} at (2,74) size 35x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (38,45) size 95x59 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 91x55 +- text run at (2,2) width 91: "Data" +- RenderTableCell {TD} at (134,2) size 187x114 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 182x110 +- text run at (2,2) width 182: "Data" +- RenderTableCell {TD} at (322,2) size 29x22 [border: (1px solid #000000)] [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 25x18 +- text run at (2,2) width 25: "Top" +- RenderTableCell {TD} at (352,48) size 51x22 [border: (1px solid #000000)] [r=0 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 47x18 +- text run at (2,2) width 47: "Middle" +- RenderTableCell {TD} at (404,94) size 53x22 [border: (1px solid #000000)] [r=0 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 49x18 +- text run at (2,2) width 49: "Bottom" +- RenderTable {TABLE} at (0,5311) size 459x119 +- RenderTableSection {TBODY} at (0,0) size 459x118 +- RenderTableRow {TR} at (0,2) size 459x114 +- RenderTableCell {TD} at (2,2) size 29x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 25x18 +- text run at (2,2) width 25: "Top" +- RenderTableCell {TD} at (32,48) size 51x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 47x18 +- text run at (2,2) width 47: "Middle" +- RenderTableCell {TD} at (84,94) size 53x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 49x18 +- text run at (2,2) width 49: "Bottom" +- RenderTableCell {TD} at (138,2) size 187x114 [border: (1px solid #000000)] [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 182x110 +- text run at (2,2) width 182: "Data" +- RenderTableCell {TD} at (326,74) size 35x22 [border: (1px solid #000000)] [r=0 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (362,45) size 95x59 [border: (1px solid #000000)] [r=0 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 91x55 +- text run at (2,2) width 91: "Data" +- RenderTable {TABLE} at (0,5429) size 459x119 +- RenderTableSection {TBODY} at (0,0) size 459x118 +- RenderTableRow {TR} at (0,2) size 459x114 +- RenderTableCell {TD} at (2,2) size 186x114 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 182x110 +- text run at (2,2) width 182: "Data" +- RenderTableCell {TD} at (189,2) size 29x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 25x18 +- text run at (2,2) width 25: "Top" +- RenderTableCell {TD} at (219,48) size 52x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 47x18 +- text run at (2,2) width 47: "Middle" +- RenderTableCell {TD} at (272,74) size 35x22 [border: (1px solid #000000)] [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (308,94) size 53x22 [border: (1px solid #000000)] [r=0 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 49x18 +- text run at (2,2) width 49: "Bottom" +- RenderTableCell {TD} at (362,45) size 95x59 [border: (1px solid #000000)] [r=0 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 91x55 +- text run at (2,2) width 91: "Data" +- RenderTable {TABLE} at (0,5547) size 459x119 +- RenderTableSection {TBODY} at (0,0) size 459x118 +- RenderTableRow {TR} at (0,2) size 459x114 +- RenderTableCell {TD} at (2,2) size 29x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 25x18 +- text run at (2,2) width 25: "Top" +- RenderTableCell {TD} at (32,74) size 35x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (68,45) size 96x59 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 91x55 +- text run at (2,2) width 91: "Data" +- RenderTableCell {TD} at (165,48) size 51x22 [border: (1px solid #000000)] [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 47x18 +- text run at (2,2) width 47: "Middle" +- RenderTableCell {TD} at (217,94) size 53x22 [border: (1px solid #000000)] [r=0 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 49x18 +- text run at (2,2) width 49: "Bottom" +- RenderTableCell {TD} at (271,2) size 186x114 [border: (1px solid #000000)] [r=0 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 182x110 +- text run at (2,2) width 182: "Data" +- RenderTable {TABLE} at (0,5665) size 459x119 +- RenderTableSection {TBODY} at (0,0) size 459x118 +- RenderTableRow {TR} at (0,2) size 459x114 +- RenderTableCell {TD} at (2,2) size 29x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 25x18 +- text run at (2,2) width 25: "Top" +- RenderTableCell {TD} at (32,45) size 96x59 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 91x55 +- text run at (2,2) width 91: "Data" +- RenderTableCell {TD} at (129,94) size 53x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 49x18 +- text run at (2,2) width 49: "Bottom" +- RenderTableCell {TD} at (183,74) size 35x22 [border: (1px solid #000000)] [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 31x18 +- text run at (2,2) width 31: "Data" +- RenderTableCell {TD} at (219,2) size 186x114 [border: (1px solid #000000)] [r=0 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 182x110 +- text run at (2,2) width 182: "Data" +- RenderTableCell {TD} at (406,48) size 51x22 [border: (1px solid #000000)] [r=0 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 47x18 +- text run at (2,2) width 47: "Middle" +- RenderBlock {HR} at (0,5791) size 769x3 [border: (1px inset #000000)] +- RenderBlock {P} at (0,5809) size 769x36 +- RenderInline {A} at (0,0) size 88x18 [color=#0000EE] +- RenderImage {IMG} at (0,0) size 88x31 +- RenderBlock {P} at (0,5860) size 769x19 +- RenderText {#text} at (0,0) size 59x18 +- text run at (0,0) width 59: "(Back to " +- RenderInline {A} at (0,0) size 161x18 [color=#0000EE] +- RenderText {#text} at (58,0) size 161x18 +- text run at (58,0) width 161: "CSS Testing Information" +- RenderText {#text} at (218,0) size 9x18 +- text run at (218,0) width 9: ", " +- RenderInline {A} at (0,0) size 83x18 [color=#0000EE] +- RenderText {#text} at (226,0) size 83x18 +- text run at (226,0) width 83: "David Baron" +- RenderText {#text} at (308,0) size 6x18 +- text run at (308,0) width 6: ")" +- RenderBlock {P} at (0,5894) size 769x19 +- RenderInline {A} at (0,0) size 32x18 [color=#0000EE] +- RenderText {#text} at (0,0) size 32x18 +- text run at (0,0) width 32: "LDB" +- RenderText {#text} at (32,0) size 8x18 +- text run at (32,0) width 8: ", " +- RenderInline {A} at (0,0) size 158x18 [color=#0000EE] +- RenderText {#text} at (40,0) size 158x18 +- text run at (40,0) width 158: "dbaron@fas.harvard.edu" +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug139524-2-expected.png b/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug139524-2-expected.png +deleted file mode 100644 +index 10f610304dec12b64e147968c50d6109ac344723..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug139524-2-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug139524-2-expected.txt b/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug139524-2-expected.txt +deleted file mode 100644 +index fb632f3a537a755b3bcb456ddfc32ce6f9bdd3a0..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug139524-2-expected.txt ++++ /dev/null +@@ -1,49 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x357 +- RenderBlock {HTML} at (0,0) size 800x358 +- RenderBody {BODY} at (8,18) size 784x332 +- RenderBlock {H3} at (0,0) size 784x22 +- RenderText {#text} at (0,0) size 520x22 +- text run at (0,0) width 520: "SPAN attribute of COL element being ignored in Mozilla 1.0 rc1" +- RenderBlock {P} at (0,40) size 784x37 +- RenderText {#text} at (0,0) size 744x36 +- text run at (0,0) width 744: "(Note: this is a regression bug - I don't know when it appeared, but I remember the SPAN attribute on COL elements" +- text run at (0,18) width 278: "worked fine sometime before Mozilla 0.9.6)" +- RenderBlock {P} at (0,92) size 784x19 +- RenderText {#text} at (0,0) size 354x18 +- text run at (0,0) width 354: "The following TABLE has a COLGROUP structure of:" +- RenderBlock {PRE} at (15,126) size 769x61 [color=#000066] +- RenderText {#text} at (0,0) size 211x60 +- text run at (0,0) width 79: "" +- text run at (78,0) width 1: " " +- text run at (0,15) width 211: " " +- text run at (210,15) width 1: " " +- text run at (0,30) width 141: " " +- text run at (140,30) width 1: " " +- text run at (0,45) width 86: "" +- text run at (85,45) width 1: " " +- RenderBlock {P} at (0,202) size 784x19 +- RenderText {#text} at (0,0) size 563x18 +- text run at (0,0) width 563: "So the first two colums should both be 100px wide, and the third should be 200px wide." +- RenderBlock {P} at (0,236) size 784x19 +- RenderText {#text} at (0,0) size 580x18 +- text run at (0,0) width 580: "However, the first column is 100px, the second is 200px, and the third is the default width." +- RenderBlock {P} at (0,270) size 784x19 +- RenderText {#text} at (0,0) size 384x18 +- text run at (0,0) width 384: "So it would appear that the SPAN attribute is being ignored." +- RenderTable {TABLE} at (0,304) size 408x27 +- RenderTableCol {COLGROUP} at (0,0) size 0x0 +- RenderTableCol {COL} at (0,0) size 0x0 +- RenderTableCol {COL} at (0,0) size 0x0 +- RenderTableSection {TBODY} at (0,0) size 408x26 +- RenderTableRow {TR} at (0,2) size 408x22 +- RenderTableCell {TD} at (2,2) size 100x22 [border: (1px solid #000000)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (104,2) size 100x22 [border: (1px solid #000000)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (206,2) size 200x22 [border: (1px solid #000000)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug2479-3-expected.txt b/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug2479-3-expected.txt +deleted file mode 100644 +index 3238871aeb2241c902c9412823a918a4f7ceaf5a..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug2479-3-expected.txt ++++ /dev/null +@@ -1,119 +0,0 @@ +-layer at (0,0) size 785x685 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x685 +- RenderBlock {HTML} at (0,0) size 785x685 +- RenderBody {BODY} at (8,21) size 769x648 +- RenderBlock {H1} at (0,0) size 769x37 +- RenderText {#text} at (0,0) size 311x37 +- text run at (0,0) width 311: "Generic Table Tests - 1" +- RenderBlock {P} at (0,58) size 769x19 +- RenderText {#text} at (0,0) size 397x18 +- text run at (0,0) width 397: "If you have any comments to make regarding this test, e-mail " +- RenderInline {A} at (0,0) size 186x18 [color=#0000EE] +- RenderText {#text} at (396,0) size 186x18 +- text run at (396,0) width 186: "py8ieh=eviltests@bath.ac.uk" +- RenderText {#text} at (581,0) size 5x18 +- text run at (581,0) width 5: "." +- RenderBlock {DL} at (0,92) size 769x37 +- RenderBlock {DT} at (0,0) size 769x18 +- RenderText {#text} at (0,0) size 83x18 +- text run at (0,0) width 83: "Prerequisites" +- RenderBlock {DD} at (40,18) size 729x18 +- RenderText {#text} at (0,0) size 697x18 +- text run at (0,0) width 697: "Browsers that are subjected to this test should support CSS1 and the CSS2 table model, and multiple classes." +- RenderBlock {P} at (0,144) size 769x99 [border: (5px double #FF0000)] +- RenderBlock (anonymous) at (13,13) size 743x18 +- RenderText {#text} at (0,0) size 240x18 +- text run at (0,0) width 240: "If this paragraph breaks the line here:" +- RenderTable {SPAN} at (13,31) size 60x18 +- RenderTableSection (anonymous) at (0,0) size 60x18 +- RenderTableRow (anonymous) at (0,0) size 60x18 +- RenderTableCell (anonymous) at (0,0) size 60x18 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (0,0) size 60x18 +- text run at (0,0) width 60: "and here:" +- RenderBlock (anonymous) at (13,49) size 743x36 +- RenderText {#text} at (0,0) size 121x18 +- text run at (0,0) width 121: "then your browser " +- RenderInline {EM} at (0,0) size 83x18 +- RenderText {#text} at (120,0) size 83x18 +- text run at (120,0) width 83: "does support" +- RenderText {#text} at (202,0) size 165x18 +- text run at (202,0) width 165: " table values on 'display'. " +- RenderInline {STRONG} at (0,0) size 715x36 +- RenderText {#text} at (366,0) size 715x36 +- text run at (366,0) width 349: "If this paragraphs flows without any undue breaks," +- text run at (0,18) width 458: "then you should mark your browser as not supporting table values!" +- RenderBlock {H2} at (0,262) size 769x29 +- RenderText {#text} at (0,0) size 218x28 +- text run at (0,0) width 218: "1. Table -> Table Cell" +- RenderBlock {P} at (0,310) size 769x37 +- RenderText {#text} at (0,0) size 762x36 +- text run at (0,0) width 762: "Below there should be a gray bar, spanning the width of the BODY, with the text \"Left\" to the left and the text \"Right\"," +- text run at (0,18) width 222: "on the same line, flush to the right." +- RenderTable {DIV} at (0,362) size 769x19 [bgcolor=#C0C0C0] +- RenderTableSection (anonymous) at (0,0) size 769x18 +- RenderTableRow (anonymous) at (0,0) size 769x18 +- RenderTableCell {DIV} at (0,0) size 330x18 [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (0,0) size 27x18 +- text run at (0,0) width 27: "Left" +- RenderTableCell {DIV} at (329,0) size 441x18 [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (403,0) size 37x18 +- text run at (403,0) width 37: "Right" +- RenderBlock {H2} at (0,400) size 769x29 +- RenderText {#text} at (0,0) size 156x28 +- text run at (0,0) width 156: "Submit Results" +- RenderBlock {FORM} at (0,448) size 769x46 +- RenderBlock {P} at (0,0) size 769x45 +- RenderText {#text} at (0,2) size 267x18 +- text run at (0,2) width 267: "How does your browser fare on this test? " +- RenderMenuList {SELECT} at (268,3) size 242x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 241x18 +- RenderText at (8,2) size 140x13 +- text run at (8,2) width 140: "The test renders correctly." +- RenderText {#text} at (511,2) size 5x18 +- text run at (511,2) width 5: " " +- RenderInline {LABEL} at (0,0) size 224x18 +- RenderText {#text} at (515,2) size 73x18 +- text run at (515,2) width 73: "Comment: " +- RenderTextControl {INPUT} at (589,2) size 148x19 [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (0,0) size 0x0 +- RenderButton {INPUT} at (2,25) size 53x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 37x13 +- RenderText at (0,0) size 37x13 +- text run at (0,0) width 37: "Submit" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (0,509) size 769x3 [border: (1px inset #000000)] +- RenderBlock {P} at (0,527) size 769x19 +- RenderText {#text} at (0,0) size 64x18 +- text run at (0,0) width 64: "Up to the " +- RenderInline {A} at (0,0) size 73x18 [color=#0000EE] +- RenderText {#text} at (63,0) size 73x18 +- text run at (63,0) width 73: "Table Tests" +- RenderText {#text} at (135,0) size 5x18 +- text run at (135,0) width 5: "." +- RenderBlock {P} at (0,561) size 769x19 +- RenderText {#text} at (0,0) size 64x18 +- text run at (0,0) width 64: "Up to the " +- RenderInline {A} at (0,0) size 99x18 [color=#0000EE] +- RenderText {#text} at (63,0) size 99x18 +- text run at (63,0) width 99: "Evil Tests Page" +- RenderText {#text} at (161,0) size 5x18 +- text run at (161,0) width 5: "." +- RenderBlock {P} at (0,595) size 769x19 +- RenderText {#text} at (0,0) size 177x18 +- text run at (0,0) width 177: "This page is maintained by " +- RenderInline {A} at (0,0) size 79x18 [color=#0000EE] +- RenderText {#text} at (176,0) size 79x18 +- text run at (176,0) width 79: "Ian Hickson" +- RenderText {#text} at (254,0) size 10x18 +- text run at (254,0) width 10: " (" +- RenderInline {A} at (0,0) size 125x18 [color=#0000EE] +- RenderText {#text} at (263,0) size 125x18 +- text run at (263,0) width 125: "py8ieh@bath.ac.uk" +- RenderText {#text} at (387,0) size 10x18 +- text run at (387,0) width 10: ")." +- RenderBlock {P} at (0,629) size 769x19 +- RenderText {#text} at (0,0) size 185x18 +- text run at (0,0) width 185: "Last updated in March 1999." +-layer at (600,475) size 141x13 +- RenderBlock {DIV} at (3,3) size 141x13 +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug30692-expected.txt b/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug30692-expected.txt +deleted file mode 100644 +index 56558c41579947bf86fe35e6ecfb0a17b8c0e992..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug30692-expected.txt ++++ /dev/null +@@ -1,56 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x584 +- RenderBlock (anonymous) at (0,0) size 784x18 +- RenderText {#text} at (0,0) size 497x18 +- text run at (0,0) width 497: "BUG: Inside a cell, \"height:x%\" is ignored. It looks like 'auto' is used instead." +- RenderBR {BR} at (496,0) size 1x18 +- RenderListItem {LI} at (0,18) size 784x18 +- RenderListMarker at (-1,0) size 7x18: bullet +- RenderText {#text} at (14,0) size 265x18 +- text run at (14,0) width 265: "Absolute units work correctly (eg. 50px)." +- RenderListItem {LI} at (0,36) size 784x490 +- RenderBlock (anonymous) at (0,0) size 784x18 +- RenderListMarker at (-1,0) size 7x18: bullet +- RenderText {#text} at (14,0) size 183x18 +- text run at (14,0) width 183: "\"width:x%\" works correctly." +- RenderBlock {HR} at (0,26) size 784x2 [border: (1px inset #000000)] +- RenderTable {TABLE} at (0,36) size 784x100 +- RenderTableSection {TBODY} at (0,0) size 784x100 +- RenderTableRow {TR} at (0,2) size 784x96 +- RenderTableCell {TD} at (2,11) size 780x78 [bgcolor=#FF0000] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (0,144) size 784x2 [border: (1px inset #000000)] +- RenderTable {TABLE} at (0,154) size 784x100 +- RenderTableSection {TBODY} at (0,0) size 784x100 +- RenderTableRow {TR} at (0,2) size 784x96 +- RenderTableCell {TD} at (2,9) size 780x82 [bgcolor=#FF0000] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (0,262) size 784x2 [border: (1px inset #000000)] +- RenderTable {TABLE} at (0,272) size 784x100 +- RenderTableSection {TBODY} at (0,0) size 784x100 +- RenderTableRow {TR} at (0,2) size 784x96 +- RenderTableCell {TD} at (2,11) size 780x78 [bgcolor=#FF0000] [r=0 c=0 rs=1 cs=1] +- RenderBlock {P} at (1,1) size 623x76 [bgcolor=#FFFFE0] +- RenderText {#text} at (0,0) size 232x18 +- text run at (0,0) width 232: "BUG: the height of the P is not 80%" +- RenderBlock {HR} at (0,380) size 784x2 [border: (1px inset #000000)] +- RenderTable {TABLE} at (0,390) size 784x100 +- RenderTableSection {TBODY} at (0,0) size 784x100 +- RenderTableRow {TR} at (0,2) size 784x96 +- RenderTableCell {TD} at (2,9) size 780x82 [bgcolor=#FF0000] [r=0 c=0 rs=1 cs=1] +- RenderBlock {P} at (1,1) size 623x80 [bgcolor=#FFFFE0] +- RenderText {#text} at (0,0) size 226x18 +- text run at (0,0) width 226: "OK: the height of the P is 80 pixels" +-layer at (11,93) size 622x75 clip at (12,94) size 620x73 +- RenderTextControl {TEXTAREA} at (1,1) size 623x76 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 617x13 +- RenderText {#text} at (0,0) size 222x13 +- text run at (0,0) width 222: "BUG: the height of the textarea is not 80%" +-layer at (11,208) size 622x80 clip at (12,209) size 620x78 +- RenderTextControl {TEXTAREA} at (1,1) size 623x80 [bgcolor=#FFFFFF] [border: (1px solid #000000)] +- RenderBlock {DIV} at (3,3) size 617x13 +- RenderText {#text} at (0,0) size 218x13 +- text run at (0,0) width 218: "OK: the height of the textarea is 80 pixels" +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug33855-expected.txt b/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug33855-expected.txt +deleted file mode 100644 +index db5e0df314aefb6f54e858bf95d6f15b7f01e9f4..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/tables/mozilla/bugs/bug33855-expected.txt ++++ /dev/null +@@ -1,38 +0,0 @@ +-layer at (0,0) size 800x600 +- RenderView at (0,0) size 800x600 +-layer at (0,0) size 800x600 +- RenderBlock {HTML} at (0,0) size 800x600 +- RenderBody {BODY} at (8,8) size 784x576 [bgcolor=#FFFFFF] +- RenderBlock {FORM} at (0,0) size 784x28 +- RenderTable {TABLE} at (0,0) size 784x28 +- RenderTableSection {TBODY} at (0,0) size 784x28 +- RenderTableRow {TR} at (0,2) size 784x24 [bgcolor=#FFFFFF] +- RenderTableCell {TD} at (2,2) size 70x24 [r=0 c=0 rs=1 cs=1] +- RenderButton {INPUT} at (3,3) size 64x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 48x13 +- RenderText at (0,0) size 48x13 +- text run at (0,0) width 48: "Select all" +- RenderTableCell {TD} at (73,2) size 57x24 [r=0 c=1 rs=1 cs=1] +- RenderButton {INPUT} at (3,3) size 50x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 34x13 +- RenderText at (0,0) size 34x13 +- text run at (0,0) width 34: "Delete" +- RenderTableCell {TD} at (131,2) size 87x24 [r=0 c=2 rs=1 cs=1] +- RenderButton {INPUT} at (3,3) size 80x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 64x13 +- RenderText at (0,0) size 64x13 +- text run at (0,0) width 64: "Empty trash" +- RenderTableCell {TD} at (219,6) size 378x20 [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (1,1) size 4x18 +- text run at (1,1) width 4: " " +- RenderTableCell {TD} at (598,2) size 68x24 [r=0 c=4 rs=1 cs=1] +- RenderButton {INPUT} at (3,3) size 62x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 46x13 +- RenderText at (0,0) size 46x13 +- text run at (0,0) width 46: "Move to:" +- RenderTableCell {TD} at (668,2) size 114x24 [r=0 c=5 rs=1 cs=1] +- RenderMenuList {SELECT} at (3,3) size 108x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 108x18 +- RenderText at (8,2) size 77x13 +- text run at (8,2) width 77: "Choose folder " +- RenderText {#text} at (0,0) size 0x0 +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla/other/wa_table_thtd_rowspan-expected.txt b/LayoutTests/platform/mac-mojave/tables/mozilla/other/wa_table_thtd_rowspan-expected.txt +deleted file mode 100644 +index e434352648b7bd94634b9b8b4d3d6bfebecefe00..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/tables/mozilla/other/wa_table_thtd_rowspan-expected.txt ++++ /dev/null +@@ -1,1330 +0,0 @@ +-layer at (0,0) size 785x2358 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x2358 +- RenderBlock {HTML} at (0,0) size 785x2359 +- RenderBody {BODY} at (8,8) size 769x2335 [bgcolor=#FFDEAD] +- RenderBlock {H1} at (0,0) size 769x74 +- RenderInline {FONT} at (0,0) size 470x74 [color=#FF0000] +- RenderText {#text} at (0,0) size 294x37 +- text run at (0,0) width 294: "Acceptance Test Case" +- RenderBR {BR} at (293,0) size 1x37 +- RenderText {#text} at (0,37) size 470x37 +- text run at (0,37) width 470: "Web Browser: Web View (HTML)" +- RenderBlock {P} at (0,95) size 769x29 +- RenderInline {FONT} at (0,0) size 353x28 [color=#FF0000] +- RenderInline {B} at (0,0) size 353x28 +- RenderText {#text} at (0,0) size 353x28 +- text run at (0,0) width 353: "Table: & ROWSPAN" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (0,139) size 769x3 [border: (1px inset #000000)] +- RenderBlock (anonymous) at (0,149) size 769x55 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "This acceptance test case tests the optional " +- RenderInline {B} at (0,0) size 43x18 +- RenderText {#text} at (276,0) size 43x18 +- text run at (276,0) width 43: "" +- RenderText {#text} at (318,0) size 21x18 +- text run at (318,0) width 21: " & " +- RenderInline {B} at (0,0) size 42x18 +- RenderText {#text} at (338,0) size 42x18 +- text run at (338,0) width 42: "" +- RenderText {#text} at (379,0) size 28x18 +- text run at (379,0) width 28: " tag " +- RenderInline {B} at (0,0) size 82x18 +- RenderText {#text} at (406,0) size 82x18 +- text run at (406,0) width 82: "ROWSPAN" +- RenderText {#text} at (487,0) size 739x36 +- text run at (487,0) width 109: " attribute which, " +- text run at (595,0) width 144: "when placed in a table" +- text run at (0,18) width 563: "header or data tag, specifies how many rows the table header or data cell will span. The " +- RenderInline {B} at (0,0) size 82x18 +- RenderText {#text} at (562,18) size 82x18 +- text run at (562,18) width 82: "ROWSPAN" +- RenderText {#text} at (643,18) size 754x36 +- text run at (643,18) width 111: " attribute is set to" +- text run at (0,36) width 494: "an integer value equal the number of rows the table header or data cell spans." +- RenderBlock {P} at (0,219) size 769x19 +- RenderInline {B} at (0,0) size 120x18 +- RenderText {#text} at (0,0) size 120x18 +- text run at (0,0) width 120: "Test Instructions:" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {OL} at (0,253) size 769x245 +- RenderListItem {LI} at (40,0) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "1" +- RenderText {#text} at (0,0) size 510x18 +- text run at (0,0) width 510: "Verify that the sample text displays as stated in each of the following test cases:" +- RenderBlock {P} at (40,34) size 729x104 +- RenderTable {TABLE} at (0,0) size 531x104 [bgcolor=#F08080] +- RenderTableSection {TBODY} at (0,0) size 531x104 +- RenderTableRow {TR} at (0,2) size 531x32 +- RenderTableCell {TD} at (2,2) size 96x32 [r=0 c=0 rs=1 cs=1] +- RenderInline {A} at (0,0) size 82x18 [color=#0000EE] +- RenderText {#text} at (7,7) size 82x18 +- text run at (7,7) width 82: "Test Case #1" +- RenderTableCell {TD} at (99,2) size 430x32 [r=0 c=1 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 316x18 [color=#0000FF] +- RenderInline {B} at (0,0) size 316x18 +- RenderText {#text} at (7,7) size 316x18 +- text run at (7,7) width 316: "table with header cells spanning multiple rows" +- RenderTableRow {TR} at (0,36) size 531x32 +- RenderTableCell {TD} at (2,36) size 96x32 [r=1 c=0 rs=1 cs=1] +- RenderInline {A} at (0,0) size 82x18 [color=#0000EE] +- RenderText {#text} at (7,7) size 82x18 +- text run at (7,7) width 82: "Test Case #2" +- RenderTableCell {TD} at (99,36) size 430x32 [r=1 c=1 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 300x18 [color=#0000FF] +- RenderInline {B} at (0,0) size 300x18 +- RenderText {#text} at (7,7) size 300x18 +- text run at (7,7) width 300: "table with data cells spanning multiple rows" +- RenderTableRow {TR} at (0,70) size 531x32 +- RenderTableCell {TD} at (2,70) size 96x32 [r=2 c=0 rs=1 cs=1] +- RenderInline {A} at (0,0) size 82x18 [color=#0000EE] +- RenderText {#text} at (7,7) size 82x18 +- text run at (7,7) width 82: "Test Case #3" +- RenderTableCell {TD} at (99,70) size 430x32 [r=2 c=1 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 416x18 [color=#0000FF] +- RenderInline {B} at (0,0) size 416x18 +- RenderText {#text} at (7,7) size 416x18 +- text run at (7,7) width 416: "table with nested header & data cells spanning multiple rows" +- RenderBlock {P} at (40,154) size 729x0 +- RenderListItem {LI} at (40,154) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "2" +- RenderText {#text} at (0,0) size 288x18 +- text run at (0,0) width 288: "Verify that the table is maintained when you " +- RenderInline {B} at (0,0) size 134x18 +- RenderText {#text} at (287,0) size 134x18 +- text run at (287,0) width 134: "minimize/maximize" +- RenderText {#text} at (420,0) size 73x18 +- text run at (420,0) width 73: " the screen." +- RenderListItem {LI} at (40,172) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "3" +- RenderText {#text} at (0,0) size 288x18 +- text run at (0,0) width 288: "Verify that the table is maintained when you " +- RenderInline {B} at (0,0) size 126x18 +- RenderText {#text} at (287,0) size 126x18 +- text run at (287,0) width 126: "re-size left & right" +- RenderText {#text} at (412,0) size 73x18 +- text run at (412,0) width 73: " the screen." +- RenderListItem {LI} at (40,190) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "4" +- RenderText {#text} at (0,0) size 288x18 +- text run at (0,0) width 288: "Verify that the table is maintained when you " +- RenderInline {B} at (0,0) size 141x18 +- RenderText {#text} at (287,0) size 141x18 +- text run at (287,0) width 141: "re-size top & bottom" +- RenderText {#text} at (427,0) size 73x18 +- text run at (427,0) width 73: " the screen." +- RenderListItem {LI} at (40,208) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "5" +- RenderText {#text} at (0,0) size 416x18 +- text run at (0,0) width 416: "Verify re-draw takes place correctly after maximizing the screen." +- RenderListItem {LI} at (40,226) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "6" +- RenderText {#text} at (0,0) size 132x18 +- text run at (0,0) width 132: "Verify reload works." +- RenderBlock {HR} at (0,513) size 769x3 [border: (1px inset #000000)] +- RenderBlock {P} at (0,531) size 769x62 +- RenderTable {TABLE} at (0,0) size 654x61 [bgcolor=#F08080] [border: (1px outset #808080)] +- RenderTableSection {TBODY} at (1,1) size 652x59 +- RenderTableRow {TR} at (0,2) size 652x55 +- RenderTableCell {TH} at (2,2) size 648x55 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderInline {A} at (0,0) size 0x0 +- RenderText {#text} at (11,11) size 95x18 +- text run at (11,11) width 95: "Test Case #1: " +- RenderInline {FONT} at (0,0) size 316x18 [color=#0000FF] +- RenderText {#text} at (105,11) size 316x18 +- text run at (105,11) width 316: "table with header cells spanning multiple rows" +- RenderText {#text} at (420,11) size 5x18 +- text run at (420,11) width 5: " " +- RenderInline {FONT} at (0,0) size 608x31 +- RenderInline {I} at (0,0) size 608x31 +- RenderText {#text} at (424,13) size 608x31 +- text run at (424,13) width 195: "(using tag)" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,608) size 769x137 +- RenderBlock (anonymous) at (0,0) size 769x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderTable {TABLE} at (0,18) size 693x118 [bgcolor=#FFD700] [border: (1px outset #808080)] +- RenderTableSection {TBODY} at (1,1) size 691x116 +- RenderTableRow {TR} at (0,2) size 691x112 +- RenderTableCell {TD} at (2,2) size 687x112 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 664x90 [color=#FF0000] +- RenderInline {B} at (0,0) size 664x90 +- RenderText {#text} at (11,11) size 361x18 +- text run at (11,11) width 361: "In the following sample table you should see that the " +- RenderInline {FONT} at (0,0) size 82x18 [color=#0000FF] +- RenderText {#text} at (371,11) size 82x18 +- text run at (371,11) width 82: "ROWSPAN" +- RenderText {#text} at (452,11) size 631x36 +- text run at (452,11) width 5: " " +- text run at (456,11) width 186: "attribute applies an integer" +- text run at (11,29) width 262: "value equal to the number of rows the " +- RenderInline {FONT} at (0,0) size 70x18 [color=#0000FF] +- RenderText {#text} at (272,29) size 70x18 +- text run at (272,29) width 70: "HEADER" +- RenderText {#text} at (341,29) size 664x72 +- text run at (341,29) width 138: " cell is to span. This " +- text run at (478,29) width 197: "tells the browser to make the" +- text run at (11,47) width 645: "table header cell occupy the same vertical space as the integer number of cells specified in rows" +- text run at (11,65) width 610: "above or below it. The browser flows the contents of the spanning cell to occupy the entire" +- text run at (11,83) width 103: "spanned space." +- RenderBlock {P} at (0,760) size 769x37 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBR {BR} at (0,18) size 0x18 +- RenderBlock {UL} at (0,812) size 769x263 +- RenderTable {TABLE} at (40,0) size 474x262 [border: (1px outset #808080)] +- RenderBlock {CAPTION} at (0,0) size 474x18 +- RenderText {#text} at (96,0) size 40x18 +- text run at (96,0) width 40: "Table " +- RenderInline {B} at (0,0) size 89x18 +- RenderText {#text} at (135,0) size 89x18 +- text run at (135,0) width 89: "Header Cells" +- RenderText {#text} at (223,0) size 155x18 +- text run at (223,0) width 155: " spanning multiple rows" +- RenderTableSection {TBODY} at (1,19) size 472x242 +- RenderTableRow {TR} at (0,2) size 472x22 +- RenderTableCell {TH} at (2,5) size 99x40 [bgcolor=#FFE4C4] [border: (1px inset #808080)] [r=0 c=0 rs=2 cs=1] +- RenderText {#text} at (18,2) size 63x18 +- text run at (18,2) width 63: "Header 1" +- RenderBR {BR} at (80,5) size 1x18 +- RenderText {#text} at (6,20) size 87x18 +- text run at (6,20) width 87: "span=2 rows" +- RenderTableCell {TD} at (102,2) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (143,2) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (184,2) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (225,2) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (266,2) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (307,2) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (348,2) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (389,2) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (430,2) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,26) size 472x22 +- RenderTableCell {TD} at (102,26) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (143,26) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (184,26) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (225,26) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (266,26) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (307,26) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (348,26) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (389,26) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (430,26) size 40x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,50) size 472x22 +- RenderTableCell {TH} at (2,89) size 99x40 [bgcolor=#FFE4C4] [border: (1px inset #808080)] [r=2 c=0 rs=5 cs=1] +- RenderText {#text} at (18,2) size 63x18 +- text run at (18,2) width 63: "Header 2" +- RenderBR {BR} at (80,41) size 1x18 +- RenderText {#text} at (6,20) size 87x18 +- text run at (6,20) width 87: "span=5 rows" +- RenderTableCell {TD} at (102,50) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (143,50) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (184,50) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (225,50) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (266,50) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (307,50) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (348,50) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (389,50) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (430,50) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,74) size 472x22 +- RenderTableCell {TD} at (102,74) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (143,74) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (184,74) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (225,74) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (266,74) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (307,74) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (348,74) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (389,74) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (430,74) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,98) size 472x22 [bgcolor=#FFE4C4] +- RenderTableCell {TD} at (102,98) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (143,98) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (184,98) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (225,98) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (266,98) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (307,98) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (348,98) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (389,98) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (430,98) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,122) size 472x22 +- RenderTableCell {TD} at (102,122) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (143,122) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (184,122) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (225,122) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (266,122) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (307,122) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (348,122) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (389,122) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (430,122) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,146) size 472x22 +- RenderTableCell {TD} at (102,146) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (143,146) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (184,146) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (225,146) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (266,146) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (307,146) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (348,146) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (389,146) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (430,146) size 40x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,170) size 472x22 +- RenderTableCell {TH} at (2,185) size 99x40 [bgcolor=#FFE4C4] [border: (1px inset #808080)] [r=7 c=0 rs=3 cs=1] +- RenderText {#text} at (18,2) size 63x18 +- text run at (18,2) width 63: "Header 3" +- RenderBR {BR} at (80,17) size 1x18 +- RenderText {#text} at (6,20) size 87x18 +- text run at (6,20) width 87: "span=3 rows" +- RenderTableCell {TD} at (102,170) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (143,170) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (184,170) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (225,170) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (266,170) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (307,170) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (348,170) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (389,170) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (430,170) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,194) size 472x22 +- RenderTableCell {TD} at (102,194) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (143,194) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (184,194) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (225,194) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (266,194) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (307,194) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (348,194) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (389,194) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (430,194) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,218) size 472x22 +- RenderTableCell {TD} at (102,218) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (143,218) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (184,218) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (225,218) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (266,218) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (307,218) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (348,218) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (389,218) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (430,218) size 40x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderBlock {P} at (0,1090) size 769x0 +- RenderBlock {HR} at (0,1090) size 769x3 [border: (1px inset #000000)] +- RenderBlock {P} at (0,1108) size 769x62 +- RenderTable {TABLE} at (0,0) size 654x61 [bgcolor=#F08080] [border: (1px outset #808080)] +- RenderTableSection {TBODY} at (1,1) size 652x59 +- RenderTableRow {TR} at (0,2) size 652x55 +- RenderTableCell {TH} at (2,2) size 648x55 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderInline {A} at (0,0) size 0x0 +- RenderText {#text} at (11,11) size 95x18 +- text run at (11,11) width 95: "Test Case #2: " +- RenderInline {FONT} at (0,0) size 300x18 [color=#0000FF] +- RenderText {#text} at (105,11) size 300x18 +- text run at (105,11) width 300: "table with data cells spanning multiple rows" +- RenderText {#text} at (404,11) size 5x18 +- text run at (404,11) width 5: " " +- RenderInline {FONT} at (0,0) size 591x31 +- RenderInline {I} at (0,0) size 591x31 +- RenderText {#text} at (408,13) size 591x31 +- text run at (408,13) width 194: "(using tag)" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,1185) size 769x137 +- RenderBlock (anonymous) at (0,0) size 769x18 +- RenderBR {BR} at (0,0) size 0x18 +- RenderTable {TABLE} at (0,18) size 693x118 [bgcolor=#FFD700] [border: (1px outset #808080)] +- RenderTableSection {TBODY} at (1,1) size 691x116 +- RenderTableRow {TR} at (0,2) size 691x112 +- RenderTableCell {TD} at (2,2) size 687x112 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 639x90 [color=#FF0000] +- RenderInline {B} at (0,0) size 639x90 +- RenderText {#text} at (11,11) size 361x18 +- text run at (11,11) width 361: "In the following sample table you should see that the " +- RenderInline {FONT} at (0,0) size 82x18 [color=#0000FF] +- RenderText {#text} at (371,11) size 82x18 +- text run at (371,11) width 82: "ROWSPAN" +- RenderText {#text} at (452,11) size 631x36 +- text run at (452,11) width 5: " " +- text run at (456,11) width 186: "attribute applies an integer" +- text run at (11,29) width 262: "value equal to the number of rows the " +- RenderInline {FONT} at (0,0) size 44x18 [color=#0000FF] +- RenderText {#text} at (272,29) size 44x18 +- text run at (272,29) width 44: "DATA" +- RenderText {#text} at (315,29) size 639x72 +- text run at (315,29) width 138: " cell is to span. This " +- text run at (452,29) width 198: "tells the browser to make the" +- text run at (11,47) width 629: "table data cell occupy the same vertical space as the integer number of cells specified in rows" +- text run at (11,65) width 610: "above or below it. The browser flows the contents of the spanning cell to occupy the entire" +- text run at (11,83) width 103: "spanned space." +- RenderBlock {P} at (0,1337) size 769x37 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBR {BR} at (0,18) size 0x18 +- RenderBlock {UL} at (0,1389) size 769x263 +- RenderTable {TABLE} at (40,0) size 474x262 [border: (1px outset #808080)] +- RenderBlock {CAPTION} at (0,0) size 474x18 +- RenderText {#text} at (104,0) size 41x18 +- text run at (104,0) width 41: "Table " +- RenderInline {B} at (0,0) size 71x18 +- RenderText {#text} at (144,0) size 71x18 +- text run at (144,0) width 71: "Data Cells" +- RenderText {#text} at (214,0) size 156x18 +- text run at (214,0) width 156: " spanning multiple rows" +- RenderTableSection {TBODY} at (1,19) size 472x242 +- RenderTableRow {TR} at (0,2) size 472x22 +- RenderTableCell {TH} at (2,2) size 41x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 37x18 +- text run at (2,2) width 37: "Head" +- RenderTableCell {TD} at (44,5) size 87x40 [bgcolor=#FFFACD] [border: (1px inset #808080)] [r=0 c=1 rs=2 cs=1] +- RenderText {#text} at (2,2) size 43x18 +- text run at (2,2) width 43: "Data 1" +- RenderBR {BR} at (44,5) size 1x18 +- RenderText {#text} at (2,20) size 82x18 +- text run at (2,20) width 82: "span=2 rows" +- RenderTableCell {TD} at (132,2) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (170,2) size 36x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (207,2) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (245,2) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (283,2) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (321,2) size 36x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (358,2) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (396,2) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (434,2) size 36x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,26) size 472x22 +- RenderTableCell {TH} at (2,26) size 41x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 37x18 +- text run at (2,2) width 37: "Head" +- RenderTableCell {TD} at (132,26) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (170,26) size 36x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (207,26) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (245,26) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (283,26) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (321,26) size 36x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (358,26) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (396,26) size 37x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (434,26) size 36x22 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,50) size 472x22 +- RenderTableCell {TH} at (2,50) size 41x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 37x18 +- text run at (2,2) width 37: "Head" +- RenderTableCell {TD} at (44,89) size 87x40 [bgcolor=#FFFACD] [border: (1px inset #808080)] [r=2 c=1 rs=5 cs=1] +- RenderText {#text} at (2,2) size 43x18 +- text run at (2,2) width 43: "Data 2" +- RenderBR {BR} at (44,41) size 1x18 +- RenderText {#text} at (2,20) size 82x18 +- text run at (2,20) width 82: "span=5 rows" +- RenderTableCell {TD} at (132,50) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (170,50) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (207,50) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (245,50) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (283,50) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (321,50) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (358,50) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (396,50) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (434,50) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,74) size 472x22 +- RenderTableCell {TH} at (2,74) size 41x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 37x18 +- text run at (2,2) width 37: "Head" +- RenderTableCell {TD} at (132,74) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (170,74) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (207,74) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (245,74) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (283,74) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (321,74) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (358,74) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (396,74) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (434,74) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,98) size 472x22 +- RenderTableCell {TH} at (2,98) size 41x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 37x18 +- text run at (2,2) width 37: "Head" +- RenderTableCell {TD} at (132,98) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (170,98) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (207,98) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (245,98) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (283,98) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (321,98) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (358,98) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (396,98) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (434,98) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,122) size 472x22 +- RenderTableCell {TH} at (2,122) size 41x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 37x18 +- text run at (2,2) width 37: "Head" +- RenderTableCell {TD} at (132,122) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (170,122) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (207,122) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (245,122) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (283,122) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (321,122) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (358,122) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (396,122) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (434,122) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,146) size 472x22 +- RenderTableCell {TH} at (2,146) size 41x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 37x18 +- text run at (2,2) width 37: "Head" +- RenderTableCell {TD} at (132,146) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (170,146) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (207,146) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (245,146) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (283,146) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (321,146) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (358,146) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (396,146) size 37x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (434,146) size 36x22 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,170) size 472x22 +- RenderTableCell {TH} at (2,170) size 41x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 37x18 +- text run at (2,2) width 37: "Head" +- RenderTableCell {TD} at (44,185) size 87x40 [bgcolor=#FFFACD] [border: (1px inset #808080)] [r=7 c=1 rs=3 cs=1] +- RenderText {#text} at (2,2) size 43x18 +- text run at (2,2) width 43: "Data 3" +- RenderBR {BR} at (44,17) size 1x18 +- RenderText {#text} at (2,20) size 82x18 +- text run at (2,20) width 82: "span=3 rows" +- RenderTableCell {TD} at (132,170) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (170,170) size 36x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (207,170) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (245,170) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (283,170) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (321,170) size 36x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (358,170) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (396,170) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (434,170) size 36x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,194) size 472x22 +- RenderTableCell {TH} at (2,194) size 41x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 37x18 +- text run at (2,2) width 37: "Head" +- RenderTableCell {TD} at (132,194) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (170,194) size 36x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (207,194) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (245,194) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (283,194) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (321,194) size 36x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (358,194) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (396,194) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (434,194) size 36x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderTableRow {TR} at (0,218) size 472x22 +- RenderTableCell {TH} at (2,218) size 41x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 37x18 +- text run at (2,2) width 37: "Head" +- RenderTableCell {TD} at (132,218) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 1" +- RenderTableCell {TD} at (170,218) size 36x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 2" +- RenderTableCell {TD} at (207,218) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 3" +- RenderTableCell {TD} at (245,218) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 4" +- RenderTableCell {TD} at (283,218) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 5" +- RenderTableCell {TD} at (321,218) size 36x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 6" +- RenderTableCell {TD} at (358,218) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 7" +- RenderTableCell {TD} at (396,218) size 37x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 8" +- RenderTableCell {TD} at (434,218) size 36x22 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 32x18 +- text run at (2,2) width 32: "col 9" +- RenderBlock {P} at (0,1667) size 769x0 +- RenderBlock {HR} at (0,1667) size 769x3 [border: (1px inset #000000)] +- RenderBlock {P} at (0,1685) size 769x62 +- RenderTable {TABLE} at (0,0) size 654x61 [bgcolor=#F08080] [border: (1px outset #808080)] +- RenderTableSection {TBODY} at (1,1) size 652x59 +- RenderTableRow {TR} at (0,2) size 652x55 +- RenderTableCell {TH} at (2,2) size 648x55 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderInline {A} at (0,0) size 0x0 +- RenderText {#text} at (11,11) size 95x18 +- text run at (11,11) width 95: "Test Case #3: " +- RenderInline {FONT} at (0,0) size 416x18 [color=#0000FF] +- RenderText {#text} at (105,11) size 416x18 +- text run at (105,11) width 416: "table with nested header & data cells spanning multiple rows" +- RenderText {#text} at (520,11) size 5x18 +- text run at (520,11) width 5: " " +- RenderInline {FONT} at (0,0) size 585x31 +- RenderInline {I} at (0,0) size 585x31 +- RenderText {#text} at (524,13) size 585x31 +- text run at (524,13) width 72: "(using tag)" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,1762) size 769x37 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBR {BR} at (0,18) size 0x18 +- RenderBlock {UL} at (0,1814) size 769x443 +- RenderTable {TABLE} at (40,0) size 474x442 [border: (1px outset #808080)] +- RenderBlock {CAPTION} at (0,0) size 474x18 +- RenderText {#text} at (26,0) size 89x18 +- text run at (26,0) width 89: "Nested Table " +- RenderInline {B} at (0,0) size 89x18 +- RenderText {#text} at (114,0) size 89x18 +- text run at (114,0) width 89: "Header Cells" +- RenderText {#text} at (202,0) size 21x18 +- text run at (202,0) width 21: " & " +- RenderInline {B} at (0,0) size 72x18 +- RenderText {#text} at (222,0) size 72x18 +- text run at (222,0) width 72: "Data Cells" +- RenderText {#text} at (293,0) size 155x18 +- text run at (293,0) width 155: " spanning multiple rows" +- RenderTableSection {TBODY} at (1,19) size 472x422 +- RenderTableRow {TR} at (0,2) size 472x40 +- RenderTableCell {TH} at (2,119) size 82x58 [bgcolor=#FFE4C4] [border: (1px inset #808080)] [r=0 c=0 rs=7 cs=1] +- RenderText {#text} at (9,2) size 63x18 +- text run at (9,2) width 63: "Header 1" +- RenderBR {BR} at (71,119) size 1x18 +- RenderText {#text} at (16,20) size 50x36 +- text run at (16,20) width 50: "span=7" +- text run at (24,38) width 33: "rows" +- RenderTableCell {TD} at (85,14) size 78x58 [bgcolor=#FFFACD] [border: (1px inset #808080)] [r=0 c=1 rs=2 cs=1] +- RenderText {#text} at (2,2) size 43x18 +- text run at (2,2) width 43: "Data 1" +- RenderBR {BR} at (44,14) size 1x18 +- RenderText {#text} at (2,20) size 47x36 +- text run at (2,20) width 47: "span=2" +- text run at (2,38) width 32: "rows" +- RenderTableCell {TD} at (164,2) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "1" +- RenderTableCell {TD} at (198,2) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "2" +- RenderTableCell {TD} at (232,2) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "3" +- RenderTableCell {TD} at (266,2) size 34x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "4" +- RenderTableCell {TD} at (301,2) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "5" +- RenderTableCell {TD} at (335,2) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "6" +- RenderTableCell {TD} at (369,2) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "7" +- RenderTableCell {TD} at (403,2) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "8" +- RenderTableCell {TD} at (437,2) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=0 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "9" +- RenderTableRow {TR} at (0,44) size 472x40 +- RenderTableCell {TD} at (164,44) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "1" +- RenderTableCell {TD} at (198,44) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "2" +- RenderTableCell {TD} at (232,44) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "3" +- RenderTableCell {TD} at (266,44) size 34x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "4" +- RenderTableCell {TD} at (301,44) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "5" +- RenderTableCell {TD} at (335,44) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "6" +- RenderTableCell {TD} at (369,44) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "7" +- RenderTableCell {TD} at (403,44) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "8" +- RenderTableCell {TD} at (437,44) size 33x40 [bgcolor=#EE82EE] [border: (1px inset #808080)] [r=1 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "9" +- RenderTableRow {TR} at (0,86) size 472x40 +- RenderTableCell {TD} at (85,161) size 78x58 [bgcolor=#FFFACD] [border: (1px inset #808080)] [r=2 c=1 rs=5 cs=1] +- RenderText {#text} at (2,2) size 43x18 +- text run at (2,2) width 43: "Data 2" +- RenderBR {BR} at (44,77) size 1x18 +- RenderText {#text} at (2,20) size 47x36 +- text run at (2,20) width 47: "span=5" +- text run at (2,38) width 32: "rows" +- RenderTableCell {TD} at (164,86) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "1" +- RenderTableCell {TD} at (198,86) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "2" +- RenderTableCell {TD} at (232,86) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "3" +- RenderTableCell {TD} at (266,86) size 34x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "4" +- RenderTableCell {TD} at (301,86) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "5" +- RenderTableCell {TD} at (335,86) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "6" +- RenderTableCell {TD} at (369,86) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "7" +- RenderTableCell {TD} at (403,86) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "8" +- RenderTableCell {TD} at (437,86) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=2 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "9" +- RenderTableRow {TR} at (0,128) size 472x40 +- RenderTableCell {TD} at (164,128) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "1" +- RenderTableCell {TD} at (198,128) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "2" +- RenderTableCell {TD} at (232,128) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "3" +- RenderTableCell {TD} at (266,128) size 34x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "4" +- RenderTableCell {TD} at (301,128) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "5" +- RenderTableCell {TD} at (335,128) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "6" +- RenderTableCell {TD} at (369,128) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "7" +- RenderTableCell {TD} at (403,128) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "8" +- RenderTableCell {TD} at (437,128) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=3 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "9" +- RenderTableRow {TR} at (0,170) size 472x40 +- RenderTableCell {TD} at (164,170) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "1" +- RenderTableCell {TD} at (198,170) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "2" +- RenderTableCell {TD} at (232,170) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "3" +- RenderTableCell {TD} at (266,170) size 34x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "4" +- RenderTableCell {TD} at (301,170) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "5" +- RenderTableCell {TD} at (335,170) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "6" +- RenderTableCell {TD} at (369,170) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "7" +- RenderTableCell {TD} at (403,170) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "8" +- RenderTableCell {TD} at (437,170) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=4 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "9" +- RenderTableRow {TR} at (0,212) size 472x40 +- RenderTableCell {TD} at (164,212) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "1" +- RenderTableCell {TD} at (198,212) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "2" +- RenderTableCell {TD} at (232,212) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "3" +- RenderTableCell {TD} at (266,212) size 34x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "4" +- RenderTableCell {TD} at (301,212) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "5" +- RenderTableCell {TD} at (335,212) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "6" +- RenderTableCell {TD} at (369,212) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "7" +- RenderTableCell {TD} at (403,212) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "8" +- RenderTableCell {TD} at (437,212) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=5 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "9" +- RenderTableRow {TR} at (0,254) size 472x40 +- RenderTableCell {TD} at (164,254) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "1" +- RenderTableCell {TD} at (198,254) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "2" +- RenderTableCell {TD} at (232,254) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "3" +- RenderTableCell {TD} at (266,254) size 34x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "4" +- RenderTableCell {TD} at (301,254) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "5" +- RenderTableCell {TD} at (335,254) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "6" +- RenderTableCell {TD} at (369,254) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "7" +- RenderTableCell {TD} at (403,254) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "8" +- RenderTableCell {TD} at (437,254) size 33x40 [bgcolor=#90EE90] [border: (1px inset #808080)] [r=6 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "9" +- RenderTableRow {TR} at (0,296) size 472x40 +- RenderTableCell {TH} at (2,329) size 82x58 [bgcolor=#FFE4C4] [border: (1px inset #808080)] [r=7 c=0 rs=3 cs=1] +- RenderText {#text} at (9,2) size 63x18 +- text run at (9,2) width 63: "Header 2" +- RenderBR {BR} at (71,35) size 1x18 +- RenderText {#text} at (16,20) size 50x36 +- text run at (16,20) width 50: "span=3" +- text run at (24,38) width 33: "rows" +- RenderTableCell {TD} at (85,329) size 78x58 [bgcolor=#FFFACD] [border: (1px inset #808080)] [r=7 c=1 rs=3 cs=1] +- RenderText {#text} at (2,2) size 43x18 +- text run at (2,2) width 43: "Data 3" +- RenderBR {BR} at (44,35) size 1x18 +- RenderText {#text} at (2,20) size 47x36 +- text run at (2,20) width 47: "span=3" +- text run at (2,38) width 32: "rows" +- RenderTableCell {TD} at (164,296) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "1" +- RenderTableCell {TD} at (198,296) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "2" +- RenderTableCell {TD} at (232,296) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "3" +- RenderTableCell {TD} at (266,296) size 34x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "4" +- RenderTableCell {TD} at (301,296) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "5" +- RenderTableCell {TD} at (335,296) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "6" +- RenderTableCell {TD} at (369,296) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "7" +- RenderTableCell {TD} at (403,296) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "8" +- RenderTableCell {TD} at (437,296) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=7 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "9" +- RenderTableRow {TR} at (0,338) size 472x40 +- RenderTableCell {TD} at (164,338) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "1" +- RenderTableCell {TD} at (198,338) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "2" +- RenderTableCell {TD} at (232,338) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "3" +- RenderTableCell {TD} at (266,338) size 34x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "4" +- RenderTableCell {TD} at (301,338) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "5" +- RenderTableCell {TD} at (335,338) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "6" +- RenderTableCell {TD} at (369,338) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "7" +- RenderTableCell {TD} at (403,338) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "8" +- RenderTableCell {TD} at (437,338) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=8 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "9" +- RenderTableRow {TR} at (0,380) size 472x40 +- RenderTableCell {TD} at (164,380) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "1" +- RenderTableCell {TD} at (198,380) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=3 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "2" +- RenderTableCell {TD} at (232,380) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=4 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "3" +- RenderTableCell {TD} at (266,380) size 34x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=5 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "4" +- RenderTableCell {TD} at (301,380) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=6 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "5" +- RenderTableCell {TD} at (335,380) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=7 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "6" +- RenderTableCell {TD} at (369,380) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=8 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "7" +- RenderTableCell {TD} at (403,380) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=9 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "8" +- RenderTableCell {TD} at (437,380) size 33x40 [bgcolor=#ADD8E6] [border: (1px inset #808080)] [r=9 c=10 rs=1 cs=1] +- RenderText {#text} at (2,2) size 20x36 +- text run at (2,2) width 20: "col" +- text run at (2,20) width 8: "9" +- RenderBlock {P} at (0,2272) size 769x0 +- RenderBlock {HR} at (0,2272) size 769x3 [border: (1px inset #000000)] +- RenderBlock (anonymous) at (0,2282) size 769x19 +- RenderImage {IMG} at (0,1) size 13x13 +- RenderText {#text} at (13,0) size 131x18 +- text run at (13,0) width 131: " Created 9/19/96 by " +- RenderInline {A} at (0,0) size 84x18 [color=#0000EE] +- RenderText {#text} at (143,0) size 84x18 +- text run at (143,0) width 84: "Ronald Greti" +- RenderBR {BR} at (226,0) size 1x18 +- RenderBlock {P} at (0,2316) size 769x19 +- RenderBR {BR} at (0,0) size 0x18 +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla/other/wa_table_tr_align-expected.txt b/LayoutTests/platform/mac-mojave/tables/mozilla/other/wa_table_tr_align-expected.txt +deleted file mode 100644 +index 58f54c882d719d4edf7b9811612e4f067de95312..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/tables/mozilla/other/wa_table_tr_align-expected.txt ++++ /dev/null +@@ -1,323 +0,0 @@ +-layer at (0,0) size 785x1309 +- RenderView at (0,0) size 785x600 +-layer at (0,0) size 785x1309 +- RenderBlock {HTML} at (0,0) size 785x1309 +- RenderBody {BODY} at (8,8) size 769x1285 [bgcolor=#FFDEAD] +- RenderBlock (anonymous) at (0,0) size 769x18 +- RenderText {#text} at (0,0) size 607x18 +- text run at (0,0) width 607: "If there is missing vertical space between tables and/or tables and other content, it is bug 6997." +- RenderBR {BR} at (606,0) size 1x18 +- RenderBlock {H1} at (0,39) size 769x75 +- RenderInline {FONT} at (0,0) size 470x74 [color=#FF0000] +- RenderText {#text} at (0,0) size 294x37 +- text run at (0,0) width 294: "Acceptance Test Case" +- RenderBR {BR} at (293,0) size 1x37 +- RenderText {#text} at (0,37) size 470x37 +- text run at (0,37) width 470: "Web Browser: Web View (HTML)" +- RenderBlock {P} at (0,134) size 769x29 +- RenderInline {FONT} at (0,0) size 216x28 [color=#FF0000] +- RenderInline {B} at (0,0) size 216x28 +- RenderText {#text} at (0,0) size 216x28 +- text run at (0,0) width 216: "Table: ALIGN" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (0,178) size 769x3 [border: (1px inset #000000)] +- RenderBlock (anonymous) at (0,188) size 769x73 +- RenderText {#text} at (0,0) size 277x18 +- text run at (0,0) width 277: "This acceptance test case tests the optional " +- RenderInline {B} at (0,0) size 42x18 +- RenderText {#text} at (276,0) size 42x18 +- text run at (276,0) width 42: "" +- RenderText {#text} at (317,0) size 28x18 +- text run at (317,0) width 28: " tag " +- RenderInline {B} at (0,0) size 54x18 +- RenderText {#text} at (344,0) size 54x18 +- text run at (344,0) width 54: "ALIGN" +- RenderText {#text} at (397,0) size 751x54 +- text run at (397,0) width 184: " attribute which controls the " +- text run at (580,0) width 171: "horizontal alignment of all" +- text run at (0,18) width 503: "the cells in a row. This cause the contents of each cell in the row to be aligned " +- text run at (502,18) width 229: "either LEFT|CENTER|RIGHT with" +- text run at (0,36) width 431: "respect to the current left and right margins of the display window. " +- text run at (430,36) width 29: "The " +- RenderInline {B} at (0,0) size 52x18 +- RenderText {#text} at (458,36) size 52x18 +- text run at (458,36) width 52: "Header" +- RenderText {#text} at (509,36) size 182x18 +- text run at (509,36) width 182: " cells by default are aligned " +- RenderInline {B} at (0,0) size 67x18 +- RenderText {#text} at (690,36) size 67x18 +- text run at (690,36) width 67: "CENTER" +- RenderText {#text} at (0,54) size 64x18 +- text run at (0,54) width 64: "while the " +- RenderInline {B} at (0,0) size 33x18 +- RenderText {#text} at (63,54) size 33x18 +- text run at (63,54) width 33: "Data" +- RenderText {#text} at (95,54) size 182x18 +- text run at (95,54) width 182: " cells by default are aligned " +- RenderInline {B} at (0,0) size 43x18 +- RenderText {#text} at (276,54) size 43x18 +- text run at (276,54) width 43: "LEFT" +- RenderText {#text} at (318,54) size 5x18 +- text run at (318,54) width 5: "." +- RenderBlock {P} at (0,276) size 769x19 +- RenderInline {B} at (0,0) size 120x18 +- RenderText {#text} at (0,0) size 120x18 +- text run at (0,0) width 120: "Test Instructions:" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {OL} at (0,310) size 769x211 +- RenderListItem {LI} at (40,0) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "1" +- RenderText {#text} at (0,0) size 510x18 +- text run at (0,0) width 510: "Verify that the sample text displays as stated in each of the following test cases:" +- RenderBlock {P} at (40,34) size 729x70 +- RenderTable {TABLE} at (0,0) size 718x70 [bgcolor=#F08080] +- RenderTableSection {TBODY} at (0,0) size 718x70 +- RenderTableRow {TR} at (0,2) size 718x32 +- RenderTableCell {TD} at (2,2) size 96x32 [r=0 c=0 rs=1 cs=1] +- RenderInline {A} at (0,0) size 82x18 [color=#0000EE] +- RenderText {#text} at (7,7) size 82x18 +- text run at (7,7) width 82: "Test Case #1" +- RenderTableCell {TD} at (99,2) size 617x32 [r=0 c=1 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 602x18 [color=#0000FF] +- RenderInline {B} at (0,0) size 602x18 +- RenderText {#text} at (7,7) size 602x18 +- text run at (7,7) width 602: "Table displaying Header \"CENTER \"& Data \"LEFT\" default horizontal row alignment" +- RenderTableRow {TR} at (0,36) size 718x32 +- RenderTableCell {TD} at (2,36) size 96x32 [r=1 c=0 rs=1 cs=1] +- RenderInline {A} at (0,0) size 82x18 [color=#0000EE] +- RenderText {#text} at (7,7) size 82x18 +- text run at (7,7) width 82: "Test Case #2" +- RenderTableCell {TD} at (99,36) size 617x32 [r=1 c=1 rs=1 cs=1] +- RenderInline {FONT} at (0,0) size 595x18 [color=#0000FF] +- RenderInline {B} at (0,0) size 595x18 +- RenderText {#text} at (7,7) size 595x18 +- text run at (7,7) width 595: "Tables displaying Header & Data \"LEFT|CENTER|RIGHT\" horizontal row alignment" +- RenderBlock {P} at (40,120) size 729x0 +- RenderListItem {LI} at (40,120) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "2" +- RenderText {#text} at (0,0) size 288x18 +- text run at (0,0) width 288: "Verify that the table is maintained when you " +- RenderInline {B} at (0,0) size 134x18 +- RenderText {#text} at (287,0) size 134x18 +- text run at (287,0) width 134: "minimize/maximize" +- RenderText {#text} at (420,0) size 73x18 +- text run at (420,0) width 73: " the screen." +- RenderListItem {LI} at (40,138) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "3" +- RenderText {#text} at (0,0) size 288x18 +- text run at (0,0) width 288: "Verify that the table is maintained when you " +- RenderInline {B} at (0,0) size 126x18 +- RenderText {#text} at (287,0) size 126x18 +- text run at (287,0) width 126: "re-size left & right" +- RenderText {#text} at (412,0) size 73x18 +- text run at (412,0) width 73: " the screen." +- RenderListItem {LI} at (40,156) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "4" +- RenderText {#text} at (0,0) size 288x18 +- text run at (0,0) width 288: "Verify that the table is maintained when you " +- RenderInline {B} at (0,0) size 141x18 +- RenderText {#text} at (287,0) size 141x18 +- text run at (287,0) width 141: "re-size top & bottom" +- RenderText {#text} at (427,0) size 73x18 +- text run at (427,0) width 73: " the screen." +- RenderListItem {LI} at (40,174) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "5" +- RenderText {#text} at (0,0) size 416x18 +- text run at (0,0) width 416: "Verify re-draw takes place correctly after maximizing the screen." +- RenderListItem {LI} at (40,192) size 729x18 +- RenderListMarker at (-20,0) size 16x18: "6" +- RenderText {#text} at (0,0) size 132x18 +- text run at (0,0) width 132: "Verify reload works." +- RenderBlock {HR} at (0,536) size 769x3 [border: (1px inset #000000)] +- RenderBlock {P} at (0,554) size 769x62 +- RenderTable {TABLE} at (0,0) size 769x61 [bgcolor=#F08080] [border: (1px outset #808080)] +- RenderTableSection {TBODY} at (1,1) size 767x59 +- RenderTableRow {TR} at (0,2) size 767x55 +- RenderTableCell {TH} at (2,2) size 763x55 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderInline {A} at (0,0) size 0x0 +- RenderText {#text} at (12,11) size 95x18 +- text run at (12,11) width 95: "Test Case #1: " +- RenderInline {FONT} at (0,0) size 603x18 [color=#0000FF] +- RenderText {#text} at (106,11) size 603x18 +- text run at (106,11) width 603: "Table displaying Header \"CENTER \"& Data \"LEFT\" default horizontal row alignment" +- RenderText {#text} at (708,11) size 5x18 +- text run at (708,11) width 5: " " +- RenderInline {FONT} at (0,0) size 403x31 +- RenderInline {I} at (0,0) size 403x31 +- RenderText {#text} at (712,13) size 403x31 +- text run at (712,13) width 39: "(using" +- text run at (348,29) width 67: " tag)" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,631) size 769x71 +- RenderTable {TABLE} at (0,0) size 347x70 [bgcolor=#FFE4C4] [border: (1px outset #808080)] +- RenderBlock {CAPTION} at (0,0) size 347x18 +- RenderText {#text} at (59,0) size 228x18 +- text run at (59,0) width 228: "Default Horizontal Row Alignment" +- RenderTableSection {TBODY} at (1,19) size 345x50 +- RenderTableRow {TR} at (0,2) size 345x22 +- RenderTableCell {TH} at (2,2) size 113x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (18,2) size 76x18 +- text run at (18,2) width 76: "row head 1" +- RenderTableCell {TH} at (116,2) size 113x22 [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (18,2) size 76x18 +- text run at (18,2) width 76: "row head 2" +- RenderTableCell {TH} at (230,2) size 113x22 [border: (1px inset #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (18,2) size 76x18 +- text run at (18,2) width 76: "row head 3" +- RenderTableRow {TR} at (0,26) size 345x22 +- RenderTableCell {TD} at (2,26) size 113x22 [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 68x18 +- text run at (2,2) width 68: "row data 1" +- RenderTableCell {TD} at (116,26) size 113x22 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 68x18 +- text run at (2,2) width 68: "row data 2" +- RenderTableCell {TD} at (230,26) size 113x22 [border: (1px inset #808080)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 68x18 +- text run at (2,2) width 68: "row data 3" +- RenderBlock {HR} at (0,717) size 769x3 [border: (1px inset #000000)] +- RenderBlock {P} at (0,735) size 769x62 +- RenderTable {TABLE} at (0,0) size 769x61 [bgcolor=#F08080] [border: (1px outset #808080)] +- RenderTableSection {TBODY} at (1,1) size 767x59 +- RenderTableRow {TR} at (0,2) size 767x55 +- RenderTableCell {TH} at (2,2) size 763x55 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderInline {A} at (0,0) size 0x0 +- RenderText {#text} at (16,11) size 95x18 +- text run at (16,11) width 95: "Test Case #2: " +- RenderInline {FONT} at (0,0) size 595x18 [color=#0000FF] +- RenderText {#text} at (110,11) size 595x18 +- text run at (110,11) width 595: "Tables displaying Header & Data \"LEFT|CENTER|RIGHT\" horizontal row alignment" +- RenderText {#text} at (704,11) size 5x18 +- text run at (704,11) width 5: " " +- RenderInline {FONT} at (0,0) size 498x31 +- RenderInline {I} at (0,0) size 498x31 +- RenderText {#text} at (708,13) size 498x31 +- text run at (708,13) width 39: "(using" +- text run at (249,29) width 265: " tag)" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,812) size 769x147 +- RenderTable {TABLE} at (0,0) size 347x146 [bgcolor=#FFE4C4] [border: (1px outset #808080)] +- RenderBlock {CAPTION} at (0,0) size 347x18 +- RenderText {#text} at (61,0) size 224x18 +- text run at (61,0) width 224: "Horizontal Row Alignment=LEFT" +- RenderTableSection {TBODY} at (1,19) size 345x126 +- RenderTableRow {TR} at (0,2) size 345x22 +- RenderTableCell {TH} at (2,2) size 113x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 76x18 +- text run at (2,2) width 76: "row head 1" +- RenderTableCell {TH} at (116,2) size 113x22 [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 76x18 +- text run at (2,2) width 76: "row head 2" +- RenderTableCell {TH} at (230,2) size 113x22 [border: (1px inset #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 76x18 +- text run at (2,2) width 76: "row head 3" +- RenderTableRow {TR} at (0,26) size 345x22 +- RenderTableCell {TD} at (2,26) size 113x22 [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (2,2) size 68x18 +- text run at (2,2) width 68: "row data 1" +- RenderTableCell {TD} at (116,26) size 113x22 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (2,2) size 68x18 +- text run at (2,2) width 68: "row data 2" +- RenderTableCell {TD} at (230,26) size 113x22 [border: (1px inset #808080)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (2,2) size 68x18 +- text run at (2,2) width 68: "row data 3" +- RenderTableRow {TR} at (0,50) size 345x74 [bgcolor=#FFD700] +- RenderTableCell {TD} at (2,50) size 341x74 [border: (1px inset #808080)] [r=2 c=0 rs=1 cs=3] +- RenderBlock (anonymous) at (2,2) size 337x54 +- RenderInline {B} at (0,0) size 325x54 +- RenderInline {FONT} at (0,0) size 325x54 [color=#FF0000] +- RenderText {#text} at (0,0) size 137x18 +- text run at (0,0) width 137: "Note: The attribute " +- RenderInline {FONT} at (0,0) size 104x18 [color=#0000FF] +- RenderText {#text} at (136,0) size 104x18 +- text run at (136,0) width 104: "ALIGN=LEFT" +- RenderText {#text} at (239,0) size 325x54 +- text run at (239,0) width 49: " has no" +- text run at (0,18) width 300: "special effect on the row data since it simply" +- text run at (0,36) width 325: "reiterates the default horizontal row alignment!" +- RenderBlock {P} at (2,72) size 337x0 +- RenderInline {B} at (0,0) size 0x0 +- RenderInline {FONT} at (0,0) size 0x0 [color=#FF0000] +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,974) size 769x147 +- RenderTable {TABLE} at (0,0) size 347x146 [bgcolor=#FFE4C4] [border: (1px outset #808080)] +- RenderBlock {CAPTION} at (0,0) size 347x18 +- RenderText {#text} at (49,0) size 248x18 +- text run at (49,0) width 248: "Horizontal Row Alignment=CENTER" +- RenderTableSection {TBODY} at (1,19) size 345x126 +- RenderTableRow {TR} at (0,2) size 345x22 +- RenderTableCell {TH} at (2,2) size 113x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (18,2) size 76x18 +- text run at (18,2) width 76: "row head 1" +- RenderTableCell {TH} at (116,2) size 113x22 [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (18,2) size 76x18 +- text run at (18,2) width 76: "row head 2" +- RenderTableCell {TH} at (230,2) size 113x22 [border: (1px inset #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (18,2) size 76x18 +- text run at (18,2) width 76: "row head 3" +- RenderTableRow {TR} at (0,26) size 345x22 +- RenderTableCell {TD} at (2,26) size 113x22 [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (22,2) size 68x18 +- text run at (22,2) width 68: "row data 1" +- RenderTableCell {TD} at (116,26) size 113x22 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (22,2) size 68x18 +- text run at (22,2) width 68: "row data 2" +- RenderTableCell {TD} at (230,26) size 113x22 [border: (1px inset #808080)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (22,2) size 68x18 +- text run at (22,2) width 68: "row data 3" +- RenderTableRow {TR} at (0,50) size 345x74 [bgcolor=#FFD700] +- RenderTableCell {TD} at (2,50) size 341x74 [border: (1px inset #808080)] [r=2 c=0 rs=1 cs=3] +- RenderBlock (anonymous) at (2,2) size 337x54 +- RenderInline {B} at (0,0) size 325x54 +- RenderInline {FONT} at (0,0) size 325x54 [color=#FF0000] +- RenderText {#text} at (0,0) size 137x18 +- text run at (0,0) width 137: "Note: The attribute " +- RenderInline {FONT} at (0,0) size 129x18 [color=#0000FF] +- RenderText {#text} at (136,0) size 129x18 +- text run at (136,0) width 129: "ALIGN=CENTER" +- RenderText {#text} at (264,0) size 325x54 +- text run at (264,0) width 49: " has no" +- text run at (0,18) width 302: "special effect on the row head since it simply" +- text run at (0,36) width 325: "reiterates the default horizontal row alignment!" +- RenderBlock {P} at (2,72) size 337x0 +- RenderInline {B} at (0,0) size 0x0 +- RenderInline {FONT} at (0,0) size 0x0 [color=#FF0000] +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {P} at (0,1136) size 769x71 +- RenderTable {TABLE} at (0,0) size 347x70 [bgcolor=#FFE4C4] [border: (1px outset #808080)] +- RenderBlock {CAPTION} at (0,0) size 347x18 +- RenderText {#text} at (56,0) size 234x18 +- text run at (56,0) width 234: "Horizontal Row Alignment=RIGHT" +- RenderTableSection {TBODY} at (1,19) size 345x50 +- RenderTableRow {TR} at (0,2) size 345x22 +- RenderTableCell {TH} at (2,2) size 113x22 [border: (1px inset #808080)] [r=0 c=0 rs=1 cs=1] +- RenderText {#text} at (34,2) size 77x18 +- text run at (34,2) width 77: "row head 1" +- RenderTableCell {TH} at (116,2) size 113x22 [border: (1px inset #808080)] [r=0 c=1 rs=1 cs=1] +- RenderText {#text} at (34,2) size 77x18 +- text run at (34,2) width 77: "row head 2" +- RenderTableCell {TH} at (230,2) size 113x22 [border: (1px inset #808080)] [r=0 c=2 rs=1 cs=1] +- RenderText {#text} at (34,2) size 77x18 +- text run at (34,2) width 77: "row head 3" +- RenderTableRow {TR} at (0,26) size 345x22 +- RenderTableCell {TD} at (2,26) size 113x22 [border: (1px inset #808080)] [r=1 c=0 rs=1 cs=1] +- RenderText {#text} at (42,2) size 69x18 +- text run at (42,2) width 69: "row data 1" +- RenderTableCell {TD} at (116,26) size 113x22 [border: (1px inset #808080)] [r=1 c=1 rs=1 cs=1] +- RenderText {#text} at (42,2) size 69x18 +- text run at (42,2) width 69: "row data 2" +- RenderTableCell {TD} at (230,26) size 113x22 [border: (1px inset #808080)] [r=1 c=2 rs=1 cs=1] +- RenderText {#text} at (42,2) size 69x18 +- text run at (42,2) width 69: "row data 3" +- RenderBlock {P} at (0,1222) size 769x0 +- RenderBlock {HR} at (0,1222) size 769x3 [border: (1px inset #000000)] +- RenderBlock (anonymous) at (0,1232) size 769x19 +- RenderImage {IMG} at (0,1) size 13x13 +- RenderText {#text} at (13,0) size 123x18 +- text run at (13,0) width 123: " Created 9/9/96 by " +- RenderInline {A} at (0,0) size 84x18 [color=#0000EE] +- RenderText {#text} at (135,0) size 84x18 +- text run at (135,0) width 84: "Ronald Greti" +- RenderBR {BR} at (218,0) size 1x18 +- RenderBlock {P} at (0,1266) size 769x19 +- RenderBR {BR} at (0,0) size 0x18 +- RenderBlock {P} at (0,1300) size 769x0 +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png b/LayoutTests/platform/mac-mojave/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png +deleted file mode 100644 +index b773e0e36cf83369453b6f28fe4cc34db9b8d144..0000000000000000000000000000000000000000 +Binary files a/LayoutTests/platform/mac-mojave/tables/mozilla_expected_failures/bugs/bug2479-5-expected.png and /dev/null differ +diff --git a/LayoutTests/platform/mac-mojave/tables/mozilla_expected_failures/bugs/bug2479-5-expected.txt b/LayoutTests/platform/mac-mojave/tables/mozilla_expected_failures/bugs/bug2479-5-expected.txt +deleted file mode 100644 +index e80c610e6aed5633b351c1992adb966754add069..0000000000000000000000000000000000000000 +--- a/LayoutTests/platform/mac-mojave/tables/mozilla_expected_failures/bugs/bug2479-5-expected.txt ++++ /dev/null +@@ -1,181 +0,0 @@ +-layer at (0,0) size 785x1443 +- RenderView at (0,0) size 785x600 +-layer at (8,8) size 769x1435 +- RenderBlock {HTML} at (8,8) size 769x1435 [bgcolor=#008000] [border: (16px solid #00FF00)] +- RenderTable at (16,16) size 737x1403 +- RenderTableSection (anonymous) at (0,0) size 737x1403 +- RenderTableRow (anonymous) at (0,0) size 737x1403 +- RenderTableCell {HEAD} at (0,0) size 242x472 [color=#FFFFFF] [bgcolor=#FF0000] [border: (5px solid #FFFFFF)] [r=0 c=0 rs=1 cs=1] +- RenderBlock {META} at (21,37) size 200x2 [border: (1px dotted #FFFFFF)] +- RenderBlock {META} at (21,55) size 200x2 [border: (1px dotted #FFFFFF)] +- RenderBlock {META} at (21,73) size 200x2 [border: (1px dotted #FFFFFF)] +- RenderBlock {META} at (21,91) size 200x2 [border: (1px dotted #FFFFFF)] +- RenderBlock {TITLE} at (21,109) size 200x56 [border: (1px dotted #FFFFFF)] +- RenderText {#text} at (1,1) size 188x54 +- text run at (1,1) width 188: "Evil Tests: Rendering BODY" +- text run at (1,19) width 163: "and HEAD as children of" +- text run at (1,37) width 67: "HTML - 2" +- RenderBlock {STYLE} at (21,181) size 200x254 [border: (1px dotted #FFFFFF)] +- RenderText {#text} at (1,1) size 196x252 +- text run at (1,1) width 83: "/* Layout */ " +- text run at (83,1) width 112: "HTML { display:" +- text run at (1,19) width 194: "block; border: 1em lime solid;" +- text run at (1,37) width 98: "margin: 8px; } " +- text run at (98,37) width 98: "HEAD, BODY" +- text run at (1,55) width 181: "{ display: table-cell; border:" +- text run at (1,73) width 76: "solid thick; " +- text run at (76,73) width 93: "padding: 1em;" +- text run at (1,91) width 102: "margin: 1em; } " +- text run at (102,91) width 74: "HEAD > *," +- text run at (1,109) width 181: "BODY > * { display: block;" +- text run at (1,127) width 178: "border: thin dotted; margin:" +- text run at (1,145) width 60: "1em 0; } " +- text run at (60,145) width 105: "/* Formatting */" +- text run at (1,163) width 141: "HTML { color: black;" +- text run at (1,181) width 140: "background: green; } " +- text run at (140,181) width 57: "HEAD {" +- text run at (1,199) width 195: "color: white; background: red;" +- text run at (1,217) width 12: "} " +- text run at (12,217) width 151: "BODY { color: yellow;" +- text run at (1,235) width 124: "background: teal; }" +- RenderTableCell {BODY} at (242,41) size 495x1362 [color=#FFFF00] [bgcolor=#008080] [border: (5px solid #FFFF00)] [r=0 c=1 rs=1 cs=1] +- RenderBlock {H1} at (21,53) size 453x76 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 152x37 +- text run at (1,1) width 152: "Rendering " +- RenderInline {CODE} at (0,0) size 63x30 +- RenderText {#text} at (153,6) size 63x30 +- text run at (153,6) width 63: "BODY" +- RenderText {#text} at (215,1) size 69x37 +- text run at (215,1) width 69: " and " +- RenderInline {CODE} at (0,0) size 63x30 +- RenderText {#text} at (283,6) size 63x30 +- text run at (283,6) width 63: "HEAD" +- RenderText {#text} at (345,1) size 381x74 +- text run at (345,1) width 37: " as" +- text run at (1,38) width 156: "children of " +- RenderInline {CODE} at (0,0) size 64x30 +- RenderText {#text} at (156,43) size 64x30 +- text run at (156,43) width 64: "HTML" +- RenderText {#text} at (219,38) size 43x37 +- text run at (219,38) width 43: " - 2" +- RenderBlock {P} at (21,161) size 453x38 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 393x18 +- text run at (1,1) width 393: "If you have any comments to make regarding this test, e-mail" +- RenderInline {A} at (0,0) size 186x18 [color=#0000EE] +- RenderText {#text} at (1,19) size 186x18 +- text run at (1,19) width 186: "py8ieh=eviltests@bath.ac.uk" +- RenderText {#text} at (186,19) size 5x18 +- text run at (186,19) width 5: "." +- RenderBlock {DL} at (21,215) size 453x92 [border: (1px dotted #FFFF00)] +- RenderBlock {DT} at (1,1) size 451x18 +- RenderText {#text} at (0,0) size 83x18 +- text run at (0,0) width 83: "Prerequisites" +- RenderBlock {DD} at (41,19) size 411x72 +- RenderText {#text} at (0,0) size 392x54 +- text run at (0,0) width 392: "Browsers that are subjected to this test should support the the" +- text run at (0,18) width 388: "background, padding, margin, border and color properties of" +- text run at (0,36) width 160: "CSS, and in addition the " +- RenderInline {CODE} at (0,0) size 63x15 +- RenderText {#text} at (160,38) size 63x15 +- text run at (160,38) width 63: "overflow" +- RenderText {#text} at (222,36) size 400x36 +- text run at (222,36) width 178: " property and fixed position" +- text run at (0,54) width 109: "stuff from CSS2." +- RenderBlock {H2} at (21,331) size 453x58 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 439x56 +- text run at (1,1) width 439: "1. Making the BODY and the HEAD into a" +- text run at (1,29) width 51: "table" +- RenderBlock {P} at (21,413) size 453x20 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 264x18 +- text run at (1,1) width 264: "This is really evil, but completely valid..." +- RenderBlock {P} at (21,449) size 453x110 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 450x108 +- text run at (1,1) width 450: "This document should have two cells, side by side: one on the left, the" +- text run at (1,19) width 402: "other on the right. The one on the left should be red with white" +- text run at (1,37) width 430: "writing and a thick white border. It should contain four dotted lines" +- text run at (1,55) width 388: "separated by a blank line, followed by a dotted bordered box" +- text run at (1,73) width 403: "containing the document title, and another dotted bordered box" +- text run at (1,91) width 286: "containing the stylesheet, also shown below:" +- RenderBlock {PRE} at (21,575) size 453x17 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 40x15 +- text run at (1,1) width 40: " ..." +- text run at (40,1) width 1: " " +- RenderBlock {P} at (21,608) size 453x38 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 419x36 +- text run at (1,1) width 419: "The dotted borders and lines and the text in the left cell should be" +- text run at (1,19) width 40: "white." +- RenderBlock {P} at (21,662) size 453x38 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 447x36 +- text run at (1,1) width 447: "The right cell should be teal, with yellow text. This paragraph you are" +- text run at (1,19) width 255: "reading now should be in this right cell." +- RenderBlock {P} at (21,716) size 453x38 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 413x36 +- text run at (1,1) width 413: "The width of the two cells is left up to the user agent to decide, I" +- text run at (1,19) width 37: "think." +- RenderBlock {P} at (21,770) size 453x74 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 443x72 +- text run at (1,1) width 443: "The right cell should look similar to the left cell in formatting -- each" +- text run at (1,19) width 442: "box of text should have a yellow dotted border, and there should be a" +- text run at (1,37) width 420: "blank line between each such box. No box should be nested -- the" +- text run at (1,55) width 356: "dotted boxes should always be distinct from each other." +- RenderBlock {P} at (21,860) size 453x38 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 417x36 +- text run at (1,1) width 417: "The cells should be the same height, and they should have grown" +- text run at (1,19) width 229: "vertically to accommodate this text." +- RenderBlock {P} at (21,914) size 453x56 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 437x54 +- text run at (1,1) width 436: "Around the whole setup should be two borders, dark green and light" +- text run at (1,19) width 437: "green. The cells should be separated from each other and from these" +- text run at (1,37) width 230: "outer borders by 1em of dark green." +- RenderBlock {P} at (21,986) size 453x38 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 446x36 +- text run at (1,1) width 446: "There should also be some alternate stylesheets set up to allow you to" +- text run at (1,19) width 388: "display the content. This may help with diagnosis." +- RenderBlock {H2} at (21,1048) size 453x30 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 156x28 +- text run at (1,1) width 156: "Submit Results" +- RenderBlock {FORM} at (21,1102) size 453x97 [border: (1px dotted #FFFF00)] +- RenderBlock {P} at (1,17) size 451x63 +- RenderText {#text} at (0,0) size 263x18 +- text run at (0,0) width 263: "How does your browser fare on this test?" +- RenderMenuList {SELECT} at (2,20) size 447x18 [color=#000000D8] [bgcolor=#FFFFFF] +- RenderBlock (anonymous) at (0,0) size 447x18 +- RenderText at (8,2) size 212x13 +- text run at (8,2) width 212: "Document renders exactly as described." +- RenderText {#text} at (0,0) size 0x0 +- RenderInline {LABEL} at (0,0) size 223x18 +- RenderText {#text} at (0,42) size 72x18 +- text run at (0,42) width 72: "Comment: " +- RenderTextControl {INPUT} at (73,42) size 148x19 [color=#000000] [bgcolor=#FFFFFF] [border: (2px inset #000000)] +- RenderText {#text} at (222,42) size 5x18 +- text run at (222,42) width 5: " " +- RenderButton {INPUT} at (228,43) size 54x18 [color=#000000D8] [bgcolor=#C0C0C0] +- RenderBlock (anonymous) at (8,2) size 37x13 +- RenderText at (0,0) size 37x13 +- text run at (0,0) width 37: "Submit" +- RenderText {#text} at (0,0) size 0x0 +- RenderBlock {HR} at (21,1215) size 453x2 [border: (1px dotted #FFFF00)] +- RenderBlock {P} at (21,1233) size 453x20 [border: (1px dotted #FFFF00)] +- RenderInline {A} at (0,0) size 162x18 [color=#0000EE] +- RenderText {#text} at (1,1) size 162x18 +- text run at (1,1) width 162: "Up to the Evil Tests Page" +- RenderText {#text} at (162,1) size 5x18 +- text run at (162,1) width 5: "." +- RenderBlock {P} at (21,1269) size 453x20 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 177x18 +- text run at (1,1) width 177: "This page is maintained by " +- RenderInline {A} at (0,0) size 79x18 [color=#0000EE] +- RenderText {#text} at (177,1) size 79x18 +- text run at (177,1) width 79: "Ian Hickson" +- RenderText {#text} at (255,1) size 10x18 +- text run at (255,1) width 10: " (" +- RenderInline {A} at (0,0) size 125x18 [color=#0000EE] +- RenderText {#text} at (264,1) size 125x18 +- text run at (264,1) width 125: "py8ieh@bath.ac.uk" +- RenderText {#text} at (388,1) size 10x18 +- text run at (388,1) width 10: ")." +- RenderBlock {P} at (21,1305) size 453x20 [border: (1px dotted #FFFF00)] +- RenderText {#text} at (1,1) size 172x18 +- text run at (1,1) width 172: "Last updated in June 1999." +-layer at (365,1229) size 141x13 backgroundClip at (365,1229) size 140x13 clip at (365,1229) size 140x13 +- RenderBlock {DIV} at (3,3) size 141x13 +diff --git a/LayoutTests/platform/mac-wk1/TestExpectations b/LayoutTests/platform/mac-wk1/TestExpectations +index 91bdc478841a1ff1f4901aed878c6f14b4b3bc6a..cabfe7890e8d9b20f8c39368ce9aa9765cdc9ada 100644 +--- a/LayoutTests/platform/mac-wk1/TestExpectations ++++ b/LayoutTests/platform/mac-wk1/TestExpectations +@@ -349,9 +349,6 @@ http/tests/intersection-observer [ Skip ] + imported/w3c/web-platform-tests/intersection-observer [ Skip ] + intersection-observer [ Skip ] + +-fast/dom/callback-function-detached-frame-intersection-observer.html [ Skip ] +-fast/dom/callback-function-detached-frame-resize-observer.html [ Skip ] +- + http/tests/lazyload [ Skip ] + imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/below-viewport-image-loading-lazy-load-event.html [ Skip ] + imported/w3c/web-platform-tests/html/semantics/embedded-content/the-img-element/disconnected-image-loading-lazy.html [ Skip ] +@@ -850,8 +847,6 @@ webkit.org/b/157589 fast/text-autosizing/ios/text-autosizing-after-back.html [ P + # repaint rects work differently on WK1 + fast/repaint/vertical-text-repaint.html [ Pass Failure ] + +-webkit.org/b/158585 webgl/webgl-backing-store-size-update.html [ Pass Timeout ] +- + # + editing/spelling/spelling-insert-html.html [ Pass Timeout ] + +@@ -959,12 +954,6 @@ http/tests/websocket/tests/hybi/network-process-crash-error.html [ Skip ] + # auto-sizing produces inconsistent image results + css3/viewport-percentage-lengths/vh-auto-size.html [ Skip ] + +-webkit.org/b/170877 [ Debug ] webgl/1.0.3/conformance/glsl/misc/shader-with-reserved-words.html [ Pass Timeout ] +- +-webkit.org/b/231514 [ BigSur+ ] webgl/1.0.3/conformance/uniforms/uniform-default-values.html [ Pass Timeout ] +- +-webkit.org/b/231541 [ BigSur+ Debug ] webgl/1.0.3/conformance/glsl/bugs/long-expressions-should-not-crash.html [ Pass Timeout ] +- + # This was a WK2-only fix. + http/tests/css/filters-on-iframes.html [ Skip ] + +@@ -1147,8 +1136,6 @@ imported/w3c/web-platform-tests/pointerevents/compat/pointerevent_compat-mouse-e + + webkit.org/b/198459 [ Debug ] inspector/canvas/recording-webgl-full.html [ Slow ] + +-webkit.org/b/219449 [ Debug ] webgl/2.0.0/conformance/glsl/misc/shader-uniform-packing-restrictions.html [ Skip ] +- + webkit.org/b/196508 compositing/repaint/scroller-with-foreground-layer-repaints.html [ Pass Failure ] + + webkit.org/b/198676 imported/w3c/web-platform-tests/content-security-policy/reporting/report-only-in-meta.sub.html [ Pass Failure ] +@@ -1243,13 +1230,6 @@ webkit.org/b/208384 imported/w3c/web-platform-tests/requestidlecallback/callback + + webkit.org/b/208449 [ Debug ] mathml/presentation/attributes-accent-accentunder-dynamic.html [ Pass ImageOnlyFailure ] + +-webkit.org/b/209479 [ Debug ] webgl/2.0.0/conformance2/rendering/blitframebuffer-filter-outofbounds.html [ Pass Timeout ] +- +-webkit.org/b/209480 [ Debug ] webgl/2.0.0/conformance/attribs/gl-vertexattribpointer.html [ Pass Timeout ] +- +-webkit.org/b/229580 [ Debug ] webgl/2.0.0/conformance/textures/misc/texture-upload-size.html [ Pass Crash ] +-webkit.org/b/229580 [ Debug ] webgl/2.0.0/conformance2/textures/misc/tex-srgb-mipmap.html [ Pass Crash ] +- + webkit.org/b/208825 [ Debug ] inspector/script-profiler/event-type-Microtask.html [ Pass Failure ] + + webkit.org/b/209180 inspector/script-profiler/event-type-Other.html [ Pass Failure ] +@@ -1266,8 +1246,6 @@ webkit.org/b/210079 [ Debug ] inspector/debugger/evaluateOnCallFrame-errors.html + + webkit.org/b/230072 [ Release ] inspector/dom/shadow-and-non-shadow-children.html [ Pass Failure ] + +-webkit.org/b/210198 webgl/2.0.0/conformance2/attribs/gl-vertexattribipointer.html [ Slow ] +- + webkit.org/b/208477 accessibility/mac/text-marker-for-index.html [ Skip ] + accessibility/mac/textmarker-range-for-range.html [ Skip ] + accessibility/mac/isolated-tree-mode-on-off.html [ Skip ] +@@ -1425,9 +1403,6 @@ fast/layoutformattingcontext/wbr-simple.html [ ImageOnlyFailure ] + + webkit.org/b/219498 imported/w3c/web-platform-tests/css/css-scroll-snap/scroll-target-padding-003.html [ Pass ImageOnlyFailure ] + +-webkit.org/b/217761 [ Debug ] webgl/conformance/extensions/s3tc-and-rgtc.html [ Skip ] +-webkit.org/b/217761 [ Debug ] webgl/2.0.0/conformance/extensions/webgl-compressed-texture-s3tc-srgb.html [ Skip ] +- + webkit.org/b/221009 fast/harness/render-tree-as-text-options.html [ Pass Failure ] + + webkit.org/b/221095 [ BigSur+ ] media/mediacapabilities/vp9.html [ Skip ] +@@ -1626,10 +1601,6 @@ webkit.org/b/230425 printing/allowed-breaks.html [ Pass Failure ] + # webkit.org/b/214448 Web Share API is not implemented for mac-wk1 + http/tests/webshare/ [ Skip ] + +-webkit.org/b/230835 [ BigSur Debug ] webgl/2.0.y/conformance/extensions/webgl-compressed-texture-s3tc-srgb.html [ Pass Crash ] +-webkit.org/b/230835 [ BigSur Debug ] webgl/1.0.3/conformance/extensions/oes-texture-float.html [ Pass Crash ] +-webkit.org/b/230835 [ BigSur Debug ] webgl/2.0.0/conformance/extensions/ext-blend-minmax.html [ Pass Crash ] +- + webkit.org/b/230842 [ BigSur Debug ] media/track/audio-track.html [ Pass Crash ] + + webkit.org/b/230848 [ BigSur Debug ] webrtc/datachannel/datachannel-gc.html [ Pass Crash ] +@@ -1866,17 +1837,9 @@ webkit.org/b/238642 imported/w3c/web-platform-tests/css/css-contain/contain-body + + webkit.org/b/237783 imported/w3c/web-platform-tests/html/semantics/forms/input-change-event-properties.html [ Timeout ] + +-webkit.org/b/239835 webgl/2.0.0/conformance/extensions/oes-texture-float-with-video.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance/extensions/oes-texture-half-float-with-video.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance/textures/video/tex-2d-rgba-rgba-unsigned_byte.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance/textures/video/tex-2d-rgba-rgba-unsigned_short_5_5_5_1.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance2/textures/image_bitmap_from_video/tex-2d-r8-red-unsigned_byte.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance2/textures/video/tex-2d-r11f_g11f_b10f-rgb-float.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance2/textures/video/tex-2d-r16f-red-float.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance2/textures/video/tex-2d-r16f-red-half_float.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance2/textures/video/tex-2d-r8ui-red_integer-unsigned_byte.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance2/textures/video/tex-2d-rg32f-rg-float.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance2/textures/video/tex-2d-rgb9_e5-rgb-float.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance2/textures/video/tex-3d-rg16f-rg-half_float.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance2/textures/video/tex-3d-rgb5_a1-rgba-unsigned_byte.html [ Pass Timeout ] +-webkit.org/b/239835 webgl/2.0.0/conformance2/textures/video/tex-3d-rgba4-rgba-unsigned_byte.html [ Pass Timeout ] ++webkit.org/b/237552 imported/w3c/web-platform-tests/html/browsers/history/the-location-interface/same-hash.html [ Pass Failure ] ++ ++webkit.org/b/240081 [ Debug ] webaudio/AudioBuffer/huge-buffer.html [ Pass Timeout ] ++ ++# rdar://82399990 ([ Catalina EWS ] webgl/2.0.0/* tests are flaky crashing ASSERTION FAILED: !needsLayout() (229580)) Disable webgl tests for mac-wk1 ++webgl [ Skip ] +diff --git a/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt b/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt +index 9c850fe6105d18975f4956c1e8bbf96b4ab4723d..ba4f0e87a2b2cafd5bed76456589ddf3555b8317 100644 +--- a/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt ++++ b/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/css/css-cascade/all-prop-revert-layer-expected.txt +@@ -236,8 +236,7 @@ PASS page-break-before + PASS page-break-inside + PASS paint-order + PASS perspective +-FAIL perspective-origin-x assert_not_equals: Should have the initial value. got disallowed value "" +-FAIL perspective-origin-y assert_not_equals: Should have the initial value. got disallowed value "" ++PASS perspective-origin + PASS pointer-events + PASS position + PASS print-color-adjust +@@ -312,9 +311,7 @@ PASS top + PASS touch-action + PASS transform + PASS transform-box +-FAIL transform-origin-x assert_not_equals: Should have the initial value. got disallowed value "" +-FAIL transform-origin-y assert_not_equals: Should have the initial value. got disallowed value "" +-FAIL transform-origin-z assert_not_equals: Should have the initial value. got disallowed value "" ++PASS transform-origin + PASS transform-style + PASS transition-delay + PASS transition-duration +diff --git a/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt b/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt +new file mode 100644 +index 0000000000000000000000000000000000000000..5a648d64d15312b260a62dcd913179f7430b6909 +--- /dev/null ++++ b/LayoutTests/platform/mac-wk1/imported/w3c/web-platform-tests/html/rendering/non-replaced-elements/form-controls/resets-expected.txt +@@ -0,0 +1,313 @@ ++ ++ ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++FAIL - display assert_equals: expected "inline-block" but got "inline-flex" ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++FAIL - display assert_equals: expected "inline-block" but got "inline-flex" ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++FAIL - display assert_equals: expected "inline-block" but got "inline-flex" ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++FAIL - display assert_equals: expected "inline-block" but got "inline-flex" ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++FAIL - display assert_equals: expected "inline-block" but got "inline-flex" ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++FAIL - box-sizing assert_equals: expected "border-box" but got "content-box" ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - display ++PASS - box-sizing ++PASS ) - letter-spacing ++PASS ) - line-height ++PASS ) - text-indent ++PASS ) - text-align ++PASS - letter-spacing ++PASS - word-spacing ++PASS - line-height ++PASS - text-transform ++PASS - text-indent ++PASS - text-shadow ++PASS - text-align ++PASS - box-sizing ++PASS