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