// Copyright 2018 André Bargull; Igalia, S.L. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.

/*---
esid: sec-intl.locale
description: >
    Verifies canonicalization, minimization and maximization of specific tags.
info: |
    ApplyOptionsToTag( tag, options )
    10. Return CanonicalizeLanguageTag(tag).

    Intl.Locale.prototype.maximize ()
    3. Let maximal be the result of the Add Likely Subtags algorithm applied to loc.[[Locale]].

    Intl.Locale.prototype.minimize ()
    3. Let minimal be the result of the Remove Likely Subtags algorithm applied to loc.[[Locale]].
features: [Intl.Locale]
---*/

// Test some language tags where we know that either CLDR or ICU produce
// different results compared to the canonicalization specified in RFC 5646.
var testData = [
    {
        tag: "mo",
        canonical: "ro",
        maximized: "ro-Latn-RO",
    },
    {
        tag: "es-ES-preeuro",
        maximized: "es-Latn-ES-preeuro",
        minimized: "es-preeuro",
    },
    {
        tag: "uz-UZ-cyrillic",
        maximized: "uz-Latn-UZ-cyrillic",
        minimized: "uz-cyrillic",
    },
    {
        tag: "posix",
    },
    {
        tag: "hi-direct",
        maximized: "hi-Deva-IN-direct",
    },
    {
        tag: "zh-pinyin",
        maximized: "zh-Hans-CN-pinyin",
    },
    {
        tag: "zh-stroke",
        maximized: "zh-Hans-CN-stroke",
    },
    {
        tag: "aar-x-private",
        // "aar" should be canonicalized into "aa" because "aar" matches the type attribute of
        // a languageAlias element in 
        // https://www.unicode.org/repos/cldr/trunk/common/supplemental/supplementalMetadata.xml
        canonical: "aa-x-private",
        maximized: "aa-Latn-ET-x-private",
   },
    {
        tag: "heb-x-private",
        // "heb" should be canonicalized into "he" because "heb" matches the type attribute of
        // a languageAlias element in 
        // https://www.unicode.org/repos/cldr/trunk/common/supplemental/supplementalMetadata.xml
        canonical: "he-x-private",
        maximized: "he-Hebr-IL-x-private",
    },
    {
        tag: "de-u-kf",
        maximized: "de-Latn-DE-u-kf",
    },
    {
        tag: "ces",
        // "ces" should be canonicalized into "cs" because "ces" matches the type attribute of
        // a languageAlias element in 
        // https://www.unicode.org/repos/cldr/trunk/common/supplemental/supplementalMetadata.xml
        canonical: "cs",
        maximized: "cs-Latn-CZ",
    },
    {
        // ECMA-402 currently requires that variant subtags are not canonicalized.
        // https://github.com/tc39/ecma402/issues/330
        tag: "hy-arevela",
        canonical: "hy-arevela",
        maximized: "hy-Armn-AM-arevela",
    },
    {
        // ECMA-402 currently requires that variant subtags are not canonicalized.
        // https://github.com/tc39/ecma402/issues/330
        tag: "hy-arevmda",
        canonical: "hy-arevmda",
        maximized: "hy-Armn-AM-arevmda",
    },
];

for (const {tag, canonical = tag, maximized = canonical, minimized = canonical} of testData) {
    const loc = new Intl.Locale(tag);
    assert.sameValue(
      new Intl.Locale(tag).toString(),
      canonical,
      `new Intl.Locale("${tag}").toString() returns "${canonical}"`
    );
    assert.sameValue(
      new Intl.Locale(tag).maximize().toString(),
      maximized,
      `new Intl.Locale("${tag}").maximize().toString() returns "${maximized}"`
    );
    assert.sameValue(
      new Intl.Locale(tag).minimize().toString(),
      minimized,
      `new Intl.Locale("${tag}").minimize().toString() returns "${minimized}"`
    );
}
