rdl 2.0.1 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (252) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +13 -0
  3. data/CHANGES.md +35 -0
  4. data/README.md +153 -116
  5. data/bin/rdl_query +1 -1
  6. data/extras/type_tests/typetests.rb +905 -0
  7. data/lib/rdl.rb +0 -1
  8. data/lib/rdl/boot.rb +108 -77
  9. data/lib/rdl/boot_rails.rb +2 -8
  10. data/lib/rdl/config.rb +44 -17
  11. data/lib/rdl/contracts/flat.rb +1 -1
  12. data/lib/rdl/info.rb +3 -3
  13. data/lib/rdl/query.rb +11 -11
  14. data/lib/rdl/typecheck.rb +399 -136
  15. data/lib/rdl/types/finite_hash.rb +3 -2
  16. data/lib/rdl/types/generic.rb +7 -6
  17. data/lib/rdl/types/intersection.rb +3 -2
  18. data/lib/rdl/types/lexer.rex +2 -3
  19. data/lib/rdl/types/lexer.rex.rb +1 -4
  20. data/lib/rdl/types/method.rb +7 -6
  21. data/lib/rdl/types/nominal.rb +10 -1
  22. data/lib/rdl/types/parser.racc +7 -8
  23. data/lib/rdl/types/parser.tab.rb +108 -109
  24. data/lib/rdl/types/structural.rb +1 -0
  25. data/lib/rdl/types/tuple.rb +2 -2
  26. data/lib/rdl/types/type.rb +8 -8
  27. data/lib/rdl/types/type_inferencer.rb +1 -1
  28. data/lib/rdl/types/union.rb +2 -1
  29. data/lib/rdl/util.rb +28 -3
  30. data/lib/rdl/wrap.rb +216 -165
  31. data/lib/rdl_disable.rb +22 -15
  32. data/lib/types/core.rb +2 -4
  33. data/lib/types/core/_aliases.rb +14 -0
  34. data/lib/types/core/abbrev.rb +3 -0
  35. data/lib/types/core/array.rb +139 -0
  36. data/lib/types/core/base64.rb +8 -0
  37. data/lib/types/core/basic_object.rb +12 -0
  38. data/lib/types/core/benchmark.rb +9 -0
  39. data/lib/types/core/bigdecimal.rb +223 -0
  40. data/lib/types/core/bigmath.rb +10 -0
  41. data/lib/types/core/bignum.rb +214 -0
  42. data/lib/types/core/class.rb +15 -0
  43. data/lib/types/core/complex.rb +123 -0
  44. data/lib/types/core/coverage.rb +4 -0
  45. data/lib/types/core/csv.rb +3 -0
  46. data/lib/types/core/date.rb +4 -0
  47. data/lib/types/core/dir.rb +37 -0
  48. data/lib/types/core/encoding.rb +21 -0
  49. data/lib/types/core/enumerable.rb +96 -0
  50. data/lib/types/core/enumerator.rb +24 -0
  51. data/lib/types/core/exception.rb +15 -0
  52. data/lib/types/core/file.rb +125 -0
  53. data/lib/types/core/fileutils.rb +4 -0
  54. data/lib/types/core/fixnum.rb +213 -0
  55. data/lib/types/core/float.rb +199 -0
  56. data/lib/types/core/gem.rb +19 -0
  57. data/lib/types/core/hash.rb +72 -0
  58. data/lib/types/core/integer.rb +194 -0
  59. data/lib/types/core/io.rb +101 -0
  60. data/lib/types/core/kernel.rb +89 -0
  61. data/lib/types/core/marshal.rb +3 -0
  62. data/lib/types/core/matchdata.rb +24 -0
  63. data/lib/types/core/math.rb +50 -0
  64. data/lib/types/core/module.rb +81 -0
  65. data/lib/types/core/nil.rb +11 -0
  66. data/lib/types/core/numeric.rb +56 -0
  67. data/lib/types/core/object.rb +73 -0
  68. data/lib/types/core/pathname.rb +104 -0
  69. data/lib/types/core/proc.rb +12 -0
  70. data/lib/types/core/process.rb +110 -0
  71. data/lib/types/core/random.rb +13 -0
  72. data/lib/types/core/range.rb +37 -0
  73. data/lib/types/core/rational.rb +207 -0
  74. data/lib/types/core/regexp.rb +28 -0
  75. data/lib/types/core/set.rb +56 -0
  76. data/lib/types/core/string.rb +140 -0
  77. data/lib/types/core/strscan.rb +6 -0
  78. data/lib/types/core/symbol.rb +27 -0
  79. data/lib/types/core/time.rb +66 -0
  80. data/lib/types/core/uri.rb +18 -0
  81. data/lib/types/core/yaml.rb +3 -0
  82. data/lib/types/devise.rb +1 -0
  83. data/lib/types/devise/controller_helpers.rb +3 -0
  84. data/lib/types/devise/parameter_sanitizer.rb +2 -0
  85. data/lib/types/pundit.rb +2 -0
  86. data/lib/types/rails/_helpers.rb +50 -0
  87. data/lib/types/rails/abstract_controller/translation.rb +2 -0
  88. data/lib/types/rails/action_controller/base.rb +3 -0
  89. data/lib/types/rails/action_controller/instrumentation.rb +6 -0
  90. data/lib/types/rails/action_controller/metal.rb +3 -0
  91. data/lib/types/rails/action_controller/mime_responds.rb +13 -0
  92. data/lib/types/rails/action_controller/parameters.rb +3 -0
  93. data/lib/types/{rails-5.x → rails}/action_controller/strong_parameters.rb +4 -8
  94. data/lib/types/rails/action_dispatch/flashhash.rb +8 -0
  95. data/lib/types/rails/action_dispatch/routing.rb +10 -0
  96. data/lib/types/rails/action_mailer/base.rb +2 -0
  97. data/lib/types/rails/action_mailer/message_delivery.rb +2 -0
  98. data/lib/types/rails/action_view/helpers_sanitizehelper.rb +2 -0
  99. data/lib/types/rails/action_view/helpers_urlhelper.rb +5 -0
  100. data/lib/types/rails/active_model/errors.rb +14 -0
  101. data/lib/types/rails/active_model/validations.rb +2 -0
  102. data/lib/types/rails/active_record/associations.rb +208 -0
  103. data/lib/types/rails/active_record/base.rb +2 -0
  104. data/lib/types/rails/active_record/core.rb +2 -0
  105. data/lib/types/rails/active_record/finder_methods.rb +2 -0
  106. data/lib/types/rails/active_record/model_schema.rb +37 -0
  107. data/lib/types/rails/active_record/relation.rb +11 -0
  108. data/lib/types/rails/active_record/schema_types.rb +51 -0
  109. data/lib/types/rails/active_record/validations.rb +2 -0
  110. data/lib/types/rails/active_support/base.rb +2 -0
  111. data/lib/types/rails/active_support/logger.rb +3 -0
  112. data/lib/types/rails/active_support/tagged_logging.rb +2 -0
  113. data/lib/types/rails/active_support/time_with_zone.rb +13 -0
  114. data/lib/types/rails/active_support/time_zone.rb +2 -0
  115. data/lib/types/rails/fixnum.rb +2 -0
  116. data/lib/types/rails/integer.rb +2 -0
  117. data/lib/types/rails/rack/request.rb +2 -0
  118. data/lib/types/rails/string.rb +3 -0
  119. data/lib/types/rails/time.rb +1 -0
  120. data/rdl.gemspec +2 -2
  121. data/test/disabled_test_rdoc.rb +8 -8
  122. data/test/test_alias.rb +1 -0
  123. data/test/test_dsl.rb +4 -4
  124. data/test/test_generic.rb +45 -38
  125. data/test/test_intersection.rb +10 -10
  126. data/test/test_le.rb +103 -102
  127. data/test/test_member.rb +33 -33
  128. data/test/test_parser.rb +101 -96
  129. data/test/test_query.rb +84 -84
  130. data/test/test_rdl.rb +87 -52
  131. data/test/test_rdl_type.rb +26 -9
  132. data/test/test_type_contract.rb +32 -31
  133. data/test/test_typecheck.rb +802 -436
  134. data/test/test_types.rb +39 -39
  135. data/test/test_wrap.rb +3 -2
  136. metadata +91 -120
  137. data/extras/type_tests/%.rb +0 -171
  138. data/extras/type_tests/&.rb +0 -159
  139. data/extras/type_tests/**.rb +0 -222
  140. data/extras/type_tests/*.rb +0 -177
  141. data/extras/type_tests/+.rb +0 -170
  142. data/extras/type_tests/-.rb +0 -171
  143. data/extras/type_tests/1scomp.rb +0 -157
  144. data/extras/type_tests/<.rb +0 -170
  145. data/extras/type_tests/<<.rb +0 -159
  146. data/extras/type_tests/>>.rb +0 -159
  147. data/extras/type_tests/[].rb +0 -163
  148. data/extras/type_tests/^.rb +0 -159
  149. data/extras/type_tests/abs.rb +0 -155
  150. data/extras/type_tests/abs2.rb +0 -164
  151. data/extras/type_tests/angle.rb +0 -157
  152. data/extras/type_tests/arg.rb +0 -157
  153. data/extras/type_tests/bit_length.rb +0 -157
  154. data/extras/type_tests/ceil.rb +0 -157
  155. data/extras/type_tests/ceilRational.rb +0 -160
  156. data/extras/type_tests/conj.rb +0 -158
  157. data/extras/type_tests/defwhere.rb +0 -86
  158. data/extras/type_tests/denominator.rb +0 -157
  159. data/extras/type_tests/div.rb +0 -172
  160. data/extras/type_tests/divslash.rb +0 -179
  161. data/extras/type_tests/even?.rb +0 -157
  162. data/extras/type_tests/fdiv.rb +0 -244
  163. data/extras/type_tests/finite?.rb +0 -157
  164. data/extras/type_tests/floor.rb +0 -157
  165. data/extras/type_tests/floorRational.rb +0 -161
  166. data/extras/type_tests/hash.rb +0 -157
  167. data/extras/type_tests/imag.rb +0 -158
  168. data/extras/type_tests/infinite?.rb +0 -157
  169. data/extras/type_tests/modulo.rb +0 -171
  170. data/extras/type_tests/nan?.rb +0 -157
  171. data/extras/type_tests/neg.rb +0 -155
  172. data/extras/type_tests/next.rb +0 -157
  173. data/extras/type_tests/next_float.rb +0 -157
  174. data/extras/type_tests/numerator.rb +0 -157
  175. data/extras/type_tests/phase.rb +0 -157
  176. data/extras/type_tests/prev_float.rb +0 -157
  177. data/extras/type_tests/quo.rb +0 -179
  178. data/extras/type_tests/rationalize.rb +0 -157
  179. data/extras/type_tests/rationalizeArg.rb +0 -198
  180. data/extras/type_tests/real.rb +0 -157
  181. data/extras/type_tests/real?.rb +0 -157
  182. data/extras/type_tests/round.rb +0 -157
  183. data/extras/type_tests/roundArg.rb +0 -169
  184. data/extras/type_tests/size.rb +0 -157
  185. data/extras/type_tests/to_c.rb +0 -157
  186. data/extras/type_tests/to_f.rb +0 -155
  187. data/extras/type_tests/to_i.rb +0 -157
  188. data/extras/type_tests/to_r.rb +0 -157
  189. data/extras/type_tests/to_s.rb +0 -157
  190. data/extras/type_tests/truncate.rb +0 -157
  191. data/extras/type_tests/truncateArg.rb +0 -166
  192. data/extras/type_tests/type tests +0 -1
  193. data/extras/type_tests/zero?.rb +0 -155
  194. data/extras/type_tests/|.rb +0 -159
  195. data/lib/types/core-ruby-2.x/_aliases.rb +0 -15
  196. data/lib/types/core-ruby-2.x/abbrev.rb +0 -5
  197. data/lib/types/core-ruby-2.x/array.rb +0 -137
  198. data/lib/types/core-ruby-2.x/base64.rb +0 -10
  199. data/lib/types/core-ruby-2.x/basic_object.rb +0 -14
  200. data/lib/types/core-ruby-2.x/benchmark.rb +0 -11
  201. data/lib/types/core-ruby-2.x/bigdecimal.rb +0 -224
  202. data/lib/types/core-ruby-2.x/bigmath.rb +0 -12
  203. data/lib/types/core-ruby-2.x/bignum.rb +0 -214
  204. data/lib/types/core-ruby-2.x/class.rb +0 -17
  205. data/lib/types/core-ruby-2.x/complex.rb +0 -124
  206. data/lib/types/core-ruby-2.x/coverage.rb +0 -6
  207. data/lib/types/core-ruby-2.x/csv.rb +0 -5
  208. data/lib/types/core-ruby-2.x/date.rb +0 -6
  209. data/lib/types/core-ruby-2.x/dir.rb +0 -38
  210. data/lib/types/core-ruby-2.x/encoding.rb +0 -23
  211. data/lib/types/core-ruby-2.x/enumerable.rb +0 -98
  212. data/lib/types/core-ruby-2.x/enumerator.rb +0 -26
  213. data/lib/types/core-ruby-2.x/exception.rb +0 -17
  214. data/lib/types/core-ruby-2.x/file.rb +0 -126
  215. data/lib/types/core-ruby-2.x/fileutils.rb +0 -6
  216. data/lib/types/core-ruby-2.x/fixnum.rb +0 -213
  217. data/lib/types/core-ruby-2.x/float.rb +0 -199
  218. data/lib/types/core-ruby-2.x/gem.rb +0 -247
  219. data/lib/types/core-ruby-2.x/hash.rb +0 -72
  220. data/lib/types/core-ruby-2.x/integer.rb +0 -197
  221. data/lib/types/core-ruby-2.x/io.rb +0 -103
  222. data/lib/types/core-ruby-2.x/kernel.rb +0 -90
  223. data/lib/types/core-ruby-2.x/marshal.rb +0 -5
  224. data/lib/types/core-ruby-2.x/matchdata.rb +0 -26
  225. data/lib/types/core-ruby-2.x/math.rb +0 -53
  226. data/lib/types/core-ruby-2.x/module.rb +0 -83
  227. data/lib/types/core-ruby-2.x/nil.rb +0 -12
  228. data/lib/types/core-ruby-2.x/numeric.rb +0 -56
  229. data/lib/types/core-ruby-2.x/object.rb +0 -75
  230. data/lib/types/core-ruby-2.x/pathname.rb +0 -106
  231. data/lib/types/core-ruby-2.x/proc.rb +0 -16
  232. data/lib/types/core-ruby-2.x/process.rb +0 -127
  233. data/lib/types/core-ruby-2.x/random.rb +0 -17
  234. data/lib/types/core-ruby-2.x/range.rb +0 -39
  235. data/lib/types/core-ruby-2.x/rational.rb +0 -209
  236. data/lib/types/core-ruby-2.x/regexp.rb +0 -30
  237. data/lib/types/core-ruby-2.x/set.rb +0 -58
  238. data/lib/types/core-ruby-2.x/string.rb +0 -143
  239. data/lib/types/core-ruby-2.x/strscan.rb +0 -7
  240. data/lib/types/core-ruby-2.x/symbol.rb +0 -29
  241. data/lib/types/core-ruby-2.x/time.rb +0 -68
  242. data/lib/types/core-ruby-2.x/uri.rb +0 -20
  243. data/lib/types/core-ruby-2.x/yaml.rb +0 -5
  244. data/lib/types/rails-5.x/_helpers.rb +0 -52
  245. data/lib/types/rails-5.x/action_controller/mime_responds.rb +0 -11
  246. data/lib/types/rails-5.x/action_dispatch/routing.rb +0 -10
  247. data/lib/types/rails-5.x/active_model/errors.rb +0 -15
  248. data/lib/types/rails-5.x/active_model/validations.rb +0 -5
  249. data/lib/types/rails-5.x/active_record/associations.rb +0 -190
  250. data/lib/types/rails-5.x/active_record/core.rb +0 -3
  251. data/lib/types/rails-5.x/active_record/model_schema.rb +0 -39
  252. data/lib/types/rails-5.x/fixnum.rb +0 -3
@@ -3,20 +3,146 @@ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
3
  require 'rdl'
4
4
  require 'types/core'
5
5
 
6
+ class N1
7
+ class N2
8
+ extend RDL::Annotate
9
+ def self.foo
10
+ :sym
11
+ end
12
+ type 'self.foo', '() -> :sym'
13
+
14
+ def self.foo2
15
+ :sym2
16
+ end
17
+ type 'self.foo2', '() -> :sym2'
18
+
19
+ def self.nf
20
+ N2.foo
21
+ end
22
+ type 'self.nf', '() -> :sym', typecheck: :call
23
+
24
+ def nf2
25
+ N2.foo2
26
+ end
27
+ type :nf2, '() -> :sym2', typecheck: :call
28
+ end
29
+
30
+ class N3
31
+ extend RDL::Annotate
32
+ def nf3
33
+ N2.foo
34
+ end
35
+ type :nf3, '() -> :sym', typecheck: :call
36
+ end
37
+ end
38
+
39
+ class N4
40
+ extend RDL::Annotate
41
+ class N5
42
+ extend RDL::Annotate
43
+ type :bar, '() -> :B'
44
+ def bar
45
+ :B
46
+ end
47
+ end
48
+ end
49
+
50
+ class N5
51
+ extend RDL::Annotate
52
+ type :bar, '() -> :A'
53
+ def bar
54
+ :A
55
+ end
56
+ end
57
+
58
+ class N4
59
+ class << self
60
+ extend RDL::Annotate
61
+ def foo
62
+ N5.new.bar
63
+ end
64
+ end
65
+ type 'self.foo', '() -> :B', typecheck: :call
66
+ end
67
+
6
68
  class TestTypecheckC
7
- type 'self.bar', '() -> Fixnum or String ret'
69
+ extend RDL::Annotate
70
+ type 'self.bar', '() -> Integer or String ret'
8
71
  type 'self.foo', '() -> :A'
9
- type 'self.new', '(:D) -> :E'
72
+ type 'foo', '() -> Integer'
73
+ type '(Integer) -> self'
74
+ def initialize(x); end
10
75
  end
11
76
 
12
77
  class TestTypecheckD
13
78
  end
14
79
 
80
+ class TestTypecheckE
81
+ extend RDL::Annotate
82
+ type '(Integer) -> self', typecheck: :einit
83
+ def initialize(x)
84
+ x
85
+ end
86
+ end
87
+
88
+ class TestTypecheckF
89
+ extend RDL::Annotate
90
+ type '(Integer) -> F', typecheck: :finit
91
+ def initialize(x)
92
+ x
93
+ end
94
+ end
95
+
15
96
  module TestTypecheckM
97
+ extend RDL::Annotate
16
98
  type 'self.foo', '() -> :B'
17
99
  end
18
100
 
101
+ class TestTypecheckOuter
102
+ class A
103
+ class B
104
+ class C
105
+ end
106
+ end
107
+ end
108
+ end
109
+
110
+ class X
111
+ extend RDL::Annotate
112
+ end
113
+ class Y
114
+ extend RDL::Annotate
115
+ end
116
+
117
+ class MethodMissing1
118
+ extend RDL::Annotate
119
+ type '() -> String', typecheck: :later_mm1
120
+ def foo()
121
+ bar()
122
+ end
123
+
124
+ type '(Symbol, *%any) -> String', typecheck: :later_mm1
125
+ def method_missing(name, *_)
126
+ name.to_s
127
+ end
128
+ end
129
+
130
+ class MethodMissing2
131
+ extend RDL::Annotate
132
+ type '() -> Integer', typecheck: :later_mm2
133
+ def foo()
134
+ bar()
135
+ end
136
+
137
+ type '(Symbol, *%any) -> String', typecheck: :later_mm2
138
+ def method_missing(name, *_)
139
+ name.to_s
140
+ end
141
+ end
142
+
143
+
19
144
  class TestTypecheck < Minitest::Test
145
+ extend RDL::Annotate
20
146
  type :_any_object, "() -> Object" # a method that could return true or false
21
147
 
22
148
  def setup
@@ -27,13 +153,13 @@ class TestTypecheck < Minitest::Test
27
153
  @t45 = RDL::Type::UnionType.new(@t4, @t5)
28
154
  @t35 = RDL::Type::UnionType.new(@t3, @t5)
29
155
  @t345 = RDL::Type::UnionType.new(@t34, @t5)
30
- @ts3 = RDL::Type::UnionType.new($__rdl_string_type, @t3)
156
+ @ts3 = RDL::Type::UnionType.new(RDL::Globals.types[:string], @t3)
31
157
  @ts34 = RDL::Type::UnionType.new(@ts3, @t4)
32
- @t3n = RDL::Type::UnionType.new(@t3, $__rdl_nil_type)
33
- @t4n = RDL::Type::UnionType.new(@t4, $__rdl_nil_type)
158
+ @t3n = RDL::Type::UnionType.new(@t3, RDL::Globals.types[:nil])
159
+ @t4n = RDL::Type::UnionType.new(@t4, RDL::Globals.types[:nil])
34
160
  @env = RDL::Typecheck::Env.new(self: tt("TestTypecheck"))
35
- @scopef = { tret: $__rdl_fixnum_type }
36
- @tfs = RDL::Type::UnionType.new($__rdl_fixnum_type, $__rdl_string_type)
161
+ @scopef = { tret: RDL::Globals.types[:integer] }
162
+ @tfs = RDL::Type::UnionType.new(RDL::Globals.types[:integer], RDL::Globals.types[:string])
37
163
  @scopefs = { tret: @tfs, tblock: nil }
38
164
  end
39
165
 
@@ -48,52 +174,91 @@ class TestTypecheck < Minitest::Test
48
174
 
49
175
  # convert arg string to a type
50
176
  def tt(t)
51
- $__rdl_parser.scan_str('#T ' + t)
177
+ RDL::Globals.parser.scan_str('#T ' + t)
52
178
  end
53
179
 
54
180
  def test_def
55
181
  self.class.class_eval {
56
- type "(Fixnum) -> Fixnum", typecheck: :now
182
+ type "(Integer) -> Integer", typecheck: :now
57
183
  def def_ff(x) x; end
58
184
  }
59
185
 
60
186
  assert_raises(RDL::Typecheck::StaticTypeError) {
61
187
  self.class.class_eval {
62
- type "(Fixnum) -> Fixnum", typecheck: :now
188
+ type "(Integer) -> Integer", typecheck: :now
63
189
  def def_fs(x) "42"; end
64
190
  }
65
191
  }
66
192
 
67
193
  self.class.class_eval {
68
- type "(Fixnum) -> Fixnum", typecheck: :now
194
+ type "(Integer) -> Integer", typecheck: :now
69
195
  def def_ff2(x) x; end
70
196
  }
71
197
  assert_equal 42, def_ff2(42)
72
198
 
73
199
  self.class.class_eval {
74
- type "(Fixnum) -> Fixnum", typecheck: :call
200
+ type "(Integer) -> Integer", typecheck: :call
75
201
  def def_fs2(x) "42"; end
76
202
  }
77
203
  assert_raises(RDL::Typecheck::StaticTypeError) { def_fs2(42) }
78
204
 
79
205
  assert_raises(RDL::Typecheck::StaticTypeError) {
80
206
  self.class.class_eval {
81
- type "(Fixnum) -> Fixnum", typecheck: :now
207
+ type "(Integer) -> Integer", typecheck: :now
82
208
  def def_ff3(x, y) 42; end
83
209
  }
84
210
  }
85
211
 
86
212
  self.class.class_eval {
87
- type "(Fixnum) -> Fixnum", typecheck: :later
213
+ type "(Integer) -> Integer", typecheck: :later1
88
214
  def def_ff4(x, y) 42; end
89
215
  }
90
216
 
91
- assert_raises(RDL::Typecheck::StaticTypeError) { rdl_do_typecheck :later }
217
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :later1 }
218
+ end
219
+
220
+ def test_def_post
221
+ self.class.class_eval {
222
+ def def_ffp(x) x; end
223
+ type :def_ffp, "(Integer) -> Integer", typecheck: :now, wrap: false
224
+ }
225
+
226
+ assert_raises(RDL::Typecheck::StaticTypeError) {
227
+ self.class.class_eval {
228
+ def def_fsp(x) "42"; end
229
+ type :def_fsp, "(Integer) -> Integer", typecheck: :now, wrap: false
230
+ }
231
+ }
232
+
233
+ self.class.class_eval {
234
+ def def_ff2p(x) x; end
235
+ type :def_ff2p, "(Integer) -> Integer", typecheck: :now, wrap: false
236
+ }
237
+ assert_equal 42, def_ff2p(42)
238
+
239
+ self.class.class_eval {
240
+ def def_fs2p(x) "42"; end
241
+ type :def_fs2p, "(Integer) -> Integer", typecheck: :call
242
+ }
243
+ assert_raises(RDL::Typecheck::StaticTypeError) { def_fs2p(42) }
244
+
245
+ assert_raises(RDL::Typecheck::StaticTypeError) {
246
+ self.class.class_eval {
247
+ def def_ff3p(x, y) 42; end
248
+ type :def_ff3p, "(Integer) -> Integer", typecheck: :now, wrap: false
249
+ }
250
+ }
251
+
252
+ self.class.class_eval {
253
+ def def_ff4p(x, y) 42; end
254
+ type :def_ff4p, "(Integer) -> Integer", typecheck: :later2, wrap: false
255
+ }
256
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :later2 }
92
257
  end
93
258
 
94
259
  def test_defs
95
260
  self.class.class_eval {
96
- type "(Fixnum) -> Class", typecheck: :now
261
+ type "(Integer) -> Class", typecheck: :now
97
262
  def self.defs_ff(x) self; end
98
263
  }
99
264
 
@@ -110,25 +275,37 @@ class TestTypecheck < Minitest::Test
110
275
  }
111
276
 
112
277
  self.class.class_eval {
113
- type "(Fixnum) -> Fixnum", typecheck: :later
278
+ type "(Integer) -> Integer", typecheck: :later4
114
279
  def self.defs_ff2(x, y) 42; end
115
280
  }
116
281
 
117
- assert_raises(RDL::Typecheck::StaticTypeError) { rdl_do_typecheck :later }
282
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :later4 }
283
+ end
284
+
285
+ def test_singleton_method_const
286
+ X.class_eval {
287
+ type '(Integer) -> Integer'
288
+ def foo(x) x; end
289
+ }
290
+ Y.class_eval {
291
+ type '(Integer) -> Integer', typecheck: :later5
292
+ def self.bar(x) a = X.new; a.foo(x); end
293
+ }
294
+ self.class.class_eval { RDL.do_typecheck :later5 }
118
295
  end
119
296
 
120
297
  def test_lits
121
- assert_equal $__rdl_nil_type, do_tc("nil")
122
- assert_equal $__rdl_true_type, do_tc("true")
123
- assert_equal $__rdl_false_type, do_tc("false")
124
- assert_equal tt("42"), do_tc("42")
125
- assert do_tc("123456789123456789123456789") <= $__rdl_bignum_type
126
- assert_equal tt("3.14"), do_tc("3.14")
127
- assert_equal $__rdl_complex_type, do_tc("1i")
128
- assert_equal $__rdl_rational_type, do_tc("2.0r")
129
- assert_equal $__rdl_string_type, do_tc("'42'")
130
- assert_equal $__rdl_string_type, do_tc("\"42\"")
131
- assert_equal tt(":foo"), do_tc(":foo")
298
+ assert do_tc("nil") <= RDL::Globals.types[:nil]
299
+ assert do_tc("true") <= RDL::Globals.types[:true]
300
+ assert do_tc("false") <= RDL::Globals.types[:false]
301
+ assert do_tc("42") <= tt("42")
302
+ assert do_tc("123456789123456789123456789") <= RDL::Globals.types[:integer]
303
+ assert do_tc("3.14") <= tt("3.14")
304
+ assert do_tc("1i") <= RDL::Globals.types[:complex]
305
+ assert do_tc("2.0r") <= RDL::Globals.types[:rational]
306
+ assert do_tc("'42'") <= RDL::Globals.types[:string]
307
+ assert do_tc("\"42\"") <= RDL::Globals.types[:string]
308
+ assert do_tc(":foo") <= tt(":foo")
132
309
  end
133
310
 
134
311
  def test_empty
@@ -150,7 +327,7 @@ class TestTypecheck < Minitest::Test
150
327
  end
151
328
 
152
329
  def test_seq
153
- assert_equal $__rdl_string_type, do_tc("_ = 42; _ = 43; 'foo'")
330
+ assert do_tc("_ = 42; _ = 43; 'foo'") <= RDL::Globals.types[:string]
154
331
  end
155
332
 
156
333
  def test_dsym
@@ -162,7 +339,7 @@ class TestTypecheck < Minitest::Test
162
339
  end
163
340
 
164
341
  def test_regexp
165
- assert_equal $__rdl_regexp_type, do_tc("/foo/")
342
+ assert do_tc("/foo/") <= RDL::Globals.types[:regexp]
166
343
 
167
344
  self.class.class_eval {
168
345
  # Hard to read if these are inside of strings, so leave like this
@@ -172,20 +349,20 @@ class TestTypecheck < Minitest::Test
172
349
  end
173
350
 
174
351
  def test_tuple
175
- assert_equal tt("[TrueClass, String]"), do_tc("[true, '42']")
176
- assert_equal tt("[42, String]"), do_tc("[42, '42']")
352
+ assert do_tc("[true, '42']") <= tt("[TrueClass, String]")
353
+ assert do_tc("[42, '42']") <= tt("[42, String]")
177
354
  end
178
355
 
179
356
  def test_hash
180
- assert_equal tt("{x: TrueClass, y: FalseClass}"), do_tc("{x: true, y: false}")
181
- assert_equal tt("Hash<String, 1 or 2>"), do_tc("{'a' => 1, 'b' => 2}")
182
- assert_equal tt("{1 => String, 2 => String}"), do_tc("{1 => 'a', 2 => 'b'}")
183
- assert_equal tt("{}"), do_tc("{}")
357
+ assert do_tc("{x: true, y: false}") <= tt("{x: TrueClass, y: FalseClass}")
358
+ assert do_tc("{'a' => 1, 'b' => 2}") <= tt("Hash<String, 1 or 2>")
359
+ assert do_tc("{1 => 'a', 2 => 'b'}") <= tt("{1 => String, 2 => String}")
360
+ assert do_tc("{}") <= tt("{}")
184
361
  end
185
362
 
186
363
  def test_range
187
- assert_equal tt("Range<Fixnum>"), do_tc("1..5")
188
- assert_equal tt("Range<Fixnum>"), do_tc("1...5")
364
+ assert do_tc("1..5") <= tt("Range<Integer>")
365
+ assert do_tc("1...5") <= tt("Range<Integer>")
189
366
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("1..'foo'") }
190
367
  end
191
368
 
@@ -210,63 +387,69 @@ class TestTypecheck < Minitest::Test
210
387
  end
211
388
 
212
389
  def test_nth_back
213
- assert_equal $__rdl_string_type, do_tc("$4")
214
- assert_equal $__rdl_string_type, do_tc("$+")
390
+ assert do_tc("$4") <= RDL::Globals.types[:string]
391
+ assert do_tc("$+") <= RDL::Globals.types[:string]
215
392
  end
216
393
 
217
394
  def test_const
218
- assert_equal tt("${String}"), do_tc("String", env: @env)
219
- assert_equal $__rdl_nil_type, do_tc("NIL", env: @env)
395
+ assert do_tc("String", env: @env) <= tt("${String}")
396
+
397
+ t = RDL::Type::SingletonType.new(TestTypecheckOuter)
398
+ assert_equal t, do_tc("TestTypecheckOuter", env: @env)
399
+ t = RDL::Type::SingletonType.new(TestTypecheckOuter::A)
400
+ assert_equal t, do_tc("TestTypecheckOuter::A", env: @env)
401
+ t = RDL::Type::SingletonType.new(TestTypecheckOuter::A::B::C)
402
+ assert_equal t, do_tc("TestTypecheckOuter::A::B::C", env: @env)
220
403
  end
221
404
 
222
405
  def test_defined
223
- assert_equal $__rdl_string_type, do_tc("defined?(x)")
406
+ assert do_tc("defined?(x)") <= RDL::Globals.types[:string]
224
407
  end
225
408
 
226
409
  def test_lvar
227
410
  self.class.class_eval {
228
- type "(Fixnum, String) -> Fixnum", typecheck: :now
411
+ type "(Integer, String) -> Integer", typecheck: :now
229
412
  def lvar1(x, y) x; end
230
413
  }
231
414
 
232
415
  self.class.class_eval {
233
- type "(Fixnum, String) -> String", typecheck: :now
416
+ type "(Integer, String) -> String", typecheck: :now
234
417
  def lvar2(x, y) y; end
235
418
  }
236
419
 
237
420
  assert_raises(RDL::Typecheck::StaticTypeError) {
238
421
  # really a send
239
422
  self.class.class_eval {
240
- type "(Fixnum, String) -> String", typecheck: :now
423
+ type "(Integer, String) -> String", typecheck: :now
241
424
  def lvar3(x, y) z; end
242
425
  }
243
426
  }
244
427
  end
245
428
 
246
429
  def test_lvasgn
247
- assert_equal tt("42"), do_tc("x = 42; x")
248
- assert_equal tt("42"), do_tc("x = 42; y = x; y")
249
- assert_equal tt("42"), do_tc("x = y = 42; x")
250
- assert_equal $__rdl_nil_type, do_tc("x = x") # weird behavior - lhs bound to nil always before assignment!
430
+ assert do_tc("x = 42; x") <= tt("42")
431
+ assert do_tc("x = 42; y = x; y") <= tt("42")
432
+ assert do_tc("x = y = 42; x") <= tt("42")
433
+ assert do_tc("x = x") <= RDL::Globals.types[:nil] # weird behavior - lhs bound to nil always before assignment!
251
434
  end
252
435
 
253
436
  def test_lvar_type
254
437
  # var_type arg type and formattests
255
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("var_type :x", env: @env) }
256
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("var_type :x, 3", env: @env) }
257
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("var_type 'x', 'Fixnum'", env: @env) }
258
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("var_type :@x, 'Fixnum'", env: @env) }
259
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("var_type :x, 'Fluffy Bunny'", env: @env) }
260
-
261
- assert_equal $__rdl_fixnum_type, do_tc("var_type :x, 'Fixnum'; x = 3; x", env: @env)
262
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("var_type :x, 'Fixnum'; x = 'three'", env: @env) }
438
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("RDL.var_type :x", env: @env) }
439
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("RDL.var_type :x, 3", env: @env) }
440
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("RDL.var_type 'x', 'Integer'", env: @env) }
441
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("RDL.var_type :@x, 'Integer'", env: @env) }
442
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("RDL.var_type :x, 'Fluffy Bunny'", env: @env) }
443
+
444
+ assert do_tc("RDL.var_type :x, 'Integer'; x = 3; x", env: @env) <= RDL::Globals.types[:integer]
445
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("RDL.var_type :x, 'Integer'; x = 'three'", env: @env) }
263
446
  self.class.class_eval {
264
- type "(Fixnum) -> nil", typecheck: :now
447
+ type "(Integer) -> nil", typecheck: :now
265
448
  def lvar_type_ff(x) x = 42; nil; end
266
449
  }
267
450
  assert_raises(RDL::Typecheck::StaticTypeError) {
268
451
  self.class.class_eval {
269
- type "(Fixnum) -> nil", typecheck: :now
452
+ type "(Integer) -> nil", typecheck: :now
270
453
  def lvar_type_ff2(x) x = "forty-two"; nil; end
271
454
  }
272
455
  }
@@ -274,59 +457,62 @@ class TestTypecheck < Minitest::Test
274
457
 
275
458
  def test_ivar_ivasgn
276
459
  self.class.class_eval {
277
- var_type :@foo, "Fixnum"
278
- var_type :@@foo, "Fixnum"
279
- var_type :$test_ivar_ivasgn_global, "Fixnum"
460
+ extend RDL::Annotate
461
+ var_type :@foo, "Integer"
462
+ var_type :@@foo, "Integer"
463
+ var_type :$test_ivar_ivasgn_global, "Integer"
280
464
  var_type :@object, "Object"
281
465
  }
282
466
 
283
- assert_equal $__rdl_fixnum_type, do_tc("@foo", env: @env)
284
- assert_equal $__rdl_fixnum_type, do_tc("@@foo", env: @env)
285
- assert_equal $__rdl_fixnum_type, do_tc("$test_ivar_ivasgn_global")
467
+ assert do_tc("@foo", env: @env) <= RDL::Globals.types[:integer]
468
+ assert do_tc("@@foo", env: @env) <= RDL::Globals.types[:integer]
469
+ assert do_tc("$test_ivar_ivasgn_global") <= RDL::Globals.types[:integer]
286
470
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("@bar", env: @env) }
287
471
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("@bar", env: @env) }
288
472
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("@@bar", env: @env) }
289
473
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("$_test_ivar_ivasgn_global_2") }
290
474
 
291
- assert_equal @t3, do_tc("@foo = 3", env: @env)
475
+ assert do_tc("@foo = 3", env: @env) <= @t3
292
476
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("@foo = 'three'", env: @env) }
293
477
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("@bar = 'three'", env: @env) }
294
- assert_equal @t3, do_tc("@@foo = 3", env: @env)
478
+ assert do_tc("@@foo = 3", env: @env) <= @t3
295
479
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("@@foo = 'three'", env: @env) }
296
480
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("@@bar = 'three'", env: @env) }
297
- assert_equal @t3, do_tc("$test_ivar_ivasgn_global = 3")
481
+ assert do_tc("$test_ivar_ivasgn_global = 3") <= @t3
298
482
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("$test_ivar_ivasgn_global = 'three'") }
299
483
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("$test_ivar_ivasgn_global_2 = 'three'") }
300
- assert_equal @t3, do_tc("@object = 3", env: @env) # type of assignment is type of rhs
484
+ assert do_tc("@object = 3", env: @env) <= @t3 # type of assignment is type of rhs
301
485
  end
302
486
 
303
487
  def test_send_basic
304
488
  self.class.class_eval {
305
- type :_send_basic2, "() -> Fixnum"
306
- type :_send_basic3, "(Fixnum) -> Fixnum"
307
- type :_send_basic4, "(Fixnum, String) -> Fixnum"
308
- type "self._send_basic5", "(Fixnum) -> Fixnum"
489
+ type :_send_basic2, "() -> Integer"
490
+ type :_send_basic3, "(Integer) -> Integer"
491
+ type :_send_basic4, "(Integer, String) -> Integer"
492
+ type "self._send_basic5", "(Integer) -> Integer"
309
493
  }
310
494
 
311
495
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("z", env: @env) }
312
- assert_equal $__rdl_fixnum_type, do_tc("_send_basic2", env: @env)
313
- assert_equal $__rdl_fixnum_type, do_tc("_send_basic3(42)", env: @env)
496
+ assert do_tc("_send_basic2", env: @env) <= RDL::Globals.types[:integer]
497
+ assert do_tc("_send_basic3(42)", env: @env) <= RDL::Globals.types[:integer]
314
498
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_basic3('42')", env: @env) }
315
- assert_equal $__rdl_fixnum_type, do_tc("_send_basic4(42, '42')", env: @env)
499
+ assert do_tc("_send_basic4(42, '42')", env: @env) <= RDL::Globals.types[:integer]
316
500
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_basic4(42, 43)", env: @env) }
317
501
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_basic4('42', '43')", env: @env) }
318
- assert_equal $__rdl_fixnum_type, do_tc("TestTypecheck._send_basic5(42)", env: @env)
502
+ assert do_tc("TestTypecheck._send_basic5(42)", env: @env) <= RDL::Globals.types[:integer]
319
503
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("TestTypecheck._send_basic5('42')", env: @env) }
320
- assert_equal $__rdl_nil_type, do_tc("puts 42", env: @env)
504
+ assert do_tc("puts 42", env: @env) <= RDL::Globals.types[:nil]
321
505
  end
322
506
 
323
507
  class A
324
- type :_send_inherit1, "() -> Fixnum"
508
+ extend RDL::Annotate
509
+ type :_send_inherit1, "() -> Integer"
325
510
  end
326
511
  class B < A
327
512
  end
328
513
 
329
514
  class A1
515
+ extend RDL::Annotate
330
516
  type "() -> nil"
331
517
  def _send_inherit2; end
332
518
  end
@@ -337,17 +523,17 @@ class TestTypecheck < Minitest::Test
337
523
  end
338
524
 
339
525
  def test_send_inherit
340
- assert_equal $__rdl_fixnum_type, do_tc("B.new._send_inherit1", env: @env)
526
+ assert do_tc("B.new._send_inherit1", env: @env) <= RDL::Globals.types[:integer]
341
527
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("A3.new._send_inherit2", env: @env) }
342
528
  end
343
529
 
344
530
  def test_send_inter
345
531
  self.class.class_eval {
346
- type :_send_inter1, "(Fixnum) -> Fixnum"
532
+ type :_send_inter1, "(Integer) -> Integer"
347
533
  type :_send_inter1, "(String) -> String"
348
534
  }
349
- assert_equal $__rdl_fixnum_type, do_tc("_send_inter1(42)", env: @env)
350
- assert_equal $__rdl_string_type, do_tc("_send_inter1('42')", env: @env)
535
+ assert do_tc("_send_inter1(42)", env: @env) <= RDL::Globals.types[:integer]
536
+ assert do_tc("_send_inter1('42')", env: @env) <= RDL::Globals.types[:string]
351
537
 
352
538
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_inter1(:forty_two)", env: @env) }
353
539
  end
@@ -355,57 +541,57 @@ class TestTypecheck < Minitest::Test
355
541
  def test_send_opt_varargs
356
542
  # from test_type_contract.rb
357
543
  self.class.class_eval {
358
- type :_send_opt_varargs1, "(Fixnum, ?Fixnum) -> Fixnum"
359
- type :_send_opt_varargs2, "(Fixnum, *Fixnum) -> Fixnum"
360
- type :_send_opt_varargs3, "(Fixnum, ?Fixnum, ?Fixnum, *Fixnum) -> Fixnum"
361
- type :_send_opt_varargs4, "(?Fixnum) -> Fixnum"
362
- type :_send_opt_varargs5, "(*Fixnum) -> Fixnum"
363
- type :_send_opt_varargs6, "(?Fixnum, String) -> Fixnum"
364
- type :_send_opt_varargs7, "(Fixnum, *String, Fixnum) -> Fixnum"
365
- }
366
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs1(42)", env: @env)
367
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs1(42, 43)", env: @env)
544
+ type :_send_opt_varargs1, "(Integer, ?Integer) -> Integer"
545
+ type :_send_opt_varargs2, "(Integer, *Integer) -> Integer"
546
+ type :_send_opt_varargs3, "(Integer, ?Integer, ?Integer, *Integer) -> Integer"
547
+ type :_send_opt_varargs4, "(?Integer) -> Integer"
548
+ type :_send_opt_varargs5, "(*Integer) -> Integer"
549
+ type :_send_opt_varargs6, "(?Integer, String) -> Integer"
550
+ type :_send_opt_varargs7, "(Integer, *String, Integer) -> Integer"
551
+ }
552
+ assert do_tc("_send_opt_varargs1(42)", env: @env) <= RDL::Globals.types[:integer]
553
+ assert do_tc("_send_opt_varargs1(42, 43)", env: @env) <= RDL::Globals.types[:integer]
368
554
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs1()", env: @env) }
369
555
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs1(42, 43, 44)", env: @env) }
370
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs2(42)", env: @env)
371
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs2(42, 43)", env: @env)
372
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs2(42, 43, 44)", env: @env)
373
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs2(42, 43, 44, 45)", env: @env)
556
+ assert do_tc("_send_opt_varargs2(42)", env: @env) <= RDL::Globals.types[:integer]
557
+ assert do_tc("_send_opt_varargs2(42, 43)", env: @env) <= RDL::Globals.types[:integer]
558
+ assert do_tc("_send_opt_varargs2(42, 43, 44)", env: @env) <= RDL::Globals.types[:integer]
559
+ assert do_tc("_send_opt_varargs2(42, 43, 44, 45)", env: @env) <= RDL::Globals.types[:integer]
374
560
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs2()", env: @env) }
375
561
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs2('42')", env: @env) }
376
562
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs2(42, '43')", env: @env) }
377
563
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs2(42, 43, '44')", env: @env) }
378
564
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs2(42, 43, 44, '45')", env: @env) }
379
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs3(42)", env: @env)
380
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs3(42, 43)", env: @env)
381
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs3(42, 43, 44)", env: @env)
382
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs3(42, 43, 45)", env: @env)
383
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs3(42, 43, 46)", env: @env)
565
+ assert do_tc("_send_opt_varargs3(42)", env: @env) <= RDL::Globals.types[:integer]
566
+ assert do_tc("_send_opt_varargs3(42, 43)", env: @env) <= RDL::Globals.types[:integer]
567
+ assert do_tc("_send_opt_varargs3(42, 43, 44)", env: @env) <= RDL::Globals.types[:integer]
568
+ assert do_tc("_send_opt_varargs3(42, 43, 45)", env: @env) <= RDL::Globals.types[:integer]
569
+ assert do_tc("_send_opt_varargs3(42, 43, 46)", env: @env) <= RDL::Globals.types[:integer]
384
570
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs3()", env: @env) }
385
571
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs3('42')", env: @env) }
386
572
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs3(42, '43')", env: @env) }
387
573
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs3(42, 43, '44')", env: @env) }
388
574
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs3(42, 43, 44, '45')", env: @env) }
389
575
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs3(42, 43, 44, 45, '46')", env: @env) }
390
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs4()", env: @env)
391
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs4(42)", env: @env)
576
+ assert do_tc("_send_opt_varargs4()", env: @env) <= RDL::Globals.types[:integer]
577
+ assert do_tc("_send_opt_varargs4(42)", env: @env) <= RDL::Globals.types[:integer]
392
578
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs4('42')", env: @env) }
393
579
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs4(42, 43)", env: @env) }
394
580
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs4(42, 43, 44)", env: @env) }
395
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs5()", env: @env)
396
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs5(42)", env: @env)
397
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs5(42, 43)", env: @env)
398
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs5(42, 43, 44)", env: @env)
581
+ assert do_tc("_send_opt_varargs5()", env: @env) <= RDL::Globals.types[:integer]
582
+ assert do_tc("_send_opt_varargs5(42)", env: @env) <= RDL::Globals.types[:integer]
583
+ assert do_tc("_send_opt_varargs5(42, 43)", env: @env) <= RDL::Globals.types[:integer]
584
+ assert do_tc("_send_opt_varargs5(42, 43, 44)", env: @env) <= RDL::Globals.types[:integer]
399
585
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs5('42')", env: @env) }
400
586
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs5(42, '43')", env: @env) }
401
587
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs5(42, 43, '44')", env: @env) }
402
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs6('44')", env: @env)
403
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs6(43, '44')", env: @env)
588
+ assert do_tc("_send_opt_varargs6('44')", env: @env) <= RDL::Globals.types[:integer]
589
+ assert do_tc("_send_opt_varargs6(43, '44')", env: @env) <= RDL::Globals.types[:integer]
404
590
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs6()", env: @env) }
405
591
  assert_raises(RDL::Typecheck::StaticTypeError) { assert do_tc("_send_opt_varargs6(43, '44', 45)", env: @env) }
406
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs7(42, 43)", env: @env)
407
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs7(42, 'foo', 43)", env: @env)
408
- assert_equal $__rdl_fixnum_type, do_tc("_send_opt_varargs7(42, 'foo', 'bar', 43)", env: @env)
592
+ assert do_tc("_send_opt_varargs7(42, 43)", env: @env) <= RDL::Globals.types[:integer]
593
+ assert do_tc("_send_opt_varargs7(42, 'foo', 43)", env: @env) <= RDL::Globals.types[:integer]
594
+ assert do_tc("_send_opt_varargs7(42, 'foo', 'bar', 43)", env: @env) <= RDL::Globals.types[:integer]
409
595
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_opt_varargs7", env: @env) }
410
596
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_opt_varargs7('42')", env: @env) }
411
597
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_opt_varargs7(42)", env: @env) }
@@ -416,108 +602,108 @@ class TestTypecheck < Minitest::Test
416
602
  def test_send_named_args
417
603
  # from test_type_contract.rb
418
604
  self.class.class_eval {
419
- type :_send_named_args1, "(x: Fixnum) -> Fixnum"
420
- type :_send_named_args2, "(x: Fixnum, y: String) -> Fixnum"
421
- type :_send_named_args3, "(Fixnum, y: String) -> Fixnum"
422
- type :_send_named_args4, "(Fixnum, x: Fixnum, y: String) -> Fixnum"
423
- type :_send_named_args5, "(x: Fixnum, y: ?String) -> Fixnum"
424
- type :_send_named_args6, "(x: ?Fixnum, y: String) -> Fixnum"
425
- type :_send_named_args7, "(x: ?Fixnum, y: ?String) -> Fixnum"
426
- type :_send_named_args8, "(?Fixnum, x: ?Symbol, y: ?String) -> Fixnum"
427
- type :_send_named_args9, "(Fixnum, x: String, y: Fixnum, **Float) -> Fixnum"
428
- }
429
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args1(x: 42)", env: @env)
605
+ type :_send_named_args1, "(x: Integer) -> Integer"
606
+ type :_send_named_args2, "(x: Integer, y: String) -> Integer"
607
+ type :_send_named_args3, "(Integer, y: String) -> Integer"
608
+ type :_send_named_args4, "(Integer, x: Integer, y: String) -> Integer"
609
+ type :_send_named_args5, "(x: Integer, y: ?String) -> Integer"
610
+ type :_send_named_args6, "(x: ?Integer, y: String) -> Integer"
611
+ type :_send_named_args7, "(x: ?Integer, y: ?String) -> Integer"
612
+ type :_send_named_args8, "(?Integer, x: ?Symbol, y: ?String) -> Integer"
613
+ type :_send_named_args9, "(Integer, x: String, y: Integer, **Float) -> Integer"
614
+ }
615
+ assert do_tc("_send_named_args1(x: 42)", env: @env) <= RDL::Globals.types[:integer]
430
616
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args1(x: '42')", env: @env) }
431
617
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args1()", env: @env) }
432
618
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args1(x: 42, y: 42)", env: @env) }
433
619
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args1(y: 42)", env: @env) }
434
620
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args1(42)", env: @env) }
435
621
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args1(42, x: '42')", env: @env) }
436
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args2(x: 42, y: '43')", env: @env)
622
+ assert do_tc("_send_named_args2(x: 42, y: '43')", env: @env) <= RDL::Globals.types[:integer]
437
623
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args2()", env: @env) }
438
624
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args2(x: 42)", env: @env) }
439
625
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args2(x: '42', y: '43')", env: @env) }
440
626
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args2(42, '43')", env: @env) }
441
627
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args2(42, x: 42, y: '43')", env: @env) }
442
628
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args2(x: 42, y: '43', z: 44)", env: @env) }
443
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args3(42, y: '43')", env: @env)
629
+ assert do_tc("_send_named_args3(42, y: '43')", env: @env) <= RDL::Globals.types[:integer]
444
630
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args3(42, y: 43)", env: @env) }
445
631
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args3()", env: @env) }
446
632
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args3(42, 43, y: 44)", env: @env) }
447
633
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args3(42, y: 43, z: 44)", env: @env) }
448
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args4(42, x: 43, y: '44')", env: @env)
634
+ assert do_tc("_send_named_args4(42, x: 43, y: '44')", env: @env) <= RDL::Globals.types[:integer]
449
635
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args4(42, x: 43)", env: @env) }
450
636
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args4(42, y: '43')", env: @env) }
451
637
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args4()", env: @env) }
452
638
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args4(42, 43, x: 44, y: '45')", env: @env) }
453
639
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args4(42, x: 43, y: '44', z: 45)", env: @env) }
454
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args5(x: 42, y: '43')", env: @env)
455
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args5(x: 42)", env: @env)
640
+ assert do_tc("_send_named_args5(x: 42, y: '43')", env: @env) <= RDL::Globals.types[:integer]
641
+ assert do_tc("_send_named_args5(x: 42)", env: @env) <= RDL::Globals.types[:integer]
456
642
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args5()", env: @env) }
457
643
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args5(x: 42, y: 43)", env: @env) }
458
644
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args5(x: 42, y: 43, z: 44)", env: @env) }
459
645
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args5(3, x: 42, y: 43)", env: @env) }
460
646
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args5(3, x: 42)", env: @env) }
461
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args6(x: 43, y: '44')", env: @env)
462
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args6(y: '44')", env: @env)
647
+ assert do_tc("_send_named_args6(x: 43, y: '44')", env: @env) <= RDL::Globals.types[:integer]
648
+ assert do_tc("_send_named_args6(y: '44')", env: @env) <= RDL::Globals.types[:integer]
463
649
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args6()", env: @env) }
464
650
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args6(x: '43', y: '44')", env: @env) }
465
651
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args6(42, x: 43, y: '44')", env: @env) }
466
652
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args6(x: 43, y: '44', z: 45)", env: @env) }
467
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args7()", env: @env)
468
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args7(x: 43)", env: @env)
469
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args7(y: '44')", env: @env)
470
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args7(x: 43, y: '44')", env: @env)
653
+ assert do_tc("_send_named_args7()", env: @env) <= RDL::Globals.types[:integer]
654
+ assert do_tc("_send_named_args7(x: 43)", env: @env) <= RDL::Globals.types[:integer]
655
+ assert do_tc("_send_named_args7(y: '44')", env: @env) <= RDL::Globals.types[:integer]
656
+ assert do_tc("_send_named_args7(x: 43, y: '44')", env: @env) <= RDL::Globals.types[:integer]
471
657
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args7(x: '43', y: '44')", env: @env) }
472
658
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args7(41, x: 43, y: '44')", env: @env) }
473
659
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args7(x: 43, y: '44', z: 45)", env: @env) }
474
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args8()", env: @env)
475
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args8(43)", env: @env)
476
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args8(x: :foo)", env: @env)
477
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args8(43, x: :foo)", env: @env)
478
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args8(y: 'foo')", env: @env)
479
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args8(43, y: 'foo')", env: @env)
480
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args8(x: :foo, y: 'foo')", env: @env)
481
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args8(43, x: :foo, y: 'foo')", env: @env)
660
+ assert do_tc("_send_named_args8()", env: @env) <= RDL::Globals.types[:integer]
661
+ assert do_tc("_send_named_args8(43)", env: @env) <= RDL::Globals.types[:integer]
662
+ assert do_tc("_send_named_args8(x: :foo)", env: @env) <= RDL::Globals.types[:integer]
663
+ assert do_tc("_send_named_args8(43, x: :foo)", env: @env) <= RDL::Globals.types[:integer]
664
+ assert do_tc("_send_named_args8(y: 'foo')", env: @env) <= RDL::Globals.types[:integer]
665
+ assert do_tc("_send_named_args8(43, y: 'foo')", env: @env) <= RDL::Globals.types[:integer]
666
+ assert do_tc("_send_named_args8(x: :foo, y: 'foo')", env: @env) <= RDL::Globals.types[:integer]
667
+ assert do_tc("_send_named_args8(43, x: :foo, y: 'foo')", env: @env) <= RDL::Globals.types[:integer]
482
668
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args8(43, 44, x: :foo, y: 'foo')", env: @env) }
483
669
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args8(43, x: 'foo', y: 'foo')", env: @env) }
484
670
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args8(43, x: :foo, y: 'foo', z: 44)", env: @env) }
485
671
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args9", env: @env) }
486
672
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args9(43)", env: @env) }
487
673
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args9(43, x: 'foo')", env: @env) }
488
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args9(43, x:'foo', y: 44)", env: @env)
489
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args9(43, x:'foo', y: 44, pi: 3.14)", env: @env)
490
- assert_equal $__rdl_fixnum_type, do_tc("_send_named_args9(43, x:'foo', y: 44, pi: 3.14, e: 2.72)", env: @env)
674
+ assert do_tc("_send_named_args9(43, x:'foo', y: 44)", env: @env) <= RDL::Globals.types[:integer]
675
+ assert do_tc("_send_named_args9(43, x:'foo', y: 44, pi: 3.14)", env: @env) <= RDL::Globals.types[:integer]
676
+ assert do_tc("_send_named_args9(43, x:'foo', y: 44, pi: 3.14, e: 2.72)", env: @env) <= RDL::Globals.types[:integer]
491
677
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args9(43, x: 'foo', y: 44, pi: 3)", env: @env) }
492
678
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_named_args9(43, x: 'foo', y: 44, pi: 3.14, e: 3)", env: @env) }
493
679
  end
494
680
 
495
681
  def test_send_singleton
496
- type Fixnum, :_send_singleton, "() -> String"
497
- assert_equal $__rdl_string_type, do_tc("3._send_singleton", env: @env)
682
+ RDL.type Integer, :_send_singleton, "() -> String"
683
+ assert do_tc("3._send_singleton", env: @env) <= RDL::Globals.types[:string]
498
684
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("3._send_singleton_nexists", env: @env) }
499
685
  end
500
686
 
501
687
  def test_send_generic
502
- assert_equal $__rdl_fixnum_type, do_tc("[1,2,3].length", env: @env)
503
- assert_equal $__rdl_fixnum_type, do_tc("{a:1, b:2}.length", env: @env)
504
- assert_equal $__rdl_string_type, do_tc("String.new.clone", env: @env)
688
+ assert do_tc("[1,2,3].length", env: @env) <= RDL::Globals.types[:integer]
689
+ assert do_tc("{a:1, b:2}.length", env: @env) <= RDL::Globals.types[:integer]
690
+ assert do_tc("String.new.clone", env: @env) <= RDL::Globals.types[:string]
505
691
  # TODO test case with other generic
506
692
  end
507
693
 
508
694
  def test_send_alias
509
- assert_equal $__rdl_fixnum_type, do_tc("[1,2,3].size", env: @env)
695
+ assert do_tc("[1,2,3].size", env: @env) <= RDL::Globals.types[:integer]
510
696
  end
511
697
 
512
698
  def test_send_block
513
699
  self.class.class_eval {
514
- type :_send_block1, "(Fixnum) { (Fixnum) -> Fixnum } -> Fixnum"
515
- type :_send_block2, "(Fixnum) -> Fixnum"
700
+ type :_send_block1, "(Integer) { (Integer) -> Integer } -> Integer"
701
+ type :_send_block2, "(Integer) -> Integer"
516
702
  }
517
703
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_block1(42)", env: @env) }
518
704
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_block2(42) { |x| x + 1 }", env: @env) }
519
705
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_block1(42) { |x, y| x + y }", env: @env) }
520
- assert_equal $__rdl_fixnum_type, do_tc("_send_block1(42) { |x| x }", env: @env)
706
+ assert do_tc("_send_block1(42) { |x| x }", env: @env) <= RDL::Globals.types[:integer]
521
707
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_send_block1(42) { |x| 'forty-two' }", env: @env) }
522
708
  self.class.class_eval {
523
709
  type "() -> 1", typecheck: :now
@@ -532,7 +718,7 @@ class TestTypecheck < Minitest::Test
532
718
  end
533
719
  }
534
720
  self.class.class_eval {
535
- type "() -> Fixnum or String", typecheck: :now
721
+ type "() -> Integer or String", typecheck: :now
536
722
  def _send_blockd3
537
723
  x = 'one'; _send_block1(42) { |y| for x in 1..5 do end; y }; x
538
724
  end
@@ -543,50 +729,49 @@ class TestTypecheck < Minitest::Test
543
729
  self.class.class_eval {
544
730
  type :_send_method_generic1, '(t) -> t'
545
731
  type :_send_method_generic2, '(t, u) -> t or u'
546
- type :_send_method_generic3, '() { (u) -> Fixnum } -> Fixnum'
732
+ type :_send_method_generic3, '() { (u) -> Integer } -> Integer'
547
733
  type :_send_method_generic4, '(t) { (t) -> t } -> t'
548
734
  type :_send_method_generic5, '() { (u) -> u } -> u'
549
- type :_send_method_generic6, '() { (Fixnum) -> u } -> u'
735
+ type :_send_method_generic6, '() { (Integer) -> u } -> u'
550
736
  }
551
- assert_equal @t3, do_tc('_send_method_generic1 3', env: @env)
552
- assert_equal $__rdl_string_type, do_tc('_send_method_generic1 "foo"', env: @env)
553
- assert_equal tt("3 or String"), do_tc('_send_method_generic2 3, "foo"', env: @env)
554
- assert_equal $__rdl_fixnum_type, do_tc('_send_method_generic3 { |x| 42 }', env: @env)
555
- assert_equal tt("42"), do_tc('_send_method_generic4(42) { |x| x }', env: @env)
737
+ assert do_tc('_send_method_generic1 3', env: @env) <= @t3
738
+ assert do_tc('_send_method_generic1 "foo"', env: @env) <= RDL::Globals.types[:string]
739
+ assert do_tc('_send_method_generic2 3, "foo"', env: @env) <= tt("3 or String")
740
+ assert do_tc('_send_method_generic3 { |x| 42 }', env: @env) <= RDL::Globals.types[:integer]
741
+ assert do_tc('_send_method_generic4(42) { |x| x }', env: @env) <= tt("42")
556
742
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc('_send_method_generic4(42) { |x| "foo" }', env: @env) }
557
- assert_equal tt("u"), do_tc('_send_method_generic5 { |x| x }', env: @env) # not possible to implement _send_method_generic5!
558
- assert_equal tt("3"), do_tc('_send_method_generic5 { |x| 3 }', env: @env) # weird example, but can pick u=3
559
- assert_equal $__rdl_string_type, do_tc('_send_method_generic6 { |x| "foo" }', env: @env)
560
- assert_equal tt("%integer"), do_tc('[1,2,3].index(Object.new)', env: @env)
561
- assert_equal tt("Array<Fixnum or Bignum>"), do_tc('[1, 2, 3].map { |y| y * 4 }', env: @env)
562
- assert_equal tt("Array<String>"), do_tc('[1, 2, 3].map { |y| y.to_s }', env: @env)
743
+ assert do_tc('_send_method_generic5 { |x| x }', env: @env) <= tt("u") # not possible to implement _send_method_generic5!
744
+ assert do_tc('_send_method_generic5 { |x| 3 }', env: @env) <= tt("3") # weird example, but can pick u=3
745
+ assert do_tc('_send_method_generic6 { |x| "foo" }', env: @env) <= RDL::Globals.types[:string]
746
+ assert do_tc('[1,2,3].index(Object.new)', env: @env) <= tt("Integer")
747
+ assert do_tc('[1, 2, 3].map { |y| y.to_s }', env: @env) <= tt("Array<String>")
563
748
  end
564
749
 
565
750
  def test_send_union
566
751
  self.class.class_eval {
567
- type :_send_union1, "(Fixnum) -> Float"
752
+ type :_send_union1, "(Integer) -> Float"
568
753
  type :_send_union1, "(String) -> Rational"
569
754
  }
570
- assert_equal RDL::Type::UnionType.new(@tfs, $__rdl_bignum_type), do_tc("(if _any_object then Fixnum.new else String.new end) * 2", env: @env)
571
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("(if _any_object then Object.new else Fixnum.new end) + 2", env: @env) }
572
- assert_equal tt("Float or Rational"), do_tc("if _any_object then x = Fixnum.new else x = String.new end; _send_union1(x)", env: @env)
755
+ assert do_tc("(if _any_object then Integer.new else String.new end) * 2", env: @env) <= RDL::Type::UnionType.new(@tfs, RDL::Globals.types[:integer])
756
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("(if _any_object then Object.new else Integer.new end) + 2", env: @env) }
757
+ assert do_tc("if _any_object then x = Integer.new else x = String.new end; _send_union1(x)", env: @env) <= tt("Float or Rational")
573
758
  end
574
759
 
575
760
  def test_send_splat
576
761
  self.class.class_eval {
577
- type :_send_splat1, "(Fixnum, String, Fixnum, String) -> Fixnum"
578
- type :_send_splat2, "(String, *Fixnum, Float) -> Fixnum"
579
- type :_send_splat_fa, "() -> Array<Fixnum>"
762
+ type :_send_splat1, "(Integer, String, Integer, String) -> Integer"
763
+ type :_send_splat2, "(String, *Integer, Float) -> Integer"
764
+ type :_send_splat_fa, "() -> Array<Integer>"
580
765
  }
581
- assert_equal $__rdl_fixnum_type, do_tc("x = ['foo', 42]; _send_splat1(1, *x, 'bar')", env: @env)
582
- assert_equal $__rdl_fixnum_type, do_tc("x = _send_splat_fa; _send_splat2('foo', *x, 3.14)", env: @env)
766
+ assert do_tc("x = ['foo', 42]; _send_splat1(1, *x, 'bar')", env: @env) <= RDL::Globals.types[:integer]
767
+ assert do_tc("x = _send_splat_fa; _send_splat2('foo', *x, 3.14)", env: @env) <= RDL::Globals.types[:integer]
583
768
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x = _send_splat_fa; _send_splat1(*x, 'foo', 2, 'bar')", env: @env) }
584
769
  end
585
770
 
586
771
 
587
772
  def test_yield
588
773
  self.class.class_eval {
589
- type "(Fixnum) { (Fixnum) -> Fixnum } -> Fixnum", typecheck: :now
774
+ type "(Integer) { (Integer) -> Integer } -> Integer", typecheck: :now
590
775
  def _yield1(x)
591
776
  yield x
592
777
  end
@@ -594,7 +779,7 @@ class TestTypecheck < Minitest::Test
594
779
 
595
780
  assert_raises(RDL::Typecheck::StaticTypeError) {
596
781
  self.class.class_eval {
597
- type "(Fixnum) { (Fixnum) -> Fixnum } -> Fixnum", typecheck: :now
782
+ type "(Integer) { (Integer) -> Integer } -> Integer", typecheck: :now
598
783
  def _yield2(x)
599
784
  yield 'forty-two'
600
785
  end
@@ -603,7 +788,7 @@ class TestTypecheck < Minitest::Test
603
788
 
604
789
  assert_raises(RDL::Typecheck::StaticTypeError) {
605
790
  self.class.class_eval {
606
- type "(Fixnum) { (Fixnum) -> String } -> Fixnum", typecheck: :now
791
+ type "(Integer) { (Integer) -> String } -> Integer", typecheck: :now
607
792
  def _yield3(x)
608
793
  yield 42
609
794
  end
@@ -612,7 +797,7 @@ class TestTypecheck < Minitest::Test
612
797
 
613
798
  assert_raises(RDL::Typecheck::StaticTypeError) {
614
799
  self.class.class_eval {
615
- type "(Fixnum) -> Fixnum", typecheck: :now
800
+ type "(Integer) -> Integer", typecheck: :now
616
801
  def _yield4(x)
617
802
  yield 42
618
803
  end
@@ -621,7 +806,7 @@ class TestTypecheck < Minitest::Test
621
806
 
622
807
  assert_raises(RDL::Typecheck::StaticTypeError) {
623
808
  self.class.class_eval {
624
- type "(Fixnum) { (Fixnum) { (Fixnum) -> Fixnum } -> Fixnum } -> Fixnum", typecheck: :now
809
+ type "(Integer) { (Integer) { (Integer) -> Integer } -> Integer } -> Integer", typecheck: :now
625
810
  def _yield5(x)
626
811
  yield 42
627
812
  end
@@ -631,7 +816,7 @@ class TestTypecheck < Minitest::Test
631
816
 
632
817
  def test_block_arg
633
818
  self.class.class_eval {
634
- type "(Fixnum) { (Fixnum) -> Fixnum } -> Fixnum", typecheck: :now
819
+ type "(Integer) { (Integer) -> Integer } -> Integer", typecheck: :now
635
820
  def _block_arg1(x, &blk)
636
821
  blk.call x
637
822
  end
@@ -639,7 +824,7 @@ class TestTypecheck < Minitest::Test
639
824
 
640
825
  assert_raises(RDL::Typecheck::StaticTypeError) {
641
826
  self.class.class_eval {
642
- type "(Fixnum) { (Fixnum) -> Fixnum } -> Fixnum", typecheck: :now
827
+ type "(Integer) { (Integer) -> Integer } -> Integer", typecheck: :now
643
828
  def _block_arg2(x, &blk)
644
829
  blk.call 'forty-two'
645
830
  end
@@ -648,7 +833,7 @@ class TestTypecheck < Minitest::Test
648
833
 
649
834
  assert_raises(RDL::Typecheck::StaticTypeError) {
650
835
  self.class.class_eval {
651
- type "(Fixnum) { (Fixnum) -> String } -> Fixnum", typecheck: :now
836
+ type "(Integer) { (Integer) -> String } -> Integer", typecheck: :now
652
837
  def _block_arg3(x, &foo)
653
838
  foo.call 42
654
839
  end
@@ -657,7 +842,7 @@ class TestTypecheck < Minitest::Test
657
842
 
658
843
  assert_raises(RDL::Typecheck::StaticTypeError) {
659
844
  self.class.class_eval {
660
- type "(Fixnum) -> Fixnum", typecheck: :now
845
+ type "(Integer) -> Integer", typecheck: :now
661
846
  def _block_arg4(x, &blk)
662
847
  blk.call 42
663
848
  end
@@ -666,7 +851,7 @@ class TestTypecheck < Minitest::Test
666
851
 
667
852
  assert_raises(RDL::Typecheck::StaticTypeError) {
668
853
  self.class.class_eval {
669
- type "(Fixnum) { (Fixnum) { (Fixnum) -> Fixnum } -> Fixnum } -> Fixnum", typecheck: :now
854
+ type "(Integer) { (Integer) { (Integer) -> Integer } -> Integer } -> Integer", typecheck: :now
670
855
  def _block_arg5(x, &blk)
671
856
  blk.call 42
672
857
  end
@@ -674,8 +859,8 @@ class TestTypecheck < Minitest::Test
674
859
  }
675
860
 
676
861
  self.class.class_eval {
677
- type :_block_arg6, "(Fixnum) { (Fixnum) -> Fixnum } -> Fixnum"
678
- type "() { (Fixnum) -> Fixnum } -> Fixnum", typecheck: :now
862
+ type :_block_arg6, "(Integer) { (Integer) -> Integer } -> Integer"
863
+ type "() { (Integer) -> Integer } -> Integer", typecheck: :now
679
864
  def _block_arg7(&blk)
680
865
  _block_arg6(42, &blk)
681
866
  end
@@ -683,7 +868,7 @@ class TestTypecheck < Minitest::Test
683
868
 
684
869
  assert_raises(RDL::Typecheck::StaticTypeError) {
685
870
  self.class.class_eval {
686
- type "() { (Fixnum) -> String } -> Fixnum", typecheck: :now
871
+ type "() { (Integer) -> String } -> Integer", typecheck: :now
687
872
  def _block_arg8(&blk)
688
873
  _block_arg6(42, &blk)
689
874
  end
@@ -692,7 +877,7 @@ class TestTypecheck < Minitest::Test
692
877
 
693
878
  assert_raises(RDL::Typecheck::StaticTypeError) {
694
879
  self.class.class_eval {
695
- type "() -> Fixnum", typecheck: :now
880
+ type "() -> Integer", typecheck: :now
696
881
  def _block_arg9()
697
882
  _block_arg6(42, &(1+2))
698
883
  end
@@ -700,23 +885,23 @@ class TestTypecheck < Minitest::Test
700
885
  }
701
886
 
702
887
  self.class.class_eval {
703
- type :_block_arg10, "(Fixnum) -> Fixnum"
704
- type :_block_arg11, "(Fixnum) -> String"
888
+ type :_block_arg10, "(Integer) -> Integer"
889
+ type :_block_arg11, "(Integer) -> String"
705
890
  }
706
- assert_equal $__rdl_fixnum_type, do_tc("_block_arg6(42, &:_block_arg10)", env: @env)
891
+ assert do_tc("_block_arg6(42, &:_block_arg10)", env: @env) <= RDL::Globals.types[:integer]
707
892
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_block_arg6(42, &:_block_arg11)", env: @env) }
708
893
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("_block_arg6(42, &:_block_arg_does_not_exist)", env: @env) }
709
894
  end
710
895
 
711
896
  # class Sup1
712
- # type '(Fixnum) -> Fixnum', typecheck: :call
897
+ # type '(Integer) -> Integer', typecheck: :call
713
898
  # def foo(y)
714
899
  # return y
715
900
  # end
716
901
  # end
717
902
  #
718
903
  # class Sup2 < Sup1
719
- # type '(Fixnum) -> Fixnum', typecheck: :call
904
+ # type '(Integer) -> Integer', typecheck: :call
720
905
  # def foo(x)
721
906
  # super(x+1)
722
907
  # end
@@ -727,130 +912,132 @@ class TestTypecheck < Minitest::Test
727
912
  # end
728
913
 
729
914
  def test_new
730
- assert_equal RDL::Type::NominalType.new(B), do_tc("B.new", env: @env)
915
+ assert do_tc("B.new", env: @env) <= RDL::Type::NominalType.new(B)
731
916
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("B.new(3)", env: @env) }
732
917
  end
733
918
 
734
919
  def test_if
735
- assert_equal @t3n, do_tc("if _any_object then 3 end", env: @env)
736
- assert_equal @t3n, do_tc("unless _any_object then 3 end", env: @env)
737
- assert_equal @t34, do_tc("if _any_object then 3 else 4 end", env: @env)
738
- assert_equal @t34, do_tc("unless _any_object then 3 else 4 end", env: @env)
739
- assert_equal @ts3, do_tc("if _any_object then 3 else 'three' end", env: @env)
740
- assert_equal @ts3, do_tc("unless _any_object then 3 else 'three' end", env: @env)
741
- assert_equal @t3n, do_tc("3 if _any_object", env: @env)
742
- assert_equal @t3n, do_tc("3 unless _any_object", env: @env)
743
- assert_equal @t3, do_tc("if true then 3 else 'three' end", env: @env)
744
- assert_equal @t3, do_tc("if :foo then 3 else 'three' end", env: @env)
745
- assert_equal $__rdl_string_type, do_tc("if false then 3 else 'three' end", env: @env)
746
- assert_equal $__rdl_string_type, do_tc("if nil then 3 else 'three' end", env: @env)
747
-
748
- assert_equal @t45, do_tc("x = 'three'; if _any_object then x = 4 else x = 5 end; x", env: @env)
749
- assert_equal @ts3, do_tc("x = 'three'; if _any_object then x = 3 end; x", env: @env)
750
- assert_equal @ts3, do_tc("x = 'three'; unless _any_object then x = 3 end; x", env: @env)
751
- assert_equal @t4n, do_tc("if _any_object then y = 4 end; y", env: @env) # vars are nil if not defined on branch
752
- assert_equal @t35, do_tc("if _any_object then x = 3; y = 4 else x = 5 end; x", env: @env)
753
- assert_equal @t4n, do_tc("if _any_object then x = 3; y = 4 else x = 5 end; y", env: @env)
920
+ assert do_tc("if _any_object then 3 end", env: @env) <= @t3n
921
+ assert do_tc("unless _any_object then 3 end", env: @env) <= @t3n
922
+ assert do_tc("if _any_object then 3 else 4 end", env: @env) <= @t34
923
+ assert do_tc("unless _any_object then 3 else 4 end", env: @env) <= @t34
924
+ assert do_tc("if _any_object then 3 else 'three' end", env: @env) <= @ts3
925
+ assert do_tc("unless _any_object then 3 else 'three' end", env: @env) <= @ts3
926
+ assert do_tc("3 if _any_object", env: @env) <= @t3n
927
+ assert do_tc("3 unless _any_object", env: @env) <= @t3n
928
+ assert do_tc("if true then 3 else 'three' end", env: @env) <= @t3
929
+ assert do_tc("if :foo then 3 else 'three' end", env: @env) <= @t3
930
+ assert do_tc("if false then 3 else 'three' end", env: @env) <= RDL::Globals.types[:string]
931
+ assert do_tc("if nil then 3 else 'three' end", env: @env) <= RDL::Globals.types[:string]
932
+
933
+ assert do_tc("x = 'three'; if _any_object then x = 4 else x = 5 end; x", env: @env) <= @t45
934
+ assert do_tc("x = 'three'; if _any_object then x = 3 end; x", env: @env) <= @ts3
935
+ assert do_tc("x = 'three'; unless _any_object then x = 3 end; x", env: @env) <= @ts3
936
+ assert do_tc("if _any_object then y = 4 end; y", env: @env) # vars are nil if not defined on branch <= @t4n
937
+ assert do_tc("if _any_object then x = 3; y = 4 else x = 5 end; x", env: @env) <= @t35
938
+ assert do_tc("if _any_object then x = 3; y = 4 else x = 5 end; y", env: @env) <= @t4n
754
939
  end
755
940
 
756
941
  def test_and_or
757
- assert_equal @ts3, do_tc("'foo' and 3")
758
- assert_equal @ts3, do_tc("'foo' && 3")
759
- assert_equal $__rdl_string_type, do_tc("3 and 'foo'")
760
- assert_equal $__rdl_nil_type, do_tc("nil and 'foo'")
761
- assert_equal $__rdl_false_type, do_tc("false and 'foo'")
762
- assert_equal @ts3, do_tc("(x = 'foo') and (x = 3); x")
763
- assert_equal $__rdl_string_type, do_tc("(x = 3) and (x = 'foo'); x")
764
- assert_equal $__rdl_nil_type, do_tc("(x = nil) and (x = 'foo'); x")
765
- assert_equal $__rdl_false_type, do_tc("(x = false) and (x = 'foo'); x")
766
-
767
- assert_equal @ts3, do_tc("'foo' or 3")
768
- assert_equal @ts3, do_tc("'foo' || 3")
769
- assert_equal @t3, do_tc("3 or 'foo'")
770
- assert_equal @t3, do_tc("nil or 3")
771
- assert_equal @t3, do_tc("false or 3")
772
- assert_equal @ts3, do_tc("(x = 'foo') or (x = 3); x")
773
- assert_equal @t3, do_tc("(x = 3) or (x = 'foo'); x")
774
- assert_equal @t3, do_tc("(x = nil) or (x = 3); x")
775
- assert_equal @t3, do_tc("(x = false) or (x = 3); x")
942
+ assert do_tc("'foo' and 3") <= @ts3
943
+ assert do_tc("'foo' && 3") <= @ts3
944
+ assert do_tc("3 and 'foo'") <= RDL::Globals.types[:string]
945
+ assert do_tc("nil and 'foo'") <= RDL::Globals.types[:nil]
946
+ assert do_tc("false and 'foo'") <= RDL::Globals.types[:false]
947
+ assert do_tc("(x = 'foo') and (x = 3); x") <= @ts3
948
+ assert do_tc("(x = 3) and (x = 'foo'); x") <= RDL::Globals.types[:string]
949
+ assert do_tc("(x = nil) and (x = 'foo'); x") <= RDL::Globals.types[:nil]
950
+ assert do_tc("(x = false) and (x = 'foo'); x") <= RDL::Globals.types[:false]
951
+
952
+ assert do_tc("'foo' or 3") <= @ts3
953
+ assert do_tc("'foo' || 3") <= @ts3
954
+ assert do_tc("3 or 'foo'") <= @t3
955
+ assert do_tc("nil or 3") <= @t3
956
+ assert do_tc("false or 3") <= @t3
957
+ assert do_tc("(x = 'foo') or (x = 3); x") <= @ts3
958
+ assert do_tc("(x = 3) or (x = 'foo'); x") <= @t3
959
+ assert do_tc("(x = nil) or (x = 3); x") <= @t3
960
+ assert do_tc("(x = false) or (x = 3); x") <= @t3
776
961
  end
777
962
 
778
963
  class C
964
+ extend RDL::Annotate
779
965
  type :===, "(Object) -> %bool"
780
966
  end
781
967
 
782
968
  class D
969
+ extend RDL::Annotate
783
970
  type :===, "(String) -> %bool"
784
971
  end
785
972
 
786
973
  def test_when
787
- assert_equal @t3, do_tc("case when C.new then 3 end", env: @env)
788
- assert_equal @t34, do_tc("x = 4; case when _any_object then x = 3 end; x", env: @env)
789
- assert_equal @ts3, do_tc("case when _any_object then 3 else 'foo' end", env: @env)
790
- assert_equal @ts3, do_tc("x = 4; case when _any_object then x = 3 else x = 'foo' end; x", env: @env)
974
+ assert do_tc("case when C.new then 3 end", env: @env) <= @t3
975
+ assert do_tc("x = 4; case when _any_object then x = 3 end; x", env: @env) <= @t34
976
+ assert do_tc("case when _any_object then 3 else 'foo' end", env: @env) <= @ts3
977
+ assert do_tc("x = 4; case when _any_object then x = 3 else x = 'foo' end; x", env: @env) <= @ts3
791
978
 
792
- assert_equal $__rdl_string_type, do_tc("case _any_object when C.new then 'foo' end", env: @env)
793
- assert_equal @ts3, do_tc("x = 3; case _any_object when C.new then x = 'foo' end; x", env: @env)
979
+ assert do_tc("case _any_object when C.new then 'foo' end", env: @env) <= RDL::Globals.types[:string]
980
+ assert do_tc("x = 3; case _any_object when C.new then x = 'foo' end; x", env: @env) <= @ts3
794
981
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("case _any_object when D.new then 'foo' end", env: @env) }
795
- assert_equal @ts3, do_tc("case _any_object when C.new then 'foo' else 3 end", env: @env)
796
- assert_equal @ts3, do_tc("x = 4; case _any_object when C.new then x = 'foo' else x = 3 end; x", env: @env)
797
- assert_equal @ts34, do_tc("case _any_object when C.new then 'foo' when C.new then 4 else 3 end", env: @env)
798
- assert_equal @ts34, do_tc("x = 5; case _any_object when C.new then x = 'foo' when C.new then x = 4 else x = 3 end; x", env: @env)
982
+ assert do_tc("case _any_object when C.new then 'foo' else 3 end", env: @env) <= @ts3
983
+ assert do_tc("x = 4; case _any_object when C.new then x = 'foo' else x = 3 end; x", env: @env) <= @ts3
984
+ assert do_tc("case _any_object when C.new then 'foo' when C.new then 4 else 3 end", env: @env) <= @ts34
985
+ assert do_tc("x = 5; case _any_object when C.new then x = 'foo' when C.new then x = 4 else x = 3 end; x", env: @env) <= @ts34
799
986
 
800
- assert_equal @t3, do_tc("case when (x = 3) then 'foo' end; x", env: @env)
801
- assert_equal @t34, do_tc("case when (x = 3), (x = 4) then 'foo' end; x", env: @env)
802
- assert_equal @t34, do_tc("case when (x = 3), (x = 4) then 'foo' end; x", env: @env)
803
- assert_equal @t34, do_tc("case when (x = 4) then x = 3 end; x", env: @env)
804
- assert_equal @t34, do_tc("x = 5; case when (x = 3) then 'foo' when (x = 4) then 'foo' end; x", env: @env) # first guard always executed!
805
- assert_equal @t345, do_tc("x = 6; case when (x = 3) then 'foo' when (x = 4) then 'foo' else x = 5 end; x", env: @env)
987
+ assert do_tc("case when (x = 3) then 'foo' end; x", env: @env) <= @t3
988
+ assert do_tc("case when (x = 3), (x = 4) then 'foo' end; x", env: @env) <= @t34
989
+ assert do_tc("case when (x = 3), (x = 4) then 'foo' end; x", env: @env) <= @t34
990
+ assert do_tc("case when (x = 4) then x = 3 end; x", env: @env) <= @t34
991
+ assert do_tc("x = 5; case when (x = 3) then 'foo' when (x = 4) then 'foo' end; x", env: @env) # first guard always executed! <= @t34
992
+ assert do_tc("x = 6; case when (x = 3) then 'foo' when (x = 4) then 'foo' else x = 5 end; x", env: @env) <= @t345
806
993
  end
807
994
 
808
995
  def test_while_until
809
996
  # TODO these don't do a great job checking control flow
810
- assert_equal $__rdl_nil_type, do_tc("while true do end")
811
- assert_equal $__rdl_nil_type, do_tc("until false do end")
812
- assert_equal $__rdl_nil_type, do_tc("begin end while true")
813
- assert_equal $__rdl_nil_type, do_tc("begin end until false")
814
- assert_equal $__rdl_integer_type, do_tc("i = 0; while i < 5 do i = 1 + i end; i")
815
- assert_equal $__rdl_integer_type, do_tc("i = 0; while i < 5 do i = i + 1 end; i")
816
- assert_equal $__rdl_integer_type, do_tc("i = 0; until i >= 5 do i = 1 + i end; i")
817
- assert_equal $__rdl_integer_type, do_tc("i = 0; until i >= 5 do i = i + 1 end; i")
818
- assert_equal $__rdl_integer_type, do_tc("i = 0; begin i = 1 + i end while i < 5; i")
819
- assert_equal $__rdl_integer_type, do_tc("i = 0; begin i = i + 1 end while i < 5; i")
820
- assert_equal $__rdl_integer_type, do_tc("i = 0; begin i = 1 + i end until i >= 5; i")
821
- assert_equal $__rdl_integer_type, do_tc("i = 0; begin i = i + 1 end until i >= 5; i")
997
+ assert do_tc("while true do end") <= RDL::Globals.types[:nil]
998
+ assert do_tc("until false do end") <= RDL::Globals.types[:nil]
999
+ assert do_tc("begin end while true") <= RDL::Globals.types[:nil]
1000
+ assert do_tc("begin end until false") <= RDL::Globals.types[:nil]
1001
+ assert do_tc("i = 0; while i < 5 do i = 1 + i end; i") <= RDL::Globals.types[:integer]
1002
+ assert do_tc("i = 0; while i < 5 do i = i + 1 end; i") <= RDL::Globals.types[:integer]
1003
+ assert do_tc("i = 0; until i >= 5 do i = 1 + i end; i") <= RDL::Globals.types[:integer]
1004
+ assert do_tc("i = 0; until i >= 5 do i = i + 1 end; i") <= RDL::Globals.types[:integer]
1005
+ assert do_tc("i = 0; begin i = 1 + i end while i < 5; i") <= RDL::Globals.types[:integer]
1006
+ assert do_tc("i = 0; begin i = i + 1 end while i < 5; i") <= RDL::Globals.types[:integer]
1007
+ assert do_tc("i = 0; begin i = 1 + i end until i >= 5; i") <= RDL::Globals.types[:integer]
1008
+ assert do_tc("i = 0; begin i = i + 1 end until i >= 5; i") <= RDL::Globals.types[:integer]
822
1009
 
823
1010
  # break, redo, next, no args
824
- assert_equal $__rdl_integer_type, do_tc("i = 0; while i < 5 do if i > 2 then break end; i = 1 + i end; i")
825
- assert_equal tt("0"), do_tc("i = 0; while i < 5 do break end; i")
826
- assert_equal tt("0"), do_tc("i = 0; while i < 5 do redo end; i") # infinite loop, ok for typing
827
- assert_equal tt("0"), do_tc("i = 0; while i < 5 do next end; i") # infinite loop, ok for typing
1011
+ assert do_tc("i = 0; while i < 5 do if i > 2 then break end; i = 1 + i end; i") <= RDL::Globals.types[:integer]
1012
+ assert do_tc("i = 0; while i < 5 do break end; i") <= tt("0")
1013
+ assert do_tc("i = 0; while i < 5 do redo end; i") # infinite loop, ok for typing <= tt("0")
1014
+ assert do_tc("i = 0; while i < 5 do next end; i") # infinite loop, ok for typing <= tt("0")
828
1015
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("i = 0; while i < 5 do retry end; i") }
829
- assert_equal $__rdl_integer_type, do_tc("i = 0; begin i = i + 1; break if i > 2; end while i < 5; i")
830
- assert_equal $__rdl_integer_type, do_tc("i = 0; begin i = i + 1; redo if i > 2; end while i < 5; i")
831
- assert_equal $__rdl_integer_type, do_tc("i = 0; begin i = i + 1; next if i > 2; end while i < 5; i")
1016
+ assert do_tc("i = 0; begin i = i + 1; break if i > 2; end while i < 5; i") <= RDL::Globals.types[:integer]
1017
+ assert do_tc("i = 0; begin i = i + 1; redo if i > 2; end while i < 5; i") <= RDL::Globals.types[:integer]
1018
+ assert do_tc("i = 0; begin i = i + 1; next if i > 2; end while i < 5; i") <= RDL::Globals.types[:integer]
832
1019
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("i = 0; begin i = i + 1; retry if i > 2; end while i < 5; i") }
833
1020
 
834
1021
  # break w/arg, next can't take arg
835
- assert_equal @t3n, do_tc("while _any_object do break 3 end", env: @env)
1022
+ assert do_tc("while _any_object do break 3 end", env: @env) <= @t3n
836
1023
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("while _any_object do next 3 end", env: @env) }
837
- assert_equal @t3n, do_tc("begin break 3 end while _any_object", env: @env)
1024
+ assert do_tc("begin break 3 end while _any_object", env: @env) <= @t3n
838
1025
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("begin next 3 end while _any_object", env: @env) }
839
1026
  end
840
1027
 
841
1028
  def test_for
842
- assert_equal $__rdl_fixnum_type, do_tc("for i in 1..5 do end; i")
843
- assert_equal tt("1 or 2 or 3 or 4 or 5"), do_tc("for i in [1,2,3,4,5] do end; i")
844
- assert_equal tt("Range<Fixnum>"), do_tc("for i in 1..5 do break end", env: @env)
845
- assert_equal tt("Range<Fixnum>"), do_tc("for i in 1..5 do next end", env: @env)
846
- assert_equal tt("Range<Fixnum>"), do_tc("for i in 1..5 do redo end", env: @env) #infinite loop, ok for typing
847
- assert_equal tt("Range<Fixnum> or 3"), do_tc("for i in 1..5 do break 3 end", env: @env)
848
- assert_equal @tfs, do_tc("for i in 1..5 do next 'three' end; i", env: @env)
1029
+ assert do_tc("for i in 1..5 do end; i") <= RDL::Globals.types[:integer]
1030
+ assert do_tc("for i in [1,2,3,4,5] do end; i") <= tt("1 or 2 or 3 or 4 or 5")
1031
+ assert do_tc("for i in 1..5 do break end", env: @env) <= tt("Range<Integer>")
1032
+ assert do_tc("for i in 1..5 do next end", env: @env) <= tt("Range<Integer>")
1033
+ assert do_tc("for i in 1..5 do redo end", env: @env) <= tt("Range<Integer>") #infinite loop, ok for typing
1034
+ assert do_tc("for i in 1..5 do break 3 end", env: @env) <= tt("Range<Integer> or 3")
1035
+ assert do_tc("for i in 1..5 do next 'three' end; i", env: @env) <= @tfs
849
1036
  end
850
1037
 
851
1038
  def test_return
852
1039
  assert self.class.class_eval {
853
- type "(Fixnum) -> Fixnum", typecheck: :now
1040
+ type "(Integer) -> Integer", typecheck: :now
854
1041
  def return_ff(x)
855
1042
  return 42
856
1043
  end
@@ -858,129 +1045,177 @@ class TestTypecheck < Minitest::Test
858
1045
 
859
1046
  assert_raises(RDL::Typecheck::StaticTypeError) {
860
1047
  self.class.class_eval {
861
- type "(Fixnum) -> Fixnum", typecheck: :now
1048
+ type "(Integer) -> Integer", typecheck: :now
862
1049
  def return_ff2(x)
863
1050
  return "forty-two"
864
1051
  end
865
1052
  }
866
1053
  }
867
1054
 
868
- assert_equal $__rdl_bot_type, do_tc("return 42", scope: @scopefs)
869
- assert_equal $__rdl_bot_type, do_tc("if _any_object then return 42 else return 'forty-two' end", env: @env, scope: @scopefs)
1055
+ assert do_tc("return 42", scope: @scopefs) <= RDL::Globals.types[:bot]
1056
+ assert do_tc("if _any_object then return 42 else return 'forty-two' end", env: @env, scope: @scopefs) <= RDL::Globals.types[:bot]
870
1057
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("if _any_object then return 42 else return 'forty-two' end", env: @env, scope: @scopef) }
871
- assert_equal $__rdl_string_type, do_tc("return 42 if _any_object; 'forty-two'", env: @env, scope: @scopef)
1058
+ assert do_tc("return 42 if _any_object; 'forty-two'", env: @env, scope: @scopef) <= RDL::Globals.types[:string]
872
1059
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("return 'forty-two' if _any_object; 42", env: @env, scope: @scopef) }
873
1060
  end
874
1061
 
875
1062
  class E
876
- type :f, '() -> %integer'
877
- type :f=, '(%integer) -> nil'
1063
+ extend RDL::Annotate
1064
+ type :f, '() -> Integer'
1065
+ type :f=, '(Integer) -> nil'
878
1066
  end
879
1067
 
880
1068
  def test_op_asgn
881
- assert $__rdl_integer_type, do_tc("x = 0; x += 1")
1069
+ assert RDL::Globals.types[:integer], do_tc("x = 0; x += 1")
882
1070
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x += 1") }
883
1071
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x = Object.new; x += 1", env: @env) }
884
- assert_equal $__rdl_nil_type, do_tc("e = E.new; e.f += 1", env: @env) # return type of f=
885
- assert_equal $__rdl_false_type, do_tc("x &= false") # weird
1072
+ assert do_tc("e = E.new; e.f += 1", env: @env) <= RDL::Globals.types[:nil] # return type of f=
1073
+ assert do_tc("x &= false") <= RDL::Globals.types[:false] # weird
1074
+ assert do_tc("h = {}; h = RDL.type_cast(h, 'Hash<Symbol, String>', force: true); h[:a] = ''; h[:a] += 's'", env: @env) <= RDL::Globals.types[:string]
886
1075
  end
887
1076
 
888
1077
  def test_and_or_asgn
889
1078
  self.class.class_eval {
890
- var_type :@f_and_or_asgn, "Fixnum"
1079
+ var_type :@f_and_or_asgn, "Integer"
891
1080
  }
892
- assert_equal @t3, do_tc("x ||= 3") # weird
893
- assert_equal $__rdl_nil_type, do_tc("x &&= 3") # weirder
894
- assert_equal $__rdl_fixnum_type, do_tc("@f_and_or_asgn &&= 4", env: @env)
895
- assert_equal @t3, do_tc("x = 3; x ||= 'three'")
896
- assert_equal @ts3, do_tc("x = 'three'; x ||= 3")
897
- assert_equal $__rdl_nil_type, do_tc("e = E.new; e.f ||= 3", env: @env) # return type of f=
898
- assert_equal $__rdl_nil_type, do_tc("e = E.new; e.f &&= 3", env: @env) # return type of f=
1081
+ assert do_tc("x ||= 3") <= @t3 # weird
1082
+ assert do_tc("x &&= 3") <= RDL::Globals.types[:nil] # weirder
1083
+ assert do_tc("@f_and_or_asgn &&= 4", env: @env) <= RDL::Globals.types[:integer]
1084
+ assert do_tc("x = 3; x ||= 'three'") <= @t3
1085
+ assert do_tc("x = 'three'; x ||= 3") <= @ts3
1086
+ assert do_tc("e = E.new; e.f ||= 3", env: @env) <= RDL::Globals.types[:nil] # return type of f=
1087
+ assert do_tc("e = E.new; e.f &&= 3", env: @env) <= RDL::Globals.types[:nil] # return type of f=
899
1088
  end
900
1089
 
901
1090
  def test_masgn
902
1091
  self.class.class_eval {
903
- var_type :@f_masgn, "Array<Fixnum>"
1092
+ var_type :@f_masgn, "Array<Integer>"
904
1093
  }
905
1094
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x, y = 3") } # allowed in Ruby but probably has surprising behavior
906
- assert_equal tt("Array<Fixnum>"), do_tc("a, b = @f_masgn", env: @env)
907
- assert_equal $__rdl_fixnum_type, do_tc("a, b = @f_masgn; a", env: @env)
908
- assert_equal $__rdl_fixnum_type, do_tc("a, b = @f_masgn; b", env: @env)
1095
+ assert do_tc("a, b = @f_masgn", env: @env) <= tt("Array<Integer>")
1096
+ assert do_tc("a, b = @f_masgn; a", env: @env) <= RDL::Globals.types[:integer]
1097
+ assert do_tc("a, b = @f_masgn; b", env: @env) <= RDL::Globals.types[:integer]
909
1098
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("var_type :a, 'String'; a, b = @f_masgn", env: @env) }
910
1099
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("a, b = 1, 2, 3") }
911
- assert_equal @t3, do_tc("a, b = 3, 'two'; a")
912
- assert_equal $__rdl_string_type, do_tc("a, b = 3, 'two'; b")
913
- assert_equal @t3, do_tc("a = [3, 'two']; x, y = a; x")
914
- assert_equal $__rdl_string_type, do_tc("a = [3, 'two']; x, y = a; y")
1100
+ assert do_tc("a, b = 3, 'two'; a") <= @t3
1101
+ assert do_tc("a, b = 3, 'two'; b") <= RDL::Globals.types[:string]
1102
+ assert do_tc("a = [3, 'two']; x, y = a; x") <= @t3
1103
+ assert do_tc("a = [3, 'two']; x, y = a; y") <= RDL::Globals.types[:string]
915
1104
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("a = [3, 'two']; x, y = a; a.length", env: @env) }
916
1105
 
917
1106
  # w/send
918
- assert_equal tt("2"), do_tc("e = E.new; e.f, b = 1, 2; b", env: @env)
919
- assert_equal $__rdl_fixnum_type, do_tc("e = E.new; e.f, b = @f_masgn; b", env: @env)
920
- assert_equal tt("[1, 2]"), do_tc("@f_masgn[3], y = 1, 2", env: @env)
1107
+ assert do_tc("e = E.new; e.f, b = 1, 2; b", env: @env) <= tt("2")
1108
+ assert do_tc("e = E.new; e.f, b = @f_masgn; b", env: @env) <= RDL::Globals.types[:integer]
1109
+ assert do_tc("@f_masgn[3], y = 1, 2", env: @env) <= tt("[1, 2]")
921
1110
 
922
1111
  # w/splat
923
- assert_equal tt("[1, 2, 3]"), do_tc("*x = [1, 2, 3]")
1112
+ assert do_tc("*x = [1, 2, 3]") <= tt("[1, 2, 3]")
924
1113
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("*x = 1") } # allowed in Ruby, but why would you write this code?
925
1114
 
926
1115
  # w/splat on right
927
- assert_equal tt("1"), do_tc("x, *y = [1, 2, 3]; x")
928
- assert_equal tt("[2, 3]"), do_tc("x, *y = [1, 2, 3]; y")
929
- assert_equal tt("1"), do_tc("x, *y = [1]; x")
930
- assert_equal tt("[]"), do_tc("x, *y = [1]; y")
1116
+ assert do_tc("x, *y = [1, 2, 3]; x") <= tt("1")
1117
+ assert do_tc("x, *y = [1, 2, 3]; y") <= tt("[2, 3]")
1118
+ assert do_tc("x, *y = [1]; x") <= tt("1")
1119
+ assert do_tc("x, *y = [1]; y") <= tt("[]")
931
1120
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x, *y = 1") } # allowed in Ruby, but hard to justify, so RDL error
932
- assert_equal $__rdl_fixnum_type, do_tc("x, *y = @f_masgn; x", env: @env)
933
- assert_equal tt("Array<Fixnum>"), do_tc("x, *y = @f_masgn; y", env: @env)
1121
+ assert do_tc("x, *y = @f_masgn; x", env: @env) <= RDL::Globals.types[:integer]
1122
+ assert do_tc("x, *y = @f_masgn; y", env: @env) <= tt("Array<Integer>")
934
1123
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x, y, *z = [1]") } # works in Ruby, but confusing so RDL reports error
935
1124
 
936
1125
  # w/splat on left
937
- assert_equal tt("[1, 2]"), do_tc("*x, y = [1, 2, 3]; x")
938
- assert_equal tt("3"), do_tc("*x, y = [1, 2, 3]; y")
939
- assert_equal tt("[]"), do_tc("*x, y = [1]; x")
940
- assert_equal tt("1"), do_tc("*x, y = [1]; y")
1126
+ assert do_tc("*x, y = [1, 2, 3]; x") <= tt("[1, 2]")
1127
+ assert do_tc("*x, y = [1, 2, 3]; y") <= tt("3")
1128
+ assert do_tc("*x, y = [1]; x") <= tt("[]")
1129
+ assert do_tc("*x, y = [1]; y") <= tt("1")
941
1130
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("*x, y = 1") } # as above
942
- assert_equal tt("Array<Fixnum>"), do_tc("*x, y = @f_masgn; x", env: @env)
943
- assert_equal $__rdl_fixnum_type, do_tc("*x, y = @f_masgn; y", env: @env)
1131
+ assert do_tc("*x, y = @f_masgn; x", env: @env) <= tt("Array<Integer>")
1132
+ assert do_tc("*x, y = @f_masgn; y", env: @env) <= RDL::Globals.types[:integer]
944
1133
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("*x, y, z = [1]") } # as above
945
1134
 
946
1135
  # w/splat in middle
947
- assert_equal tt("1"), do_tc("x, *y, z = [1, 2]; x")
948
- assert_equal tt("[]"), do_tc("x, *y, z = [1, 2]; y")
949
- assert_equal tt("2"), do_tc("x, *y, z = [1, 2]; z")
950
- assert_equal tt("1"), do_tc("x, *y, z = [1, 2, 3, 4]; x")
951
- assert_equal tt("[2, 3]"), do_tc("x, *y, z = [1, 2, 3, 4]; y")
952
- assert_equal tt("4"), do_tc("x, *y, z = [1, 2, 3, 4]; z")
1136
+ assert do_tc("x, *y, z = [1, 2]; x") <= tt("1")
1137
+ assert do_tc("x, *y, z = [1, 2]; y") <= tt("[]")
1138
+ assert do_tc("x, *y, z = [1, 2]; z") <= tt("2")
1139
+ assert do_tc("x, *y, z = [1, 2, 3, 4]; x") <= tt("1")
1140
+ assert do_tc("x, *y, z = [1, 2, 3, 4]; y") <= tt("[2, 3]")
1141
+ assert do_tc("x, *y, z = [1, 2, 3, 4]; z") <= tt("4")
953
1142
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x, *y, z = 1") } # as above
954
- assert_equal $__rdl_fixnum_type, do_tc("x, *y, z = @f_masgn; x", env: @env)
955
- assert_equal tt("Array<Fixnum>"), do_tc("x, *y, z = @f_masgn; y", env: @env)
956
- assert_equal $__rdl_fixnum_type, do_tc("x, *y, z = @f_masgn; z", env: @env)
1143
+ assert do_tc("x, *y, z = @f_masgn; x", env: @env) <= RDL::Globals.types[:integer]
1144
+ assert do_tc("x, *y, z = @f_masgn; y", env: @env) <= tt("Array<Integer>")
1145
+ assert do_tc("x, *y, z = @f_masgn; z", env: @env) <= RDL::Globals.types[:integer]
957
1146
  end
958
1147
 
959
1148
  def test_cast
960
- assert_equal $__rdl_fixnum_type, do_tc("(1 + 2).type_cast('Fixnum')", env: @env)
961
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("1.type_cast('Fixnum', 42)", env: @env) }
962
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("1.type_cast(Fixnum)", env: @env) }
963
- assert_equal $__rdl_fixnum_type, do_tc("(1 + 2).type_cast('Fixnum', force: true)", env: @env)
964
- assert_equal $__rdl_fixnum_type, do_tc("(1 + 2).type_cast('Fixnum', force: false)", env: @env)
965
- assert_equal $__rdl_fixnum_type, do_tc("(1 + 2).type_cast('Fixnum', force: :blah)", env: @env)
966
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("(1 + 2).type_cast('Fixnum', forc: true)", env: @env) }
967
- assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("(1 + 2).type_cast('Fluffy Bunny')") }
1149
+ assert do_tc("RDL.type_cast(1 + 2, 'Integer')", env: @env) <= RDL::Globals.types[:integer]
1150
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("RDL.type_cast(1, 'Integer', 42)", env: @env) }
1151
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("RDL.type_cast(1, Integer)", env: @env) }
1152
+ assert do_tc("RDL.type_cast(1 + 2, 'Integer', force: true)", env: @env) <= RDL::Globals.types[:integer]
1153
+ assert do_tc("RDL.type_cast(1 + 2, 'Integer', force: false)", env: @env) <= RDL::Globals.types[:integer]
1154
+ assert do_tc("RDL.type_cast(1 + 2, 'Integer', force: :blah)", env: @env) <= RDL::Globals.types[:integer]
1155
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("RDL.type_cast(1 + 2, 'Integer', forc: true)", env: @env) }
1156
+ assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("RDL.type_cast(1 + 2, 'Fluffy Bunny')") }
1157
+ end
1158
+
1159
+ def test_instantiate
1160
+ assert_raises(RDL::Typecheck::StaticTypeError) {
1161
+ self.class.class_eval {
1162
+ type "(Integer, Integer) -> Array<Integer>", typecheck: :now
1163
+ def def_inst_fail(x, y) a = Array.new(x,y); a; end
1164
+ }
1165
+ }
1166
+ assert (
1167
+ self.class.class_eval {
1168
+ type "(Integer, Integer) -> Array<Integer>", typecheck: :now
1169
+ def def_inst_pass(x, y) a = Array.new(x,y); RDL.instantiate!(a, "Integer"); a; end
1170
+ }
1171
+ )
1172
+ assert_raises(RDL::Typecheck::StaticTypeError) {
1173
+ self.class.class_eval {
1174
+ type "(Integer) -> Integer", typecheck: :now
1175
+ def def_inst_hash_fail(x) hash = {}; hash["test"] = x; hash["test"]; end
1176
+ }
1177
+ }
1178
+ assert_raises(RDL::Typecheck::StaticTypeError) {
1179
+ self.class.class_eval {
1180
+ type "(Integer) -> Integer", typecheck: :now
1181
+ def def_inst_hash_fail2(x) hash = {}; hash.instantiate("Integer", "String") ; hash["test"] = x; hash["test"]; end
1182
+ }
1183
+ }
1184
+ assert(
1185
+ self.class.class_eval {
1186
+ type "(Integer) -> Integer", typecheck: :now
1187
+ def def_inst_hash_pass(x) hash = {}; RDL.instantiate!(hash, String, Integer); hash["test"] = x; hash["test"]; end
1188
+ }
1189
+ )
1190
+ assert_raises(RDL::Typecheck::StaticTypeError) {
1191
+ self.class.class_eval {
1192
+ type "(Integer) -> Integer", typecheck: :now
1193
+ def def_inst_no_param(x) RDL.instantiate!(x, Integer); end
1194
+ }
1195
+ }
1196
+
1197
+ assert_raises(RDL::Typecheck::StaticTypeError) {
1198
+ self.class.class_eval {
1199
+ type "(Integer) -> Integer", typecheck: :now
1200
+ def def_inst_num_args(x) a = Array.new(x, x); RDL.instatntiate!(a, Integer, Integer, Integer); end
1201
+ }
1202
+ }
968
1203
  end
969
1204
 
970
1205
  def test_rescue_ensure
971
- assert_equal @t3, do_tc("begin 3; rescue; 4; end") # rescue clause can never be executed
972
- assert_equal @t34, do_tc("begin puts 'foo'; 3; rescue; 4; end", env: @env)
973
- assert_equal tt("StandardError or 3"), do_tc("begin puts 'foo'; 3; rescue => e; e; end", env: @env)
974
- assert_equal tt("RuntimeError or 3"), do_tc("begin puts 'foo'; 3; rescue RuntimeError => e; e; end", env: @env)
975
- assert_equal tt("4"), do_tc("begin puts 'foo'; 3; else; 4; end", env: @env) # parser discards else clause!
976
- assert_equal tt("RuntimeError or ArgumentError or 3"), do_tc("begin puts 'foo'; 3; rescue RuntimeError => e; e; rescue ArgumentError => x; x; end", env: @env)
977
- assert_equal tt("RuntimeError or ArgumentError or 42 or 3"), do_tc("begin puts 'foo'; 3; rescue RuntimeError => e; e; rescue ArgumentError => x; x; else 42; end", env: @env)
978
- assert_equal tt("RuntimeError or ArgumentError or 3"), do_tc("begin puts 'foo'; 3; rescue RuntimeError, ArgumentError => e; e; end", env: @env)
979
- assert_equal tt("1 or String"), do_tc("tries = 0; begin puts 'foo'; x = 1; rescue; tries = tries + 1; retry unless tries > 5; x = 'one'; end; x", env: @env)
980
- assert_equal @t3, do_tc("begin 3; ensure 4; end", env: @env)
981
- assert_equal @t4, do_tc("begin x = 3; ensure x = 4; end; x", env: @env)
982
- assert_equal @t5, do_tc("begin puts 'foo'; x = 3; rescue; x = 4; ensure x = 5; end; x", env: @env)
983
- assert_equal @t34, do_tc("begin puts 'foo'; 3; rescue; 4; ensure 5; end", env: @env)
1206
+ assert do_tc("begin 3; rescue; 4; end") <= @t3 # rescue clause can never be executed
1207
+ assert do_tc("begin puts 'foo'; 3; rescue; 4; end", env: @env) <= @t34
1208
+ assert do_tc("begin puts 'foo'; 3; rescue => e; e; end", env: @env) <= tt("StandardError or 3")
1209
+ assert do_tc("begin puts 'foo'; 3; rescue RuntimeError => e; e; end", env: @env) <= tt("RuntimeError or 3")
1210
+ assert do_tc("begin puts 'foo'; 3; else; 4; end", env: @env) <= tt("4") # parser discards else clause!
1211
+ assert do_tc("begin puts 'foo'; 3; rescue RuntimeError => e; e; rescue ArgumentError => x; x; end", env: @env) <= tt("RuntimeError or ArgumentError or 3")
1212
+ assert do_tc("begin puts 'foo'; 3; rescue RuntimeError => e; e; rescue ArgumentError => x; x; else 42; end", env: @env) <= tt("RuntimeError or ArgumentError or 42 or 3")
1213
+ assert do_tc("begin puts 'foo'; 3; rescue RuntimeError, ArgumentError => e; e; end", env: @env) <= tt("RuntimeError or ArgumentError or 3")
1214
+ assert do_tc("tries = 0; begin puts 'foo'; x = 1; rescue; tries = tries + 1; retry unless tries > 5; x = 'one'; end; x", env: @env) <= tt("1 or String")
1215
+ assert do_tc("begin 3; ensure 4; end", env: @env) <= @t3
1216
+ assert do_tc("begin x = 3; ensure x = 4; end; x", env: @env) <= @t4
1217
+ assert do_tc("begin puts 'foo'; x = 3; rescue; x = 4; ensure x = 5; end; x", env: @env) <= @t5
1218
+ assert do_tc("begin puts 'foo'; 3; rescue; 4; ensure 5; end", env: @env) <= @t34
984
1219
  end
985
1220
 
986
1221
  class SubArray < Array
@@ -991,108 +1226,108 @@ class TestTypecheck < Minitest::Test
991
1226
 
992
1227
  def test_array_splat
993
1228
  self.class.class_eval {
994
- type :_splataf, "() -> Array<Fixnum>"
1229
+ type :_splataf, "() -> Array<Integer>"
995
1230
  type :_splatas, "() -> Array<String>"
996
- type :_splathsf, "() -> Hash<Symbol, Fixnum>"
1231
+ type :_splathsf, "() -> Hash<Symbol, Integer>"
997
1232
  }
998
- assert_equal tt("[1]"), do_tc("x = *1")
999
- assert_equal tt("[1, 2, 3]"), do_tc("x = [1, *2, 3]")
1233
+ assert do_tc("x = *1") <= tt("[1]")
1234
+ assert do_tc("x = [1, *2, 3]") <= tt("[1, 2, 3]")
1000
1235
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x = [1, *Object.new, 3]", env: @env) } # the Object might or might not be an array...
1001
1236
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x = [1, *SubArray.new, 3]", env: @env) } # the SubArray is an Array, but unclear how to splat
1002
- assert_equal tt("[1]"), do_tc("x = *[1]")
1003
- assert_equal tt("[1, 2, 3]"), do_tc("x = *[1, 2, 3]")
1004
- assert_equal tt("[1, 2, 3]"), do_tc("x = [1, *[2], 3]")
1005
- assert_equal tt("[1, 2, 3, 4]"), do_tc("x = [1, *[2, 3], 4]")
1006
- assert_equal tt("[1, 2, 3, 4]"), do_tc("x = [1, *[2, *[3]], 4]")
1007
- assert_equal tt("[1, [2, 3], 4]"), do_tc("x = [1, [2, *[3]], 4]")
1008
- assert_equal tt("[1, 2, 3, 4]"), do_tc("x = [*[1,2], *[3,4]]")
1009
- assert_equal tt("[]"), do_tc("x = *nil")
1010
- assert_equal tt("[1, 2]"), do_tc("x = [1, *nil, 2]")
1011
- assert_equal tt("[[:a, 1]]"), do_tc("x = *{a: 1}")
1237
+ assert do_tc("x = *[1]") <= tt("[1]")
1238
+ assert do_tc("x = *[1, 2, 3]") <= tt("[1, 2, 3]")
1239
+ assert do_tc("x = [1, *[2], 3]") <= tt("[1, 2, 3]")
1240
+ assert do_tc("x = [1, *[2, 3], 4]") <= tt("[1, 2, 3, 4]")
1241
+ assert do_tc("x = [1, *[2, *[3]], 4]") <= tt("[1, 2, 3, 4]")
1242
+ assert do_tc("x = [1, [2, *[3]], 4]") <= tt("[1, [2, 3], 4]")
1243
+ assert do_tc("x = [*[1,2], *[3,4]]") <= tt("[1, 2, 3, 4]")
1244
+ assert do_tc("x = *nil") <= tt("[]")
1245
+ assert do_tc("x = [1, *nil, 2]") <= tt("[1, 2]")
1246
+ assert do_tc("x = *{a: 1}") <= tt("[[:a, 1]]")
1012
1247
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x = [1, *SubHash.new, 3]", env: @env) } # the SubHash is an Hash, but unclear how to splat
1013
- assert_equal tt("[[:a, 1], [:b, 2], [:c, 3]]"), do_tc("x = *{a: 1, b: 2, c: 3}")
1014
- assert_equal tt("[1, [:a, 2], 3]"), do_tc("x = [1, *{a: 2}, 3]")
1015
- assert_equal tt("[1, 2, 3]"), do_tc("y = [2]; x = [1, *y, 3]; ")
1248
+ assert do_tc("x = *{a: 1, b: 2, c: 3}") <= tt("[[:a, 1], [:b, 2], [:c, 3]]")
1249
+ assert do_tc("x = [1, *{a: 2}, 3]") <= tt("[1, [:a, 2], 3]")
1250
+ assert do_tc("y = [2]; x = [1, *y, 3]; ") <= tt("[1, 2, 3]")
1016
1251
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("y = [2]; x = [1, *y, 3]; y.length") }
1017
- assert_equal tt("[1, [:a, 2], 3]"), do_tc("y = {a: 2}; x = [1, *y, 3]")
1252
+ assert do_tc("y = {a: 2}; x = [1, *y, 3]") <= tt("[1, [:a, 2], 3]")
1018
1253
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("y = {a: 2}; x = [1, *y, 3]; y.length") }
1019
1254
 
1020
- assert_equal tt("Array<Fixnum>"), do_tc("x = *_splataf", env: @env)
1021
- assert_equal tt("Array<Fixnum>"), do_tc("x = [1, *_splataf, 2]", env: @env)
1022
- assert_equal tt("Array<Fixnum>"), do_tc("x = [*_splataf, *_splataf]", env: @env)
1023
- assert_equal tt("Array<Fixnum or String>"), do_tc("x = [*_splataf, *_splatas]", env: @env)
1024
- assert_equal tt("Array<Fixnum or String>"), do_tc("x = [1, *_splataf, 2, *_splatas, 3]", env: @env)
1025
- assert_equal tt("Array<Fixnum or String or 3.0>"), do_tc("x = [1, *_splataf, 2, *_splatas, 3.0]", env: @env)
1026
- assert_equal tt("Array<[Symbol, Fixnum]>"), do_tc("x = *_splathsf", env: @env)
1027
- assert_equal tt("Array<1 or 3 or [Symbol, Fixnum]>"), do_tc("x = [1, *_splathsf, 3]", env: @env)
1255
+ assert do_tc("x = *_splataf", env: @env) <= tt("Array<Integer>")
1256
+ assert do_tc("x = [1, *_splataf, 2]", env: @env) <= tt("Array<Integer>")
1257
+ assert do_tc("x = [*_splataf, *_splataf]", env: @env) <= tt("Array<Integer>")
1258
+ assert do_tc("x = [*_splataf, *_splatas]", env: @env) <= tt("Array<Integer or String>")
1259
+ assert do_tc("x = [1, *_splataf, 2, *_splatas, 3]", env: @env) <= tt("Array<Integer or String>")
1260
+ assert do_tc("x = [1, *_splataf, 2, *_splatas, 3.0]", env: @env) <= tt("Array<Integer or String or 3.0>")
1261
+ assert do_tc("x = *_splathsf", env: @env) <= tt("Array<[Symbol, Integer]>")
1262
+ assert do_tc("x = [1, *_splathsf, 3]", env: @env) <= tt("Array<1 or 3 or [Symbol, Integer]>")
1028
1263
  end
1029
1264
 
1030
1265
  def test_hash_kwsplat
1031
1266
  self.class.class_eval {
1032
- type :_kwsplathsf, "() -> Hash<Symbol, Fixnum>"
1267
+ type :_kwsplathsf, "() -> Hash<Symbol, Integer>"
1033
1268
  type :_kwsplathos, "() -> Hash<Float, String>"
1034
1269
  }
1035
- assert_equal tt("{a: 1, b: 2}"), do_tc("x = {a: 1, **{b: 2}}")
1036
- assert_equal tt("{a: 1}"), do_tc("x = {a: 1, **{}}")
1037
- assert_equal tt("{a: 1, b: 2, c: 3}"), do_tc("x = {a: 1, **{b: 2}, c: 3}")
1038
- assert_equal tt("{a: 1, b: 2, c: 3}"), do_tc("x = {a: 1, **{b: 2}, **{c: 3}}")
1039
- assert_equal tt("{a: 1, b: 2, c: 3}"), do_tc("x = {a: 1, **{b: 2, c: 3}}")
1040
- assert_equal tt("{a: 1, b: 2, c: 3}"), do_tc("x = {**{a: 1}, b: 2, **{c: 3}}")
1270
+ assert do_tc("x = {a: 1, **{b: 2}}") <= tt("{a: 1, b: 2}")
1271
+ assert do_tc("x = {a: 1, **{}}") <= tt("{a: 1}")
1272
+ assert do_tc("x = {a: 1, **{b: 2}, c: 3}") <= tt("{a: 1, b: 2, c: 3}")
1273
+ assert do_tc("x = {a: 1, **{b: 2}, **{c: 3}}") <= tt("{a: 1, b: 2, c: 3}")
1274
+ assert do_tc("x = {a: 1, **{b: 2, c: 3}}") <= tt("{a: 1, b: 2, c: 3}")
1275
+ assert do_tc("x = {**{a: 1}, b: 2, **{c: 3}}") <= tt("{a: 1, b: 2, c: 3}")
1041
1276
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x = {a: 1, **Object.new}", env: @env) } # may or may not be hash
1042
1277
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("x = {a: 1, **SubHash.new}", env: @env) } # is a how, but unclear how to splat
1043
1278
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("y = {b: 2}; x = {a: 1, **y}; y.length") }
1044
1279
 
1045
- assert_equal tt("Hash<Symbol, Fixnum>"), do_tc("x = {**_kwsplathsf}", env: @env)
1046
- assert_equal tt("Hash<Symbol or Float, Fixnum or String>"), do_tc("x = {**_kwsplathsf, **_kwsplathos}", env: @env)
1047
- assert_equal tt("Hash<Symbol, Fixnum>"), do_tc("x = {a: 1, **_kwsplathsf, b: 2}", env: @env)
1048
- assert_equal tt("Hash<Symbol or String, Fixnum or String>"), do_tc("x = {'a' => 1, **_kwsplathsf, b: 'two'}", env: @env)
1280
+ assert do_tc("x = {**_kwsplathsf}", env: @env) <= tt("Hash<Symbol, Integer>")
1281
+ assert do_tc("x = {**_kwsplathsf, **_kwsplathos}", env: @env) <= tt("Hash<Symbol or Float, Integer or String>")
1282
+ assert do_tc("x = {a: 1, **_kwsplathsf, b: 2}", env: @env) <= tt("Hash<Symbol, Integer>")
1283
+ assert do_tc("x = {'a' => 1, **_kwsplathsf, b: 'two'}", env: @env) <= tt("Hash<Symbol or String, Integer or String>")
1049
1284
  end
1050
1285
 
1051
1286
  def test_attr_etc
1052
1287
  self.class.class_eval {
1053
- attr_reader_type :f_attr_reader, "Fixnum", :f_attr_reader2, "String"
1054
- attr_writer_type :f_attr_writer, "Fixnum"
1055
- attr_type :f_attr, "Fixnum"
1056
- attr_accessor_type :f_attr_accessor, "Fixnum"
1288
+ attr_reader_type :f_attr_reader, "Integer", :f_attr_reader2, "String"
1289
+ attr_writer_type :f_attr_writer, "Integer"
1290
+ attr_type :f_attr, "Integer"
1291
+ attr_accessor_type :f_attr_accessor, "Integer"
1057
1292
  }
1058
- assert_equal $__rdl_fixnum_type, do_tc("@f_attr_reader", env: @env)
1059
- assert_equal $__rdl_fixnum_type, do_tc("TestTypecheck.new.f_attr_reader", env: @env)
1293
+ assert do_tc("@f_attr_reader", env: @env) <= RDL::Globals.types[:integer]
1294
+ assert do_tc("TestTypecheck.new.f_attr_reader", env: @env) <= RDL::Globals.types[:integer]
1060
1295
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("TestTypecheck.new.f_attr_reader = 4", env: @env) }
1061
- assert_equal $__rdl_string_type, do_tc("@f_attr_reader2", env: @env)
1062
- assert_equal $__rdl_string_type, do_tc("TestTypecheck.new.f_attr_reader2", env: @env)
1296
+ assert do_tc("@f_attr_reader2", env: @env) <= RDL::Globals.types[:string]
1297
+ assert do_tc("TestTypecheck.new.f_attr_reader2", env: @env) <= RDL::Globals.types[:string]
1063
1298
 
1064
- assert_equal $__rdl_fixnum_type, do_tc("@f_attr", env: @env) # same as attr_reader
1065
- assert_equal $__rdl_fixnum_type, do_tc("TestTypecheck.new.f_attr", env: @env)
1299
+ assert do_tc("@f_attr", env: @env) # same as attr_reader <= RDL::Globals.types[:integer]
1300
+ assert do_tc("TestTypecheck.new.f_attr", env: @env) <= RDL::Globals.types[:integer]
1066
1301
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("TestTypecheck.new.f_attr = 42", env: @env) }
1067
1302
 
1068
- assert_equal @t3, do_tc("@f_attr_writer = 3", env: @env)
1069
- assert_equal $__rdl_fixnum_type, do_tc("TestTypecheck.new.f_attr_writer = 3", env: @env)
1303
+ assert do_tc("@f_attr_writer = 3", env: @env) <= @t3
1304
+ assert do_tc("TestTypecheck.new.f_attr_writer = 3", env: @env) <= RDL::Globals.types[:integer]
1070
1305
  assert_raises(RDL::Typecheck::StaticTypeError) { do_tc("TestTypecheck.new.f_attr_writer", env: @env) }
1071
1306
 
1072
- assert_equal $__rdl_fixnum_type, do_tc("@f_attr_accessor", env: @env)
1073
- assert_equal $__rdl_fixnum_type, do_tc("TestTypecheck.new.f_attr_accessor", env: @env)
1074
- assert_equal $__rdl_fixnum_type, do_tc("TestTypecheck.new.f_attr_accessor = 42", env: @env)
1307
+ assert do_tc("@f_attr_accessor", env: @env) <= RDL::Globals.types[:integer]
1308
+ assert do_tc("TestTypecheck.new.f_attr_accessor", env: @env) <= RDL::Globals.types[:integer]
1309
+ assert do_tc("TestTypecheck.new.f_attr_accessor = 42", env: @env) <= RDL::Globals.types[:integer]
1075
1310
  end
1076
1311
 
1077
1312
  # test code where we know different stuff about types on difference branches
1078
1313
  def test_typeful_branches
1079
- assert_equal $__rdl_fixnum_type, do_tc("x = Object.new; case x when String; x.length; end", env: @env)
1080
- assert_equal $__rdl_fixnum_type, do_tc("x = Object.new; case x when String, Array; x.length; end", env: @env)
1081
- assert_equal @t3, do_tc("x = String.new; case x when String; 3; when Fixnum; 4; end", env: @env)
1314
+ assert do_tc("x = Object.new; case x when String; x.length; end", env: @env) <= RDL::Globals.types[:integer]
1315
+ assert do_tc("x = Object.new; case x when String, Array; x.length; end", env: @env) <= RDL::Globals.types[:integer]
1316
+ assert do_tc("x = String.new; case x when String; 3; when Integer; 4; end", env: @env) <= @t3
1082
1317
  end
1083
1318
 
1084
1319
  def test_context_typecheck
1085
1320
  assert_raises(RDL::Typecheck::StaticTypeError) {
1086
1321
  self.class.class_eval {
1087
- type '() -> Fixnum', typecheck: :now
1322
+ type '() -> Integer', typecheck: :now
1088
1323
  def context_typecheck1
1089
1324
  context_tc_in_context1 # should fail
1090
1325
  end
1091
1326
  }
1092
1327
  }
1093
- $__rdl_info.add(self.class, :context_typecheck2, :context_types, [self.class, :context_tc_in_context2, $__rdl_parser.scan_str('() -> Fixnum')])
1328
+ RDL::Globals.info.add(self.class, :context_typecheck2, :context_types, [self.class, :context_tc_in_context2, RDL::Globals.parser.scan_str('() -> Integer')])
1094
1329
  self.class.class_eval {
1095
- type '() -> Fixnum', typecheck: :now
1330
+ type '() -> Integer', typecheck: :now
1096
1331
  def context_typecheck2
1097
1332
  context_tc_in_context2 # should not fail since method defined in context
1098
1333
  end
@@ -1102,7 +1337,7 @@ class TestTypecheck < Minitest::Test
1102
1337
  def test_optional_varargs_mapping
1103
1338
  assert_raises(RDL::Typecheck::StaticTypeError) {
1104
1339
  self.class.class_eval {
1105
- type '(?Fixnum) -> Fixnum', typecheck: :now
1340
+ type '(?Integer) -> Integer', typecheck: :now
1106
1341
  def _optional_varargs_mapping1(x)
1107
1342
  42
1108
1343
  end
@@ -1111,7 +1346,7 @@ class TestTypecheck < Minitest::Test
1111
1346
 
1112
1347
  assert_raises(RDL::Typecheck::StaticTypeError) {
1113
1348
  self.class.class_eval {
1114
- type '(Fixnum) -> Fixnum', typecheck: :now
1349
+ type '(Integer) -> Integer', typecheck: :now
1115
1350
  def _optional_varargs_mapping2(x=42)
1116
1351
  x
1117
1352
  end
@@ -1120,7 +1355,7 @@ class TestTypecheck < Minitest::Test
1120
1355
 
1121
1356
  assert_raises(RDL::Typecheck::StaticTypeError) {
1122
1357
  self.class.class_eval {
1123
- type '(*Fixnum) -> Fixnum', typecheck: :now
1358
+ type '(*Integer) -> Integer', typecheck: :now
1124
1359
  def _optional_varargs_mapping3(x=42)
1125
1360
  x
1126
1361
  end
@@ -1128,7 +1363,7 @@ class TestTypecheck < Minitest::Test
1128
1363
  }
1129
1364
 
1130
1365
  self.class.class_eval {
1131
- type '(?Fixnum) -> Fixnum', typecheck: :now
1366
+ type '(?Integer) -> Integer', typecheck: :now
1132
1367
  def _optional_varargs_mapping4(x=42)
1133
1368
  x
1134
1369
  end
@@ -1136,7 +1371,7 @@ class TestTypecheck < Minitest::Test
1136
1371
 
1137
1372
  assert_raises(RDL::Typecheck::StaticTypeError) {
1138
1373
  self.class.class_eval {
1139
- type '(?Fixnum) -> Fixnum', typecheck: :now
1374
+ type '(?Integer) -> Integer', typecheck: :now
1140
1375
  def _optional_varargs_mapping5(x='forty-two')
1141
1376
  42
1142
1377
  end
@@ -1145,7 +1380,7 @@ class TestTypecheck < Minitest::Test
1145
1380
 
1146
1381
  assert_raises(RDL::Typecheck::StaticTypeError) {
1147
1382
  self.class.class_eval {
1148
- type '(Fixnum) -> Fixnum', typecheck: :now
1383
+ type '(Integer) -> Integer', typecheck: :now
1149
1384
  def _optional_varargs_mapping6(*x)
1150
1385
  42
1151
1386
  end
@@ -1154,7 +1389,7 @@ class TestTypecheck < Minitest::Test
1154
1389
 
1155
1390
  assert_raises(RDL::Typecheck::StaticTypeError) {
1156
1391
  self.class.class_eval {
1157
- type '(?Fixnum) -> Fixnum', typecheck: :now
1392
+ type '(?Integer) -> Integer', typecheck: :now
1158
1393
  def _optional_varargs_mapping7(*x)
1159
1394
  42
1160
1395
  end
@@ -1162,7 +1397,7 @@ class TestTypecheck < Minitest::Test
1162
1397
  }
1163
1398
 
1164
1399
  self.class.class_eval {
1165
- type '(*Fixnum) -> Array<Fixnum>', typecheck: :now
1400
+ type '(*Integer) -> Array<Integer>', typecheck: :now
1166
1401
  def _optional_varargs_mapping8(*x)
1167
1402
  x
1168
1403
  end
@@ -1172,7 +1407,7 @@ class TestTypecheck < Minitest::Test
1172
1407
 
1173
1408
  def test_kw_mapping
1174
1409
  self.class.class_eval {
1175
- type '(kw: Fixnum) -> Fixnum', typecheck: :now
1410
+ type '(kw: Integer) -> Integer', typecheck: :now
1176
1411
  def _kw_mapping1(kw:)
1177
1412
  kw
1178
1413
  end
@@ -1180,7 +1415,7 @@ class TestTypecheck < Minitest::Test
1180
1415
 
1181
1416
  assert_raises(RDL::Typecheck::StaticTypeError) {
1182
1417
  self.class.class_eval {
1183
- type '(Fixnum) -> Fixnum', typecheck: :now
1418
+ type '(Integer) -> Integer', typecheck: :now
1184
1419
  def _kw_mapping2(kw:)
1185
1420
  kw
1186
1421
  end
@@ -1188,7 +1423,7 @@ class TestTypecheck < Minitest::Test
1188
1423
  }
1189
1424
 
1190
1425
  self.class.class_eval {
1191
- type '(kw: Fixnum) -> Fixnum', typecheck: :now
1426
+ type '(kw: Integer) -> Integer', typecheck: :now
1192
1427
  def _kw_mapping3(kw_args) # slightly awkward example
1193
1428
  kw_args[:kw]
1194
1429
  end
@@ -1196,7 +1431,7 @@ class TestTypecheck < Minitest::Test
1196
1431
 
1197
1432
  assert_raises(RDL::Typecheck::StaticTypeError) {
1198
1433
  self.class.class_eval {
1199
- type '(kw: Fixnum) -> Fixnum', typecheck: :now
1434
+ type '(kw: Integer) -> Integer', typecheck: :now
1200
1435
  def _kw_mapping4(kw: 42)
1201
1436
  kw
1202
1437
  end
@@ -1205,7 +1440,7 @@ class TestTypecheck < Minitest::Test
1205
1440
 
1206
1441
  assert_raises(RDL::Typecheck::StaticTypeError) {
1207
1442
  self.class.class_eval {
1208
- type '(kw: ?Fixnum) -> Fixnum', typecheck: :now
1443
+ type '(kw: ?Integer) -> Integer', typecheck: :now
1209
1444
  def _kw_mapping5(kw:)
1210
1445
  kw
1211
1446
  end
@@ -1213,7 +1448,7 @@ class TestTypecheck < Minitest::Test
1213
1448
  }
1214
1449
 
1215
1450
  self.class.class_eval {
1216
- type '(kw: ?Fixnum) -> Fixnum', typecheck: :now
1451
+ type '(kw: ?Integer) -> Integer', typecheck: :now
1217
1452
  def _kw_mapping6(kw: 42)
1218
1453
  kw
1219
1454
  end
@@ -1221,7 +1456,7 @@ class TestTypecheck < Minitest::Test
1221
1456
 
1222
1457
  assert_raises(RDL::Typecheck::StaticTypeError) {
1223
1458
  self.class.class_eval {
1224
- type '(kw: ?Fixnum) -> Fixnum', typecheck: :now
1459
+ type '(kw: ?Integer) -> Integer', typecheck: :now
1225
1460
  def _kw_mapping7(kw: 'forty-two')
1226
1461
  kw
1227
1462
  end
@@ -1229,7 +1464,7 @@ class TestTypecheck < Minitest::Test
1229
1464
  }
1230
1465
 
1231
1466
  self.class.class_eval {
1232
- type '(kw1: Fixnum, kw2: Fixnum) -> Fixnum', typecheck: :now
1467
+ type '(kw1: Integer, kw2: Integer) -> Integer', typecheck: :now
1233
1468
  def _kw_mapping8(kw1:, kw2:)
1234
1469
  kw1
1235
1470
  end
@@ -1237,7 +1472,7 @@ class TestTypecheck < Minitest::Test
1237
1472
 
1238
1473
  assert_raises(RDL::Typecheck::StaticTypeError) {
1239
1474
  self.class.class_eval {
1240
- type '(kw1: Fixnum, kw2: Fixnum, kw3: Fixnum) -> Fixnum', typecheck: :now
1475
+ type '(kw1: Integer, kw2: Integer, kw3: Integer) -> Integer', typecheck: :now
1241
1476
  def _kw_mapping9(kw2:)
1242
1477
  kw1
1243
1478
  end
@@ -1245,7 +1480,7 @@ class TestTypecheck < Minitest::Test
1245
1480
  }
1246
1481
 
1247
1482
  self.class.class_eval {
1248
- type '(kw1: Fixnum, kw2: Fixnum, **String) -> String', typecheck: :now
1483
+ type '(kw1: Integer, kw2: Integer, **String) -> String', typecheck: :now
1249
1484
  def _kw_mapping10(kw1:, kw2:, **kws)
1250
1485
  kws[:foo]
1251
1486
  end
@@ -1253,7 +1488,7 @@ class TestTypecheck < Minitest::Test
1253
1488
 
1254
1489
  assert_raises(RDL::Typecheck::StaticTypeError) {
1255
1490
  self.class.class_eval {
1256
- type '(kw1: Fixnum, kw2: Fixnum) -> String', typecheck: :now
1491
+ type '(kw1: Integer, kw2: Integer) -> String', typecheck: :now
1257
1492
  def _kw_mapping11(kw1:, kw2:, **kws)
1258
1493
  kws[:foo]
1259
1494
  end
@@ -1262,7 +1497,7 @@ class TestTypecheck < Minitest::Test
1262
1497
 
1263
1498
  assert_raises(RDL::Typecheck::StaticTypeError) {
1264
1499
  self.class.class_eval {
1265
- type '(kw1: Fixnum, kw2: Fixnum, **String) -> Fixnum', typecheck: :now
1500
+ type '(kw1: Integer, kw2: Integer, **String) -> Integer', typecheck: :now
1266
1501
  def _kw_mapping12(kw1:, kw2:)
1267
1502
  kw1
1268
1503
  end
@@ -1271,22 +1506,153 @@ class TestTypecheck < Minitest::Test
1271
1506
 
1272
1507
  end
1273
1508
 
1509
+ def test_class_call
1510
+ TestTypecheckE.class_eval {
1511
+ type '(Integer) -> Class', typecheck: :now
1512
+ def call_class1(x)
1513
+ x.class
1514
+ end
1515
+ type '() -> TestTypecheckE', typecheck: :now
1516
+ def call_class2
1517
+ self.class.new(1)
1518
+ end
1519
+ }
1520
+ t = do_tc("3.14.class", env: @env)
1521
+ assert t <= RDL::Type::SingletonType.new(Float)
1522
+ t2 = do_tc("TestTypecheckE.class", env: @env)
1523
+ assert t2 <= RDL::Type::SingletonType.new(Class)
1524
+ t3 = do_tc("[1,2,3].class", env: @env)
1525
+ assert t3 <= RDL::Type::SingletonType.new(Array)
1526
+ end
1527
+
1274
1528
  def test_singleton
1275
1529
  assert_equal ':A', do_tc("TestTypecheckC.foo", env: @env).to_s
1276
1530
  assert_equal ':B', do_tc("TestTypecheckM.foo", env: @env).to_s
1277
1531
  end
1278
1532
 
1279
1533
  def test_annotated_ret
1280
- t = $__rdl_parser.scan_str '#T Fixnum or String'
1281
- assert_equal t, do_tc("TestTypecheckC.bar", env: @env)
1534
+ assert do_tc("TestTypecheckC.bar", env: @env) <= tt('Integer or String')
1282
1535
  end
1283
1536
 
1284
1537
  def test_constructor
1285
- t = do_tc("TestTypecheckC.new(:D)", env: @env)
1286
- assert_equal ':E', t.to_s
1538
+ t = do_tc("TestTypecheckC.new(1)", env: @env)
1539
+ assert_equal 'TestTypecheckC', t.to_s
1540
+
1541
+
1542
+ assert_raises(RDL::Typecheck::StaticTypeError) {
1543
+ self.class.class_eval {
1544
+ type '(Integer) -> Integer', typecheck: :now
1545
+ def self.def_bad_new_call(x)
1546
+ TestTypecheckC.new()
1547
+ x
1548
+ end
1549
+ }
1550
+ }
1551
+
1552
+ RDL.do_typecheck :einit
1553
+
1554
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :finit }
1287
1555
 
1288
1556
  t = do_tc("TestTypecheckD.new", env: @env)
1289
1557
  t2 = RDL::Type::NominalType.new TestTypecheckD
1290
1558
  assert_equal t2, t
1559
+
1560
+ self.class.class_eval {
1561
+ type '(Integer) -> Integer', typecheck: :now
1562
+ def self.def_call_to_initialize(x)
1563
+ c = TestTypecheckC.new(x)
1564
+ c.foo
1565
+ end
1566
+ }
1567
+ end
1568
+
1569
+ def test_nil_return
1570
+ self.class.class_eval {
1571
+ type "(%any) -> NilClass", typecheck: :now
1572
+ def self.def_nil_ret(x) return; end
1573
+ }
1574
+ self.class.class_eval {
1575
+ type "(Integer) -> :A or NilClass", typecheck: :now
1576
+ def self.def_nil_ret_2(x)
1577
+ if x > 0
1578
+ :A
1579
+ else
1580
+ return
1581
+ end
1582
+ end
1583
+ }
1584
+ end
1585
+
1586
+ def test_method_missing
1587
+ skip "method_missing not supported yet"
1588
+ RDL.do_typecheck :later_mm1
1589
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :later_mm2 }
1590
+ end
1591
+
1592
+ def test_nested
1593
+ r = N1::N2.foo
1594
+ assert_equal :sym, r
1595
+
1596
+ r = N1::N2.nf
1597
+ assert_equal :sym, r
1598
+
1599
+ r = N1::N2.foo2
1600
+ assert_equal :sym2, r
1601
+
1602
+ r = N1::N3.new.nf3
1603
+ assert_equal :sym, r
1604
+
1605
+ r = N4.foo
1606
+ assert_equal :B, r
1607
+ end
1608
+
1609
+ def test_super
1610
+ self.class.class_eval "class SA0; end"
1611
+ self.class.class_eval "class SA1 < SA0; end"
1612
+
1613
+ TestTypecheck::SA0.class_eval do
1614
+ extend RDL::Annotate
1615
+ def self.foo; :a0; end
1616
+ def bar(x); 1 + x; end
1617
+ def baz(x); 1 + x; end
1618
+ type 'self.foo', '() -> :a0'
1619
+ type 'bar', '(Fixnum) -> Fixnum'
1620
+ type 'baz', '(Fixnum) -> Fixnum'
1621
+ end
1622
+ TestTypecheck::SA1.class_eval do
1623
+ extend RDL::Annotate
1624
+ def self.foo; super; end
1625
+ def bar(x); super(x); end
1626
+ def baz(x); super; end
1627
+ type 'self.foo', '() -> :a0', typecheck: :call
1628
+ type :bar, '(Fixnum) -> Fixnum', typecheck: :call
1629
+ type :baz, '(Fixnum) -> Fixnum', typecheck: :call
1630
+ end
1631
+
1632
+ r = TestTypecheck::SA1.foo
1633
+ assert_equal :a0, r
1634
+
1635
+ r = TestTypecheck::SA1.new.bar 1
1636
+ assert_equal 2, r
1637
+
1638
+ r = TestTypecheck::SA1.new.baz 1
1639
+ assert_equal 2, r
1640
+ end
1641
+
1642
+
1643
+ def test_case_when_nil_body
1644
+ self.class.class_eval "class A5; end"
1645
+ TestTypecheck::A5.class_eval do
1646
+ extend RDL::Annotate
1647
+ def foo(x)
1648
+ case x
1649
+ when :a
1650
+ when :b
1651
+ end
1652
+ end
1653
+ type(:foo, '(Symbol) -> NilClass', {:typecheck => :call})
1654
+ end
1655
+
1656
+ assert_nil TestTypecheck::A5.new.foo(:a)
1291
1657
  end
1292
1658
  end