def test_manager(self):
        source = QObject()
        target = QObject()

        manager = BindingManager(submitPolicy=BindingManager.ManualSubmit)

        manager.bind((target, "target"), None).to((source, "source"))

        tbind = DynamicPropertyBinding(target, "target_copy")
        sbind = DynamicPropertyBinding(source, "source")
        schanged = []
        sbind.changed[object].connect(schanged.append)

        manager.bind(tbind, None).to(sbind)

        source.setProperty("source", 1)
        self.assertEqual(len(schanged), 1)

        self.assertEqual(target.property("target"), None)

        manager.commit()

        self.assertEqual(target.property("target"), 1)
        self.assertEqual(target.property("target_copy"), 1)

        source.setProperty("source", 2)

        manager.setSubmitPolicy(BindingManager.AutoSubmit)

        self.assertEqual(target.property("target"), 2)
        self.assertEqual(target.property("target_copy"), 2)
Example #2
0
    def _delete_widget(self, widget):
        """
        Delete the OWBaseWidget instance.
        """
        widget.close()
        # Save settings to user global settings.
        widget.saveSettings()
        # Notify the widget it will be deleted.
        widget.onDeleteWidget()

        state = self.__widget_processing_state[widget]
        if state & WidgetManager._DelayDeleteMask:
            # If the widget is in an update loop and/or blocking we
            # delay the scheduled deletion until the widget is done.
            log.debug(
                "Widget %s removed but still in state :%s. "
                "Deferring deletion.", widget, state)
            self.__delay_delete.add(widget)
        else:
            widget.deleteLater()
            name = "{} '{}'".format(type(widget).__name__, widget.captionTitle)
            if log.isEnabledFor(logging.DEBUG):
                widget.destroyed.connect(
                    lambda: log.debug("Destroyed: %s", name))
                widget.__marker = QObject()
                widget.__marker.destroyed.connect(
                    lambda: log.debug("Destroyed namespace: %s", name))
            del self.__widget_processing_state[widget]
    def test_expr(self):
        obj1 = QObject()

        obj1.setProperty("value", 1)
        obj1.setProperty("other", 2)

        result = DynamicPropertyBinding(obj1, "result")
        result.bindTo(
            PropertyBindingExpr("value + other",
                                locals={
                                    "value": binding_for(obj1, "value"),
                                    "other": binding_for(obj1, "other")
                                }))

        expr = PropertyBindingExpr(
            "True if value < 3 else False",
            dict(value=DynamicPropertyBinding(obj1, "result")))

        result_values = []
        result.changed[object].connect(result_values.append)

        expr_values = []
        expr.changed[object].connect(expr_values.append)

        self.assertEqual(result.get(), 3)
        self.assertEqual(expr.get(), False)

        obj1.setProperty("value", 0)
        self.assertEqual(result_values[-1], 2)
        self.assertEqual(expr_values[-1], True)

        self.assertEqual(result.get(), 2)
        self.assertEqual(expr.get(), True)
Example #4
0
 def test_deref(self):
     obj = QObject()
     obj_wref = weakref.ref(obj)
     ref = qobjref(obj)
     del obj
     assert ref() is obj_wref()
     del ref
     assert obj_wref() is None
