"""Общие DEIF-векторы проверяют ctypes теми же данными, что C и Android/JVM.""" # Тесты не требуют Qt или структуры Desktop-приложения. from pathlib import Path # Fixture входит в общий репозиторий templates. import pytest # Параметризация даёт независимый результат для каждой эталонной строки. from set_devices.deif_native import get_deif_native # Python не использует альтернативный декодер при отсутствии C. from set_devices.deif_display import DeifDisplay # Пассивная модель является общим API библиотеки. FIXTURE = Path(__file__).resolve().parents[2] / 'c/set-protocol/tests/fixtures/deif-xdi-v1.tsv' # Точный общий источник тестов для трёх портов. CASES = [line.split() for line in FIXTURE.read_text(encoding='utf-8').splitlines() if line and not line.startswith('#')] # Здесь разбирается текст fixture, а не протокол CAN. @pytest.mark.parametrize('row', CASES) # Каждый ошибочный или валидный wire-кадр проверяется отдельно. def test_ctypes_matches_c_and_jni_vectors(row): # Числовой результат должен совпасть с независимым описанием ожидаемого кадра. identifier, payload, flags, result, raw, index, sub = row # Столбцы fixture не зависят от внутреннего layout C. flags = int(flags) # EXT/RTR являются входными метаданными теста. code, meta = get_deif_native().inspect_frame(int(identifier, 16), bytes.fromhex(payload), bool(flags & 1), bool(flags & 2)) # Wire-разбор выполняется единственным C-кодеком. assert (code, meta[4], meta[2], meta[3]) == (int(result), int(raw), int(index, 16), int(sub, 16)) # RAW и адрес объекта совпадают с C- и Kotlin-проверкой. def test_passive_angle_is_received_without_gui_or_simulation(): # Ошибка со снимка воспроизводится без запуска серверных сервисов. model = DeifDisplay(source='CAN / мост', device_node=13) # Физический адрес SLAVE не становится источником SAM. assert model.accept('CAN / мост', 0x201, bytes.fromhex('01 01 30 07 84 03 00 00'), now=10) # Точный кадр пользователя несёт RAW 900. assert model.angle_selection(now=10) == (90.0, True) # Сетевое задание видно как 90°, с явной пометкой. assert model.value('angle', now=10) is None # Принятое задание не превращается в фиктивный фактический объект 0x02. assert model.angle_selection(now=15.001) == (None, False) # При полном молчании наблюдатель уважает прежний срок свежести пять секунд.