Files
fingerbot-cli/tests/test_ir_codec.py
T
2026-07-05 16:39:15 -05:00

54 lines
1.5 KiB
Python

"""tests/test_ir_codec.py"""
import pytest
from tuya_re.ir import base64_to_pulses, pulses_to_base64
# Golden vector, hand-computed:
# 9202 -> f2 23 | 4496 -> 90 11 | 538 -> 1a 02 (little-endian u16)
# -> base64 "8iOQERoC"
GOLDEN_PULSES = [9202, 4496, 538]
GOLDEN_B64 = "8iOQERoC"
# Real ir_study_code captured from a JMIR05 blaster in study mode (DP 202).
HARDWARE_B64 = (
"vALnA0gGwgdIBucDKAPnAygD5wMoAxESvALnAygDwgcoA+cDKAPnAygDGgUaB"
"RoF6wHRCBoF5wMoA+cDvAJaLOsB5wNIBtEIGgUaBW8BGgUoAxoF6wERErwCR"
"w68AhoF6wEhC7wCQgJvAecDKAPCB+sBbwFCAkgGbwEaBfMA0Ps="
)
def test_pulses_to_base64_golden():
assert pulses_to_base64(GOLDEN_PULSES) == GOLDEN_B64
def test_base64_to_pulses_golden():
assert base64_to_pulses(GOLDEN_B64) == GOLDEN_PULSES
def test_hardware_code_decodes_to_sane_pulses():
pulses = base64_to_pulses(HARDWARE_B64)
assert len(pulses) == 64
assert pulses[0] == 700
assert all(0 < p <= 0xFFFF for p in pulses)
# round-trips back to the same base64
assert pulses_to_base64(pulses) == HARDWARE_B64
def test_round_trip():
pulses = [9000, 4500, 560, 560, 560, 1690, 39000]
assert base64_to_pulses(pulses_to_base64(pulses)) == pulses
def test_value_too_large_raises():
with pytest.raises(ValueError, match="out of u16 range"):
pulses_to_base64([70000])
def test_odd_length_payload_raises():
import base64
bad = base64.b64encode(b"\x01\x02\x03").decode()
with pytest.raises(ValueError, match="not a whole number"):
base64_to_pulses(bad)