typed-racket/typed-racket-test/unit-tests/prefab-tests.rkt
Asumu Takikawa 5d708ab53f Add typechecking for prefab structs
Adds a new Prefab type constructor along with support for
the use of `struct` with the #:prefab keyword.
2015-03-10 15:14:51 -04:00

91 lines
3.6 KiB
Racket

#lang racket/base
;; Unit tests for prefab type helpres
(require "test-utils.rkt"
racket/list
rackunit
typed-racket/types/prefab)
(provide tests)
(gen-test-main)
(define-check (check-normalize key n norm)
(check-equal? (normalize-prefab-key key n) norm))
;; check that the abbreviate function is consistent with how
;; Racket abbreviates in the run-time
(define-check (check-abbreviate key n)
(check-equal? (abbreviate-prefab-key key)
(prefab-struct-key
(apply make-prefab-struct key (make-list n 0)))))
(define tests
(test-suite
"Tests for prefab type helpers"
(check-normalize '(foo) 1 '(foo 1 (0 #f) #()))
(check-normalize '(foo) 3 '(foo 3 (0 #f) #()))
(check-normalize '(foo 1) 1 '(foo 1 (0 #f) #()))
(check-normalize '(foo 3) 3 '(foo 3 (0 #f) #()))
(check-normalize '(foo bar 3) 4 '(foo 1 (0 #f) #() bar 3 (0 #f) #()))
(check-normalize '(foo 3 bar 3) 6 '(foo 3 (0 #f) #() bar 3 (0 #f) #()))
(check-normalize '(foo 1 #()) 1 '(foo 1 (0 #f) #()))
(check-normalize '(foo 1 #(0)) 1 '(foo 1 (0 #f) #(0)))
(check-normalize '(foo 5 (0 #f)) 5 '(foo 5 (0 #f) #()))
(check-normalize '(foo 5 (1 #f)) 6 '(foo 5 (1 #f) #()))
(check-normalize '(foo 5 (0 #f) #()) 5 '(foo 5 (0 #f) #()))
(check-normalize '(foo bar 4) 7 '(foo 3 (0 #f) #() bar 4 (0 #f) #()))
(check-normalize '(foo (1 #f) bar 4) 8 '(foo 3 (1 #f) #() bar 4 (0 #f) #()))
(check-normalize '(foo #(1) bar 4) 7 '(foo 3 (0 #f) #(1) bar 4 (0 #f) #()))
(check-normalize '(foo bar 4 (1 #f)) 8 '(foo 3 (0 #f) #() bar 4 (1 #f) #()))
(check-normalize '(foo bar 1 baz 4 (1 #f))
8
'(foo 2 (0 #f) #() bar 1 (0 #f) #() baz 4 (1 #f) #()))
(check-equal? (prefab-key->field-count '(foo 1 (0 #f) #()))
1)
(check-equal? (prefab-key->field-count '(foo 1 (1 #f) #()))
2)
(check-equal? (prefab-key->field-count
'(foo 1 (1 #f) #() bar 1 (0 #f) #()))
3)
(check-equal? (prefab-key->field-count
'(foo 1 (1 #f) #() bar 1 (0 #f) #() baz 2 (0 #f) #()))
5)
(check-abbreviate '(foo) 1)
(check-abbreviate '(foo 1) 1)
(check-abbreviate '(foo 3) 3)
(check-abbreviate '(foo bar 3) 4)
(check-abbreviate '(foo 3 bar 3) 6)
(check-abbreviate '(foo 1 #()) 1)
(check-abbreviate '(foo 1 #(0)) 1)
(check-abbreviate '(foo 5 (0 #f)) 5)
(check-abbreviate '(foo 5 (1 #f)) 6)
(check-abbreviate '(foo 5 (0 #f) #()) 5)
(check-abbreviate '(foo 5 (1 #f) #()) 6)
(check-abbreviate '(foo 5 (0 #f) #(1)) 5)
(check-abbreviate '(foo 5 (1 #f) #(1)) 6)
(check-abbreviate '(foo 5 (0 #f) #() bar 1) 6)
(check-abbreviate '(foo 5 (0 #f) #(1) bar 1) 6)
(check-abbreviate '(foo 5 (1 #f) #(1) bar 1) 7)
(check-abbreviate '(foo 5 (1 #f) #(1) bar 1 #()) 7)
(check-abbreviate '(foo 5 (0 #f) #(1) bar 1 #()) 6)
(check-abbreviate '(foo 5 (0 #f) #() bar 1 #()) 6)
(check-abbreviate '(foo 5 (1 #f) #(1) bar 1 #(0)) 7)
(check-true (prefab-key-subtype? '(foo 1 (0 #f) #() bar 1 (0 #f) #())
'(bar 1 (0 #f) #())))
(check-false (prefab-key-subtype? '(foo 1 (0 #f) #())
'(bar 1 (0 #f) #())))
(check-equal? (prefab-key->field-mutability
'(foo 1 (0 #f) #() bar 1 (0 #f) #()))
(list #f #f))
(check-equal? (prefab-key->field-mutability
'(foo 2 (0 #f) #(0) bar 3 (0 #f) #(1)))
(list #f #t #f #t #f))
(check-equal? (prefab-key->field-mutability
'(foo 2 (0 #f) #(0) bar 3 (0 #f) #(1) baz 1 (0 #f) #(0)))
(list #t #f #t #f #t #f))))