// 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 DateTimeFormat.
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]
---*/

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

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

for (let numberingSystem of allNumberingSystems()) {
  let obj = new Intl.DateTimeFormat("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`);
  }
}
