mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:52:45 +00:00 
			
		
		
		
	LibJS: Implement Temporal.PlainDate.prototype.withCalendar
This commit is contained in:
		
							parent
							
								
									8123e957e3
								
							
						
					
					
						commit
						9fa8f19a0f
					
				
					 4 changed files with 34 additions and 0 deletions
				
			
		|  | @ -382,6 +382,7 @@ namespace JS { | ||||||
|     P(warn)                                  \ |     P(warn)                                  \ | ||||||
|     P(weeks)                                 \ |     P(weeks)                                 \ | ||||||
|     P(with)                                  \ |     P(with)                                  \ | ||||||
|  |     P(withCalendar)                          \ | ||||||
|     P(writable)                              \ |     P(writable)                              \ | ||||||
|     P(year)                                  \ |     P(year)                                  \ | ||||||
|     P(years) |     P(years) | ||||||
|  |  | ||||||
|  | @ -29,6 +29,7 @@ void PlainDatePrototype::initialize(GlobalObject& global_object) | ||||||
|     define_native_accessor(vm.names.calendar, calendar_getter, {}, Attribute::Configurable); |     define_native_accessor(vm.names.calendar, calendar_getter, {}, Attribute::Configurable); | ||||||
| 
 | 
 | ||||||
|     u8 attr = Attribute::Writable | Attribute::Configurable; |     u8 attr = Attribute::Writable | Attribute::Configurable; | ||||||
|  |     define_native_function(vm.names.withCalendar, with_calendar, 1, attr); | ||||||
|     define_native_function(vm.names.equals, equals, 1, attr); |     define_native_function(vm.names.equals, equals, 1, attr); | ||||||
|     define_native_function(vm.names.valueOf, value_of, 0, attr); |     define_native_function(vm.names.valueOf, value_of, 0, attr); | ||||||
| } | } | ||||||
|  | @ -59,6 +60,24 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::calendar_getter) | ||||||
|     return Value(&temporal_date->calendar()); |     return Value(&temporal_date->calendar()); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // 3.3.22 Temporal.PlainDate.prototype.withCalendar ( calendar ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.withcalendar
 | ||||||
|  | JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::with_calendar) | ||||||
|  | { | ||||||
|  |     // 1. Let temporalDate be the this value.
 | ||||||
|  |     // 2. Perform ? RequireInternalSlot(temporalDate, [[InitializedTemporalDate]]).
 | ||||||
|  |     auto* temporal_date = typed_this(global_object); | ||||||
|  |     if (vm.exception()) | ||||||
|  |         return {}; | ||||||
|  | 
 | ||||||
|  |     // 3. Let calendar be ? ToTemporalCalendar(calendar).
 | ||||||
|  |     auto calendar = to_temporal_calendar(global_object, vm.argument(0)); | ||||||
|  |     if (vm.exception()) | ||||||
|  |         return {}; | ||||||
|  | 
 | ||||||
|  |     // 4. Return ? CreateTemporalDate(temporalDate.[[ISOYear]], temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], calendar).
 | ||||||
|  |     return create_temporal_date(global_object, temporal_date->iso_year(), temporal_date->iso_month(), temporal_date->iso_day(), *calendar); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // 3.3.25 Temporal.PlainDate.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.equals
 | // 3.3.25 Temporal.PlainDate.prototype.equals ( other ), https://tc39.es/proposal-temporal/#sec-temporal.plaindate.prototype.equals
 | ||||||
| JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::equals) | JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::equals) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -21,6 +21,7 @@ public: | ||||||
| private: | private: | ||||||
|     JS_DECLARE_NATIVE_FUNCTION(calendar_getter); |     JS_DECLARE_NATIVE_FUNCTION(calendar_getter); | ||||||
| 
 | 
 | ||||||
|  |     JS_DECLARE_NATIVE_FUNCTION(with_calendar); | ||||||
|     JS_DECLARE_NATIVE_FUNCTION(equals); |     JS_DECLARE_NATIVE_FUNCTION(equals); | ||||||
|     JS_DECLARE_NATIVE_FUNCTION(value_of); |     JS_DECLARE_NATIVE_FUNCTION(value_of); | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | @ -0,0 +1,13 @@ | ||||||
|  | describe("correct behavior", () => { | ||||||
|  |     test("length is 1", () => { | ||||||
|  |         expect(Temporal.PlainDate.prototype.withCalendar).toHaveLength(1); | ||||||
|  |     }); | ||||||
|  | 
 | ||||||
|  |     test("basic functionality", () => { | ||||||
|  |         const calendar = { hello: "friends" }; | ||||||
|  |         const firstPlainDate = new Temporal.PlainDate(1, 1, 1); | ||||||
|  |         expect(firstPlainDate.calendar).not.toBe(calendar); | ||||||
|  |         const secondPlainDate = firstPlainDate.withCalendar(calendar); | ||||||
|  |         expect(secondPlainDate.calendar).toBe(calendar); | ||||||
|  |     }); | ||||||
|  | }); | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Idan Horowitz
						Idan Horowitz