test-constructor3.rkt (2604B)
1 #lang typed/racket 2 3 (require phc-adt phc-toolkit type-expander typed/rackunit) 4 (adt-init) 5 6 ;; define-constructor 7 (define-constructor tag0 :) 8 (define-constructor tag1 : Number) 9 (define-constructor tag2 : Number String) 10 (define-constructor tag3 : Number String 'c) 11 12 ;; Type expander 13 (check-equal?: (constructor-values (ann (constructor tag0) tag0)) 14 '()) 15 (check-equal?: (constructor-values (ann (constructor tag1 1) tag1)) 16 '(1)) 17 (check-equal?: (constructor-values (ann (constructor tag2 1 "b") tag2)) 18 '(1 "b")) 19 (check-equal?: (constructor-values 20 (ann (constructor tag3 1 "b" (ann 'c 'c)) tag3)) 21 '(1 "b" c)) 22 23 ;; Call 24 (check-equal?: (constructor-values (ann (tag0) (constructor tag0))) 25 '()) 26 (check-equal?: (constructor-values (ann (tag1 1) (constructor tag1 Number))) 27 '(1)) 28 (check-equal?: (constructor-values 29 (ann (tag2 1 "b") (constructor tag2 Number String))) 30 '(1 "b")) 31 (check-equal?: (constructor-values 32 (ann (tag3 1 "b" 'c) (constructor tag3 Number String 'c))) 33 '(1 "b" c)) 34 35 ;; Id 36 (check-not-exn (λ () (ann tag0 (→ (constructor tag0))))) 37 (check-not-exn (λ () (ann tag1 (→ Number (constructor tag1 Number))))) 38 (check-not-exn 39 (λ () (ann tag2 (→ Number String (constructor tag2 Number String))))) 40 (check-not-exn 41 (λ () (ann tag3 (→ Number String 'c (constructor tag3 Number String 'c))))) 42 43 ;; Match expander 44 (check-equal?: (ann (match (constructor tag0) [(tag0) #t]) #t) 45 #t) 46 (check-equal?: (ann (match (constructor tag1 1) [(tag1 x) (list x)]) 47 (List Number)) 48 '(1)) 49 (check-equal?: (ann (match (constructor tag2 1 "b") [(tag2 x y) (list y x)]) 50 (List String Number)) 51 '("b" 1)) 52 (check-equal?: (ann (match (constructor tag3 1 "b" (ann 'c 'c)) 53 [(tag3 x y z) (list z y x)]) 54 (List 'c String Number)) 55 '(c "b" 1)) 56 57 ;; Match expander which single pattern 58 (check-equal?: (ann (match (constructor tag0) [(tag0 #:rest whole) whole]) Null) 59 '()) 60 (check-equal?: (ann (match (constructor tag1 1) [(tag1 x) x]) 61 Number) 62 '1) 63 (check-equal?: (ann (match (constructor tag2 1 "b") [(tag2 x y) (list x y)]) 64 (List Number String)) 65 '(1 "b")) 66 (check-equal?: (ann (match (constructor tag3 1 "b" (ann 'c 'c)) 67 [(tag3 x y z) (list x y z)]) 68 (List Number String 'c)) 69 '(1 "b" c))