rdl 2.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +5 -5
  2. data/.gitignore +1 -0
  3. data/.travis.yml +7 -6
  4. data/CHANGES.md +29 -0
  5. data/README.md +94 -26
  6. data/lib/rdl/boot.rb +82 -41
  7. data/lib/rdl/boot_rails.rb +5 -0
  8. data/lib/rdl/config.rb +9 -1
  9. data/lib/rdl/query.rb +2 -2
  10. data/lib/rdl/typecheck.rb +972 -225
  11. data/lib/rdl/types/annotated_arg.rb +8 -0
  12. data/lib/rdl/types/ast_node.rb +73 -0
  13. data/lib/rdl/types/bot.rb +8 -0
  14. data/lib/rdl/types/bound_arg.rb +63 -0
  15. data/lib/rdl/types/computed.rb +48 -0
  16. data/lib/rdl/types/dependent_arg.rb +9 -0
  17. data/lib/rdl/types/dynamic.rb +61 -0
  18. data/lib/rdl/types/finite_hash.rb +54 -9
  19. data/lib/rdl/types/generic.rb +33 -0
  20. data/lib/rdl/types/intersection.rb +8 -0
  21. data/lib/rdl/types/lexer.rex +6 -1
  22. data/lib/rdl/types/lexer.rex.rb +13 -1
  23. data/lib/rdl/types/method.rb +14 -0
  24. data/lib/rdl/types/nominal.rb +8 -0
  25. data/lib/rdl/types/non_null.rb +8 -0
  26. data/lib/rdl/types/optional.rb +8 -0
  27. data/lib/rdl/types/parser.racc +31 -5
  28. data/lib/rdl/types/parser.tab.rb +540 -302
  29. data/lib/rdl/types/rdl_types.rb +45 -0
  30. data/lib/rdl/types/singleton.rb +14 -1
  31. data/lib/rdl/types/string.rb +104 -0
  32. data/lib/rdl/types/structural.rb +8 -0
  33. data/lib/rdl/types/top.rb +8 -0
  34. data/lib/rdl/types/tuple.rb +32 -8
  35. data/lib/rdl/types/type.rb +54 -11
  36. data/lib/rdl/types/union.rb +41 -2
  37. data/lib/rdl/types/var.rb +10 -0
  38. data/lib/rdl/types/vararg.rb +8 -0
  39. data/lib/rdl/util.rb +13 -10
  40. data/lib/rdl/wrap.rb +271 -27
  41. data/lib/rdl_disable.rb +16 -2
  42. data/lib/types/active_record.rb +1 -0
  43. data/lib/types/core/array.rb +442 -23
  44. data/lib/types/core/basic_object.rb +3 -3
  45. data/lib/types/core/bigdecimal.rb +5 -0
  46. data/lib/types/core/class.rb +2 -0
  47. data/lib/types/core/dir.rb +3 -3
  48. data/lib/types/core/enumerable.rb +4 -4
  49. data/lib/types/core/enumerator.rb +1 -1
  50. data/lib/types/core/file.rb +4 -4
  51. data/lib/types/core/float.rb +203 -0
  52. data/lib/types/core/hash.rb +390 -15
  53. data/lib/types/core/integer.rb +223 -10
  54. data/lib/types/core/io.rb +2 -2
  55. data/lib/types/core/kernel.rb +8 -5
  56. data/lib/types/core/marshal.rb +3 -0
  57. data/lib/types/core/module.rb +3 -3
  58. data/lib/types/core/numeric.rb +0 -2
  59. data/lib/types/core/object.rb +5 -5
  60. data/lib/types/core/pathname.rb +2 -2
  61. data/lib/types/core/process.rb +1 -3
  62. data/lib/types/core/range.rb +1 -1
  63. data/lib/types/core/regexp.rb +2 -2
  64. data/lib/types/core/set.rb +1 -1
  65. data/lib/types/core/string.rb +408 -16
  66. data/lib/types/core/symbol.rb +3 -3
  67. data/lib/types/core/time.rb +1 -1
  68. data/lib/types/core/uri.rb +13 -13
  69. data/lib/types/rails/_helpers.rb +7 -1
  70. data/lib/types/rails/action_controller/mime_responds.rb +2 -0
  71. data/lib/types/rails/active_record/associations.rb +42 -30
  72. data/lib/types/rails/active_record/comp_types.rb +637 -0
  73. data/lib/types/rails/active_record/finder_methods.rb +1 -1
  74. data/lib/types/rails/active_record/model_schema.rb +28 -16
  75. data/lib/types/rails/active_record/relation.rb +5 -3
  76. data/lib/types/rails/active_record/sql-strings.rb +166 -0
  77. data/lib/types/rails/string.rb +1 -1
  78. data/lib/types/sequel.rb +1 -0
  79. data/lib/types/sequel/comp_types.rb +581 -0
  80. data/rdl.gemspec +5 -4
  81. data/test/test_alias.rb +4 -0
  82. data/test/test_array_types.rb +244 -0
  83. data/test/test_bound_types.rb +80 -0
  84. data/test/test_contract.rb +4 -0
  85. data/test/test_dsl.rb +5 -0
  86. data/test/test_dyn_comptype_checks.rb +206 -0
  87. data/test/test_generic.rb +21 -20
  88. data/test/test_hash_types.rb +322 -0
  89. data/test/test_intersection.rb +1 -0
  90. data/test/test_le.rb +29 -4
  91. data/test/test_member.rb +3 -1
  92. data/test/test_parser.rb +5 -0
  93. data/test/test_query.rb +1 -0
  94. data/test/test_rdl.rb +63 -28
  95. data/test/test_rdl_type.rb +4 -0
  96. data/test/test_string_types.rb +102 -0
  97. data/test/test_type_contract.rb +59 -37
  98. data/test/test_typecheck.rb +480 -75
  99. data/test/test_types.rb +17 -0
  100. data/test/test_wrap.rb +5 -0
  101. metadata +35 -5
  102. data/lib/types/rails/active_record/schema_types.rb +0 -51
