// 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 "collation" values are sorted, unique, and match the type production.
info: |
  Intl.supportedValuesOf ( key )

  1. Let key be ? ToString(key).
  ...
  3. Else if key is "collation", then
    a. Let list be ! AvailableCollations( ).
  ...
  9. Return ! CreateArrayFromList( list ).

  AvailableCollations ( )
    The AvailableCollations 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 collation types identifying the
    collations for which the implementation provides the functionality of
    Intl.Collator objects.
includes: [compareArray.js]
features: [Intl-enumeration, Intl.Locale]
---*/

const collations = Intl.supportedValuesOf("collation");

assert(Array.isArray(collations), "Returns an Array object.");
assert.sameValue(Object.getPrototypeOf(collations), Array.prototype,
                 "The array prototype is Array.prototype");

const otherCollations = Intl.supportedValuesOf("collation");
assert.notSameValue(otherCollations, collations,
                    "Returns a new array object for each call.");

assert.compareArray(collations, otherCollations.sort(),
                    "The array is sorted.");

assert.sameValue(new Set(collations).size, collations.length,
                 "The array doesn't contain duplicates.");

// https://unicode.org/reports/tr35/tr35.html#Unicode_locale_identifier
const typeRE = /^[a-z0-9]{3,8}(-[a-z0-9]{3,8})*$/;
for (let collation of collations) {
  assert(typeRE.test(collation), `${collation} matches the 'type' production`);
}

for (let collation of collations) {
  assert.sameValue(new Intl.Locale("und", {collation}).collation, collation,
                   `${collation} is canonicalised`);
}

assert(!collations.includes("standard"), "Mustn't include the 'standard' collation type.");
assert(!collations.includes("search"), "Mustn't include the 'search' collation type.");
