mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:32:44 +00:00 
			
		
		
		
	LibJS: Implement Temporal.ZonedDateTime.prototype.inLeapYear
This commit is contained in:
		
							parent
							
								
									5a7db1b5f4
								
							
						
					
					
						commit
						dd36593c72
					
				
					 3 changed files with 44 additions and 0 deletions
				
			
		|  | @ -53,6 +53,7 @@ void ZonedDateTimePrototype::initialize(GlobalObject& global_object) | |||
|     define_native_accessor(vm.names.daysInMonth, days_in_month_getter, {}, Attribute::Configurable); | ||||
|     define_native_accessor(vm.names.daysInYear, days_in_year_getter, {}, Attribute::Configurable); | ||||
|     define_native_accessor(vm.names.monthsInYear, months_in_year_getter, {}, Attribute::Configurable); | ||||
|     define_native_accessor(vm.names.inLeapYear, in_leap_year_getter, {}, Attribute::Configurable); | ||||
| } | ||||
| 
 | ||||
| static ZonedDateTime* typed_this(GlobalObject& global_object) | ||||
|  | @ -623,4 +624,31 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::months_in_year_getter) | |||
|     return calendar_months_in_year(global_object, calendar, *temporal_date_time); | ||||
| } | ||||
| 
 | ||||
| // 6.3.27 get Temporal.ZonedDateTime.prototype.inLeapYear, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.inleapyear
 | ||||
| JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::in_leap_year_getter) | ||||
| { | ||||
|     // 1. Let zonedDateTime be the this value.
 | ||||
|     // 2. Perform ? RequireInternalSlot(zonedDateTime, [[InitializedTemporalZonedDateTime]]).
 | ||||
|     auto* zoned_date_time = typed_this(global_object); | ||||
|     if (vm.exception()) | ||||
|         return {}; | ||||
| 
 | ||||
|     // 3. Let timeZone be zonedDateTime.[[TimeZone]].
 | ||||
|     auto& time_zone = zoned_date_time->time_zone(); | ||||
| 
 | ||||
|     // 4. Let instant be ! CreateTemporalInstant(zonedDateTime.[[Nanoseconds]]).
 | ||||
|     auto* instant = create_temporal_instant(global_object, zoned_date_time->nanoseconds()); | ||||
| 
 | ||||
|     // 5. Let calendar be zonedDateTime.[[Calendar]].
 | ||||
|     auto& calendar = zoned_date_time->calendar(); | ||||
| 
 | ||||
|     // 6. Let temporalDateTime be ? BuiltinTimeZoneGetPlainDateTimeFor(timeZone, instant, calendar).
 | ||||
|     auto* temporal_date_time = builtin_time_zone_get_plain_date_time_for(global_object, &time_zone, *instant, calendar); | ||||
|     if (vm.exception()) | ||||
|         return {}; | ||||
| 
 | ||||
|     // 7. Return ? CalendarInLeapYear(calendar, temporalDateTime).
 | ||||
|     return calendar_in_leap_year(global_object, calendar, *temporal_date_time); | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -42,6 +42,7 @@ private: | |||
|     JS_DECLARE_NATIVE_FUNCTION(days_in_month_getter); | ||||
|     JS_DECLARE_NATIVE_FUNCTION(days_in_year_getter); | ||||
|     JS_DECLARE_NATIVE_FUNCTION(months_in_year_getter); | ||||
|     JS_DECLARE_NATIVE_FUNCTION(in_leap_year_getter); | ||||
| }; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,15 @@ | |||
| describe("correct behavior", () => { | ||||
|     test("basic functionality", () => { | ||||
|         const timeZone = new Temporal.TimeZone("UTC"); | ||||
|         const zonedDateTime = new Temporal.ZonedDateTime(1625614921000000000n, timeZone); | ||||
|         expect(zonedDateTime.inLeapYear).toBeFalse(); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| test("errors", () => { | ||||
|     test("this value must be a Temporal.ZonedDateTime object", () => { | ||||
|         expect(() => { | ||||
|             Reflect.get(Temporal.ZonedDateTime.prototype, "inLeapYear", "foo"); | ||||
|         }).toThrowWithMessage(TypeError, "Not a Temporal.ZonedDateTime"); | ||||
|     }); | ||||
| }); | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus Groh
						Linus Groh