aboutsummaryrefslogtreecommitdiff
path: root/tests/lib/test_schema.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/lib/test_schema.py')
-rw-r--r--tests/lib/test_schema.py152
1 files changed, 152 insertions, 0 deletions
diff --git a/tests/lib/test_schema.py b/tests/lib/test_schema.py
new file mode 100644
index 0000000..f3370ec
--- /dev/null
+++ b/tests/lib/test_schema.py
@@ -0,0 +1,152 @@
+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())
+