summaryrefslogtreecommitdiff
path: root/tests/test_structure.py
blob: 754bc5ea609ac4d8d2f54da03d51183e3c246a8a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83

import test_appliance

from yaml.reader import Reader
from yaml.scanner import Scanner
from yaml.parser import *

class TestStructure(test_appliance.TestAppliance):

    def _testStructure(self, test_name, data_filename, structure_filename):
        node1 = None
        node2 = eval(file(structure_filename, 'rb').read())
        try:
            parser = Parser(Scanner(Reader(file(data_filename, 'rb'))))
            node1 = parser.parse()
            node1 = [self._convert(n) for n in node1]
            if len(node1) == 1:
                node1 = node1[0]
            self.failUnlessEqual(node1, node2)
        except:
            print
            print "DATA:"
            print file(data_filename, 'rb').read()
            print "NODE1:", node1
            print "NODE2:", node2
            raise

    def _convert(self, node):
        if isinstance(node, ScalarNode):
            return True
        elif isinstance(node, SequenceNode):
            sequence = []
            for item in node.value:
                sequence.append(self._convert(item))
            return sequence
        elif isinstance(node, MappingNode):
            mapping = []
            for key, value in node.value:
                mapping.append((self._convert(key), self._convert(value)))
            return mapping
        elif isinstance(node, AliasNode):
            return '*'
        else:
            return node

TestStructure.add_tests('testStructure', '.data', '.structure')

class TestParser(test_appliance.TestAppliance):

    def _testParser(self, test_name, data_filename, canonical_filename):
        documents1 = None
        documents2 = None
        try:
            parser = Parser(Scanner(Reader(file(data_filename, 'rb'))))
            documents1 = parser.parse()
            canonical = test_appliance.CanonicalParser(canonical_filename, file(canonical_filename, 'rb').read())
            documents2 = canonical.parse()
            self._compare(documents1, documents2)
        except:
            print
            print "DATA1:"
            print file(data_filename, 'rb').read()
            print "DATA2:"
            print file(canonical_filename, 'rb').read()
            print "DOCUMENTS1:", documents1
            print "DOCUMENTS2:", documents2
            raise

    def _compare(self, value1, value2):
        if value1 is None and hasattr(value2, 'tag') and value2.tag == 'tag:yaml.org,2002:null':
            return
        self.failUnlessEqual(type(value1), type(value2))
        if isinstance(value1, list) or isinstance(value1, tuple):
            self.failUnlessEqual(len(value1), len(value2))
            for item1, item2 in zip(value1, value2):
                self._compare(item1, item2)
        else:
            self.failUnlessEqual(value1.__class__.__name__, value2.__class__.__name__)
            if isinstance(value1, SequenceNode) or isinstance(value1, MappingNode):
                self._compare(value1.value, value2.value)

TestParser.add_tests('testParser', '.data', '.canonical')