// Copyright 2019 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.

// Flags: --harmony-intl-date-format-range

let descriptor = Object.getOwnPropertyDescriptor(
      Intl.DateTimeFormat.prototype, "formatRange");
assertTrue(descriptor.writable);
assertFalse(descriptor.enumerable);
assertTrue(descriptor.configurable);

const date1 = new Date("2019-1-3");
const date2 = new Date("2019-1-5");
const date3 = new Date("2019-3-4");
const date4 = new Date("2020-3-4");
var dtf = new Intl.DateTimeFormat(["en"]);
assertThrows(() => dtf.formatRange(), RangeError);
assertThrows(() => dtf.formatRange(date1), RangeError);
assertThrows(() => dtf.formatRange(undefined, date2), RangeError);
assertThrows(() => dtf.formatRange(date1, undefined), RangeError);
assertThrows(() => dtf.formatRange("2019-1-3", date2), RangeError);
assertThrows(() => dtf.formatRange(date1, "2019-5-4"), RangeError);
assertThrows(() => dtf.formatRange(date2, date1), RangeError);

assertDoesNotThrow(() =>dtf.formatRange(date1, date2));

assertEquals("1/3/2019 – 1/5/2019", dtf.formatRange(date1, date2));
assertEquals("1/3/2019 – 3/4/2019", dtf.formatRange(date1, date3));
assertEquals("1/3/2019 – 3/4/2020", dtf.formatRange(date1, date4));
assertEquals("1/5/2019 – 3/4/2019", dtf.formatRange(date2, date3));
assertEquals("1/5/2019 – 3/4/2020", dtf.formatRange(date2, date4));
assertEquals("3/4/2019 – 3/4/2020", dtf.formatRange(date3, date4));

dtf = new Intl.DateTimeFormat(["en"], {year: "numeric", month: "short", day: "numeric"});
assertEquals("Jan 3 – 5, 2019", dtf.formatRange(date1, date2));
assertEquals("Jan 3 – Mar 4, 2019", dtf.formatRange(date1, date3));
assertEquals("Jan 3, 2019 – Mar 4, 2020", dtf.formatRange(date1, date4));
assertEquals("Jan 5 – Mar 4, 2019", dtf.formatRange(date2, date3));
assertEquals("Jan 5, 2019 – Mar 4, 2020", dtf.formatRange(date2, date4));
assertEquals("Mar 4, 2019 – Mar 4, 2020", dtf.formatRange(date3, date4));

// Test the sequence of ToNumber and TimeClip
var secondDateAccessed = false;
assertThrows(
    () =>
    dtf.formatRange(
        new Date(864000000*10000000 + 1), // a date will cause TimeClip return NaN
        { get [Symbol.toPrimitive]() { secondDateAccessed = true; return {}} }),
    TypeError);
assertTrue(secondDateAccessed);
