rtype-legacy 0.0.4-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,971 @@
1
+ require_relative 'spec_helper'
2
+
3
+ describe Rtype::Legacy do
4
+ let(:klass) do
5
+ Class.new do
6
+ attr_accessor :value
7
+
8
+ def initialize
9
+ @value = 123
10
+ end
11
+
12
+ def return_arg(obj)
13
+ obj
14
+ end
15
+
16
+ def two_args(a, b)
17
+ end
18
+
19
+ def three_args(a, b, c)
20
+ end
21
+
22
+ def return_nil(obj)
23
+ nil
24
+ end
25
+
26
+ def sum(a, b)
27
+ a + b
28
+ end
29
+
30
+ public
31
+ def public_func
32
+ end
33
+
34
+ protected
35
+ def protected_func
36
+ end
37
+
38
+ private
39
+ def private_func
40
+ end
41
+ end
42
+ end
43
+
44
+ let(:instance) do
45
+ klass.new
46
+ end
47
+
48
+ describe 'Kernel#rtype' do
49
+ context "with annotation mode" do
50
+ it "works with instance method" do
51
+ class AnnotationTest
52
+ rtype [String] => Any
53
+ def test(str)
54
+ end
55
+ end
56
+ expect {
57
+ AnnotationTest.new.test(123)
58
+ }.to raise_error Rtype::ArgumentTypeError
59
+ end
60
+ it "works with class method" do
61
+ class AnnotationTest
62
+ rtype [String] => Any
63
+ def self.class_method_test(str)
64
+ end
65
+ end
66
+ expect {
67
+ AnnotationTest::class_method_test(123)
68
+ }.to raise_error Rtype::ArgumentTypeError
69
+ end
70
+ end
71
+
72
+ context "outside of module" do
73
+ it "doesn't work" do
74
+ expect {
75
+ rtype :test_args, [String] => Any
76
+ def test_args(str)
77
+ end
78
+ }.to raise_error RuntimeError
79
+
80
+ expect {
81
+ rtype [String] => Any
82
+ def test_args2(str)
83
+ end
84
+ }.to raise_error RuntimeError
85
+ end
86
+ end
87
+
88
+ it "in module" do
89
+ class TestClass
90
+ rtype :test_args, [String] => Any
91
+ def test_args(str)
92
+ end
93
+ end
94
+
95
+ expect {TestClass.new.test_args 123}.to raise_error Rtype::ArgumentTypeError
96
+
97
+ class TestClass
98
+ rtype :test_return, [] => String
99
+ def test_return
100
+ 369
101
+ end
102
+ end
103
+
104
+ expect {TestClass.new.test_return}.to raise_error Rtype::ReturnTypeError
105
+ end
106
+ end
107
+
108
+ it "Kernel#rtype_self" do
109
+ class TestClass
110
+ rtype_self :static_test_args, [String] => Any
111
+ def self.static_test_args(str)
112
+ end
113
+ end
114
+
115
+ expect {TestClass::static_test_args 123}.to raise_error Rtype::ArgumentTypeError
116
+
117
+ class TestClass
118
+ rtype_self :static_test_return, [] => String
119
+ def self.static_test_return
120
+ 369
121
+ end
122
+ end
123
+
124
+ expect {TestClass::static_test_return}.to raise_error Rtype::ReturnTypeError
125
+ end
126
+
127
+ it 'Kernel#rtype_accessor' do
128
+ class TestClass
129
+ rtype_accessor :value, :value2, String
130
+
131
+ def initialize
132
+ @value = 123
133
+ @value2 = 123
134
+ end
135
+ end
136
+ expect {TestClass.new.value = 123}.to raise_error Rtype::ArgumentTypeError
137
+ expect {TestClass.new.value}.to raise_error Rtype::ReturnTypeError
138
+ expect {TestClass.new.value2 = 123}.to raise_error Rtype::ArgumentTypeError
139
+ expect {TestClass.new.value2}.to raise_error Rtype::ReturnTypeError
140
+ end
141
+
142
+ it 'Kernel#rtype_accessor_self' do
143
+ class TestClass
144
+ @@value = 123
145
+ @@value2 = 123
146
+
147
+ rtype_accessor_self :value, :value2, String
148
+ end
149
+ expect {TestClass::value = 123}.to raise_error Rtype::ArgumentTypeError
150
+ expect {TestClass::value}.to raise_error Rtype::ReturnTypeError
151
+ expect {TestClass::value2 = 123}.to raise_error Rtype::ArgumentTypeError
152
+ expect {TestClass::value2}.to raise_error Rtype::ReturnTypeError
153
+ end
154
+
155
+ it 'Kernel#rtype_reader' do
156
+ class ReaderTestClass
157
+ rtype_reader :value, :value2, String
158
+
159
+ def initialize
160
+ @value = 123
161
+ @value2 = 123
162
+ end
163
+ end
164
+ expect {ReaderTestClass.new.value}.to raise_error Rtype::ReturnTypeError
165
+ expect {ReaderTestClass.new.value2}.to raise_error Rtype::ReturnTypeError
166
+ end
167
+
168
+ it 'Kernel#rtype_reader_self' do
169
+ class ReaderTestClass
170
+ @@value = 123
171
+ @@value2 = 123
172
+ rtype_reader_self :value, :value2, String
173
+ end
174
+ expect {ReaderTestClass::value}.to raise_error Rtype::ReturnTypeError
175
+ expect {ReaderTestClass::value2}.to raise_error Rtype::ReturnTypeError
176
+ end
177
+
178
+ it 'Kernel#rtype_writer' do
179
+ class WriterTestClass
180
+ rtype_writer :value, :value2, String
181
+
182
+ def initialize
183
+ @value = 123
184
+ @value2 = 123
185
+ end
186
+ end
187
+ expect {WriterTestClass.new.value = 123}.to raise_error Rtype::ArgumentTypeError
188
+ expect {WriterTestClass.new.value2 = 123}.to raise_error Rtype::ArgumentTypeError
189
+ end
190
+
191
+ it 'Kernel#rtype_writer_self' do
192
+ class WriterTestClass
193
+ @@value = 123
194
+ @@value2 = 123
195
+ rtype_writer_self :value, :value2, String
196
+ end
197
+ expect {WriterTestClass::value = 123}.to raise_error Rtype::ArgumentTypeError
198
+ expect {WriterTestClass::value2 = 123}.to raise_error Rtype::ArgumentTypeError
199
+ end
200
+
201
+ it 'Kernel#float_accessor' do
202
+ class FloatAccessorTestClass
203
+ float_accessor :float, :int
204
+
205
+ def initialize
206
+ @float = 10.0
207
+ @int = 10
208
+ end
209
+ end
210
+
211
+ float_accessor_test = FloatAccessorTestClass.new
212
+
213
+ float_accessor_test.float
214
+ expect {float_accessor_test.int}.to raise_error Rtype::ReturnTypeError
215
+ float_accessor_test.float = 5.0
216
+ float_accessor_test.float = 5
217
+ expect(float_accessor_test.float).to eql(5.0) # be(expected) => passes if actual.eql?(expected)
218
+ expect(float_accessor_test.float).not_to eql(5)
219
+ end
220
+
221
+ it 'Kernel#bool_accessor' do
222
+ class BoolAccessorTestClass
223
+ bool_accessor :state, :invalid_var
224
+
225
+ def initialize
226
+ @state = false
227
+ @invalid_var = 123
228
+ end
229
+ end
230
+
231
+ bool_accessor_test = BoolAccessorTestClass.new
232
+
233
+ bool_accessor_test.state?
234
+ expect {bool_accessor_test.state}.to raise_error NoMethodError
235
+ expect(bool_accessor_test.state?).to eql(false)
236
+ bool_accessor_test.state = true
237
+ expect(bool_accessor_test.state?).to eql(true)
238
+ expect {bool_accessor_test.state = 123}.to raise_error Rtype::ArgumentTypeError
239
+ expect {bool_accessor_test.invalid_var?}.to raise_error Rtype::ReturnTypeError
240
+ end
241
+
242
+ describe 'Test type behaviors' do
243
+ describe 'Module' do
244
+ it "is right" do
245
+ klass.send :rtype, :return_arg, [String] => Any
246
+ instance.return_arg("This is a string!")
247
+ end
248
+ it "is wrong" do
249
+ klass.send :rtype, :return_arg, [String] => Any
250
+ expect {instance.return_arg(123)}.to raise_error Rtype::ArgumentTypeError
251
+ end
252
+ it "is wrong result" do
253
+ klass.send :rtype, :return_nil, [Any] => String
254
+ expect {instance.return_nil("This is a string!")}.to raise_error Rtype::ReturnTypeError
255
+ end
256
+ end
257
+
258
+ describe 'Symbol' do
259
+ it "is right" do
260
+ klass.send :rtype, :return_arg, [:to_i] => Any
261
+ instance.return_arg(123)
262
+ end
263
+ it "is wrong args" do
264
+ klass.send :rtype, :return_arg, [:to_i] => Any
265
+ expect {instance.return_arg(true)}.to raise_error Rtype::ArgumentTypeError
266
+ end
267
+ it "is wrong result" do
268
+ klass.send :rtype, :return_nil, [Any] => :odd?
269
+ expect {instance.return_nil(123)}.to raise_error Rtype::ReturnTypeError
270
+ end
271
+ end
272
+
273
+ describe 'Regexp' do
274
+ it "is right" do
275
+ klass.send :rtype, :return_arg, [/cuba/] => Any
276
+ instance.return_arg("cuba")
277
+ end
278
+ it "is wrong args" do
279
+ klass.send :rtype, :return_arg, [/cuba/] => Any
280
+ expect {instance.return_arg("brazil")}.to raise_error Rtype::ArgumentTypeError
281
+ end
282
+ it "is wrong result" do
283
+ klass.send :rtype, :return_nil, [Any] => /cuba/
284
+ expect {instance.return_nil("cuba")}.to raise_error Rtype::ReturnTypeError
285
+ end
286
+ end
287
+
288
+ describe 'Range' do
289
+ it "is right" do
290
+ klass.send :rtype, :return_arg, [1..10] => Any
291
+ instance.return_arg(5)
292
+ end
293
+ it "is wrong args" do
294
+ klass.send :rtype, :return_arg, [1..10] => Any
295
+ expect {
296
+ instance.return_arg(1001)
297
+ }.to raise_error Rtype::ArgumentTypeError
298
+ end
299
+ it "is wrong result" do
300
+ klass.send :rtype, :return_nil, [Any] => 1..10
301
+ expect {
302
+ instance.return_nil(5)
303
+ }.to raise_error Rtype::ReturnTypeError
304
+ end
305
+ end
306
+
307
+ describe 'Array' do
308
+ it "is right" do
309
+ klass.send :rtype, :return_arg, [[:to_i]] => Any
310
+ instance.return_arg(123)
311
+
312
+ klass.send :rtype, :return_arg, [[String, Integer]] => Any
313
+ instance.return_arg("str")
314
+ instance.return_arg(123)
315
+
316
+ klass.send :rtype, :return_arg, [] => [String, Integer]
317
+ instance.return_arg("str")
318
+ instance.return_arg(123)
319
+ end
320
+ it "is wrong args" do
321
+ klass.send :rtype, :return_arg, [[String, Integer]] => Any
322
+ expect {
323
+ instance.return_arg(nil)
324
+ }.to raise_error Rtype::ArgumentTypeError
325
+
326
+ klass.send :rtype, :return_arg, [[String]] => Any
327
+ expect {
328
+ instance.return_arg(123)
329
+ }.to raise_error Rtype::ArgumentTypeError
330
+ end
331
+ it "is wrong result" do
332
+ klass.send :rtype, :return_arg, [Any] => [String, Integer]
333
+ expect {instance.return_arg(true)}.to raise_error Rtype::ReturnTypeError
334
+ end
335
+ end
336
+
337
+ describe 'Hash' do
338
+ it "is right" do
339
+ klass.send :rtype, :return_arg, [{k: Integer}, {}] => Any
340
+ instance.return_arg({k: 123})
341
+ end
342
+ it "is wrong args" do
343
+ klass.send :rtype, :return_arg, [{k: Integer}, {}] => Any
344
+ expect {
345
+ instance.return_arg({k: "str"})
346
+ }.to raise_error Rtype::ArgumentTypeError
347
+ end
348
+ it "is wrong result" do
349
+ klass.send :rtype, :return_arg, [Any] => {k: Integer}
350
+ expect { instance.return_arg({k: "str"}) }.to raise_error Rtype::ReturnTypeError
351
+ end
352
+ end
353
+
354
+ describe 'Proc' do
355
+ it "is right" do
356
+ klass.send :rtype, :return_arg, [->(arg){!arg.nil?}] => Any
357
+ instance.return_arg(123)
358
+ end
359
+ it "is wrong args" do
360
+ klass.send :rtype, :return_arg, [->(arg){!arg.nil?}] => Any
361
+ expect {instance.return_arg(nil)}.to raise_error Rtype::ArgumentTypeError
362
+ end
363
+ it "is wrong result" do
364
+ klass.send :rtype, :return_nil, [Any] => ->(arg){!arg.nil?}
365
+ expect {instance.return_nil(123)}.to raise_error Rtype::ReturnTypeError
366
+ end
367
+ end
368
+
369
+ describe 'true' do
370
+ it "is right" do
371
+ klass.send :rtype, :return_arg, [true] => Any
372
+ instance.return_arg(true)
373
+ instance.return_arg(123)
374
+ end
375
+ it "is wrong args" do
376
+ klass.send :rtype, :return_arg, [true] => Any
377
+ expect {instance.return_arg(false)}.to raise_error Rtype::ArgumentTypeError
378
+ expect {instance.return_arg(nil)}.to raise_error Rtype::ArgumentTypeError
379
+ end
380
+ it "is wrong result" do
381
+ klass.send :rtype, :return_arg, [Any] => true
382
+ expect {instance.return_arg(false)}.to raise_error Rtype::ReturnTypeError
383
+ expect {instance.return_arg(nil)}.to raise_error Rtype::ReturnTypeError
384
+ end
385
+ end
386
+
387
+ describe 'false' do
388
+ it "is right" do
389
+ klass.send :rtype, :return_arg, [false] => Any
390
+ instance.return_arg(false)
391
+ instance.return_arg(nil)
392
+ end
393
+ it "is wrong args" do
394
+ klass.send :rtype, :return_arg, [false] => Any
395
+ expect {instance.return_arg(true)}.to raise_error Rtype::ArgumentTypeError
396
+ expect {instance.return_arg(123)}.to raise_error Rtype::ArgumentTypeError
397
+ end
398
+ it "is wrong result" do
399
+ klass.send :rtype, :return_arg, [Any] => false
400
+ expect {instance.return_arg(true)}.to raise_error Rtype::ReturnTypeError
401
+ expect {instance.return_arg(123)}.to raise_error Rtype::ReturnTypeError
402
+ end
403
+ end
404
+
405
+ describe 'nil' do
406
+ it "for return" do
407
+ klass.send :rtype, :return_nil, [] => nil
408
+ instance.return_nil(123)
409
+
410
+ klass.send :rtype, :return_arg, [] => nil
411
+ expect {instance.return_arg(123)}.to raise_error Rtype::ReturnTypeError
412
+ end
413
+ it "for args" do
414
+ klass.send :rtype, :return_arg, [nil] => Any
415
+ instance.return_arg(nil)
416
+ expect {
417
+ instance.return_arg(123)
418
+ }.to raise_error Rtype::ArgumentTypeError
419
+ end
420
+ end
421
+
422
+ describe 'Special type behaviors' do
423
+ describe 'Rtype::Behavior::And' do
424
+ it 'module singleton method' do
425
+ klass.send :rtype, :return_nil, [Rtype::and(:to_i, :chars)] => nil
426
+ instance.return_nil("Hello")
427
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
428
+ end
429
+
430
+ it 'class singleton [] method' do
431
+ klass.send :rtype, :return_nil, [ Rtype::Behavior::And[:to_i, :chars] ] => nil
432
+ instance.return_nil("Hello")
433
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
434
+ end
435
+
436
+ it 'core extension method' do
437
+ klass.send :rtype, :return_nil, [ :to_i.and(:chars) ] => nil
438
+ instance.return_nil("Hello")
439
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
440
+ end
441
+ end
442
+
443
+ describe 'Rtype::Behavior::Nilable' do
444
+ it 'module singleton method' do
445
+ klass.send :rtype, :return_nil, [Rtype::nilable(Integer)] => nil
446
+ instance.return_nil(nil)
447
+ instance.return_nil(123)
448
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
449
+ end
450
+
451
+ it 'class singleton [] method' do
452
+ klass.send :rtype, :return_nil, [ Rtype::Behavior::Nilable[Integer] ] => nil
453
+ instance.return_nil(nil)
454
+ instance.return_nil(123)
455
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
456
+ end
457
+
458
+ it 'core extension method :nilable' do
459
+ klass.send :rtype, :return_nil, [Integer.nilable] => nil
460
+ instance.return_nil(nil)
461
+ instance.return_nil(123)
462
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
463
+ end
464
+
465
+ it 'core extension method :or_nil' do
466
+ klass.send :rtype, :return_nil, [Integer.or_nil] => nil
467
+ instance.return_nil(nil)
468
+ instance.return_nil(123)
469
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
470
+ end
471
+ end
472
+
473
+ describe 'Rtype::Behavior::Not' do
474
+ it 'module singleton method' do
475
+ klass.send :rtype, :return_nil, [Rtype::not(String)] => nil
476
+ instance.return_nil(123)
477
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
478
+ end
479
+
480
+ it 'class singleton [] method' do
481
+ klass.send :rtype, :return_nil, [ Rtype::Behavior::Not[String] ] => nil
482
+ instance.return_nil(123)
483
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
484
+ end
485
+
486
+ it 'core extension method' do
487
+ klass.send :rtype, :return_nil, [ String.not ] => nil
488
+ instance.return_nil(123)
489
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
490
+ end
491
+ end
492
+
493
+ describe 'Rtype::Behavior::Xor' do
494
+ it 'module singleton method' do
495
+ klass.send :rtype, :return_nil, [Rtype::xor(:to_i, String)] => nil
496
+ instance.return_nil(123)
497
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
498
+ end
499
+
500
+ it 'class singleton [] method' do
501
+ klass.send :rtype, :return_nil, [ Rtype::Behavior::Xor[:to_i, String] ] => nil
502
+ instance.return_nil(123)
503
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
504
+ end
505
+
506
+ it 'core extension method' do
507
+ klass.send :rtype, :return_nil, [ :to_i.xor(String) ] => nil
508
+ instance.return_nil(123)
509
+ expect {instance.return_nil("abc")}.to raise_error Rtype::ArgumentTypeError
510
+ end
511
+ end
512
+
513
+ describe 'Rtype::Behavior::TypedArray' do
514
+ it 'class singleton [] method' do
515
+ klass.send :rtype, :return_nil, [ Rtype::Behavior::TypedArray[Integer] ] => nil
516
+ instance.return_nil([123])
517
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
518
+ expect {instance.return_nil([1.0])}.to raise_error Rtype::ArgumentTypeError
519
+ end
520
+
521
+ it 'core extension method (Array::of)' do
522
+ klass.send :rtype, :return_nil, [ Array.of(Integer) ] => nil
523
+ instance.return_nil([123])
524
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
525
+ expect {instance.return_nil([1.0])}.to raise_error Rtype::ArgumentTypeError
526
+ end
527
+
528
+ it 'complicated type sig' do
529
+ klass.send :rtype, :return_nil, [ Array.of(:to_i.and(:chars)) ] => nil
530
+ instance.return_nil(["hello"])
531
+ expect {instance.return_nil("hello")}.to raise_error Rtype::ArgumentTypeError
532
+ expect {instance.return_nil([123])}.to raise_error Rtype::ArgumentTypeError
533
+ end
534
+
535
+ it 'allows empty array' do
536
+ klass.send :rtype, :return_nil, [ Array.of(Integer) ] => nil
537
+ instance.return_nil([])
538
+ end
539
+ end
540
+
541
+ describe 'Rtype::Behavior::TypedSet' do
542
+ it 'class singleton [] method' do
543
+ klass.send :rtype, :return_nil, [ Rtype::Behavior::TypedSet[Integer] ] => nil
544
+ instance.return_nil( Set.new([123]) )
545
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
546
+ expect { instance.return_nil(Set.new([1.0])) }.to raise_error Rtype::ArgumentTypeError
547
+ end
548
+
549
+ it 'core extension method (Set::of)' do
550
+ klass.send :rtype, :return_nil, [ Set.of(Integer) ] => nil
551
+ instance.return_nil( Set.new([123]) )
552
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
553
+ expect { instance.return_nil(Set.new([1.0])) }.to raise_error Rtype::ArgumentTypeError
554
+ end
555
+
556
+ it 'complicated type sig' do
557
+ klass.send :rtype, :return_nil, [ Set.of(:to_i.and(:chars)) ] => nil
558
+ instance.return_nil( Set.new(["hello"]) )
559
+ expect {instance.return_nil("hello")}.to raise_error Rtype::ArgumentTypeError
560
+ expect { instance.return_nil(Set.new([123])) }.to raise_error Rtype::ArgumentTypeError
561
+ end
562
+
563
+ it 'allows empty set' do
564
+ klass.send :rtype, :return_nil, [ Set.of(Integer) ] => nil
565
+ instance.return_nil(Set.new)
566
+ end
567
+ end
568
+
569
+ describe 'Rtype::Behavior::TypedHash' do
570
+ it 'class singleton [] method' do
571
+ klass.send :rtype, :return_nil, [ Rtype::Behavior::TypedHash[Symbol, Integer] ] => nil
572
+ instance.return_nil( {key: 123} )
573
+ expect {instance.return_nil(:key)}.to raise_error Rtype::ArgumentTypeError
574
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
575
+ expect {instance.return_nil( {"key" => 123} )}.to raise_error Rtype::ArgumentTypeError
576
+ end
577
+
578
+ it 'core extension method (Hash::of)' do
579
+ klass.send :rtype, :return_nil, [ Hash.of(Symbol, Integer) ] => nil
580
+ instance.return_nil( {key: 123} )
581
+ expect {instance.return_nil(:key)}.to raise_error Rtype::ArgumentTypeError
582
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
583
+ expect {instance.return_nil( {"key" => 123} )}.to raise_error Rtype::ArgumentTypeError
584
+ end
585
+
586
+ it 'complicated type sig' do
587
+ klass.send :rtype, :return_nil, [ Hash.of(:to_i.and(:chars), :to_i.and(:chars)) ] => nil
588
+ instance.return_nil( {"key" => "val"} )
589
+ expect {instance.return_nil("hello")}.to raise_error Rtype::ArgumentTypeError
590
+ expect {instance.return_nil( {key: "val"} )}.to raise_error Rtype::ArgumentTypeError
591
+ expect {instance.return_nil( {"key" => :val} )}.to raise_error Rtype::ArgumentTypeError
592
+ end
593
+
594
+ it 'allows empty hash' do
595
+ klass.send :rtype, :return_nil, [ Hash.of(Symbol, Integer) ] => nil
596
+ instance.return_nil({})
597
+ end
598
+ end
599
+
600
+ describe 'Numeric check' do
601
+ it 'Num (Numeric)' do
602
+ klass.send :rtype, :return_nil, [Num >= 0] => Any
603
+ expect { instance.return_nil("hello") }.to raise_error Rtype::ArgumentTypeError
604
+ expect { instance.return_nil(-1) }.to raise_error Rtype::ArgumentTypeError
605
+ instance.return_nil(2)
606
+ instance.return_nil(2.0)
607
+
608
+ klass.send :rtype, :return_nil, [Num > 0] => Any
609
+ expect { instance.return_nil("non numeric") }.to raise_error Rtype::ArgumentTypeError
610
+ expect { instance.return_nil(0) }.to raise_error Rtype::ArgumentTypeError
611
+
612
+ klass.send :rtype, :return_nil, [Num < 0] => Any
613
+ expect { instance.return_nil("non numeric") }.to raise_error Rtype::ArgumentTypeError
614
+ expect { instance.return_nil(0) }.to raise_error Rtype::ArgumentTypeError
615
+
616
+ klass.send :rtype, :return_nil, [Num <= 0] => Any
617
+ expect { instance.return_nil("non numeric") }.to raise_error Rtype::ArgumentTypeError
618
+ expect { instance.return_nil(1) }.to raise_error Rtype::ArgumentTypeError
619
+ end
620
+
621
+ it 'Int (Integer)' do
622
+ klass.send :rtype, :return_nil, [Int >= 0] => Any
623
+ expect { instance.return_nil("hello") }.to raise_error Rtype::ArgumentTypeError
624
+ expect { instance.return_nil(1.0) }.to raise_error Rtype::ArgumentTypeError
625
+ expect { instance.return_nil(-1) }.to raise_error Rtype::ArgumentTypeError
626
+ instance.return_nil(2)
627
+
628
+ klass.send :rtype, :return_nil, [Int > 0] => Any
629
+ expect { instance.return_nil(1.0) }.to raise_error Rtype::ArgumentTypeError
630
+ expect { instance.return_nil(0) }.to raise_error Rtype::ArgumentTypeError
631
+
632
+ klass.send :rtype, :return_nil, [Int < 0] => Any
633
+ expect { instance.return_nil(-1.0) }.to raise_error Rtype::ArgumentTypeError
634
+ expect { instance.return_nil(0) }.to raise_error Rtype::ArgumentTypeError
635
+
636
+ klass.send :rtype, :return_nil, [Int <= 0] => Any
637
+ expect { instance.return_nil(0.0) }.to raise_error Rtype::ArgumentTypeError
638
+ expect { instance.return_nil(1) }.to raise_error Rtype::ArgumentTypeError
639
+ end
640
+
641
+ it 'Flo (Float)' do
642
+ klass.send :rtype, :return_nil, [Flo >= 0] => Any
643
+ expect { instance.return_nil("hello") }.to raise_error Rtype::ArgumentTypeError
644
+ expect { instance.return_nil(1) }.to raise_error Rtype::ArgumentTypeError
645
+ expect { instance.return_nil(-1.0) }.to raise_error Rtype::ArgumentTypeError
646
+ instance.return_nil(2.0)
647
+
648
+ klass.send :rtype, :return_nil, [Flo > 0] => Any
649
+ expect { instance.return_nil(1) }.to raise_error Rtype::ArgumentTypeError
650
+ expect { instance.return_nil(0.0) }.to raise_error Rtype::ArgumentTypeError
651
+
652
+ klass.send :rtype, :return_nil, [Flo < 0] => Any
653
+ expect { instance.return_nil(-1) }.to raise_error Rtype::ArgumentTypeError
654
+ expect { instance.return_nil(0.0) }.to raise_error Rtype::ArgumentTypeError
655
+
656
+ klass.send :rtype, :return_nil, [Flo <= 0] => Any
657
+ expect { instance.return_nil(0) }.to raise_error Rtype::ArgumentTypeError
658
+ expect { instance.return_nil(1.0) }.to raise_error Rtype::ArgumentTypeError
659
+ end
660
+ end
661
+ end
662
+ end
663
+
664
+ describe 'Signature' do
665
+ describe 'check arguments' do
666
+ it 'nothing' do
667
+ klass.send :rtype, :sum, [] => Any
668
+ instance.sum(1, 2)
669
+ instance.sum(1, 2.0)
670
+ instance.sum(1.0, 2.0)
671
+ instance.sum("a", "b")
672
+ end
673
+
674
+ it 'two' do
675
+ klass.send :rtype, :sum, [Integer, Integer] => Any
676
+ expect {instance.sum(1, 2.0)}.to raise_error Rtype::ArgumentTypeError
677
+ end
678
+
679
+ it 'two hash' do
680
+ klass.send :rtype, :two_args, [{k: Integer}, {k: Integer}, {}] => Any
681
+ instance.two_args({k: 123}, {k: 456})
682
+ expect {
683
+ instance.two_args({k: 123}, {})
684
+ }.to raise_error Rtype::ArgumentTypeError
685
+ expect {
686
+ instance.two_args({k: 123}, 456)
687
+ }.to raise_error Rtype::ArgumentTypeError
688
+ expect {
689
+ instance.two_args({k: 123}, {k: "str"})
690
+ }.to raise_error Rtype::ArgumentTypeError
691
+ end
692
+
693
+ context 'when hash is not last element' do
694
+ it 'is hash-type argument, not keyword argument' do
695
+ klass.send :rtype, :return_arg, [{a: String}, {}] => Any
696
+ expect {
697
+ instance.return_arg({a: 123})
698
+ }.to raise_error Rtype::ArgumentTypeError
699
+ end
700
+ end
701
+ end
702
+
703
+ describe 'check return' do
704
+ it 'Any' do
705
+ klass.send :rtype, :return_arg, [] => Any
706
+ instance.return_arg("str")
707
+ end
708
+
709
+ it 'Array' do
710
+ klass.send :rtype, :return_arg, [] => [Integer, Float]
711
+ expect {instance.return_arg("str")}.to raise_error Rtype::ReturnTypeError
712
+ end
713
+ end
714
+
715
+ it 'check arguments and return value' do
716
+ klass.send :rtype, :return_nil, [Float] => nil
717
+ expect {instance.return_nil(123)}.to raise_error Rtype::ArgumentTypeError
718
+ klass.send :rtype, :return_nil, [Integer] => Integer
719
+ expect {instance.return_nil(123)}.to raise_error Rtype::ReturnTypeError
720
+ end
721
+
722
+ describe 'wrong case' do
723
+ describe 'invalid type signature' do
724
+ it 'invalid arguments type signature' do
725
+ expect {
726
+ klass.send :rtype, :return_arg, Any => nil
727
+ }.to raise_error Rtype::TypeSignatureError
728
+ end
729
+ it 'invalid return type signature' do
730
+ expect {
731
+ klass.send :rtype, :return_arg, [] => 123
732
+ }.to raise_error Rtype::TypeSignatureError
733
+ end
734
+
735
+ it 'invalid type behavior in arguments' do
736
+ expect {
737
+ klass.send :rtype, :return_arg, [123] => Any
738
+ }.to raise_error Rtype::TypeSignatureError
739
+ expect {
740
+ klass.send :rtype, :return_arg, ["abc"] => Any
741
+ }.to raise_error Rtype::TypeSignatureError
742
+ end
743
+
744
+ it 'invalid type behavior in return' do
745
+ expect {
746
+ klass.send :rtype, :return_arg, [] => 123
747
+ }.to raise_error Rtype::TypeSignatureError
748
+ expect {
749
+ klass.send :rtype, :return_arg, [] => "abc"
750
+ }.to raise_error Rtype::TypeSignatureError
751
+ end
752
+
753
+ context "with annotation mode" do
754
+ it 'works' do
755
+ expect {
756
+ class AnnotationTest
757
+ rtype [String, 123] => Any
758
+ def invalid_test(arg)
759
+ end
760
+ end
761
+ }.to raise_error Rtype::TypeSignatureError
762
+ end
763
+ end
764
+ end
765
+ end
766
+ end
767
+
768
+ describe "Implementation" do
769
+ it 'can be called before method definition' do
770
+ class TestClass
771
+ rtype :method_def, [Integer] => Any
772
+ def method_def(i)
773
+ end
774
+ end
775
+ expect {
776
+ TestClass.new.method_def("abc")
777
+ }.to raise_error Rtype::ArgumentTypeError
778
+ end
779
+
780
+ it 'can be called after method definition' do
781
+ class TestClass
782
+ def method_def_2(i)
783
+ end
784
+ rtype :method_def_2, [Integer] => Any
785
+ end
786
+ expect {
787
+ TestClass.new.method_def_2("abc")
788
+ }.to raise_error Rtype::ArgumentTypeError
789
+ end
790
+
791
+ it 'method name can be both symbol and string' do
792
+ class TestClass
793
+ rtype 'method_def_3', [Integer] => Any
794
+ def method_def_3(i)
795
+ end
796
+ rtype :method_def_4, [Integer] => Any
797
+ def method_def_4(i)
798
+ end
799
+ end
800
+ expect {
801
+ TestClass.new.method_def_3("abc")
802
+ }.to raise_error Rtype::ArgumentTypeError
803
+ expect {
804
+ TestClass.new.method_def_4("abc")
805
+ }.to raise_error Rtype::ArgumentTypeError
806
+ end
807
+
808
+ describe 'method visibility works' do
809
+ it 'protected' do
810
+ klass.send :rtype, :protected_func, [] => Any
811
+ expect {instance.protected_func}.to raise_error NoMethodError
812
+ end
813
+ it 'private' do
814
+ klass.send :rtype, :private_func, [] => Any
815
+ expect {instance.private_func}.to raise_error NoMethodError
816
+ end
817
+ it 'public' do
818
+ klass.send :rtype, :public_func, [] => Any
819
+ instance.public_func
820
+ end
821
+ end
822
+
823
+ context 'with empty argument signature' do
824
+ it 'accept any arguments' do
825
+ klass.send :rtype, :three_args, [] => Any
826
+ instance.three_args("abc", 123, 456)
827
+ end
828
+ end
829
+
830
+ context 'when args length is more than arg signature length' do
831
+ it 'type checking ignore rest args' do
832
+ klass.send :rtype, :three_args, [String] => Any
833
+ instance.three_args("abc", 123, 456)
834
+ end
835
+ end
836
+
837
+ context 'when hash type argument contain a key not configured to rtype' do
838
+ it 'raises error' do
839
+ klass.send :rtype, :return_arg, [{a: String}, {}] => Any
840
+ expect {
841
+ instance.return_arg({a: "str", b: "str"})
842
+ }.to raise_error Rtype::ArgumentTypeError
843
+ end
844
+ end
845
+
846
+ it "One rtype annotation affect only one method" do
847
+ class AnnotationTest
848
+ rtype [String] => Any
849
+ def one(str)
850
+ end
851
+
852
+ def two(str)
853
+ end
854
+ end
855
+ expect {
856
+ AnnotationTest.new.one(123)
857
+ }.to raise_error Rtype::ArgumentTypeError
858
+ AnnotationTest.new.two(123)
859
+ end
860
+
861
+ it "One rtype annotation affect only one method, regardless of instance method or class method" do
862
+ class AnnotationTest2
863
+ rtype [String] => Any
864
+ def self.static_one(str)
865
+ end
866
+
867
+ def inst_one(str)
868
+ end
869
+
870
+ def self.static_two(str)
871
+ end
872
+ end
873
+ expect {
874
+ AnnotationTest2::static_one(123)
875
+ }.to raise_error Rtype::ArgumentTypeError
876
+ AnnotationTest2.new.inst_one(123)
877
+ AnnotationTest2::static_two(123)
878
+ end
879
+
880
+ context 'when rtype signature duplicated' do
881
+ it 'the latest have priority' do
882
+ class PriorityTest1
883
+ rtype :test_priority, [String] => Any
884
+ def test_priority(arg)
885
+ end
886
+ rtype :test_priority, [Integer] => Any
887
+ end
888
+
889
+ PriorityTest1.new.test_priority(1)
890
+ expect { PriorityTest1.new.test_priority("str") }.to raise_error Rtype::ArgumentTypeError
891
+ end
892
+
893
+ it 'annotation mode have priority in contemporaneous signatures' do
894
+ class PriorityTest2
895
+ rtype :test_priority, [String] => Any
896
+ rtype [Integer] => Any
897
+ def test_priority(arg)
898
+ end
899
+ end
900
+
901
+ PriorityTest2.new.test_priority(1)
902
+ expect { PriorityTest2.new.test_priority("str") }.to raise_error Rtype::ArgumentTypeError
903
+ end
904
+ end
905
+ end
906
+
907
+ describe "Call Rtype`s static method directly" do
908
+ it 'Rtype::define_typed_method' do
909
+ Rtype::define_typed_method klass, :return_arg, {[String] => Any}, false
910
+ expect {instance.return_arg(123)}.to raise_error Rtype::ArgumentTypeError
911
+ end
912
+
913
+ it 'Rtype::define_typed_accessor' do
914
+ Rtype::define_typed_accessor klass, :value, String, false
915
+ expect { instance.value = 123 }.to raise_error Rtype::ArgumentTypeError
916
+ expect { instance.value }.to raise_error Rtype::ReturnTypeError
917
+ end
918
+
919
+ it 'Rtype::valid?' do
920
+ expect(
921
+ Rtype::valid?(String, "str")
922
+ ).to be true
923
+ expect(
924
+ Rtype::valid?(Integer, "str")
925
+ ).to be false
926
+ expect {
927
+ Rtype::valid?("Invalid type behavior", "Test Value")
928
+ }.to raise_error Rtype::TypeSignatureError
929
+ end
930
+
931
+ it 'Rtype::assert_arguments_type' do
932
+ expect {
933
+ Rtype::assert_arguments_type([Integer, String], [123, 123])
934
+ }.to raise_error Rtype::ArgumentTypeError
935
+ end
936
+
937
+ it 'Rtype::assert_return_type' do
938
+ expect {
939
+ Rtype::assert_return_type nil, "No nil"
940
+ }.to raise_error Rtype::ReturnTypeError
941
+ end
942
+
943
+ it 'Rtype::assert_valid_type_sig' do
944
+ Rtype::assert_valid_type_sig([Integer, String] => Any)
945
+ expect {
946
+ Rtype::assert_valid_type_sig([Integer, String])
947
+ }.to raise_error Rtype::TypeSignatureError
948
+ end
949
+
950
+ it 'Rtype::assert_valid_arguments_type_sig' do
951
+ Rtype::assert_valid_arguments_type_sig([Integer, String])
952
+ expect {
953
+ Rtype::assert_valid_arguments_type_sig("[Integer, String]")
954
+ }.to raise_error Rtype::TypeSignatureError
955
+ end
956
+
957
+ it 'Rtype::assert_valid_argument_type_sig_element' do
958
+ Rtype::assert_valid_argument_type_sig_element(Integer)
959
+ expect {
960
+ Rtype::assert_valid_argument_type_sig_element("Integer")
961
+ }.to raise_error Rtype::TypeSignatureError
962
+ end
963
+
964
+ it 'Rtype::assert_valid_return_type_sig' do
965
+ Rtype::assert_valid_return_type_sig(Integer)
966
+ expect {
967
+ Rtype::assert_valid_return_type_sig("Integer")
968
+ }.to raise_error Rtype::TypeSignatureError
969
+ end
970
+ end
971
+ end