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()
Esempio n. 2
0
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()
Esempio n. 3
0
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()
Esempio n. 4
0
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()
Esempio n. 5
0
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
Esempio n. 6
0
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
Esempio n. 7
0
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
Esempio n. 8
0
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))
Esempio n. 9
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
Esempio n. 10
0
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
Esempio n. 11
0
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