// Copyright (C) 2022 Igalia, S.L. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-temporal.plaindate
description: PlainDate constructor with non-integer arguments.
includes: [compareArray.js, temporalHelpers.js]
features: [Temporal]
---*/

TemporalHelpers.assertPlainDate(new Temporal.PlainDate(2020.6, 11.7, 24.1),
  2020, 11, "M11", 24, "positive fractional");

TemporalHelpers.assertPlainDate(new Temporal.PlainDate(-2020.6, 11.7, 24.1),
  -2020, 11, "M11", 24, "negative fractional");

TemporalHelpers.assertPlainDate(new Temporal.PlainDate(undefined, 11, 24),
  0, 11, "M11", 24, "undefined");

TemporalHelpers.assertPlainDate(new Temporal.PlainDate(null, 11, 24),
  0, 11, "M11", 24, "null");

TemporalHelpers.assertPlainDate(new Temporal.PlainDate(true, 11, 24),
  1, 11, "M11", 24, "boolean");

TemporalHelpers.assertPlainDate(new Temporal.PlainDate("2020.6", "11.7", "24.1"),
  2020, 11, "M11", 24, "fractional strings");

TemporalHelpers.assertPlainDate(new Temporal.PlainDate("invalid", 11, 24),
  0, 11, "M11", 24, "invalid string");

for (const invalid of [Symbol(), 1n]) {
  assert.throws(TypeError, () => new Temporal.PlainDate(invalid, 11, 24), `year ${typeof invalid}`);
  assert.throws(TypeError, () => new Temporal.PlainDate(2020, invalid, 24), `month ${typeof invalid}`);
  assert.throws(TypeError, () => new Temporal.PlainDate(2020, 11, invalid), `day ${typeof invalid}`);
}

const actual = [];
const args = [
  TemporalHelpers.toPrimitiveObserver(actual, 2020, "year"),
  TemporalHelpers.toPrimitiveObserver(actual, 11, "month"),
  TemporalHelpers.toPrimitiveObserver(actual, 24, "day"),
];
TemporalHelpers.assertPlainDate(new Temporal.PlainDate(...args),
  2020, 11, "M11", 24, "invalid string");
assert.compareArray(actual, [
  "get year.valueOf",
  "call year.valueOf",
  "get month.valueOf",
  "call month.valueOf",
  "get day.valueOf",
  "call day.valueOf",
]);
