source: trunk/tests/test_syck.py @ 4

Revision 4, 6.8 KB checked in by xi, 9 years ago (diff)

Add the module _syck and test suite.

Line 
1
2import unittest
3import _syck, syck
4import StringIO
5
6EXAMPLE = """
7-
8  avg: 0.278
9  hr: 65
10  name: Mark McGwire
11-
12  avg: 0.288
13  hr: 63
14  name: Sammy Sosa
15"""
16
17INVALID = """
18 - invalid
19- document
20""", 2, 0
21
22COMPARE1 = """
23one: foo
24two: bar
25three: baz
26""", {
27    'one': 'foo',
28    'two': 'bar',
29    'three': 'baz',
30}
31
32COMPARE2 = """
33- Mark McGwire
34- Sammy Sosa
35- Ken Griffey
36""", [
37    'Mark McGwire',
38    'Sammy Sosa',
39    'Ken Griffey',
40]
41
42COMPARE3 = """
43american:
44  - Boston Red Sox
45  - Detroit Tigers
46  - New York Yankees
47national:
48  - New York Mets
49  - Chicago Cubs
50  - Atlanta Braves
51""", {
52    'american': [
53        'Boston Red Sox',
54        'Detroit Tigers',
55        'New York Yankees',
56    ],
57    'national': [
58        'New York Mets',
59        'Chicago Cubs',
60        'Atlanta Braves',
61    ],
62}
63
64DOCUMENTS0 = ""
65
66DOCUMENTS1 = """
67---
68Time: 2001-11-23 15:01:42 -05:00
69User: ed
70Warning: >
71  This is an error message
72  for the log file
73"""
74
75DOCUMENTS2 = """
76---
77Time: 2001-11-23 15:01:42 -05:00
78User: ed
79Warning: >
80  This is an error message
81  for the log file
82---
83Time: 2001-11-23 15:02:31 -05:00
84User: ed
85Warning: >
86  A slightly different error
87  message.
88"""
89
90DOCUMENTS3 = """
91---
92Time: 2001-11-23 15:01:42 -05:00
93User: ed
94Warning: >
95  This is an error message
96  for the log file
97---
98Time: 2001-11-23 15:02:31 -05:00
99User: ed
100Warning: >
101  A slightly different error
102  message.
103---
104Date: 2001-11-23 15:03:17 -05:00
105User: ed
106Fatal: >
107  Unknown variable "bar"
108Stack:
109  - file: TopClass.py
110    line: 23
111    code: |
112      x = MoreObject("345\\n")
113  - file: MoreClass.py
114    line: 58
115    code: |-
116      foo = bar
117"""
118
119IMPLICIT_TYPING = """
120- 'foo'
121- >-
122  bar
123- baz
124- 123
125- 3.14
126- true
127- false
128- []
129- {}
130""", [
131    ('str', True),
132    ('str', True),
133    ('str', False),
134    ('int', False),
135    ('float#fix', False),
136    ('bool#yes', False),
137    ('bool#no', False),
138    (None, False),
139    (None, False),
140]
141
142EXPLICIT_TYPING = """
143- !int '123'
144- !yamltype 'foo'
145- !python/type 'bar'
146- !domain.tld,2002/type 'baz'
147- !!private 'private'
148- !map {}
149- !seq []
150""", [
151    'tag:yaml.org,2002:int',
152    'tag:yaml.org,2002:yamltype',
153    'tag:python.yaml.org,2002:type',
154    'tag:domain.tld,2002:type',
155    'x-private:private',
156    'tag:yaml.org,2002:map',
157    'tag:yaml.org,2002:seq',
158]
159
160class TestTypes(unittest.TestCase):
161
162    def testParserType(self):
163        parser = _syck.Parser(EXAMPLE)
164        self.assertEqual(type(parser), _syck.ParserType)
165        parser.close()
166
167    def testNodeType(self):
168        parser = _syck.Parser(EXAMPLE)
169        document = parser.parse()
170        self.assertEqual(type(document), _syck.NodeType)
171        parser.close()
172
173    def testNodeType2(self):
174        self.assertRaises(TypeError, (lambda: _syck.Node()))
175
176class TestErrors(unittest.TestCase):
177
178    def testError(self):
179        parser = _syck.Parser(INVALID[0])
180        self.assertRaises(_syck.error, (lambda: parser.parse()))
181        parser.close()
182
183    def testErrorLocation(self):
184        source, line, column = INVALID
185        parser = _syck.Parser(source)
186        try:
187            parser.parse()
188            raise Exception
189        except _syck.error, e:
190            self.assertEqual(e.args[1], line)
191            self.assertEqual(e.args[2], column)
192
193class TestValuesAndSources(unittest.TestCase):
194
195    def testValues1(self):
196        self._testValues(COMPARE1)
197
198    def testValues2(self):
199        self._testValues(COMPARE2)
200
201    def testValues3(self):
202        self._testValues(COMPARE3)
203
204    def testFileValues1(self):
205        self._testFileValues(COMPARE1)
206
207    def testFileValues2(self):
208        self._testFileValues(COMPARE2)
209
210    def testFileValues3(self):
211        self._testFileValues(COMPARE3)
212
213    def testNonsense(self):
214        parser = _syck.Parser(None)
215        self.assertRaises(AttributeError, (lambda: parser.parse()))
216        parser.close()
217
218    def _testValues(self, (source, structure)):
219        parser = _syck.Parser(source)
220        document = parser.parse()
221        self.assertEqualStructure(document, structure)
222        parser.close()
223
224    def _testFileValues(self, (source, structure)):
225        parser = _syck.Parser(StringIO.StringIO(source))
226        document = parser.parse()
227        self.assertEqualStructure(document, structure)
228        parser.close()
229
230    def assertEqualStructure(self, node, structure):
231        if node.kind == 'scalar':
232            self.assertEqual(type(structure), str)
233            self.assertEqual(node.value, structure)
234        elif node.kind == 'seq':
235            self.assertEqual(type(structure), list)
236            self.assertEqual(len(node.value), len(structure))
237            for i, item in enumerate(node.value):
238                self.assertEqualStructure(item, structure[i])
239        elif node.kind == 'map':
240            self.assertEqual(type(structure), dict)
241            self.assertEqual(len(node.value), len(structure))
242            for key in node.value:
243                self.assert_(key.value in structure)
244                self.assertEqualStructure(node.value[key], structure[key.value])
245
246class TestDocuments(unittest.TestCase):
247
248    def testDocuments0(self):
249        self._testDocuments(DOCUMENTS0, 0)
250
251    def testDocuments1(self):
252        self._testDocuments(DOCUMENTS1, 1)
253
254    def testDocuments2(self):
255        self._testDocuments(DOCUMENTS2, 2)
256
257    def testDocuments3(self):
258        self._testDocuments(DOCUMENTS3, 3)
259
260    def _testDocuments(self, source, length):
261        parser = _syck.Parser(source)
262        documents = parser.parse_documents()
263        self.assertEqual(len(documents), length)
264        parser.close()
265        parser = _syck.Parser(source)
266        for k in range(length):
267            document = parser.parse()
268            self.assert_(document)
269        self.assertEqual(parser.parse(), None)
270        parser.close()
271
272class TestImplicitTyping(unittest.TestCase):
273
274    def testImplicitAndExpansionTyping(self):
275        self._testTyping(True, True)
276
277    def testImplicitTyping(self):
278        self._testTyping(True, False)
279
280    def testExpansionTyping(self):
281        self._testTyping(False, True)
282
283    def testNoTyping(self):
284        self._testTyping(False, False)
285
286    def _testTyping(self, implicit_typing, taguri_expansion):
287        parser = _syck.Parser(IMPLICIT_TYPING[0], implicit_typing, taguri_expansion)
288        for node, (type_id, explicit) in zip(parser.parse().value, IMPLICIT_TYPING[1]):
289            if type_id is not None and taguri_expansion:
290                type_id = 'tag:yaml.org,2002:%s' % type_id
291            if implicit_typing or explicit:
292                self.assertEqual(node.type_id, type_id)
293            else:
294                self.assertEqual(node.type_id, None)
295
296class TestExplicitTyping(unittest.TestCase):
297
298    def testExplicitTyping(self):
299        parser = _syck.Parser(EXPLICIT_TYPING[0])
300        for node, type_id in zip(parser.parse().value, EXPLICIT_TYPING[1]):
301            self.assertEqual(node.type_id, type_id)
302
303def main(module='__main__'):
304    unittest.main(module)
305
306if __name__ == '__main__':
307    main()
308
Note: See TracBrowser for help on using the repository browser.