@@ -1,6 +1,7 @@
1
1
  require 'minitest/autorun'
2
2
  $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
3
  require 'rdl'
4
+ RDL.reset
4
5
 
5
6
  class TestGeneric < Minitest::Test
6
7
  extend RDL::Annotate
@@ -8,8 +9,6 @@ class TestGeneric < Minitest::Test
8
9
  # Make two classes that wrap Array and Hash, so we don't mess with their
9
10
  # implementations in test case evaluation.
10
11
  class A
11
- extend RDL::Annotate
12
- type_params [:t], :all?
13
12
  def initialize(a); @a = a end
14
13
  def all?(&blk)
15
14
  @a.all?(&blk)
@@ -17,8 +16,6 @@ class TestGeneric < Minitest::Test
17
16
  end
18
17
 
19
18
  class H
20
- extend RDL::Annotate
21
- type_params [:k, :v], :all?
22
19
  def initialize(h); @h = h end
23
20
  def all?(&blk)
24
21
  @h.all? { |x, y| blk.call(x, y) } # have to do extra wrap to avoid splat issues
@@ -28,9 +25,7 @@ class TestGeneric < Minitest::Test
28
25
  class B
29
26
  extend RDL::Annotate
30
27
  # class for checking other variance annotations
31
- type_params [:a, :b], nil, variance: [:+, :-] { |a, b| true }
32
- type "(a) -> nil"
33
- def m1(x)
28
+ def m1(x) # type annotation
34
29
  nil
35
30
  end
36
31
  def m2(x) # no type annotation
@@ -38,7 +33,26 @@ class TestGeneric < Minitest::Test
38
33
  end
39
34
  end
40
35
 
36
+ class C
37
+ def m1() return self; end
38
+ def m2() return C.new; end
39
+ def m3() return Object.new; end
40
+ end
41
+
42
+ class D < C
43
+ end
44
+
45
+
46
+
41
47
  def setup
48
+ RDL.reset
49
+ RDL.type_params A, [:t], :all?
50
+ RDL.type_params H, [:k, :v], :all?
51
+ RDL.type_params(B, [:a, :b], nil, variance: [:+, :-]) { |a, b| true }
52
+ RDL.type B, :m1, "(a) -> nil"
53
+ RDL.type C, :m1, "() -> self"
54
+ RDL.type C, :m2, "() -> self"
55
+ RDL.type C, :m3, "() -> self"
42
56
  @ta = RDL::Type::NominalType.new "TestGeneric::A"
43
57
  @th = RDL::Type::NominalType.new "TestGeneric::H"
44
58
  @tas = RDL::Type::GenericType.new(@ta, RDL::Globals.types[:string])
@@ -111,19 +125,6 @@ class TestGeneric < Minitest::Test
111
125
  assert (tbss <= ts5)
