1assert_equal %q{2}, %q{
2  begin
3    1+1
4  ensure
5    2+2
6  end
7}
8assert_equal %q{4}, %q{
9  begin
10    1+1
11    begin
12      2+2
13    ensure
14      3+3
15    end
16  ensure
17    4+4
18  end
19}
20assert_equal %q{4}, %q{
21  begin
22    1+1
23    begin
24      2+2
25    ensure
26      3+3
27    end
28  ensure
29    4+4
30    begin
31      5+5
32    ensure
33      6+6
34    end
35  end
36}
37assert_equal %q{NilClass}, %q{
38  a = nil
39  1.times{|e|
40    begin
41    rescue => err
42    end
43    a = err.class
44  }
45  a
46}
47assert_equal %q{RuntimeError}, %q{
48  a = nil
49  1.times{|e|
50    begin
51      raise
52    rescue => err
53    end
54    a = err.class
55  }
56  a
57}
58assert_equal %q{}, %q{
59  $!
60}
61assert_equal %q{FOO}, %q{
62  begin
63    raise "FOO"
64  rescue
65    $!
66  end
67}
68assert_equal %q{FOO}, %q{
69  def m
70    $!
71  end
72  begin
73    raise "FOO"
74  rescue
75    m()
76  end
77}
78assert_equal %q{[#<RuntimeError: BAR>, #<RuntimeError: FOO>]}, %q{
79  $ans = []
80  def m
81    $!
82  end
83  begin
84    raise "FOO"
85  rescue
86    begin
87      raise "BAR"
88    rescue
89      $ans << m()
90    end
91    $ans << m()
92  end
93  $ans
94}
95assert_equal %q{[#<RuntimeError: FOO>, #<RuntimeError: FOO>]}, %q{
96  $ans = []
97  def m
98    $!
99  end
100
101  begin
102    begin
103      raise "FOO"
104    ensure
105      $ans << m()
106    end
107  rescue
108    $ans << m()
109  end
110}
111assert_equal %q{[nil]}, %q{
112  $ans = []
113  def m
114    $!
115  end
116  def m2
117    1.times{
118      begin
119        return
120      ensure
121        $ans << m
122      end
123    }
124  end
125  m2
126  $ans
127}
128assert_equal %q{ok}, %q{
129  begin
130    raise
131  rescue
132    :ok
133  end
134}
135assert_equal %q{ok}, %q{
136  begin
137    raise
138  rescue
139    :ok
140  ensure
141    :ng
142  end
143}
144assert_equal %q{RuntimeError}, %q{
145  begin
146    raise
147  rescue => e
148    e.class
149  end
150}
151assert_equal %q{ng}, %q{
152  begin
153    raise
154  rescue StandardError
155    :ng
156  rescue Exception
157    :ok
158  end
159}
160assert_equal %q{c}, %q{
161  begin
162    begin
163      raise "a"
164    rescue
165      raise "b"
166    ensure
167      raise "c"
168    end
169  rescue => e
170    e.message
171  end
172}
173assert_equal %q{33}, %q{
174  def m a, b
175    a + b
176  end
177  m(1, begin
178         raise
179       rescue
180         2
181       end) +
182  m(10, begin
183         raise
184       rescue
185         20
186       ensure
187         30
188       end)
189}
190assert_equal %q{3}, %q{
191  def m a, b
192    a + b
193  end
194  m(begin
195      raise
196    rescue
197      1
198    end,
199    begin
200      raise
201    rescue
202      2
203    end)
204}
205assert_equal %q{ok3}, %q{
206  class E1 < Exception
207  end
208
209  def m
210    yield
211  end
212
213  begin
214    begin
215      begin
216        m{
217          raise
218        }
219      rescue E1
220        :ok2
221      ensure
222      end
223    rescue
224      :ok3
225    ensure
226    end
227  rescue E1
228    :ok
229  ensure
230  end
231}
232assert_equal %q{7}, %q{
233  $i = 0
234  def m
235    iter{
236      begin
237        $i += 1
238        begin
239          $i += 2
240          break
241        ensure
242
243        end
244      ensure
245        $i += 4
246      end
247      $i = 0
248    }
249  end
250
251  def iter
252    yield
253  end
254  m
255  $i
256}
257assert_equal %q{10}, %q{
258  $i = 0
259  def m
260    begin
261      $i += 1
262      begin
263        $i += 2
264        return
265      ensure
266        $i += 3
267      end
268    ensure
269      $i += 4
270    end
271    p :end
272  end
273  m
274  $i
275}
276assert_equal %q{1}, %q{
277  begin
278    1
279  rescue
280    2
281  end
282}
283assert_equal %q{4}, %q{
284  begin
285    1
286    begin
287      2
288    rescue
289      3
290    end
291    4
292  rescue
293    5
294  end
295}
296assert_equal %q{3}, %q{
297  begin
298    1
299  rescue
300    2
301  else
302    3
303  end
304}
305assert_equal %q{2}, %q{
306  begin
307    1+1
308  rescue
309    2+2
310  ensure
311    3+3
312  end
313   }
314assert_equal %q{2}, %q{
315  begin
316    1+1
317  rescue
318    2+2
319  ensure
320    3+3
321  end
322   }
323assert_equal %q{6}, %q{
324  begin
325    1+1
326  rescue
327    2+2
328  else
329    3+3
330  ensure
331    4+4
332  end
333   }
334assert_equal %q{12}, %q{
335 begin
336   1+1
337   begin
338     2+2
339   rescue
340     3+3
341   else
342     4+4
343   end
344 rescue
345   5+5
346 else
347   6+6
348 ensure
349   7+7
350 end
351   }
352assert_equal %q{ok}, %q{ #
353  proc{
354    begin
355      raise
356      break
357    rescue
358      :ok
359    end
360  }.call
361}
362assert_equal %q{}, %q{
363  proc do
364    begin
365      raise StandardError
366      redo
367    rescue StandardError
368    end
369  end.call
370}
371
372##
373assert_match /undefined method `foo\'/, %q{#`
374  STDERR.reopen(STDOUT)
375  class C
376    def inspect
377      bar {}
378    end
379
380    def bar
381      raise
382    ensure
383    end
384  end
385  C.new.foo
386}, "[ruby-dev:31407]"
387
388assert_equal 'nil', %q{
389  doit = false
390  exc = nil
391  t = Thread.new {
392    begin
393      doit = true
394      sleep 10
395    ensure
396      exc = $!
397    end
398  }
399  Thread.pass until doit
400  t.kill
401  t.join
402  exc.inspect
403}, '[ruby-dev:32608]'
404
405assert_equal 'exception class/object expected', %q{
406  class ZeroDivisionError
407    def self.new(message)
408      42
409    end
410  end
411  begin
412    1/0
413  rescue Exception => e
414    e.message
415  end
416}, '[ruby-core:24767]'
417
418assert_equal 'ok', %q{
419  class C
420    def ===(o)
421      true
422    end
423  end
424  begin
425    begin
426      raise
427    rescue C.new
428    end
429  rescue TypeError
430    :ok
431  end
432}
433