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

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)
})
})