function shouldBe(actual, expected) {
    if (actual !== expected)
        throw new Error(`expected ${expected} but got ${actual}`);
}

function shouldNotThrow(func) {
  func();
}

function shouldThrow(func, errorType) {
    let error;
    try {
        func();
    } catch (e) {
        error = e;
    }

    if (!(error instanceof errorType))
        throw new Error(`Expected ${errorType.name}!`);
}

shouldBe(Date.prototype.toLocaleString.length, 0);
shouldBe(Object.getOwnPropertyDescriptor(Date.prototype, 'toLocaleString').enumerable, false);
shouldBe(Object.getOwnPropertyDescriptor(Date.prototype, 'toLocaleString').configurable, true);
shouldBe(Object.getOwnPropertyDescriptor(Date.prototype, 'toLocaleString').writable, true);

// Test thisTimeValue abrupt completion.
shouldNotThrow(() => Date.prototype.toLocaleString.call(new Date));
shouldThrow(() => Date.prototype.toLocaleString.call(), TypeError);
shouldThrow(() => Date.prototype.toLocaleString.call(undefined), TypeError);
shouldThrow(() => Date.prototype.toLocaleString.call(null), TypeError);
shouldThrow(() => Date.prototype.toLocaleString.call(0), TypeError);
shouldThrow(() => Date.prototype.toLocaleString.call(NaN), TypeError);
shouldThrow(() => Date.prototype.toLocaleString.call(Infinity), TypeError);
shouldThrow(() => Date.prototype.toLocaleString.call('1'), TypeError);
shouldThrow(() => Date.prototype.toLocaleString.call({}), TypeError);
shouldThrow(() => Date.prototype.toLocaleString.call([]), TypeError);
shouldThrow(() => Date.prototype.toLocaleString.call(Symbol()), TypeError);

shouldBe(typeof new Date().toLocaleString(), 'string');

shouldBe(new Date(NaN).toLocaleString(), "Invalid Date");

// Test for DateTimeFormat behavior.
// Test that locale parameter is passed through properly.
shouldThrow(() => new Date().toLocaleString('i'), RangeError);
shouldBe(new Date(0).toLocaleString('zh-Hans-CN-u-nu-hanidec', { timeZone: 'UTC' }), '一九七〇/一/一 上午一二:〇〇:〇〇');
shouldBe(new Date(0).toLocaleString('zh-Hans-CN', { timeZone: 'UTC', numberingSystem: 'hanidec' }), '一九七〇/一/一 上午一二:〇〇:〇〇');
shouldBe(new Date(0).toLocaleString('en-u-ca-chinese', { timeZone: 'UTC', year: 'numeric' }), '1969(ji-you)');
shouldBe(new Date(0).toLocaleString('en', { timeZone: 'UTC', year: 'numeric', calendar: 'chinese' }), '1969(ji-you)');

// Defaults to mdy, hms
shouldBe(new Date(0).toLocaleString('en', { timeZone: 'UTC' }), '1/1/1970, 12:00:00 AM');

// Test that options parameter is passed through properly.
shouldThrow(() => new Date(0).toLocaleString('en', null), TypeError);
shouldBe(new Date(0).toLocaleString('en', { timeZone: 'UTC', hour: 'numeric', minute: '2-digit' }), '12:00 AM');
shouldBe(new Date(0).toLocaleString('en', { timeZone: 'UTC', year: 'numeric', month: 'long' }), 'January 1970');

// Test toLocaleDateString()
shouldBe(Date.prototype.toLocaleDateString.length, 0);
shouldBe(Object.getOwnPropertyDescriptor(Date.prototype, 'toLocaleDateString').enumerable, false);
shouldBe(Object.getOwnPropertyDescriptor(Date.prototype, 'toLocaleDateString').configurable, true);
shouldBe(Object.getOwnPropertyDescriptor(Date.prototype, 'toLocaleDateString').writable, true);

// Test thisTimeValue abrupt completion.
shouldNotThrow(() => Date.prototype.toLocaleDateString.call(new Date));
shouldThrow(() => Date.prototype.toLocaleDateString.call(), TypeError);
shouldThrow(() => Date.prototype.toLocaleDateString.call(undefined), TypeError);
shouldThrow(() => Date.prototype.toLocaleDateString.call(null), TypeError);
shouldThrow(() => Date.prototype.toLocaleDateString.call(0), TypeError);
shouldThrow(() => Date.prototype.toLocaleDateString.call(NaN), TypeError);
shouldThrow(() => Date.prototype.toLocaleDateString.call(Infinity), TypeError);
shouldThrow(() => Date.prototype.toLocaleDateString.call('1'), TypeError);
shouldThrow(() => Date.prototype.toLocaleDateString.call({}), TypeError);
shouldThrow(() => Date.prototype.toLocaleDateString.call([]), TypeError);
shouldThrow(() => Date.prototype.toLocaleDateString.call(Symbol()), TypeError);

