Includes tests for v1/v2 envelope round-trips. Co-authored-by: Cursor <cursoragent@cursor.com>
94 lines
2.5 KiB
Python
94 lines
2.5 KiB
Python
"""Tests for compact binary controller envelopes (host util)."""
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
PROJECT_ROOT = Path(__file__).resolve().parents[1]
|
|
sys.path.insert(0, str(PROJECT_ROOT / "src"))
|
|
|
|
from util.binary_envelope import ( # noqa: E402
|
|
BINARY_ENVELOPE_VERSION_2,
|
|
brightness_wire_from_0_255,
|
|
brightness_0_255_from_wire,
|
|
pack_binary_envelope_v2,
|
|
parse_binary_envelope,
|
|
parse_binary_envelope_v2,
|
|
parse_binary_envelope_v1,
|
|
)
|
|
|
|
|
|
def test_brightness_round_trip_extremes():
|
|
assert brightness_0_255_from_wire(brightness_wire_from_0_255(0)) == 0
|
|
assert brightness_0_255_from_wire(brightness_wire_from_0_255(255)) == 255
|
|
|
|
|
|
def test_pack_parse_v2_brightness_only():
|
|
raw = pack_binary_envelope_v2(brightness_0_255=128)
|
|
assert raw[0] == BINARY_ENVELOPE_VERSION_2
|
|
data = parse_binary_envelope_v2(raw)
|
|
assert data == {"v": "1", "b": 128}
|
|
|
|
|
|
def test_pack_parse_v2_full():
|
|
raw = pack_binary_envelope_v2(
|
|
presets={
|
|
"a": {
|
|
"p": "on",
|
|
"c": ["#ffffff"],
|
|
"d": 10,
|
|
"b": 255,
|
|
"a": True,
|
|
"n1": 1,
|
|
"n2": -2,
|
|
"n3": 3,
|
|
"n4": 4,
|
|
"n5": 5,
|
|
"n6": 6,
|
|
}
|
|
},
|
|
select={"dev": ["a"]},
|
|
default="a",
|
|
default_targets=["dev"],
|
|
brightness_0_255=64,
|
|
)
|
|
assert len(raw) <= 250
|
|
data = parse_binary_envelope_v2(raw)
|
|
assert data["v"] == "1"
|
|
assert data["b"] == 64
|
|
assert data["presets"]["a"]["p"] == "on"
|
|
assert data["presets"]["a"]["n2"] == -2
|
|
assert data["select"]["dev"] == ["a"]
|
|
assert data["default"] == "a"
|
|
assert data["targets"] == ["dev"]
|
|
|
|
merged = parse_binary_envelope(raw)
|
|
assert merged == data
|
|
|
|
|
|
def test_v2_wire_not_utf8_json():
|
|
raw = pack_binary_envelope_v2(
|
|
presets={"x": {"p": "blink", "c": ["#112233"]}},
|
|
brightness_0_255=None,
|
|
)
|
|
assert raw[0] == BINARY_ENVELOPE_VERSION_2
|
|
assert parse_binary_envelope_v1(raw) is None
|
|
|
|
|
|
def test_dont_change_brightness_v2():
|
|
raw = pack_binary_envelope_v2(brightness_0_255=None)
|
|
data = parse_binary_envelope_v2(raw)
|
|
assert "b" not in data
|
|
|
|
|
|
def test_json_wire_not_v2():
|
|
assert parse_binary_envelope_v2(b'{"v":"1"}') is None
|
|
|
|
|
|
def test_legacy_v1_parse_via_dispatcher():
|
|
import json
|
|
|
|
inner = json.dumps({"x": {"p": "on"}}, separators=(",", ":")).encode()
|
|
raw = bytes([1, 255, len(inner), 0, 0]) + inner
|
|
d = parse_binary_envelope(raw)
|
|
assert d["presets"]["x"]["p"] == "on"
|