112
126
  end
113
127
 
114
- class C
115
- extend RDL::Annotate
116
- type "() -> self"
117
- def m1() return self; end
118
- type "() -> self"
119
- def m2() return C.new; end
120
- type "() -> self"
121
- def m3() return Object.new; end
122
- end
123
-
124
- class D < C
125
- end
126
-
127
128
  def test_self_type
128
129
  c = C.new
129
130
  assert(c.m1)
@@ -0,0 +1,322 @@
1
+ require 'minitest/autorun'
2
+ $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
+ require 'rdl'
4
+ require 'types/core'
5
+
6
+
7
+ class TestHashTypes < Minitest::Test
8
+ extend RDL::Annotate
9
+
10
+ def setup
11
+ require 'types/core'
12
+ RDL.readd_comp_types
13
+ RDL.type_params :Hash, [:k, :v], :all? unless RDL::Globals.type_params["Hash"]
14
+ RDL.type_params :Array, [:t], :all? unless RDL::Globals.type_params["Array"]
15
+ end
16
+
17
+ def test_hash_methods
18
+ self.class.class_eval {
19
+ type '({bar: Integer, baz: String}) -> String', typecheck: :now
20
+ def access_test1(x)
21
+ x[:baz]
22
+ end
23
+
24
+ type '({bar: Integer, baz: String}) -> {bar: Integer, baz: String}', typecheck: :now
25
+ def access_test2(x)
26
+ x[:baz]
27
+ x
28
+ end
29
+
30
+ type '(Symbol, {bar: Integer, baz: String}) -> String or Integer', typecheck: :now
31
+ def access_test3(y, x)
32
+ x[y]
33
+ end
34
+
35
+ type '(Hash) -> v', typecheck: :now
36
+ def access_test4(x)
37
+ x[:blah]
38
+ end
39
+
40
+ type '(Hash<Symbol, Integer or String>) -> Integer or String', typecheck: :now
41
+ def access_test5(x)
42
+ x[:baz]
43
+ end
44
+
45
+ type '({ foo: 1, Symbol: String }) -> 1 or String', typecheck: :now
46
+ def access_test6(x)
47
+ x[:blah]
48
+ end
49
+
50
+ type '({bar: Integer, baz: String}) -> Integer', typecheck: :access_fail1
51
+ def access_fail_test1(x)
52
+ x[:baz]
53
+ end
54
+
55
+ type '(Hash<Symbol, Integer or String>) -> Integer', typecheck: :access_fail2
56
+ def access_fail_test2(x)
57
+ x[:baz]
58
+ end
59
+
60
+ type '({ bar: 1, baz: 2 }) -> :bar', typecheck: :now
61
+ def key_test1(x)
62
+ x.key(1)
63
+ end
64
+
65
+ type '({ bar: Integer, baz: String }) -> Symbol', typecheck: :now
66
+ def key_test2(x)
67
+ x.key(1)
68
+ end
69
+
70
+ type '(Hash<Symbol, Integer>) -> Symbol', typecheck: :now
71
+ def key_test3(x)
72
+ x.key(1)
73
+ end
74
+
75
+ type '({ bar: Integer, baz: String }) -> { bar: Integer, baz: String, foo: Integer }', typecheck: :now
76
+ def merge_test1(x)
77
+ x.merge({ foo: 1 })
78
+ end
79
+
80
+ type '({ bar: Integer, baz: String }) -> { bar: String, baz: String }', typecheck: :now
81
+ def merge_test2(x)
82
+ x.merge({ bar: 'hi' })
83
+ end
84
+
85
+ type '(Hash<Integer, String>, { bar: Integer, baz: String }) -> Hash<Integer or Symbol, Integer or String>', typecheck: :now
86
+ def merge_test3(x, y)
87
+ x.merge(y)
88
+ end
89
+
90
+ type '(Hash<Integer, String>, { bar: Integer, baz: String }) -> Hash<Integer or Symbol, Integer or String>', typecheck: :now
91
+ def merge_test4(x, y)
92
+ y.merge(x)
93
+ end
94
+
95
+ type '(Hash<Integer, String>, Hash<Symbol, Integer>) -> Hash<Integer or Symbol, String or Integer>', typecheck: :now
96
+ def merge_test5(x, y)
97
+ x.merge(y)
98
+ end
99
+
100
+ type '(Hash<Integer, String>, Hash<Symbol, Integer>) -> Hash<Integer or Symbol, String or Integer>', typecheck: :now
101
+ def merge_test6(x, y)
102
+ y.merge(x)
103
+ end
104
+
105
+ type '(Hash, { bar: Integer, baz: String }) -> Hash', typecheck: :now
106
+ def merge_test7(x, y)
107
+ x.merge(y)
108
+ end
109
+
110
+ type '(Hash, { bar: Integer, baz: String }) -> Hash', typecheck: :now
111
+ def merge_test8(x, y)
112
+ y.merge(x)
113
+ end
114
+
115
+ type '(Hash, Hash<Integer, String>) -> Hash', typecheck: :now
116
+ def merge_test9(x, y)
117
+ x.merge(y)
118
+ end
119
+
120
+ type '(Hash, Hash<Integer, String>) -> Hash', typecheck: :now
121
+ def merge_test10(x, y)
122
+ y.merge(x)
123
+ end
124
+
125
+ type '({ bar: Integer, baz: String}) -> 2', typecheck: :now
126
+ def length_test1(x)
127
+ x.length
128
+ end
129
+
130
+ type '(Hash<Integer, String>) -> Integer', typecheck: :now
131
+ def length_test2(x)
132
+ x.length
133
+ end
134
+
135
+ type '({ hi: 1}) -> false', typecheck: :now
136
+ def empty_test1(x)
137
+ x.empty?
138
+ end
139
+
140
+ type '() -> true', typecheck: :now
141
+ def empty_test2()
142
+ x = {}
143
+ x.empty?
144
+ end
145
+
146
+ type '(Hash) -> %bool', typecheck: :now
147
+ def empty_test3(x)
148
+ x.empty?
149
+ end
150
+
151
+ type '(Hash<Symbol, String>) -> %bool', typecheck: :now
152
+ def empty_test4(x)
153
+ x.empty?
154
+ end
155
+
156
+ type '({ baz: Integer, 1 => 2 }) -> [:baz, 1]', typecheck: :now
157
+ def keys_test1(x)
158
+ x.keys
159
+ end
160
+
161
+ type '(Hash<Symbol, Integer>) -> Array<Symbol>', typecheck: :now
162
+ def keys_test2(x)
163
+ x.keys
164
+ end
165
+
166
+
167
+ type '({ foo: Integer }) -> { foo: Integer, bar: String }', typecheck: :now
168
+ def assign_test1(x)
169
+ x[:bar] = "2"
170
+ x
171
+ end
172
+
173
+ type '(Hash<Symbol, Integer>) -> Integer', typecheck: :now
174
+ def assign_test2(x)
175
+ x[:blah] = 42
176
+ x[:foo]
177
+ end
178
+
179
+ type '() -> Integer', typecheck: :now
180
+ def assign_test3()
181
+ x = {foo: 1, bar: 2, baz: 3}
182
+ x[:bar] = 3
183
+ end
184
+
185
+ type '({foo: Integer}) -> 42', typecheck: :now
186
+ def assign_test4(x)
187
+ x[:bar] = 42
188
+ x[:bar]
189
+ end
190
+
191
+ type '(Integer, { foo: String }) -> Hash<Symbol or Integer, String or Integer>', typecheck: :now
192
+ def assign_test5(i, x)
193
+ x[i] = i
194
+ x
195
+ end
196
+
197
+ type '({ foo: 1 }) -> { foo: 1 or 2 }', typecheck: :now
198
+ def assign_test6(x)
199
+ x[:foo] = 2
200
+ x
201
+ end
202
+
203
+ type :hash_callee, '({ foo: 1 or 2 }) -> %bool'
204
+
205
+ type '({ foo: 1 }) -> { foo: 1 or 2 }', typecheck: :now
206
+ def assign_test7(x)
207
+ hash_callee(x)
208
+ x[:foo] = 2
209
+ x
210
+ end
211
+
212
+ type '({ foo: 1 }) -> String', typecheck: :assign_fail1
213
+ def assign_fail_test1(x)
214
+ hash_callee(x)
215
+ x[:foo] = "2"
216
+ end
217
+
218
+ type '(Hash<Symbol, Integer>) -> %any', typecheck: :assign_fail2
219
+ def assign_fail_test2(x)
220
+ x[:blah] = 'hi'
221
+ end
222
+
223
+ type '(Hash<Symbol, Integer>) -> %any', typecheck: :assign_fail3
224
+ def assign_fail_test3(x)
225
+ x['string'] = 2
226
+ end
227
+
228
+ type '({ foo: 1, bar: String }) -> [:bar, String]', typecheck: :now
229
+ def assoc_test1(x)
230
+ x.assoc(:bar)
231
+ end
232
+
233
+ type '(Symbol, { foo: 1, bar: String }) -> [Symbol, Integer or String]', typecheck: :now
234
+ def assoc_test2(y, x)
235
+ x.assoc(y)
236
+ end
237
+
238
+ type '(Hash<Symbol, Integer>) -> [Symbol, Integer]'
239
+ def assoc_test3(x)
240
+ x.assoc(42)
241
+ end
242
+
243
+ type '({ foo: 1 }) -> true', typecheck: :now
244
+ def has_key_test1(x)
245
+ x.has_key?(:foo)
246
+ end
247
+
248
+ type '({ foo: 1 }) -> false', typecheck: :now
249
+ def has_key_test2(x)
250
+ x.has_key?(:bar)
251
+ end
252
+
253
+ type '(Symbol, { foo: 1 }) -> %bool', typecheck: :now
254
+ def has_key_test3(y, x)
255
+ x.has_key?(y)
256
+ end
257
+
258
+ type '(Symbol, Hash<Symbol, Integer>) -> %bool', typecheck: :now
259
+ def has_key_test4(y, x)
260
+ x.has_key?(y)
261
+ end
262
+
263
+ type '(String) -> { a: 1, b: String }', typecheck: :now
264
+ def create_test1(x)
265
+ Hash[:a, 1, :b, x]
266
+ end
267
+
268
+ type '() -> %any', typecheck: :create_fail1
269
+ def create_fail_test1
270
+ Hash[1, 2, 3]
271
+ end
272
+
273
+ type '({ foo: 1, bar: 2 }) -> 1', typecheck: :now
274
+ def delete_test1(x)
275
+ x.delete(:foo)
276
+ end
277
+
278
+ type '({ foo: 1, bar: 2 }) -> { foo: 1, bar: 2 }', typecheck: :now
279
+ def delete_test2(x)
280
+ x.delete(:foo)
281
+ x
282
+ end
283
+
284
+ type '(Symbol, {foo: 1, bar: 2}) -> 1 or 2', typecheck: :now
285
+ def delete_test3(s, x)
286
+ x.delete(s)
287
+ end
288
+
289
+ type '(Symbol, Hash<Symbol, Integer>) -> Integer', typecheck: :now
290
+ def delete_test4(s, x)
291
+ x.delete(s)
292
+ end
293
+
294
+ type '(Symbol, { foo: 1 }) -> Integer or String'
295
+ def delete_test5(s, x)
296
+ x.delete(s) { |i| "hi" }
297
+ end
298
+
299
+ type '({ foo: 1, bar: String, baz: Integer }) -> [1, String]', typecheck: :now
300
+ def values_at_test1(x)
301
+ x.values_at(:foo, :bar)
302
+ end
303
+
304
+ type '(Symbol, { foo: 1, bar: String, baz: Integer }) -> Array<Integer or String>', typecheck: :now
305
+ def values_at_test2(s, x)
306
+ x.values_at(:foo, s)
307
+ end
308
+
309
+ type '({ foo: 1, Symbol: String, baz: Integer }) -> Array<Integer or String>', typecheck: :now
310
+ def values_at_test3(x)
311
+ x.values_at(:foo, :blah)
312
+ end
313
+ }
314
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :access_fail1 }
315
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :access_fail2 }
316
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :assign_fail1 }
317
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :assign_fail2 }
318
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :assign_fail3 }
319
+ assert_raises(RDL::Typecheck::StaticTypeError) { RDL.do_typecheck :create_fail1 }
320
+ end
321
+
322
+ end
@@ -6,6 +6,7 @@ class TestIntersection < Minitest::Test
6
6
  include RDL::Type
