Files
TDT4205/ps1/testing/test.py
2026-01-29 17:57:08 +01:00

88 lines
2.6 KiB
Python

import difflib
import pathlib
import os
import subprocess
import sys
def main():
ps1_root_dir = pathlib.Path(__file__).parent.parent.resolve()
build_dir = ps1_root_dir / "build"
print("Building and compiling...")
try:
subprocess.run(["cmake", str(ps1_root_dir), "-B", str(build_dir)], check=True)
subprocess.run(["cmake", "--build", str(build_dir)], check=True)
except subprocess.CalledProcessError as e:
print(f"An error occurred while running CMake: {e}", file=sys.stderr)
sys.exit(1)
print("Build complete")
testing_dir = ps1_root_dir / "testing"
tests_dir = testing_dir / "tests"
outputs_dir = testing_dir / "expected"
executable = build_dir / "ps1"
sorted_test_files : list[pathlib.Path] = []
for test_file in tests_dir.glob("*.txt"):
sorted_test_files.append(test_file)
sorted_test_files.sort(key= lambda p : p.name)
passed = 0
for test_file in sorted_test_files:
name = test_file.name
print(f"Testing {name}... ", end="")
output_file = outputs_dir / name
if not output_file.exists():
print("")
print(f"Error: Could not find {str(output_file)}", file=sys.stderr)
sys.exit(1)
try:
result : list[str] = []
with test_file.open("r") as test_input:
result_str : str = subprocess.run(
[executable],
stdin=test_input,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True, # Output must be text
check=True
).stdout
result = result_str.splitlines()
expected : list[str] = []
with output_file.open("r") as expected_output:
expected = expected_output.read().splitlines()
diff_list : list[str] = []
for diff in difflib.unified_diff(result, expected, fromfile='your output', tofile='expected_output', lineterm='', n=3):
diff_list.append(diff)
if not diff_list:
# List is empty; no diffs
passed += 1
print("OK")
continue
# If at least one diff, print
print("MISMATCH")
for diff in diff_list:
print(diff)
except subprocess.CalledProcessError as e:
print("")
print(f"Error: Test {name} failed to execute: {e}", file=sys.stderr)
print(f"{passed}/{len(sorted_test_files)} tests passed")
if __name__ == "__main__":
main()