source: trunk/yaml/tests/TestPushDumper.py @ 87

Revision 87, 3.1 KB checked in by tim, 9 years ago (diff)

moved tests into a module under yaml and added a testrunner script courtesy of matt goodall

  • Property svn:executable set to *
Line 
1import YamlTest
2from here import *
3from test import assertEquals
4from types import DictType, ListType, TupleType, InstanceType
5
6"""
7This is experimental code.  It generates simulated events
8for a pull-based YAML parser.
9"""
10
11class MockEmitter:
12    """
13    A pushed-based emitter may be more awkward to write,
14    because you have to keep track of more state.
15    """
16    def __init__(self):
17        self.events = []
18
19    def append(self, *event):
20        self.events.append(event)       
21
22    def pushScalar(self, data):
23        self.append('getType', 'scalar')
24        self.append('getScalar', data)
25
26    def appendType(self, typ):
27        self.append('getType', typ)
28
29    def startSeq(self):
30        self.appendType('seq')
31       
32    def endSeq(self):
33        self.appendType(None)
34
35    def startMap(self):
36        self.appendType('map')
37       
38    def endMap(self):
39        self.appendType(None)
40
41class Dumper:
42    def __init__(self, emitter):
43        self.emitter = emitter
44
45    def dump(self, data):
46        if type(data) in (ListType, TupleType):
47            return self.dumpList(data)
48        elif type(data) is DictType:
49            return self.dumpDict(data)
50        else:
51            self.emitter.pushScalar(data)
52
53    def dumpList(self, data):
54        self.emitter.startSeq()
55        for item in data:
56            self.dump(item)
57        self.emitter.endSeq()
58
59    def dumpDict(self, data):
60        self.emitter.startMap()
61        keys = data.keys()
62        keys.sort() # XXX - only for now
63        for key in keys:
64            value = data[key]
65            self.dump(key)
66            self.dump(value)
67        self.emitter.endMap()
68
69def mockEvents(data):
70    emitter = MockEmitter()
71    dumper = Dumper(emitter)
72    dumper.dump(data)
73    return emitter.events
74
75class Test(YamlTest.YamlTest):
76
77    def testScalar(self):
78        assertEquals(mockEvents('foobar'), self.scalar('foobar'))
79
80    def scalar(self, data):
81        return [ 
82            ('getType', 'scalar'),
83            ('getScalar', data)
84        ]
85
86    def list123(self):
87        (result) = (
88            [('getType', 'seq' )] +
89            self.scalar(1) +
90            self.scalar(2) +
91            self.scalar(3) +
92            [( 'getType', None )])
93        return result
94
95    def testList(self):
96        assertEquals(mockEvents([1,2,3]), self.list123())
97
98    def dictFoobar(self):
99        (result) = (
100            [('getType', 'map')] +
101            self.scalar('bar') +
102            self.scalar(2) + 
103            self.scalar('foo') +
104            self.scalar(1) +
105            [( 'getType', None)])
106        return result
107
108    def testDict(self):
109        events = mockEvents({'foo': 1, 'bar': 2})
110        assertEquals(events, self.dictFoobar())
111
112    def testListDict(self):
113        events = mockEvents([ [1,2,3], {'foo': 1, 'bar': 2} ])
114        self.assertEquals(
115            events,
116            [('getType', 'seq' )] +
117            self.list123() +
118            self.dictFoobar() + 
119            [('getType', None)])           
120
121if __name__ == '__main__':
122    import unittest
123    unittest.main()
Note: See TracBrowser for help on using the repository browser.