/collects/tests/typed-scheme/unit-tests/subtype-tests.rkt

http://github.com/gmarceau/PLT · Racket · 141 lines · 113 code · 14 blank · 14 comment · 3 complexity · becd978259a4655dd262348c7acb3367 MD5 · raw file

  1. #lang scheme/base
  2. (require "test-utils.rkt"
  3. (types subtype convenience union)
  4. (rep type-rep)
  5. (env init-envs type-env-structs)
  6. (r:infer infer infer-dummy)
  7. rackunit
  8. (for-syntax scheme/base))
  9. (provide subtype-tests)
  10. (define-syntax (subtyping-tests stx)
  11. (define (single-test stx)
  12. (syntax-case stx (FAIL)
  13. [(FAIL t s) (syntax/loc stx (test-check (format "FAIL ~a" '(t s)) (lambda (a b) (not (subtype a b))) t s))]
  14. [(t s) (syntax/loc stx (test-check (format "~a" '(t s)) subtype t s))]))
  15. (syntax-case stx ()
  16. [(_ cl ...)
  17. (with-syntax ([(new-cl ...) (map single-test (syntax->list #'(cl ...)))])
  18. (syntax/loc stx
  19. (begin (test-suite "Tests for subtyping"
  20. new-cl ...))))]))
  21. (infer-param infer)
  22. (define (subtype-tests)
  23. (subtyping-tests
  24. ;; trivial examples
  25. (Univ Univ)
  26. (-Number Univ)
  27. (-Boolean Univ)
  28. (-Symbol Univ)
  29. (-Void Univ)
  30. [-Number -Number]
  31. [(Un (-pair Univ (-lst Univ)) (-val '())) (-lst Univ)]
  32. [(-pair -Number (-pair -Number (-pair (-val 'foo) (-val '())))) (-lst Univ)]
  33. [(-pair -Number (-pair -Number (-pair (-val 'foo) (-val '())))) (-lst (Un -Number -Symbol))]
  34. [(-pair (-val 6) (-val 6)) (-pair -Number -Number)]
  35. [(-val 6) (-val 6)]
  36. ;; unions
  37. [(Un -Number) -Number]
  38. [(Un -Number -Number) -Number]
  39. [(Un -Number -Symbol) (Un -Symbol -Number)]
  40. [(Un (-val 6) (-val 7)) -Number]
  41. [(Un (-val #f) (Un (-val 6) (-val 7))) (Un -Number (Un -Boolean -Symbol))]
  42. [(Un (-val #f) (Un (-val 6) (-val 7))) (-mu x (Un -Number (Un -Boolean -Symbol)))]
  43. [(Un -Number (-val #f) (-mu x (Un -Number -Symbol (make-Listof x))))
  44. (-mu x (Un -Number -Symbol -Boolean (make-Listof x)))]
  45. ;; sexps vs list*s of nums
  46. [(-mu x (Un -Number -Symbol (make-Listof x))) (-mu x (Un -Number -Symbol -Boolean (make-Listof x)))]
  47. [(-mu x (Un -Number (make-Listof x))) (-mu x (Un -Number -Symbol (make-Listof x)))]
  48. [(-mu x (Un -Number (make-Listof x))) (-mu y (Un -Number -Symbol (make-Listof y)))]
  49. ;; a hard one
  50. [(-mu x (*Un -Number (-pair x (-pair -Symbol (-pair x (-val null)))))) -Sexp]
  51. ;; simple function types
  52. ((Univ . -> . -Number) (-Number . -> . Univ))
  53. [(Univ Univ Univ . -> . -Number) (Univ Univ -Number . -> . -Number)]
  54. ;; simple list types
  55. [(make-Listof -Number) (make-Listof Univ)]
  56. [(make-Listof -Number) (make-Listof -Number)]
  57. [FAIL (make-Listof -Number) (make-Listof -Symbol)]
  58. [(-mu x (make-Listof x)) (-mu x* (make-Listof x*))]
  59. [(-pair -Number -Number) (-pair Univ -Number)]
  60. [(-pair -Number -Number) (-pair -Number -Number)]
  61. ;; from page 7
  62. [(-mu t (-> t t)) (-mu s (-> s s))]
  63. [(-mu s (-> -Number s)) (-mu t (-> -Number (-> -Number t)))]
  64. ;; polymorphic types
  65. [(-poly (t) (-> t t)) (-poly (s) (-> s s))]
  66. [FAIL (make-Listof -Number) (-poly (t) (make-Listof t))]
  67. [(-poly (a) (make-Listof (-v a))) (make-Listof -Number)] ;;
  68. [(-poly (a) -Number) -Number]
  69. [(-val 6) -Number]
  70. [(-val 'hello) -Symbol]
  71. [((Un -Symbol -Number) . -> . -Number) (-> -Number -Number)]
  72. [(-poly (t) (-> -Number t)) (-mu t (-> -Number t))]
  73. ;; not subtypes
  74. [FAIL (-val 'hello) -Number]
  75. [FAIL (-val #f) -Symbol]
  76. [FAIL (Univ Univ -Number -Number . -> . -Number) (Univ Univ Univ . -> . -Number)]
  77. [FAIL (-Number . -> . -Number) (-> Univ Univ)]
  78. [FAIL (Un -Number -Symbol) -Number]
  79. [FAIL -Number (Un (-val 6) (-val 11))]
  80. [FAIL -Symbol (-val 'Sym)]
  81. [FAIL (Un -Symbol -Number) (-poly (a) -Number)]
  82. ;; bugs found
  83. [(Un (-val 'foo) (-val 6)) (Un (-val 'foo) (-val 6))]
  84. [(-poly (a) (make-Listof (-v a))) (make-Listof (-mu x (Un (make-Listof x) -Number)))]
  85. [FAIL (make-Listof (-mu x (Un (make-Listof x) -Number))) (-poly (a) (make-Listof a))]
  86. ;; case-lambda
  87. [(cl-> [(-Number) -Number] [(-Boolean) -Boolean]) (-Number . -> . -Number)]
  88. ;; special case for unused variables
  89. [-Number (-poly (a) -Number)]
  90. [FAIL (cl-> [(-Number) -Boolean] [(-Boolean) -Number]) (-Number . -> . -Number)]
  91. ;; varargs
  92. [(->* (list -Number) Univ -Boolean) (->* (list -Number) -Number -Boolean)]
  93. [(->* (list Univ) -Number -Boolean) (->* (list -Number) -Number -Boolean)]
  94. [(->* (list -Number) -Number -Boolean) (->* (list -Number) -Number -Boolean)]
  95. [(->* (list -Number) -Number -Boolean) (->* (list -Number) -Number Univ)]
  96. [(->* (list -Number) -Number -Number) (->* (list -Number -Number) -Number)]
  97. [(->* (list -Number) -Number -Number) (->* (list -Number -Number -Number) -Number)]
  98. [(->* (list -Number -Number) -Boolean -Number) (->* (list -Number -Number) -Number)]
  99. [FAIL (->* (list -Number) -Number -Boolean) (->* (list -Number -Number -Number) -Number)]
  100. [(->* (list -Number -Number) -Boolean -Number) (->* (list -Number -Number -Boolean -Boolean) -Number)]
  101. [(-poly (a) (cl-> [() a]
  102. [(-Number) a]))
  103. (cl-> [() (-pair -Number (-v b))]
  104. [(-Number) (-pair -Number (-v b))])]
  105. [(-values (list -Number)) (-values (list Univ))]
  106. [(-poly (b) ((Un (make-Base 'foo #'dummy values #'values)
  107. (-struct 'bar #f
  108. (list (make-fld -Number #'values #f) (make-fld b #'values #f))
  109. #'values))
  110. . -> . (-lst b)))
  111. ((Un (make-Base 'foo #'dummy values #'values) (-struct 'bar #f (list (make-fld -Number #'values #f) (make-fld (-pair -Number (-v a)) #'values #f)) #'values))
  112. . -> . (-lst (-pair -Number (-v a))))]
  113. [(-poly (b) ((-struct 'bar #f (list (make-fld -Number #'values #f) (make-fld b #'values #f)) #'values) . -> . (-lst b)))
  114. ((-struct 'bar #f (list (make-fld -Number #'values #f) (make-fld (-pair -Number (-v a)) #'values #f)) #'values) . -> . (-lst (-pair -Number (-v a))))]
  115. [(-poly (a) (a . -> . (make-Listof a))) ((-v b) . -> . (make-Listof (-v b)))]
  116. [(-poly (a) (a . -> . (make-Listof a))) ((-pair -Number (-v b)) . -> . (make-Listof (-pair -Number (-v b))))]
  117. (FAIL (-poly (a b) (-> a a)) (-poly (a b) (-> a b)))
  118. ;; polymorphic function types should be subtypes of the function top
  119. [(-poly (a) (a . -> . a)) top-func]
  120. (FAIL (-> Univ) (null Univ . ->* . Univ))
  121. [(cl->* (-Number . -> . -String) (-Boolean . -> . -String)) ((Un -Boolean -Number) . -> . -String)]
  122. [(-struct 'a #f null #'values) (-struct 'a #f null #'values)]
  123. [(-struct 'a #f (list (make-fld -String #'values #f)) #'values) (-struct 'a #f (list (make-fld -String #'values #f)) #'values)]
  124. [(-struct 'a #f (list (make-fld -String #'values #f)) #'values) (-struct 'a #f (list (make-fld Univ #'values #f)) #'values)]
  125. ))
  126. (define-go
  127. subtype-tests)