68 lines
2.9 KiB
Python
68 lines
2.9 KiB
Python
import json
|
|
import os
|
|
from pathlib import Path
|
|
import string
|
|
import subprocess
|
|
import sys
|
|
import unittest
|
|
|
|
from btd700.controller import Controller
|
|
from btd700.demo import DemoTransport
|
|
from btd700.i18n import ENGLISH, detect_language, get_language, set_language, tr
|
|
|
|
ROOT = Path(__file__).resolve().parents[1]
|
|
|
|
|
|
class TranslationTests(unittest.TestCase):
|
|
def setUp(self):
|
|
self.language = get_language()
|
|
|
|
def tearDown(self):
|
|
set_language(self.language)
|
|
|
|
def test_language_detection(self):
|
|
for env, expected in (({}, 'en'), ({'LANG': 'de_DE.UTF-8'}, 'de'),
|
|
({'LANG': 'fr_FR.UTF-8'}, 'en'),
|
|
({'LANGUAGE': 'de:en', 'LANG': 'en_GB.UTF-8'}, 'de'),
|
|
({'BTD700_LANGUAGE': 'en', 'LANG': 'de_DE.UTF-8'}, 'en')):
|
|
self.assertEqual(detect_language(env), expected)
|
|
|
|
def test_templates_keep_all_fields(self):
|
|
formatter = string.Formatter()
|
|
def fields(text):
|
|
return sorted((field, spec, conversion) for _, field, spec, conversion in formatter.parse(text) if field is not None)
|
|
for source, translated in ENGLISH.items():
|
|
self.assertTrue(translated)
|
|
self.assertEqual(fields(source), fields(translated), source)
|
|
|
|
def test_status_translates_without_changing_device_values(self):
|
|
controller = Controller(DemoTransport())
|
|
set_language('en')
|
|
english = controller.snapshot().public_dict()
|
|
self.assertEqual(english['state_name'], 'Playing audio')
|
|
self.assertEqual(english['transport_name'], 'Automatic')
|
|
self.assertEqual(english['audio_quality'], '24-bit / 48 kHz')
|
|
set_language('de')
|
|
german = controller.snapshot().public_dict()
|
|
self.assertEqual(german['state_name'], 'Musikwiedergabe')
|
|
self.assertEqual(german['audio_quality'], '24 Bit / 48 kHz')
|
|
for field in ('mode', 'transport', 'codec', 'firmware', 'broadcast_name'):
|
|
self.assertEqual(english[field], german[field])
|
|
|
|
def test_english_error(self):
|
|
set_language('en')
|
|
with self.assertRaisesRegex(ValueError, 'Unknown audio mode'):
|
|
Controller(DemoTransport()).set_mode(255)
|
|
set_language('de')
|
|
self.assertEqual(tr('Speichern'), 'Speichern')
|
|
self.assertEqual(tr('aptX Adaptive'), 'aptX Adaptive')
|
|
|
|
def test_cli_override_and_help(self):
|
|
env = dict(os.environ, BTD700_LANGUAGE='de')
|
|
command = [sys.executable, '-m', 'btd700', '--language', 'en']
|
|
result = subprocess.run(command + ['--demo', 'status'], cwd=ROOT, env=env, check=True, text=True, capture_output=True)
|
|
self.assertEqual(json.loads(result.stdout)['state_name'], 'Playing audio')
|
|
result = subprocess.run(command + ['--help'], cwd=ROOT, env=env, check=True, text=True, capture_output=True)
|
|
self.assertIn('Start in the system tray only', result.stdout)
|
|
self.assertNotIn('Nur im Infobereich', result.stdout)
|