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)
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)
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
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())
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())
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()
def test_repr(self): obj = QObject() ref = qobjref_weak(obj) assert " to " in repr(ref) delete_qobject(obj) assert "dead" in repr(ref)
def test_self_finalize(self): obj = QObject() ref = qobjref_weak(obj) del ref
def test_delete(self): obj = QObject() ref = qobjref_weak(obj) assert ref() is obj delete_qobject(obj) # forcibly delete it assert ref() is None
def test_qwait(self): obj = QObject() obj.deleteLater() QTest.qWait(0) self.assertTrue(isdeleted(obj))