@kartotherian/babel
Version:
Tile source to support multilingual maps
318 lines (308 loc) • 8.22 kB
JavaScript
/* global describe it */
const assert = require('assert');
const LanguagePicker = require('../lib/LanguagePicker');
describe('LanguagePicker: Pick the correct language', () => {
const cases = [
{
msg: 'No values given',
langCode: 'en',
values: undefined,
expected: undefined,
},
{
msg: 'Pick first (only) value',
langCode: 'en',
values: [
{ en: 'en value' },
],
expected: 'en value',
},
{
msg: 'Pick exact match language value',
langCode: 'he',
values: [
{ en: 'en value' },
{ he: 'he value' },
],
expected: 'he value',
},
{
msg: 'Fallback yi -> he',
langCode: 'yi',
config: {
languageMap: {
yi: 'he',
foo: 'bar',
other: 'languages',
that: 'dont',
matter: 'at all',
},
},
values: [
{ en: 'en value' },
{ he: 'he value' },
{ es: 'es value' },
],
expected: 'he value',
},
{
msg: 'Fallback gan -> zh-hans (third fallback)',
langCode: 'gan',
config: {
languageMap: {
gan: [
'gan-hant',
'zh-hant',
'zh-hans',
],
},
},
values: [
{ en: 'en value' },
{ he: 'he value' },
{ 'zh-hans': 'zh-hans value' },
],
expected: 'zh-hans value',
},
{
msg: 'Object language map, fallback foo -> bar',
langCode: 'foo',
config: {
languageMap: { foo: 'bar' },
},
values: [
{ baz: 'baz value' },
{ bar: 'bar value' },
{ quuz: 'quuz value' },
],
expected: 'bar value',
},
{
msg: 'Object language map given, no fallback exists, fall back to local',
langCode: 'foo',
config: {
nameTag: 'name',
languageMap: { foo: 'bar' },
},
values: [
{ baz: 'baz value' },
{ en: 'en value' },
{ quuz: 'quuz value' },
{ name: 'name value' },
],
expected: 'name value',
},
{
msg: 'Object language map given, no fallback exists, find suffix of same script',
langCode: 'es', // Spanish
config: {
nameTag: 'name',
languageMap: { foo: 'bar' },
},
values: [
{ name_baz: 'baz value' },
{ name_en: 'en value' },
{ 'name_foo-Latn': 'foo-Latn value' },
{ name_quuz: 'quuz value' },
{ name: 'name value' },
],
expected: 'foo-Latn value',
},
{
msg: 'Edge case: Values have value for "rm" which is also the suffix ' +
'we used when a -Latn lang is not found.',
// In essence, we need to make sure that when we fall back to looking for
// things that 'end with' _rm, we don't find 'rm' language
// (because name_rm fits the pattern) and only things that actually
// end up with name_langcode_rm
langCode: 'en', // English;
config: {
nameTag: 'name',
languageMap: { foo: 'bar' },
},
values: [
{ name_baz: 'baz value' },
{ name_rm: 'rm value which should not be picked' },
{ name_quuz: 'quuz value' },
{ name: 'default name value' },
],
expected: 'default name value',
},
{
msg: 'Latin language requested, no fallback exists, find romanized label with _rm suffix',
langCode: 'es', // Spanish
config: {
nameTag: 'name',
},
values: [
{ name_baz: 'baz value' },
{ name_en: 'en value' },
{ name_jp_rm: 'jp_rm value' },
{ name_quuz: 'quuz value' },
{ name: 'name value' },
],
expected: 'jp_rm value',
},
{
msg: 'Non-latin language requested, no fallback value exists, no value with script suffix; fallback to local',
langCode: 'yi',
config: {
nameTag: 'name',
},
values: [
{ name_es: 'es value' },
{ name_en: 'en value' },
{ name: 'name value' },
],
expected: 'name value',
},
{
msg: 'Use prefixed codes',
langCode: 'en',
config: {
multiTag: 'pref_',
},
values: [
{ pref_ru: 'ru value' },
{ pref_en: 'en value' },
{ pref_fr: 'fr value' },
],
expected: 'en value',
},
{
msg: 'Language code unrecognized, fallback to local',
langCode: 'quuz',
config: {
nameTag: 'name',
},
values: [
{ name_ru: 'ru value' },
{ name_fr: 'fr value' },
{ name_en: 'en value' },
{ name: 'name value' },
],
expected: 'name value',
},
{
msg: 'Russian has no value and no fallback defined; ' +
'get value from a language that has -Cyrl over value in English',
langCode: 'ru',
values: [
{ sah: 'sah value' }, // Same alphabet
{ 'foo-Cyrl': 'foo-Cyrl value' },
{ en: 'en value' },
],
expected: 'foo-Cyrl value',
},
{
msg: 'Hebrew has no value, no fallback defined,' +
' no other language with -Hebr suffix,' +
'Fall back on local value',
config: {
nameTag: 'name',
},
langCode: 'he',
values: [
{ name_sah: 'sah value' },
{ 'name_zh-Latn': 'zh-Latn value' },
{ name: 'name value' },
{ 'name_bar-Cyrl': 'bar-Cyrl value' },
],
expected: 'name value',
},
{
msg: 'Force local language, even if the requested language exists in values',
config: {
nameTag: 'name',
forceLocal: true,
},
langCode: 'fr',
values: [
{ name_fr: 'fr value' },
{ name_ar: 'ar value' },
{ name: 'name value' },
],
expected: 'name value',
},
{
msg: 'Force local language, without a requested language at all',
config: {
nameTag: 'name',
forceLocal: true,
},
values: [
{ name_fr: 'fr value' },
{ name_ar: 'ar value' },
{ name: 'name value' },
],
expected: 'name value',
},
];
cases.forEach((data) => {
const lp = new LanguagePicker(data.langCode, data.config);
const lpp = lp.newProcessor();
// Add test values
(data.values || []).forEach((valueData) => {
const lang = Object.keys(valueData)[0];
lpp.addValue(lang, valueData[lang]);
});
// Check the result
it(data.msg, () => {
assert.equal(
lpp.getResult(),
data.expected
);
});
});
});
describe('LanguagePicker: Isolation', () => {
const lp = new LanguagePicker('foo', { nameTag: 'name' });
// We are always asking for 'foo' language
// Let's make sure that cases are not found where
// foo is not given as a value
const cases = [
{
msg: 'foo language is defined: Found value in foo',
values: [
{ bar: 'The first bar value' },
{ baz: 'The first baz value' },
{ foo: 'The first foo value' },
],
expected: 'The first foo value',
},
{
msg: 'foo language is not defined, neither are all other fallbacks, exept nameTag. Make sure we fall back on nameTag',
values: [
{ blip: 'The first blip value' },
{ blop: 'The first blop value' },
{ name: 'The first name value' },
{ bloop: 'The first bloop value' },
],
expected: 'The first name value',
},
{
msg: 'foo language is not defined, neither are all other fallbacks, and there is no nameTag. Show empty result (do not display label)',
values: [
{ me: 'The first me value' },
{ meo: 'The first meo value' },
{ meow: 'The first meow value' },
],
expected: undefined,
},
];
cases.forEach((data) => {
const lpp = lp.newProcessor();
// Add test values
(data.values || []).forEach((valueData) => {
const lang = Object.keys(valueData)[0];
lpp.addValue(lang, valueData[lang]);
});
// Check the result
it(data.msg, () => {
assert.equal(
lpp.getResult(),
data.expected
);
});
});
});