Пример #1
0
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!")
Пример #2
0
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!")
Пример #3
0
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!")
Пример #4
0
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!")
Пример #5
0
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!")