73 lines
2.4 KiB
Python
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.")
|