Files
ls2tp/tests/test_encoder.py

73 lines
2.4 KiB
Python

"""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.")