Procházet zdrojové kódy

LibJS: Throw a RangeError when when formatting strings in DurationFormat

This is a normative change in the Intl.DurationFormat proposal. See:
https://github.com/tc39/proposal-intl-duration-format/commit/2546080
Timothy Flynn před 2 roky
rodič
revize
a2cf026b30

+ 9 - 2
Userland/Libraries/LibJS/Runtime/Intl/DurationFormat.cpp

@@ -134,9 +134,16 @@ StringView DurationFormat::display_to_string(Display display)
 // 1.1.3 ToDurationRecord ( input ), https://tc39.es/proposal-intl-duration-format/#sec-todurationrecord
 ThrowCompletionOr<Temporal::DurationRecord> to_duration_record(VM& vm, Value input)
 {
-    // 1. If Type(input) is not Object, throw a TypeError exception.
-    if (!input.is_object())
+    // 1. If Type(input) is not Object, then
+    if (!input.is_object()) {
+        // a. If Type(input) is String, throw a RangeError exception.
+        if (input.is_string())
+            return vm.throw_completion<RangeError>(ErrorType::NotAnObject, input);
+
+        // b. Throw a TypeError exception.
         return vm.throw_completion<TypeError>(ErrorType::NotAnObject, input);
+    }
+
     auto& input_object = input.as_object();
 
     // 2. Let result be a new Duration Record with each field set to 0.

+ 5 - 1
Userland/Libraries/LibJS/Tests/builtins/Intl/DurationFormat/DurationFormat.prototype.format.js

@@ -92,7 +92,11 @@ describe("correct behavior", () => {
 
 describe("errors", () => {
     test("non-object duration records", () => {
-        [-100, Infinity, NaN, "hello", 152n, Symbol("foo")].forEach(value => {
+        expect(() => {
+            new Intl.DurationFormat().format("hello");
+        }).toThrowWithMessage(RangeError, "is not an object");
+
+        [-100, Infinity, NaN, 152n, Symbol("foo"), true, null, undefined].forEach(value => {
             expect(() => {
                 new Intl.DurationFormat().format(value);
             }).toThrowWithMessage(TypeError, "is not an object");

+ 5 - 1
Userland/Libraries/LibJS/Tests/builtins/Intl/DurationFormat/DurationFormat.prototype.formatToParts.js

@@ -266,7 +266,11 @@ describe("correct behavior", () => {
 
 describe("errors", () => {
     test("non-object duration records", () => {
-        [-100, Infinity, NaN, "hello", 152n, Symbol("foo")].forEach(value => {
+        expect(() => {
+            new Intl.DurationFormat().formatToParts("hello");
+        }).toThrowWithMessage(RangeError, "is not an object");
+
+        [-100, Infinity, NaN, 152n, Symbol("foo"), true, null, undefined].forEach(value => {
             expect(() => {
                 new Intl.DurationFormat().formatToParts(value);
             }).toThrowWithMessage(TypeError, "is not an object");