7
7
 
8
8
  def setup
9
+ RDL.reset
9
10
  @parser = RDL::Type::Parser.new
10
11
 
11
12
  @integer = NominalType.new(Integer)
@@ -1,7 +1,6 @@
1
1
  require 'minitest/autorun'
2
2
  $LOAD_PATH << File.dirname(__FILE__) + "/../lib"
3
3
  require 'rdl'
4
- require 'types/core'
5
4
 
6
5
  class TestLe < Minitest::Test
7
6
  include RDL::Type
@@ -21,6 +20,7 @@ class TestLe < Minitest::Test
21
20
  end
22
21
 
23
22
  def setup
23
+ RDL.reset
24
24
  @tbasicobject = NominalType.new "BasicObject"
25
25
  @tsymfoo = SingletonType.new :foo
26
26
  @ta = NominalType.new A
@@ -54,6 +54,24 @@ class TestLe < Minitest::Test
54
54
  assert (@tsymfoo <= RDL::Globals.types[:top])
55
55
  end
56
56
 
57
+ def test_dyn
58
+ assert (RDL::Globals.types[:dyn] <= RDL::Globals.types[:nil])
59
+ assert (RDL::Globals.types[:nil] <= RDL::Globals.types[:dyn])
60
+ assert (RDL::Globals.types[:dyn] <= RDL::Globals.types[:top])
61
+ assert (RDL::Globals.types[:top] <= RDL::Globals.types[:dyn])
62
+ assert (RDL::Globals.types[:dyn] <= RDL::Globals.types[:bot])
63
+ assert (RDL::Globals.types[:bot] <= RDL::Globals.types[:dyn])
64
+ assert (RDL::Globals.types[:dyn] <= RDL::Globals.types[:dyn])
65
+ assert (RDL::Globals.types[:dyn] <= RDL::Globals.types[:string])
66
+ assert (RDL::Globals.types[:string] <= RDL::Globals.types[:dyn])
67
+ assert (RDL::Globals.types[:dyn] <= RDL::Globals.types[:object])
68
+ assert (RDL::Globals.types[:object] <= RDL::Globals.types[:dyn])
69
+ assert (RDL::Globals.types[:dyn] <= @tbasicobject)
70
+ assert (@tbasicobject <= RDL::Globals.types[:dyn])
71
+ assert (RDL::Globals.types[:dyn] <= @tsymfoo)
72
+ assert (@tsymfoo <= RDL::Globals.types[:dyn])
73
+ end
74
+
57
75
  def test_sym
