mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:12:45 +00:00 
			
		
		
		
	LibJS: Implement Temporal.ZonedDateTime.prototype.microsecond
This commit is contained in:
		
							parent
							
								
									752b3eb0c0
								
							
						
					
					
						commit
						4b22d0f2ce
					
				
					 3 changed files with 44 additions and 0 deletions
				
			
		|  | @ -40,6 +40,7 @@ void ZonedDateTimePrototype::initialize(GlobalObject& global_object) | |||
|     define_native_accessor(vm.names.minute, minute_getter, {}, Attribute::Configurable); | ||||
|     define_native_accessor(vm.names.second, second_getter, {}, Attribute::Configurable); | ||||
|     define_native_accessor(vm.names.millisecond, millisecond_getter, {}, Attribute::Configurable); | ||||
|     define_native_accessor(vm.names.microsecond, microsecond_getter, {}, Attribute::Configurable); | ||||
| } | ||||
| 
 | ||||
| static ZonedDateTime* typed_this(GlobalObject& global_object) | ||||
|  | @ -297,4 +298,31 @@ JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::millisecond_getter) | |||
|     return Value(temporal_date_time->iso_millisecond()); | ||||
| } | ||||
| 
 | ||||
| // 6.3.13 get Temporal.ZonedDateTime.prototype.microsecond, https://tc39.es/proposal-temporal/#sec-get-temporal.zoneddatetime.prototype.microsecond
 | ||||
| JS_DEFINE_NATIVE_FUNCTION(ZonedDateTimePrototype::microsecond_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.[[ISOMicrosecond]]).
 | ||||
|     return Value(temporal_date_time->iso_microsecond()); | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -29,6 +29,7 @@ private: | |||
|     JS_DECLARE_NATIVE_FUNCTION(minute_getter); | ||||
|     JS_DECLARE_NATIVE_FUNCTION(second_getter); | ||||
|     JS_DECLARE_NATIVE_FUNCTION(millisecond_getter); | ||||
|     JS_DECLARE_NATIVE_FUNCTION(microsecond_getter); | ||||
| }; | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -0,0 +1,15 @@ | |||
| describe("correct behavior", () => { | ||||
|     test("basic functionality", () => { | ||||
|         const timeZone = new Temporal.TimeZone("UTC"); | ||||
|         const zonedDateTime = new Temporal.ZonedDateTime(123000n, timeZone); | ||||
|         expect(zonedDateTime.microsecond).toBe(123); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| test("errors", () => { | ||||
|     test("this value must be a Temporal.ZonedDateTime object", () => { | ||||
|         expect(() => { | ||||
|             Reflect.get(Temporal.ZonedDateTime.prototype, "microsecond", "foo"); | ||||
|         }).toThrowWithMessage(TypeError, "Not a Temporal.ZonedDateTime"); | ||||
|     }); | ||||
| }); | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Linus Groh
						Linus Groh