typed.rb 0.0.11
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.
- checksums.yaml +7 -0
- data/Rakefile +26 -0
- data/bin/typed.rb +110 -0
- data/lib/typed/language.rb +131 -0
- data/lib/typed/model/tm_abs.rb +104 -0
- data/lib/typed/model/tm_array_literal.rb +25 -0
- data/lib/typed/model/tm_boolean.rb +15 -0
- data/lib/typed/model/tm_boolean_operator.rb +34 -0
- data/lib/typed/model/tm_break.rb +24 -0
- data/lib/typed/model/tm_case_when.rb +38 -0
- data/lib/typed/model/tm_class.rb +63 -0
- data/lib/typed/model/tm_const.rb +29 -0
- data/lib/typed/model/tm_defined.rb +19 -0
- data/lib/typed/model/tm_error.rb +16 -0
- data/lib/typed/model/tm_float.rb +15 -0
- data/lib/typed/model/tm_for.rb +42 -0
- data/lib/typed/model/tm_fun.rb +165 -0
- data/lib/typed/model/tm_global_var.rb +22 -0
- data/lib/typed/model/tm_global_var_assignment.rb +20 -0
- data/lib/typed/model/tm_hash_literal.rb +32 -0
- data/lib/typed/model/tm_if_else.rb +24 -0
- data/lib/typed/model/tm_instance_var.rb +23 -0
- data/lib/typed/model/tm_instance_var_assignment.rb +32 -0
- data/lib/typed/model/tm_int.rb +15 -0
- data/lib/typed/model/tm_local_var_asgn.rb +35 -0
- data/lib/typed/model/tm_mass_asgn.rb +60 -0
- data/lib/typed/model/tm_mlhs.rb +87 -0
- data/lib/typed/model/tm_module.rb +51 -0
- data/lib/typed/model/tm_next.rb +24 -0
- data/lib/typed/model/tm_nil.rb +14 -0
- data/lib/typed/model/tm_range_literal.rb +30 -0
- data/lib/typed/model/tm_regexp.rb +27 -0
- data/lib/typed/model/tm_rescue.rb +27 -0
- data/lib/typed/model/tm_return.rb +24 -0
- data/lib/typed/model/tm_s_class.rb +30 -0
- data/lib/typed/model/tm_self.rb +22 -0
- data/lib/typed/model/tm_send.rb +300 -0
- data/lib/typed/model/tm_sequencing.rb +53 -0
- data/lib/typed/model/tm_string.rb +15 -0
- data/lib/typed/model/tm_string_interpolation.rb +21 -0
- data/lib/typed/model/tm_super.rb +27 -0
- data/lib/typed/model/tm_symbol.rb +15 -0
- data/lib/typed/model/tm_symbol_interpolation.rb +21 -0
- data/lib/typed/model/tm_try.rb +29 -0
- data/lib/typed/model/tm_var.rb +28 -0
- data/lib/typed/model/tm_while.rb +43 -0
- data/lib/typed/model.rb +48 -0
- data/lib/typed/prelude.rb +939 -0
- data/lib/typed/prelude_existential_registry.bin +0 -0
- data/lib/typed/prelude_generic_registry.bin +0 -0
- data/lib/typed/prelude_registry.bin +0 -0
- data/lib/typed/runtime/ast_parser.rb +589 -0
- data/lib/typed/runtime/method_signature_processor.rb +72 -0
- data/lib/typed/runtime/normalization/validations.rb +47 -0
- data/lib/typed/runtime/normalization.rb +196 -0
- data/lib/typed/runtime/parser_context.rb +36 -0
- data/lib/typed/runtime/type_parser.rb +215 -0
- data/lib/typed/runtime/type_registry.rb +170 -0
- data/lib/typed/runtime/type_signature_processor.rb +34 -0
- data/lib/typed/runtime.rb +33 -0
- data/lib/typed/type_signature/parser.rb +240 -0
- data/lib/typed/types/polymorphism/existential_type_variable.rb +13 -0
- data/lib/typed/types/polymorphism/generic_comparisons.rb +134 -0
- data/lib/typed/types/polymorphism/generic_variables.rb +24 -0
- data/lib/typed/types/polymorphism/type_variable.rb +138 -0
- data/lib/typed/types/polymorphism/type_variable_register.rb +298 -0
- data/lib/typed/types/polymorphism/unification.rb +579 -0
- data/lib/typed/types/ty_boolean.rb +15 -0
- data/lib/typed/types/ty_dynamic.rb +39 -0
- data/lib/typed/types/ty_either.rb +168 -0
- data/lib/typed/types/ty_error.rb +18 -0
- data/lib/typed/types/ty_existential_type.rb +22 -0
- data/lib/typed/types/ty_function.rb +144 -0
- data/lib/typed/types/ty_generic_function.rb +115 -0
- data/lib/typed/types/ty_generic_object.rb +180 -0
- data/lib/typed/types/ty_generic_singleton_object.rb +238 -0
- data/lib/typed/types/ty_object.rb +256 -0
- data/lib/typed/types/ty_singleton_object.rb +78 -0
- data/lib/typed/types/ty_stack_jump.rb +44 -0
- data/lib/typed/types/ty_top_level_object.rb +38 -0
- data/lib/typed/types.rb +60 -0
- data/lib/typed/typing_context.rb +206 -0
- data/lib/typed/version.rb +3 -0
- data/lib/typed.rb +161 -0
- data/spec/lib/ast_parser_spec.rb +101 -0
- data/spec/lib/examples/animals.rb +44 -0
- data/spec/lib/examples/counter.rb +16 -0
- data/spec/lib/examples/if.rb +31 -0
- data/spec/lib/language_spec.rb +36 -0
- data/spec/lib/model/tm_abs_spec.rb +66 -0
- data/spec/lib/model/tm_array_literal_spec.rb +36 -0
- data/spec/lib/model/tm_case_when_spec.rb +39 -0
- data/spec/lib/model/tm_class_spec.rb +67 -0
- data/spec/lib/model/tm_defined_spec.rb +10 -0
- data/spec/lib/model/tm_for_spec.rb +150 -0
- data/spec/lib/model/tm_fun_spec.rb +11 -0
- data/spec/lib/model/tm_hash_literal_spec.rb +40 -0
- data/spec/lib/model/tm_mass_asgn_spec.rb +104 -0
- data/spec/lib/model/tm_module_spec.rb +42 -0
- data/spec/lib/model/tm_regexp_spec.rb +9 -0
- data/spec/lib/model/tm_return_spec.rb +47 -0
- data/spec/lib/model/tm_s_class_spec.rb +27 -0
- data/spec/lib/model/tm_self_spec.rb +19 -0
- data/spec/lib/model/tm_string_interpolation_spec.rb +10 -0
- data/spec/lib/model/tm_symbol_interpolation_spec.rb +10 -0
- data/spec/lib/model/tm_symbol_spec.rb +9 -0
- data/spec/lib/model/tm_while_spec.rb +141 -0
- data/spec/lib/polymorphism/type_variable_spec.rb +14 -0
- data/spec/lib/polymorphism/unification_spec.rb +328 -0
- data/spec/lib/prelude/array_spec.rb +263 -0
- data/spec/lib/prelude/class_spec.rb +12 -0
- data/spec/lib/prelude/enumerable_spec.rb +278 -0
- data/spec/lib/prelude/enumerator_spec.rb +101 -0
- data/spec/lib/prelude/hash_spec.rb +361 -0
- data/spec/lib/prelude/kernel_spec.rb +23 -0
- data/spec/lib/prelude/object_spec.rb +22 -0
- data/spec/lib/prelude/pair_spec.rb +16 -0
- data/spec/lib/prelude/showable_spec.rb +31 -0
- data/spec/lib/prelude/string_spec.rb +98 -0
- data/spec/lib/runtime/normalization_spec.rb +29 -0
- data/spec/lib/runtime/validations_spec.rb +56 -0
- data/spec/lib/runtime_spec.rb +503 -0
- data/spec/lib/type_signature/parser_spec.rb +239 -0
- data/spec/lib/types/comparisons_spec.rb +35 -0
- data/spec/lib/types/polymorphism/generic_comparisons_spec.rb +492 -0
- data/spec/lib/types/polymorphism/type_variable_register_spec.rb +128 -0
- data/spec/lib/types/ty_dynamic_spec.rb +103 -0
- data/spec/lib/types/ty_either_spec.rb +288 -0
- data/spec/lib/types/ty_error_spec.rb +18 -0
- data/spec/lib/types/ty_generic_object_spec.rb +78 -0
- data/spec/lib/types/ty_generic_singleton_object_spec.rb +288 -0
- data/spec/lib/types/typing_context_spec.rb +86 -0
- data/spec/lib/types_spec.rb +174 -0
- data/spec/lib/typing/boolean_asgn_spec.rb +134 -0
- data/spec/lib/typing/break_spec.rb +79 -0
- data/spec/lib/typing/generics_spec.rb +191 -0
- data/spec/lib/typing/instance_vars_spec.rb +103 -0
- data/spec/lib/typing/next_spec.rb +29 -0
- data/spec/lib/typing/op_asgn_spec.rb +104 -0
- data/spec/lib/typing/overriden_methods_spec.rb +31 -0
- data/spec/lib/typing/subtyping_spec.rb +112 -0
- data/spec/lib/typing/tm_boolean_operator_spec.rb +100 -0
- data/spec/lib/typing/tm_boolean_spec.rb +61 -0
- data/spec/lib/typing/tm_const_spec.rb +28 -0
- data/spec/lib/typing/tm_defined_spec.rb +12 -0
- data/spec/lib/typing/tm_fun_spec.rb +347 -0
- data/spec/lib/typing/tm_global_var_spec.rb +33 -0
- data/spec/lib/typing/tm_if_else_spec.rb +104 -0
- data/spec/lib/typing/tm_ignore_spec.rb +24 -0
- data/spec/lib/typing/tm_instance_vars_spec.rb +117 -0
- data/spec/lib/typing/tm_local_var_asgn_spec.rb +134 -0
- data/spec/lib/typing/tm_mlhs_spec.rb +164 -0
- data/spec/lib/typing/tm_module_spec.rb +89 -0
- data/spec/lib/typing/tm_raise_spec.rb +31 -0
- data/spec/lib/typing/tm_range_literal_spec.rb +25 -0
- data/spec/lib/typing/tm_regexp_spec.rb +14 -0
- data/spec/lib/typing/tm_return_spec.rb +45 -0
- data/spec/lib/typing/tm_send_casting_spec.rb +26 -0
- data/spec/lib/typing/tm_send_class_methods_spec.rb +42 -0
- data/spec/lib/typing/tm_send_generic_apply_spec.rb +103 -0
- data/spec/lib/typing/tm_send_generic_methods_spec.rb +77 -0
- data/spec/lib/typing/tm_send_initialize_spec.rb +68 -0
- data/spec/lib/typing/tm_send_lambda_spec.rb +135 -0
- data/spec/lib/typing/tm_send_spec.rb +217 -0
- data/spec/lib/typing/tm_send_yield_block_spec.rb +308 -0
- data/spec/lib/typing/tm_sequencing_spec.rb +174 -0
- data/spec/lib/typing/tm_string_interpolation_spec.rb +19 -0
- data/spec/lib/typing/tm_super_spec.rb +63 -0
- data/spec/lib/typing/tm_symbol_interpolation_spec.rb +19 -0
- data/spec/lib/typing/tm_symbol_spec.rb +14 -0
- data/spec/lib/typing/tm_try_spec.rb +73 -0
- data/spec/spec_helper.rb +140 -0
- metadata +216 -0
@@ -0,0 +1,492 @@
|
|
1
|
+
require_relative '../../../spec_helper'
|
2
|
+
|
3
|
+
describe TypedRb::Types::Polymorphism::GenericComparisons do
|
4
|
+
|
5
|
+
let(:language) { TypedRb::Language.new }
|
6
|
+
|
7
|
+
let(:int_bound) do
|
8
|
+
TypedRb::Types::TySingletonObject.new(Integer)
|
9
|
+
end
|
10
|
+
|
11
|
+
let(:numeric_bound) do
|
12
|
+
TypedRb::Types::TySingletonObject.new(Numeric)
|
13
|
+
end
|
14
|
+
|
15
|
+
let(:object_bound) do
|
16
|
+
TypedRb::Types::TySingletonObject.new(Object)
|
17
|
+
end
|
18
|
+
|
19
|
+
# Array[? < Integer]
|
20
|
+
let(:array_extends_integer) do
|
21
|
+
type_arg = TypedRb::Types::Polymorphism::TypeVariable.new('Array:T:1:?',
|
22
|
+
:gen_name => false,
|
23
|
+
:upper_bound => int_bound)
|
24
|
+
TypedRb::Types::TyGenericSingletonObject.new(Array, [type_arg])
|
25
|
+
end
|
26
|
+
|
27
|
+
# Array[? > Numeric]
|
28
|
+
let(:array_super_numeric) do
|
29
|
+
type_arg = TypedRb::Types::Polymorphism::TypeVariable.new('Array:T:1:?',
|
30
|
+
:gen_name => false,
|
31
|
+
:lower_bound => numeric_bound)
|
32
|
+
# type_arg.bind(numeric_bound)
|
33
|
+
TypedRb::Types::TyGenericSingletonObject.new(Array, [type_arg])
|
34
|
+
end
|
35
|
+
|
36
|
+
# Array[?]
|
37
|
+
let(:arg0) do
|
38
|
+
type_arg = TypedRb::Types::Polymorphism::TypeVariable.new('?', :gen_name => false)
|
39
|
+
TypedRb::Types::TyGenericSingletonObject.new(Array, [type_arg])
|
40
|
+
end
|
41
|
+
|
42
|
+
# Array[Integer]
|
43
|
+
let(:arg1) do
|
44
|
+
type_arg = TypedRb::Types::Polymorphism::TypeVariable.new('Array:T', :gen_name => false,
|
45
|
+
:upper_bound => int_bound,
|
46
|
+
:lower_bound => int_bound)
|
47
|
+
type_arg.bind(int_bound)
|
48
|
+
TypedRb::Types::TyGenericSingletonObject.new(Array, [type_arg])
|
49
|
+
end
|
50
|
+
|
51
|
+
# Array[Numeric]
|
52
|
+
let(:arg2) do
|
53
|
+
type_arg = TypedRb::Types::Polymorphism::TypeVariable.new('Array:T', :gen_name => false,
|
54
|
+
:upper_bound => numeric_bound,
|
55
|
+
:lower_bound => numeric_bound)
|
56
|
+
type_arg.bind(numeric_bound)
|
57
|
+
TypedRb::Types::TyGenericSingletonObject.new(Array, [type_arg])
|
58
|
+
end
|
59
|
+
|
60
|
+
# Array[? < Numeric]
|
61
|
+
let(:arg3) do
|
62
|
+
type_arg = TypedRb::Types::Polymorphism::TypeVariable.new('Array:T:1:?',
|
63
|
+
:gen_name => false,
|
64
|
+
:upper_bound => numeric_bound)
|
65
|
+
# type_arg.bind(numeric_bound)
|
66
|
+
TypedRb::Types::TyGenericSingletonObject.new(Array, [type_arg])
|
67
|
+
end
|
68
|
+
|
69
|
+
# Array[? > Integer]
|
70
|
+
let(:arg4) do
|
71
|
+
type_arg = TypedRb::Types::Polymorphism::TypeVariable.new('Array:T:1:?',
|
72
|
+
:gen_name => false,
|
73
|
+
:lower_bound => int_bound)
|
74
|
+
# type_arg.bind(int_bound)
|
75
|
+
TypedRb::Types::TyGenericSingletonObject.new(Array, [type_arg])
|
76
|
+
end
|
77
|
+
|
78
|
+
# Array[? > Object]
|
79
|
+
let(:arg5) do
|
80
|
+
type_arg = TypedRb::Types::Polymorphism::TypeVariable.new('Array:T:1:?',
|
81
|
+
:gen_name => false,
|
82
|
+
:lower_bound => object_bound)
|
83
|
+
# type_arg.bind(object_bound)
|
84
|
+
TypedRb::Types::TyGenericSingletonObject.new(Array, [type_arg])
|
85
|
+
end
|
86
|
+
|
87
|
+
context 'base of :lt comparison is a generic type with an upper_bound' do
|
88
|
+
it 'checks correctly: Array<?> :lt Array<? extends Integer> => [?, ?] /< [?, Integer] => FALSE' do
|
89
|
+
code = <<__CODE
|
90
|
+
ts '#tgcoll2 / Array[? < Integer] -> unit'
|
91
|
+
def tgcoll2(gc); end
|
92
|
+
|
93
|
+
arg = Array.('[?]').new
|
94
|
+
|
95
|
+
tgcoll2(arg)
|
96
|
+
__CODE
|
97
|
+
expect {
|
98
|
+
language.check(code)
|
99
|
+
}.to raise_error(TypedRb::TypeCheckError)
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'checks correctly: Array<?> :lt Array<? extends Integer> => [?, ?] /< [?, Integer] => FALSE' do
|
103
|
+
expect(arg0.compatible?(array_extends_integer, :lt)).to be_falsey
|
104
|
+
end
|
105
|
+
|
106
|
+
|
107
|
+
it 'checks correctly: Array<? extends Integer> :lt correctly: Array<?> => [?, Integer] < [?, ?] => TRUE' do
|
108
|
+
code = <<__CODE
|
109
|
+
ts '#tgcoll3 / Array[?] -> unit'
|
110
|
+
def tgcoll3(gc); end
|
111
|
+
|
112
|
+
arg = Array.('[? < Integer]').new
|
113
|
+
|
114
|
+
tgcoll3(arg)
|
115
|
+
__CODE
|
116
|
+
|
117
|
+
result = language.check(code)
|
118
|
+
expect(result.ruby_type).to eq(NilClass)
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'checks correctly: Array<? extends Integer> :lt correctly: Array<?> => [?, Integer] < [?, ?] => TRUE' do
|
122
|
+
expect(array_extends_integer.compatible?(arg0, :lt)).to be_truthy
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
it 'checks correctly: Array<Integer> :lt Array<? extends Integer> => [Integer, Integer] < [?, Integer] => TRUE' do
|
127
|
+
code = <<__CODE
|
128
|
+
ts '#tgcoll4 / Array[? < Integer] -> unit'
|
129
|
+
def tgcoll4(gc); end
|
130
|
+
|
131
|
+
arg = Array.(Integer).new
|
132
|
+
|
133
|
+
tgcoll4(arg)
|
134
|
+
__CODE
|
135
|
+
|
136
|
+
result = language.check(code)
|
137
|
+
expect(result.ruby_type).to eq(NilClass)
|
138
|
+
end
|
139
|
+
|
140
|
+
it 'checks correctly: Array<Integer> :lt Array<? extends Integer> => [Integer, Integer] < [?, Integer] => TRUE' do
|
141
|
+
expect(arg1.compatible?(array_extends_integer, :lt)).to be_truthy
|
142
|
+
end
|
143
|
+
|
144
|
+
|
145
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<Integer> => [?, Integer] /< [Integer, Integer] => FALSE' do
|
146
|
+
code = <<__CODE
|
147
|
+
ts '#tgcoll5 / Array[Integer] -> unit'
|
148
|
+
def tgcoll5(gc); end
|
149
|
+
|
150
|
+
arg = Array.('[? < Integer]').new
|
151
|
+
tgcoll5(arg)
|
152
|
+
__CODE
|
153
|
+
expect {
|
154
|
+
language.check(code)
|
155
|
+
}.to raise_error(TypedRb::TypeCheckError)
|
156
|
+
end
|
157
|
+
|
158
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<Integer> => [?, Integer] /< [Integer, Integer] => FALSE' do
|
159
|
+
expect(array_extends_integer.compatible?(arg1, :lt)).to be_falsey
|
160
|
+
end
|
161
|
+
|
162
|
+
|
163
|
+
|
164
|
+
it 'checks correctly: Array<Numeric> :lt Array<? extends Integer> => [Numeric, Numeric] /< [?, Integer] => FALSE' do
|
165
|
+
code = <<__CODE
|
166
|
+
ts '#tgcoll6 / Array[? < Integer] -> unit'
|
167
|
+
def tgcoll6(gc); end
|
168
|
+
|
169
|
+
arg = Array.(Numeric).new
|
170
|
+
tgcoll6(arg)
|
171
|
+
__CODE
|
172
|
+
expect {
|
173
|
+
language.check(code)
|
174
|
+
}.to raise_error(TypedRb::TypeCheckError)
|
175
|
+
end
|
176
|
+
|
177
|
+
it 'checks correctly: Array<Numeric> :lt Array<? extends Integer> => [Numeric, Numeric] /< [?, Integer] => FALSE' do
|
178
|
+
expect(arg2.compatible?(array_extends_integer, :lt)).to be_falsey
|
179
|
+
end
|
180
|
+
|
181
|
+
|
182
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<Numeric> => [?, Integer] /< [Numeric, Numeric] => FALSE' do
|
183
|
+
code = <<__CODE
|
184
|
+
ts '#tgcoll7 / Array[Numeric] -> unit'
|
185
|
+
def tgcoll7(gc); end
|
186
|
+
|
187
|
+
arg = Array.('[? < Integer]').new
|
188
|
+
tgcoll7(arg)
|
189
|
+
__CODE
|
190
|
+
expect {
|
191
|
+
language.check(code)
|
192
|
+
}.to raise_error(TypedRb::TypeCheckError)
|
193
|
+
end
|
194
|
+
|
195
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<Numeric> => [?, Integer] /< [Numeric, Numeric] => FALSE' do
|
196
|
+
expect(array_extends_integer.compatible?(arg2, :lt)).to be_falsey
|
197
|
+
end
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<? extends Integer> => [?, Integer] < [?, Integer] => TRUE' do
|
202
|
+
code = <<__CODE
|
203
|
+
ts '#tgcoll9 / Array[? < Integer] -> unit'
|
204
|
+
def tgcoll9(gc); end
|
205
|
+
|
206
|
+
arg = Array.('[? < Integer]').new
|
207
|
+
|
208
|
+
tgcoll9(arg)
|
209
|
+
__CODE
|
210
|
+
|
211
|
+
result = language.check(code)
|
212
|
+
expect(result.ruby_type).to eq(NilClass)
|
213
|
+
end
|
214
|
+
|
215
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<? extends Integer> => [?, Integer] < [?, Integer] => TRUE' do
|
216
|
+
expect(array_extends_integer.compatible?(array_extends_integer, :lt)).to be_truthy
|
217
|
+
end
|
218
|
+
|
219
|
+
|
220
|
+
it 'checks correctly: Array<? extends Numeric> :lt Array<? extends Integer> => [?, Numeric] /< [?, Integer] => FALSE' do
|
221
|
+
code = <<__CODE
|
222
|
+
ts '#tgcoll10 / Array[? < Integer] -> unit'
|
223
|
+
def tgcoll10(gc); end
|
224
|
+
|
225
|
+
arg = Array.('[? < Numeric]').new
|
226
|
+
tgcoll10(arg)
|
227
|
+
__CODE
|
228
|
+
expect {
|
229
|
+
language.check(code)
|
230
|
+
}.to raise_error(TypedRb::TypeCheckError)
|
231
|
+
end
|
232
|
+
|
233
|
+
it 'checks correctly: Array<? extends Numeric> :lt Array<? extends Integer> => [?, Numeric] /< [?, Integer] => FALSE' do
|
234
|
+
expect(arg3.compatible?(array_extends_integer, :lt)).to be_falsey
|
235
|
+
end
|
236
|
+
|
237
|
+
|
238
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<? extends Numeric> => [?, Integer] < [?, Numeric] => TRUE' do
|
239
|
+
code = <<__CODE
|
240
|
+
ts '#tgcoll11 / Array[? < Numeric] -> unit'
|
241
|
+
def tgcoll11(gc); end
|
242
|
+
|
243
|
+
arg = Array.('[? < Integer]').new
|
244
|
+
|
245
|
+
tgcoll11(arg)
|
246
|
+
__CODE
|
247
|
+
|
248
|
+
result = language.check(code)
|
249
|
+
expect(result.ruby_type).to eq(NilClass)
|
250
|
+
end
|
251
|
+
|
252
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<? extends Numeric> => [?, Integer] < [?, Numeric] => TRUE' do
|
253
|
+
expect(array_extends_integer.compatible?(arg3, :lt)).to be_truthy
|
254
|
+
end
|
255
|
+
|
256
|
+
|
257
|
+
it 'checks correctly: Array<? super Integer> :lt Array<? extends Integer> => [Integer, ?] /< [?, Integer] => FALSE' do
|
258
|
+
code = <<__CODE
|
259
|
+
ts '#tgcoll12 / Array[? < Integer] -> unit'
|
260
|
+
def tgcoll12(gc); end
|
261
|
+
|
262
|
+
arg = Array.('[? > Integer]').new
|
263
|
+
tgcoll12(arg)
|
264
|
+
__CODE
|
265
|
+
expect {
|
266
|
+
language.check(code)
|
267
|
+
}.to raise_error(TypedRb::TypeCheckError)
|
268
|
+
end
|
269
|
+
|
270
|
+
it 'checks correctly: Array<? super Integer> :lt Array<? extends Integer> => [Integer, ?] /< [?, Integer] => FALSE' do
|
271
|
+
expect(arg4.compatible?(array_extends_integer, :lt)).to be_falsey
|
272
|
+
end
|
273
|
+
|
274
|
+
|
275
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<? super Integer> => [?, Integer] /< [Integer, ?] => FALSE' do
|
276
|
+
code = <<__CODE
|
277
|
+
ts '#tgcoll13 / Array[? > Integer] -> unit'
|
278
|
+
def tgcoll13(gc); end
|
279
|
+
|
280
|
+
arg = Array.('[? < Integer]').new
|
281
|
+
tgcoll13(arg)
|
282
|
+
__CODE
|
283
|
+
expect {
|
284
|
+
language.check(code)
|
285
|
+
}.to raise_error(TypedRb::TypeCheckError)
|
286
|
+
end
|
287
|
+
|
288
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<? super Integer> => [?, Integer] /< [Integer, ?] => FALSE' do
|
289
|
+
expect(array_extends_integer.compatible?(arg4, :lt)).to be_falsey
|
290
|
+
end
|
291
|
+
|
292
|
+
|
293
|
+
it 'checks correctly: Array<? super Numeric> :lt Array<? extends Integer> => [Numeric, ?] /< [?, Integer] => FALSE' do
|
294
|
+
code = <<__CODE
|
295
|
+
ts '#tgcoll14 / Array[? < Integer] -> unit'
|
296
|
+
def tgcoll14(gc); end
|
297
|
+
|
298
|
+
arg = Array.('[? > Numeric]').new
|
299
|
+
tgcoll14(arg)
|
300
|
+
__CODE
|
301
|
+
expect {
|
302
|
+
language.check(code)
|
303
|
+
}.to raise_error(TypedRb::TypeCheckError)
|
304
|
+
end
|
305
|
+
|
306
|
+
it 'checks correctly: Array<? super Numeric> :lt Array<? extends Integer> => [Numeric, ?] /< [?, Integer] => FALSE' do
|
307
|
+
expect(array_super_numeric.compatible?(array_extends_integer, :lt)).to be_falsey
|
308
|
+
end
|
309
|
+
|
310
|
+
|
311
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<? super Numeric> => [?, Integer] /< [Numeric, ?] => FALSE' do
|
312
|
+
code = <<__CODE
|
313
|
+
ts '#tgcoll15 / Array[? > Numeric] -> unit'
|
314
|
+
def tgcoll15(gc); end
|
315
|
+
|
316
|
+
arg = Array.('[? < Integer]').new
|
317
|
+
tgcoll15(arg)
|
318
|
+
__CODE
|
319
|
+
expect {
|
320
|
+
language.check(code)
|
321
|
+
}.to raise_error(TypedRb::TypeCheckError)
|
322
|
+
end
|
323
|
+
|
324
|
+
it 'checks correctly: Array<? extends Integer> :lt Array<? super Numeric> => [?, Integer] /< [Numeric, ?] => FALSE' do
|
325
|
+
expect(array_extends_integer.compatible?(array_super_numeric, :lt)).to be_falsey
|
326
|
+
end
|
327
|
+
end
|
328
|
+
|
329
|
+
context 'base of :lt comparison is a generic type with a lower_bound' do
|
330
|
+
|
331
|
+
it 'checks compatible? Array<?> :lt Array<? super Numeric> => [?, ?] /< [Numeric, ?] => FALSE' do
|
332
|
+
expect(arg0.compatible?(array_super_numeric, :lt)).to be_falsey
|
333
|
+
end
|
334
|
+
|
335
|
+
it 'checks compatible? Array<? super Numeric> :lt Array<?> => [Numeric, ?] /< [?, ?] => TRUE' do
|
336
|
+
expect(array_super_numeric.compatible?(arg0, :lt)).to be_truthy
|
337
|
+
end
|
338
|
+
|
339
|
+
it 'checks correctly: Array<Integer> :lt Array<? super Numeric> => [Integer, Integer] /< [Numeric, ?] => FALSE' do
|
340
|
+
expect(arg1.compatible?(array_super_numeric, :lt)).to be_falsey
|
341
|
+
end
|
342
|
+
|
343
|
+
it 'checks correctly: Array<? super Numeric> :lt Array<Integer> => [Numeric, ?] /< [Integer, Integer] => FALSE' do
|
344
|
+
expect(array_super_numeric.compatible?(arg1, :lt)).to be_falsey
|
345
|
+
end
|
346
|
+
|
347
|
+
it 'checks correctly: Array<Numeric> :lt Array<? super Numeric> => [Numeric, Numeric] < [Numeric, ?] => TRUE' do
|
348
|
+
expect(arg2.compatible?(array_super_numeric, :lt)).to be_truthy
|
349
|
+
end
|
350
|
+
|
351
|
+
it 'checks correctly: Array<? super Numeric> :lt Array<Numeric> => [Numeric, ?] < [Numeric, Numeric] => FALSE' do
|
352
|
+
expect(array_super_numeric.compatible?(arg2, :lt)).to be_falsey
|
353
|
+
end
|
354
|
+
|
355
|
+
it 'checks correctly: Array<? extends Numeric> :lt Array<? super Numeric> => [?, Numeric] /< [Numeric, ?] => FALSE' do
|
356
|
+
expect(arg3.compatible?(array_super_numeric, :lt)).to be_falsey
|
357
|
+
end
|
358
|
+
|
359
|
+
it 'checks correctly: Array<? super Numeric> :lt Array<? extends Numeric> => [Numeric,?] /< [?, Numeric] => FALSE' do
|
360
|
+
expect(array_super_numeric.compatible?(arg3, :lt)).to be_falsey
|
361
|
+
end
|
362
|
+
|
363
|
+
it 'checks correctly: Array<? super Integer> :lt Array<? super Numeric> => [Integer, ?] /< [Numeric, ?] => FALSE' do
|
364
|
+
expect(arg4.compatible?(array_super_numeric, :lt)).to be_falsey
|
365
|
+
end
|
366
|
+
|
367
|
+
it 'checks correctly: Array<? super Numeric> :lt Array<? super Integer> => [Numeric, ?] < [Integer, ?] => TRUE' do
|
368
|
+
expect(array_super_numeric.compatible?(arg4, :lt)).to be_truthy
|
369
|
+
end
|
370
|
+
|
371
|
+
it 'checks correctly: Array<? super Numeric> :lt Array<? super Numeric> => [Numeric, ?] < [Numeric, ?] => TRUE' do
|
372
|
+
expect(array_super_numeric.compatible?(array_super_numeric, :lt)).to be_truthy
|
373
|
+
end
|
374
|
+
|
375
|
+
it 'checks correctly: Array<? super Object> :lt Array<? super Numeric> => [Object, ?] < [Numeric, ?] => TRUE' do
|
376
|
+
expect(arg5.compatible?(array_super_numeric, :lt)).to be_truthy
|
377
|
+
end
|
378
|
+
|
379
|
+
it 'checks correctly: Array<? super Numeric> :lt Array<? super Object> => [Numeric, ?] /< [Object, ?] => FALSE' do
|
380
|
+
expect(array_super_numeric.compatible?(arg5, :lt)).to be_falsey
|
381
|
+
end
|
382
|
+
end
|
383
|
+
|
384
|
+
context 'base of :gt comparison is a generic type with an upper_bound' do
|
385
|
+
it 'checks correctly: Array<?> :gt Array<? extends Integer> => [?, ?] > [?, Integer] => TRUE' do
|
386
|
+
expect(arg0.compatible?(array_extends_integer, :gt)).to be_truthy
|
387
|
+
end
|
388
|
+
|
389
|
+
it 'checks correctly: Array<? extends Integer> :gt correctly: Array<?> => [?, Integer] /> [?, ?] => FALSE' do
|
390
|
+
expect(array_extends_integer.compatible?(arg0, :gt)).to be_falsey
|
391
|
+
end
|
392
|
+
|
393
|
+
it 'checks correctly: Array<Integer> :gt Array<? extends Integer> => [Integer, Integer] /> [?, Integer] => FALSE' do
|
394
|
+
expect(arg1.compatible?(array_extends_integer, :gt)).to be_falsey
|
395
|
+
end
|
396
|
+
|
397
|
+
it 'checks correctly: Array<? extends Integer> :gt Array<Integer> => [?, Integer] > [Integer, Integer] => TRUE' do
|
398
|
+
expect(array_extends_integer.compatible?(arg1, :gt)).to be_truthy
|
399
|
+
end
|
400
|
+
|
401
|
+
it 'checks correctly: Array<Numeric> :gt Array<? extends Integer> => [Numeric, Numeric] /> [?, Integer] => FALSE' do
|
402
|
+
expect(arg2.compatible?(array_extends_integer, :gt)).to be_falsey
|
403
|
+
end
|
404
|
+
|
405
|
+
it 'checks correctly: Array<? extends Integer> :gt Array<Numeric> => [?, Integer] /> [Numeric, Numeric] => FALSE' do
|
406
|
+
expect(array_extends_integer.compatible?(arg2, :gt)).to be_falsey
|
407
|
+
end
|
408
|
+
|
409
|
+
it 'checks correctly: Array<? extends Integer> :gt Array<? extends Integer> => [?, Integer] > [?, Integer] => TRUE' do
|
410
|
+
expect(array_extends_integer.compatible?(array_extends_integer, :gt)).to be_truthy
|
411
|
+
end
|
412
|
+
|
413
|
+
it 'checks correctly: Array<? extends Numeric> :gt Array<? extends Integer> => [?, Numeric] > [?, Integer] => TRUE' do
|
414
|
+
expect(arg3.compatible?(array_extends_integer, :gt)).to be_truthy
|
415
|
+
end
|
416
|
+
|
417
|
+
it 'checks correctly: Array<? extends Integer> :gt Array<? extends Numeric> => [?, Integer] > [?, Numeric] => FALSE' do
|
418
|
+
expect(array_extends_integer.compatible?(arg3, :gt)).to be_falsey
|
419
|
+
end
|
420
|
+
|
421
|
+
it 'checks correctly: Array<? super Integer> :gt Array<? extends Integer> => [Integer, ?] /> [?, Integer] => FALSE' do
|
422
|
+
expect(arg4.compatible?(array_extends_integer, :gt)).to be_falsey
|
423
|
+
end
|
424
|
+
|
425
|
+
it 'checks correctly: Array<? extends Integer> :gt Array<? super Integer> => [?, Integer] /> [Integer, ?] => FALSE' do
|
426
|
+
expect(array_extends_integer.compatible?(arg4, :gt)).to be_falsey
|
427
|
+
end
|
428
|
+
|
429
|
+
it 'checks correctly: Array<? super Numeric> :gt Array<? extends Integer> => [Numeric, ?] /> [?, Integer] => FALSE' do
|
430
|
+
expect(array_super_numeric.compatible?(array_extends_integer, :gt)).to be_falsey
|
431
|
+
end
|
432
|
+
|
433
|
+
it 'checks correctly: Array<? extends Integer> :gt Array<? super Numeric> => [?, Integer] /> [Numeric, ?] => FALSE' do
|
434
|
+
expect(array_extends_integer.compatible?(array_super_numeric, :gt)).to be_falsey
|
435
|
+
end
|
436
|
+
end
|
437
|
+
|
438
|
+
context 'base of :gt comparison is a generic type with a lower_bound' do
|
439
|
+
|
440
|
+
it 'checks compatible? Array<?> :gt Array<? super Numeric> => [?, ?] > [Numeric, ?] => TRUE' do
|
441
|
+
expect(arg0.compatible?(array_super_numeric, :gt)).to be_truthy
|
442
|
+
end
|
443
|
+
|
444
|
+
it 'checks compatible? Array<? super Numeric> :gt Array<?> => [Numeric, ?] /> [?, ?] => FALSE' do
|
445
|
+
expect(array_super_numeric.compatible?(arg0, :gt)).to be_falsey
|
446
|
+
end
|
447
|
+
|
448
|
+
it 'checks correctly: Array<Integer> :gt Array<? super Numeric> => [Integer, Integer] /> [Numeric, ?] => FALSE' do
|
449
|
+
expect(arg1.compatible?(array_super_numeric, :gt)).to be_falsey
|
450
|
+
end
|
451
|
+
|
452
|
+
it 'checks correctly: Array<? super Numeric> :gt Array<Integer> => [Numeric, ?] /> [Integer, Integer] => FALSE' do
|
453
|
+
expect(array_super_numeric.compatible?(arg1, :gt)).to be_falsey
|
454
|
+
end
|
455
|
+
|
456
|
+
it 'checks correctly: Array<Numeric> :gt Array<? super Numeric> => [Numeric, Numeric] /> [Numeric, ?] => FALSE' do
|
457
|
+
expect(arg2.compatible?(array_super_numeric, :gt)).to be_falsey
|
458
|
+
end
|
459
|
+
|
460
|
+
it 'checks correctly: Array<? super Numeric> :gt Array<Numeric> => [Numeric, ?] > [Numeric, Numeric] => TRUE' do
|
461
|
+
expect(array_super_numeric.compatible?(arg2, :gt)).to be_truthy
|
462
|
+
end
|
463
|
+
|
464
|
+
it 'checks correctly: Array<? extends Numeric> :gt Array<? super Numeric> => [?, Numeric] /> [Numeric, ?] => FALSE' do
|
465
|
+
expect(arg3.compatible?(array_super_numeric, :gt)).to be_falsey
|
466
|
+
end
|
467
|
+
|
468
|
+
it 'checks correctly: Array<? super Numeric> :gt Array<? extends Numeric> => [Numeric,?] /> [?, Numeric] => FALSE' do
|
469
|
+
expect(array_super_numeric.compatible?(arg3, :gt)).to be_falsey
|
470
|
+
end
|
471
|
+
|
472
|
+
it 'checks correctly: Array<? super Integer> :gt Array<? super Numeric> => [Integer, ?] > [Numeric, ?] => TRUE' do
|
473
|
+
expect(arg4.compatible?(array_super_numeric, :gt)).to be_truthy
|
474
|
+
end
|
475
|
+
|
476
|
+
it 'checks correctly: Array<? super Numeric> :gt Array<? super Integer> => [Numeric, ?] > [Integer, ?] => FALSE' do
|
477
|
+
expect(array_super_numeric.compatible?(arg4, :gt)).to be_falsey
|
478
|
+
end
|
479
|
+
|
480
|
+
it 'checks correctly: Array<? super Numeric> :gt Array<? super Numeric> => [Numeric, ?] > [Numeric, ?] => TRUE' do
|
481
|
+
expect(array_super_numeric.compatible?(array_super_numeric, :gt)).to be_truthy
|
482
|
+
end
|
483
|
+
|
484
|
+
it 'checks correctly: Array<? super Object> :gt Array<? super Numeric> => [Object, ?] /> [Numeric, ?] => FALSE' do
|
485
|
+
expect(arg5.compatible?(array_super_numeric, :gt)).to be_falsey
|
486
|
+
end
|
487
|
+
|
488
|
+
it 'checks correctly: Array<? super Numeric> :gt Array<? super Object> => [Numeric, ?] > [Object, ?] => TRUE' do
|
489
|
+
expect(array_super_numeric.compatible?(arg5, :gt)).to be_truthy
|
490
|
+
end
|
491
|
+
end
|
492
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
require_relative '../../../spec_helper'
|
2
|
+
|
3
|
+
describe TypedRb::Types::Polymorphism::TypeVariableRegister do
|
4
|
+
describe '#initialize' do
|
5
|
+
it 'should be possible to create a register without parent' do
|
6
|
+
subject = described_class.new(nil,:top_level)
|
7
|
+
expect(subject.parent).to be_nil
|
8
|
+
end
|
9
|
+
|
10
|
+
it 'should be possible to create a nested register' do
|
11
|
+
parent = described_class.new(nil,:top_level)
|
12
|
+
child = described_class.new(parent, :lambda)
|
13
|
+
expect(parent.children).to include(child)
|
14
|
+
expect(child.parent).to eq(parent)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#type_variable_for' do
|
19
|
+
it 'finds a type variable for a single register' do
|
20
|
+
register = described_class.new(nil,:top_level)
|
21
|
+
type_variable_one = register.type_variable_for(:instance_variable, '@a', String.ancestors)
|
22
|
+
type_variable_two = register.type_variable_for(:instance_variable, '@a', String.ancestors)
|
23
|
+
expect(type_variable_one).to eq(type_variable_two)
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'finds a type_variable in a nested register' do
|
27
|
+
parent = described_class.new(nil,:top_level)
|
28
|
+
child = described_class.new(parent, :lambda)
|
29
|
+
type_variable_one = parent.type_variable_for(:instance_variable, '@a', String.ancestors)
|
30
|
+
type_variable_two = child.type_variable_for(:instance_variable, '@a', String.ancestors)
|
31
|
+
expect(type_variable_one).to eq(type_variable_two)
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'finds a type variable in the hierarchy' do
|
35
|
+
parent = described_class.new(nil,:top_level)
|
36
|
+
child = described_class.new(parent, :lambda)
|
37
|
+
type_variable_one = parent.type_variable_for(:instance_variable, '@a', Object.ancestors)
|
38
|
+
type_variable_two = child.type_variable_for(:instance_variable, '@a', String.ancestors)
|
39
|
+
expect(type_variable_one).to eq(type_variable_two)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
describe '#type_variable_for_message' do
|
44
|
+
it 'finds a type variable for a single register' do
|
45
|
+
register = described_class.new(nil,:top_level)
|
46
|
+
type_variable_one = register.type_variable_for_message('x', 'msg')
|
47
|
+
type_variable_two = register.type_variable_for_message('x', 'msg')
|
48
|
+
expect(type_variable_one).to eq(type_variable_two)
|
49
|
+
end
|
50
|
+
|
51
|
+
it 'finds a type_variable in a nested register' do
|
52
|
+
parent = described_class.new(nil,:top_level)
|
53
|
+
child = described_class.new(parent, :lambda)
|
54
|
+
type_variable_one = parent.type_variable_for_message('x', 'msg')
|
55
|
+
type_variable_two = child.type_variable_for_message('x', 'msg')
|
56
|
+
expect(type_variable_one).to eq(type_variable_two)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#apply_type' do
|
61
|
+
it 'applies a type to a send constraint' do
|
62
|
+
TypedRb::Types::TypingContext.type_variables_register = described_class.new(nil,:top_level)
|
63
|
+
register = TypedRb::Types::TypingContext.type_variables_register
|
64
|
+
xvar = register.type_variable_for_abstraction(:lambda,'x',top_level_typing_context)
|
65
|
+
ret_type = xvar.add_message_constraint('id', [xvar])
|
66
|
+
|
67
|
+
renamed_x = tyvariable('renamed_x')
|
68
|
+
renamed_return_id_x = tyvariable('renamed_ret_id_x')
|
69
|
+
renamed_register = register.send(:apply_type,nil, {xvar.variable => renamed_x, ret_type.variable => renamed_return_id_x})
|
70
|
+
|
71
|
+
constraints = renamed_register.all_constraints
|
72
|
+
expect(constraints.size).to eq(1)
|
73
|
+
variable, type, info = constraints.first
|
74
|
+
expect(type).to eq :send
|
75
|
+
expect(variable).to eq renamed_x
|
76
|
+
expect(info[:return]).to eq renamed_return_id_x
|
77
|
+
expect(info[:args].size).to eq 1
|
78
|
+
expect(info[:args].first).to eq renamed_x
|
79
|
+
|
80
|
+
constraints = register.all_constraints
|
81
|
+
expect(constraints.size).to eq(1)
|
82
|
+
variable, type, info = constraints.first
|
83
|
+
expect(type).to eq :send
|
84
|
+
expect(variable).to eq xvar
|
85
|
+
expect(info[:return]).to eq ret_type
|
86
|
+
expect(info[:args].size).to eq 1
|
87
|
+
expect(info[:args].first).to eq xvar
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'creates a new register with the right subsitutions in the type_variable' do
|
91
|
+
TypedRb::Types::TypingContext.type_variables_register = described_class.new(nil,:top_level)
|
92
|
+
parent = TypedRb::Types::TypingContext.type_variables_register
|
93
|
+
ata = parent.type_variable_for(:instance_variable, '@a', String.ancestors)
|
94
|
+
argy = parent.type_variable_for_abstraction(:lambda, 'y', top_level_typing_context)
|
95
|
+
|
96
|
+
child = described_class.new(parent, :lambda)
|
97
|
+
TypedRb::Types::TypingContext.type_variables_register = child
|
98
|
+
|
99
|
+
argx = child.type_variable_for_abstraction(:lambda, 'x', top_level_typing_context)
|
100
|
+
|
101
|
+
argx.compatible?(ata)
|
102
|
+
argy.compatible?(argx)
|
103
|
+
|
104
|
+
substitution = tyvariable('substitution')
|
105
|
+
result = parent.send(:apply_type, nil, argx.variable => substitution)
|
106
|
+
constraints = result.all_constraints
|
107
|
+
var, type, info = constraints[0]
|
108
|
+
expect(var).to eq(argy)
|
109
|
+
expect(type).to eq(:lt)
|
110
|
+
expect(info).to eq(substitution)
|
111
|
+
var, type, info = constraints[1]
|
112
|
+
expect(var).to eq(substitution)
|
113
|
+
expect(type).to eq(:lt)
|
114
|
+
expect(info).to eq(ata)
|
115
|
+
|
116
|
+
TypedRb::Types::TypingContext.type_variables_register = parent
|
117
|
+
constraints = TypedRb::Types::TypingContext.all_constraints
|
118
|
+
var, type, info = constraints[0]
|
119
|
+
expect(var).to eq(argy)
|
120
|
+
expect(type).to eq(:lt)
|
121
|
+
expect(info).to eq(argx)
|
122
|
+
var, type, info = constraints[1]
|
123
|
+
expect(var).to eq(argx)
|
124
|
+
expect(type).to eq(:lt)
|
125
|
+
expect(info).to eq(ata)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|