pydase/tests/test_DataService_attribute_callbacks.py

417 lines
14 KiB
Python

from pytest import LogCaptureFixture
from pydase import DataService
def test_class_attributes(caplog: LogCaptureFixture) -> None:
class SubClass(DataService):
name = "Hello"
class ServiceClass(DataService):
attr_1 = SubClass()
service_instance = ServiceClass()
service_instance.attr_1.name = "Hi"
assert "ServiceClass.attr_1.name changed to Hi" in caplog.text
def test_instance_attributes(caplog: LogCaptureFixture) -> None:
class SubClass(DataService):
name = "Hello"
class ServiceClass(DataService):
def __init__(self) -> None:
self.attr_1 = SubClass()
super().__init__()
service_instance = ServiceClass()
service_instance.attr_1.name = "Hi"
assert "ServiceClass.attr_1.name changed to Hi" in caplog.text
def test_class_attribute(caplog: LogCaptureFixture) -> None:
class ServiceClass(DataService):
attr = 0
service_instance = ServiceClass()
service_instance.attr = 1
assert "ServiceClass.attr changed to 1" in caplog.text
def test_instance_attribute(caplog: LogCaptureFixture) -> None:
class ServiceClass(DataService):
def __init__(self) -> None:
self.attr = "Hello World"
super().__init__()
service_instance = ServiceClass()
service_instance.attr = "Hello"
assert "ServiceClass.attr changed to Hello" in caplog.text
def test_reused_instance_attributes(caplog: LogCaptureFixture) -> None:
class SubClass(DataService):
name = "Hello"
subclass_instance = SubClass()
class ServiceClass(DataService):
def __init__(self) -> None:
self.attr_1 = subclass_instance
self.attr_2 = subclass_instance
super().__init__()
service_instance = ServiceClass()
service_instance.attr_1.name = "Hi"
assert service_instance.attr_1 == service_instance.attr_2
assert "ServiceClass.attr_1.name changed to Hi" in caplog.text
assert "ServiceClass.attr_2.name changed to Hi" in caplog.text
def test_reused_attributes_mixed(caplog: LogCaptureFixture) -> None:
class SubClass(DataService):
pass
subclass_instance = SubClass()
class ServiceClass(DataService):
attr_1 = subclass_instance
def __init__(self) -> None:
self.attr_2 = subclass_instance
super().__init__()
service_instance = ServiceClass()
service_instance.attr_1.name = "Hi"
assert service_instance.attr_1 == service_instance.attr_2
assert "ServiceClass.attr_1.name changed to Hi" in caplog.text
assert "ServiceClass.attr_2.name changed to Hi" in caplog.text
def test_nested_class_attributes(caplog: LogCaptureFixture) -> None:
class SubSubSubClass(DataService):
name = "Hello"
class SubSubClass(DataService):
name = "Hello"
attr = SubSubSubClass()
class SubClass(DataService):
name = "Hello"
attr = SubSubClass()
class ServiceClass(DataService):
name = "Hello"
attr = SubClass()
service_instance = ServiceClass()
service_instance.attr.attr.attr.name = "Hi"
service_instance.attr.attr.name = "Hou"
service_instance.attr.name = "foo"
service_instance.name = "bar"
assert "ServiceClass.attr.attr.attr.name changed to Hi" in caplog.text
assert "ServiceClass.attr.attr.name changed to Hou" in caplog.text
assert "ServiceClass.attr.name changed to foo" in caplog.text
assert "ServiceClass.name changed to bar" in caplog.text
def test_nested_instance_attributes(caplog: LogCaptureFixture) -> None:
class SubSubSubClass(DataService):
name = "Hello"
class SubSubClass(DataService):
def __init__(self) -> None:
self.attr = SubSubSubClass()
self.name = "Hello"
super().__init__()
class SubClass(DataService):
def __init__(self) -> None:
self.attr = SubSubClass()
self.name = "Hello"
super().__init__()
class ServiceClass(DataService):
def __init__(self) -> None:
self.attr = SubClass()
self.name = "Hello"
super().__init__()
service_instance = ServiceClass()
service_instance.attr.attr.attr.name = "Hi"
service_instance.attr.attr.name = "Hou"
service_instance.attr.name = "foo"
service_instance.name = "bar"
assert "ServiceClass.attr.attr.attr.name changed to Hi" in caplog.text
assert "ServiceClass.attr.attr.name changed to Hou" in caplog.text
assert "ServiceClass.attr.name changed to foo" in caplog.text
assert "ServiceClass.name changed to bar" in caplog.text
def test_advanced_nested_class_attributes(caplog: LogCaptureFixture) -> None:
class SubSubSubClass(DataService):
name = "Hello"
class SubSubClass(DataService):
attr = SubSubSubClass()
class SubClass(DataService):
attr = SubSubClass()
class ServiceClass(DataService):
attr = SubClass()
subattr = SubSubClass()
service_instance = ServiceClass()
service_instance.attr.attr.attr.name = "Hi"
assert "ServiceClass.attr.attr.attr.name changed to Hi" in caplog.text
assert "ServiceClass.subattr.attr.name changed to Hi" in caplog.text
service_instance.subattr.attr.name = "Ho"
assert "ServiceClass.attr.attr.attr.name changed to Ho" in caplog.text
assert "ServiceClass.subattr.attr.name changed to Ho" in caplog.text
def test_advanced_nested_instance_attributes(caplog: LogCaptureFixture) -> None:
class SubSubSubClass(DataService):
name = "Hello"
class SubSubClass(DataService):
def __init__(self) -> None:
self.attr = SubSubSubClass()
super().__init__()
subsubclass_instance = SubSubClass()
class SubClass(DataService):
def __init__(self) -> None:
self.attr = subsubclass_instance
super().__init__()
class ServiceClass(DataService):
def __init__(self) -> None:
self.attr = SubClass()
self.subattr = subsubclass_instance
super().__init__()
service_instance = ServiceClass()
service_instance.attr.attr.attr.name = "Hi"
assert "ServiceClass.attr.attr.attr.name changed to Hi" in caplog.text
assert "ServiceClass.subattr.attr.name changed to Hi" in caplog.text
caplog.clear()
service_instance.subattr.attr.name = "Ho"
assert "ServiceClass.attr.attr.attr.name changed to Ho" in caplog.text
assert "ServiceClass.subattr.attr.name changed to Ho" in caplog.text
caplog.clear()
def test_advanced_nested_attributes_mixed(caplog: LogCaptureFixture) -> None:
class SubSubClass(DataService):
name = "Hello"
class SubClass(DataService):
class_attr = SubSubClass()
def __init__(self) -> None:
self.attr_1 = SubSubClass()
super().__init__()
class ServiceClass(DataService):
class_attr = SubClass()
def __init__(self) -> None:
self.attr = SubClass()
super().__init__()
service_instance = ServiceClass()
# Subclass.attr is the same for all instances
assert service_instance.attr.class_attr == service_instance.class_attr.class_attr
# attr_1 is different for all instances of SubClass
assert service_instance.attr.attr_1 != service_instance.class_attr.attr_1
# instances of SubSubClass are unequal
assert service_instance.attr.attr_1 != service_instance.class_attr.class_attr
service_instance.class_attr.class_attr.name = "Ho"
assert "ServiceClass.class_attr.class_attr.name changed to Ho" in caplog.text
assert "ServiceClass.attr.class_attr.name changed to Ho" in caplog.text
caplog.clear()
service_instance.class_attr.attr_1.name = "Ho"
assert "ServiceClass.class_attr.attr_1.name changed to Ho" in caplog.text
assert "ServiceClass.attr.attr_1.name changed to Ho" not in caplog.text
caplog.clear()
service_instance.attr.class_attr.name = "Ho"
assert "ServiceClass.class_attr.class_attr.name changed to Ho" in caplog.text
assert "ServiceClass.attr.class_attr.name changed to Ho" in caplog.text
caplog.clear()
service_instance.attr.attr_1.name = "Ho"
assert "ServiceClass.attr.attr_1.name changed to Ho" in caplog.text
assert "ServiceClass.class_attr.attr_1.name changed to Ho" not in caplog.text
caplog.clear()
def test_class_list_attributes(caplog: LogCaptureFixture) -> None:
class SubClass(DataService):
name = "Hello"
subclass_instance = SubClass()
class ServiceClass(DataService):
attr_list = [SubClass() for _ in range(2)]
attr_list_2 = [subclass_instance, subclass_instance]
attr = subclass_instance
service_instance = ServiceClass()
assert service_instance.attr_list[0] != service_instance.attr_list[1]
service_instance.attr_list[0].name = "Ho"
assert "ServiceClass.attr_list[0].name changed to Ho" in caplog.text
assert "ServiceClass.attr_list[1].name changed to Ho" not in caplog.text
caplog.clear()
service_instance.attr_list[1].name = "Ho"
assert "ServiceClass.attr_list[0].name changed to Ho" not in caplog.text
assert "ServiceClass.attr_list[1].name changed to Ho" in caplog.text
caplog.clear()
assert service_instance.attr_list_2[0] == service_instance.attr
assert service_instance.attr_list_2[0] == service_instance.attr_list_2[1]
service_instance.attr_list_2[0].name = "Ho"
assert "ServiceClass.attr_list_2[0].name changed to Ho" in caplog.text
assert "ServiceClass.attr_list_2[1].name changed to Ho" in caplog.text
assert "ServiceClass.attr.name changed to Ho" in caplog.text
caplog.clear()
service_instance.attr_list_2[1].name = "Ho"
assert "ServiceClass.attr_list_2[0].name changed to Ho" in caplog.text
assert "ServiceClass.attr_list_2[1].name changed to Ho" in caplog.text
assert "ServiceClass.attr.name changed to Ho" in caplog.text
caplog.clear()
def test_nested_class_list_attributes(caplog: LogCaptureFixture) -> None:
class SubSubClass(DataService):
name = "Hello"
subsubclass_instance = SubSubClass()
class SubClass(DataService):
attr_list = [subsubclass_instance]
class ServiceClass(DataService):
attr = [SubClass()]
subattr = subsubclass_instance
service_instance = ServiceClass()
assert service_instance.attr[0].attr_list[0] == service_instance.subattr
service_instance.attr[0].attr_list[0].name = "Ho"
assert "ServiceClass.attr[0].attr_list[0].name changed to Ho" in caplog.text
assert "ServiceClass.subattr.name changed to Ho" in caplog.text
caplog.clear()
service_instance.subattr.name = "Ho"
assert "ServiceClass.attr[0].attr_list[0].name changed to Ho" in caplog.text
assert "ServiceClass.subattr.name changed to Ho" in caplog.text
caplog.clear()
def test_instance_list_attributes(caplog: LogCaptureFixture) -> None:
class SubClass(DataService):
name = "Hello"
subclass_instance = SubClass()
class ServiceClass(DataService):
def __init__(self) -> None:
self.attr_list = [SubClass() for _ in range(2)]
self.attr_list_2 = [subclass_instance, subclass_instance]
self.attr = subclass_instance
super().__init__()
service_instance = ServiceClass()
assert service_instance.attr_list[0] != service_instance.attr_list[1]
service_instance.attr_list[0].name = "Ho"
assert "ServiceClass.attr_list[0].name changed to Ho" in caplog.text
assert "ServiceClass.attr_list[1].name changed to Ho" not in caplog.text
caplog.clear()
service_instance.attr_list[1].name = "Ho"
assert "ServiceClass.attr_list[0].name changed to Ho" not in caplog.text
assert "ServiceClass.attr_list[1].name changed to Ho" in caplog.text
caplog.clear()
assert service_instance.attr_list_2[0] == service_instance.attr
assert service_instance.attr_list_2[0] == service_instance.attr_list_2[1]
service_instance.attr_list_2[0].name = "Ho"
assert "ServiceClass.attr.name changed to Ho" in caplog.text
assert "ServiceClass.attr_list_2[0].name changed to Ho" in caplog.text
assert "ServiceClass.attr_list_2[1].name changed to Ho" in caplog.text
caplog.clear()
service_instance.attr_list_2[1].name = "Ho"
assert "ServiceClass.attr.name changed to Ho" in caplog.text
assert "ServiceClass.attr_list_2[0].name changed to Ho" in caplog.text
assert "ServiceClass.attr_list_2[1].name changed to Ho" in caplog.text
caplog.clear()
service_instance.attr.name = "Ho"
assert "ServiceClass.attr.name changed to Ho" in caplog.text
assert "ServiceClass.attr_list_2[0].name changed to Ho" in caplog.text
assert "ServiceClass.attr_list_2[1].name changed to Ho" in caplog.text
caplog.clear()
def test_nested_instance_list_attributes(caplog: LogCaptureFixture) -> None:
class SubSubClass(DataService):
name = "Hello"
subsubclass_instance = SubSubClass()
class SubClass(DataService):
def __init__(self) -> None:
self.attr_list = [subsubclass_instance]
super().__init__()
class ServiceClass(DataService):
class_attr = subsubclass_instance
def __init__(self) -> None:
self.attr = [SubClass()]
super().__init__()
service_instance = ServiceClass()
assert service_instance.attr[0].attr_list[0] == service_instance.class_attr
service_instance.attr[0].attr_list[0].name = "Ho"
assert "ServiceClass.attr[0].attr_list[0].name changed to Ho" in caplog.text
assert "ServiceClass.class_attr.name changed to Ho" in caplog.text
caplog.clear()
service_instance.class_attr.name = "Ho"
assert "ServiceClass.attr[0].attr_list[0].name changed to Ho" in caplog.text
assert "ServiceClass.class_attr.name changed to Ho" in caplog.text
caplog.clear()