from app.dmx.frame import DmxFrame, FrameLayer, merge_layers def test_frame_has_512_channels() -> None: frame = DmxFrame() assert len(frame.values) == 512 assert all(value == 0 for value in frame.values) def test_htp_chooses_highest_value() -> None: base = FrameLayer.from_channel_values("base", priority=10, values={1: 80}, precedence_map={1: "htp"}) overlay = FrameLayer.from_channel_values("overlay", priority=20, values={1: 200}, precedence_map={1: "htp"}) frames = merge_layers([base, overlay]) assert frames[1].values[0] == 200 assert frames[1].source_map[0] == "overlay" def test_ltp_chooses_latest_priority_layer() -> None: base = FrameLayer.from_channel_values("base", priority=10, values={2: 200}, precedence_map={2: "ltp"}) overlay = FrameLayer.from_channel_values("overlay", priority=20, values={2: 15}, precedence_map={2: "ltp"}) frames = merge_layers([base, overlay]) assert frames[1].values[1] == 15 assert frames[1].source_map[1] == "overlay" def test_blackout_overrides_layers() -> None: layer = FrameLayer.from_channel_values("scene", priority=10, values={1: 255, 2: 128}, precedence_map={1: "htp"}) frames = merge_layers([layer], blackout=True) assert frames[1].values[0] == 0 assert frames[1].values[1] == 0 def test_layers_are_merged_per_universe() -> None: front = FrameLayer.from_channel_values("front", priority=10, values={1: 255}, universe=1) home_assistant = FrameLayer.from_channel_values("ha", priority=10, values={1: 180, 2: 90}, universe=10) frames = merge_layers([front, home_assistant]) assert frames[1].values[0] == 255 assert frames[10].values[0] == 180 assert frames[10].values[1] == 90