tests: add tests for RGB EFFECTS settings

This commit is contained in:
Peter F. Patel-Schneider 2024-03-24 09:02:55 -04:00
parent e202e904b4
commit dbd9fcfca6
2 changed files with 94 additions and 29 deletions

View File

@ -25,6 +25,7 @@ from typing import Optional
from logitech_receiver import device from logitech_receiver import device
from logitech_receiver import hidpp20 from logitech_receiver import hidpp20
from solaar import configuration
def open_path(path: Optional[str]) -> Optional[int]: def open_path(path: Optional[str]) -> Optional[int]:
@ -137,17 +138,17 @@ class Device:
feature: Optional[int] = None feature: Optional[int] = None
features: Any = None features: Any = None
setting_callback: Any = None setting_callback: Any = None
_backlight = None _backlight = _keys = _remap_keys = _led_effects = None
_keys = None
_remap_keys = None
read_register = device.Device.read_register read_register = device.Device.read_register
write_register = device.Device.write_register write_register = device.Device.write_register
backlight = device.Device.backlight backlight = device.Device.backlight
keys = device.Device.keys keys = device.Device.keys
remap_keys = device.Device.remap_keys remap_keys = device.Device.remap_keys
led_effects = device.Device.led_effects
def __post_init__(self): def __post_init__(self):
self.persister = configuration._DeviceEntry()
self.features = hidpp20.FeaturesArray(self) self.features = hidpp20.FeaturesArray(self)
self.responses += [Response("010001", 0x0000, "0001"), Response("20", 0x0100)] self.responses += [Response("010001", 0x0000, "0001"), Response("20", 0x0100)]
if self.feature is not None: if self.feature is not None:

View File

