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

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(), TypeError);
assertThrows(() => dtf.formatRange(date1), TypeError);
assertThrows(() => dtf.formatRange(undefined, date2), TypeError);
assertThrows(() => dtf.formatRange(date1, undefined), TypeError);
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);