Example #5
0
    def test_qinvoke_as_decorator(self):
        context = QObject()

        @qinvoke(context=context)
        def f(name):
            context.setObjectName(name)

        spy = QSignalSpy(context.objectNameChanged)
        f("name")
        self.assertTrue(spy.wait(500))
    def test_dyn(self):
        obj = QObject()
        changed = []

        binding = DynamicPropertyBinding(obj, "test")
        binding.changed[object].connect(changed.append)

        self.assertIs(binding.get(), None)

        obj.setProperty("test", 1)
        self.assertEqual(binding.get(), 1)
        self.assertEqual(len(changed), 1)
        self.assertEqual(changed[-1], 1)

        binding.set(2)
        self.assertEqual(binding.get(), 2)
        self.assertEqual(len(changed), 2)
        self.assertEqual(changed[-1], 2)

        target = QObject()
        binding1 = DynamicPropertyBinding(target, "prop")

        binding1.bindTo(binding)

        self.assertEqual(binding1.get(), binding.get())
        self.assertEqual(target.property("prop"), 2)

        binding.set("a string")
        self.assertEqual(binding1.get(), "a string")
        self.assertEqual(binding1.get(), binding.get())
        self.assertEqual(target.property("prop"), "a string")

        binding1.unbind()
        binding.set(1)
        self.assertEqual(binding1.get(), "a string")
        self.assertEqual(target.property("prop"), "a string")
        self.assertEqual(binding.get(), 1)
        self.assertEqual(obj.property("test"), 1)
 def test_garbage_collect(self):
     widget = MyWidget()
     ref = weakref.ref(widget)
     # insert an object in widget's __dict__ that will be deleted when its
     # __dict__ is cleared.
     widget._finalizer = QObject()
     spyw = DestroyedSignalSpy(widget)
     spyf = DestroyedSignalSpy(widget._finalizer)
     widget.deleteLater()
     del widget
     gc.collect()
     self.assertTrue(len(spyw) == 1 or spyw.wait(1000))
     gc.collect()
     self.assertTrue(len(spyf) == 1 or spyf.wait(1000))
     gc.collect()
     self.assertIsNone(ref())
 def test_garbage_collect_from_scheme(self):
     from orangewidget.workflow.widgetsscheme import WidgetsScheme
     from orangewidget.workflow.discovery import widget_desc_from_module
     new_scheme = WidgetsScheme()
     w_desc = widget_desc_from_module("orangewidget.tests.test_widget")
     node = new_scheme.new_node(w_desc)
     widget = new_scheme.widget_for_node(node)
     widget._finalizer = QObject()
     spyw = DestroyedSignalSpy(widget)
     spyf = DestroyedSignalSpy(widget._finalizer)
     ref = weakref.ref(widget)
     del widget
     new_scheme.remove_node(node)
     gc.collect()
     self.assertTrue(len(spyw) == 1 or spyw.wait(1000))
     gc.collect()
     self.assertTrue(len(spyf) == 1 or spyf.wait(1000))
     self.assertIsNone(ref())
Example #9
0
 def test_garbage_collect_from_scheme(self):
     from Orange.canvas.scheme.widgetsscheme import WidgetsScheme
     from Orange.canvas.registry.description import WidgetDescription
     new_scheme = WidgetsScheme()
     w_desc = WidgetDescription.from_module("Orange.widgets.tests.test_widget")
     node = new_scheme.new_node(w_desc)
     widget = new_scheme.widget_for_node(node)
     widget._finalizer = QObject()
     spyw = DestroyedSignalSpy(widget)
     spyf = DestroyedSignalSpy(widget._finalizer)
     ref = weakref.ref(widget)
     del widget
     new_scheme.remove_node(node)
     gc.collect()
     self.assertTrue(len(spyw) == 1 or spyw.wait(1000))
     gc.collect()
     self.assertTrue(len(spyf) == 1 or spyf.wait(1000))
     self.assertIsNone(ref())
Example #10
0
    def test_qinvoke_context_delete(self):
        executor = ThreadPoolExecutor(max_workers=1)
        context = QObject()
        isdeleted = False
        lastindex = -1

        def mark_deleted():
            nonlocal isdeleted
            isdeleted = True

        def delete(qobj: QObject):
            assert qobj.thread() is QThread.currentThread()
            spy = QSignalSpy(qobj.destroyed)
            qobj.deleteLater()
            QCoreApplication.sendPostedEvents(qobj, QEvent.DeferredDelete)
            assert len(spy) == 1

        context.destroyed.connect(mark_deleted)

        def func(i):
            nonlocal isdeleted
            nonlocal lastindex
            lastindex = i
            self.assertFalse(isdeleted)
            self.assertIs(context.thread(), self.app.thread())

        callback = qinvoke(func, context=context)

        _ = executor.map(callback, range(1000))

        while lastindex < 0:
            QTest.qWait(10)
        assert lastindex >= 0
        delete(context)
        assert isdeleted
        lasti = lastindex
        QTest.qWait(50)
        assert lasti == lastindex
        executor.shutdown()
Example #11
0
 def test_repr(self):
     obj = QObject()
     ref = qobjref_weak(obj)
     assert " to " in repr(ref)
     delete_qobject(obj)
     assert "dead" in repr(ref)
Example #12
0
 def test_self_finalize(self):
     obj = QObject()
     ref = qobjref_weak(obj)
     del ref
Example #13
0
 def test_delete(self):
     obj = QObject()
     ref = qobjref_weak(obj)
     assert ref() is obj
     delete_qobject(obj)  # forcibly delete it
     assert ref() is None
Example #14
0
 def test_qwait(self):
     obj = QObject()
     obj.deleteLater()
     QTest.qWait(0)
     self.assertTrue(isdeleted(obj))