58
76
  assert (RDL::Globals.types[:symbol] <= RDL::Globals.types[:symbol])
59
77
  assert (@tsymfoo <= @tsymfoo)
@@ -90,6 +108,8 @@ class TestLe < Minitest::Test
90
108
  end
91
109
 
92
110
  def test_tuple
111
+ RDL.type_params :Array, [:t], :all?
112
+
93
113
  t1 = TupleType.new(RDL::Globals.types[:symbol], RDL::Globals.types[:string])
94
114
  t2 = TupleType.new(RDL::Globals.types[:object], RDL::Globals.types[:object])
95
115
  tarray = NominalType.new("Array")
@@ -131,6 +151,8 @@ class TestLe < Minitest::Test
131
151
  end
132
152
 
133
153
  def test_finite_hash
154
+ RDL.type_params :Hash, [:k, :v], :all?
155
+
134
156
  t12 = tt "{a: 1, b: 2}"
135
157
  tfs = tt "{a: Integer, b: Integer}"
136
158
  too = tt "{a: Object, b: Object}"
@@ -248,18 +270,18 @@ class TestLe < Minitest::Test
248
270
  end
249
271
 
250
272
  class NomT
251
- extend RDL::Annotate
252
- type "() -> nil"
253
273
  def m1()
254
274
  nil
255
275
  end
256
- type "() -> nil"
257
276
  def m2()
258
277
  nil
259
278
  end
260
279
  end
261
280
 
262
281
  def test_nominal_structural
282
+ RDL.type TestLe::NomT, :m1, "() -> nil", wrap: false
283
+ RDL.type TestLe::NomT, :m2, "() -> nil", wrap: false
284
+
263
285
  tnom = NominalType.new(Nom)
264
286
  tnomt = NominalType.new(NomT)
265
287
  tma = MethodType.new([], nil, RDL::Globals.types[:nil])
@@ -279,6 +301,9 @@ class TestLe < Minitest::Test
279
301
  end
280
302
 
281
303
  def test_leq_inst
304
+ RDL.type_params :Array, [:t], :all?
305
+ RDL.type_params :Hash, [:k, :v], :all?
306
+
282
307
  # when return of do_leq is false, ignore resulting inst, since that's very implementation dependent
283
308
  assert_equal [true, {t: @ta}], do_leq(tt("t"), @ta, true)
284
309
  assert_equal false, do_leq(tt("t"), @ta, false)[0]