1a5f9918aSopenharmony_ci
2a5f9918aSopenharmony_ciimport yaml._yaml, yaml
3a5f9918aSopenharmony_ciimport types, pprint, tempfile, sys, os
4a5f9918aSopenharmony_ci
5a5f9918aSopenharmony_ciyaml.PyBaseLoader = yaml.BaseLoader
6a5f9918aSopenharmony_ciyaml.PySafeLoader = yaml.SafeLoader
7a5f9918aSopenharmony_ciyaml.PyLoader = yaml.Loader
8a5f9918aSopenharmony_ciyaml.PyBaseDumper = yaml.BaseDumper
9a5f9918aSopenharmony_ciyaml.PySafeDumper = yaml.SafeDumper
10a5f9918aSopenharmony_ciyaml.PyDumper = yaml.Dumper
11a5f9918aSopenharmony_ci
12a5f9918aSopenharmony_ciold_scan = yaml.scan
13a5f9918aSopenharmony_cidef new_scan(stream, Loader=yaml.CLoader):
14a5f9918aSopenharmony_ci    return old_scan(stream, Loader)
15a5f9918aSopenharmony_ci
16a5f9918aSopenharmony_ciold_parse = yaml.parse
17a5f9918aSopenharmony_cidef new_parse(stream, Loader=yaml.CLoader):
18a5f9918aSopenharmony_ci    return old_parse(stream, Loader)
19a5f9918aSopenharmony_ci
20a5f9918aSopenharmony_ciold_compose = yaml.compose
21a5f9918aSopenharmony_cidef new_compose(stream, Loader=yaml.CLoader):
22a5f9918aSopenharmony_ci    return old_compose(stream, Loader)
23a5f9918aSopenharmony_ci
24a5f9918aSopenharmony_ciold_compose_all = yaml.compose_all
25a5f9918aSopenharmony_cidef new_compose_all(stream, Loader=yaml.CLoader):
26a5f9918aSopenharmony_ci    return old_compose_all(stream, Loader)
27a5f9918aSopenharmony_ci
28a5f9918aSopenharmony_ciold_load = yaml.load
29a5f9918aSopenharmony_cidef new_load(stream, Loader=yaml.CLoader):
30a5f9918aSopenharmony_ci    return old_load(stream, Loader)
31a5f9918aSopenharmony_ci
32a5f9918aSopenharmony_ciold_load_all = yaml.load_all
33a5f9918aSopenharmony_cidef new_load_all(stream, Loader=yaml.CLoader):
34a5f9918aSopenharmony_ci    return old_load_all(stream, Loader)
35a5f9918aSopenharmony_ci
36a5f9918aSopenharmony_ciold_safe_load = yaml.safe_load
37a5f9918aSopenharmony_cidef new_safe_load(stream):
38a5f9918aSopenharmony_ci    return old_load(stream, yaml.CSafeLoader)
39a5f9918aSopenharmony_ci
40a5f9918aSopenharmony_ciold_safe_load_all = yaml.safe_load_all
41a5f9918aSopenharmony_cidef new_safe_load_all(stream):
42a5f9918aSopenharmony_ci    return old_load_all(stream, yaml.CSafeLoader)
43a5f9918aSopenharmony_ci
44a5f9918aSopenharmony_ciold_emit = yaml.emit
45a5f9918aSopenharmony_cidef new_emit(events, stream=None, Dumper=yaml.CDumper, **kwds):
46a5f9918aSopenharmony_ci    return old_emit(events, stream, Dumper, **kwds)
47a5f9918aSopenharmony_ci
48a5f9918aSopenharmony_ciold_serialize = yaml.serialize
49a5f9918aSopenharmony_cidef new_serialize(node, stream, Dumper=yaml.CDumper, **kwds):
50a5f9918aSopenharmony_ci    return old_serialize(node, stream, Dumper, **kwds)
51a5f9918aSopenharmony_ci
52a5f9918aSopenharmony_ciold_serialize_all = yaml.serialize_all
53a5f9918aSopenharmony_cidef new_serialize_all(nodes, stream=None, Dumper=yaml.CDumper, **kwds):
54a5f9918aSopenharmony_ci    return old_serialize_all(nodes, stream, Dumper, **kwds)
55a5f9918aSopenharmony_ci
56a5f9918aSopenharmony_ciold_dump = yaml.dump
57a5f9918aSopenharmony_cidef new_dump(data, stream=None, Dumper=yaml.CDumper, **kwds):
58a5f9918aSopenharmony_ci    return old_dump(data, stream, Dumper, **kwds)
59a5f9918aSopenharmony_ci
60a5f9918aSopenharmony_ciold_dump_all = yaml.dump_all
61a5f9918aSopenharmony_cidef new_dump_all(documents, stream=None, Dumper=yaml.CDumper, **kwds):
62a5f9918aSopenharmony_ci    return old_dump_all(documents, stream, Dumper, **kwds)
63a5f9918aSopenharmony_ci
64a5f9918aSopenharmony_ciold_safe_dump = yaml.safe_dump
65a5f9918aSopenharmony_cidef new_safe_dump(data, stream=None, **kwds):
66a5f9918aSopenharmony_ci    return old_dump(data, stream, yaml.CSafeDumper, **kwds)
67a5f9918aSopenharmony_ci
68a5f9918aSopenharmony_ciold_safe_dump_all = yaml.safe_dump_all
69a5f9918aSopenharmony_cidef new_safe_dump_all(documents, stream=None, **kwds):
70a5f9918aSopenharmony_ci    return old_dump_all(documents, stream, yaml.CSafeDumper, **kwds)
71a5f9918aSopenharmony_ci
72a5f9918aSopenharmony_cidef _set_up():
73a5f9918aSopenharmony_ci    yaml.BaseLoader = yaml.CBaseLoader
74a5f9918aSopenharmony_ci    yaml.SafeLoader = yaml.CSafeLoader
75a5f9918aSopenharmony_ci    yaml.Loader = yaml.CLoader
76a5f9918aSopenharmony_ci    yaml.BaseDumper = yaml.CBaseDumper
77a5f9918aSopenharmony_ci    yaml.SafeDumper = yaml.CSafeDumper
78a5f9918aSopenharmony_ci    yaml.Dumper = yaml.CDumper
79a5f9918aSopenharmony_ci    yaml.scan = new_scan
80a5f9918aSopenharmony_ci    yaml.parse = new_parse
81a5f9918aSopenharmony_ci    yaml.compose = new_compose
82a5f9918aSopenharmony_ci    yaml.compose_all = new_compose_all
83a5f9918aSopenharmony_ci    yaml.load = new_load
84a5f9918aSopenharmony_ci    yaml.load_all = new_load_all
85a5f9918aSopenharmony_ci    yaml.safe_load = new_safe_load
86a5f9918aSopenharmony_ci    yaml.safe_load_all = new_safe_load_all
87a5f9918aSopenharmony_ci    yaml.emit = new_emit
88a5f9918aSopenharmony_ci    yaml.serialize = new_serialize
89a5f9918aSopenharmony_ci    yaml.serialize_all = new_serialize_all
90a5f9918aSopenharmony_ci    yaml.dump = new_dump
91a5f9918aSopenharmony_ci    yaml.dump_all = new_dump_all
92a5f9918aSopenharmony_ci    yaml.safe_dump = new_safe_dump
93a5f9918aSopenharmony_ci    yaml.safe_dump_all = new_safe_dump_all
94a5f9918aSopenharmony_ci
95a5f9918aSopenharmony_cidef _tear_down():
96a5f9918aSopenharmony_ci    yaml.BaseLoader = yaml.PyBaseLoader
97a5f9918aSopenharmony_ci    yaml.SafeLoader = yaml.PySafeLoader
98a5f9918aSopenharmony_ci    yaml.Loader = yaml.PyLoader
99a5f9918aSopenharmony_ci    yaml.BaseDumper = yaml.PyBaseDumper
100a5f9918aSopenharmony_ci    yaml.SafeDumper = yaml.PySafeDumper
101a5f9918aSopenharmony_ci    yaml.Dumper = yaml.PyDumper
102a5f9918aSopenharmony_ci    yaml.scan = old_scan
103a5f9918aSopenharmony_ci    yaml.parse = old_parse
104a5f9918aSopenharmony_ci    yaml.compose = old_compose
105a5f9918aSopenharmony_ci    yaml.compose_all = old_compose_all
106a5f9918aSopenharmony_ci    yaml.load = old_load
107a5f9918aSopenharmony_ci    yaml.load_all = old_load_all
108a5f9918aSopenharmony_ci    yaml.safe_load = old_safe_load
109a5f9918aSopenharmony_ci    yaml.safe_load_all = old_safe_load_all
110a5f9918aSopenharmony_ci    yaml.emit = old_emit
111a5f9918aSopenharmony_ci    yaml.serialize = old_serialize
112a5f9918aSopenharmony_ci    yaml.serialize_all = old_serialize_all
113a5f9918aSopenharmony_ci    yaml.dump = old_dump
114a5f9918aSopenharmony_ci    yaml.dump_all = old_dump_all
115a5f9918aSopenharmony_ci    yaml.safe_dump = old_safe_dump
116a5f9918aSopenharmony_ci    yaml.safe_dump_all = old_safe_dump_all
117a5f9918aSopenharmony_ci
118a5f9918aSopenharmony_cidef test_c_version(verbose=False):
119a5f9918aSopenharmony_ci    if verbose:
120a5f9918aSopenharmony_ci        print(_yaml.get_version())
121a5f9918aSopenharmony_ci        print(_yaml.get_version_string())
122a5f9918aSopenharmony_ci    assert ("%s.%s.%s" % yaml._yaml.get_version()) == yaml._yaml.get_version_string(),    \
123a5f9918aSopenharmony_ci            (_yaml.get_version(), yaml._yaml.get_version_string())
124a5f9918aSopenharmony_ci
125a5f9918aSopenharmony_cidef test_deprecate_yaml_module():
126a5f9918aSopenharmony_ci    import _yaml
127a5f9918aSopenharmony_ci    assert _yaml.__package__ == ''
128a5f9918aSopenharmony_ci    assert isinstance(_yaml.get_version(), str)
129a5f9918aSopenharmony_ci
130a5f9918aSopenharmony_cidef _compare_scanners(py_data, c_data, verbose):
131a5f9918aSopenharmony_ci    py_tokens = list(yaml.scan(py_data, Loader=yaml.PyLoader))
132a5f9918aSopenharmony_ci    c_tokens = []
133a5f9918aSopenharmony_ci    try:
134a5f9918aSopenharmony_ci        for token in yaml.scan(c_data, Loader=yaml.CLoader):
135a5f9918aSopenharmony_ci            c_tokens.append(token)
136a5f9918aSopenharmony_ci        assert len(py_tokens) == len(c_tokens), (len(py_tokens), len(c_tokens))
137a5f9918aSopenharmony_ci        for py_token, c_token in zip(py_tokens, c_tokens):
138a5f9918aSopenharmony_ci            assert py_token.__class__ == c_token.__class__, (py_token, c_token)
139a5f9918aSopenharmony_ci            if hasattr(py_token, 'value'):
140a5f9918aSopenharmony_ci                assert py_token.value == c_token.value, (py_token, c_token)
141a5f9918aSopenharmony_ci            if isinstance(py_token, yaml.StreamEndToken):
142a5f9918aSopenharmony_ci                continue
143a5f9918aSopenharmony_ci            py_start = (py_token.start_mark.index, py_token.start_mark.line, py_token.start_mark.column)
144a5f9918aSopenharmony_ci            py_end = (py_token.end_mark.index, py_token.end_mark.line, py_token.end_mark.column)
145a5f9918aSopenharmony_ci            c_start = (c_token.start_mark.index, c_token.start_mark.line, c_token.start_mark.column)
146a5f9918aSopenharmony_ci            c_end = (c_token.end_mark.index, c_token.end_mark.line, c_token.end_mark.column)
147a5f9918aSopenharmony_ci            assert py_start == c_start, (py_start, c_start)
148a5f9918aSopenharmony_ci            assert py_end == c_end, (py_end, c_end)
149a5f9918aSopenharmony_ci    finally:
150a5f9918aSopenharmony_ci        if verbose:
151a5f9918aSopenharmony_ci            print("PY_TOKENS:")
152a5f9918aSopenharmony_ci            pprint.pprint(py_tokens)
153a5f9918aSopenharmony_ci            print("C_TOKENS:")
154a5f9918aSopenharmony_ci            pprint.pprint(c_tokens)
155a5f9918aSopenharmony_ci
156a5f9918aSopenharmony_cidef test_c_scanner(data_filename, canonical_filename, verbose=False):
157a5f9918aSopenharmony_ci    with open(data_filename, 'rb') as file1, open(data_filename, 'rb') as file2:
158a5f9918aSopenharmony_ci        _compare_scanners(file1, file2, verbose)
159a5f9918aSopenharmony_ci    with open(data_filename, 'rb') as file1, open(data_filename, 'rb') as file2:
160a5f9918aSopenharmony_ci        _compare_scanners(file1.read(), file2.read(), verbose)
161a5f9918aSopenharmony_ci    with open(canonical_filename, 'rb') as file1, open(canonical_filename, 'rb') as file2:
162a5f9918aSopenharmony_ci        _compare_scanners(file1, file2, verbose)
163a5f9918aSopenharmony_ci    with open(canonical_filename, 'rb') as file1, open(canonical_filename, 'rb') as file2:
164a5f9918aSopenharmony_ci        _compare_scanners(file1.read(), file2.read(), verbose)
165a5f9918aSopenharmony_ci
166a5f9918aSopenharmony_citest_c_scanner.unittest = ['.data', '.canonical']
167a5f9918aSopenharmony_citest_c_scanner.skip = ['.skip-ext']
168a5f9918aSopenharmony_ci
169a5f9918aSopenharmony_cidef _compare_parsers(py_data, c_data, verbose):
170a5f9918aSopenharmony_ci    py_events = list(yaml.parse(py_data, Loader=yaml.PyLoader))
171a5f9918aSopenharmony_ci    c_events = []
172a5f9918aSopenharmony_ci    try:
173a5f9918aSopenharmony_ci        for event in yaml.parse(c_data, Loader=yaml.CLoader):
174a5f9918aSopenharmony_ci            c_events.append(event)
175a5f9918aSopenharmony_ci        assert len(py_events) == len(c_events), (len(py_events), len(c_events))
176a5f9918aSopenharmony_ci        for py_event, c_event in zip(py_events, c_events):
177a5f9918aSopenharmony_ci            for attribute in ['__class__', 'anchor', 'tag', 'implicit',
178a5f9918aSopenharmony_ci                                'value', 'explicit', 'version', 'tags']:
179a5f9918aSopenharmony_ci                py_value = getattr(py_event, attribute, None)
180a5f9918aSopenharmony_ci                c_value = getattr(c_event, attribute, None)
181a5f9918aSopenharmony_ci                assert py_value == c_value, (py_event, c_event, attribute)
182a5f9918aSopenharmony_ci    finally:
183a5f9918aSopenharmony_ci        if verbose:
184a5f9918aSopenharmony_ci            print("PY_EVENTS:")
185a5f9918aSopenharmony_ci            pprint.pprint(py_events)
186a5f9918aSopenharmony_ci            print("C_EVENTS:")
187a5f9918aSopenharmony_ci            pprint.pprint(c_events)
188a5f9918aSopenharmony_ci
189a5f9918aSopenharmony_cidef test_c_parser(data_filename, canonical_filename, verbose=False):
190a5f9918aSopenharmony_ci    with open(data_filename, 'rb') as file1, open(data_filename, 'rb') as file2:
191a5f9918aSopenharmony_ci        _compare_parsers(file1, file2, verbose)
192a5f9918aSopenharmony_ci    with open(data_filename, 'rb') as file1, open(data_filename, 'rb') as file2:
193a5f9918aSopenharmony_ci        _compare_parsers(file1.read(), file2.read(), verbose)
194a5f9918aSopenharmony_ci    with open(canonical_filename, 'rb') as file1, open(canonical_filename, 'rb') as file2:
195a5f9918aSopenharmony_ci        _compare_parsers(file1, file2, verbose)
196a5f9918aSopenharmony_ci    with open(canonical_filename, 'rb') as file1, open(canonical_filename, 'rb') as file2:
197a5f9918aSopenharmony_ci        _compare_parsers(file1.read(), file2.read(), verbose)
198a5f9918aSopenharmony_ci
199a5f9918aSopenharmony_citest_c_parser.unittest = ['.data', '.canonical']
200a5f9918aSopenharmony_citest_c_parser.skip = ['.skip-ext']
201a5f9918aSopenharmony_ci
202a5f9918aSopenharmony_cidef _compare_emitters(data, verbose):
203a5f9918aSopenharmony_ci    events = list(yaml.parse(data, Loader=yaml.PyLoader))
204a5f9918aSopenharmony_ci    c_data = yaml.emit(events, Dumper=yaml.CDumper)
205a5f9918aSopenharmony_ci    if verbose:
206a5f9918aSopenharmony_ci        print(c_data)
207a5f9918aSopenharmony_ci    py_events = list(yaml.parse(c_data, Loader=yaml.PyLoader))
208a5f9918aSopenharmony_ci    c_events = list(yaml.parse(c_data, Loader=yaml.CLoader))
209a5f9918aSopenharmony_ci    try:
210a5f9918aSopenharmony_ci        assert len(events) == len(py_events), (len(events), len(py_events))
211a5f9918aSopenharmony_ci        assert len(events) == len(c_events), (len(events), len(c_events))
212a5f9918aSopenharmony_ci        for event, py_event, c_event in zip(events, py_events, c_events):
213a5f9918aSopenharmony_ci            for attribute in ['__class__', 'anchor', 'tag', 'implicit',
214a5f9918aSopenharmony_ci                                'value', 'explicit', 'version', 'tags']:
215a5f9918aSopenharmony_ci                value = getattr(event, attribute, None)
216a5f9918aSopenharmony_ci                py_value = getattr(py_event, attribute, None)
217a5f9918aSopenharmony_ci                c_value = getattr(c_event, attribute, None)
218a5f9918aSopenharmony_ci                if attribute == 'tag' and value in [None, '!'] \
219a5f9918aSopenharmony_ci                        and py_value in [None, '!'] and c_value in [None, '!']:
220a5f9918aSopenharmony_ci                    continue
221a5f9918aSopenharmony_ci                if attribute == 'explicit' and (py_value or c_value):
222a5f9918aSopenharmony_ci                    continue
223a5f9918aSopenharmony_ci                assert value == py_value, (event, py_event, attribute)
224a5f9918aSopenharmony_ci                assert value == c_value, (event, c_event, attribute)
225a5f9918aSopenharmony_ci    finally:
226a5f9918aSopenharmony_ci        if verbose:
227a5f9918aSopenharmony_ci            print("EVENTS:")
228a5f9918aSopenharmony_ci            pprint.pprint(events)
229a5f9918aSopenharmony_ci            print("PY_EVENTS:")
230a5f9918aSopenharmony_ci            pprint.pprint(py_events)
231a5f9918aSopenharmony_ci            print("C_EVENTS:")
232a5f9918aSopenharmony_ci            pprint.pprint(c_events)
233a5f9918aSopenharmony_ci
234a5f9918aSopenharmony_cidef test_c_emitter(data_filename, canonical_filename, verbose=False):
235a5f9918aSopenharmony_ci    with open(data_filename, 'rb') as file:
236a5f9918aSopenharmony_ci        _compare_emitters(file.read(), verbose)
237a5f9918aSopenharmony_ci    with open(canonical_filename, 'rb') as file:
238a5f9918aSopenharmony_ci        _compare_emitters(file.read(), verbose)
239a5f9918aSopenharmony_ci
240a5f9918aSopenharmony_citest_c_emitter.unittest = ['.data', '.canonical']
241a5f9918aSopenharmony_citest_c_emitter.skip = ['.skip-ext']
242a5f9918aSopenharmony_ci
243a5f9918aSopenharmony_cidef test_large_file(verbose=False):
244a5f9918aSopenharmony_ci    SIZE_LINE = 24
245a5f9918aSopenharmony_ci    SIZE_ITERATION = 0
246a5f9918aSopenharmony_ci    SIZE_FILE = 31
247a5f9918aSopenharmony_ci    if sys.maxsize <= 2**32:
248a5f9918aSopenharmony_ci        return
249a5f9918aSopenharmony_ci    if os.environ.get('PYYAML_TEST_GROUP', '') != 'all':
250a5f9918aSopenharmony_ci        return
251a5f9918aSopenharmony_ci    with tempfile.TemporaryFile() as temp_file:
252a5f9918aSopenharmony_ci        for i in range(2**(SIZE_FILE-SIZE_ITERATION-SIZE_LINE) + 1):
253a5f9918aSopenharmony_ci            temp_file.write(bytes(('-' + (' ' * (2**SIZE_LINE-4))+ '{}\n')*(2**SIZE_ITERATION), 'utf-8'))
254a5f9918aSopenharmony_ci        temp_file.seek(0)
255a5f9918aSopenharmony_ci        yaml.load(temp_file, Loader=yaml.CLoader)
256a5f9918aSopenharmony_ci
257a5f9918aSopenharmony_citest_large_file.unittest = None
258a5f9918aSopenharmony_ci
259a5f9918aSopenharmony_cidef wrap_ext_function(function):
260a5f9918aSopenharmony_ci    def wrapper(*args, **kwds):
261a5f9918aSopenharmony_ci        _set_up()
262a5f9918aSopenharmony_ci        try:
263a5f9918aSopenharmony_ci            function(*args, **kwds)
264a5f9918aSopenharmony_ci        finally:
265a5f9918aSopenharmony_ci            _tear_down()
266a5f9918aSopenharmony_ci    wrapper.__name__ = '%s_ext' % function.__name__
267a5f9918aSopenharmony_ci    wrapper.unittest = function.unittest
268a5f9918aSopenharmony_ci    wrapper.skip = getattr(function, 'skip', [])+['.skip-ext']
269a5f9918aSopenharmony_ci    return wrapper
270a5f9918aSopenharmony_ci
271a5f9918aSopenharmony_cidef wrap_ext(collections):
272a5f9918aSopenharmony_ci    functions = []
273a5f9918aSopenharmony_ci    if not isinstance(collections, list):
274a5f9918aSopenharmony_ci        collections = [collections]
275a5f9918aSopenharmony_ci    for collection in collections:
276a5f9918aSopenharmony_ci        if not isinstance(collection, dict):
277a5f9918aSopenharmony_ci            collection = vars(collection)
278a5f9918aSopenharmony_ci        for key in sorted(collection):
279a5f9918aSopenharmony_ci            value = collection[key]
280a5f9918aSopenharmony_ci            if isinstance(value, types.FunctionType) and hasattr(value, 'unittest'):
281a5f9918aSopenharmony_ci                functions.append(wrap_ext_function(value))
282a5f9918aSopenharmony_ci    for function in functions:
283a5f9918aSopenharmony_ci        assert function.__name__ not in globals()
284a5f9918aSopenharmony_ci        globals()[function.__name__] = function
285a5f9918aSopenharmony_ci
286a5f9918aSopenharmony_ciimport test_tokens, test_structure, test_errors, test_resolver, test_constructor,   \
287a5f9918aSopenharmony_ci        test_emitter, test_representer, test_recursive, test_input_output
288a5f9918aSopenharmony_ciwrap_ext([test_tokens, test_structure, test_errors, test_resolver, test_constructor,
289a5f9918aSopenharmony_ci        test_emitter, test_representer, test_recursive, test_input_output])
290a5f9918aSopenharmony_ci
291a5f9918aSopenharmony_ciif __name__ == '__main__':
292a5f9918aSopenharmony_ci    import test_appliance
293a5f9918aSopenharmony_ci    test_appliance.run(globals())
294a5f9918aSopenharmony_ci
295