def test_read_write_dynamic_attribute_enum(server_green_mode): values = (member.value for member in GoodEnum) enum_labels = get_enum_labels(GoodEnum) class TestDevice(Device): green_mode = server_green_mode def __init__(self, *args, **kwargs): super(TestDevice, self).__init__(*args, **kwargs) self.attr_value = 0 @command def add_dyn_attr_old(self): attr = AttrData( "dyn_attr", None, attr_info=[ (DevEnum, SCALAR, READ_WRITE), {"enum_labels": enum_labels}, ], ) self.add_attribute(attr, r_meth=self.read, w_meth=self.write) @command def add_dyn_attr_new(self): attr = attribute( name="dyn_attr", dtype=GoodEnum, access=AttrWriteType.READ_WRITE, fget=self.read, fset=self.write) self.add_attribute(attr) @command def delete_dyn_attr(self): self.remove_attribute("dyn_attr") def read(self, attr): attr.set_value(self.attr_value) def write(self, attr): self.attr_value = attr.get_write_value() with DeviceTestContext(TestDevice) as proxy: for add_attr_cmd in [proxy.add_dyn_attr_old, proxy.add_dyn_attr_new]: add_attr_cmd() for value, label in zip(values, enum_labels): proxy.dyn_attr = value read_attr = proxy.dyn_attr assert read_attr == value assert isinstance(read_attr, enum.IntEnum) assert read_attr.value == value assert read_attr.name == label proxy.delete_dyn_attr() assert "dyn_attr" not in proxy.get_attribute_list()
def test_get_enum_labels_fail(bad_enum): with pytest.raises(EnumTypeError): get_enum_labels(bad_enum)
def test_get_enum_labels_success(good_enum): expected_labels = ['START', 'MIDDLE', 'END'] assert get_enum_labels(good_enum) == expected_labels
def test_read_write_attribute_enum(server_green_mode): values = (member.value for member in GoodEnum) enum_labels = get_enum_labels(GoodEnum) class TestDevice(Device): green_mode = server_green_mode def __init__(self, *args, **kwargs): super(TestDevice, self).__init__(*args, **kwargs) self.attr_from_enum_value = 0 self.attr_from_labels_value = 0 @attribute(dtype=GoodEnum, access=AttrWriteType.READ_WRITE) def attr_from_enum(self): return self.attr_from_enum_value @attr_from_enum.write def attr_from_enum(self, value): self.attr_from_enum_value = value @attribute(dtype='DevEnum', enum_labels=enum_labels, access=AttrWriteType.READ_WRITE) def attr_from_labels(self): return self.attr_from_labels_value @attr_from_labels.write def attr_from_labels(self, value): self.attr_from_labels_value = value with DeviceTestContext(TestDevice) as proxy: for value, label in zip(values, enum_labels): proxy.attr_from_enum = value read_attr = proxy.attr_from_enum assert read_attr == value assert isinstance(read_attr, enum.IntEnum) assert read_attr.value == value assert read_attr.name == label proxy.attr_from_labels = value read_attr = proxy.attr_from_labels assert read_attr == value assert isinstance(read_attr, enum.IntEnum) assert read_attr.value == value assert read_attr.name == label for value, label in zip(values, enum_labels): proxy.attr_from_enum = label read_attr = proxy.attr_from_enum assert read_attr == value assert isinstance(read_attr, enum.IntEnum) assert read_attr.value == value assert read_attr.name == label proxy.attr_from_labels = label read_attr = proxy.attr_from_labels assert read_attr == value assert isinstance(read_attr, enum.IntEnum) assert read_attr.value == value assert read_attr.name == label with pytest.raises(TypeError) as context: class BadTestDevice(Device): green_mode = server_green_mode def __init__(self, *args, **kwargs): super(BadTestDevice, self).__init__(*args, **kwargs) self.attr_value = 0 # enum_labels may not be specified if dtype is an enum.Enum @attribute(dtype=GoodEnum, enum_labels=enum_labels) def bad_attr(self): return self.attr_value BadTestDevice() # dummy instance for Codacy assert 'enum_labels' in str(context.value)