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