Files
RFP_Infinity-Vis/Infinity_Vis_1/tests/test_engine.py

101 lines
3.8 KiB
Python

import unittest
from Infinity_Vis_1.infinity_vis_1.engine import OutputSettings, RealtimeEngine
from Infinity_Vis_1.infinity_vis_1.models import MappingSpec, PatternParams, SceneState, SegmentSpec, TileSpec
class RecordingDDPClient:
def __init__(self) -> None:
self.sent_payloads: list[dict[str, bytes]] = []
def count_packets(self, host_payloads: dict[str, bytes]) -> int:
return len(host_payloads)
def send(self, host_payloads: dict[str, bytes]) -> int:
self.sent_payloads.append(dict(host_payloads))
return self.count_packets(host_payloads)
class EngineTests(unittest.TestCase):
def _mapping(self) -> MappingSpec:
return MappingSpec(
name="engine-test",
rows=1,
cols=2,
tiles=[
TileSpec(
tile_id="r1c1",
row=1,
col=1,
led_total=2,
controller_ip="192.168.0.10",
segments=[SegmentSpec(name="all", side="top", start_channel=1, led_count=2)],
),
TileSpec(
tile_id="r1c2",
row=1,
col=2,
led_total=2,
controller_ip="192.168.0.10",
segments=[SegmentSpec(name="all", side="top", start_channel=1, led_count=2)],
),
],
)
def test_preview_rate_is_decoupled_from_output_rate(self) -> None:
engine = RealtimeEngine(
self._mapping(),
scene=SceneState(pattern_id="solid", params=PatternParams(primary_color="#FF0000")),
settings=OutputSettings(output_fps=40.0, preview_fps=10.0, delta_sending=False),
ddp_client=RecordingDDPClient(),
)
first = engine.tick(now=1.0)
second = engine.tick(now=1.03)
third = engine.tick(now=1.11)
self.assertTrue(first.output_due)
self.assertTrue(first.preview_due)
self.assertTrue(second.output_due)
self.assertFalse(second.preview_due)
self.assertTrue(third.output_due)
self.assertTrue(third.preview_due)
self.assertEqual(engine.diagnostics.output_frames, 3)
self.assertEqual(engine.diagnostics.preview_frames, 2)
def test_delta_sending_skips_unchanged_frames_but_keeps_keepalive(self) -> None:
engine = RealtimeEngine(
self._mapping(),
scene=SceneState(pattern_id="solid", params=PatternParams(primary_color="#00FF00")),
settings=OutputSettings(output_fps=20.0, preview_fps=0.0, delta_sending=True, keepalive_seconds=0.35),
ddp_client=RecordingDDPClient(),
)
first = engine.tick(now=1.00)
second = engine.tick(now=1.05)
third = engine.tick(now=1.41)
self.assertEqual(list(first.changed_payloads), ["192.168.0.10"])
self.assertEqual(second.changed_payloads, {})
self.assertEqual(list(third.changed_payloads), ["192.168.0.10"])
self.assertEqual(engine.diagnostics.stale_output_frames, 1)
self.assertEqual(engine.diagnostics.keepalive_controller_frames, 1)
def test_send_due_uses_client_without_network(self) -> None:
client = RecordingDDPClient()
engine = RealtimeEngine(
self._mapping(),
scene=SceneState(pattern_id="solid", params=PatternParams(primary_color="#112233")),
settings=OutputSettings(output_fps=30.0, preview_fps=0.0, delta_sending=False),
ddp_client=client,
)
result = engine.send_due(now=2.0)
self.assertEqual(result.packet_count, 1)
self.assertEqual(len(client.sent_payloads), 1)
self.assertEqual(engine.diagnostics.packets_sent, 1)
if __name__ == "__main__":
unittest.main()