diff options
author | David Robillard <d@drobilla.net> | 2021-08-11 13:22:13 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2022-01-28 21:57:07 -0500 |
commit | baa2e4e768f542953144cfa6ebe5713ecad389fc (patch) | |
tree | 379ecd51192b78f1cb5fed86621be00219e962b1 /test/serd_test_util/__init__.py | |
parent | b0c6047765944609d1eec479898547d792419f39 (diff) | |
download | serd-baa2e4e768f542953144cfa6ebe5713ecad389fc.tar.gz serd-baa2e4e768f542953144cfa6ebe5713ecad389fc.tar.bz2 serd-baa2e4e768f542953144cfa6ebe5713ecad389fc.zip |
Factor out common test runner facilities
Diffstat (limited to 'test/serd_test_util/__init__.py')
-rw-r--r-- | test/serd_test_util/__init__.py | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/test/serd_test_util/__init__.py b/test/serd_test_util/__init__.py new file mode 100644 index 00000000..f0b1c19a --- /dev/null +++ b/test/serd_test_util/__init__.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python3 + +"""Utilities for data-driven tests.""" + +import datetime +import re +import subprocess + + +def earl_assertion(test, passed, asserter): + """Return a Turtle description of an assertion for the test report.""" + + asserter_str = "" + if asserter is not None: + asserter_str = "\n\tearl:assertedBy <%s> ;" % asserter + + return """ +[] +\ta earl:Assertion ;%s +\tearl:subject <http://drobilla.net/sw/serd> ; +\tearl:test <%s> ; +\tearl:result [ +\t\ta earl:TestResult ; +\t\tearl:outcome %s ; +\t\tdc:date "%s"^^xsd:dateTime +\t] . +""" % ( + asserter_str, + test, + "earl:passed" if passed else "earl:failed", + datetime.datetime.now().replace(microsecond=0).isoformat(), + ) + + +def load_rdf(command_prefix, filename): + """Load an RDF file as dictionaries via serdi (only supports URIs).""" + + rdf_type = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type" + model = {} + instances = {} + + cmd = command_prefix + [filename] + proc = subprocess.run(cmd, capture_output=True, check=True) + for line in proc.stdout.splitlines(): + matches = re.match( + r"<([^ ]*)> <([^ ]*)> <([^ ]*)> \.", line.decode("utf-8") + ) + if matches: + s, p, o = (matches.group(1), matches.group(2), matches.group(3)) + if s not in model: + model[s] = {p: [o]} + elif p not in model[s]: + model[s][p] = [o] + else: + model[s][p].append(o) + + if p == rdf_type: + if o not in instances: + instances[o] = set([s]) + else: + instances[o].update([s]) + + return model, instances |