Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .github/workflows/ci.yaml
Original file line number Diff line number Diff line change
@@ -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
51 changes: 51 additions & 0 deletions test-runner.sh
Original file line number Diff line number Diff line change
@@ -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
38 changes: 38 additions & 0 deletions test-utils.scm
Original file line number Diff line number Diff line change
@@ -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)))