From bb857330d2824b9142dd73c4ac4e3ac26db5b780 Mon Sep 17 00:00:00 2001 From: Idan Horowitz Date: Fri, 27 Aug 2021 18:15:19 +0300 Subject: [PATCH] LibJS: Implement Temporal.PlainDate.prototype.toPlainDateTime() --- .../Runtime/Temporal/PlainDatePrototype.cpp | 27 +++++++++++++++++++ .../Runtime/Temporal/PlainDatePrototype.h | 1 + .../PlainDate.prototype.toPlainDateTime.js | 20 ++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 Userland/Libraries/LibJS/Tests/builtins/Temporal/PlainDate/PlainDate.prototype.toPlainDateTime.js diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.cpp b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.cpp index 7718a85d8e..10de6519be 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.cpp @@ -11,7 +11,9 @@ #include #include #include +#include #include +#include #include namespace JS::Temporal { @@ -51,6 +53,7 @@ void PlainDatePrototype::initialize(GlobalObject& global_object) define_native_function(vm.names.getISOFields, get_iso_fields, 0, attr); define_native_function(vm.names.withCalendar, with_calendar, 1, attr); define_native_function(vm.names.equals, equals, 1, attr); + define_native_function(vm.names.toPlainDateTime, to_plain_date_time, 0, attr); define_native_function(vm.names.toString, to_string, 0, attr); define_native_function(vm.names.toLocaleString, to_locale_string, 0, attr); define_native_function(vm.names.toJSON, to_json, 0, attr); @@ -400,6 +403,30 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::equals) return Value(calendar_equals(global_object, temporal_date->calendar(), other->calendar())); } +// 3.3.26 Temporal.PlainDate.prototype.toPlainDateTime ( [ temporalTime ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.toplaindatetime +JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_plain_date_time) +{ + // 1. Let temporalDate be the this value. + // 2. Perform ? RequireInternalSlot(temporalDate, [[InitializedTemporalDate]]). + auto* temporal_date = typed_this(global_object); + if (vm.exception()) + return {}; + + // 3. If temporalTime is undefined, then + if (vm.argument(0).is_undefined()) { + // a. Return ? CreateTemporalDateTime(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], 0, 0, 0, 0, 0, 0, temporalDate.[[Calendar]]). + return create_temporal_date_time(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), 0, 0, 0, 0, 0, 0, temporal_date->calendar()); + } + + // 4. Set temporalTime to ? ToTemporalTime(temporalTime). + auto* temporal_time = to_temporal_time(global_object, vm.argument(0)); + if (vm.exception()) + return {}; + + // 5. Return ? CreateTemporalDateTime(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], temporalTime.[[ISOHour]], temporalTime.[[ISOMinute]], temporalTime.[[ISOSecond]], temporalTime.[[ISOMillisecond]], temporalTime.[[ISOMicrosecond]], temporalTime.[[ISONanosecond]], temporalDate.[[Calendar]]). + return create_temporal_date_time(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), temporal_time->iso_hour(), temporal_time->iso_minute(), temporal_time->iso_second(), temporal_time->iso_millisecond(), temporal_time->iso_microsecond(), temporal_time->iso_nanosecond(), temporal_date->calendar()); +} + // 3.3.28 Temporal.PlainDate.prototype.toString ( [ options ] ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.tostring JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::to_string) { diff --git a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.h b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.h index 490be0163f..d8021d5c02 100644 --- a/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.h +++ b/Userland/Libraries/LibJS/Runtime/Temporal/PlainDatePrototype.h @@ -37,6 +37,7 @@ private: JS_DECLARE_NATIVE_FUNCTION(get_iso_fields); JS_DECLARE_NATIVE_FUNCTION(with_calendar); JS_DECLARE_NATIVE_FUNCTION(equals); + JS_DECLARE_NATIVE_FUNCTION(to_plain_date_time); JS_DECLARE_NATIVE_FUNCTION(to_string); JS_DECLARE_NATIVE_FUNCTION(to_locale_string); JS_DECLARE_NATIVE_FUNCTION(to_json); diff --git a/Userland/Libraries/LibJS/Tests/builtins/Temporal/PlainDate/PlainDate.prototype.toPlainDateTime.js b/Userland/Libraries/LibJS/Tests/builtins/Temporal/PlainDate/PlainDate.prototype.toPlainDateTime.js new file mode 100644 index 0000000000..69fdb1cc48 --- /dev/null +++ b/Userland/Libraries/LibJS/Tests/builtins/Temporal/PlainDate/PlainDate.prototype.toPlainDateTime.js @@ -0,0 +1,20 @@ +describe("correct behavior", () => { + test("length is 0", () => { + expect(Temporal.PlainDate.prototype.toPlainDateTime).toHaveLength(0); + }); + + test("basic functionality", () => { + const plainDate = new Temporal.PlainDate(2021, 8, 27); + const plainTime = new Temporal.PlainTime(18, 11, 44, 1, 2, 3); + const plainDateTime = plainDate.toPlainDateTime(plainTime); + expect(plainDateTime.year).toBe(2021); + expect(plainDateTime.month).toBe(8); + expect(plainDateTime.day).toBe(27); + expect(plainDateTime.hour).toBe(18); + expect(plainDateTime.minute).toBe(11); + expect(plainDateTime.second).toBe(44); + expect(plainDateTime.millisecond).toBe(1); + expect(plainDateTime.microsecond).toBe(2); + expect(plainDateTime.nanosecond).toBe(3); + }); +});