From 0b8a21e6aa4fe4ae8a66164faa7b0199cda1737e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=27=C3=A9lectron=20rare?= <108685187+electron-rare@users.noreply.github.com> Date: Wed, 13 May 2026 13:27:51 +0200 Subject: [PATCH] test(smplx-tcp): serialize round-trip + offsets --- .../tests/test_smplx_osc_sender_serialize.py | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 data_only_viz/tests/test_smplx_osc_sender_serialize.py diff --git a/data_only_viz/tests/test_smplx_osc_sender_serialize.py b/data_only_viz/tests/test_smplx_osc_sender_serialize.py new file mode 100644 index 0000000..2b75493 --- /dev/null +++ b/data_only_viz/tests/test_smplx_osc_sender_serialize.py @@ -0,0 +1,69 @@ +"""SMPLXTCPSender._serialize_persons produces the expected binary frame.""" + +import struct +import numpy as np + +from data_only_viz.smplx_osc_sender import SMPLXTCPSender +from data_only_viz.state import SMPLXPerson + +# Frame header: MAGIC(4) + n_persons(4) = 8 bytes before per-person data +_HEADER = 8 +# Per-person: pid(4) + conf(4) + trans(12) + betas(40) + expr(40) + verts(125700) +_PER_PERSON = 4 + 4 + 12 + 40 + 40 + 10475 * 3 * 4 + + +def _make_person(pid: int = 7) -> SMPLXPerson: + rng = np.random.default_rng(seed=42) + return SMPLXPerson( + pid=pid, + confidence=0.83, + translation=np.array([0.1, 0.2, 0.3], dtype=np.float32), + betas=rng.standard_normal(10).astype(np.float32), + expression=rng.standard_normal(10).astype(np.float32), + vertices_3d=rng.standard_normal((10475, 3)).astype(np.float32), + ) + + +def test_serialize_person_layout(): + sender = SMPLXTCPSender.__new__(SMPLXTCPSender) + p = _make_person() + # _serialize_persons returns bytes starting with MAGIC + n_persons header + payload = SMPLXTCPSender._serialize_persons([p]) + + assert len(payload) == _HEADER + _PER_PERSON + + # Check MAGIC and n_persons header + assert payload[:4] == b"SMPX" + (n_persons,) = struct.unpack_from("