Implement simple testing module for e2e tests
This commit is contained in:
64
e2e/testing.scm
Normal file
64
e2e/testing.scm
Normal file
@@ -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))))
|
||||
Reference in New Issue
Block a user