function shouldBe(actual, expected) {
    if (actual !== expected)
        throw new Error('bad value: ' + actual);
}

function shouldThrow(func, errorMessage) {
    var errorThrown = false;
    var error = null;
    try {
        func();
    } catch (e) {
        errorThrown = true;
        error = e;
    }
    if (!errorThrown)
        throw new Error('not thrown');
    if (String(error) !== errorMessage)
        throw new Error(`bad error: ${String(error)}`);
}

if ($vm.icuVersion() >= 61) {
    var regionNames = new Intl.DisplayNames(['en'], {type: 'region'});
    shouldThrow(() => regionNames.of(""), `RangeError: argument is not a region subtag`);
    shouldThrow(() => regionNames.of("-"), `RangeError: argument is not a region subtag`);
    shouldThrow(() => regionNames.of("0"), `RangeError: argument is not a region subtag`);
    shouldThrow(() => regionNames.of("00"), `RangeError: argument is not a region subtag`);
    shouldThrow(() => regionNames.of("0000"), `RangeError: argument is not a region subtag`);
    shouldThrow(() => regionNames.of("a"), `RangeError: argument is not a region subtag`);
    shouldThrow(() => regionNames.of("aaa"), `RangeError: argument is not a region subtag`);
    if ($vm.icuVersion() >= 64)
        shouldBe(regionNames.of("419"), `Latin America`);
    shouldBe(regionNames.of("JP"), `Japan`);
    shouldBe(regionNames.of("US"), `United States`);

    var languageNames = new Intl.DisplayNames(['en'], {type: 'language'});
    shouldThrow(() => languageNames.of(""), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("-"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("--"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("en-"), `RangeError: argument is not a language id`);
    shouldBe(languageNames.of("en-US"), `American English`);
    shouldThrow(() => languageNames.of("en_US"), `RangeError: argument is not a language id`);
    shouldBe(languageNames.of("en-us"), `American English`);
    shouldThrow(() => languageNames.of("root"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("root-US"), `RangeError: argument is not a language id`);
    if ($vm.icuVersion() >= 64)
        shouldBe(languageNames.of("es-419"), `Latin American Spanish`);
    if (languageNames.of('zh-Hant') !== `Chinese, Traditional`)
        shouldBe(languageNames.of('zh-Hant'), `Traditional Chinese`);
    if (languageNames.of('zh-Hans-HK') !== `Chinese, Simplified (Hong Kong)` && languageNames.of('zh-Hans-HK') !== `Simplified Chinese (Hong Kong SAR China)`)
        shouldBe(languageNames.of('zh-Hans-HK'), `Simplified Chinese (Hong Kong)`);
    shouldThrow(() => languageNames.of("Hant"), `RangeError: argument is not a language id`); // Script only
    shouldBe(languageNames.of('sr-Latn'), `Serbian (Latin)`); // Language-Script
    shouldBe(languageNames.of('sr-Cyrl'), `Serbian (Cyrillic)`); // Language-Script
    shouldThrow(() => languageNames.of("zh-HK-Hans"), `RangeError: argument is not a language id`);
    shouldBe(languageNames.of('sl-rozaj'), `Slovenian (Resian)`); // Language-Variant
    shouldThrow(() => languageNames.of("sl_rozaj"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("sl-rozaj-Cyrl"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("sl-rozaj-"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("sl-_rozaj"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("sl-Cyrl-"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("-sl-Cyrl-"), `RangeError: argument is not a language id`);
    let latinItalyEasternAmerican = languageNames.of('hy-Latn-IT-arevela');
    shouldBe(latinItalyEasternAmerican === `Armenian (Latin, Italy, Eastern Armenian)` || latinItalyEasternAmerican === `Armenian (Latin, Italy)`, true); // Language-Script-Region-Variant
    shouldBe(languageNames.of('hy-Latn-IT'), `Armenian (Latin, Italy)`); // Language-Script-Region
    let latinEasternAmerican = languageNames.of('hy-Latn-arevela');
    shouldBe(latinEasternAmerican === `Armenian (Latin, Eastern Armenian)` || latinEasternAmerican === `Armenian (Latin)`, true); // Language-Script-Variant
    shouldThrow(() => languageNames.of("hy-Latn-ITZ-arevela"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("hy-Latn-00-arevela"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("hy-Latn-arevelazzzzzzzzzzz"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("hy-Latn-arevelazzzzzzzzzzz"), `RangeError: argument is not a language id`);
    shouldThrow(() => languageNames.of("hyzzzzzzzzz-Latn-arevela"), `RangeError: argument is not a language id`);

    var scriptNames = new Intl.DisplayNames(['en'], {type: 'script'});
    shouldThrow(() => scriptNames.of(""), `RangeError: argument is not a script subtag`);
    shouldThrow(() => scriptNames.of("-"), `RangeError: argument is not a script subtag`);
    shouldThrow(() => scriptNames.of("Latn0"), `RangeError: argument is not a script subtag`);
    shouldThrow(() => scriptNames.of("Lan0"), `RangeError: argument is not a script subtag`);
    shouldThrow(() => scriptNames.of("Lan"), `RangeError: argument is not a script subtag`);
    shouldBe(scriptNames.of("Latn"), `Latin`);
    shouldBe(scriptNames.of("latn"), `Latin`); // Canonicalization can make it work.

    var currencyNames = new Intl.DisplayNames(['en'], {type: 'currency'});
    shouldThrow(() => currencyNames.of(""), `RangeError: argument is not a well-formed currency code`);
    shouldThrow(() => currencyNames.of("-"), `RangeError: argument is not a well-formed currency code`);
    shouldThrow(() => currencyNames.of("ab"), `RangeError: argument is not a well-formed currency code`);
    shouldThrow(() => currencyNames.of("jpyx"), `RangeError: argument is not a well-formed currency code`);
    shouldThrow(() => currencyNames.of("jp0"), `RangeError: argument is not a well-formed currency code`);
    shouldBe(currencyNames.of("jpy"), `Japanese Yen`);
    shouldBe(currencyNames.of("JPY"), `Japanese Yen`);
}
