source: pyyaml/trunk/tests/test_emitter.py @ 312

Revision 312, 6.3 KB checked in by xi, 6 years ago (diff)

Fixed test errors for LibYAML bindings; added a test on emitting nodes in all possible styles.

Line 
1
2import test_appliance, sys, StringIO
3
4from yaml import *
5import yaml
6
7class TestEmitter(test_appliance.TestAppliance):
8
9    def _testEmitterOnData(self, test_name, canonical_filename, data_filename):
10        self._testEmitter(test_name, data_filename)
11
12    def _testEmitterOnCanonicalNormally(self, test_name, canonical_filename):
13        self._testEmitter(test_name, canonical_filename, False)
14
15    def _testEmitterOnCanonicalCanonically(self, test_name, canonical_filename):
16        self._testEmitter(test_name, canonical_filename, True)
17
18    def _testEmitter(self, test_name, filename, canonical=None):
19        events = list(parse(file(filename, 'rb')))
20        #self._dump(filename, events, canonical)
21        stream = StringIO.StringIO()
22        emit(events, stream, canonical=canonical)
23        data = stream.getvalue()
24        new_events = list(parse(data))
25        for event, new_event in zip(events, new_events):
26            self.failUnlessEqual(event.__class__, new_event.__class__)
27            if isinstance(event, NodeEvent):
28                self.failUnlessEqual(event.anchor, new_event.anchor)
29            if isinstance(event, CollectionStartEvent):
30                self.failUnlessEqual(event.tag, new_event.tag)
31            if isinstance(event, ScalarEvent):
32                #self.failUnlessEqual(event.implicit, new_event.implicit)
33                if True not in event.implicit+new_event.implicit:
34                    self.failUnlessEqual(event.tag, new_event.tag)
35                self.failUnlessEqual(event.value, new_event.value)
36
37    def _testEmitterStyles(self, test_name, canonical_filename, data_filename):
38        for filename in [canonical_filename, data_filename]:
39            events = list(parse(file(filename, 'rb')))
40            for flow_style in [False, True]:
41                for style in ['|', '>', '"', '\'', '']:
42                    styled_events = []
43                    for event in events:
44                        if isinstance(event, ScalarEvent):
45                            event = ScalarEvent(event.anchor, event.tag,
46                                    event.implicit, event.value, style=style)
47                        elif isinstance(event, SequenceStartEvent):
48                            event = SequenceStartEvent(event.anchor, event.tag,
49                                    event.implicit, flow_style=flow_style)
50                        elif isinstance(event, MappingStartEvent):
51                            event = MappingStartEvent(event.anchor, event.tag,
52                                    event.implicit, flow_style=flow_style)
53                        styled_events.append(event)
54                    stream = StringIO.StringIO()
55                    emit(styled_events, stream)
56                    data = stream.getvalue()
57                    #print data
58                    new_events = list(parse(data))
59                    for event, new_event in zip(events, new_events):
60                        self.failUnlessEqual(event.__class__, new_event.__class__)
61                        if isinstance(event, NodeEvent):
62                            self.failUnlessEqual(event.anchor, new_event.anchor)
63                        if isinstance(event, CollectionStartEvent):
64                            self.failUnlessEqual(event.tag, new_event.tag)
65                        if isinstance(event, ScalarEvent):
66                            #self.failUnlessEqual(event.implicit, new_event.implicit)
67                            if True not in event.implicit+new_event.implicit:
68                                self.failUnlessEqual(event.tag, new_event.tag)
69                            self.failUnlessEqual(event.value, new_event.value)
70
71
72    def _dump(self, filename, events, canonical):
73        print "="*30
74        print "ORIGINAL DOCUMENT:"
75        print file(filename, 'rb').read()
76        print '-'*30
77        print "EMITTED DOCUMENT:"
78        emit(events, sys.stdout, canonical=canonical)
79       
80TestEmitter.add_tests('testEmitterOnData', '.canonical', '.data')
81TestEmitter.add_tests('testEmitterOnCanonicalNormally', '.canonical')
82TestEmitter.add_tests('testEmitterOnCanonicalCanonically', '.canonical')
83TestEmitter.add_tests('testEmitterStyles', '.canonical', '.data')
84
85class EventsLoader(Loader):
86
87    def construct_event(self, node):
88        if isinstance(node, ScalarNode):
89            mapping = {}
90        else:
91            mapping = self.construct_mapping(node)
92        class_name = str(node.tag[1:])+'Event'
93        if class_name in ['AliasEvent', 'ScalarEvent', 'SequenceStartEvent', 'MappingStartEvent']:
94            mapping.setdefault('anchor', None)
95        if class_name in ['ScalarEvent', 'SequenceStartEvent', 'MappingStartEvent']:
96            mapping.setdefault('tag', None)
97        if class_name in ['SequenceStartEvent', 'MappingStartEvent']:
98            mapping.setdefault('implicit', True)
99        if class_name == 'ScalarEvent':
100            mapping.setdefault('implicit', (False, True))
101            mapping.setdefault('value', '')
102        value = getattr(yaml, class_name)(**mapping)
103        return value
104
105EventsLoader.add_constructor(None, EventsLoader.construct_event)
106
107class TestEmitterEvents(test_appliance.TestAppliance):
108
109    def _testEmitterEvents(self, test_name, events_filename):
110        events = list(load(file(events_filename, 'rb'), Loader=EventsLoader))
111        #self._dump(events_filename, events)
112        stream = StringIO.StringIO()
113        emit(events, stream)
114        data = stream.getvalue()
115        new_events = list(parse(data))
116        self.failUnlessEqual(len(events), len(new_events))
117        for event, new_event in zip(events, new_events):
118            self.failUnlessEqual(event.__class__, new_event.__class__)
119            if isinstance(event, NodeEvent):
120                self.failUnlessEqual(event.anchor, new_event.anchor)
121            if isinstance(event, CollectionStartEvent):
122                self.failUnlessEqual(event.tag, new_event.tag)
123            if isinstance(event, ScalarEvent):
124                self.failUnless(event.implicit == new_event.implicit
125                        or event.tag == new_event.tag)
126                self.failUnlessEqual(event.value, new_event.value)
127
128    def _dump(self, events_filename, events):
129        print "="*30
130        print "EVENTS:"
131        print file(events_filename, 'rb').read()
132        print '-'*30
133        print "OUTPUT:"
134        emit(events, sys.stdout)
135       
136TestEmitterEvents.add_tests('testEmitterEvents', '.events')
137
Note: See TracBrowser for help on using the repository browser.