diff options
Diffstat (limited to 'test/test_sort.py')
-rwxr-xr-x | test/test_sort.py | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/test/test_sort.py b/test/test_sort.py new file mode 100755 index 00000000..78147fbc --- /dev/null +++ b/test/test_sort.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 + +# Copyright 2022-2023 David Robillard <d@drobilla.net> +# SPDX-License-Identifier: ISC + +"""Run the collation tests for serd-sort.""" + +import os +import shlex +import subprocess +import sys + +import serd_test_util as util + +collations = [ + "GOPS", + "GOSP", + "GPSO", + "GSOP", + "GSPO", + "OPS", + "OSP", + "POS", + "PSO", + "SOP", + "SPO", + "pretty", +] + + +def run_sort_test(command, in_path, good_path): + """Sort a single input in the named order and check the output. + + The expected output is assumed to exist at test_dir/NAME.untyped.nq. + """ + + result_name = os.path.basename(good_path) + options = [] + if result_name not in ["pretty.nq", "untyped.nq"]: + options += ["-c", os.path.splitext(result_name)[0]] + + command = command + options + [in_path] + + proc = subprocess.run( + command, check=True, encoding="utf-8", capture_output=True + ) + + lines = proc.stdout.splitlines(True) + with open(good_path, "r", encoding="utf-8") as good: + return util.lines_equal(list(good), lines, good_path, result_name) + + +def run_tests(test_dir, command): + """Run all the tests in the suite.""" + + n_failures = 0 + in_path = os.path.join(test_dir, "input.trig") + + # Test all the basic collations, and "pretty" with type first + for name in collations: + good_path = os.path.join(test_dir, name + ".nq") + prefixes = [command, command + ["-I", "trig"]] + for prefix in prefixes: + if not run_sort_test(prefix, in_path, good_path): + n_failures += 1 + + # Test "pretty" without type first + if not run_sort_test( + command + ["-O", "longhand"], + in_path, + os.path.join(test_dir, "untyped.nq"), + ): + n_failures += 1 + + return n_failures + + +def main(): + """Run the command line tool.""" + + args = util.wrapper_args(__doc__, True) + wrapper_prefix = shlex.split(args.wrapper) + command_prefix = wrapper_prefix + [args.tool] + + return run_tests(os.path.dirname(args.input), command_prefix) + + +if __name__ == "__main__": + try: + sys.exit(main()) + except subprocess.CalledProcessError as error: + if error.stderr is not None: + sys.stderr.write(error.stderr) + + sys.stderr.write(sys.argv[0]) + sys.stderr.write(": error: ") + sys.stderr.write(str(error)) + sys.stderr.write("\n") + sys.exit(error.returncode) |