X-Git-Url: http://git.lukelau.me/?p=scheme.git;a=blobdiff_plain;f=tests.scm;h=fa5b195e1b2575c4d14f9e385c854aad53dd0823;hp=bcd878a11dfccb8368d930931d5ad00721d8c626;hb=006b94f5a24a794665788737fec8d54086284317;hpb=c4a5f8ab1efce20f0e1181ffe34639facb19594a diff --git a/tests.scm b/tests.scm index bcd878a..fa5b195 100644 --- a/tests.scm +++ b/tests.scm @@ -7,7 +7,13 @@ (format "test failed:\nexpected: ~a\nactual: ~a" expected actual)))) -(define (test . xs) (apply test-f (cons equal? xs))) +(define-syntax test + (syntax-rules () + ((_ a e) + (begin + (display (quote a)) + (newline) + (test-f equal? a e))))) (define-syntax test-types (syntax-rules () @@ -30,7 +36,7 @@ (display prog) (newline) (compile-to-binary prog "/tmp/test-prog" host-os) - (test (system "/tmp/test-prog") exit-code)) + (test-f equal? (system "/tmp/test-prog") exit-code)) (define (test-expr prog exit-code) (test-prog (list prog) exit-code)) @@ -41,7 +47,24 @@ (compile-to-binary prog "/tmp/test-prog" host-os) (system "/tmp/test-prog > /tmp/test-output.txt") (let ((str (read-file "/tmp/test-output.txt"))) - (test str output))) + (test-f equal? str output))) + +(define-syntax test-exception + (syntax-rules () + ((_ f) + (begin + (display (quote f)) + (newline) + (call/cc (lambda (k) + (with-exception-handler + (lambda (x) + (when (eqv? 'no-exception x) + (error #f "test failed: no exception thrown")) + (k)) + (lambda () + (begin + f + (raise 'no-exception)))))))))) (test (data-tors '(A . ((foo Int Bool) (bar Bool)))) @@ -61,11 +84,19 @@ (bar . (abs Bool A)) (bar~0 . (abs A Bool)))) -(test (expand-pattern-matches '(let ([(foo x y) (foo 123 234)] [z (f 123)]) x)) - '(let ([x (foo~0 (foo 123 234))] +(test (expand-pattern-matches + '((data A (foo Int Int)) + (let ([(foo x y) (foo 123 234)] [z (f 123)]) x))) + '((data A (foo Int Int)) + (let ([x (foo~0 (foo 123 234))] [y (foo~1 (foo 123 234))] [z (f 123)]) - x)) + x))) + +(test-exception + (expand-pattern-matches '((data A (foo Int Int)) + (let ([(foo x) (foo 123 234)]) + x)))) (test-types (typecheck '((lambda (x) (+ ((lambda (y) (x y 3)) 5) 2)))) '(abs (abs Int (abs Int Int)) Int))