// Copyright 2020 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Test
// https://github.com/tc39/proposal-intl-datetime-style/pull/43
// https://github.com/tc39/proposal-intl-datetime-style/pull/47
// https://github.com/tc39/proposal-intl-datetime-style/pull/50
let opt = {
  weekday: 'narrow',
  era: 'narrow',
  year: '2-digit',
  month: '2-digit',
  day: '2-digit',
  hour: '2-digit',
  minute: '2-digit',
  fractionalSecondDigits: 2,
};

let keys = Object.keys(opt);
let testDateStyle = { ...opt };
let testTimeStyle = { ...opt };
testDateStyle.dateStyle = 'long';
testTimeStyle.timeStyle = 'long';

for (key of keys) {
  assertThrows(
      () => new Intl.DateTimeFormat('en', testDateStyle),
      TypeError, "Can't set option " +  key + " when dateStyle is used");
  assertThrows(
      () => new Intl.DateTimeFormat('en', testTimeStyle),
      TypeError, "Can't set option " +  key + " when timeStyle is used");
  testDateStyle[key] = undefined;
  testTimeStyle[key] = undefined;
}

assertThrows(
    () => (new Date()).toLocaleDateString("en", {timeStyle: "long"}),
     TypeError, "Invalid option : timeStyle");

assertThrows(
    () => (new Date()).toLocaleTimeString("en", {dateStyle: "long"}),
     TypeError, "Invalid option : dateStyle");

let logs = [];
try {
  var dtf = new Intl.DateTimeFormat("en", {
    get timeStyle() {
      logs.push("get timeStyle");
      return "full";
    },
    get timeZoneName() {
      logs.push("get timeZoneName");
      return "short";
    },
  });
  logs.push(dtf.resolvedOptions().timeStyle);
  logs.push(dtf.resolvedOptions().timeZoneName);
} catch(e) {
  logs.push(e.name);
}

assertEquals(
    "get timeStyle,get timeZoneName,get timeStyle,TypeError",
    logs.join(','));
