]> Witch of Git - ivy/commitdiff
[tools] Add tools/test.py as the project test runner develop
authorCassie Jones <code@witchoflight.com>
Sun, 7 Feb 2021 08:30:08 +0000 (03:30 -0500)
committerCassie Jones <code@witchoflight.com>
Sun, 7 Feb 2021 08:30:08 +0000 (03:30 -0500)
README.md
tools/test.py [new file with mode: 0755]

index 0d66851a42213ef27b6e3ca0c26fc6614127ec59..f9d7df2fe9e31941e46225ee03d2af2ad3b42789 100644 (file)
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ developed as an educational project to learn more about compiling functional
 languages, and compiling without going through frameworks like LLVM that handle
 the backend. It currently supports x64, and requires clang as an assembler.
 
 languages, and compiling without going through frameworks like LLVM that handle
 the backend. It currently supports x64, and requires clang as an assembler.
 
-Setup:
+## Setup
 
 Running the compiler requires the Ivy runtime be on the linker search path.
 Build the runtime:
 
 Running the compiler requires the Ivy runtime be on the linker search path.
 Build the runtime:
@@ -32,3 +32,18 @@ while simultaneously doing pretty-printing of debug output.
 
 To get pretty-printed debug output on a compiled binary, use `tools/trace.py`
 to run it.
 
 To get pretty-printed debug output on a compiled binary, use `tools/trace.py`
 to run it.
+
+## Testing
+
+You can use `tools/test.py` to run all of the project tests. It will ensure
+that the compiler and runtime are properly built before running any filetests.
+
+Filetests are written to be run by `tools/lit.py`, and checked with
+`filecheck`. See filetests in the `tests/` directory for examples.
+
+Recommended `.git/hooks/pre-commit` script:
+```bash
+#!/bin/bash
+set -e
+tools/test.py
+```
diff --git a/tools/test.py b/tools/test.py
new file mode 100755 (executable)
index 0000000..bf7a2fb
--- /dev/null
@@ -0,0 +1,105 @@
+#!/usr/bin/env python3
+import argparse
+import os
+import subprocess
+import sys
+from pathlib import Path
+
+from fmt import blue, yellow
+
+ROOT = Path(__file__).parent.parent
+
+
+def header(msg):
+    print(blue(msg))
+
+
+def label(msg):
+    print(yellow(msg))
+
+
+def cmd(*args):
+    print(" ".join(args))
+    subprocess.run(args, check=True)
+
+
+def main():
+    parser = argparse.ArgumentParser(
+        description="""Run tests for the project
+
+If no flags are specified, run all tests.
+"""
+    )
+    parser.add_argument("--compiler", action="store_true")
+    parser.add_argument("--runtime", action="store_true")
+    parser.add_argument("--filetest", action="store_true")
+    parser.add_argument("--python", action="store_true")
+    args = parser.parse_args()
+
+    do_all = not any(vars(args).values())
+    if do_all:
+        for k in vars(args):
+            vars(args)[k] = True
+
+    os.chdir(ROOT)
+
+    # Building and testing the compiler
+    if args.compiler:
+        header("Compiler...")
+
+        label("Format...")
+        cmd("cargo", "fmt", "--", "--check")
+
+        label("Test...")
+        cmd("cargo", "test", "--quiet")
+
+        if args.filetest:
+            label("Build...")
+            cmd("cargo", "build", "--release", "--all")
+    elif args.filetest:
+        header("Build compiler...")
+        cmd("cargo", "build", "--release", "--all")
+
+    # Building and testing the runtime
+    os.chdir("rt")
+    if args.runtime:
+        header("Runtime...")
+
+        label("Format...")
+        cmd("cargo", "fmt", "--", "--check")
+
+        label("Test...")
+        cmd("cargo", "test", "--quiet")
+
+        if args.filetest:
+            label("Build...")
+            cmd("cargo", "build", "--release", "--all")
+    elif args.filetest:
+        header("Build runtime...")
+        cmd("cargo", "build", "--release", "--all")
+    os.chdir(ROOT)
+
+    # Filetests
+    if args.filetest:
+        header("Filetests...")
+
+        label("Lit...")
+        cmd("tools/lit.py", "ivy-examples/", "test/")
+
+    # Linting the Python scripts
+    if args.python:
+        header("Python...")
+
+        label("Black...")
+        cmd("black", "test/", "--check", "--diff", "--color")
+
+        label("isort...")
+        cmd("isort", "test/", "--check", "--diff", "--color")
+
+
+if __name__ == "__main__":
+    try:
+        main()
+    except Exception as e:
+        print(e)
+        sys.exit(1)