X-Git-Url: https://git.lukelau.me/?p=scheme.git;a=blobdiff_plain;f=tests.scm;h=ecee99eed962aa94ea39ed8c0f16f4b9c32bc4fa;hp=4e14fb6ab8ee3634b1fce5be5166d55fe8455d96;hb=8e106ca13666680051f91ab3f49ce2bd7e19ead7;hpb=89ef32141732e6d0bbfc7484b465844b62d8d139 diff --git a/tests.scm b/tests.scm index 4e14fb6..ecee99e 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,20 +47,36 @@ (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))) -(test (data-tors (data-layout '(data A - (foo Int Bool) +(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)))) - '((foo . (constructor . (abs Int (abs Bool A)))) - (foo~0 . (0 . (abs A Int))) - (foo~1 . (1 . (abs A Bool))) - (bar . (constructor . (abs Bool A))) - (bar~0 . (0 . (abs A Bool))))) - -(test (data-tors-env - (data-layout '(data A - (foo Int Bool) + '((foo (A foo constructor) + abs Int (abs Bool A)) + (foo~0 (A foo 0) abs A Int) + (foo~1 (A foo 1) abs A Bool) + (bar (A bar constructor) abs Bool A) + (bar~0 (A bar 0) abs A Bool))) + +(test (data-tors-type-env + '(A . ((foo Int Bool) (bar Bool)))) '((foo . (abs Int (abs Bool A))) (foo~0 . (abs A Int)) @@ -62,6 +84,20 @@ (bar . (abs Bool A)) (bar~0 . (abs A Bool)))) +(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))) + +(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)) @@ -119,9 +155,7 @@ (test-types (typecheck - '((data A - [foo Int] - [bar Bool]) + '((data A [foo Int]) (let ([x (foo 42)] [(foo y) x]) x))) @@ -129,23 +163,13 @@ (test-types (typecheck - '((data A - [foo Int] - [bar Bool]) + '((data A [foo Int]) (let ([x (foo 42)] [(foo y) x]) y))) 'Int) - ; pattern matching -(test (let-bindings '(let ([(foo x) a]) x)) - '((x (foo~0 a)))) - -(test (let-bindings '(let ([x (foo 42)] [(foo y) x]) x)) - '((x (foo 42)) - (y (foo~0 x)))) - ; type annotations (test (annotate-types @@ -154,9 +178,9 @@ (- y x)))) '((let () - ((let ((x 42 : Int) - (y ((((+ : (abs Int (abs Int Int))) (1 : Int)) : (abs Int Int)) (x : Int)) : Int)) - (((((- : (abs Int (abs Int Int))) (y : Int)) : (abs Int Int)) (x : Int)) : Int)))))) + ((let ((x (42 : Int)) + (y (((+ : (abs Int (abs Int Int))) (1 : Int) (x : Int)) : Int))) + (((- : (abs Int (abs Int Int))) (y : Int) (x : Int)) : Int)) : Int)) : Int)) (test-expr '(+ 1 2) 3) (test-expr '(bool->int (= 2 0)) 0) @@ -224,3 +248,27 @@ ;; (print "b") ;; (f (- m 1))))]) ;; (f 10))) "ababababab") + + ; adts and pattern matching + +(test-prog '((data A [foo Bool Int]) + (let ([(foo x y) (foo (= 3 3) 42)]) + y)) + 42) + +(test-exception (expand-pattern-matches + '((data A [foo Int] + [bar Bool]) + (let ([(foo x) (foo 0)]) x)))) + +(test-prog '((data A [foo Int]) + (let ([x (foo 42)]) + (let ([(foo y) x]) + (+ 1 y)))) + 43) + +(test-prog '((data A [foo Int]) + (data B [bar A]) + (let ([(bar (foo x)) (bar (foo 42))]) + x)) + 42)