class TestGraphicsPixmapWidget(GuiTest): def setUp(self) -> None: super().setUp() self.scene = QGraphicsScene() self.view = QGraphicsView(self.scene) def tearDown(self) -> None: self.scene.clear() self.scene.deleteLater() self.view.deleteLater() del self.scene del self.view def test_graphicspixmapwidget(self): w = GraphicsPixmapWidget() self.scene.addItem(w) w.setPixmap(QPixmap(100, 100)) p = w.pixmap() self.assertEqual(p.size(), QSize(100, 100)) self.view.grab() w.setScaleContents(True) w.setAspectRatioMode(Qt.KeepAspectRatio) s = w.sizeHint(Qt.PreferredSize) self.assertEqual(s, QSizeF(100., 100.)) s = w.sizeHint(Qt.PreferredSize, QSizeF(200., -1.)) self.assertEqual(s, QSizeF(200., 200.)) s = w.sizeHint(Qt.PreferredSize, QSizeF(-1., 200.)) self.assertEqual(s, QSizeF(200., 200.)) self.view.grab()
class _GraphicsGuiTest(GuiTest): scene: QGraphicsScene view: QGraphicsView def setUp(self) -> None: super().setUp() self.view = QGraphicsView() self.scene = QGraphicsScene(self.view) self.view.setScene(self.scene) def tearDown(self) -> None: self.scene.clear() self.scene.deleteLater() self.scene = None self.view.deleteLater() self.view = None super().tearDown()
class TestItems(QAppTestCase): def setUp(self): super().setUp() self.scene = QGraphicsScene() self.view = QGraphicsView(self.scene) self.view.setRenderHints(QPainter.Antialiasing | QPainter.SmoothPixmapTransform | QPainter.TextAntialiasing) self.view.resize(500, 300) self.view.show() def tearDown(self): self.scene.clear() self.scene.deleteLater() self.view.deleteLater() del self.scene del self.view super().tearDown()
class TestItems(QAppTestCase): def setUp(self): super().setUp() self.scene = QGraphicsScene() self.view = QGraphicsView(self.scene) self.view.setRenderHints( QPainter.Antialiasing | QPainter.SmoothPixmapTransform | QPainter.TextAntialiasing ) self.view.resize(500, 300) self.view.show() def tearDown(self): self.scene.clear() self.scene.deleteLater() self.view.deleteLater() del self.scene del self.view super().tearDown()
class TestItems(unittest.TestCase): def setUp(self): import logging from AnyQt.QtWidgets import \ QApplication, QGraphicsScene, QGraphicsView from AnyQt.QtGui import QPainter from AnyQt.QtCore import QTimer logging.basicConfig() self.app = QApplication([]) self.scene = QGraphicsScene() self.view = QGraphicsView(self.scene) self.view.setRenderHints( QPainter.Antialiasing | \ QPainter.SmoothPixmapTransform | \ QPainter.TextAntialiasing ) self.view.resize(500, 300) self.view.show() QTimer.singleShot(10000, self.app.exit) def my_excepthook(*args): sys.setrecursionlimit(1010) traceback.print_exc(limit=4) self._orig_excepthook = sys.excepthook sys.excepthook = my_excepthook self.singleShot = QTimer.singleShot def tearDown(self): self.scene.clear() self.scene.deleteLater() self.view.deleteLater() del self.scene del self.view self.app.processEvents() del self.app sys.excepthook = self._orig_excepthook
class TestScene(QAppTestCase): def setUp(self): super().setUp() self.scene = CanvasScene() self.view = QGraphicsView(self.scene) self.view.setRenderHints(QPainter.Antialiasing | QPainter.TextAntialiasing) self.view.show() self.view.resize(400, 300) def tearDown(self): self.scene.clear() self.view.deleteLater() self.scene.deleteLater() del self.view del self.scene super().tearDown() def test_scene(self): """Test basic scene functionality. """ one_desc, negate_desc, cons_desc = self.widget_desc() one_item = items.NodeItem(one_desc) negate_item = items.NodeItem(negate_desc) cons_item = items.NodeItem(cons_desc) one_item = self.scene.add_node_item(one_item) negate_item = self.scene.add_node_item(negate_item) cons_item = self.scene.add_node_item(cons_item) # Remove a node self.scene.remove_node_item(cons_item) self.assertSequenceEqual(self.scene.node_items(), [one_item, negate_item]) # And add it again self.scene.add_node_item(cons_item) self.assertSequenceEqual(self.scene.node_items(), [one_item, negate_item, cons_item]) # Adding the same item again should raise an exception with self.assertRaises(ValueError): self.scene.add_node_item(cons_item) a1 = one_desc.outputs[0] a2 = negate_desc.inputs[0] a3 = negate_desc.outputs[0] a4 = cons_desc.inputs[0] # Add links link1 = self.scene.new_link_item( one_item, a1, negate_item, a2) link2 = self.scene.new_link_item( negate_item, a3, cons_item, a4) link1a = self.scene.add_link_item(link1) link2a = self.scene.add_link_item(link2) self.assertEqual(link1, link1a) self.assertEqual(link2, link2a) self.assertSequenceEqual(self.scene.link_items(), [link1, link2]) # Remove links self.scene.remove_link_item(link2) self.scene.remove_link_item(link1) self.assertSequenceEqual(self.scene.link_items(), []) self.assertTrue(link1.sourceItem is None and link1.sinkItem is None) self.assertTrue(link2.sourceItem is None and link2.sinkItem is None) self.assertSequenceEqual(one_item.outputAnchors(), []) self.assertSequenceEqual(negate_item.inputAnchors(), []) self.assertSequenceEqual(negate_item.outputAnchors(), []) self.assertSequenceEqual(cons_item.outputAnchors(), []) # And add one link again link1 = self.scene.new_link_item( one_item, a1, negate_item, a2) link1 = self.scene.add_link_item(link1) self.assertSequenceEqual(self.scene.link_items(), [link1]) self.assertTrue(one_item.outputAnchors()) self.assertTrue(negate_item.inputAnchors()) self.qWait() def test_scene_with_scheme(self): """Test scene through modifying the scheme. """ test_scheme = scheme.Scheme() self.scene.set_scheme(test_scheme) node_items = [] link_items = [] self.scene.node_item_added.connect(node_items.append) self.scene.node_item_removed.connect(node_items.remove) self.scene.link_item_added.connect(link_items.append) self.scene.link_item_removed.connect(link_items.remove) one_desc, negate_desc, cons_desc = self.widget_desc() one_node = scheme.SchemeNode(one_desc) negate_node = scheme.SchemeNode(negate_desc) cons_node = scheme.SchemeNode(cons_desc) nodes = [one_node, negate_node, cons_node] test_scheme.add_node(one_node) test_scheme.add_node(negate_node) test_scheme.add_node(cons_node) self.assertTrue(len(self.scene.node_items()) == 3) self.assertSequenceEqual(self.scene.node_items(), node_items) for node, item in zip(nodes, node_items): self.assertIs(item, self.scene.item_for_node(node)) # Remove a widget test_scheme.remove_node(cons_node) self.assertTrue(len(self.scene.node_items()) == 2) self.assertSequenceEqual(self.scene.node_items(), node_items) # And add it again test_scheme.add_node(cons_node) self.assertTrue(len(self.scene.node_items()) == 3) self.assertSequenceEqual(self.scene.node_items(), node_items) # Add links link1 = test_scheme.new_link(one_node, "value", negate_node, "value") link2 = test_scheme.new_link(negate_node, "result", cons_node, "first") self.assertTrue(len(self.scene.link_items()) == 2) self.assertSequenceEqual(self.scene.link_items(), link_items) # Remove links test_scheme.remove_link(link1) test_scheme.remove_link(link2) self.assertTrue(len(self.scene.link_items()) == 0) self.assertSequenceEqual(self.scene.link_items(), link_items) # And add one link again test_scheme.add_link(link1) self.assertTrue(len(self.scene.link_items()) == 1) self.assertSequenceEqual(self.scene.link_items(), link_items) self.qWait() def test_scheme_construction(self): """Test construction (editing) of the scheme through the scene. """ test_scheme = scheme.Scheme() self.scene.set_scheme(test_scheme) node_items = [] link_items = [] self.scene.node_item_added.connect(node_items.append) self.scene.node_item_removed.connect(node_items.remove) self.scene.link_item_added.connect(link_items.append) self.scene.link_item_removed.connect(link_items.remove) one_desc, negate_desc, cons_desc = self.widget_desc() one_node = scheme.SchemeNode(one_desc) one_item = self.scene.add_node(one_node) self.scene.commit_scheme_node(one_node) self.assertSequenceEqual(self.scene.node_items(), [one_item]) self.assertSequenceEqual(node_items, [one_item]) self.assertSequenceEqual(test_scheme.nodes, [one_node]) negate_node = scheme.SchemeNode(negate_desc) cons_node = scheme.SchemeNode(cons_desc) negate_item = self.scene.add_node(negate_node) cons_item = self.scene.add_node(cons_node) self.assertSequenceEqual(self.scene.node_items(), [one_item, negate_item, cons_item]) self.assertSequenceEqual(self.scene.node_items(), node_items) # The scheme is still the same. self.assertSequenceEqual(test_scheme.nodes, [one_node]) # Remove items self.scene.remove_node(negate_node) self.scene.remove_node(cons_node) self.assertSequenceEqual(self.scene.node_items(), [one_item]) self.assertSequenceEqual(node_items, [one_item]) self.assertSequenceEqual(test_scheme.nodes, [one_node]) # Add them again this time also in the scheme. negate_item = self.scene.add_node(negate_node) cons_item = self.scene.add_node(cons_node) self.scene.commit_scheme_node(negate_node) self.scene.commit_scheme_node(cons_node) self.assertSequenceEqual(self.scene.node_items(), [one_item, negate_item, cons_item]) self.assertSequenceEqual(self.scene.node_items(), node_items) self.assertSequenceEqual(test_scheme.nodes, [one_node, negate_node, cons_node]) link1 = scheme.SchemeLink(one_node, "value", negate_node, "value") link2 = scheme.SchemeLink(negate_node, "result", cons_node, "first") link_item1 = self.scene.add_link(link1) link_item2 = self.scene.add_link(link2) self.assertSequenceEqual(self.scene.link_items(), [link_item1, link_item2]) self.assertSequenceEqual(self.scene.link_items(), link_items) self.assertSequenceEqual(test_scheme.links, []) # Commit the links self.scene.commit_scheme_link(link1) self.scene.commit_scheme_link(link2) self.assertSequenceEqual(self.scene.link_items(), [link_item1, link_item2]) self.assertSequenceEqual(self.scene.link_items(), link_items) self.assertSequenceEqual(test_scheme.links, [link1, link2]) self.qWait() def widget_desc(self): reg = small_testing_registry() one_desc = reg.widget("one") negate_desc = reg.widget("negate") cons_desc = reg.widget("cons") return one_desc, negate_desc, cons_desc
class TestAnchorLayout(QAppTestCase): def setUp(self): super(TestAnchorLayout, self).setUp() self.scene = CanvasScene() self.view = QGraphicsView(self.scene) self.view.setRenderHint(QPainter.Antialiasing) self.view.show() self.view.resize(600, 400) def tearDown(self): self.scene.clear() self.view.deleteLater() self.scene.deleteLater() del self.scene del self.view super(TestAnchorLayout, self).tearDown() def test_layout(self): one_desc, negate_desc, cons_desc = self.widget_desc() one_item = NodeItem() one_item.setWidgetDescription(one_desc) one_item.setPos(0, 150) self.scene.add_node_item(one_item) cons_item = NodeItem() cons_item.setWidgetDescription(cons_desc) cons_item.setPos(200, 0) self.scene.add_node_item(cons_item) negate_item = NodeItem() negate_item.setWidgetDescription(negate_desc) negate_item.setPos(200, 300) self.scene.add_node_item(negate_item) link = LinkItem() link.setSourceItem(one_item) link.setSinkItem(negate_item) self.scene.add_link_item(link) link = LinkItem() link.setSourceItem(one_item) link.setSinkItem(cons_item) self.scene.add_link_item(link) layout = AnchorLayout() self.scene.addItem(layout) self.scene.set_anchor_layout(layout) layout.invalidateNode(one_item) layout.activate() p1, p2 = one_item.outputAnchorItem.anchorPositions() self.assertTrue(p1 > p2) self.scene.node_item_position_changed.connect(layout.invalidateNode) path = QPainterPath() path.addEllipse(125, 0, 50, 300) def advance(): t = time.clock() cons_item.setPos(path.pointAtPercent(t % 1.0)) negate_item.setPos(path.pointAtPercent((t + 0.5) % 1.0)) timer = QTimer(negate_item, interval=20) timer.start() timer.timeout.connect(advance) self.app.exec_() def widget_desc(self): reg = small_testing_registry() one_desc = reg.widget("one") negate_desc = reg.widget("negate") cons_desc = reg.widget("cons") return one_desc, negate_desc, cons_desc
class TestHeatmapGridWidget(GuiTest): scene: QGraphicsScene view: QGraphicsView def setUp(self) -> None: super().setUp() self.view = QGraphicsView() self.scene = QGraphicsScene(self.view) self.view.setScene(self.scene) def tearDown(self) -> None: self.scene.clear() self.scene.deleteLater() self.scene = None self.view.deleteLater() self.view = None super().tearDown() _c2 = Tree(ClusterData((0, 1), 0.5), ( Tree(SingletonData((0, 0), 0, 0), ()), Tree(SingletonData((1, 1), 0, 1), ()), )) _Data = { "0-0": HeatmapGridWidget.Parts(rows=[], columns=[], data=np.zeros(shape=(0, 0)), span=(0, 0)), "1-0": HeatmapGridWidget.Parts(rows=[], columns=[], data=np.zeros(shape=(0, 0)), span=(0, 0)), "0-1": HeatmapGridWidget.Parts( rows=[], columns=[HeatmapGridWidget.ColumnItem("a", [0])], data=np.zeros(shape=(0, 1)), span=(0, 1)), "1-1": HeatmapGridWidget.Parts( rows=[HeatmapGridWidget.RowItem("a", [0])], columns=[HeatmapGridWidget.ColumnItem("a", [0])], data=np.zeros(shape=(1, 1)), span=(0, 1), row_names=["a"], col_names=["b"], ), "2-2-split": HeatmapGridWidget.Parts( rows=[ HeatmapGridWidget.RowItem("a", [0]), HeatmapGridWidget.RowItem("b", [1]), ], columns=[ HeatmapGridWidget.ColumnItem("a", [0]), HeatmapGridWidget.ColumnItem("a", [1]), ], data=np.zeros(shape=(2, 2)), span=(-1, 1), row_names=["a", "b"], col_names=["b", "b"], ), "2-2-cl": HeatmapGridWidget.Parts( rows=[HeatmapGridWidget.RowItem("", [0, 1], _c2)], columns=[HeatmapGridWidget.ColumnItem("", [0, 1], _c2)], data=np.zeros(shape=(2, 2)), span=(-1, 1), row_names=["a", "b"], col_names=["b", "b"], ), "2-2": HeatmapGridWidget.Parts( rows=[HeatmapGridWidget.RowItem("", [0, 1])], columns=[HeatmapGridWidget.ColumnItem("", [0, 1])], data=np.zeros(shape=(2, 2)), span=(-1, 1), row_names=["a", "b"], col_names=["b", "b"], ) } def test_widget(self): w = HeatmapGridWidget() self.scene.addItem(w) for p in self._Data.values(): w.setHeatmaps(p) w.headerGeometry() w.footerGeometry() def test_widget_annotations(self): w = HeatmapGridWidget() self.scene.addItem(w) w.setHeatmaps(self._Data["2-2"]) # Coverage. The game. w.setLegendVisible(True) w.setLegendVisible(False) w.setShowAverages(True) w.setShowAverages(False) w.setRowLabels(None) w.setRowLabels(["1", "2"]) w.setRowLabelsVisible(False) w.setRowLabelsVisible(True) w.setColumnLabels(None) w.setColumnLabels(["1", "2"]) w.setAspectRatioMode(Qt.IgnoreAspectRatio) w.setAspectRatioMode(Qt.KeepAspectRatio) w.setAspectRatioMode(Qt.KeepAspectRatioByExpanding) for pos in ( HeatmapGridWidget.NoPosition, HeatmapGridWidget.PositionTop, HeatmapGridWidget.PositionBottom, HeatmapGridWidget.PositionTop | HeatmapGridWidget.PositionBottom, ): w.setColumnLabelsPosition(pos) w.setRowSideColorAnnotations( np.array([0, 1]), CategoricalColorMap(np.array([[255] * 3, [0] * 3]), names=["a", "b"])) w.setRowSideColorAnnotations(None) def test_selection(self): w = HeatmapGridWidget() self.scene.addItem(w) w.setHeatmaps(self._Data["2-2"]) view = self.view w.resize(w.effectiveSizeHint(Qt.PreferredSize)) h = w.layout().itemAt(w.Row0, w.Col0 + 1) pos = view.mapFromScene(h.scenePos()) spy = QSignalSpy(w.selectionFinished) QTest.mouseClick(view.viewport(), Qt.LeftButton, pos=pos + QPoint(1, 1)) self.assertSequenceEqual(list(spy), [[]]) self.assertSequenceEqual(w.selectedRows(), [0]) spy = QSignalSpy(w.selectionFinished) QTest.mouseClick(view.viewport(), Qt.LeftButton, Qt.ControlModifier, pos=pos + QPoint(1, 1)) self.assertSequenceEqual(list(spy), [[]]) self.assertSequenceEqual(w.selectedRows(), []) spy = QSignalSpy(w.selectionFinished) QTest.mousePress(view.viewport(), Qt.LeftButton, pos=pos + QPoint(1, 1)) mouseMove(view.viewport(), Qt.LeftButton, pos=pos + QPoint(20, 20)) QTest.mouseRelease(view.viewport(), Qt.LeftButton, pos=pos + QPoint(30, 40)) self.assertSequenceEqual(list(spy), [[]]) spy_fin = QSignalSpy(w.selectionFinished) spy_chn = QSignalSpy(w.selectionChanged) w.selectRows([1]) self.assertSequenceEqual(list(spy_fin), []) self.assertSequenceEqual(list(spy_chn), [[]]) def test_colormap(self): w = HeatmapGridWidget() self.scene.addItem(w) w.setHeatmaps(self._Data["2-2"]) w.setColorMap(GradientColorMap([[255] * 3, [0] * 3])) w.setColorMap(GradientColorMap([[255] * 3, [0] * 3], center=0))
class TestAnchorLayout(QAppTestCase): def setUp(self): super().setUp() self.scene = CanvasScene() self.view = QGraphicsView(self.scene) self.view.setRenderHint(QPainter.Antialiasing) self.view.show() self.view.resize(600, 400) def tearDown(self): self.scene.clear() self.view.deleteLater() self.scene.deleteLater() del self.scene del self.view super().tearDown() def test_layout(self): one_desc, negate_desc, cons_desc = self.widget_desc() one_item = NodeItem() one_item.setWidgetDescription(one_desc) one_item.setPos(0, 150) self.scene.add_node_item(one_item) cons_item = NodeItem() cons_item.setWidgetDescription(cons_desc) cons_item.setPos(200, 0) self.scene.add_node_item(cons_item) negate_item = NodeItem() negate_item.setWidgetDescription(negate_desc) negate_item.setPos(200, 300) self.scene.add_node_item(negate_item) link = LinkItem() link.setSourceItem(one_item) link.setSinkItem(negate_item) self.scene.add_link_item(link) link = LinkItem() link.setSourceItem(one_item) link.setSinkItem(cons_item) self.scene.add_link_item(link) layout = AnchorLayout() self.scene.addItem(layout) self.scene.set_anchor_layout(layout) layout.invalidateNode(one_item) layout.activate() p1, p2 = one_item.outputAnchorItem.anchorPositions() self.assertTrue(p1 > p2) self.scene.node_item_position_changed.connect(layout.invalidateNode) path = QPainterPath() path.addEllipse(125, 0, 50, 300) def advance(): t = time.process_time() cons_item.setPos(path.pointAtPercent(t % 1.0)) negate_item.setPos(path.pointAtPercent((t + 0.5) % 1.0)) timer = QTimer(negate_item, interval=20) timer.start() timer.timeout.connect(advance) self.app.exec_() def widget_desc(self): reg = small_testing_registry() one_desc = reg.widget("one") negate_desc = reg.widget("negate") cons_desc = reg.widget("cons") return one_desc, negate_desc, cons_desc
class TestGraphicsTextItem(QAppTestCase): def setUp(self): super().setUp() self.scene = QGraphicsScene() self.view = QGraphicsView(self.scene) self.item = GraphicsTextItem() self.item.setPlainText("AAA") self.item.setTextInteractionFlags(Qt.TextEditable) self.scene.addItem(self.item) self.view.setFocus() def tearDown(self): self.scene.clear() self.view.deleteLater() del self.scene del self.view super().tearDown() def test_item_context_menu(self): item = self.item menu = self._context_menu() self.assertFalse(item.textCursor().hasSelection()) ac = find_action(menu, "select-all") self.assertTrue(ac.isEnabled()) ac.trigger() self.assertTrue(item.textCursor().hasSelection()) def test_copy_cut_paste(self): item = self.item cb = QApplication.clipboard() c = item.textCursor() c.select(c.Document) item.setTextCursor(c) menu = self._context_menu() ac = find_action(menu, "edit-copy") spy = QSignalSpy(cb.dataChanged) ac.trigger() self.assertTrue(len(spy) or spy.wait()) ac = find_action(menu, "edit-cut") spy = QSignalSpy(cb.dataChanged) ac.trigger() self.assertTrue(len(spy) or spy.wait()) self.assertEqual(item.toPlainText(), "") ac = find_action(menu, "edit-paste") ac.trigger() self.assertEqual(item.toPlainText(), "AAA") def test_context_menu_delete(self): item = self.item c = item.textCursor() c.select(c.Document) item.setTextCursor(c) menu = self._context_menu() ac = find_action(menu, "edit-delete") ac.trigger() self.assertEqual(self.item.toPlainText(), "") def _context_menu(self): point = map_to_viewport(self.view, self.item, self.item.boundingRect().center()) contextMenu(self.view.viewport(), point) return self._get_menu() def _get_menu(self) -> QMenu: menu = findf( self.app.topLevelWidgets(), lambda w: isinstance(w, QMenu) and w. parent() is self.view.viewport()) assert menu is not None return menu
class TestScene(QAppTestCase): def setUp(self): super().setUp() self.scene = CanvasScene() self.view = QGraphicsView(self.scene) self.view.setRenderHints(QPainter.Antialiasing | QPainter.TextAntialiasing) self.view.show() self.view.resize(400, 300) def tearDown(self): self.scene.clear() self.view.deleteLater() self.scene.deleteLater() del self.view del self.scene super().tearDown() def test_scene(self): """Test basic scene functionality. """ one_desc, negate_desc, cons_desc = self.widget_desc() one_item = items.NodeItem(one_desc) negate_item = items.NodeItem(negate_desc) cons_item = items.NodeItem(cons_desc) one_item = self.scene.add_node_item(one_item) negate_item = self.scene.add_node_item(negate_item) cons_item = self.scene.add_node_item(cons_item) # Remove a node self.scene.remove_node_item(cons_item) self.assertSequenceEqual(self.scene.node_items(), [one_item, negate_item]) # And add it again self.scene.add_node_item(cons_item) self.assertSequenceEqual(self.scene.node_items(), [one_item, negate_item, cons_item]) # Adding the same item again should raise an exception with self.assertRaises(ValueError): self.scene.add_node_item(cons_item) # Add links link1 = self.scene.new_link_item( one_item, "value", negate_item, "value") link2 = self.scene.new_link_item( negate_item, "result", cons_item, "first") link1a = self.scene.add_link_item(link1) link2a = self.scene.add_link_item(link2) self.assertEqual(link1, link1a) self.assertEqual(link2, link2a) self.assertSequenceEqual(self.scene.link_items(), [link1, link2]) # Remove links self.scene.remove_link_item(link2) self.scene.remove_link_item(link1) self.assertSequenceEqual(self.scene.link_items(), []) self.assertTrue(link1.sourceItem is None and link1.sinkItem is None) self.assertTrue(link2.sourceItem is None and link2.sinkItem is None) self.assertSequenceEqual(one_item.outputAnchors(), []) self.assertSequenceEqual(negate_item.inputAnchors(), []) self.assertSequenceEqual(negate_item.outputAnchors(), []) self.assertSequenceEqual(cons_item.outputAnchors(), []) # And add one link again link1 = self.scene.new_link_item( one_item, "value", negate_item, "value") link1 = self.scene.add_link_item(link1) self.assertSequenceEqual(self.scene.link_items(), [link1]) self.assertTrue(one_item.outputAnchors()) self.assertTrue(negate_item.inputAnchors()) self.app.exec_() def test_scene_with_scheme(self): """Test scene through modifying the scheme. """ test_scheme = scheme.Scheme() self.scene.set_scheme(test_scheme) node_items = [] link_items = [] self.scene.node_item_added.connect(node_items.append) self.scene.node_item_removed.connect(node_items.remove) self.scene.link_item_added.connect(link_items.append) self.scene.link_item_removed.connect(link_items.remove) one_desc, negate_desc, cons_desc = self.widget_desc() one_node = scheme.SchemeNode(one_desc) negate_node = scheme.SchemeNode(negate_desc) cons_node = scheme.SchemeNode(cons_desc) nodes = [one_node, negate_node, cons_node] test_scheme.add_node(one_node) test_scheme.add_node(negate_node) test_scheme.add_node(cons_node) self.assertTrue(len(self.scene.node_items()) == 3) self.assertSequenceEqual(self.scene.node_items(), node_items) for node, item in zip(nodes, node_items): self.assertIs(item, self.scene.item_for_node(node)) # Remove a widget test_scheme.remove_node(cons_node) self.assertTrue(len(self.scene.node_items()) == 2) self.assertSequenceEqual(self.scene.node_items(), node_items) # And add it again test_scheme.add_node(cons_node) self.assertTrue(len(self.scene.node_items()) == 3) self.assertSequenceEqual(self.scene.node_items(), node_items) # Add links link1 = test_scheme.new_link(one_node, "value", negate_node, "value") link2 = test_scheme.new_link(negate_node, "result", cons_node, "first") self.assertTrue(len(self.scene.link_items()) == 2) self.assertSequenceEqual(self.scene.link_items(), link_items) # Remove links test_scheme.remove_link(link1) test_scheme.remove_link(link2) self.assertTrue(len(self.scene.link_items()) == 0) self.assertSequenceEqual(self.scene.link_items(), link_items) # And add one link again test_scheme.add_link(link1) self.assertTrue(len(self.scene.link_items()) == 1) self.assertSequenceEqual(self.scene.link_items(), link_items) self.app.exec_() def test_scheme_construction(self): """Test construction (editing) of the scheme through the scene. """ test_scheme = scheme.Scheme() self.scene.set_scheme(test_scheme) node_items = [] link_items = [] self.scene.node_item_added.connect(node_items.append) self.scene.node_item_removed.connect(node_items.remove) self.scene.link_item_added.connect(link_items.append) self.scene.link_item_removed.connect(link_items.remove) one_desc, negate_desc, cons_desc = self.widget_desc() one_node = scheme.SchemeNode(one_desc) one_item = self.scene.add_node(one_node) self.scene.commit_scheme_node(one_node) self.assertSequenceEqual(self.scene.node_items(), [one_item]) self.assertSequenceEqual(node_items, [one_item]) self.assertSequenceEqual(test_scheme.nodes, [one_node]) negate_node = scheme.SchemeNode(negate_desc) cons_node = scheme.SchemeNode(cons_desc) negate_item = self.scene.add_node(negate_node) cons_item = self.scene.add_node(cons_node) self.assertSequenceEqual(self.scene.node_items(), [one_item, negate_item, cons_item]) self.assertSequenceEqual(self.scene.node_items(), node_items) # The scheme is still the same. self.assertSequenceEqual(test_scheme.nodes, [one_node]) # Remove items self.scene.remove_node(negate_node) self.scene.remove_node(cons_node) self.assertSequenceEqual(self.scene.node_items(), [one_item]) self.assertSequenceEqual(node_items, [one_item]) self.assertSequenceEqual(test_scheme.nodes, [one_node]) # Add them again this time also in the scheme. negate_item = self.scene.add_node(negate_node) cons_item = self.scene.add_node(cons_node) self.scene.commit_scheme_node(negate_node) self.scene.commit_scheme_node(cons_node) self.assertSequenceEqual(self.scene.node_items(), [one_item, negate_item, cons_item]) self.assertSequenceEqual(self.scene.node_items(), node_items) self.assertSequenceEqual(test_scheme.nodes, [one_node, negate_node, cons_node]) link1 = scheme.SchemeLink(one_node, "value", negate_node, "value") link2 = scheme.SchemeLink(negate_node, "result", cons_node, "first") link_item1 = self.scene.add_link(link1) link_item2 = self.scene.add_link(link2) self.assertSequenceEqual(self.scene.link_items(), [link_item1, link_item2]) self.assertSequenceEqual(self.scene.link_items(), link_items) self.assertSequenceEqual(test_scheme.links, []) # Commit the links self.scene.commit_scheme_link(link1) self.scene.commit_scheme_link(link2) self.assertSequenceEqual(self.scene.link_items(), [link_item1, link_item2]) self.assertSequenceEqual(self.scene.link_items(), link_items) self.assertSequenceEqual(test_scheme.links, [link1, link2]) self.app.exec_() def widget_desc(self): reg = small_testing_registry() one_desc = reg.widget("one") negate_desc = reg.widget("negate") cons_desc = reg.widget("cons") return one_desc, negate_desc, cons_desc