88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
from __future__ import annotations
|
|
|
|
import pytest
|
|
|
|
from ha_deconz_bridge.groups import GroupMemberSpec, GroupSpec, derive_group_modes
|
|
|
|
|
|
def test_group_modes_are_member_union(rgb_light_spec, ct_light_spec) -> None:
|
|
group = GroupSpec(
|
|
name="mixed",
|
|
members=(rgb_light_spec.name, ct_light_spec.name),
|
|
)
|
|
|
|
modes = derive_group_modes(
|
|
group,
|
|
{
|
|
rgb_light_spec.name: rgb_light_spec,
|
|
ct_light_spec.name: ct_light_spec,
|
|
},
|
|
)
|
|
|
|
assert modes == ("rgb", "color_temp")
|
|
|
|
|
|
def test_fixed_color_member_acts_as_brightness_mode(ct_light_spec) -> None:
|
|
group = GroupSpec(
|
|
name="fixed",
|
|
members=(GroupMemberSpec(ct_light_spec.name, fixed_color=500),),
|
|
)
|
|
|
|
assert derive_group_modes(group, {ct_light_spec.name: ct_light_spec}) == ("brightness",)
|
|
|
|
|
|
def test_fixed_brightness_member_acts_as_onoff_mode(ct_light_spec) -> None:
|
|
group = GroupSpec(
|
|
name="fixed",
|
|
members=(GroupMemberSpec(ct_light_spec.name, fixed_color=500, fixed_brightness=0.5),),
|
|
)
|
|
|
|
assert derive_group_modes(group, {ct_light_spec.name: ct_light_spec}) == ("onoff",)
|
|
|
|
|
|
def test_fixed_color_normalizes_mired_kelvin_rgb_and_xy() -> None:
|
|
mired_member = GroupMemberSpec("a", fixed_color=500)
|
|
kelvin_member = GroupMemberSpec("a", fixed_color=4000)
|
|
rgb_member = GroupMemberSpec("a", fixed_color=(255, 128, 0))
|
|
xy_member = GroupMemberSpec("a", fixed_color=(0.31, 0.32))
|
|
|
|
assert mired_member.fixed_color is not None
|
|
assert mired_member.fixed_color.kind == "color_temp"
|
|
assert mired_member.fixed_color.color_temp == 500
|
|
assert kelvin_member.fixed_color is not None
|
|
assert kelvin_member.fixed_color.color_temp == 250
|
|
assert rgb_member.fixed_color is not None
|
|
assert rgb_member.fixed_color.kind == "rgb"
|
|
assert max(rgb_member.fixed_color.rgb255) == 255
|
|
assert xy_member.fixed_color is not None
|
|
assert xy_member.fixed_color.kind == "xy"
|
|
|
|
|
|
def test_fixed_brightness_requires_fixed_color() -> None:
|
|
with pytest.raises(ValueError, match="fixed_brightness requires fixed_color"):
|
|
GroupMemberSpec("a", fixed_brightness=128)
|
|
|
|
|
|
def test_fixed_brightness_normalizes_relative_and_ha_values() -> None:
|
|
relative = GroupMemberSpec("a", fixed_color=500, fixed_brightness=0.5)
|
|
ha_value = GroupMemberSpec("a", fixed_color=500, fixed_brightness=127)
|
|
|
|
assert relative.fixed_brightness == 128
|
|
assert ha_value.fixed_brightness == 127
|
|
|
|
|
|
def test_example_groups_reference_existing_lights() -> None:
|
|
from configs.example_groups import GROUPS
|
|
from configs.example_lights import LIGHTS
|
|
|
|
missing = {
|
|
group_name: [
|
|
member.light_name
|
|
for member in group.member_specs()
|
|
if member.light_name not in LIGHTS
|
|
]
|
|
for group_name, group in GROUPS.items()
|
|
}
|
|
|
|
assert {name: names for name, names in missing.items() if names} == {}
|