// Copyright (C) 2021 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-temporal.calendar.prototype.datefromfields
description: Temporal.Calendar.prototype.dateFromFields with year, monthCode and day and need constrain
info: |
  1. Let calendar be the this value.
  2. Perform ? RequireInternalSlot(calendar, [[InitializedTemporalCalendar]]).
  3. Assert: calendar.[[Identifier]] is "iso8601".
  4. If Type(fields) is not Object, throw a TypeError exception.
  5. Set options to ? GetOptionsObject(options).
  6. Let result be ? ISODateFromFields(fields, options).
  7. Return ? CreateTemporalDate(result.[[Year]], result.[[Month]], result.[[Day]], calendar).
features: [Temporal]
includes: [temporalHelpers.js]
---*/
let cal = new Temporal.Calendar("iso8601")

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M01", day: 133}),
    2021, 1, "M01", 31,
    "year/monthCode/day with day need to be constrained in Jan");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M02", day: 133}),
    2021, 2, "M02", 28,
    "year/monthCode/day with day need to be constrained in Feb");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M03", day: 133}),
    2021, 3, "M03", 31,
    "year/monthCode/day with day need to be constrained in March");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M04", day: 133}),
    2021, 4, "M04", 30,
    "year/monthCode/day with day need to be constrained in April");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M05", day: 133}),
    2021, 5, "M05", 31,
    "year/monthCode/day with day need to be constrained in May");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M06", day: 133}),
    2021, 6, "M06", 30,
    "year/monthCode/day with day need to be constrained in Jun");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M07", day: 133}),
    2021, 7, "M07", 31,
    "year/monthCode/day with day need to be constrained in July");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M08", day: 133}),
    2021, 8, "M08", 31,
    "year/monthCode/day with day need to be constrained in Aug");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M09", day: 133}),
    2021, 9, "M09", 30,
    "year/monthCode/day with day need to be constrained in Sept.");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M10", day: 133}),
    2021, 10, "M10", 31,
    "year/monthCode/day with day need to be constrained in Oct.");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M11", day: 133}),
    2021, 11, "M11", 30,
    "year/monthCode/day with day need to be constrained in Nov.");

TemporalHelpers.assertPlainDate(
    cal.dateFromFields({year: 2021, monthCode: "M12", day: 133}),
    2021, 12, "M12", 31,
    "year/monthCode/day with day need to be constrained in Dec.");
