import glob
from os import path
import os
import subprocess
import pathlib
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-b", "--bless", help="Update the tests", action="store_true")
parser.add_argument(
"-s", "--skip-build", help="Skip rebuilding the binary", action="store_true"
)
parser.add_argument(
"-r", "--release", help="Build skate in release_mode", action="store_true"
)
args = parser.parse_args()
BASE_DIR = path.realpath(path.dirname(__file__))
os.chdir(BASE_DIR)
if not args.skip_build:
rflags = "--release" if args.release else ""
os.system(f"cargo build {rflags}")
os.system(f"cargo test {rflags}")
SKATE_BINARY = path.join(BASE_DIR, "target", "debug", "skate")
TEST_DIR = path.join(BASE_DIR, "tests")
SK_GLOB = path.join("**", "*.sk")
mkglob = lambda dir: path.join(TEST_DIR, dir, SK_GLOB)
RUN_PASS_GLOB = mkglob("run-pass")
COMPILE_FAIL_GLOB = mkglob("compile-fail")
RUN_FAIL_GLOB = mkglob("run-fail")
EXIT_PASS = 0
EXIT_COMPILE_FAIL = 66
EXIT_RUN_FAIL = 1
passing = True
def fail():
global passing
passing = False
def ppath(path):
return str(path).replace(BASE_DIR, ".")
def process(stream, file):
stream = stream.decode()
output = stream.replace(BASE_DIR, "$DD")
prity_file = ppath(file)
if args.bless:
with open(file, "w") as f:
f.write(output)
print(f"BLESSED {prity_file}")
else:
with open(file, "r") as f:
assert output == f.read()
print(f"PASSED {prity_file}")
def run_pass(path):
output = subprocess.run([SKATE_BINARY, path], capture_output=True)
if output.returncode != 0:
print(
f"Running {ppath(SKATE_BINARY)} {ppath(path)} returned code {output.returncode}"
)
print("--- stderr ---")
print(output.stderr.decode())
print("--------------")
fail()
else:
stdout_file = pathlib.Path(path).with_suffix(".stdout")
process(output.stdout, stdout_file)
def compile_fail(path, errcode):
output = subprocess.run(
[SKATE_BINARY, path], capture_output=True, env={"NO_COLOR": "1"}
)
if output.returncode != errcode:
print(
f"Running {ppath(SKATE_BINARY)} {ppath(path)} returned code {output.returncode} (expected {errcode})"
)
print("--- stderr ---")
print(output.stderr.decode())
print("--------------")
fail()
else:
stderr_file = pathlib.Path(path).with_suffix(".stderr")
process(output.stderr, stderr_file)
for i in glob.glob(RUN_PASS_GLOB, recursive=True):
run_pass(i)
for i in glob.glob(COMPILE_FAIL_GLOB, recursive=True):
compile_fail(i, EXIT_COMPILE_FAIL)
for i in glob.glob(RUN_FAIL_GLOB, recursive=True):
compile_fail(i, EXIT_RUN_FAIL)
if not passing:
exit(1)