diff --git a/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.cpp b/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.cpp index ae665cf88f1..0814ca7d31b 100644 --- a/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.cpp +++ b/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -67,6 +68,8 @@ void PlainDateTimePrototype::initialize(Realm& realm) define_native_function(realm, vm.names.toString, to_string, 0, attr); define_native_function(realm, vm.names.toLocaleString, to_locale_string, 0, attr); define_native_function(realm, vm.names.toJSON, to_json, 0, attr); + define_native_function(realm, vm.names.toPlainDate, to_plain_date, 0, attr); + define_native_function(realm, vm.names.toPlainTime, to_plain_time, 0, attr); } // 5.3.3 get Temporal.PlainDateTime.prototype.calendarId, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindatetime.prototype.calendarid @@ -547,4 +550,26 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_json) return PrimitiveString::create(vm, iso_date_time_to_string(date_time->iso_date_time(), date_time->calendar(), Auto {}, ShowCalendar::Auto)); } +// 5.3.39 Temporal.PlainDateTime.prototype.toPlainDate ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.toplaindate +JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_plain_date) +{ + // 1. Let dateTime be the this value. + // 2. Perform ? RequireInternalSlot(dateTime, [[InitializedTemporalDateTime]]). + auto date_time = TRY(typed_this_object(vm)); + + // 3. Return ! CreateTemporalDate(dateTime.[[ISODateTime]].[[ISODate]], dateTime.[[Calendar]]). + return MUST(create_temporal_date(vm, date_time->iso_date_time().iso_date, date_time->calendar())); +} + +// 5.3.40 Temporal.PlainDateTime.prototype.toPlainTime ( ), https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.toplaintime +JS_DEFINE_NATIVE_FUNCTION(PlainDateTimePrototype::to_plain_time) +{ + // 1. Let dateTime be the this value. + // 2. Perform ? RequireInternalSlot(dateTime, [[InitializedTemporalDateTime]]). + auto date_time = TRY(typed_this_object(vm)); + + // 3. Return ! CreateTemporalTime(dateTime.[[ISODateTime]].[[Time]]). + return MUST(create_temporal_time(vm, date_time->iso_date_time().time)); +} + } diff --git a/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.h b/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.h index 67dd8a31443..0091eeb3d29 100644 --- a/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.h +++ b/Libraries/LibJS/Runtime/Temporal/PlainDateTimePrototype.h @@ -57,6 +57,8 @@ private: JS_DECLARE_NATIVE_FUNCTION(to_string); JS_DECLARE_NATIVE_FUNCTION(to_locale_string); JS_DECLARE_NATIVE_FUNCTION(to_json); + JS_DECLARE_NATIVE_FUNCTION(to_plain_date); + JS_DECLARE_NATIVE_FUNCTION(to_plain_time); }; } diff --git a/Libraries/LibJS/Tests/builtins/Temporal/PlainDateTime/PlainDateTime.prototype.toPlainDate.js b/Libraries/LibJS/Tests/builtins/Temporal/PlainDateTime/PlainDateTime.prototype.toPlainDate.js new file mode 100644 index 00000000000..7723de2a3b3 --- /dev/null +++ b/Libraries/LibJS/Tests/builtins/Temporal/PlainDateTime/PlainDateTime.prototype.toPlainDate.js @@ -0,0 +1,11 @@ +describe("normal behavior", () => { + test("length is 0", () => { + expect(Temporal.PlainDateTime.prototype.toPlainDate).toHaveLength(0); + }); + + test("basic functionality", () => { + const plainDateTime = new Temporal.PlainDateTime(2021, 7, 23, 0, 32, 18, 123, 456, 789); + const plainDate = plainDateTime.toPlainDate(); + expect(plainDate.equals(new Temporal.PlainDate(2021, 7, 23))).toBeTrue(); + }); +}); diff --git a/Libraries/LibJS/Tests/builtins/Temporal/PlainDateTime/PlainDateTime.prototype.toPlainTime.js b/Libraries/LibJS/Tests/builtins/Temporal/PlainDateTime/PlainDateTime.prototype.toPlainTime.js new file mode 100644 index 00000000000..feb4839dc9b --- /dev/null +++ b/Libraries/LibJS/Tests/builtins/Temporal/PlainDateTime/PlainDateTime.prototype.toPlainTime.js @@ -0,0 +1,16 @@ +describe("normal behavior", () => { + test("length is 0", () => { + expect(Temporal.PlainDateTime.prototype.toPlainTime).toHaveLength(0); + }); + + test("basic functionality", () => { + const plainDateTime = new Temporal.PlainDateTime(2021, 7, 31, 0, 32, 18, 123, 456, 789); + const plainTime = plainDateTime.toPlainTime(); + expect(plainTime.hour).toBe(0); + expect(plainTime.minute).toBe(32); + expect(plainTime.second).toBe(18); + expect(plainTime.millisecond).toBe(123); + expect(plainTime.microsecond).toBe(456); + expect(plainTime.nanosecond).toBe(789); + }); +});