// Copyright (C) 2021 André Bargull. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-intl.supportedvaluesof
description: >
  The returned "numberingSystem" values can be used with RelativeTimeFormat.
info: |
  Intl.supportedValuesOf ( key )

  1. Let key be ? ToString(key).
  ...
  5. Else if key is "numberingSystem", then
    a. Let list be ! AvailableNumberingSystems( ).
  ...
  9. Return ! CreateArrayFromList( list ).

  AvailableNumberingSystems ( )
    The AvailableNumberingSystems abstract operation returns a List, ordered as
    if an Array of the same values had been sorted using %Array.prototype.sort%
    using undefined as comparefn, that contains unique numbering systems
    identifiers identifying the numbering systems for which the implementation
    provides the functionality of Intl.DateTimeFormat, Intl.NumberFormat, and
    Intl.RelativeTimeFormat objects. The list must include the Numbering System
    value of every row of Table 4, except the header row.
includes: [testIntl.js]
locale: [en]
features: [Intl-enumeration, Intl.RelativeTimeFormat]
---*/

const numberingSystems = Intl.supportedValuesOf("numberingSystem");

for (let numberingSystem of numberingSystems) {
  let obj = new Intl.RelativeTimeFormat("en", {numberingSystem});
  assert.sameValue(obj.resolvedOptions().numberingSystem, numberingSystem,
                   `${numberingSystem} is supported by RelativeTimeFormat`);
}

for (let numberingSystem of allNumberingSystems()) {
  let obj = new Intl.RelativeTimeFormat("en", {numberingSystem});
  if (obj.resolvedOptions().numberingSystem === numberingSystem) {
    assert(numberingSystems.includes(numberingSystem),
           `${numberingSystem} supported but not returned by supportedValuesOf`);
  } else {
    assert(!numberingSystems.includes(numberingSystem),
           `${numberingSystem} not supported but returned by supportedValuesOf`);
  }
}
