1assert 'mrb_protect' do
2  # no failure in protect returns [result, false]
3  assert_equal ['test', false] do
4    ExceptionTest.mrb_protect { 'test' }
5  end
6  # failure in protect returns [exception, true]
7  result = ExceptionTest.mrb_protect { raise 'test' }
8  assert_kind_of RuntimeError, result[0]
9  assert_true result[1]
10end
11
12assert 'mrb_ensure' do
13  a = false
14  assert_equal 'test' do
15    ExceptionTest.mrb_ensure Proc.new { 'test' }, Proc.new { a = true }
16  end
17  assert_true a
18
19  a = false
20  assert_raise RuntimeError do
21    ExceptionTest.mrb_ensure Proc.new { raise 'test' }, Proc.new { a = true }
22  end
23  assert_true a
24end
25
26assert 'mrb_rescue' do
27  assert_equal 'test' do
28    ExceptionTest.mrb_rescue Proc.new { 'test' }, Proc.new {}
29  end
30
31  class CustomExp < Exception
32  end
33
34  assert_raise CustomExp do
35    ExceptionTest.mrb_rescue Proc.new { raise CustomExp.new 'test' }, Proc.new { 'rescue' }
36  end
37
38  assert_equal 'rescue' do
39    ExceptionTest.mrb_rescue Proc.new { raise 'test' }, Proc.new { 'rescue' }
40  end
41end
42
43assert 'mrb_rescue_exceptions' do
44  assert_equal 'test' do
45    ExceptionTest.mrb_rescue_exceptions Proc.new { 'test' }, Proc.new {}
46  end
47
48  assert_raise RangeError do
49    ExceptionTest.mrb_rescue_exceptions Proc.new { raise RangeError.new 'test' }, Proc.new { 'rescue' }
50  end
51
52  assert_equal 'rescue' do
53    ExceptionTest.mrb_rescue_exceptions Proc.new { raise TypeError.new 'test' }, Proc.new { 'rescue' }
54  end
55end
56