122 lines
4.0 KiB
Python
122 lines
4.0 KiB
Python
import tempfile
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
from unittest.mock import patch
|
|
|
|
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
|
|
import clean_translations
|
|
|
|
|
|
class CollectReferencesTest(unittest.TestCase):
|
|
def test_collects_global_and_explicit_translation_access(self):
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
lib = Path(directory)
|
|
(lib / "widget.dart").write_text(
|
|
"""
|
|
final first = t.common.home;
|
|
final second = Translations.of(context).navigation.liveTv;
|
|
final third = Translations . of ( context ) . libraries . hiddenLibrariesCount;
|
|
""",
|
|
encoding="utf-8",
|
|
)
|
|
|
|
with patch.object(clean_translations, "LIB_DIR", lib):
|
|
references = clean_translations.collect_references()
|
|
|
|
self.assertEqual(
|
|
references,
|
|
{
|
|
"common.home",
|
|
"navigation.liveTv",
|
|
"libraries.hiddenLibrariesCount",
|
|
},
|
|
)
|
|
|
|
def test_skips_generated_i18n_sources(self):
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
lib = Path(directory)
|
|
i18n = lib / "i18n"
|
|
i18n.mkdir()
|
|
(i18n / "strings.g.dart").write_text(
|
|
"final generated = Translations.of(context).unused.generated;",
|
|
encoding="utf-8",
|
|
)
|
|
|
|
with patch.object(clean_translations, "LIB_DIR", lib):
|
|
references = clean_translations.collect_references()
|
|
|
|
self.assertEqual(references, set())
|
|
|
|
|
|
class NormalizePluralTest(unittest.TestCase):
|
|
def _normalize(self, en, locale):
|
|
stats = {"added": 0, "removed": 0, "type_fixed": 0, "unchanged": 0}
|
|
categories = clean_translations.locale_plural_categories(en, locale)
|
|
return clean_translations.normalize(en, locale, "", stats, categories), stats
|
|
|
|
def test_preserves_locale_specific_plural_categories(self):
|
|
en = {"count": {"one": "${n} item", "other": "${n} items"}}
|
|
locale = {
|
|
"count": {
|
|
"one": "${n} element",
|
|
"few": "${n} elementy",
|
|
"many": "${n} elementów",
|
|
"other": "${n} elementu",
|
|
}
|
|
}
|
|
|
|
normalized, stats = self._normalize(en, locale)
|
|
|
|
self.assertEqual(normalized, locale)
|
|
self.assertEqual(stats["removed"], 0)
|
|
|
|
def test_does_not_inject_one_into_other_only_locales(self):
|
|
en = {"count": {"one": "${n} item", "other": "${n} items"}}
|
|
locale = {"count": {"other": "${n} 個"}}
|
|
|
|
normalized, stats = self._normalize(en, locale)
|
|
|
|
self.assertEqual(normalized, locale)
|
|
self.assertEqual(stats["added"], 0)
|
|
|
|
def test_new_plural_branches_use_categories_inferred_from_locale(self):
|
|
en = {
|
|
"existing": {"one": "one", "other": "other"},
|
|
"new": {"one": "one", "other": "other"},
|
|
}
|
|
locale = {
|
|
"existing": {
|
|
"one": "one",
|
|
"few": "few",
|
|
"many": "many",
|
|
"other": "other",
|
|
}
|
|
}
|
|
|
|
normalized, _ = self._normalize(en, locale)
|
|
|
|
self.assertEqual(set(normalized["new"]), {"one", "few", "many", "other"})
|
|
|
|
|
|
class MainExitStatusTest(unittest.TestCase):
|
|
def test_check_fails_when_locale_normalization_would_change_files(self):
|
|
with tempfile.TemporaryDirectory() as directory:
|
|
i18n = Path(directory)
|
|
(i18n / "en.i18n.json").write_text("{}\n", encoding="utf-8")
|
|
with (
|
|
patch.object(clean_translations, "I18N_DIR", i18n),
|
|
patch.object(clean_translations, "ROOT", i18n),
|
|
patch.object(clean_translations, "clean_pass", return_value=True),
|
|
patch.object(clean_translations, "unused_pass", return_value=0),
|
|
patch.object(sys, "argv", ["clean_translations.py", "--check", "--strict"]),
|
|
):
|
|
result = clean_translations.main()
|
|
|
|
self.assertEqual(result, 1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|