mirror of
https://github.com/kevinveenbirkenbach/computer-playbook.git
synced 2026-11-09 20:26:33 +00:00
A chat engine prefixed the Vietnamese catalog with its own preamble ("...Vietnamese:" followed by a blank line) and wrote Urdu in Devanagari. Neither tripped the damage predicate: vi is Latin script, so the script checks were blind, and untranslated only measures the Latin share, so a non-Latin language answered in another non-Latin script passed.
added_lines refuses a translation that breaks more lines than its source, and the gateway's _mangled carries the same check so such an answer falls through to the next engine instead of being cached. wrong_script refuses a non-Latin language when less than half of the letters it writes in another language's endonym script belong to its own; the script per language is derived from the endonym in meta/languages.yml, and letters are counted over runs of letters plus combining marks so Indic and vocalised Arabic words stay whole.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
129 lines
4.1 KiB
Python
129 lines
4.1 KiB
Python
import unittest
|
|
|
|
from utils import PROJECT_ROOT
|
|
from utils.i18n.languages import (
|
|
DOMAINS,
|
|
SOURCE_LANGUAGE,
|
|
domain_languages,
|
|
language_scripts,
|
|
load_languages,
|
|
non_latin_languages,
|
|
script,
|
|
)
|
|
from utils.i18n.libretranslate import PIVOT_LANGUAGE, baked_languages, served_languages
|
|
|
|
FIELDS = {"name", "native", "direction"}
|
|
DIRECTIONS = {"ltr", "rtl"}
|
|
|
|
|
|
class TestDomainLanguages(unittest.TestCase):
|
|
def test_a_domain_the_file_does_not_name_is_refused(self) -> None:
|
|
with self.assertRaises(ValueError):
|
|
domain_languages({"de": {}}, "handbook")
|
|
|
|
def test_the_source_language_carries_no_catalog_of_its_own(self) -> None:
|
|
self.assertNotIn(
|
|
SOURCE_LANGUAGE, domain_languages({"de": {}, SOURCE_LANGUAGE: {}}, "core")
|
|
)
|
|
|
|
|
|
class TestTheLanguageTable(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
cls.languages = load_languages(PROJECT_ROOT)
|
|
|
|
def test_every_entry_carries_the_three_identity_fields(self) -> None:
|
|
self.assertEqual(
|
|
sorted(
|
|
code for code, entry in self.languages.items() if set(entry) != FIELDS
|
|
),
|
|
[],
|
|
)
|
|
|
|
def test_no_entry_names_an_engine_or_a_scorer(self) -> None:
|
|
"""The gateway learns the engine per language and the oracle asks one
|
|
judge for all of them, so a route written here would be a second
|
|
opinion that goes stale as soon as either learns something."""
|
|
self.assertEqual(
|
|
sorted(
|
|
code
|
|
for code, entry in self.languages.items()
|
|
if {"engine", "oracle", "libretranslate"} & set(entry)
|
|
),
|
|
[],
|
|
)
|
|
|
|
def test_every_direction_is_one_of_the_two_writing_directions(self) -> None:
|
|
self.assertEqual(
|
|
sorted(
|
|
code
|
|
for code, entry in self.languages.items()
|
|
if entry["direction"] not in DIRECTIONS
|
|
),
|
|
[],
|
|
)
|
|
|
|
def test_every_language_but_the_source_carries_a_catalog(self) -> None:
|
|
expected = sorted(code for code in self.languages if code != SOURCE_LANGUAGE)
|
|
for domain in DOMAINS:
|
|
with self.subTest(domain=domain):
|
|
self.assertEqual(domain_languages(self.languages, domain), expected)
|
|
|
|
|
|
class TestTheScriptOfEachLanguage(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
cls.scripts = language_scripts(PROJECT_ROOT)
|
|
|
|
def test_a_language_takes_the_script_of_its_endonym(self) -> None:
|
|
self.assertEqual(
|
|
{code: self.scripts[code] for code in ("ur", "hi", "ar", "ja", "ko", "de")},
|
|
{
|
|
"ur": "ARABIC",
|
|
"hi": "DEVANAGARI",
|
|
"ar": "ARABIC",
|
|
"ja": "CJK",
|
|
"ko": "HANGUL",
|
|
"de": "LATIN",
|
|
},
|
|
)
|
|
|
|
def test_every_non_latin_language_names_a_script_other_than_latin(self) -> None:
|
|
self.assertEqual(
|
|
sorted(
|
|
code
|
|
for code in non_latin_languages(PROJECT_ROOT)
|
|
if self.scripts.get(code) in (None, "LATIN")
|
|
),
|
|
[],
|
|
)
|
|
|
|
def test_a_character_without_a_name_has_no_script(self) -> None:
|
|
self.assertEqual(script(chr(0xE000)), "")
|
|
|
|
def test_a_letter_names_its_script(self) -> None:
|
|
self.assertEqual(
|
|
[script(char) for char in "aاहя日ー"],
|
|
["LATIN", "ARABIC", "DEVANAGARI", "CYRILLIC", "CJK", "KATAKANA"],
|
|
)
|
|
|
|
|
|
class TestTheEnginesOwnCoverage(unittest.TestCase):
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
cls.languages = load_languages(PROJECT_ROOT)
|
|
cls.served = served_languages(PROJECT_ROOT)
|
|
|
|
def test_every_served_code_is_a_language_the_repository_names(self) -> None:
|
|
self.assertEqual(sorted(set(self.served) - set(self.languages)), [])
|
|
|
|
def test_the_lane_bakes_the_pivot_beside_every_served_model(self) -> None:
|
|
self.assertEqual(
|
|
baked_languages(PROJECT_ROOT),
|
|
sorted({PIVOT_LANGUAGE, *self.served}),
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|