| 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()) |
| |