def test_bind_with_signaler(): class DataModel(object): def __init__(self, x=0, y=0): self._x = x self._y = 0 def get_x(self): return self._x @signaler(getter=get_x) def set_x(self, x): self._x = x def get_y(self): return self._y @set_x.on("change") def set_y(self, y): self._y = y * 2 class SettingWidget(object): """User interacts with this and the style and form of this widget can change.""" def __init__(self, x=0): self._x = x def get_x(self): return self._x @signaler(getter=get_x) def set_x(self, x): self._x = x data_obj = DataModel() setting = SettingWidget(data_obj.get_x()) bind(data_obj, "set_x", setting, "set_x") value = 20 data_obj.set_x(value) assert data_obj.get_x() == value assert setting.get_x() == value assert data_obj.get_y() == value * 2 value = 100 setting.set_x(value) assert setting.get_x() == value assert data_obj.get_x() == value assert data_obj.get_y() == value * 2 print("test_bind_with_signaler passed!")
def test_bind_lazy_setter_obj2_property_name(): class DataModel(object): def __init__(self, x=0): self._x = x def get_x(self): return self._x def set_x(self, x): self._x = x class SettingWidget(object): """User interacts with this and the style and form of this widget can change.""" def __init__(self, xs=0): self._xs = xs def get_xs(self): return self._xs def set_xs(self, xs): self._xs = xs data_obj = DataModel() setting = SettingWidget(data_obj.get_x()) bind(data_obj, "x", setting, "xs") value = 20 data_obj.set_x(value) assert data_obj.get_x() == value assert setting.get_xs() == value value = 100 setting.set_xs(value) assert setting.get_xs() == value assert data_obj.get_x() == value print("test_bind_lazy_setter_obj2_property_name passed!")
def test_bind_with_giving_signaler(): class Test(object): def __init__(self, x=0, y=0): self._x = x self._y = 0 def get_x(self): return self._x @signaler(getter=get_x) def set_x(self, x): self._x = x t1 = Test() t2 = Test() bind(t1, "set_x", t2.set_x) value = 20 t1.set_x(value) assert t1.get_x() == value assert t2.get_x() == value assert t1.get_x() == t2.get_x() # New test t1 = Test() t2 = Test() bind(t1.set_x, None, t2.set_x) value = 20 t1.set_x(value) assert t1.get_x() == value assert t2.get_x() == value assert t1.get_x() == t2.get_x() print("test_bind_with_giving_signaler passed!")
def test_unbind(): class Test(object): def __init__(self, x=0, y=0): self._x = x self._y = 0 def get_x(self): return self._x @signaler(getter=get_x) def set_x(self, x): self._x = x t1 = Test() t2 = Test() bind(t1, "set_x", t2) value = 20 t1.set_x(value) assert t1.get_x() == value assert t2.get_x() == value assert t1.get_x() == t2.get_x() # single unbind unbind(t1, "x") last_value = value value = 10 t1.set_x(value) assert t1.get_x() == value assert t2.get_x() == last_value assert t1.get_x() != t2.get_x() # Only t1.set_x was unbound t2.set_x should still change t1.set_x last_value = value value = 30 t2.set_x(value) assert t1.get_x() == value assert t2.get_x() == value assert t1.get_x() == t2.get_x() # other unbind unbind(t2.set_x) # t1 and t2 should not match both signals have been disconnected last_value = value value = 40 t2.set_x(value) assert t1.get_x() == last_value assert t2.get_x() == value assert t1.get_x() != t2.get_x() # New bind to test double unbind bind(t1.set_x, None, t2.set_x) value = 20 t1.set_x(value) assert t1.get_x() == value assert t2.get_x() == value assert t1.get_x() == t2.get_x() value = 30 t2.set_x(value) assert t1.get_x() == value assert t2.get_x() == value assert t1.get_x() == t2.get_x() unbind(t1.set_x, None, t2, "x") last_value = value value = 10 t1.set_x(value) assert t1.get_x() == value assert t2.get_x() == last_value assert t1.get_x() != t2.get_x() last_value = value value = 40 t2.set_x(value) assert t1.get_x() == last_value assert t2.get_x() == value assert t1.get_x() != t2.get_x() print("test_unbind passed!")
def test_bind_lazy_property(): """For now bind_lazy prioritizes properties. It is bad (for this system) to have properties that also have getters and setters. bind will make the property a signal_property. If the old setter functions are called then the object values will not be bound properly. Examples: .. code-block:: python >>> class DataModel(object): >>> def __init__(self, x=0): >>> self._x = x >>> >>> def get_x(self): >>> return self._x >>> >>> def set_x(self, x): >>> self._x = x >>> >>> x = property(get_x, set_x) >>> >>> data = DataModel() >>> other = DataModel() >>> bind(data, "x", other) >>> data.x = 1 >>> assert data.x == other.x >>> data.set_x(2) >>> assert data.x == other.x, "This will fail! The property is connected with bind the set_x and get_x methods are not connected!" """ class DataModel(object): def __init__(self, x=0): self._x = x # For now properties are always used as a priority. # Use _ to prevent the property functions from being called directly. def _get_x(self): return self._x def _set_x(self, x): self._x = x x = property(_get_x, _set_x) class SettingWidget(object): """User interacts with this and the style and form of this widget can change.""" def __init__(self, xs=0): self._xs = xs @property def xs(self): return self._xs @xs.setter def xs(self, xs): self._xs = xs data_obj = DataModel() setting = SettingWidget(data_obj.x) bind(data_obj, "x", setting, "xs") value = 20 data_obj.x = value assert data_obj.x == value assert setting.xs == value value = 100 setting.xs = value assert setting.xs == value assert data_obj.x == value print("test_bind_lazy_property passed!")