mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 15:32:46 +00:00 
			
		
		
		
	LibJS: Implement Temporal.PlainDate.prototype.monthsInYear
This commit is contained in:
		
							parent
							
								
									342172da37
								
							
						
					
					
						commit
						dd15fc471c
					
				
					 5 changed files with 43 additions and 0 deletions
				
			
		|  | @ -263,6 +263,16 @@ Value calendar_days_in_year(GlobalObject& global_object, Object& calendar, Objec | |||
|     return calendar.invoke(vm.names.daysInYear, &date_like); | ||||
| } | ||||
| 
 | ||||
| // 12.1.19 CalendarMonthsInYear ( calendar, dateLike ), https://tc39.es/proposal-temporal/#sec-temporal-calendarmonthsinyear
 | ||||
| Value calendar_months_in_year(GlobalObject& global_object, Object& calendar, Object& date_like) | ||||
| { | ||||
|     auto& vm = global_object.vm(); | ||||
|     // 1. Assert: Type(calendar) is Object.
 | ||||
| 
 | ||||
|     // 2. Return ? Invoke(calendar, "monthsInYear", « dateLike »).
 | ||||
|     return calendar.invoke(vm.names.monthsInYear, &date_like); | ||||
| } | ||||
| 
 | ||||
| // 12.1.21 ToTemporalCalendar ( temporalCalendarLike ), https://tc39.es/proposal-temporal/#sec-temporal-totemporalcalendar
 | ||||
| Object* to_temporal_calendar(GlobalObject& global_object, Value temporal_calendar_like) | ||||
| { | ||||
|  |  | |||
|  | @ -44,6 +44,7 @@ Value calendar_week_of_year(GlobalObject&, Object& calendar, Object& date_like); | |||
| Value calendar_days_in_week(GlobalObject&, Object& calendar, Object& date_like); | ||||
| Value calendar_days_in_month(GlobalObject&, Object& calendar, Object& date_like); | ||||
| Value calendar_days_in_year(GlobalObject&, Object& calendar, Object& date_like); | ||||
| Value calendar_months_in_year(GlobalObject&, Object& calendar, Object& date_like); | ||||
| Object* to_temporal_calendar(GlobalObject&, Value); | ||||
| Object* to_temporal_calendar_with_iso_default(GlobalObject&, Value); | ||||
| Object* get_temporal_calendar_with_iso_default(GlobalObject&, Object&); | ||||
|  |  | |||
|  | @ -37,6 +37,7 @@ void PlainDatePrototype::initialize(GlobalObject& global_object) | |||
|     define_native_accessor(vm.names.daysInWeek, days_in_week_getter, {}, Attribute::Configurable); | ||||
|     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); | ||||
| 
 | ||||
|     u8 attr = Attribute::Writable | Attribute::Configurable; | ||||
|     define_native_function(vm.names.withCalendar, with_calendar, 1, attr); | ||||
|  | @ -230,6 +231,22 @@ JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::days_in_year_getter) | |||
|     return Value(calendar_days_in_year(global_object, calendar, *temporal_date)); | ||||
| } | ||||
| 
 | ||||
| // 3.3.14 get Temporal.PlainDate.prototype.monthsInYear, https://tc39.es/proposal-temporal/#sec-get-temporal.plaindate.prototype.monthsinyear
 | ||||
| JS_DEFINE_NATIVE_FUNCTION(PlainDatePrototype::months_in_year_getter) | ||||
| { | ||||
|     // 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 temporalDate.[[Calendar]].
 | ||||
|     auto& calendar = temporal_date->calendar(); | ||||
| 
 | ||||
|     // 4. Return ? CalendarMonthsInYear(calendar, temporalDate).
 | ||||
|     return Value(calendar_months_in_year(global_object, calendar, *temporal_date)); | ||||
| } | ||||
| 
 | ||||
| // 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) | ||||
| { | ||||
|  |  | |||
|  | @ -30,6 +30,7 @@ private: | |||
|     JS_DECLARE_NATIVE_FUNCTION(days_in_week_getter); | ||||
|     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(with_calendar); | ||||
|     JS_DECLARE_NATIVE_FUNCTION(equals); | ||||
|  |  | |||
|  | @ -0,0 +1,14 @@ | |||
| describe("correct behavior", () => { | ||||
|     test("basic functionality", () => { | ||||
|         const date = new Temporal.PlainDate(2021, 7, 23); | ||||
|         expect(date.monthsInYear).toBe(12); | ||||
|     }); | ||||
| }); | ||||
| 
 | ||||
| test("errors", () => { | ||||
|     test("this value must be a Temporal.PlainDate object", () => { | ||||
|         expect(() => { | ||||
|             Reflect.get(Temporal.PlainDate.prototype, "monthsInYear", "foo"); | ||||
|         }).toThrowWithMessage(TypeError, "Not a Temporal.PlainDate"); | ||||
|     }); | ||||
| }); | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Idan Horowitz
						Idan Horowitz