| import yaml | |
| import sys | |
| import pprint | |
| import math | |
| def check_bool(value, expected): | |
| if expected == 'false()' and value is False: | |
| return 1 | |
| if expected == 'true()' and value is True: | |
| return 1 | |
| print(value) | |
| print(expected) | |
| return 0 | |
| def check_int(value, expected): | |
| if (int(expected) == value): | |
| return 1 | |
| print(value) | |
| print(expected) | |
| return 0 | |
| def check_float(value, expected): | |
| if expected == 'inf()': | |
| if value == math.inf: | |
| return 1 | |
| elif expected == 'inf-neg()': | |
| if value == -math.inf: | |
| return 1 | |
| elif expected == 'nan()': | |
| if math.isnan(value): | |
| return 1 | |
| elif (float(expected) == value): | |
| return 1 | |
| else: | |
| print(value) | |
| print(expected) | |
| return 0 | |
| def check_str(value, expected): | |
| if value == expected: | |
| return 1 | |
| print(value) | |
| print(expected) | |
| return 0 | |
| def _fail(input, test): | |
| print("Input: >>" + input + "<<") | |
| print(test) | |
| # The tests/data/yaml11.schema file is copied from | |
| # https://github.com/perlpunk/yaml-test-schema/blob/master/data/schema-yaml11.yaml | |
| def test_implicit_resolver(data_filename, skip_filename, verbose=False): | |
| types = { | |
| 'str': [str, check_str], | |
| 'int': [int, check_int], | |
| 'float': [float, check_float], | |
| 'inf': [float, check_float], | |
| 'nan': [float, check_float], | |
| 'bool': [bool, check_bool], | |
| } | |
| with open(skip_filename, 'rb') as file: | |
| skipdata = yaml.load(file, Loader=yaml.SafeLoader) | |
| skip_load = skipdata['load'] | |
| skip_dump = skipdata['dump'] | |
| if verbose: | |
| print(skip_load) | |
| with open(data_filename, 'rb') as file: | |
| tests = yaml.load(file, Loader=yaml.SafeLoader) | |
| i = 0 | |
| fail = 0 | |
| for i, (input, test) in enumerate(sorted(tests.items())): | |
| if verbose: | |
| print('-------------------- ' + str(i)) | |
| # Skip known loader bugs | |
| if input in skip_load: | |
| continue | |
| exp_type = test[0] | |
| data = test[1] | |
| exp_dump = test[2] | |
| # Test loading | |
| try: | |
| loaded = yaml.safe_load(input) | |
| except: | |
| print("Error:", sys.exc_info()[0], '(', sys.exc_info()[1], ')') | |
| fail+=1 | |
| _fail(input, test) | |
| continue | |
| if verbose: | |
| print(input) | |
| print(test) | |
| print(loaded) | |
| print(type(loaded)) | |
| if exp_type == 'null': | |
| if loaded is None: | |
| pass | |
| else: | |
| fail+=1 | |
| _fail(input, test) | |
| else: | |
| t = types[exp_type][0] | |
| code = types[exp_type][1] | |
| if isinstance(loaded, t): | |
| if code(loaded, data): | |
| pass | |
| else: | |
| fail+=1 | |
| _fail(input, test) | |
| else: | |
| fail+=1 | |
| _fail(input, test) | |
| # Skip known dumper bugs | |
| if input in skip_dump: | |
| continue | |
| dump = yaml.safe_dump(loaded, explicit_end=False) | |
| # strip trailing newlines and footers | |
| if dump.endswith('\n...\n'): | |
| dump = dump[:-5] | |
| if dump.endswith('\n'): | |
| dump = dump[:-1] | |
| if dump == exp_dump: | |
| pass | |
| else: | |
| print("Compare: >>" + dump + "<< >>" + exp_dump + "<<") | |
| fail+=1 | |
| _fail(input, test) | |
| # if i >= 80: | |
| # break | |
| if fail > 0: | |
| print("Failed " + str(fail) + " / " + str(i) + " tests") | |
| assert(False) | |
| else: | |
| print("Passed " + str(i) + " tests") | |
| print("Skipped " + str(len(skip_load)) + " load tests") | |
| print("Skipped " + str(len(skip_dump)) + " dump tests") | |
| test_implicit_resolver.unittest = ['.schema', '.schema-skip'] | |
| if __name__ == '__main__': | |
| import test_appliance | |
| test_appliance.run(globals()) | |