2018-07-05 19:08:58 +10:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
|
|
|
from glob import glob
|
|
|
|
import subprocess
|
|
|
|
|
|
|
|
import os.path
|
|
|
|
import os
|
|
|
|
import tempfile
|
|
|
|
|
|
|
|
validate="@CMAKE_CURRENT_BINARY_DIR@/json-schema"
|
|
|
|
compare="@CMAKE_CURRENT_BINARY_DIR@/json-compare"
|
|
|
|
src="@CMAKE_CURRENT_SOURCE_DIR@/test/json/schema"
|
|
|
|
devnull=open(os.devnull, 'w')
|
|
|
|
|
|
|
|
|
2018-07-06 13:17:29 +10:00
|
|
|
def test_bad(schema:str, dir:str) -> int:
|
2018-07-05 19:08:58 +10:00
|
|
|
failures = 0
|
|
|
|
|
|
|
|
for input in glob(os.path.join(dir, "*.json")):
|
|
|
|
code = subprocess.call([validate, schema, input], stdout=devnull, stderr=devnull)
|
|
|
|
|
|
|
|
prefix = ""
|
|
|
|
if code == 0:
|
|
|
|
prefix = "not "
|
|
|
|
failures += 1
|
|
|
|
|
|
|
|
prefix = "not " if code == 0 else ""
|
|
|
|
print(f"{prefix}ok - {input}")
|
|
|
|
|
|
|
|
return failures
|
|
|
|
|
|
|
|
|
2018-07-06 13:17:29 +10:00
|
|
|
def test_good(schema:str, dir:str) -> int:
|
2018-07-05 19:08:58 +10:00
|
|
|
inputs = glob(os.path.join(dir, "*.input.json"))
|
|
|
|
results = glob(os.path.join(dir, "*.result.json"))
|
|
|
|
|
|
|
|
inputs.sort()
|
|
|
|
results.sort()
|
|
|
|
|
|
|
|
failures = 0
|
|
|
|
|
|
|
|
for (target,truth) in zip(inputs, results):
|
|
|
|
success = False
|
|
|
|
|
|
|
|
try:
|
|
|
|
with tempfile.NamedTemporaryFile(delete=True) as out:
|
|
|
|
subprocess.check_call([validate, schema, target], stdout=out)
|
|
|
|
subprocess.check_call([compare, out.name, truth])
|
|
|
|
success = True
|
|
|
|
except subprocess.CalledProcessError:
|
|
|
|
failures += 1
|
|
|
|
|
|
|
|
prefix = "not " if not success else ""
|
|
|
|
print(f"{prefix}ok - {target}")
|
|
|
|
|
|
|
|
return failures
|
|
|
|
|
|
|
|
|
2018-07-06 13:17:29 +10:00
|
|
|
def validation_group(dir:str) -> int:
|
2018-07-05 19:08:58 +10:00
|
|
|
schema = os.path.join(dir, "schema.json")
|
|
|
|
if not os.path.isfile(schema):
|
|
|
|
raise Exception("schema is not present")
|
|
|
|
|
|
|
|
failures = 0
|
|
|
|
failures += test_good(schema, os.path.join(dir, "good"))
|
|
|
|
failures += test_bad(schema, os.path.join(dir, "bad"))
|
|
|
|
|
|
|
|
return failures
|
|
|
|
|
2018-07-06 13:17:29 +10:00
|
|
|
def test_validation(dir:str) -> int:
|
2018-07-05 19:08:58 +10:00
|
|
|
failures = 0
|
|
|
|
|
2018-07-06 13:17:29 +10:00
|
|
|
groups = (x for x in os.listdir(dir))
|
|
|
|
groups = (os.path.join(dir, x) for x in groups)
|
|
|
|
groups = (x for x in groups if os.path.isdir(x))
|
|
|
|
|
|
|
|
for name in sorted(groups):
|
2018-07-05 19:08:58 +10:00
|
|
|
path = os.path.join(src, name)
|
|
|
|
if not os.path.isdir(path):
|
|
|
|
continue
|
2018-07-06 13:17:29 +10:00
|
|
|
failures += validation_group(path)
|
2018-07-05 19:08:58 +10:00
|
|
|
|
2018-07-06 13:17:29 +10:00
|
|
|
return failures
|
2018-07-05 19:08:58 +10:00
|
|
|
|
2018-07-06 13:17:29 +10:00
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
failures = 0
|
|
|
|
|
|
|
|
failures += test_validation(os.path.join(src, "validation"))
|
|
|
|
exit(1 if failures else 0)
|