You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
98 lines
3.6 KiB
98 lines
3.6 KiB
import { describe, expect, it } from 'vitest' |
|
import { |
|
buildResolvedTranslateMenuLanguageOptions, |
|
expandTranslateOptionsWithEnglishDialects, |
|
filterTranslateLanguagesWithGrammarCatalog, |
|
getLanguageDisplayParts, |
|
languageSelectSingleLine, |
|
ORDERED_TRANSLATE_GRAMMAR_LANGUAGE_CODES, |
|
translateLanguageOptionMatchesQuery |
|
} from '@/lib/language-display-meta' |
|
|
|
describe('getLanguageDisplayParts', () => { |
|
it('uses the static map for German', () => { |
|
const p = getLanguageDisplayParts('de') |
|
expect(p.codeLabel).toBe('de') |
|
expect(p.englishName).toBe('German') |
|
expect(p.nativeName).toBe('Deutsch') |
|
}) |
|
|
|
it('uses regional map entries for LanguageTool-style tags', () => { |
|
const p = getLanguageDisplayParts('de-DE') |
|
expect(p.englishName).toBe('German (Germany)') |
|
expect(p.nativeName).toBe('Deutsch (Deutschland)') |
|
}) |
|
|
|
it('formats a single-line label', () => { |
|
expect(languageSelectSingleLine('tr')).toContain('Turkish') |
|
expect(languageSelectSingleLine('tr')).toContain('Türkçe') |
|
}) |
|
}) |
|
|
|
describe('ORDERED_TRANSLATE_GRAMMAR_LANGUAGE_CODES', () => { |
|
it('lists map ∩ LanguageTool with Turkish and a large set', () => { |
|
expect(ORDERED_TRANSLATE_GRAMMAR_LANGUAGE_CODES).toContain('tr') |
|
expect(ORDERED_TRANSLATE_GRAMMAR_LANGUAGE_CODES.length).toBeGreaterThan(40) |
|
}) |
|
|
|
it('omits Japanese, Korean, and Swahili from default translate-target ordering', () => { |
|
expect(ORDERED_TRANSLATE_GRAMMAR_LANGUAGE_CODES).not.toContain('ja') |
|
expect(ORDERED_TRANSLATE_GRAMMAR_LANGUAGE_CODES).not.toContain('ko') |
|
expect(ORDERED_TRANSLATE_GRAMMAR_LANGUAGE_CODES).not.toContain('sw') |
|
}) |
|
}) |
|
|
|
describe('filterTranslateLanguagesWithGrammarCatalog', () => { |
|
it('keeps only API languages that pair with LT, in catalog order', () => { |
|
const out = filterTranslateLanguagesWithGrammarCatalog([ |
|
{ code: 'tr', name: 'Turkish' }, |
|
{ code: 'zz-fake', name: 'Fake' }, |
|
{ code: 'de', name: 'German' } |
|
]) |
|
expect(out.map((l) => l.code)).toEqual(['de', 'tr']) |
|
}) |
|
|
|
it('drops Swahili even when the translate API advertises it', () => { |
|
const out = filterTranslateLanguagesWithGrammarCatalog([{ code: 'sw', name: 'Swahili' }]) |
|
expect(out.map((l) => l.code)).toEqual([]) |
|
}) |
|
}) |
|
|
|
describe('buildResolvedTranslateMenuLanguageOptions', () => { |
|
it('adds en-gb when API has en (no Swahili injection)', () => { |
|
const out = buildResolvedTranslateMenuLanguageOptions([ |
|
{ code: 'en', name: 'English' }, |
|
{ code: 'de', name: 'German' } |
|
]) |
|
expect(out.map((l) => l.code)).not.toContain('sw') |
|
expect(out.map((l) => l.code)).toContain('en-gb') |
|
}) |
|
}) |
|
|
|
describe('expandTranslateOptionsWithEnglishDialects', () => { |
|
it('inserts en-gb after plain en and relabels en as US English', () => { |
|
const out = expandTranslateOptionsWithEnglishDialects([ |
|
{ code: 'de', name: 'German' }, |
|
{ code: 'en', name: 'English' } |
|
]) |
|
expect(out.map((l) => l.code)).toEqual(['de', 'en', 'en-gb']) |
|
expect(out[1]!.name).toContain('United States') |
|
expect(out[2]!.name).toContain('United Kingdom') |
|
}) |
|
|
|
it('is a no-op when en-gb is already present', () => { |
|
const base = [ |
|
{ code: 'en', name: 'English' }, |
|
{ code: 'en-gb', name: 'British' } |
|
] |
|
expect(expandTranslateOptionsWithEnglishDialects(base)).toEqual(base) |
|
}) |
|
}) |
|
|
|
describe('translateLanguageOptionMatchesQuery', () => { |
|
it('matches code and English name', () => { |
|
expect(translateLanguageOptionMatchesQuery('de', '')).toBe(true) |
|
expect(translateLanguageOptionMatchesQuery('de', 'ger')).toBe(true) |
|
expect(translateLanguageOptionMatchesQuery('de', 'zzz')).toBe(false) |
|
}) |
|
})
|
|
|