source: branches/pyyaml3000/tests/test_structure.py @ 51

Revision 51, 4.9 KB checked in by xi, 9 years ago (diff)

Parser is done. Add iterator interfaces for Scanner and Parser.

RevLine 
[44]1
2import test_appliance
3
[46]4from yaml.reader import Reader
5from yaml.scanner import Scanner
[44]6from yaml.parser import *
7
8class TestStructure(test_appliance.TestAppliance):
9
10    def _testStructure(self, test_name, data_filename, structure_filename):
11        node1 = None
12        node2 = eval(file(structure_filename, 'rb').read())
13        try:
[46]14            parser = Parser(Scanner(Reader(file(data_filename, 'rb'))))
[51]15            node1 = []
16            while not parser.check(StreamEndEvent):
17                node1.append(self._convert(parser))
18            parser.get()
[44]19            if len(node1) == 1:
20                node1 = node1[0]
21            self.failUnlessEqual(node1, node2)
22        except:
23            print
24            print "DATA:"
25            print file(data_filename, 'rb').read()
26            print "NODE1:", node1
27            print "NODE2:", node2
28            raise
29
[51]30    def _convert(self, parser):
31        if parser.check(ScalarEvent):
32            event = parser.get()
33            if event.tag or event.anchor or event.value:
34                return True
35            else:
36                return None
37        elif parser.check(SequenceEvent):
38            parser.get()
[44]39            sequence = []
[51]40            while not parser.check(CollectionEndEvent):
41                sequence.append(self._convert(parser))
42            parser.get()
[44]43            return sequence
[51]44        elif parser.check(MappingEvent):
45            parser.get()
[44]46            mapping = []
[51]47            while not parser.check(CollectionEndEvent):
48                key = self._convert(parser)
49                value = self._convert(parser)
50                mapping.append((key, value))
51            parser.get()
[44]52            return mapping
[51]53        elif parser.check(AliasEvent):
54            parser.get()
[44]55            return '*'
56        else:
[51]57            parser.get()
58            return '?'
[44]59
60TestStructure.add_tests('testStructure', '.data', '.structure')
61
62class TestParser(test_appliance.TestAppliance):
63
64    def _testParser(self, test_name, data_filename, canonical_filename):
[51]65        events1 = None
66        events2 = None
[44]67        try:
[46]68            parser = Parser(Scanner(Reader(file(data_filename, 'rb'))))
[51]69            events1 = list(iter(parser))
70            canonical = test_appliance.CanonicalParser(file(canonical_filename, 'rb').read())
71            events2 = canonical.parse()
72            self._compare(events1, events2)
[44]73        except:
74            print
75            print "DATA1:"
76            print file(data_filename, 'rb').read()
77            print "DATA2:"
78            print file(canonical_filename, 'rb').read()
[51]79            print "EVENTS1:", events1
80            print "EVENTS2:", events2
[44]81            raise
82
[51]83    def _compare(self, events1, events2):
84        self.failUnlessEqual(len(events1), len(events2))
85        for event1, event2 in zip(events1, events2):
86            self.failUnlessEqual(event1.__class__, event2.__class__)
87            if isinstance(event1, AliasEvent):
88                #self.failUnlessEqual(event1.name, event2.name)
89                pass
90            elif isinstance(event1, ScalarEvent):
91                #self.failUnlessEqual(event1.anchor, event2.anchor)
92                #self.failUnlessEqual(event1.tag, event2.tag)
93                self.failUnlessEqual(event1.value, event2.value)
94            if isinstance(event1, CollectionEvent):
95                #self.failUnlessEqual(event1.anchor, event2.anchor)
96                #self.failUnlessEqual(event1.tag, event2.tag)
97                pass
[44]98
[51]99
[44]100TestParser.add_tests('testParser', '.data', '.canonical')
101
[48]102class TestParserOnCanonical(test_appliance.TestAppliance):
103
104    def _testParserOnCanonical(self, test_name, canonical_filename):
[51]105        events1 = None
106        events2 = None
[48]107        try:
108            parser = Parser(Scanner(Reader(file(canonical_filename, 'rb'))))
[51]109            events1 = list(iter(parser))
110            canonical = test_appliance.CanonicalParser(file(canonical_filename, 'rb').read())
111            events2 = canonical.parse()
112            self._compare(events1, events2)
[48]113        except:
114            print
115            print "DATA:"
116            print file(canonical_filename, 'rb').read()
[51]117            print "EVENTS1:", events1
118            print "EVENTS2:", events2
[48]119            raise
120
[51]121    def _compare(self, events1, events2):
122        self.failUnlessEqual(len(events1), len(events2))
123        for event1, event2 in zip(events1, events2):
124            self.failUnlessEqual(event1.__class__, event2.__class__)
125            if isinstance(event1, AliasEvent):
126                self.failUnlessEqual(event1.name, event2.name)
127            elif isinstance(event1, ScalarEvent):
128                self.failUnlessEqual(event1.anchor, event2.anchor)
129                self.failUnlessEqual(event1.tag, event2.tag)
130                self.failUnlessEqual(event1.value, event2.value)
131            if isinstance(event1, CollectionEvent):
132                self.failUnlessEqual(event1.anchor, event2.anchor)
133                self.failUnlessEqual(event1.tag, event2.tag)
[48]134
135TestParserOnCanonical.add_tests('testParserOnCanonical', '.canonical')
136
Note: See TracBrowser for help on using the repository browser.