1assert_equal %q{1}, %q{
2  1.times{
3    begin
4      a = 1
5    ensure
6      foo = nil
7    end
8  }
9}
10assert_equal %q{2}, %q{
11  [1,2,3].find{|x| x == 2}
12}
13assert_equal %q{2}, %q{
14  class E
15    include Enumerable
16    def each(&block)
17      [1, 2, 3].each(&block)
18    end
19  end
20  E.new.find {|x| x == 2 }
21}
22assert_equal %q{6}, %q{
23  sum = 0
24  for x in [1, 2, 3]
25    sum += x
26  end
27  sum
28}
29assert_equal %q{15}, %q{
30  sum = 0
31  for x in (1..5)
32    sum += x
33  end
34  sum
35}
36assert_equal %q{0}, %q{
37  sum = 0
38  for x in []
39    sum += x
40  end
41  sum
42}
43assert_equal %q{1}, %q{
44  ans = []
45  1.times{
46    for n in 1..3
47      a = n
48      ans << a
49    end
50  }
51}
52assert_equal %q{1..3}, %q{
53  ans = []
54  for m in 1..3
55    for n in 1..3
56      a = [m, n]
57      ans << a
58    end
59  end
60}
61assert_equal %q{[1, 2, 3]}, %q{
62  (1..3).to_a
63}
64assert_equal %q{[4, 8, 12]}, %q{
65  (1..3).map{|e|
66    e * 4
67  }
68}
69assert_equal %q{[1, 2, 3]}, %q{
70  class C
71    include Enumerable
72    def each
73      [1,2,3].each{|e|
74        yield e
75      }
76    end
77  end
78
79  C.new.to_a
80}
81assert_equal %q{[4, 5, 6]}, %q{
82  class C
83    include Enumerable
84    def each
85      [1,2,3].each{|e|
86        yield e
87      }
88    end
89  end
90
91  C.new.map{|e|
92    e + 3
93  }
94}
95assert_equal %q{100}, %q{
96  def m
97    yield
98  end
99  def n
100    yield
101  end
102
103  m{
104    n{
105      100
106    }
107  }
108}
109assert_equal %q{20}, %q{
110  def m
111    yield 1
112  end
113
114  m{|ib|
115    m{|jb|
116      i = 20
117    }
118  }
119}
120assert_equal %q{2}, %q{
121  def m
122    yield 1
123  end
124
125  m{|ib|
126    m{|jb|
127      ib = 20
128      kb = 2
129    }
130  }
131}
132assert_equal %q{3}, %q{
133  def iter1
134    iter2{
135      yield
136    }
137  end
138
139  def iter2
140    yield
141  end
142
143  iter1{
144    jb = 2
145    iter1{
146      jb = 3
147    }
148    jb
149  }
150}
151assert_equal %q{2}, %q{
152  def iter1
153    iter2{
154      yield
155    }
156  end
157
158  def iter2
159    yield
160  end
161
162  iter1{
163    jb = 2
164    iter1{
165      jb
166    }
167    jb
168  }
169}
170assert_equal %q{2}, %q{
171  def m
172    yield 1
173  end
174  m{|ib|
175    ib*2
176  }
177}
178assert_equal %q{92580}, %q{
179  def m
180    yield 12345, 67890
181  end
182  m{|ib,jb|
183    ib*2+jb
184  }
185}
186assert_equal %q{[10, nil]}, %q{
187  def iter
188    yield 10
189  end
190
191  a = nil
192  [iter{|a|
193    a
194  }, a]
195}
196assert_equal %q{21}, %q{
197  def iter
198    yield 10
199  end
200
201  iter{|a|
202    iter{|a|
203      a + 1
204    } + a
205  }
206}
207assert_equal %q{[10, 20, 30, 40, nil, nil, nil, nil]}, %q{
208  def iter
209    yield 10, 20, 30, 40
210  end
211
212  a = b = c = d = nil
213  iter{|a, b, c, d|
214    [a, b, c, d]
215  } + [a, b, c, d]
216}
217assert_equal %q{[10, 20, 30, 40, nil, nil]}, %q{
218  def iter
219    yield 10, 20, 30, 40
220  end
221
222  a = b = nil
223  iter{|a, b, c, d|
224    [a, b, c, d]
225  } + [a, b]
226}
227assert_equal %q{[1]}, %q{
228  $a = []
229
230  def iter
231    yield 1
232  end
233
234  def m
235    x = iter{|x|
236      $a << x
237      y = 0
238    }
239  end
240  m
241  $a
242}
243assert_equal %q{[1, [2]]}, %q{
244  def iter
245    yield 1, 2
246  end
247
248  iter{|a, *b|
249    [a, b]
250  }
251}
252assert_equal %q{[[1, 2]]}, %q{
253  def iter
254    yield 1, 2
255  end
256
257  iter{|*a|
258    [a]
259  }
260}
261assert_equal %q{[1, 2, []]}, %q{
262  def iter
263    yield 1, 2
264  end
265
266  iter{|a, b, *c|
267    [a, b, c]
268  }
269}
270assert_equal %q{[1, 2, nil, []]}, %q{
271  def iter
272    yield 1, 2
273  end
274
275  iter{|a, b, c, *d|
276    [a, b, c, d]
277  }
278}
279assert_equal %q{1}, %q{
280  def m
281    yield
282  end
283  m{
284    1
285  }
286}
287assert_equal %q{15129}, %q{
288  def m
289    yield 123
290  end
291  m{|ib|
292    m{|jb|
293      ib*jb
294    }
295  }
296}
297assert_equal %q{2}, %q{
298  def m a
299    yield a
300  end
301  m(1){|ib|
302    m(2){|jb|
303      ib*jb
304    }
305  }
306}
307assert_equal %q{9}, %q{
308  sum = 0
309  3.times{|ib|
310    2.times{|jb|
311      sum += ib + jb
312    }}
313  sum
314}
315assert_equal %q{10}, %q{
316  3.times{|bl|
317    break 10
318  }
319}
320assert_equal %q{[1, 2]}, %q{
321  def iter
322    yield 1,2,3
323  end
324
325  iter{|i, j|
326    [i, j]
327  }
328}
329assert_equal %q{[1, nil]}, %q{
330  def iter
331    yield 1
332  end
333
334  iter{|i, j|
335    [i, j]
336  }
337}
338
339assert_equal '0', %q{
340def m()
341end
342m {|(v0,*,(*)),|}
343m {|(*v0,(*)),|}
344m {|(v0,*v1,(*)),|}
345m {|((v0,*v1,v2)),|}
346m {|(v0,*v1,v2),|}
347m {|(v0,*v1,(v2)),|}
348m {|((*),*v0,v1),|}
349m {|((v0),*v1,v2),|}
350m {|(v0,v1,*v2,v3),|}
351m {|v0,(v1,*v2,v3),|}
352m {|(v0,*v1,v2),v3,|}
353m {|(v0,*v1,v2)|}
354m {|(v0,*v1,v2),&v3|}
355m {|(v0,*v1,v2),*|}
356m {|(v0,*v1,v2),*,&v3|}
357m {|*,(v0,*v1,v2)|}
358m {|*,(v0,*v1,v2),&v3|}
359m {|v0,*,(v1,*v2,v3)|}
360m {|v0,*,(v1,*v2,v3),&v4|}
361m {|(v0,*v1,v2),*,v3|}
362m {|(v0,*v1,v2),*,v3,&v4|}
363m {|(v0, *v1, v2)|}
364m {|(*,v)|}
3650
366}, "block parameter (shouldn't SEGV: [ruby-dev:31143])"
367
368assert_equal 'nil', %q{
369  def m
370    yield
371  end
372  m{|&b| b}.inspect
373}, '[ruby-dev:31147]'
374
375assert_equal 'nil', %q{
376  def m()
377    yield
378  end
379  m {|(v,(*))|}.inspect
380}, '[ruby-dev:31160]'
381
382assert_equal 'nil', %q{
383  def m()
384    yield
385  end
386  m {|(*,a,b)|}.inspect
387}, '[ruby-dev:31153]'
388
389assert_equal 'nil', %q{
390  def m()
391    yield
392  end
393  m {|((*))|}.inspect
394}
395
396assert_equal %q{[1, 1, [1, nil], [1, nil], [1, nil], [1, nil], [1, 1], 1, [1, nil], [1, nil], [1, nil], [1, nil], [[1, 1], [1, 1]], [1, 1], [1, 1], [1, 1], [1, nil], [1, nil], [[[1, 1], [1, 1]], [[1, 1], [1, 1]]], [[1, 1], [1, 1]], [[1, 1], [1, 1]], [[1, 1], [1, 1]], [1, 1], [1, 1], [[[[1, 1], [1, 1]], [[1, 1], [1, 1]]], [[[1, 1], [1, 1]], [[1, 1], [1, 1]]]], [[[1, 1], [1, 1]], [[1, 1], [1, 1]]], [[[1, 1], [1, 1]], [[1, 1], [1, 1]]], [[[1, 1], [1, 1]], [[1, 1], [1, 1]]], [[1, 1], [1, 1]], [[1, 1], [1, 1]]]}, %q{
397def m(ary = [])
398  yield(ary)
399end
400
401$ans = []
402o = 1
4035.times{
404  v,(*) = o; $ans << o
405  m(o){|(v,(*))| $ans << v}
406  ((x, y)) = o; $ans << [x, y]
407  m(o){|((x, y))| $ans << [x, y]}
408  (((x, y))) = o; $ans << [x, y]
409  m(o){|(((x, y)))| $ans << [x, y]}
410  o = [o, o]
411}; $ans
412}
413
414assert_equal '0', %q{
415  def m()
416    yield [0]
417  end
418  m {|*,v| v}.inspect
419}, '[ruby-dev:31437]'
420assert_equal '[0]', %q{
421  def m
422    yield [0]
423  end
424  m{|v, &b| v}.inspect
425}, '[ruby-dev:31440]'
426assert_equal 'ok', %q{
427  begin
428    lambda{|a|}.call(1, 2)
429  rescue ArgumentError
430    :ok
431  else
432    :ng
433  end
434}, '[ruby-dev:31464]'
435assert_equal 'ok', %q{
436  begin
437    lambda{|&b|}.call(3)
438  rescue ArgumentError
439    :ok
440  else
441    :ng
442  end
443}, '[ruby-dev:31472]'
444assert_equal 'ok', %q{
445  class C
446    def each
447      yield [1,2]
448      yield 1,2
449    end
450  end
451  vs1 = []
452  C.new.each {|*v| vs1 << v }
453  vs2 = []
454  C.new.to_enum.each {|*v| vs2 << v }
455  vs1 == vs2 ? :ok : :ng
456}, '[ruby-dev:32329]'
457
458assert_normal_exit %q{
459  e = [1,2,3].each
460  10000.times {
461    e = [e].each
462  }
463  Thread.new { GC.start }.join
464}, '[ruby-dev:32604]'
465
466
467assert_equal '[nil, []]', %q{
468  def m() yield nil,[] end
469  l = lambda {|*v| v}
470  GC.stress=true
471  r = m(&l)
472  GC.stress=false
473  r.inspect
474}, '[ruby-dev:32567]'
475
476assert_equal NilClass.to_s, %q{
477  r = false; 1.times{|&b| r = b}; r.class
478}
479
480assert_equal 'ok', %q{
481  class C
482    define_method(:foo) do |arg, &block|
483      if block then block.call else arg end
484    end
485  end
486  C.new.foo("ng") {"ok"}
487}, '[ruby-talk:266422]'
488
489assert_equal 'ok', %q{
490  class C
491    define_method(:xyz) do |o, k, &block|
492      block.call(o, k)
493    end
494  end
495  C.new.xyz("o","k") {|o, k| o+k}
496}, '[ruby-core:20544]'
497
498assert_equal 'ok', %q{
499  class C
500    define_method(:xyz) do |*args, &block|
501      block.call(*args)
502    end
503  end
504  C.new.xyz("o","k") {|*args| args.join("")}
505}, '[ruby-core:20544]'
506
507assert_equal 'ok', %q{
508  STDERR.reopen(STDOUT)
509  class C
510    define_method(:foo) do |&block|
511      block.call if block
512    end
513    result = "ng"
514    new.foo() {result = "ok"}
515    result
516  end
517}
518
519assert_equal "ok", %q{
520  class Bar
521    def bar; :ok; end
522  end
523  def foo
524    yield(Bar.new) if block_given?
525  end
526  foo(&:bar)
527}, '[ruby-core:14279]'
528
529assert_normal_exit %q{
530  class Controller
531    def respond_to(&block)
532      responder = Responder.new
533      block.call(responder)
534      responder.respond
535    end
536    def test_for_bug
537      respond_to{|format|
538        format.js{
539          puts "in test"
540          render{|obj|
541            puts obj
542          }
543        }
544      }
545    end
546    def render(&block)
547      puts "in render"
548    end
549  end
550
551  class Responder
552    def method_missing(symbol, &block)
553      puts "enter method_missing"
554      @response = Proc.new{
555        puts 'in method missing'
556        block.call
557      }
558      puts "leave method_missing"
559    end
560    def respond
561      @response.call
562    end
563  end
564  t = Controller.new
565  t.test_for_bug
566}, '[ruby-core:14395]'
567
568assert_equal 'true', %q{
569  class C0
570    def foo
571      block_given?
572    end
573  end
574
575  class C1 < C0
576    def foo
577      super
578    end
579  end
580
581  C1.new.foo{}
582}
583
584assert_equal 'true', %q{
585  class C0
586    def foo
587      block_given?
588    end
589  end
590
591  class C1 < C0
592    def foo
593      super()
594    end
595  end
596
597  C1.new.foo{}
598}
599
600