shouldBe(typeof new Date().toLocaleDateString(), 'string');

shouldBe(new Date(NaN).toLocaleDateString(), 'Invalid Date');

// Test for DateTimeFormat behavior.
// Test that locale parameter is passed through properly.
shouldThrow(() => new Date().toLocaleDateString('i'), RangeError);
shouldBe(new Date(0).toLocaleDateString('zh-Hans-CN-u-nu-hanidec', { timeZone: 'UTC' }), '一九七〇/一/一');
shouldBe(new Date(0).toLocaleDateString('zh-Hans-CN', { timeZone: 'UTC', numberingSystem: 'hanidec' }), '一九七〇/一/一');
shouldBe(new Date(0).toLocaleDateString('en-u-ca-chinese', { timeZone: 'UTC', year: 'numeric' }), '1969(ji-you)');
shouldBe(new Date(0).toLocaleDateString('en', { timeZone: 'UTC', year: 'numeric', calendar: 'chinese' }), '1969(ji-you)');

// Defaults to mdy
shouldBe(new Date(0).toLocaleDateString('en', { timeZone: 'UTC' }), '1/1/1970');

// Test that options parameter is passed through properly.
shouldThrow(() => new Date(0).toLocaleDateString('en', null), TypeError);
// Adds mdy if no date formats specified.
shouldBe(new Date(0).toLocaleDateString('en', { timeZone: 'UTC', hour: 'numeric', minute: '2-digit' }), '1/1/1970, 12:00 AM');
// If any date formats specified, just use them.
shouldBe(new Date(0).toLocaleDateString('en', { timeZone: 'UTC', year: 'numeric', month: 'long' }), 'January 1970');

// Test toLocaleTimeString()
shouldBe(Date.prototype.toLocaleTimeString.length, 0);
shouldBe(Object.getOwnPropertyDescriptor(Date.prototype, 'toLocaleTimeString').enumerable, false);
shouldBe(Object.getOwnPropertyDescriptor(Date.prototype, 'toLocaleTimeString').configurable, true);
shouldBe(Object.getOwnPropertyDescriptor(Date.prototype, 'toLocaleTimeString').writable, true);

// Test thisTimeValue abrupt completion.
shouldNotThrow(() => Date.prototype.toLocaleTimeString.call(new Date));
shouldThrow(() => Date.prototype.toLocaleTimeString.call(), TypeError);
shouldThrow(() => Date.prototype.toLocaleTimeString.call(undefined), TypeError);
shouldThrow(() => Date.prototype.toLocaleTimeString.call(null), TypeError);
shouldThrow(() => Date.prototype.toLocaleTimeString.call(0), TypeError);
shouldThrow(() => Date.prototype.toLocaleTimeString.call(NaN), TypeError);
shouldThrow(() => Date.prototype.toLocaleTimeString.call(Infinity), TypeError);
shouldThrow(() => Date.prototype.toLocaleTimeString.call('1'), TypeError);
shouldThrow(() => Date.prototype.toLocaleTimeString.call({}), TypeError);
shouldThrow(() => Date.prototype.toLocaleTimeString.call([]), TypeError);
shouldThrow(() => Date.prototype.toLocaleTimeString.call(Symbol()), TypeError);

shouldBe(typeof new Date().toLocaleTimeString(), 'string');

shouldBe(new Date(NaN).toLocaleTimeString(), 'Invalid Date');

// Test for DateTimeFormat behavior.
// Test that locale parameter is passed through properly.
shouldThrow(() => new Date().toLocaleTimeString('i'), RangeError);
shouldBe(new Date(0).toLocaleTimeString('zh-Hans-CN-u-nu-hanidec', { timeZone: 'UTC' }), "上午一二:〇〇:〇〇");
shouldBe(new Date(0).toLocaleTimeString('zh-Hans-CN', { timeZone: 'UTC', numberingSystem: 'hanidec' }), "上午一二:〇〇:〇〇");
shouldBe(new Date(0).toLocaleTimeString('en-u-ca-chinese', { timeZone: 'UTC', year: 'numeric' }), '1969(ji-you), 12:00:00 AM');
shouldBe(new Date(0).toLocaleTimeString('en', { timeZone: 'UTC', year: 'numeric', calendar: 'chinese' }), '1969(ji-you), 12:00:00 AM');

// Defaults to hms
shouldBe(new Date(0).toLocaleTimeString('en', { timeZone: 'UTC' }), "12:00:00 AM");

// Test that options parameter is passed through properly.
shouldThrow(() => new Date(0).toLocaleTimeString('en', null), TypeError);
// If time formats specifed, just use them.
shouldBe(new Date(0).toLocaleTimeString('en', { timeZone: 'UTC', hour: 'numeric', minute: '2-digit' }), '12:00 AM');
// Adds hms if no time formats specified.
shouldBe(new Date(0).toLocaleTimeString('en', { timeZone: 'UTC', year: 'numeric', month: 'long' }), 'January 1970, 12:00:00 AM');
