1a5f9918aSopenharmony_ciimport yaml 2a5f9918aSopenharmony_ciimport sys 3a5f9918aSopenharmony_ciimport pprint 4a5f9918aSopenharmony_ciimport math 5a5f9918aSopenharmony_ci 6a5f9918aSopenharmony_cidef check_bool(value, expected): 7a5f9918aSopenharmony_ci if expected == 'false()' and value is False: 8a5f9918aSopenharmony_ci return 1 9a5f9918aSopenharmony_ci if expected == 'true()' and value is True: 10a5f9918aSopenharmony_ci return 1 11a5f9918aSopenharmony_ci print(value) 12a5f9918aSopenharmony_ci print(expected) 13a5f9918aSopenharmony_ci return 0 14a5f9918aSopenharmony_ci 15a5f9918aSopenharmony_cidef check_int(value, expected): 16a5f9918aSopenharmony_ci if (int(expected) == value): 17a5f9918aSopenharmony_ci return 1 18a5f9918aSopenharmony_ci print(value) 19a5f9918aSopenharmony_ci print(expected) 20a5f9918aSopenharmony_ci return 0 21a5f9918aSopenharmony_ci 22a5f9918aSopenharmony_cidef check_float(value, expected): 23a5f9918aSopenharmony_ci if expected == 'inf()': 24a5f9918aSopenharmony_ci if value == math.inf: 25a5f9918aSopenharmony_ci return 1 26a5f9918aSopenharmony_ci elif expected == 'inf-neg()': 27a5f9918aSopenharmony_ci if value == -math.inf: 28a5f9918aSopenharmony_ci return 1 29a5f9918aSopenharmony_ci elif expected == 'nan()': 30a5f9918aSopenharmony_ci if math.isnan(value): 31a5f9918aSopenharmony_ci return 1 32a5f9918aSopenharmony_ci elif (float(expected) == value): 33a5f9918aSopenharmony_ci return 1 34a5f9918aSopenharmony_ci else: 35a5f9918aSopenharmony_ci print(value) 36a5f9918aSopenharmony_ci print(expected) 37a5f9918aSopenharmony_ci return 0 38a5f9918aSopenharmony_ci 39a5f9918aSopenharmony_cidef check_str(value, expected): 40a5f9918aSopenharmony_ci if value == expected: 41a5f9918aSopenharmony_ci return 1 42a5f9918aSopenharmony_ci print(value) 43a5f9918aSopenharmony_ci print(expected) 44a5f9918aSopenharmony_ci return 0 45a5f9918aSopenharmony_ci 46a5f9918aSopenharmony_ci 47a5f9918aSopenharmony_cidef _fail(input, test): 48a5f9918aSopenharmony_ci print("Input: >>" + input + "<<") 49a5f9918aSopenharmony_ci print(test) 50a5f9918aSopenharmony_ci 51a5f9918aSopenharmony_ci# The tests/data/yaml11.schema file is copied from 52a5f9918aSopenharmony_ci# https://github.com/perlpunk/yaml-test-schema/blob/master/data/schema-yaml11.yaml 53a5f9918aSopenharmony_cidef test_implicit_resolver(data_filename, skip_filename, verbose=False): 54a5f9918aSopenharmony_ci types = { 55a5f9918aSopenharmony_ci 'str': [str, check_str], 56a5f9918aSopenharmony_ci 'int': [int, check_int], 57a5f9918aSopenharmony_ci 'float': [float, check_float], 58a5f9918aSopenharmony_ci 'inf': [float, check_float], 59a5f9918aSopenharmony_ci 'nan': [float, check_float], 60a5f9918aSopenharmony_ci 'bool': [bool, check_bool], 61a5f9918aSopenharmony_ci } 62a5f9918aSopenharmony_ci with open(skip_filename, 'rb') as file: 63a5f9918aSopenharmony_ci skipdata = yaml.load(file, Loader=yaml.SafeLoader) 64a5f9918aSopenharmony_ci skip_load = skipdata['load'] 65a5f9918aSopenharmony_ci skip_dump = skipdata['dump'] 66a5f9918aSopenharmony_ci if verbose: 67a5f9918aSopenharmony_ci print(skip_load) 68a5f9918aSopenharmony_ci with open(data_filename, 'rb') as file: 69a5f9918aSopenharmony_ci tests = yaml.load(file, Loader=yaml.SafeLoader) 70a5f9918aSopenharmony_ci 71a5f9918aSopenharmony_ci i = 0 72a5f9918aSopenharmony_ci fail = 0 73a5f9918aSopenharmony_ci for i, (input, test) in enumerate(sorted(tests.items())): 74a5f9918aSopenharmony_ci if verbose: 75a5f9918aSopenharmony_ci print('-------------------- ' + str(i)) 76a5f9918aSopenharmony_ci 77a5f9918aSopenharmony_ci # Skip known loader bugs 78a5f9918aSopenharmony_ci if input in skip_load: 79a5f9918aSopenharmony_ci continue 80a5f9918aSopenharmony_ci 81a5f9918aSopenharmony_ci exp_type = test[0] 82a5f9918aSopenharmony_ci data = test[1] 83a5f9918aSopenharmony_ci exp_dump = test[2] 84a5f9918aSopenharmony_ci 85a5f9918aSopenharmony_ci # Test loading 86a5f9918aSopenharmony_ci try: 87a5f9918aSopenharmony_ci loaded = yaml.safe_load(input) 88a5f9918aSopenharmony_ci except: 89a5f9918aSopenharmony_ci print("Error:", sys.exc_info()[0], '(', sys.exc_info()[1], ')') 90a5f9918aSopenharmony_ci fail+=1 91a5f9918aSopenharmony_ci _fail(input, test) 92a5f9918aSopenharmony_ci continue 93a5f9918aSopenharmony_ci 94a5f9918aSopenharmony_ci if verbose: 95a5f9918aSopenharmony_ci print(input) 96a5f9918aSopenharmony_ci print(test) 97a5f9918aSopenharmony_ci print(loaded) 98a5f9918aSopenharmony_ci print(type(loaded)) 99a5f9918aSopenharmony_ci 100a5f9918aSopenharmony_ci if exp_type == 'null': 101a5f9918aSopenharmony_ci if loaded is None: 102a5f9918aSopenharmony_ci pass 103a5f9918aSopenharmony_ci else: 104a5f9918aSopenharmony_ci fail+=1 105a5f9918aSopenharmony_ci _fail(input, test) 106a5f9918aSopenharmony_ci else: 107a5f9918aSopenharmony_ci t = types[exp_type][0] 108a5f9918aSopenharmony_ci code = types[exp_type][1] 109a5f9918aSopenharmony_ci if isinstance(loaded, t): 110a5f9918aSopenharmony_ci if code(loaded, data): 111a5f9918aSopenharmony_ci pass 112a5f9918aSopenharmony_ci else: 113a5f9918aSopenharmony_ci fail+=1 114a5f9918aSopenharmony_ci _fail(input, test) 115a5f9918aSopenharmony_ci else: 116a5f9918aSopenharmony_ci fail+=1 117a5f9918aSopenharmony_ci _fail(input, test) 118a5f9918aSopenharmony_ci 119a5f9918aSopenharmony_ci # Skip known dumper bugs 120a5f9918aSopenharmony_ci if input in skip_dump: 121a5f9918aSopenharmony_ci continue 122a5f9918aSopenharmony_ci 123a5f9918aSopenharmony_ci dump = yaml.safe_dump(loaded, explicit_end=False) 124a5f9918aSopenharmony_ci # strip trailing newlines and footers 125a5f9918aSopenharmony_ci if dump.endswith('\n...\n'): 126a5f9918aSopenharmony_ci dump = dump[:-5] 127a5f9918aSopenharmony_ci if dump.endswith('\n'): 128a5f9918aSopenharmony_ci dump = dump[:-1] 129a5f9918aSopenharmony_ci if dump == exp_dump: 130a5f9918aSopenharmony_ci pass 131a5f9918aSopenharmony_ci else: 132a5f9918aSopenharmony_ci print("Compare: >>" + dump + "<< >>" + exp_dump + "<<") 133a5f9918aSopenharmony_ci fail+=1 134a5f9918aSopenharmony_ci _fail(input, test) 135a5f9918aSopenharmony_ci 136a5f9918aSopenharmony_ci# if i >= 80: 137a5f9918aSopenharmony_ci# break 138a5f9918aSopenharmony_ci 139a5f9918aSopenharmony_ci if fail > 0: 140a5f9918aSopenharmony_ci print("Failed " + str(fail) + " / " + str(i) + " tests") 141a5f9918aSopenharmony_ci assert(False) 142a5f9918aSopenharmony_ci else: 143a5f9918aSopenharmony_ci print("Passed " + str(i) + " tests") 144a5f9918aSopenharmony_ci print("Skipped " + str(len(skip_load)) + " load tests") 145a5f9918aSopenharmony_ci print("Skipped " + str(len(skip_dump)) + " dump tests") 146a5f9918aSopenharmony_ci 147a5f9918aSopenharmony_citest_implicit_resolver.unittest = ['.schema', '.schema-skip'] 148a5f9918aSopenharmony_ci 149a5f9918aSopenharmony_ciif __name__ == '__main__': 150a5f9918aSopenharmony_ci import test_appliance 151a5f9918aSopenharmony_ci test_appliance.run(globals()) 152a5f9918aSopenharmony_ci 153