source: orange/Orange/OrangeCanvas/scheme/tests/test_readwrite.py @ 11683:7b9dcf8abcc4

Revision 11683:7b9dcf8abcc4, 9.7 KB checked in by Ales Erjavec <ales.erjavec@…>, 8 months ago (diff)

Refactored scheme parsing.

Using widget description's "replaces" list to resolve widgets.

Line 
1"""Test read write
2"""
3from xml.etree import ElementTree as ET
4from StringIO import StringIO
5
6from ...gui import test
7from ...registry import global_registry, WidgetRegistry, WidgetDescription
8
9from .. import Scheme, SchemeNode, SchemeLink, \
10               SchemeArrowAnnotation, SchemeTextAnnotation
11
12from .. import readwrite
13from ..readwrite import scheme_to_ows_stream, parse_scheme, scheme_load
14
15
16class TestReadWrite(test.QAppTestCase):
17    def test_io(self):
18        reg = global_registry()
19
20        base = "Orange.OrangeWidgets"
21        file_desc = reg.widget(base + ".Data.OWFile.OWFile")
22        discretize_desc = reg.widget(base + ".Data.OWDiscretize.OWDiscretize")
23        bayes_desc = reg.widget(base + ".Classify.OWNaiveBayes.OWNaiveBayes")
24
25        scheme = Scheme()
26        file_node = SchemeNode(file_desc)
27        discretize_node = SchemeNode(discretize_desc)
28        bayes_node = SchemeNode(bayes_desc)
29
30        scheme.add_node(file_node)
31        scheme.add_node(discretize_node)
32        scheme.add_node(bayes_node)
33
34        scheme.add_link(SchemeLink(file_node, "Data",
35                                   discretize_node, "Data"))
36
37        scheme.add_link(SchemeLink(discretize_node, "Data",
38                                   bayes_node, "Data"))
39
40        scheme.add_annotation(SchemeArrowAnnotation((0, 0), (10, 10)))
41        scheme.add_annotation(SchemeTextAnnotation((0, 100, 200, 200), "$$"))
42
43        stream = StringIO()
44        scheme_to_ows_stream(scheme, stream)
45
46        stream.seek(0)
47
48        scheme_1 = parse_scheme(Scheme(), stream)
49
50        self.assertTrue(len(scheme.nodes) == len(scheme_1.nodes))
51        self.assertTrue(len(scheme.links) == len(scheme_1.links))
52        self.assertTrue(len(scheme.annotations) == len(scheme_1.annotations))
53
54        for n1, n2 in zip(scheme.nodes, scheme_1.nodes):
55            self.assertEqual(n1.position, n2.position)
56            self.assertEqual(n1.title, n2.title)
57
58        for link1, link2 in zip(scheme.links, scheme_1.links):
59            self.assertEqual(link1.source_type(), link2.source_type())
60            self.assertEqual(link1.sink_type(), link2.sink_type())
61
62            self.assertEqual(link1.source_channel.name,
63                             link2.source_channel.name)
64
65            self.assertEqual(link1.sink_channel.name,
66                             link2.sink_channel.name)
67
68            self.assertEqual(link1.enabled, link2.enabled)
69
70        for annot1, annot2 in zip(scheme.annotations, scheme_1.annotations):
71            self.assertIs(type(annot1), type(annot2))
72            if isinstance(annot1, SchemeTextAnnotation):
73                self.assertEqual(annot1.text, annot2.text)
74                self.assertEqual(annot1.rect, annot2.rect)
75            else:
76                self.assertEqual(annot1.start_pos, annot2.start_pos)
77                self.assertEqual(annot1.end_pos, annot2.end_pos)
78
79    def test_io2(self):
80        reg = global_registry()
81
82        base = "Orange.OrangeWidgets"
83        file_desc = reg.widget(base + ".Data.OWFile.OWFile")
84        discretize_desc = reg.widget(base + ".Data.OWDiscretize.OWDiscretize")
85        bayes_desc = reg.widget(base + ".Classify.OWNaiveBayes.OWNaiveBayes")
86
87        scheme = Scheme()
88        file_node = SchemeNode(file_desc)
89        discretize_node = SchemeNode(discretize_desc)
90        bayes_node = SchemeNode(bayes_desc)
91
92        scheme.add_node(file_node)
93        scheme.add_node(discretize_node)
94        scheme.add_node(bayes_node)
95
96        scheme.add_link(SchemeLink(file_node, "Data",
97                                   discretize_node, "Data"))
98
99        scheme.add_link(SchemeLink(discretize_node, "Data",
100                                   bayes_node, "Data"))
101
102        scheme.add_annotation(SchemeArrowAnnotation((0, 0), (10, 10)))
103        scheme.add_annotation(SchemeTextAnnotation((0, 100, 200, 200), "$$"))
104
105        stream = StringIO()
106        scheme_to_ows_stream(scheme, stream)
107
108        stream.seek(0)
109
110        scheme_1 = scheme_load(Scheme(), stream)
111
112        self.assertEqual(len(scheme.nodes), len(scheme_1.nodes))
113        self.assertEqual(len(scheme.links), len(scheme_1.links))
114        self.assertEqual(len(scheme.annotations), len(scheme_1.annotations))
115
116        for n1, n2 in zip(scheme.nodes, scheme_1.nodes):
117            self.assertEqual(n1.position, n2.position)
118            self.assertEqual(n1.title, n2.title)
119
120        for link1, link2 in zip(scheme.links, scheme_1.links):
121            self.assertEqual(link1.source_type(), link2.source_type())
122            self.assertEqual(link1.sink_type(), link2.sink_type())
123
124            self.assertEqual(link1.source_channel.name,
125                             link2.source_channel.name)
126
127            self.assertEqual(link1.sink_channel.name,
128                             link2.sink_channel.name)
129
130            self.assertEqual(link1.enabled, link2.enabled)
131
132        for annot1, annot2 in zip(scheme.annotations, scheme_1.annotations):
133            self.assertIs(type(annot1), type(annot2))
134            if isinstance(annot1, SchemeTextAnnotation):
135                self.assertEqual(annot1.text, annot2.text)
136                self.assertEqual(annot1.rect, annot2.rect)
137            else:
138                self.assertEqual(annot1.start_pos, annot2.start_pos)
139                self.assertEqual(annot1.end_pos, annot2.end_pos)
140
141    def test_safe_evals(self):
142        s = readwrite.string_eval(r"'\x00\xff'")
143        self.assertEquals(s, chr(0) + chr(255))
144
145        with self.assertRaises(ValueError):
146            readwrite.string_eval("[1, 2]")
147
148        t = readwrite.tuple_eval("(1, 2.0, 'a')")
149        self.assertEqual(t, (1, 2.0, 'a'))
150
151        with self.assertRaises(ValueError):
152            readwrite.tuple_eval("u'string'")
153
154        with self.assertRaises(ValueError):
155            readwrite.tuple_eval("(1, [1, [2, ]])")
156
157        self.assertIs(readwrite.terminal_eval("True"), True)
158        self.assertIs(readwrite.terminal_eval("False"), False)
159        self.assertIs(readwrite.terminal_eval("None"), None)
160
161        self.assertEqual(readwrite.terminal_eval("42"), 42)
162        self.assertEqual(readwrite.terminal_eval("'42'"), '42')
163
164    def test_literal_dump(self):
165        struct = {1: [{(1, 2): ""}],
166                  True: 1.0,
167                  None: None}
168
169        s = readwrite.literal_dumps(struct)
170        self.assertEqual(readwrite.literal_loads(s), struct)
171
172        with self.assertRaises(ValueError):
173            recur = [1]
174            recur.append(recur)
175            readwrite.literal_dumps(recur)
176
177        with self.assertRaises(TypeError):
178            readwrite.literal_dumps(self)
179
180    def test_1_0_parse(self):
181        tree = ET.parse(StringIO(FOOBAR_v10))
182        parsed = readwrite.parse_ows_etree_v_1_0(tree)
183        self.assertIsInstance(parsed, readwrite._scheme)
184        self.assertEqual(parsed.version, "1.0")
185        self.assertTrue(len(parsed.nodes) == 2)
186        self.assertTrue(len(parsed.links) == 2)
187
188        qnames = [node.qualified_name for node in parsed.nodes]
189        self.assertSetEqual(set(qnames), set(["foo", "bar"]))
190
191        reg = foo_registry()
192
193        parsed = readwrite.resolve_1_0(parsed, reg)
194
195        qnames = [node.qualified_name for node in parsed.nodes]
196        self.assertSetEqual(set(qnames),
197                            set(["package.foo", "frob.bar"]))
198        projects = [node.project_name for node in parsed.nodes]
199        self.assertSetEqual(set(projects), set(["Foo", "Bar"]))
200
201    def test_resolve_replaced(self):
202        tree = ET.parse(StringIO(FOOBAR_v20))
203        parsed = readwrite.parse_ows_etree_v_2_0(tree)
204
205        self.assertIsInstance(parsed, readwrite._scheme)
206        self.assertEqual(parsed.version, "2.0")
207        self.assertTrue(len(parsed.nodes) == 2)
208        self.assertTrue(len(parsed.links) == 2)
209
210        qnames = [node.qualified_name for node in parsed.nodes]
211        self.assertSetEqual(set(qnames), set(["package.foo", "package.bar"]))
212
213        reg = foo_registry()
214
215        parsed = readwrite.resolve_replaced(parsed, reg)
216
217        qnames = [node.qualified_name for node in parsed.nodes]
218        self.assertSetEqual(set(qnames),
219                            set(["package.foo", "frob.bar"]))
220        projects = [node.project_name for node in parsed.nodes]
221        self.assertSetEqual(set(projects), set(["Foo", "Bar"]))
222
223
224def foo_registry():
225    reg = WidgetRegistry()
226    reg.register_widget(
227        WidgetDescription(
228            name="Foo",
229            id="foooo",
230            qualified_name="package.foo",
231            project_name="Foo"
232        )
233    )
234    reg.register_widget(
235        WidgetDescription(
236            name="Bar",
237            id="barrr",
238            qualified_name="frob.bar",
239            project_name="Bar",
240            replaces=["package.bar"]
241
242        )
243    )
244    return reg
245
246
247FOOBAR_v10 = """<?xml version="1.0" ?>
248<schema>
249    <widgets>
250        <widget caption="Foo" widgetName="foo" xPos="1" yPos="2"/>
251        <widget caption="Bar" widgetName="bar" xPos="2" yPos="3"/>
252    </widgets>
253    <channels>
254        <channel enabled="1" inWidgetCaption="Foo" outWidgetCaption="Bar"
255                 signals="[('foo', 'bar')]"/>
256        <channel enabled="0" inWidgetCaption="Foo" outWidgetCaption="Bar"
257                 signals="[('foo1', 'bar1')]"/>
258    </channels>
259    <settings settingsDictionary="{}"/>
260</schema>
261"""
262
263FOOBAR_v20 = """<?xml version="1.0" ?>
264<scheme title="FooBar" description="Foo to the bar" version="2.0">
265    <nodes>
266        <node id="0" title="Foo" position="1, 2" project_name="Foo"
267              qualified_name="package.foo" />
268        <node id="1" title="Bar" position="2, 3" project_name="Foo"
269              qualified_name="package.bar" />
270    </nodes>
271    <links>
272        <link enabled="true" id="0" sink_channel="bar" sink_node_id="1"
273              source_channel="foo" source_node_id="0" />
274        <link enabled="false" id="1" sink_channel="bar1" sink_node_id="1"
275              source_channel="foo1" source_node_id="0" />
276    </links>
277</scheme>
278"""
Note: See TracBrowser for help on using the repository browser.