51 lines
1.4 KiB
Python
Executable file
51 lines
1.4 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
import argparse
|
|
import subprocess
|
|
from pathlib import Path
|
|
|
|
RESET = "\033[0m"
|
|
GRAY = "\033[1;90m"
|
|
GREEN = "\033[1;32m"
|
|
MAGENTA = "\033[1;35m"
|
|
RED = "\033[1;31m"
|
|
|
|
|
|
def find_solutions(paths):
|
|
pairs = {}
|
|
for path in paths:
|
|
if path.suffix == ".input":
|
|
pairs[path] = path.parent / (path.stem + ".solution")
|
|
return pairs
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument("file", type=Path, nargs="+")
|
|
parser.add_argument("--command", "-c", required=True, action="append")
|
|
parser.add_argument("--diff", "-d", default="diff")
|
|
args = parser.parse_args()
|
|
|
|
for inputpath, solutionpath in sorted(find_solutions(args.file).items()):
|
|
try:
|
|
with open(solutionpath) as f:
|
|
solutionstr = f.read()
|
|
except FileNotFoundError:
|
|
print(f"{GRAY}No solution{RESET} for {inputpath}")
|
|
continue
|
|
|
|
resultstr = subprocess.run(
|
|
args.command + [inputpath], check=True, capture_output=True, text=True
|
|
).stdout
|
|
|
|
if resultstr.strip() == solutionstr.strip():
|
|
print(f"{GREEN}Passed{RESET} {inputpath}")
|
|
elif resultstr.strip() == "":
|
|
print(f"{MAGENTA}No answer{RESET} for {inputpath}")
|
|
else:
|
|
print(f"{RED}Failed{RESET} {inputpath}")
|
|
subprocess.run([args.diff, solutionpath, "-"], input=resultstr, text=True)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|