@ -29,13 +29,12 @@ from logitech_receiver import common
from logitech_receiver import hidpp20 from logitech_receiver import hidpp20
from logitech_receiver import settings_templates from logitech_receiver import settings_templates
from logitech_receiver import special_keys from logitech_receiver import special_keys
from solaar import configuration
from . import hidpp from . import hidpp
# TODO DpiSlidingXY, MouseGesturesXY, SpeedChange # TODO DpiSlidingXY, MouseGesturesXY, SpeedChange
# TODO Gesture2Gestures, Gesture2Divert, Gesture2Params, MKeyLEDs, Equalizer, LEDZoneSetting # TODO Gesture2Gestures, Gesture2Divert, Gesture2Params, MKeyLEDs, Equalizer
# TODO future RGB..., RGB..., BrightnessControl # future per-key lighting
@dataclass @dataclass
@ -84,9 +83,7 @@ tests = [
@pytest.mark.parametrize("test", tests) @pytest.mark.parametrize("test", tests)
def test_register_template(test, mocker): def test_register_template(test, mocker):
device = hidpp.Device(responses=test[1:]) device = hidpp.Device(protocol=1.0, responses=test[1:])
device.persister = configuration._DeviceEntry()
device.protocol = 1.0
spy_request = mocker.spy(device, "request") spy_request = mocker.spy(device, "request")
setting = test[0].sclass.build(device) setting = test[0].sclass.build(device)
@ -285,18 +282,95 @@ tests = [
hidpp.Response("00", 0x0470), hidpp.Response("00", 0x0470),
hidpp.Response("01", 0x0480, "01"), hidpp.Response("01", 0x0480, "01"),
], ],
[
FeatureTest(
settings_templates.LEDZoneSetting,
hidpp20.LEDEffectSetting(ID=3, intensity=0x50, period=0x100),
hidpp20.LEDEffectSetting(ID=3, intensity=0x50, period=0x101),
0x30,
"000000000000000101500000",
),
hidpp.Response("040001", 0x0000, "8070"), # COLOR_LED_EFFECTS
hidpp.Response("0100000001", 0x0400),
hidpp.Response("00000102", 0x0410, "00FF00"),
hidpp.Response("0000000300040005", 0x0420, "000000"),
hidpp.Response("0001000B00080009", 0x0420, "000100"),
hidpp.Response("000000000000010050", 0x04E0, "00"),
hidpp.Response("000000000000000101500000", 0x0430, "000000000000000101500000"),
],
[
FeatureTest(settings_templates.RGBControl, 0, 1, 0x50, "0101"),
hidpp.Response("040003", 0x0000, "8071"), # RGB_EFFECTS
hidpp.Response("0000", 0x0450),
hidpp.Response("010100", 0x0450, "0101"),
],
[
FeatureTest(
settings_templates.RGBEffectSetting,
hidpp20.LEDEffectSetting(ID=3, intensity=0x50, period=0x100),
hidpp20.LEDEffectSetting(ID=2, color=0x505050, speed=0x50),
0x10,
"000150505050000000000000",
),
hidpp.Response("040003", 0x0000, "8071"), # RGB_EFFECTS
hidpp.Response("FFFF0100000001", 0x0400, "FFFF00"),
hidpp.Response("0000000102", 0x0400, "00FF00"),
hidpp.Response("0000000300040005", 0x0400, "000000"),
hidpp.Response("0001000200080009", 0x0400, "000100"),
hidpp.Response("000000000000010050", 0x04E0, "00"),
hidpp.Response("000150505050000000000000", 0x0410, "000150505050000000000000"),
],
[
FeatureTest(
settings_templates.RGBEffectSetting,
None,
hidpp20.LEDEffectSetting(ID=3, intensity=0x60, period=0x101),
0x10,
"000000000000000101600000",
),
hidpp.Response("040003", 0x0000, "8071"), # RGB_EFFECTS
hidpp.Response("FFFF0100000001", 0x0400, "FFFF00"),
hidpp.Response("0000000102", 0x0400, "00FF00"),
hidpp.Response("0000000300040005", 0x0400, "000000"),
hidpp.Response("0001000200080009", 0x0400, "000100"),
hidpp.Response("000000000000000101600000", 0x0410, "000000000000000101600000"),
],
[
FeatureTest(
settings_templates.RGBEffectSetting,
None,
hidpp20.LEDEffectSetting(ID=3, intensity=0x60, period=0x101),
0x10,
"000200000000000101600000",
),
hidpp.Response("0A0000", 0x0000, "8071"), # RGB_EFFECTS
hidpp.Response("FF000200020004000000000000000000", 0x0A00, "FFFF00"),
hidpp.Response("00000002040000000000000000000000", 0x0A00, "00FF00"),
hidpp.Response("00000000000000000000000000000000", 0x0A00, "000000"),
hidpp.Response("00010001000000000000000000000000", 0x0A00, "000100"),
hidpp.Response("00020003C00503E00000000000000000", 0x0A00, "000200"),
hidpp.Response("0003000AC0011E0B0000000000000000", 0x0A00, "000300"),
hidpp.Response("01000001070000000000000000000000", 0x0A00, "01FF00"),
hidpp.Response("01000000000000000000000000000000", 0x0A00, "010000"),
hidpp.Response("01010001000000000000000000000000", 0x0A00, "010100"),
hidpp.Response("0102000AC0011E0B0000000000000000", 0x0A00, "010200"),
hidpp.Response("01030003C00503E00000000000000000", 0x0A00, "010300"),
hidpp.Response("01040004DCE1001E0000000000000000", 0x0A00, "010400"),
hidpp.Response("0105000B000000320000000000000000", 0x0A00, "010500"),
hidpp.Response("0106000C001B02340000000000000000", 0x0A00, "010600"),
hidpp.Response("000200000000000101600000", 0x0A10, "000200000000000101600000"),
],
] ]
@pytest.mark.parametrize("test", tests) @pytest.mark.parametrize("test", tests)
def test_simple_template(test, mocker): def test_simple_template(test, mocker):
setup_responses = [hidpp.Response("010001", 0x0000, "0001"), hidpp.Response("20", 0x0100)] device = hidpp.Device(responses=test[1:])
device = hidpp.Device(responses=test[1:] + setup_responses)
device.persister = configuration._DeviceEntry()
device.features = hidpp20.FeaturesArray(device)
spy_feature_request = mocker.spy(device, "feature_request") spy_feature_request = mocker.spy(device, "feature_request")
setting = settings_templates.check_feature(device, test[0].sclass) setting = settings_templates.check_feature(device, test[0].sclass)
if isinstance(setting, list):
setting = setting[0]
value = setting.read(cached=False) value = setting.read(cached=False)
cached_value = setting.read(cached=True) cached_value = setting.read(cached=True)
write_value = setting.write(test[0].write_value) write_value = setting.write(test[0].write_value)
@ -487,17 +561,11 @@ tests = [
@pytest.mark.parametrize("test", tests) @pytest.mark.parametrize("test", tests)
def test_variable_template(test, mocker, mock_gethostname): def test_variable_template(test, mocker, mock_gethostname):
setup_responses = [hidpp.Response("010001", 0x0000, "0001"), hidpp.Response("20", 0x0100)] device = hidpp.Device(responses=test[2:])
device = hidpp.Device(responses=test[2:] + setup_responses)
device.persister = configuration._DeviceEntry()
device.features = hidpp20.FeaturesArray(device)
spy_feature_request = mocker.spy(device, "feature_request") spy_feature_request = mocker.spy(device, "feature_request")
setting = settings_templates.check_feature(device, test[0].sclass) setting = settings_templates.check_feature(device, test[0].sclass)
print("CH", setting)
print("CH", setting.choices)
value = setting.read(cached=False) value = setting.read(cached=False)
print("CV", value)
cached_value = setting.read(cached=True) cached_value = setting.read(cached=True)
write_value = setting.write(test[0].write_value) write_value = setting.write(test[0].write_value)
@ -509,7 +577,6 @@ def test_variable_template(test, mocker, mock_gethostname):
if isinstance(test[1], list): if isinstance(test[1], list):
assert setting._validator.min_value == test[1][0] assert setting._validator.min_value == test[1][0]
assert setting._validator.max_value == test[1][1] assert setting._validator.max_value == test[1][1]
print("VALYE", value, test[0].initial_value)
assert value == test[0].initial_value assert value == test[0].initial_value
assert cached_value == test[0].initial_value assert cached_value == test[0].initial_value
assert write_value == test[0].write_value assert write_value == test[0].write_value
@ -580,14 +647,14 @@ tests = [
@pytest.mark.parametrize("test", tests) @pytest.mark.parametrize("test", tests)
def test_key_template(test, mocker): def test_key_template(test, mocker):
setup_responses = [hidpp.Response("010001", 0x0000, "0001"), hidpp.Response("20", 0x0100)] device = hidpp.Device(responses=test[2:])
device = hidpp.Device(responses=test[2:] + setup_responses)
device.persister = configuration._DeviceEntry()
device.features = hidpp20.FeaturesArray(device)
spy_feature_request = mocker.spy(device, "feature_request") spy_feature_request = mocker.spy(device, "feature_request")
setting = settings_templates.check_feature(device, test[0].sclass) setting = settings_templates.check_feature(device, test[0].sclass)
print("SETTING", setting)
assert setting is not None assert setting is not None
if isinstance(setting, list):
setting = setting[0]
assert len(setting.choices) == len(test[1]) assert len(setting.choices) == len(test[1])
for k, v in setting.choices.items(): for k, v in setting.choices.items():
assert len(v) == len(test[1][k]) assert len(v) == len(test[1][k])
@ -625,10 +692,7 @@ tests = [ # needs settings to be set up!!
@pytest.mark.parametrize("test", tests) @pytest.mark.parametrize("test", tests)
def XX_action_template(test, mocker): # needs settings to be set up!! def XX_action_template(test, mocker): # needs settings to be set up!!
setup_responses = [hidpp.Response("010001", 0x0000, "0001"), hidpp.Response("20", 0x0100)] device = hidpp.Device(responses=test[2:])
device = hidpp.Device(responses=test[2:] + setup_responses)
device.persister = configuration._DeviceEntry()
device.features = hidpp20.FeaturesArray(device)
spy_feature_request = mocker.spy(device, "feature_request") spy_feature_request = mocker.spy(device, "feature_request")
setting = settings_templates.check_feature(device, test[0].sclass) setting = settings_templates.check_feature(device, test[0].sclass)