source: orange/Orange/OrangeCanvas/canvas/tests/test_scene.py @ 11180:c0e3d8cdbd08

Revision 11180:c0e3d8cdbd08, 8.7 KB checked in by Ales Erjavec <ales.erjavec@…>, 17 months ago (diff)

Added link AnchorLayout class.

Line 
1from PyQt4.QtGui import QGraphicsView, QPainter
2
3from ..scene import CanvasScene
4from .. import items
5from ... import scheme
6
7from ...gui.test import QAppTestCase
8
9
10class TestScene(QAppTestCase):
11    def setUp(self):
12        QAppTestCase.setUp(self)
13        self.scene = CanvasScene()
14        self.view = QGraphicsView(self.scene)
15        self.view.setRenderHints(QPainter.Antialiasing | \
16                                 QPainter.TextAntialiasing)
17        self.view.show()
18        self.view.resize(400, 300)
19
20    def test_scene(self):
21        """Test basic scene functionality.
22        """
23        file_desc, disc_desc, bayes_desc = self.widget_desc()
24
25        file_item = items.NodeItem(file_desc)
26        disc_item = items.NodeItem(disc_desc)
27        bayes_item = items.NodeItem(bayes_desc)
28
29        file_item = self.scene.add_node_item(file_item)
30        disc_item = self.scene.add_node_item(disc_item)
31        bayes_item = self.scene.add_node_item(bayes_item)
32
33        # Remove a node
34        self.scene.remove_node_item(bayes_item)
35        self.assertSequenceEqual(self.scene.node_items(),
36                                 [file_item, disc_item])
37
38        # And add it again
39        self.scene.add_node_item(bayes_item)
40        self.assertSequenceEqual(self.scene.node_items(),
41                                 [file_item, disc_item, bayes_item])
42
43        # Adding the same item again should raise an exception
44        with self.assertRaises(ValueError):
45            self.scene.add_node_item(bayes_item)
46
47        # Add links
48        link1 = self.scene.new_link_item(file_item, "Data", disc_item, "Data")
49        link2 = self.scene.new_link_item(disc_item, "Data", bayes_item, "Data")
50
51        link1a = self.scene.add_link_item(link1)
52        link2a = self.scene.add_link_item(link2)
53        self.assertEqual(link1, link1a)
54        self.assertEqual(link2, link2a)
55        self.assertSequenceEqual(self.scene.link_items(), [link1, link2])
56
57        # Remove links
58        self.scene.remove_link_item(link2)
59        self.scene.remove_link_item(link1)
60        self.assertSequenceEqual(self.scene.link_items(), [])
61
62        self.assertTrue(link1.sourceItem is None and link1.sinkItem is None)
63        self.assertTrue(link2.sourceItem is None and link2.sinkItem is None)
64
65        self.assertSequenceEqual(file_item.outputAnchors(), [])
66        self.assertSequenceEqual(disc_item.inputAnchors(), [])
67        self.assertSequenceEqual(disc_item.outputAnchors(), [])
68        self.assertSequenceEqual(bayes_item.outputAnchors(), [])
69
70        # And add one link again
71        link1 = self.scene.new_link_item(file_item, "Data", disc_item, "Data")
72        link1 = self.scene.add_link_item(link1)
73        self.assertSequenceEqual(self.scene.link_items(), [link1])
74
75        self.assertTrue(file_item.outputAnchors())
76        self.assertTrue(disc_item.inputAnchors())
77
78        self.app.exec_()
79
80    def test_scene_with_scheme(self):
81        """Test scene through modifying the scheme.
82        """
83        test_scheme = scheme.Scheme()
84        self.scene.set_scheme(test_scheme)
85
86        node_items = []
87        link_items = []
88
89        self.scene.node_item_added.connect(node_items.append)
90        self.scene.node_item_removed.connect(node_items.remove)
91        self.scene.link_item_added.connect(link_items.append)
92        self.scene.link_item_removed.connect(link_items.remove)
93
94        file_desc, disc_desc, bayes_desc = self.widget_desc()
95        file_node = scheme.SchemeNode(file_desc)
96        disc_node = scheme.SchemeNode(disc_desc)
97        bayes_node = scheme.SchemeNode(bayes_desc)
98
99        nodes = [file_node, disc_node, bayes_node]
100        test_scheme.add_node(file_node)
101        test_scheme.add_node(disc_node)
102        test_scheme.add_node(bayes_node)
103
104        self.assertTrue(len(self.scene.node_items()) == 3)
105        self.assertSequenceEqual(self.scene.node_items(), node_items)
106
107        for node, item in zip(nodes, node_items):
108            self.assertIs(item, self.scene.item_for_node(node))
109
110        # Remove a widget
111        test_scheme.remove_node(bayes_node)
112        self.assertTrue(len(self.scene.node_items()) == 2)
113        self.assertSequenceEqual(self.scene.node_items(), node_items)
114
115        # And add it again
116        test_scheme.add_node(bayes_node)
117        self.assertTrue(len(self.scene.node_items()) == 3)
118        self.assertSequenceEqual(self.scene.node_items(), node_items)
119
120        # Add links
121        link1 = test_scheme.new_link(file_node, "Data", disc_node, "Data")
122        link2 = test_scheme.new_link(disc_node, "Data", bayes_node, "Data")
123        self.assertTrue(len(self.scene.link_items()) == 2)
124        self.assertSequenceEqual(self.scene.link_items(), link_items)
125
126        # Remove links
127        test_scheme.remove_link(link1)
128        test_scheme.remove_link(link2)
129        self.assertTrue(len(self.scene.link_items()) == 0)
130        self.assertSequenceEqual(self.scene.link_items(), link_items)
131
132        # And add one link again
133        test_scheme.add_link(link1)
134        self.assertTrue(len(self.scene.link_items()) == 1)
135        self.assertSequenceEqual(self.scene.link_items(), link_items)
136        self.app.exec_()
137
138    def test_scheme_construction(self):
139        """Test construction (editing) of the scheme through the scene.
140        """
141        test_scheme = scheme.Scheme()
142        self.scene.set_scheme(test_scheme)
143
144        node_items = []
145        link_items = []
146
147        self.scene.node_item_added.connect(node_items.append)
148        self.scene.node_item_removed.connect(node_items.remove)
149        self.scene.link_item_added.connect(link_items.append)
150        self.scene.link_item_removed.connect(link_items.remove)
151
152        file_desc, disc_desc, bayes_desc = self.widget_desc()
153        file_node = scheme.SchemeNode(file_desc)
154
155        file_item = self.scene.add_node(file_node)
156        self.scene.commit_scheme_node(file_node)
157
158        self.assertSequenceEqual(self.scene.node_items(), [file_item])
159        self.assertSequenceEqual(node_items, [file_item])
160        self.assertSequenceEqual(test_scheme.nodes, [file_node])
161
162        disc_node = scheme.SchemeNode(disc_desc)
163        bayes_node = scheme.SchemeNode(bayes_desc)
164
165        disc_item = self.scene.add_node(disc_node)
166        bayes_item = self.scene.add_node(bayes_node)
167
168        self.assertSequenceEqual(self.scene.node_items(),
169                                 [file_item, disc_item, bayes_item])
170        self.assertSequenceEqual(self.scene.node_items(), node_items)
171
172        # The scheme is still the same.
173        self.assertSequenceEqual(test_scheme.nodes, [file_node])
174
175        # Remove items
176        self.scene.remove_node(disc_node)
177        self.scene.remove_node(bayes_node)
178
179        self.assertSequenceEqual(self.scene.node_items(), [file_item])
180        self.assertSequenceEqual(node_items, [file_item])
181        self.assertSequenceEqual(test_scheme.nodes, [file_node])
182
183        # Add them again this time also in the scheme.
184        disc_item = self.scene.add_node(disc_node)
185        bayes_item = self.scene.add_node(bayes_node)
186
187        self.scene.commit_scheme_node(disc_node)
188        self.scene.commit_scheme_node(bayes_node)
189
190        self.assertSequenceEqual(self.scene.node_items(),
191                                 [file_item, disc_item, bayes_item])
192        self.assertSequenceEqual(self.scene.node_items(), node_items)
193        self.assertSequenceEqual(test_scheme.nodes,
194                                 [file_node, disc_node, bayes_node])
195
196        link1 = scheme.SchemeLink(file_node, "Data", disc_node, "Data")
197        link2 = scheme.SchemeLink(disc_node, "Data", bayes_node, "Data")
198        link_item1 = self.scene.add_link(link1)
199        link_item2 = self.scene.add_link(link2)
200
201        self.assertSequenceEqual(self.scene.link_items(),
202                                 [link_item1, link_item2])
203        self.assertSequenceEqual(self.scene.link_items(), link_items)
204        self.assertSequenceEqual(test_scheme.links, [])
205
206        # Commit the links
207        self.scene.commit_scheme_link(link1)
208        self.scene.commit_scheme_link(link2)
209
210        self.assertSequenceEqual(self.scene.link_items(),
211                                 [link_item1, link_item2])
212        self.assertSequenceEqual(self.scene.link_items(), link_items)
213        self.assertSequenceEqual(test_scheme.links,
214                                 [link1, link2])
215
216        self.app.exec_()
217
218    def widget_desc(self):
219        from ...registry.tests import small_testing_registry
220        reg = small_testing_registry()
221
222        file_desc = reg.widget(
223            "Orange.OrangeWidgets.Data.OWFile.OWFile"
224        )
225
226        discretize_desc = reg.widget(
227            "Orange.OrangeWidgets.Data.OWDiscretize.OWDiscretize"
228        )
229
230        bayes_desc = reg.widget(
231            "Orange.OrangeWidgets.Classify.OWNaiveBayes.OWNaiveBayes"
232        )
233
234        return file_desc, discretize_desc, bayes_desc
Note: See TracBrowser for help on using the repository browser.