diff --git a/test/test-match-typed.rkt b/test/test-match-typed.rkt index 523bf25..2851fe8 100644 --- a/test/test-match-typed.rkt +++ b/test/test-match-typed.rkt @@ -1,30 +1,47 @@ #lang typed/racket (require xlist/untyped - typed/rackunit) + typed/rackunit + "ck.rkt") + +(define-syntax-rule (check-match v clause result) + (check-equal? (let ([no-match (gensym 'no-match)]) + (match v clause [_ no-match])) + result)) + +(define-syntax-rule (check-not-match v pat) + (let ([no-match (gensym 'no-match)]) + (check-equal? (match v pat [_ no-match]) + no-match))) + +(define-syntax-rule (check-match? v pat) + (check-true (match v [pat #t] [_ #f]))) + +(define-syntax-rule (check-not-match? v pat) + (check-false (match v [pat #t] [_ #f]))) (test-begin "(xlist 1 2 3 4 5)" - (check-true (match '() [(xlist) #t] [_ #f])) - (check-true (match '(1) [(xlist 1) #t] [_ #f])) - (check-true (match '(1 2) [(xlist 1 2) #t] [_ #f])) - (check-true (match '(1 2 3) [(xlist 1 2 3) #t] [_ #f])) - (check-true (match '(1 2 3 4) [(xlist 1 2 3 4) #t] [_ #f])) - (check-true (match '(1 2 3 4 5) [(xlist 1 2 3 4 5) #t] [_ #f])) + (check-match? '() (xlist)) + (check-match? '(1) (xlist 1)) + (check-match? '(1 2) (xlist 1 2)) + (check-match? '(1 2 3) (xlist 1 2 3)) + (check-match? '(1 2 3 4) (xlist 1 2 3 4)) + (check-match? '(1 2 3 4 5) (xlist 1 2 3 4 5)) - (check-false (match '() [(xlist 1) #t] [_ #f])) - (check-false (match '(1) [(xlist 1 2) #t] [_ #f])) - (check-false (match '(1 2) [(xlist 1 2 3) #t] [_ #f])) - (check-false (match '(1 2 3) [(xlist 1 2 3 4) #t] [_ #f])) - (check-false (match '(1 2 3 4) [(xlist 1 2 3 4 5) #t] [_ #f])) - (check-false (match '(1 2 3 4 5) [(xlist 1 2 3 4 5 6) #t] [_ #f])) + (check-not-match? '() (xlist 1)) + (check-not-match? '(1) (xlist 1 2)) + (check-not-match? '(1 2) (xlist 1 2 3)) + (check-not-match? '(1 2 3) (xlist 1 2 3 4)) + (check-not-match? '(1 2 3 4) (xlist 1 2 3 4 5)) + (check-not-match? '(1 2 3 4 5) (xlist 1 2 3 4 5 6)) - (check-false (match '(1) [(xlist) #t] [_ #f])) - (check-false (match '(1 2) [(xlist 1) #t] [_ #f])) - (check-false (match '(1 2 3) [(xlist 1 2) #t] [_ #f])) - (check-false (match '(1 2 3 4) [(xlist 1 2 3) #t] [_ #f])) - (check-false (match '(1 2 3 4 5) [(xlist 1 2 3 4) #t] [_ #f])) - (check-false (match '(1 2 3 4 5 6) [(xlist 1 2 3 4 5) #t] [_ #f])) + (check-not-match? '(1) (xlist)) + (check-not-match? '(1 2) (xlist 1)) + (check-not-match? '(1 2 3) (xlist 1 2)) + (check-not-match? '(1 2 3 4) (xlist 1 2 3)) + (check-not-match? '(1 2 3 4 5) (xlist 1 2 3 4)) + (check-not-match? '(1 2 3 4 5 6) (xlist 1 2 3 4 5)) (void)) ;; Should fail: @@ -36,124 +53,124 @@ (test-begin "(xlist 1 *) and (xlist 1 +) with or witout ^" - (check-true (match '() [(xlist 1 *) #t] [_ #f])) - (check-true (match '(1) [(xlist 1 *) #t] [_ #f])) - (check-true (match '(1 1) [(xlist 1 *) #t] [_ #f])) - (check-true (match '(1 1 1) [(xlist 1 *) #t] [_ #f])) + (check-match? '() (xlist 1 *)) + (check-match? '(1) (xlist 1 *)) + (check-match? '(1 1) (xlist 1 *)) + (check-match? '(1 1 1) (xlist 1 *)) - ; NOT (check-true '() (xlist 1 +)) - (check-true (match '(1) [(xlist 1 +) #t] [_ #f])) - (check-true (match '(1 1) [(xlist 1 +) #t] [_ #f])) - (check-true (match '(1 1 1) [(xlist 1 +) #t] [_ #f])) + (check-not-match? '() (xlist 1 +)) + (check-match? '(1) (xlist 1 +)) + (check-match? '(1 1) (xlist 1 +)) + (check-match? '(1 1 1) (xlist 1 +)) - (check-true (match '() [(xlist 1 ^ *) #t] [_ #f])) - (check-true (match '(1) [(xlist 1 ^ *) #t] [_ #f])) - (check-true (match '(1 1) [(xlist 1 ^ *) #t] [_ #f])) - (check-true (match '(1 1 1) [(xlist 1 ^ *) #t] [_ #f])) + (check-match? '() (xlist 1 ^ *)) + (check-match? '(1) (xlist 1 ^ *)) + (check-match? '(1 1) (xlist 1 ^ *)) + (check-match? '(1 1 1) (xlist 1 ^ *)) - ; NOT (check-true '() (xlist 1 ^ +)) - (check-true (match '(1) [(xlist 1 ^ +) #t] [_ #f])) - (check-true (match '(1 1) [(xlist 1 ^ +) #t] [_ #f])) - (check-true (match '(1 1 1) [(xlist 1 ^ +) #t] [_ #f])) + (check-not-match? '() (xlist 1 ^ +)) + (check-match? '(1) (xlist 1 ^ +)) + (check-match? '(1 1) (xlist 1 ^ +)) + (check-match? '(1 1 1) (xlist 1 ^ +)) (void)) (test-begin "(xlist (? number? n) *) and (xlist (? number? n) +) with or witout ^" - (check-equal? (match '() [(xlist (? number? n) *) n] [_ #f]) '()) - (check-equal? (match '(1) [(xlist (? number? n) *) n] [_ #f]) '(1)) - (check-equal? (match '(1 1) [(xlist (? number? n) *) n] [_ #f]) '(1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) *) n] [_ #f]) '(1 1 1)) + (check-match '() [(xlist (? number? n) *) n] '()) + (check-match '(1) [(xlist (? number? n) *) n] '(1)) + (check-match '(1 1) [(xlist (? number? n) *) n] '(1 1)) + (check-match '(1 1 1) [(xlist (? number? n) *) n] '(1 1 1)) - (check-false (match '() [(xlist (? number? n) +) n] [_ #f])) - (check-equal? (match '(1) [(xlist (? number? n) +) n] [_ #f]) '(1)) - (check-equal? (match '(1 1) [(xlist (? number? n) +) n] [_ #f]) '(1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) +) n] [_ #f]) '(1 1 1)) + (check-not-match '() [(xlist (? number? n) +) n]) + (check-match '(1) [(xlist (? number? n) +) n] '(1)) + (check-match '(1 1) [(xlist (? number? n) +) n] '(1 1)) + (check-match '(1 1 1) [(xlist (? number? n) +) n] '(1 1 1)) - (check-equal? (match '() [(xlist (? number? n) ^ *) n] [_ #f]) '()) - (check-equal? (match '(1) [(xlist (? number? n) ^ *) n] [_ #f]) '(1)) - (check-equal? (match '(1 1) [(xlist (? number? n) ^ *) n] [_ #f]) '(1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ *) n] [_ #f]) '(1 1 1 )) + (check-match '() [(xlist (? number? n) ^ *) n] '()) + (check-match '(1) [(xlist (? number? n) ^ *) n] '(1)) + (check-match '(1 1) [(xlist (? number? n) ^ *) n] '(1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ *) n] '(1 1 1 )) - (check-false (match '() [(xlist (? number? n) ^ +) n] [_ #f])) - (check-equal? (match '(1) [(xlist (? number? n) ^ +) n] [_ #f]) '(1)) - (check-equal? (match '(1 1) [(xlist (? number? n) ^ +) n] [_ #f]) '(1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ +) n] [_ #f]) '(1 1 1)) + (check-not-match '() [(xlist (? number? n) ^ +) n]) + (check-match '(1) [(xlist (? number? n) ^ +) n] '(1)) + (check-match '(1 1) [(xlist (? number? n) ^ +) n] '(1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ +) n] '(1 1 1)) (void)) (test-begin "(xlist (? number? n) *) and (xlist (? number? n) +) something after" - (check-equal? (match '() [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '(() . ())) - (check-equal? (match '(1) [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '((1) . ())) - (check-equal? (match '("b") [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '(() . ("b"))) - (check-equal? (match '(1 "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '((1) . ("b"))) - (check-equal? (match '(1 1 1 "b" "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '((1 1 1) . ("b" "b"))) - (check-equal? (match '(1 1 1) [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '((1 1 1) . ())) - (check-equal? (match '("b" "b" "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '(() . ("b" "b" "b"))) + (check-match '() [(xlist (? number? n) * (? string? s) *) (cons n s)] '(() . ())) + (check-match '(1) [(xlist (? number? n) * (? string? s) *) (cons n s)] '((1) . ())) + (check-match '("b") [(xlist (? number? n) * (? string? s) *) (cons n s)] '(() . ("b"))) + (check-match '(1 "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] '((1) . ("b"))) + (check-match '(1 1 1 "b" "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] '((1 1 1) . ("b" "b"))) + (check-match '(1 1 1) [(xlist (? number? n) * (? string? s) *) (cons n s)] '((1 1 1) . ())) + (check-match '("b" "b" "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] '(() . ("b" "b" "b"))) - (check-false (match '() [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f])) - (check-false (match '(1) [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f])) - (check-false (match '("b") [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f])) - (check-equal? (match '(1 "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f]) '((1) . ("b"))) - (check-equal? (match '(1 1 "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f]) '((1 1) . ("b"))) - (check-equal? (match '(1 "b" "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f]) '((1) . ("b" "b"))) + (check-not-match '() [(xlist (? number? n) + (? string? s) +) (cons n s)]) + (check-not-match '(1) [(xlist (? number? n) + (? string? s) +) (cons n s)]) + (check-not-match '("b") [(xlist (? number? n) + (? string? s) +) (cons n s)]) + (check-match '(1 "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] '((1) . ("b"))) + (check-match '(1 1 "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] '((1 1) . ("b"))) + (check-match '(1 "b" "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] '((1) . ("b" "b"))) - (check-equal? (match '() [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '(() . ())) - (check-equal? (match '(1) [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '((1) . ())) - (check-equal? (match '("b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '(() . ("b"))) - (check-equal? (match '(1 "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '((1) . ("b"))) - (check-equal? (match '(1 1 1 "b" "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '((1 1 1) . ("b" "b"))) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '((1 1 1) . ())) - (check-equal? (match '("b" "b" "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '(() . ("b" "b" "b"))) + (check-match '() [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '(() . ())) + (check-match '(1) [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '((1) . ())) + (check-match '("b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '(() . ("b"))) + (check-match '(1 "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '((1) . ("b"))) + (check-match '(1 1 1 "b" "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '((1 1 1) . ("b" "b"))) + (check-match '(1 1 1) [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '((1 1 1) . ())) + (check-match '("b" "b" "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '(() . ("b" "b" "b"))) - (check-false (match '() [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f])) - (check-false (match '(1) [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f])) - (check-false (match '("b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f])) - (check-equal? (match '(1 "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f]) '((1) . ("b"))) - (check-equal? (match '(1 1 "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f]) '((1 1) . ("b"))) - (check-equal? (match '(1 "b" "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f]) '((1) . ("b" "b"))) + (check-not-match '() [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)]) + (check-not-match '(1) [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)]) + (check-not-match '("b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)]) + (check-match '(1 "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] '((1) . ("b"))) + (check-match '(1 1 "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] '((1 1) . ("b"))) + (check-match '(1 "b" "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] '((1) . ("b" "b"))) (void)) (test-begin "(xlist (? number? n) ^ x +)" - (check-equal? (match '(1 1 1) [(xlist (? number? n) +) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ +) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 0 +) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 1 +) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 2 +) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 3 +) n] [_ #f]) '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) +) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ +) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 0 +) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 1 +) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 2 +) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 3 +) n] '(1 1 1)) (void)) (test-begin "(xlist (? number? n) ^ x - y)" - (check-equal? (match '() [(xlist (? number? n) ^ -) n] [_ #f]) '()) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ -) n] [_ #f]) '(1 1 1)) - (check-equal? (match '() [(xlist (? number? n) ^ 0 -) n] [_ #f]) '()) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 0 -) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 1 -) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 2 -) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 3 -) n] [_ #f]) '(1 1 1)) - (check-equal? (match '() [(xlist (? number? n) ^ - ∞) n] [_ #f]) '()) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ - ∞) n] [_ #f]) '(1 1 1)) - (check-equal? (match '() [(xlist (? number? n) ^ 0 - ∞) n] [_ #f]) '()) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 0 - ∞) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 1 - ∞) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 2 - ∞) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 3 - ∞) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 0 - 5) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 3 - 5) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1 1) [(xlist (? number? n) ^ 0 - 5) n] [_ #f]) '(1 1 1 1)) - (check-equal? (match '(1 1 1 1) [(xlist (? number? n) ^ 3 - 5) n] [_ #f]) '(1 1 1 1)) - (check-equal? (match '(1 1 1 1 1) [(xlist (? number? n) ^ 0 - 5) n] [_ #f]) '(1 1 1 1 1)) - (check-equal? (match '(1 1 1 1 1) [(xlist (? number? n) ^ 3 - 5) n] [_ #f]) '(1 1 1 1 1)) + (check-match '() [(xlist (? number? n) ^ -) n] '()) + (check-match '(1 1 1) [(xlist (? number? n) ^ -) n] '(1 1 1)) + (check-match '() [(xlist (? number? n) ^ 0 -) n] '()) + (check-match '(1 1 1) [(xlist (? number? n) ^ 0 -) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 1 -) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 2 -) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 3 -) n] '(1 1 1)) + (check-match '() [(xlist (? number? n) ^ - ∞) n] '()) + (check-match '(1 1 1) [(xlist (? number? n) ^ - ∞) n] '(1 1 1)) + (check-match '() [(xlist (? number? n) ^ 0 - ∞) n] '()) + (check-match '(1 1 1) [(xlist (? number? n) ^ 0 - ∞) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 1 - ∞) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 2 - ∞) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 3 - ∞) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 0 - 5) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 3 - 5) n] '(1 1 1)) + (check-match '(1 1 1 1) [(xlist (? number? n) ^ 0 - 5) n] '(1 1 1 1)) + (check-match '(1 1 1 1) [(xlist (? number? n) ^ 3 - 5) n] '(1 1 1 1)) + (check-match '(1 1 1 1 1) [(xlist (? number? n) ^ 0 - 5) n] '(1 1 1 1 1)) + (check-match '(1 1 1 1 1) [(xlist (? number? n) ^ 3 - 5) n] '(1 1 1 1 1)) (void)) (test-begin "(xlist (? number? n) ^ x - (? string? s))" - (check-equal? (match '("b") [(xlist (? number? n) ^ - (? string? s)) (cons n s)] [_ #f]) '(() . "b")) - (check-equal? (match '(1 1 1 "b") [(xlist (? number? n) ^ - (? string? s)) (cons n s)] [_ #f]) '((1 1 1) . "b")) - (check-equal? (match '("b") [(xlist (? number? n) ^ 0 - (? string? s)) (cons n s)] [_ #f]) '(() . "b")) - (check-equal? (match '(1 1 1 "b") [(xlist (? number? n) ^ 0 - (? string? s)) (cons n s)] [_ #f]) '((1 1 1) . "b")) - (check-equal? (match '(1 1 1 "b") [(xlist (? number? n) ^ 1 - (? string? s)) (cons n s)] [_ #f]) '((1 1 1) . "b")) - (check-equal? (match '(1 1 1 "b") [(xlist (? number? n) ^ 2 - (? string? s)) (cons n s)] [_ #f]) '((1 1 1) . "b")) + (check-match '("b") [(xlist (? number? n) ^ - (? string? s)) (cons n s)] '(() . "b")) + (check-match '(1 1 1 "b") [(xlist (? number? n) ^ - (? string? s)) (cons n s)] '((1 1 1) . "b")) + (check-match '("b") [(xlist (? number? n) ^ 0 - (? string? s)) (cons n s)] '(() . "b")) + (check-match '(1 1 1 "b") [(xlist (? number? n) ^ 0 - (? string? s)) (cons n s)] '((1 1 1) . "b")) + (check-match '(1 1 1 "b") [(xlist (? number? n) ^ 1 - (? string? s)) (cons n s)] '((1 1 1) . "b")) + (check-match '(1 1 1 "b") [(xlist (? number? n) ^ 2 - (? string? s)) (cons n s)] '((1 1 1) . "b")) (void)) diff --git a/test/test-match.rkt b/test/test-match.rkt index f01f5ef..b9ccd01 100644 --- a/test/test-match.rkt +++ b/test/test-match.rkt @@ -3,28 +3,44 @@ (require xlist/untyped rackunit) +(define-syntax-rule (check-match v clause result) + (check-equal? (let ([no-match (gensym 'no-match)]) + (match v clause [_ no-match])) + result)) + +(define-syntax-rule (check-not-match v pat) + (let ([no-match (gensym 'no-match)]) + (check-equal? (match v pat [_ no-match]) + no-match))) + +(define-syntax-rule (check-match? v pat) + (check-true (match v [pat #t] [_ #f]))) + +(define-syntax-rule (check-not-match? v pat) + (check-false (match v [pat #t] [_ #f]))) + (test-begin "(xlist 1 2 3 4 5)" - (check-true (match '() [(xlist) #t] [_ #f])) - (check-true (match '(1) [(xlist 1) #t] [_ #f])) - (check-true (match '(1 2) [(xlist 1 2) #t] [_ #f])) - (check-true (match '(1 2 3) [(xlist 1 2 3) #t] [_ #f])) - (check-true (match '(1 2 3 4) [(xlist 1 2 3 4) #t] [_ #f])) - (check-true (match '(1 2 3 4 5) [(xlist 1 2 3 4 5) #t] [_ #f])) + (check-match? '() (xlist)) + (check-match? '(1) (xlist 1)) + (check-match? '(1 2) (xlist 1 2)) + (check-match? '(1 2 3) (xlist 1 2 3)) + (check-match? '(1 2 3 4) (xlist 1 2 3 4)) + (check-match? '(1 2 3 4 5) (xlist 1 2 3 4 5)) - (check-false (match '() [(xlist 1) #t] [_ #f])) - (check-false (match '(1) [(xlist 1 2) #t] [_ #f])) - (check-false (match '(1 2) [(xlist 1 2 3) #t] [_ #f])) - (check-false (match '(1 2 3) [(xlist 1 2 3 4) #t] [_ #f])) - (check-false (match '(1 2 3 4) [(xlist 1 2 3 4 5) #t] [_ #f])) - (check-false (match '(1 2 3 4 5) [(xlist 1 2 3 4 5 6) #t] [_ #f])) + (check-not-match? '() (xlist 1)) + (check-not-match? '(1) (xlist 1 2)) + (check-not-match? '(1 2) (xlist 1 2 3)) + (check-not-match? '(1 2 3) (xlist 1 2 3 4)) + (check-not-match? '(1 2 3 4) (xlist 1 2 3 4 5)) + (check-not-match? '(1 2 3 4 5) (xlist 1 2 3 4 5 6)) - (check-false (match '(1) [(xlist) #t] [_ #f])) - (check-false (match '(1 2) [(xlist 1) #t] [_ #f])) - (check-false (match '(1 2 3) [(xlist 1 2) #t] [_ #f])) - (check-false (match '(1 2 3 4) [(xlist 1 2 3) #t] [_ #f])) - (check-false (match '(1 2 3 4 5) [(xlist 1 2 3 4) #t] [_ #f])) - (check-false (match '(1 2 3 4 5 6) [(xlist 1 2 3 4 5) #t] [_ #f])) + (check-not-match? '(1) (xlist)) + (check-not-match? '(1 2) (xlist 1)) + (check-not-match? '(1 2 3) (xlist 1 2)) + (check-not-match? '(1 2 3 4) (xlist 1 2 3)) + (check-not-match? '(1 2 3 4 5) (xlist 1 2 3 4)) + (check-not-match? '(1 2 3 4 5 6) (xlist 1 2 3 4 5)) (void)) ;; Should fail: @@ -36,124 +52,124 @@ (test-begin "(xlist 1 *) and (xlist 1 +) with or witout ^" - (check-true (match '() [(xlist 1 *) #t] [_ #f])) - (check-true (match '(1) [(xlist 1 *) #t] [_ #f])) - (check-true (match '(1 1) [(xlist 1 *) #t] [_ #f])) - (check-true (match '(1 1 1) [(xlist 1 *) #t] [_ #f])) + (check-match? '() (xlist 1 *)) + (check-match? '(1) (xlist 1 *)) + (check-match? '(1 1) (xlist 1 *)) + (check-match? '(1 1 1) (xlist 1 *)) - ; NOT (check-true '() (xlist 1 +)) - (check-true (match '(1) [(xlist 1 +) #t] [_ #f])) - (check-true (match '(1 1) [(xlist 1 +) #t] [_ #f])) - (check-true (match '(1 1 1) [(xlist 1 +) #t] [_ #f])) + (check-not-match? '() (xlist 1 +)) + (check-match? '(1) (xlist 1 +)) + (check-match? '(1 1) (xlist 1 +)) + (check-match? '(1 1 1) (xlist 1 +)) - (check-true (match '() [(xlist 1 ^ *) #t] [_ #f])) - (check-true (match '(1) [(xlist 1 ^ *) #t] [_ #f])) - (check-true (match '(1 1) [(xlist 1 ^ *) #t] [_ #f])) - (check-true (match '(1 1 1) [(xlist 1 ^ *) #t] [_ #f])) + (check-match? '() (xlist 1 ^ *)) + (check-match? '(1) (xlist 1 ^ *)) + (check-match? '(1 1) (xlist 1 ^ *)) + (check-match? '(1 1 1) (xlist 1 ^ *)) - ; NOT (check-true '() (xlist 1 ^ +)) - (check-true (match '(1) [(xlist 1 ^ +) #t] [_ #f])) - (check-true (match '(1 1) [(xlist 1 ^ +) #t] [_ #f])) - (check-true (match '(1 1 1) [(xlist 1 ^ +) #t] [_ #f])) + (check-not-match? '() (xlist 1 ^ +)) + (check-match? '(1) (xlist 1 ^ +)) + (check-match? '(1 1) (xlist 1 ^ +)) + (check-match? '(1 1 1) (xlist 1 ^ +)) (void)) (test-begin "(xlist (? number? n) *) and (xlist (? number? n) +) with or witout ^" - (check-equal? (match '() [(xlist (? number? n) *) n] [_ #f]) '()) - (check-equal? (match '(1) [(xlist (? number? n) *) n] [_ #f]) '(1)) - (check-equal? (match '(1 1) [(xlist (? number? n) *) n] [_ #f]) '(1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) *) n] [_ #f]) '(1 1 1)) + (check-match '() [(xlist (? number? n) *) n] '()) + (check-match '(1) [(xlist (? number? n) *) n] '(1)) + (check-match '(1 1) [(xlist (? number? n) *) n] '(1 1)) + (check-match '(1 1 1) [(xlist (? number? n) *) n] '(1 1 1)) - (check-false (match '() [(xlist (? number? n) +) n] [_ #f])) - (check-equal? (match '(1) [(xlist (? number? n) +) n] [_ #f]) '(1)) - (check-equal? (match '(1 1) [(xlist (? number? n) +) n] [_ #f]) '(1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) +) n] [_ #f]) '(1 1 1)) + (check-not-match '() [(xlist (? number? n) +) n]) + (check-match '(1) [(xlist (? number? n) +) n] '(1)) + (check-match '(1 1) [(xlist (? number? n) +) n] '(1 1)) + (check-match '(1 1 1) [(xlist (? number? n) +) n] '(1 1 1)) - (check-equal? (match '() [(xlist (? number? n) ^ *) n] [_ #f]) '()) - (check-equal? (match '(1) [(xlist (? number? n) ^ *) n] [_ #f]) '(1)) - (check-equal? (match '(1 1) [(xlist (? number? n) ^ *) n] [_ #f]) '(1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ *) n] [_ #f]) '(1 1 1 )) + (check-match '() [(xlist (? number? n) ^ *) n] '()) + (check-match '(1) [(xlist (? number? n) ^ *) n] '(1)) + (check-match '(1 1) [(xlist (? number? n) ^ *) n] '(1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ *) n] '(1 1 1 )) - (check-false (match '() [(xlist (? number? n) ^ +) n] [_ #f])) - (check-equal? (match '(1) [(xlist (? number? n) ^ +) n] [_ #f]) '(1)) - (check-equal? (match '(1 1) [(xlist (? number? n) ^ +) n] [_ #f]) '(1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ +) n] [_ #f]) '(1 1 1)) + (check-not-match '() [(xlist (? number? n) ^ +) n]) + (check-match '(1) [(xlist (? number? n) ^ +) n] '(1)) + (check-match '(1 1) [(xlist (? number? n) ^ +) n] '(1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ +) n] '(1 1 1)) (void)) (test-begin "(xlist (? number? n) *) and (xlist (? number? n) +) something after" - (check-equal? (match '() [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '(() . ())) - (check-equal? (match '(1) [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '((1) . ())) - (check-equal? (match '("b") [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '(() . ("b"))) - (check-equal? (match '(1 "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '((1) . ("b"))) - (check-equal? (match '(1 1 1 "b" "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '((1 1 1) . ("b" "b"))) - (check-equal? (match '(1 1 1) [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '((1 1 1) . ())) - (check-equal? (match '("b" "b" "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] [_ #f]) '(() . ("b" "b" "b"))) + (check-match '() [(xlist (? number? n) * (? string? s) *) (cons n s)] '(() . ())) + (check-match '(1) [(xlist (? number? n) * (? string? s) *) (cons n s)] '((1) . ())) + (check-match '("b") [(xlist (? number? n) * (? string? s) *) (cons n s)] '(() . ("b"))) + (check-match '(1 "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] '((1) . ("b"))) + (check-match '(1 1 1 "b" "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] '((1 1 1) . ("b" "b"))) + (check-match '(1 1 1) [(xlist (? number? n) * (? string? s) *) (cons n s)] '((1 1 1) . ())) + (check-match '("b" "b" "b") [(xlist (? number? n) * (? string? s) *) (cons n s)] '(() . ("b" "b" "b"))) - (check-false (match '() [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f])) - (check-false (match '(1) [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f])) - (check-false (match '("b") [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f])) - (check-equal? (match '(1 "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f]) '((1) . ("b"))) - (check-equal? (match '(1 1 "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f]) '((1 1) . ("b"))) - (check-equal? (match '(1 "b" "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] [_ #f]) '((1) . ("b" "b"))) + (check-not-match '() [(xlist (? number? n) + (? string? s) +) (cons n s)]) + (check-not-match '(1) [(xlist (? number? n) + (? string? s) +) (cons n s)]) + (check-not-match '("b") [(xlist (? number? n) + (? string? s) +) (cons n s)]) + (check-match '(1 "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] '((1) . ("b"))) + (check-match '(1 1 "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] '((1 1) . ("b"))) + (check-match '(1 "b" "b") [(xlist (? number? n) + (? string? s) +) (cons n s)] '((1) . ("b" "b"))) - (check-equal? (match '() [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '(() . ())) - (check-equal? (match '(1) [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '((1) . ())) - (check-equal? (match '("b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '(() . ("b"))) - (check-equal? (match '(1 "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '((1) . ("b"))) - (check-equal? (match '(1 1 1 "b" "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '((1 1 1) . ("b" "b"))) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '((1 1 1) . ())) - (check-equal? (match '("b" "b" "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] [_ #f]) '(() . ("b" "b" "b"))) + (check-match '() [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '(() . ())) + (check-match '(1) [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '((1) . ())) + (check-match '("b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '(() . ("b"))) + (check-match '(1 "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '((1) . ("b"))) + (check-match '(1 1 1 "b" "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '((1 1 1) . ("b" "b"))) + (check-match '(1 1 1) [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '((1 1 1) . ())) + (check-match '("b" "b" "b") [(xlist (? number? n) ^ * (? string? s) ^ *) (cons n s)] '(() . ("b" "b" "b"))) - (check-false (match '() [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f])) - (check-false (match '(1) [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f])) - (check-false (match '("b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f])) - (check-equal? (match '(1 "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f]) '((1) . ("b"))) - (check-equal? (match '(1 1 "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f]) '((1 1) . ("b"))) - (check-equal? (match '(1 "b" "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] [_ #f]) '((1) . ("b" "b"))) + (check-not-match '() [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)]) + (check-not-match '(1) [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)]) + (check-not-match '("b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)]) + (check-match '(1 "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] '((1) . ("b"))) + (check-match '(1 1 "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] '((1 1) . ("b"))) + (check-match '(1 "b" "b") [(xlist (? number? n) ^ + (? string? s) ^ +) (cons n s)] '((1) . ("b" "b"))) (void)) (test-begin "(xlist (? number? n) ^ x +)" - (check-equal? (match '(1 1 1) [(xlist (? number? n) +) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ +) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 0 +) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 1 +) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 2 +) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 3 +) n] [_ #f]) '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) +) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ +) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 0 +) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 1 +) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 2 +) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 3 +) n] '(1 1 1)) (void)) (test-begin "(xlist (? number? n) ^ x - y)" - (check-equal? (match '() [(xlist (? number? n) ^ -) n] [_ #f]) '()) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ -) n] [_ #f]) '(1 1 1)) - (check-equal? (match '() [(xlist (? number? n) ^ 0 -) n] [_ #f]) '()) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 0 -) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 1 -) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 2 -) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 3 -) n] [_ #f]) '(1 1 1)) - (check-equal? (match '() [(xlist (? number? n) ^ - ∞) n] [_ #f]) '()) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ - ∞) n] [_ #f]) '(1 1 1)) - (check-equal? (match '() [(xlist (? number? n) ^ 0 - ∞) n] [_ #f]) '()) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 0 - ∞) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 1 - ∞) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 2 - ∞) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 3 - ∞) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 0 - 5) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1) [(xlist (? number? n) ^ 3 - 5) n] [_ #f]) '(1 1 1)) - (check-equal? (match '(1 1 1 1) [(xlist (? number? n) ^ 0 - 5) n] [_ #f]) '(1 1 1 1)) - (check-equal? (match '(1 1 1 1) [(xlist (? number? n) ^ 3 - 5) n] [_ #f]) '(1 1 1 1)) - (check-equal? (match '(1 1 1 1 1) [(xlist (? number? n) ^ 0 - 5) n] [_ #f]) '(1 1 1 1 1)) - (check-equal? (match '(1 1 1 1 1) [(xlist (? number? n) ^ 3 - 5) n] [_ #f]) '(1 1 1 1 1)) + (check-match '() [(xlist (? number? n) ^ -) n] '()) + (check-match '(1 1 1) [(xlist (? number? n) ^ -) n] '(1 1 1)) + (check-match '() [(xlist (? number? n) ^ 0 -) n] '()) + (check-match '(1 1 1) [(xlist (? number? n) ^ 0 -) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 1 -) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 2 -) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 3 -) n] '(1 1 1)) + (check-match '() [(xlist (? number? n) ^ - ∞) n] '()) + (check-match '(1 1 1) [(xlist (? number? n) ^ - ∞) n] '(1 1 1)) + (check-match '() [(xlist (? number? n) ^ 0 - ∞) n] '()) + (check-match '(1 1 1) [(xlist (? number? n) ^ 0 - ∞) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 1 - ∞) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 2 - ∞) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 3 - ∞) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 0 - 5) n] '(1 1 1)) + (check-match '(1 1 1) [(xlist (? number? n) ^ 3 - 5) n] '(1 1 1)) + (check-match '(1 1 1 1) [(xlist (? number? n) ^ 0 - 5) n] '(1 1 1 1)) + (check-match '(1 1 1 1) [(xlist (? number? n) ^ 3 - 5) n] '(1 1 1 1)) + (check-match '(1 1 1 1 1) [(xlist (? number? n) ^ 0 - 5) n] '(1 1 1 1 1)) + (check-match '(1 1 1 1 1) [(xlist (? number? n) ^ 3 - 5) n] '(1 1 1 1 1)) (void)) (test-begin "(xlist (? number? n) ^ x - (? string? s))" - (check-equal? (match '("b") [(xlist (? number? n) ^ - (? string? s)) (cons n s)] [_ #f]) '(() . "b")) - (check-equal? (match '(1 1 1 "b") [(xlist (? number? n) ^ - (? string? s)) (cons n s)] [_ #f]) '((1 1 1) . "b")) - (check-equal? (match '("b") [(xlist (? number? n) ^ 0 - (? string? s)) (cons n s)] [_ #f]) '(() . "b")) - (check-equal? (match '(1 1 1 "b") [(xlist (? number? n) ^ 0 - (? string? s)) (cons n s)] [_ #f]) '((1 1 1) . "b")) - (check-equal? (match '(1 1 1 "b") [(xlist (? number? n) ^ 1 - (? string? s)) (cons n s)] [_ #f]) '((1 1 1) . "b")) - (check-equal? (match '(1 1 1 "b") [(xlist (? number? n) ^ 2 - (? string? s)) (cons n s)] [_ #f]) '((1 1 1) . "b")) + (check-match '("b") [(xlist (? number? n) ^ - (? string? s)) (cons n s)] '(() . "b")) + (check-match '(1 1 1 "b") [(xlist (? number? n) ^ - (? string? s)) (cons n s)] '((1 1 1) . "b")) + (check-match '("b") [(xlist (? number? n) ^ 0 - (? string? s)) (cons n s)] '(() . "b")) + (check-match '(1 1 1 "b") [(xlist (? number? n) ^ 0 - (? string? s)) (cons n s)] '((1 1 1) . "b")) + (check-match '(1 1 1 "b") [(xlist (? number? n) ^ 1 - (? string? s)) (cons n s)] '((1 1 1) . "b")) + (check-match '(1 1 1 "b") [(xlist (? number? n) ^ 2 - (? string? s)) (cons n s)] '((1 1 1) . "b")) (void))