From 9576769e0943576ff4dc4cc2a9ba5036616ec462 Mon Sep 17 00:00:00 2001 From: Camden Dixie O'Brien Date: Wed, 4 Mar 2026 20:22:01 +0000 Subject: [PATCH] Implement simple testing module for e2e tests --- e2e/testing.scm | 64 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 e2e/testing.scm diff --git a/e2e/testing.scm b/e2e/testing.scm new file mode 100644 index 0000000..c9a3316 --- /dev/null +++ b/e2e/testing.scm @@ -0,0 +1,64 @@ +(define-module (e2e testing) + #:export (assert define-test run-tests)) + +(use-modules + (sxml simple) + (srfi srfi-1)) + +(define *tests* (make-fluid '())) + +(define (assert condition . args) + (unless condition + (let ((msg (if (null? args) "Assertion failed" (car args)))) + (raise-exception `(assertion-failed . ,msg))))) + +(define-syntax-rule (define-test name body ...) + (fluid-set! + *tests* + (append (fluid-ref *tests*) + (list (cons 'name (lambda () body ...)))))) + +(define (fail-handler ex) + (if (and (pair? ex) (eq? 'assertion-failed (car ex))) + (cons 'fail (cdr ex)) + (cons 'error (format #f "~a" ex)))) + +(define (run-test test) + (cons (car test) + (with-exception-handler fail-handler + (lambda () + ((cdr test)) + 'pass) + #:unwind? #t))) + +(define (fail? result) + (and (pair? (cdr result)) + (eq? 'fail (cadr result)))) + +(define (error? result) + (and (pair? (cdr result)) + (eq? 'error (cadr result)))) + +(define (test-junit-report result) + `(testcase + (@ (name ,(symbol->string (car result)))) + ,@(cond + ((fail? result) `((failure (@ (message ,(cddr result)))))) + ((error? result) `((error (@ (message ,(cddr result)))))) + (#t '())))) + +(define (junit-report results) + (let ((count (length results)) + (fails (length (filter fail? results))) + (errors (length (filter error? results)))) + `(testsuites + (testsuite + (@ (name "wipforth e2e") + (tests ,count) + (failures ,fails) + (errors ,errors)) + ,@(map test-junit-report results))))) + +(define (run-tests) + (let ((results (map run-test (fluid-ref *tests*)))) + (sxml->xml (junit-report results))))