From 466c5bc96d0fc67d046ca75a204fd99ebc5f04f7 Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Wed, 14 Jul 2021 21:20:18 +0100 Subject: [PATCH] LibJS: Implement Temporal.Calendar.prototype.id --- .../LibJS/Runtime/Temporal/CalendarPrototype.cpp | 11 +++++++++++ .../LibJS/Runtime/Temporal/CalendarPrototype.h | 1 + .../Tests/builtins/Temporal/Calendar/Calendar.js | 3 +-- .../Temporal/Calendar/Calendar.prototype.id.js | 10 ++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 Userland/Libraries/LibJS/Tests/builtins/Temporal/Calendar/Calendar.prototype.id.js diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.cpp index c9328811ab..822c6486d0 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.cpp @@ -26,6 +26,7 @@ void CalendarPrototype::initialize(GlobalObject& global_object) define_direct_property(*vm.well_known_symbol_to_string_tag(), js_string(vm.heap(), "Temporal.Calendar"), Attribute::Configurable); u8 attr = Attribute::Writable | Attribute::Configurable; + define_native_accessor(vm.names.id, id_getter, {}, Attribute::Configurable); define_native_function(vm.names.toString, to_string, 0, attr); define_native_function(vm.names.toJSON, to_json, 0, attr); } @@ -43,6 +44,16 @@ static Calendar* typed_this(GlobalObject& global_object) return static_cast(this_object); } +// 12.4.3 get Temporal.Calendar.prototype.id, https://tc39.es/proposal-temporal/#sec-get-temporal.calendar.prototype.id +JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::id_getter) +{ + // 1. Let calendar be the this value. + auto calendar = vm.this_value(global_object); + + // 2. Return ? ToString(calendar). + return js_string(vm, calendar.to_string(global_object)); +} + // 12.4.23 Temporal.Calendar.prototype.toString ( ), https://tc39.es/proposal-temporal/#sec-temporal.calendar.prototype.tostring JS_DEFINE_NATIVE_FUNCTION(CalendarPrototype::to_string) { diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.h b/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.h index 229e63d749..80c96fc56b 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/CalendarPrototype.h @@ -19,6 +19,7 @@ public: virtual ~CalendarPrototype() override = default; private: + JS_DECLARE_NATIVE_FUNCTION(id_getter); JS_DECLARE_NATIVE_FUNCTION(to_string); JS_DECLARE_NATIVE_FUNCTION(to_json); }; diff --git a/Userland/Libraries/LibJS/Tests/builtins/Temporal/Calendar/Calendar.js b/Userland/Libraries/LibJS/Tests/builtins/Temporal/Calendar/Calendar.js index 4ddefcf3d7..a3e825db46 100644 --- a/Userland/Libraries/LibJS/Tests/builtins/Temporal/Calendar/Calendar.js +++ b/Userland/Libraries/LibJS/Tests/builtins/Temporal/Calendar/Calendar.js @@ -29,8 +29,7 @@ describe("normal behavior", () => { test("basic functionality", () => { const calendar = new Temporal.Calendar("iso8601"); - // FIXME: Enable this once Temporal.Calendar.prototype.id is implemented - // expect(calendar.id).toBe("iso8601"); + expect(calendar.id).toBe("iso8601"); expect(typeof calendar).toBe("object"); expect(calendar).toBeInstanceOf(Temporal.Calendar); expect(Object.getPrototypeOf(calendar)).toBe(Temporal.Calendar.prototype); diff --git a/Userland/Libraries/LibJS/Tests/builtins/Temporal/Calendar/Calendar.prototype.id.js b/Userland/Libraries/LibJS/Tests/builtins/Temporal/Calendar/Calendar.prototype.id.js new file mode 100644 index 0000000000..07660f5025 --- /dev/null +++ b/Userland/Libraries/LibJS/Tests/builtins/Temporal/Calendar/Calendar.prototype.id.js @@ -0,0 +1,10 @@ +describe("correct behavior", () => { + test("basic functionality", () => { + const calendar = new Temporal.Calendar("iso8601"); + expect(calendar.id).toBe("iso8601"); + }); + + test("works with any this value", () => { + expect(Reflect.get(Temporal.Calendar.prototype, "id", "foo")).toBe("foo"); + }); +});