// Copyright 2018 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-relative-time-format

let rtf = new Intl.RelativeTimeFormat();
// Test 1.4.5 Intl.RelativeTimeFormat.prototype.resolvedOptions ()
// The default style is 'long'
assertEquals('long', rtf.resolvedOptions().style);

// The default numeric is 'always'
assertEquals('always', rtf.resolvedOptions().numeric);

// contains style, numeric and locale key
assertEquals(3, Object.getOwnPropertyNames(rtf.resolvedOptions()).length);

// contains style, numeric and locale key
assertEquals(3, Object.getOwnPropertyNames(new Intl.RelativeTimeFormat('en').resolvedOptions()).length);

assertEquals(
    'short',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'short'}))
        .resolvedOptions().style);

assertEquals(
    'always',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'short'}))
        .resolvedOptions().numeric);

assertEquals(
    'narrow',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'narrow'}))
        .resolvedOptions().style);

assertEquals(
    'always',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'narrow'}))
        .resolvedOptions().numeric);

assertEquals(
    'long',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'long'}))
        .resolvedOptions().style);

assertEquals(
    'always',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'long'}))
        .resolvedOptions().numeric);

assertEquals(
    'auto',
    (new Intl.RelativeTimeFormat(['sr'], {numeric: 'auto'}))
        .resolvedOptions().numeric);

assertEquals(
    'long',
    (new Intl.RelativeTimeFormat(['sr'], {numeric: 'auto'}))
        .resolvedOptions().style);

assertEquals(
    'always',
    (new Intl.RelativeTimeFormat(['sr'], {numeric: 'always'}))
        .resolvedOptions().numeric);

assertEquals(
    'long',
    (new Intl.RelativeTimeFormat(['sr'], {numeric: 'always'}))
        .resolvedOptions().style);

assertEquals(
    'long',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'long', numeric: 'auto'}))
        .resolvedOptions().style);

assertEquals(
    'auto',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'long', numeric: 'auto'}))
        .resolvedOptions().numeric);

assertEquals(
    'long',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'long', numeric: 'always'}))
        .resolvedOptions().style);

assertEquals(
    'always',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'long', numeric: 'always'}))
        .resolvedOptions().numeric);

assertEquals(
    'short',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'short', numeric: 'auto'}))
        .resolvedOptions().style);

assertEquals(
    'auto',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'short', numeric: 'auto'}))
        .resolvedOptions().numeric);

assertEquals(
    'short',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'short', numeric: 'always'}))
        .resolvedOptions().style);

assertEquals(
    'always',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'short', numeric: 'always'}))
        .resolvedOptions().numeric);

assertEquals(
    'narrow',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'narrow', numeric: 'auto'}))
        .resolvedOptions().style);

assertEquals(
    'auto',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'narrow', numeric: 'auto'}))
        .resolvedOptions().numeric);

assertEquals(
    'narrow',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'narrow', numeric: 'always'}))
        .resolvedOptions().style);

assertEquals(
    'always',
    (new Intl.RelativeTimeFormat(['sr'], {style: 'narrow', numeric: 'always'}))
        .resolvedOptions().numeric);

assertEquals(
    'ar',
    (new Intl.RelativeTimeFormat(['ar'])).resolvedOptions().locale);

assertEquals(
    'ar',
    (new Intl.RelativeTimeFormat(['ar', 'en'])).resolvedOptions().locale);

assertEquals(
    'fr',
    (new Intl.RelativeTimeFormat(['fr', 'en'])).resolvedOptions().locale);

assertEquals(
    'ar',
    (new Intl.RelativeTimeFormat(['xyz', 'ar'])).resolvedOptions().locale);

{
  var receiver = 1;
  assertThrows(() =>
     Intl.RelativeTimeFormat.prototype.resolvedOptions.call(receiver), TypeError);

  receiver = {};
  assertThrows(() =>
     Intl.RelativeTimeFormat.prototype.resolvedOptions.call(receiver), TypeError);
}

// The following is not working yet because it depend on the getAvailableLocales
// work in another path set.
// TODO(ftang): uncomment the following once that patchset is checked in.
//assertEquals(
//    'ar',
//    (new Intl.RelativeTimeFormat(['i-default', 'ar'])).resolvedOptions().locale);
