mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 10:12:45 +00:00 
			
		
		
		
	LibJS: Implement Temporal.ZonedDateTime.prototype.hour
This commit is contained in:
		
							parent
							
								
									0580f102e4
								
							
						
					
					
						commit
						32f1e17e71
					
				
					 3 changed files with 44 additions and 0 deletions
				
			
		|  | @ -36,6 +36,7 @@ void ZonedDateTimePrototype::initialize(GlobalObject& global_object) | |||
|     define_native_accessor(vm.names.month, month_getter, {}, Attribute::Configurable); | ||||
|     define_native_accessor(vm.names.monthCode, month_code_getter, {}, Attribute::Configurable); | ||||
|     define_native_accessor(vm.names.day, day_getter, {}, Attribute::Configurable); | ||||
|     define_native_accessor(vm.names.hour, hour_getter, {}, Attribute::Configurable); | ||||
| } | ||||
| 
 | ||||
| static ZonedDateTime* typed_this(GlobalObject& global_object) | ||||
|  | @ -185,4 +186,31 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::day_getter) | |||
|     return Value(calendar_day(global_object, calendar, *temporal_date_time)); | ||||
| } | ||||
| 
 | ||||
| // 6.3.9 get Temporal.ZonedDateTime.prototype.hour, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.hour
 | ||||
| JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::hour_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 𝔽(temporalDateTime.[[ISOHour]]).
 | ||||
|     return Value(temporal_date_time->iso_hour()); | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -25,6 +25,7 @@ private: | |||
|     JS_DECLARE_NATIVE_FUNCTION(month_getter); | ||||
|     JS_DECLARE_NATIVE_FUNCTION(month_code_getter); | ||||
|     JS_DECLARE_NATIVE_FUNCTION(day_getter); | ||||
|     JS_DECLARE_NATIVE_FUNCTION(hour_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.hour).toBe(23); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| test("errors", () => { | ||||
|     test("this value must be a Temporal.ZonedDateTime object", () => { | ||||
|         expect(() => { | ||||
|             Reflect.get(Temporal.ZonedDateTime.prototype, "hour", "foo"); | ||||
|         }).toThrowWithMessage(TypeError, "Not a Temporal.ZonedDateTime"); | ||||
|     }); | ||||
| }); | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus Groh
						Linus Groh