153 lines
3.9 KiB
Python
153 lines
3.9 KiB
Python
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())
|
|
|