(import (scheme base) (only (csc testing) define-test errorf subtest) (csc match)) (define-test (test-match t) (define-record-type (test-case name expr want) test-case? (name name) (expr expr) (want want)) (let ((tests (list (test-case "cond" (match 3 ((! 0) 0) ((! 1) 1) ((! 2) 2) ((! 3) 3) (_ 4)) 3) (test-case "match-list" (match '(1 2 3) ('() 0) (((! 1) (! 2)) 1) (((! 1) (! 2) (! 3)) 2) (((! 1) (! 2) (! 3) (! 4)) 3) (_ 4)) 2) (test-case "binding" (match '(1 2 3) (((! 1) x (! 3)) x)) 2) (test-case "destructuring" (match '(1 2 3) ('() 0) ((head . _) head)) 1) (test-case "ignore" (match '(1 2 3) ((_ _ _ _) 0) (((! 2) _ _) 1) (((! 1) _ _) 2) (_ 3)) 2) (test-case "improper list" (match '(1 2 3) (((! 2) . _) 1) (((! 1) . x) (car x)) (_ 3)) 2)))) (for-each (lambda (tc) (subtest t (name tc) (unless (equal? (expr tc) (want tc)) (errorf t "match = {}, want {}." (expr tc) (want tc))))) tests)))