1a5f9918aSopenharmony_ci
2a5f9918aSopenharmony_ciimport yaml, canonical
3a5f9918aSopenharmony_ciimport pprint
4a5f9918aSopenharmony_ci
5a5f9918aSopenharmony_cidef _convert_structure(loader):
6a5f9918aSopenharmony_ci    if loader.check_event(yaml.ScalarEvent):
7a5f9918aSopenharmony_ci        event = loader.get_event()
8a5f9918aSopenharmony_ci        if event.tag or event.anchor or event.value:
9a5f9918aSopenharmony_ci            return True
10a5f9918aSopenharmony_ci        else:
11a5f9918aSopenharmony_ci            return None
12a5f9918aSopenharmony_ci    elif loader.check_event(yaml.SequenceStartEvent):
13a5f9918aSopenharmony_ci        loader.get_event()
14a5f9918aSopenharmony_ci        sequence = []
15a5f9918aSopenharmony_ci        while not loader.check_event(yaml.SequenceEndEvent):
16a5f9918aSopenharmony_ci            sequence.append(_convert_structure(loader))
17a5f9918aSopenharmony_ci        loader.get_event()
18a5f9918aSopenharmony_ci        return sequence
19a5f9918aSopenharmony_ci    elif loader.check_event(yaml.MappingStartEvent):
20a5f9918aSopenharmony_ci        loader.get_event()
21a5f9918aSopenharmony_ci        mapping = []
22a5f9918aSopenharmony_ci        while not loader.check_event(yaml.MappingEndEvent):
23a5f9918aSopenharmony_ci            key = _convert_structure(loader)
24a5f9918aSopenharmony_ci            value = _convert_structure(loader)
25a5f9918aSopenharmony_ci            mapping.append((key, value))
26a5f9918aSopenharmony_ci        loader.get_event()
27a5f9918aSopenharmony_ci        return mapping
28a5f9918aSopenharmony_ci    elif loader.check_event(yaml.AliasEvent):
29a5f9918aSopenharmony_ci        loader.get_event()
30a5f9918aSopenharmony_ci        return '*'
31a5f9918aSopenharmony_ci    else:
32a5f9918aSopenharmony_ci        loader.get_event()
33a5f9918aSopenharmony_ci        return '?'
34a5f9918aSopenharmony_ci
35a5f9918aSopenharmony_cidef test_structure(data_filename, structure_filename, verbose=False):
36a5f9918aSopenharmony_ci    nodes1 = []
37a5f9918aSopenharmony_ci    with open(structure_filename, 'r') as file:
38a5f9918aSopenharmony_ci        nodes2 = eval(file.read())
39a5f9918aSopenharmony_ci    try:
40a5f9918aSopenharmony_ci        with open(data_filename, 'rb') as file:
41a5f9918aSopenharmony_ci            loader = yaml.Loader(file)
42a5f9918aSopenharmony_ci            while loader.check_event():
43a5f9918aSopenharmony_ci                if loader.check_event(
44a5f9918aSopenharmony_ci                    yaml.StreamStartEvent, yaml.StreamEndEvent,
45a5f9918aSopenharmony_ci                    yaml.DocumentStartEvent, yaml.DocumentEndEvent
46a5f9918aSopenharmony_ci                ):
47a5f9918aSopenharmony_ci                    loader.get_event()
48a5f9918aSopenharmony_ci                    continue
49a5f9918aSopenharmony_ci                nodes1.append(_convert_structure(loader))
50a5f9918aSopenharmony_ci        if len(nodes1) == 1:
51a5f9918aSopenharmony_ci            nodes1 = nodes1[0]
52a5f9918aSopenharmony_ci        assert nodes1 == nodes2, (nodes1, nodes2)
53a5f9918aSopenharmony_ci    finally:
54a5f9918aSopenharmony_ci        if verbose:
55a5f9918aSopenharmony_ci            print("NODES1:")
56a5f9918aSopenharmony_ci            pprint.pprint(nodes1)
57a5f9918aSopenharmony_ci            print("NODES2:")
58a5f9918aSopenharmony_ci            pprint.pprint(nodes2)
59a5f9918aSopenharmony_ci
60a5f9918aSopenharmony_citest_structure.unittest = ['.data', '.structure']
61a5f9918aSopenharmony_ci
62a5f9918aSopenharmony_cidef _compare_events(events1, events2, full=False):
63a5f9918aSopenharmony_ci    assert len(events1) == len(events2), (len(events1), len(events2))
64a5f9918aSopenharmony_ci    for event1, event2 in zip(events1, events2):
65a5f9918aSopenharmony_ci        assert event1.__class__ == event2.__class__, (event1, event2)
66a5f9918aSopenharmony_ci        if isinstance(event1, yaml.AliasEvent) and full:
67a5f9918aSopenharmony_ci            assert event1.anchor == event2.anchor, (event1, event2)
68a5f9918aSopenharmony_ci        if isinstance(event1, (yaml.ScalarEvent, yaml.CollectionStartEvent)):
69a5f9918aSopenharmony_ci            if (event1.tag not in [None, '!'] and event2.tag not in [None, '!']) or full:
70a5f9918aSopenharmony_ci                assert event1.tag == event2.tag, (event1, event2)
71a5f9918aSopenharmony_ci        if isinstance(event1, yaml.ScalarEvent):
72a5f9918aSopenharmony_ci            assert event1.value == event2.value, (event1, event2)
73a5f9918aSopenharmony_ci
74a5f9918aSopenharmony_cidef test_parser(data_filename, canonical_filename, verbose=False):
75a5f9918aSopenharmony_ci    events1 = None
76a5f9918aSopenharmony_ci    events2 = None
77a5f9918aSopenharmony_ci    try:
78a5f9918aSopenharmony_ci        with open(data_filename, 'rb') as file:
79a5f9918aSopenharmony_ci            events1 = list(yaml.parse(file))
80a5f9918aSopenharmony_ci        with open(canonical_filename, 'rb') as file:
81a5f9918aSopenharmony_ci            events2 = list(yaml.canonical_parse(file))
82a5f9918aSopenharmony_ci        _compare_events(events1, events2)
83a5f9918aSopenharmony_ci    finally:
84a5f9918aSopenharmony_ci        if verbose:
85a5f9918aSopenharmony_ci            print("EVENTS1:")
86a5f9918aSopenharmony_ci            pprint.pprint(events1)
87a5f9918aSopenharmony_ci            print("EVENTS2:")
88a5f9918aSopenharmony_ci            pprint.pprint(events2)
89a5f9918aSopenharmony_ci
90a5f9918aSopenharmony_citest_parser.unittest = ['.data', '.canonical']
91a5f9918aSopenharmony_ci
92a5f9918aSopenharmony_cidef test_parser_on_canonical(canonical_filename, verbose=False):
93a5f9918aSopenharmony_ci    events1 = None
94a5f9918aSopenharmony_ci    events2 = None
95a5f9918aSopenharmony_ci    try:
96a5f9918aSopenharmony_ci        with open(canonical_filename, 'rb') as file:
97a5f9918aSopenharmony_ci            events1 = list(yaml.parse(file))
98a5f9918aSopenharmony_ci        with open(canonical_filename, 'rb') as file:
99a5f9918aSopenharmony_ci            events2 = list(yaml.canonical_parse(file))
100a5f9918aSopenharmony_ci        _compare_events(events1, events2, full=True)
101a5f9918aSopenharmony_ci    finally:
102a5f9918aSopenharmony_ci        if verbose:
103a5f9918aSopenharmony_ci            print("EVENTS1:")
104a5f9918aSopenharmony_ci            pprint.pprint(events1)
105a5f9918aSopenharmony_ci            print("EVENTS2:")
106a5f9918aSopenharmony_ci            pprint.pprint(events2)
107a5f9918aSopenharmony_ci
108a5f9918aSopenharmony_citest_parser_on_canonical.unittest = ['.canonical']
109a5f9918aSopenharmony_ci
110a5f9918aSopenharmony_cidef _compare_nodes(node1, node2):
111a5f9918aSopenharmony_ci    assert node1.__class__ == node2.__class__, (node1, node2)
112a5f9918aSopenharmony_ci    assert node1.tag == node2.tag, (node1, node2)
113a5f9918aSopenharmony_ci    if isinstance(node1, yaml.ScalarNode):
114a5f9918aSopenharmony_ci        assert node1.value == node2.value, (node1, node2)
115a5f9918aSopenharmony_ci    else:
116a5f9918aSopenharmony_ci        assert len(node1.value) == len(node2.value), (node1, node2)
117a5f9918aSopenharmony_ci        for item1, item2 in zip(node1.value, node2.value):
118a5f9918aSopenharmony_ci            if not isinstance(item1, tuple):
119a5f9918aSopenharmony_ci                item1 = (item1,)
120a5f9918aSopenharmony_ci                item2 = (item2,)
121a5f9918aSopenharmony_ci            for subnode1, subnode2 in zip(item1, item2):
122a5f9918aSopenharmony_ci                _compare_nodes(subnode1, subnode2)
123a5f9918aSopenharmony_ci
124a5f9918aSopenharmony_cidef test_composer(data_filename, canonical_filename, verbose=False):
125a5f9918aSopenharmony_ci    nodes1 = None
126a5f9918aSopenharmony_ci    nodes2 = None
127a5f9918aSopenharmony_ci    try:
128a5f9918aSopenharmony_ci        with open(data_filename, 'rb') as file:
129a5f9918aSopenharmony_ci            nodes1 = list(yaml.compose_all(file))
130a5f9918aSopenharmony_ci        with open(canonical_filename, 'rb') as file:
131a5f9918aSopenharmony_ci            nodes2 = list(yaml.canonical_compose_all(file))
132a5f9918aSopenharmony_ci        assert len(nodes1) == len(nodes2), (len(nodes1), len(nodes2))
133a5f9918aSopenharmony_ci        for node1, node2 in zip(nodes1, nodes2):
134a5f9918aSopenharmony_ci            _compare_nodes(node1, node2)
135a5f9918aSopenharmony_ci    finally:
136a5f9918aSopenharmony_ci        if verbose:
137a5f9918aSopenharmony_ci            print("NODES1:")
138a5f9918aSopenharmony_ci            pprint.pprint(nodes1)
139a5f9918aSopenharmony_ci            print("NODES2:")
140a5f9918aSopenharmony_ci            pprint.pprint(nodes2)
141a5f9918aSopenharmony_ci
142a5f9918aSopenharmony_citest_composer.unittest = ['.data', '.canonical']
143a5f9918aSopenharmony_ci
144a5f9918aSopenharmony_cidef _make_loader():
145a5f9918aSopenharmony_ci    global MyLoader
146a5f9918aSopenharmony_ci
147a5f9918aSopenharmony_ci    class MyLoader(yaml.Loader):
148a5f9918aSopenharmony_ci        def construct_sequence(self, node):
149a5f9918aSopenharmony_ci            return tuple(yaml.Loader.construct_sequence(self, node))
150a5f9918aSopenharmony_ci        def construct_mapping(self, node):
151a5f9918aSopenharmony_ci            pairs = self.construct_pairs(node)
152a5f9918aSopenharmony_ci            pairs.sort(key=(lambda i: str(i)))
153a5f9918aSopenharmony_ci            return pairs
154a5f9918aSopenharmony_ci        def construct_undefined(self, node):
155a5f9918aSopenharmony_ci            return self.construct_scalar(node)
156a5f9918aSopenharmony_ci
157a5f9918aSopenharmony_ci    MyLoader.add_constructor('tag:yaml.org,2002:map', MyLoader.construct_mapping)
158a5f9918aSopenharmony_ci    MyLoader.add_constructor(None, MyLoader.construct_undefined)
159a5f9918aSopenharmony_ci
160a5f9918aSopenharmony_cidef _make_canonical_loader():
161a5f9918aSopenharmony_ci    global MyCanonicalLoader
162a5f9918aSopenharmony_ci
163a5f9918aSopenharmony_ci    class MyCanonicalLoader(yaml.CanonicalLoader):
164a5f9918aSopenharmony_ci        def construct_sequence(self, node):
165a5f9918aSopenharmony_ci            return tuple(yaml.CanonicalLoader.construct_sequence(self, node))
166a5f9918aSopenharmony_ci        def construct_mapping(self, node):
167a5f9918aSopenharmony_ci            pairs = self.construct_pairs(node)
168a5f9918aSopenharmony_ci            pairs.sort(key=(lambda i: str(i)))
169a5f9918aSopenharmony_ci            return pairs
170a5f9918aSopenharmony_ci        def construct_undefined(self, node):
171a5f9918aSopenharmony_ci            return self.construct_scalar(node)
172a5f9918aSopenharmony_ci
173a5f9918aSopenharmony_ci    MyCanonicalLoader.add_constructor('tag:yaml.org,2002:map', MyCanonicalLoader.construct_mapping)
174a5f9918aSopenharmony_ci    MyCanonicalLoader.add_constructor(None, MyCanonicalLoader.construct_undefined)
175a5f9918aSopenharmony_ci
176a5f9918aSopenharmony_cidef test_constructor(data_filename, canonical_filename, verbose=False):
177a5f9918aSopenharmony_ci    _make_loader()
178a5f9918aSopenharmony_ci    _make_canonical_loader()
179a5f9918aSopenharmony_ci    native1 = None
180a5f9918aSopenharmony_ci    native2 = None
181a5f9918aSopenharmony_ci    try:
182a5f9918aSopenharmony_ci        with open(data_filename, 'rb') as file:
183a5f9918aSopenharmony_ci            native1 = list(yaml.load_all(file, Loader=MyLoader))
184a5f9918aSopenharmony_ci        with open(canonical_filename, 'rb') as file:
185a5f9918aSopenharmony_ci            native2 = list(yaml.load_all(file, Loader=MyCanonicalLoader))
186a5f9918aSopenharmony_ci        assert native1 == native2, (native1, native2)
187a5f9918aSopenharmony_ci    finally:
188a5f9918aSopenharmony_ci        if verbose:
189a5f9918aSopenharmony_ci            print("NATIVE1:")
190a5f9918aSopenharmony_ci            pprint.pprint(native1)
191a5f9918aSopenharmony_ci            print("NATIVE2:")
192a5f9918aSopenharmony_ci            pprint.pprint(native2)
193a5f9918aSopenharmony_ci
194a5f9918aSopenharmony_citest_constructor.unittest = ['.data', '.canonical']
195a5f9918aSopenharmony_ci
196a5f9918aSopenharmony_ciif __name__ == '__main__':
197a5f9918aSopenharmony_ci    import test_appliance
198a5f9918aSopenharmony_ci    test_appliance.run(globals())
199a5f9918aSopenharmony_ci
200