phanpy/tests/locale-match.spec.js

276 wiersze
5.7 KiB
JavaScript

// @ts-check
import { test, expect } from '@playwright/test';
import localeMatch from '../src/utils/locale-match.js';
// https://github.com/formatjs/formatjs/blob/e11b9b57a5ed745584b169c13b0a1812ba9e6051/packages/intl-localematcher/tests/index.test.ts
test.describe('official formatjs test cases', () => {
test('zh-HK', () => {
expect(localeMatch(['zh-HK'], ['zh', 'zh-HANT', 'en'], 'en')).toBe(
'zh-HANT',
);
});
test('Intl.LocaleMatcher - fr-XX fallback', () => {
expect(localeMatch(['fr-XX', 'en'], ['fr', 'en'], 'en')).toBe('fr');
});
test('Intl.LocaleMatcher - zh-TW to zh-Hant-TW', () => {
expect(localeMatch(['zh-TW', 'en'], ['zh-Hant-TW', 'en'], 'en')).toBe(
'zh-Hant-TW',
);
});
test('Intl.LocaleMatcher - sr-Latn-BA complex matching', () => {
expect(
localeMatch(
['sr-Latn-BA'],
[
'af',
'ak',
'am',
'an',
'ar',
'ars',
'as',
'asa',
'ast',
'az',
'be',
'bem',
'bez',
'bg',
'bho',
'bm',
'bn',
'bo',
'br',
'brx',
'bs',
'ca',
'ce',
'ceb',
'cgg',
'chr',
'ckb',
'cs',
'cy',
'da',
'de',
'doi',
'dsb',
'dv',
'dz',
'ee',
'el',
'en',
'eo',
'es',
'et',
'eu',
'fa',
'ff',
'fi',
'fil',
'fo',
'fr',
'fur',
'fy',
'ga',
'gd',
'gl',
'gsw',
'gu',
'guw',
'gv',
'ha',
'haw',
'he',
'ksb',
'ksh',
'ku',
'kw',
'ky',
'lag',
'lb',
'lg',
'lij',
'lkt',
'ln',
'lo',
'lt',
'lv',
'mas',
'mg',
'mgo',
'mk',
'ml',
'mn',
'mo',
'mr',
'ms',
'mt',
'my',
'nah',
'naq',
'nb',
'nd',
'ne',
'nl',
'nn',
'nnh',
'no',
'nqo',
'nr',
'nso',
'ny',
'nyn',
'om',
'or',
'os',
'osa',
'pa',
'pap',
'pcm',
'pl',
'prg',
'ps',
'pt-PT',
'pt',
'rm',
'ro',
'rof',
'ru',
'rwk',
'sah',
'saq',
'sat',
'sc',
'scn',
'sd',
'sdh',
'se',
'seh',
'ses',
'sg',
'sh',
'shi',
'si',
'sk',
'sl',
'sma',
'smi',
'smj',
'smn',
'sms',
'sn',
'so',
'sq',
'sr',
'ss',
'ssy',
'st',
'su',
'sv',
'sw',
'syr',
'ta',
'te',
'teo',
'th',
'ti',
'tig',
'tk',
'tl',
'tn',
'to',
'tr',
'ts',
'tzm',
'ug',
'uk',
'ur',
'uz',
've',
'vi',
'vo',
'vun',
'wa',
'wae',
'wo',
'xh',
'xog',
'yi',
'yo',
'yue',
'zh',
'zu',
],
'en',
),
).toBe('sh');
});
test('empty requested', () => {
expect(localeMatch([], ['zh-Hant-TW', 'en'], 'en')).toBe('en');
});
test('extension', () => {
expect(localeMatch(['fr-CA-x-foo'], ['zh-Hant-TW', 'fr', 'en'], 'en')).toBe(
'fr',
);
});
test('GH #4267', () => {
expect(localeMatch(['fr'], ['br', 'fr'], 'en')).toBe('fr');
});
});
// https://github.com/formatjs/formatjs/blob/e11b9b57a5ed745584b169c13b0a1812ba9e6051/packages/intl-localematcher/tests/BestFitMatcher.test.ts
test.describe('BestFitMatcher test cases', () => {
test('BestFitMatcher basic', () => {
expect(localeMatch(['fr-XX', 'en'], ['fr', 'en'], 'en')).toBe('fr');
});
test('BestFitMatcher zh-TW', () => {
expect(localeMatch(['zh-TW'], ['zh', 'zh-Hant'], 'en')).toBe('zh-Hant');
});
test('BestFitMatcher en', () => {
expect(localeMatch(['en'], ['en', 'und'], 'en')).toBe('en');
});
test('BestFitMatcher extension', () => {
// Extensions should be handled transparently by the underlying matcher
expect(localeMatch(['th-u-ca-gregory'], ['th'], 'en')).toBe('th');
});
test('GH #4272 - fallback behavior', () => {
expect(localeMatch(['es'], ['fr', 'en'], 'en')).toBe('en');
expect(localeMatch(['es'], ['en', 'fr', 'en'], 'fr')).toBe('fr');
});
test('GH #4258 - best fit matching', () => {
expect(
localeMatch(['de-DE', 'fr'], ['en', 'en-US', 'fr-FR'], 'en-US'),
).toBe('fr-FR');
});
test('GH #4237 - exact locale preference', () => {
expect(
localeMatch(['en-GB', 'en-US', 'en'], ['en-US', 'nl-NL', 'nl'], 'en-US'),
).toBe('en-US');
});
test('bestFitMatcher testing zh-HK', () => {
expect(localeMatch(['zh-HK'], ['zh-Hant', 'zh-MO'], 'en')).toBe('zh-MO');
});
test('bestFitMatcher testing en-CA', () => {
expect(localeMatch(['en-CA'], ['en-GB', 'en-US'], 'en-US')).toBe('en-US');
});
test('bestFitMatcher testing es-KY Americas', () => {
expect(localeMatch(['es-KY'], ['es', 'en', 'es-419'], 'en')).toBe('es-419');
});
});