Merge branch 'test' of https://github.com/mirichi/mruby into mirichi-test
[mruby.git] / test / t / bs_block.rb
blobf4e4da375f350055c77dba54d971802d5f45a783
1 ##
2 # Bootstrap tests for blocks
4 assert('BS Block 1') do
5   assert_equal(1) do
6     1.times{
7       begin
8         a = 1
9       ensure
10         foo = nil
11       end
12     }
13   end
14 end
16 assert('BS Block 2') do
17   assert_equal 2, [1,2,3].find{|x| x == 2}
18 end
20 assert('BS Block 3') do
21   class E
22     include Enumerable
23     def each(&block)
24       [1, 2, 3].each(&block)
25     end
26   end
27   assert_equal 2, E.new.find {|x| x == 2 }
28 end
30 assert('BS Block 3') do
31   sum = 0
32   for x in [1, 2, 3]
33     sum += x
34   end
35   assert_equal 6, sum
36 end
38 assert('BS Block 4') do
39   sum = 0
40   for x in (1..5)
41     sum += x
42   end
43   assert_equal 15, sum
44 end
46 assert('BS Block 5') do
47   sum = 0
48   for x in []
49     sum += x
50   end
51   assert_equal 0, sum
52 end
54 assert('BS Block 6') do
55   ans = []
56   assert_equal(1) do
57     1.times{
58       for n in 1..3
59         a = n
60         ans << a
61       end
62     }
63   end
64 end
66 assert('BS Block 7') do
67   ans = []
68   assert_equal((1..3)) do
69     for m in 1..3
70       for n in 2..4
71         a = [m, n]
72         ans << a
73       end
74     end
75   end
76 end
78 assert('BS Block 8') do
79   assert_equal [1, 2, 3], (1..3).to_a
80 end
82 assert('BS Block 9') do
83   assert_equal([4, 8, 12]) do
84     (1..3).map{|e|
85       e * 4
86     }
87   end
88 end
90 assert('BS Block 10') do
91   def m
92     yield
93   end
94   def n
95     yield
96   end
98   assert_equal(100) do
99     m{
100       n{
101         100
102       }
103     }
104   end
107 assert('BS Block 11') do
108   def m
109     yield 1
110   end
112   assert_equal(20) do
113     m{|ib|
114       m{|jb|
115         i = 20
116       }
117     }
118   end
121 assert('BS Block 12') do
122   def m
123     yield 1
124   end
126   assert_equal(2) do
127     m{|ib|
128       m{|jb|
129         ib = 20
130         kb = 2
131       }
132     }
133   end
136 assert('BS Block 13') do
137   def iter1
138     iter2{
139       yield
140     }
141   end
143   def iter2
144     yield
145   end
147   assert_equal(3) do
148     iter1{
149       jb = 2
150       iter1{
151         jb = 3
152       }
153       jb
154     }
155   end
158 assert('BS Block 14') do
159   def iter1
160     iter2{
161       yield
162     }
163   end
165   def iter2
166     yield
167   end
169   assert_equal(2) do
170     iter1{
171       jb = 2
172       iter1{
173         jb
174       }
175       jb
176     }
177   end
180 assert('BS Block 15') do
181   def m
182     yield 1
183   end
184   assert_equal(2) do
185     m{|ib|
186       ib*2
187     }
188   end
191 assert('BS Block 16') do
192   def m
193     yield 12345, 67890
194   end
195   assert_equal(92580) do
196     m{|ib,jb|
197       ib*2+jb
198     }
199   end
202 assert('BS Block 17') do
203   def iter
204     yield 10
205   end
207   a = nil
208   assert_equal [10, nil] do
209     [iter{|a|
210       a
211     }, a]
212   end
215 assert('BS Block 18') do
216   def iter
217     yield 10
218   end
220   assert_equal(21) do
221     iter{|a|
222       iter{|a|
223         a + 1
224       } + a
225     }
226   end
229 assert('BS Block 19') do
230   def iter
231     yield 10, 20, 30, 40
232   end
234   a = b = c = d = nil
235   assert_equal([10, 20, 30, 40, nil, nil, nil, nil]) do
236     iter{|a, b, c, d|
237       [a, b, c, d]
238     } + [a, b, c, d]
239   end
242 assert('BS Block 20') do
243   def iter
244     yield 10, 20, 30, 40
245   end
247   a = b = nil
248   assert_equal([10, 20, 30, 40, nil, nil]) do
249     iter{|a, b, c, d|
250       [a, b, c, d]
251     } + [a, b]
252   end
255 assert('BS Block 21') do
256   def iter
257     yield 1, 2
258   end
260   assert_equal([1, [2]]) do
261     iter{|a, *b|
262       [a, b]
263     }
264   end
267 assert('BS Block 22') do
268   def iter
269     yield 1, 2
270   end
272   assert_equal([[1, 2]]) do
273     iter{|*a|
274       [a]
275     }
276   end
279 assert('BS Block 23') do
280   def iter
281     yield 1, 2
282   end
284   assert_equal([1, 2, []]) do
285     iter{|a, b, *c|
286       [a, b, c]
287     }
288   end
291 assert('BS Block 24') do
292   def m
293     yield
294   end
295   assert_equal(1) do
296     m{
297       1
298     }
299   end
302 assert('BS Block 25') do
303   def m
304     yield 123
305   end
306   assert_equal(15129) do
307     m{|ib|
308       m{|jb|
309         ib*jb
310       }
311     }
312   end
315 assert('BS Block 26') do
316   def m a
317     yield a
318   end
319   assert_equal(2) do
320     m(1){|ib|
321       m(2){|jb|
322         ib*jb
323       }
324     }
325   end
328 assert('BS Block 27') do
329   sum = 0
330   3.times{|ib|
331     2.times{|jb|
332       sum += ib + jb
333     }}
334   assert_equal sum, 9
337 assert('BS Block 28') do
338   assert_equal(10) do
339     3.times{
340       break 10
341     }
342   end
345 assert('BS Block 29') do
346   def iter
347     yield 1,2,3
348   end
350   assert_equal([1, 2]) do
351     iter{|i, j|
352       [i, j]
353     }
354   end
357 assert('BS Block 30') do
358   def iter
359     yield 1
360   end
362   assert_equal([1, nil]) do
363     iter{|i, j|
364       [i, j]
365     }
366   end
369 assert('BS Block [ruby-dev:31147]') do
370   def m
371     yield
372   end
373   assert_nil m{|&b| b}
376 assert('BS Block [ruby-dev:31160]') do
377   def m()
378     yield
379   end
380   assert_nil m {|(v,(*))|}
383 assert('BS Block [issue #750]') do
384   def m(a, *b)
385     yield
386   end
387   args = [1, 2, 3]
388   assert_equal m(*args){ 1 }, 1
391 assert('BS Block 31') do
392   def m()
393     yield
394   end
395   assert_nil m {|((*))|}
398 assert('BS Block [ruby-dev:31440]') do
399   def m
400     yield [0]
401   end
402   assert_equal m{|v, &b| v}, [0]
405 assert('BS Block 32') do
406   r = false; 1.times{|&b| r = b}
407   assert_equal NilClass, r.class
410 assert('BS Block [ruby-core:14395]') do
411   assert_nothing_raised do
412     class Controller
413       def respond_to(&block)
414         responder = Responder.new
415         block.call(responder)
416         responder.respond
417       end
418       def test_for_bug
419         respond_to{|format|
420           format.js{
421             "in test"
422             render{|obj|
423               obj
424             }
425           }
426         }
427       end
428       def render(&block)
429         "in render"
430       end
431     end
432     class Responder
433       def method_missing(symbol, &block)
434         "enter method_missing"
435         @response = Proc.new{
436           'in method missing'
437           block.call
438         }
439         "leave method_missing"
440       end
441       def respond
442         @response.call
443       end
444     end
445     t = Controller.new
446     t.test_for_bug
447   end
450 assert("BS Block 33") do
451   module TestReturnFromNestedBlock
452     def self.test
453       1.times do
454         1.times do
455           return :ok
456         end
457       end
458       :bad
459     end
460   end
461   assert_equal :ok, TestReturnFromNestedBlock.test
464 assert("BS Block 34") do
465   module TestReturnFromNestedBlock_BSBlock34
466     def self.test
467       1.times do
468         while true
469           return :ok
470         end
471       end
472       :bad
473     end
474   end
475   assert_equal :ok, TestReturnFromNestedBlock_BSBlock34.test
478 assert("BS Block 35") do
479   module TestReturnFromNestedBlock_BSBlock35
480     def self.test
481       1.times do
482         until false
483           return :ok
484         end
485       end
486       :bad
487     end
488   end
489   assert_equal :ok, TestReturnFromNestedBlock_BSBlock35.test
492 assert('BS Block 36') do
493   def iter
494     yield 1, 2, 3, 4, 5
495   end
497   assert_equal([1, 2, [3, 4], 5]) do
498     iter{|a, b, *c, d|
499       [a, b, c, d]
500     }
501   end
504 assert('BS Block 37') do
505   def iter
506     yield 1, 2, 3
507   end
509   assert_equal([1, 2, [], 3]) do
510     iter{|a, b, *c, d|
511       [a, b, c, d]
512     }
513   end
516 assert('BS Block 38') do
517   def iter
518     yield 1,2,3,4,5,6
519   end
521   assert_equal [1,2,3,4,5], iter{|a,b,c=:c,d,e| [a,b,c,d,e]}
524 assert('BS Block 39') do
525   def iter
526     yield 1
527   end
529   assert_equal([1, 2, nil]) do
530     iter{|a, b=2, c|
531       [a, b, c]
532     }
533   end