blob: 35bab3bbd57984d88fed769d9d625712cf4d60d7 [file] [log] [blame]
function shouldBe(actual, expected) {
if (actual !== expected)
throw new Error(`expected ${expected} but got ${actual}`);
}
function shouldNotThrow(func) {
func();
}
function shouldThrow(func, errorType) {
let error;
try {
func();
} catch (e) {
error = e;
}
if (!(error instanceof errorType))
throw new Error(`Expected ${errorType.name}!`);
}
shouldBe(Intl.Locale instanceof Function, true);
shouldBe(Intl.Locale.length, 1);
shouldBe(Object.getOwnPropertyDescriptor(Intl.Locale, 'prototype').writable, false);
shouldBe(Object.getOwnPropertyDescriptor(Intl.Locale, 'prototype').enumerable, false);
shouldBe(Object.getOwnPropertyDescriptor(Intl.Locale, 'prototype').configurable, false);
shouldThrow(() => Intl.Locale(), TypeError);
shouldThrow(() => Intl.Locale.call({}), TypeError);
shouldThrow(() => new Intl.Locale(), TypeError);
shouldThrow(() => new Intl.Locale(5), TypeError);
shouldThrow(() => new Intl.Locale(''), RangeError);
shouldThrow(() => new Intl.Locale('a'), RangeError);
shouldThrow(() => new Intl.Locale('abcdefghij'), RangeError);
shouldThrow(() => new Intl.Locale('#$'), RangeError);
shouldThrow(() => new Intl.Locale('en-@-abc'), RangeError);
shouldThrow(() => new Intl.Locale('en-u'), RangeError);
shouldThrow(() => new Intl.Locale('en-u-kn-true-u-ko-true'), RangeError);
shouldThrow(() => new Intl.Locale('en-x'), RangeError);
shouldThrow(() => new Intl.Locale('en-*'), RangeError);
shouldThrow(() => new Intl.Locale('en-'), RangeError);
shouldThrow(() => new Intl.Locale('en--US'), RangeError);
shouldThrow(() => new Intl.Locale(['en', 'ja']), RangeError);
shouldThrow(() => new Intl.Locale({}), RangeError);
shouldThrow(() => new Intl.Locale({ toString() { throw new Error(); } }), Error);
shouldThrow(() => new Intl.Locale([]), RangeError);
shouldThrow(() => new Intl.Locale('i-klingon'), RangeError); // grandfathered tag is not accepted by IsStructurallyValidLanguageTag
shouldThrow(() => new Intl.Locale('x-en-US-12345'), RangeError);
shouldThrow(() => new Intl.Locale('x-12345-12345-en-US'), RangeError);
shouldThrow(() => new Intl.Locale('x-en-US-12345-12345'), RangeError);
shouldThrow(() => new Intl.Locale('x-en-u-foo'), RangeError);
shouldThrow(() => new Intl.Locale('x-en-u-foo-u-bar'), RangeError);
shouldNotThrow(() => new Intl.Locale({ toString() { return 'en'; } }));
shouldThrow(() => new Intl.Locale('en', null), TypeError);
shouldBe(new Intl.Locale('en') instanceof Intl.Locale, true);
{
class DerivedLocale extends Intl.Locale {}
const dl = new DerivedLocale('en');
shouldBe(dl instanceof DerivedLocale, true);
shouldBe(dl instanceof Intl.Locale, true);
shouldBe(dl.maximize, Intl.Locale.prototype.maximize);
shouldBe(Object.getPrototypeOf(dl), DerivedLocale.prototype);
shouldBe(Object.getPrototypeOf(DerivedLocale.prototype), Intl.Locale.prototype);
}
const validLanguageTags = [
'de', // ISO 639 language code
'de-DE', // + ISO 3166-1 country code
'DE-de', // tags are case-insensitive
'cmn', // ISO 639 language code
'cmn-Hans', // + script code
'CMN-hANS', // tags are case-insensitive
'cmn-hans-cn', // + ISO 3166-1 country code
'es-419', // + UN M.49 region code
'es-419-u-nu-latn-cu-bob', // + Unicode locale extension sequence
'cmn-hans-cn-t-ca-u-ca-x-t-u', // singleton subtags can also be used as private use subtags
'enochian-enochian', // language and variant subtags may be the same
'de-gregory-u-ca-gregory', // variant and extension subtags may be the same
'aa-a-foo-x-a-foo-bar', // variant subtags can also be used as private use subtags
];
for (let validLanguageTag of validLanguageTags)
shouldNotThrow(() => new Intl.Locale(validLanguageTag));
shouldBe(Object.getPrototypeOf(Intl.Locale.prototype), Object.prototype);
shouldBe(Intl.Locale.prototype.constructor, Intl.Locale);
shouldBe(Intl.Locale.prototype[Symbol.toStringTag], 'Intl.Locale');
shouldBe(Object.prototype.toString.call(Intl.Locale.prototype), '[object Intl.Locale]');
shouldBe(Object.getOwnPropertyDescriptor(Intl.Locale.prototype, Symbol.toStringTag).writable, false);
shouldBe(Object.getOwnPropertyDescriptor(Intl.Locale.prototype, Symbol.toStringTag).enumerable, false);
shouldBe(Object.getOwnPropertyDescriptor(Intl.Locale.prototype, Symbol.toStringTag).configurable, true);
shouldBe(Intl.Locale.prototype.maximize.length, 0);
shouldBe(Intl.Locale.prototype.minimize.length, 0);
shouldBe(Intl.Locale.prototype.toString.length, 0);
shouldThrow(() => Intl.Locale.prototype.maximize.call({ toString() { return 'en'; } }), TypeError);
shouldThrow(() => Intl.Locale.prototype.minimize.call({ toString() { return 'en'; } }), TypeError);
shouldThrow(() => Intl.Locale.prototype.toString.call({ toString() { return 'en'; } }), TypeError);
shouldThrow(() => Intl.Locale.prototype.baseName, TypeError);
shouldThrow(() => Intl.Locale.prototype.calendar, TypeError);
shouldThrow(() => Intl.Locale.prototype.caseFirst, TypeError);
shouldThrow(() => Intl.Locale.prototype.collation, TypeError);
shouldThrow(() => Intl.Locale.prototype.hourCycle, TypeError);
shouldThrow(() => Intl.Locale.prototype.numeric, TypeError);
shouldThrow(() => Intl.Locale.prototype.numberingSystem, TypeError);
shouldThrow(() => Intl.Locale.prototype.language, TypeError);
shouldThrow(() => Intl.Locale.prototype.script, TypeError);
shouldThrow(() => Intl.Locale.prototype.region, TypeError);
shouldBe(new Intl.Locale('en').maximize().toString(), 'en-Latn-US');
shouldBe(new Intl.Locale('en-Latn-US').maximize().toString(), 'en-Latn-US');
shouldBe(new Intl.Locale('en-u-nu-thai-x-foo').maximize().toString(), 'en-Latn-US-u-nu-thai-x-foo');
shouldBe(new Intl.Locale('ja').maximize().toString(), 'ja-Jpan-JP');
shouldBe(new Intl.Locale('zh').maximize().toString(), 'zh-Hans-CN');
shouldBe(new Intl.Locale('zh-Hant').maximize().toString(), 'zh-Hant-TW');
shouldBe(new Intl.Locale('zh', { script: 'Hant' }).maximize().toString(), 'zh-Hant-TW');
shouldBe(new Intl.Locale('en').minimize().toString(), 'en');
shouldBe(new Intl.Locale('en-Latn-US').minimize().toString(), 'en');
shouldBe(new Intl.Locale('en-Latn-US-u-nu-thai-x-foo').minimize().toString(), 'en-u-nu-thai-x-foo');
shouldBe(new Intl.Locale('ja-Jpan-JP').minimize().toString(), 'ja');
shouldBe(new Intl.Locale('zh-Hans-CN').minimize().toString(), 'zh');
shouldBe(new Intl.Locale('zh-Hant-TW').minimize().toString(), 'zh-TW');
shouldBe(new Intl.Locale('zh', { script: 'Hant', region: 'TW' }).minimize().toString(), 'zh-TW');
{
let locale = new Intl.Locale('en')
shouldBe(typeof locale.maximize(), 'object');
shouldBe(typeof locale.minimize(), 'object');
shouldBe(Object.prototype.toString.call(locale.maximize()), '[object Intl.Locale]');
shouldBe(Object.prototype.toString.call(locale.minimize()), '[object Intl.Locale]');
shouldBe(locale.maximize().baseName, 'en-Latn-US');
shouldBe(locale.minimize().baseName, 'en');
}
{
let locale = new Intl.Locale('ja-Jpan-JP-u-ca-japanese-hc-h23-kf-lower-co-emoji-nu-jpan')
shouldBe(locale.maximize().toString(), 'ja-Jpan-JP-u-ca-japanese-co-emoji-hc-h23-kf-lower-nu-jpan');
shouldBe(locale.maximize().baseName, 'ja-Jpan-JP');
}
shouldBe(new Intl.Locale('en').toString(), 'en');
shouldBe(
new Intl.Locale('En-laTn-us-variAnt-fOObar-1abc-U-kn-tRue-A-aa-aaa-x-RESERVED').toString(),
$vm.icuVersion() >= 67
? 'en-Latn-US-1abc-foobar-variant-a-aa-aaa-u-kn-x-reserved'
: 'en-Latn-US-variant-foobar-1abc-a-aa-aaa-u-kn-x-reserved'
);
shouldBe(new Intl.Locale('cel-gaulish', { script: 'Arab', numberingSystem: 'gujr' }).toString(), $vm.icuVersion() >= 69 ? 'xtg-Arab-u-nu-gujr' : 'xtg-Arab-u-nu-gujr-x-cel-gaulish');
shouldBe(new Intl.Locale('en-Latn-US-u-ca-gregory-co-phonebk-hc-h12-kf-upper-kn-false-nu-latn').toString(), 'en-Latn-US-u-ca-gregory-co-phonebk-hc-h12-kf-upper-kn-false-nu-latn');
const options = {
calendar: 'buddhist',
caseFirst: 'lower',
collation: 'eor',
hourCycle: 'h11',
numeric: false,
numberingSystem: 'thai',
language: 'ja',
script: 'Hant',
region: 'KR'
};
const expected = 'ja-Hant-KR-u-ca-buddhist-co-eor-hc-h11-kf-lower-kn-false-nu-thai';
shouldBe(new Intl.Locale('en', options).toString(), expected);
shouldBe(new Intl.Locale('en-Latn-US-u-ca-gregory-co-phonebk-hc-h12-kf-upper-kn-nu-latn', options).toString(), expected);
shouldBe(new Intl.Locale('en').baseName, 'en');
shouldBe(new Intl.Locale('en-Latn').baseName, 'en-Latn');
shouldBe(new Intl.Locale('en-US').baseName, 'en-US');
shouldBe(new Intl.Locale('en-Latn-US').baseName, 'en-Latn-US');
shouldBe(new Intl.Locale('en-variant-u-kn').baseName, 'en-variant');
shouldBe(new Intl.Locale('en-Latn-variant-u-kn').baseName, 'en-Latn-variant');
shouldBe(new Intl.Locale('en-variant-u-kn', { script: 'Latn' }).baseName, 'en-Latn-variant');
shouldBe(new Intl.Locale('en-US-variant-u-kn').baseName, 'en-US-variant');
shouldBe(new Intl.Locale('en-variant-u-kn', { region: 'US' }).baseName, 'en-US-variant');
shouldBe(new Intl.Locale('en-Latn-US-variant-u-kn').baseName, 'en-Latn-US-variant');
shouldBe(new Intl.Locale('en-variant-u-kn', { script: 'Latn', region: 'US' }).baseName, 'en-Latn-US-variant');
shouldBe(new Intl.Locale('en').calendar, undefined);
shouldBe(new Intl.Locale('en-u-ca-japanese').calendar, 'japanese');
shouldBe(new Intl.Locale('en', { calendar: 'japanese' }).calendar, 'japanese');
shouldBe(new Intl.Locale('en-u-ca-japanese', { calendar: 'dangi' }).calendar, 'dangi');
shouldBe(new Intl.Locale('en-u-ca-islamicc').calendar, 'islamic-civil');
shouldBe(new Intl.Locale('en', { calendar: 'islamicc' }).calendar, 'islamic-civil');
shouldThrow(() => new Intl.Locale('en', { calendar: { toString() { throw new Error(); } } }), Error);
shouldThrow(() => new Intl.Locale('en', { calendar: 'ng' }), RangeError);
shouldBe(new Intl.Locale('en').collation, undefined);
shouldBe(new Intl.Locale('en-u-co-phonebk').collation, 'phonebk');
shouldBe(new Intl.Locale('en', { collation: 'phonebk' }).collation, 'phonebk');
shouldBe(new Intl.Locale('en-u-co-phonebk', { collation: 'eor' }).collation, 'eor');
shouldThrow(() => new Intl.Locale('en', { collation: { toString() { throw new Error(); } } }), Error);
shouldThrow(() => new Intl.Locale('en', { collation: 'ng' }), RangeError);
shouldBe(new Intl.Locale('en').caseFirst, undefined);
shouldBe(new Intl.Locale('en-u-kf-upper').caseFirst, 'upper');
shouldBe(new Intl.Locale('en', { caseFirst: 'upper' }).caseFirst, 'upper');
shouldBe(new Intl.Locale('en-u-kf-upper', { caseFirst: 'lower' }).caseFirst, 'lower');
shouldThrow(() => new Intl.Locale('en', { caseFirst: { toString() { throw new Error(); } } }), Error);
shouldThrow(() => new Intl.Locale('en', { caseFirst: 'bad' }), RangeError);
shouldBe(new Intl.Locale('en').numeric, false);
shouldBe(new Intl.Locale('en-u-kn').numeric, true);
shouldBe(new Intl.Locale('en-u-kn-true').numeric, true);
shouldBe(new Intl.Locale('en', { numeric: true }).numeric, true);
shouldBe(new Intl.Locale('en-u-kn', { numeric: false }).numeric, false);
shouldBe(new Intl.Locale('en-u-kn-true', { numeric: false }).numeric, false);
shouldThrow(() => new Intl.Locale('en', { get numeric() { throw new Error(); } }), Error);
shouldBe(new Intl.Locale('en').hourCycle, undefined);
shouldBe(new Intl.Locale('en-u-hc-h11').hourCycle, 'h11');
shouldBe(new Intl.Locale('en', { hourCycle: 'h11' }).hourCycle, 'h11');
shouldBe(new Intl.Locale('en-u-hc-h11', { hourCycle: 'h23' }).hourCycle, 'h23');
shouldThrow(() => new Intl.Locale('en', { hourCycle: { toString() { throw new Error(); } } }), Error);
shouldThrow(() => new Intl.Locale('en', { hourCycle: 'bad' }), RangeError);
shouldBe(new Intl.Locale('en').numberingSystem, undefined);
shouldBe(new Intl.Locale('en-u-nu-hanidec').numberingSystem, 'hanidec');
shouldBe(new Intl.Locale('en', { numberingSystem: 'hanidec' }).numberingSystem, 'hanidec');
shouldBe(new Intl.Locale('en-u-nu-hanidec', { numberingSystem: 'gujr' }).numberingSystem, 'gujr');
shouldThrow(() => new Intl.Locale('en', { numberingSystem: { toString() { throw new Error(); } } }), Error);
shouldThrow(() => new Intl.Locale('en', { numberingSystem: 'ng' }), RangeError);
shouldBe(new Intl.Locale('en-Latn-US').language, 'en');
shouldBe(new Intl.Locale('en', { language: 'ar' }).language, 'ar');
shouldBe(new Intl.Locale('cel-gaulish').language, 'xtg');
shouldThrow(() => new Intl.Locale('en', { language: { toString() { throw new Error(); } } }), Error);
shouldThrow(() => new Intl.Locale('en', { language: 'fail' }), RangeError);
shouldBe(new Intl.Locale('en-Latn-US').script, 'Latn');
shouldBe(new Intl.Locale('en-US').script, undefined);
shouldBe(new Intl.Locale('en-Latn', { script: 'Kore' }).script, 'Kore');
shouldThrow(() => new Intl.Locale('en', { script: { toString() { throw new Error(); } } }), Error);
shouldThrow(() => new Intl.Locale('en', { script: 'bad' }), RangeError);
shouldBe(new Intl.Locale('en-Latn-US').region, 'US');
shouldBe(new Intl.Locale('en-Latn').region, undefined);
shouldBe(new Intl.Locale('en-US', { region: 'KR' }).region, 'KR');
shouldThrow(() => new Intl.Locale('en', { region: { toString() { throw new Error(); } } }), Error);
shouldThrow(() => new Intl.Locale('en', { region: 'fail' }), RangeError);