Ignore:
Timestamp:
09/03/13 14:53:58 (8 months ago)
Author:
Ales Erjavec <ales.erjavec@…>
Branch:
default
Message:

Refactored scheme parsing.

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Orange/OrangeCanvas/scheme/tests/test_readwrite.py

    r11391 r11683  
    11"""Test read write 
    22""" 
     3from xml.etree import ElementTree as ET 
     4from StringIO import StringIO 
     5 
    36from ...gui import test 
    4 from ...registry import global_registry 
     7from ...registry import global_registry, WidgetRegistry, WidgetDescription 
    58 
    69from .. import Scheme, SchemeNode, SchemeLink, \ 
     
    811 
    912from .. import readwrite 
    10 from ..readwrite import scheme_to_ows_stream, parse_scheme 
     13from ..readwrite import scheme_to_ows_stream, parse_scheme, scheme_load 
    1114 
    1215 
    1316class TestReadWrite(test.QAppTestCase): 
    1417    def test_io(self): 
    15         from StringIO import StringIO 
    1618        reg = global_registry() 
    1719 
     
    7577                self.assertEqual(annot1.end_pos, annot2.end_pos) 
    7678 
     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 
    77141    def test_safe_evals(self): 
    78142        s = readwrite.string_eval(r"'\x00\xff'") 
     
    113177        with self.assertRaises(TypeError): 
    114178            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 TracChangeset for help on using the changeset viewer.