diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..350cfd0 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,17 @@ +name: Continuous Integration + +on: + push: + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Install MIT Scheme + run: sudo apt-get install mit-scheme + + - name: Run All Tests + run: bash test-runner.sh diff --git a/test-runner.sh b/test-runner.sh new file mode 100644 index 0000000..c29213d --- /dev/null +++ b/test-runner.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +set -e + +GREEN="\033[0;32m" +RED="\033[0;31m" +RESET="\033[0m" + +echo +echo "Running all Scheme tests..." + +total_tests=0 +total_passed=0 +total_failed=0 + +for project in */; do + test_dir="${project}tests" + if [ -d "$test_dir" ]; then + for test_file in "$test_dir"/*.scm; do + if [ -f "$test_file" ]; then + + output=$(mit-scheme --batch-mode --load "$test_file" 2>&1) + + if echo "$output" | grep -q "Assertion failed"; then + echo "$output" + fi + + passed=$(echo "$output" | grep "Passed:" | awk '{print $2}') + failed=$(echo "$output" | grep "Failed:" | awk '{print $2}') + count=$(echo "$output" | grep "Total tests:" | awk '{print $3}') + + total_tests=$((total_tests + count)) + total_passed=$((total_passed + passed)) + total_failed=$((total_failed + failed)) + fi + done + fi +done + +echo +echo "==============================" +echo -e "Total Passed: ${GREEN}${total_passed}${RESET}" +echo -e "Total Failed: ${RED}${total_failed}${RESET}" +echo -e "Total Tests: ${total_tests}" +echo "==============================" + +if [ "$total_failed" -gt 0 ]; then + exit 1 +else + exit 0 +fi diff --git a/test-utils.scm b/test-utils.scm new file mode 100644 index 0000000..106e906 --- /dev/null +++ b/test-utils.scm @@ -0,0 +1,38 @@ +(define test-name "") +(define test-results '()) + +(define (initialize-test name) + (set! test-name name) + (set! test-results '())) + +(define (assert-equal expected actual) + (let ((result (equal? expected actual))) + (set! test-results (cons result test-results)) + (if result + #t + (begin + (display "\nAssertion failed in \"") + (display test-name) (display "\":\n") + + (display " Expected: ") (write expected) (newline) + (display " Got: ") (write actual) (newline))) + result)) + +(define (count pred lst) + (if (null? lst) + 0 + (+ (if (pred (car lst)) 1 0) + (count pred (cdr lst)) + ))) + +(define (end-test) + (let* ((total (length test-results)) + (passed (count (lambda (x) x) test-results)) + (failed (- total passed))) + (newline) + (display "Finished running \"") (display test-name) (display "\": \n") + (display " Total tests: ") (write total) (newline) + (display " Passed: ") (write passed) (newline) + (display " Failed: ") (write failed) (newline) + (newline) + (exit)))