"""Tests aller-retour de l'encodeur TP contre le corpus réel. Valide : header, nom, positions (framing 8+1) — round-trip byte-exact. """ import struct import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).resolve().parents[1])) from ls2tp.encoder import ( encode_name, encode_header, encode_position_cartesian, ) from ls2tp.framing import frame, unframe, control_byte, decode_control CORPUS = Path(__file__).resolve().parents[1] / "tests" / "fixtures" / "corpus" def test_control_byte_formula(): assert control_byte(0) == 0xFE assert control_byte(1) == 0xFD assert control_byte(2) == 0xFB assert control_byte(3) == 0xF7 assert control_byte(4) == 0xEF assert control_byte(7) == 0x7F assert control_byte(8) == 0xFF # round-trip decode_control for r in (0, 1, 2, 3, 4, 5, 7, 8): assert decode_control(control_byte(r)) == r def test_encode_name(): assert encode_name("JBA_MOVJ").hex(" ").upper() == "4A 42 41 5F EF 4D 4F 56 4A EA" assert encode_name("JBA_MOVJ2").hex(" ").upper() == "4A 42 41 5F 9F 4D 4F 56 4A 32 DC" assert encode_name("DEMO").hex(" ").upper() == "44 45 4D 4F FE E6" assert encode_name("JBA_EMPTY").hex(" ").upper() == "4A 42 41 5F 9F 45 4D 50 54 59 DC" def test_encode_header(): assert encode_header(0xCB, 0x03).hex(" ").upper() == "FE EF 00 01 00 00 00 CB FF 00 00 03 00" def test_cartesian_position_roundtrip(): """jba_movj2 : position cartésienne X=500, descripteur 4 octets.""" data = (CORPUS / "jba_movj2.tp").read_bytes() corpus = data[0x5E:0x5E + 31] # champ position encadré (31 octets) raw, _ = unframe(corpus, first_group=8) desc = raw[:4] floats = raw[4:28] vals = [struct.unpack(">f", floats[i:i + 4])[0] for i in range(0, 24, 4)] # valeurs attendues (X=500) assert abs(vals[0] - 500.0) < 0.001 assert abs(vals[1] - 188.266) < 0.01 assert abs(vals[2] - (-104.044)) < 0.01 # ré-encodage byte-exact reencoded = encode_position_cartesian(*vals, descriptor=desc) assert reencoded == corpus, "round-trip position cartésienne" def test_frame_unframe_roundtrip(): data = b"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c" framed = frame(data) raw, consumed = unframe(framed, first_group=8) assert raw == data if __name__ == "__main__": for name in sorted(k for k in globals() if k.startswith("test_")): globals()[name]() print(f"✓ {name}") print("\nTous les tests passent.")