ruby/yarvtest/test_exception.rb

409 строки
5.0 KiB
Ruby

require 'yarvtest/yarvtest'
class TestException < YarvTestBase
def test_rescue
ae %q{
begin
1
rescue
2
end
}
ae %q{
begin
1
begin
2
rescue
3
end
4
rescue
5
end
}
ae %q{
begin
1
rescue
2
else
3
end
}
end
def test_ensure
ae %q{
begin
1+1
ensure
2+2
end
}
ae %q{
begin
1+1
begin
2+2
ensure
3+3
end
ensure
4+4
end
}
ae %q{
begin
1+1
begin
2+2
ensure
3+3
end
ensure
4+4
begin
5+5
ensure
6+6
end
end
}
end
def test_rescue_ensure
ae %q{
begin
1+1
rescue
2+2
ensure
3+3
end
}
ae %q{
begin
1+1
rescue
2+2
ensure
3+3
end
}
ae %q{
begin
1+1
rescue
2+2
else
3+3
ensure
4+4
end
}
ae %q{
begin
1+1
begin
2+2
rescue
3+3
else
4+4
end
rescue
5+5
else
6+6
ensure
7+7
end
}
end
def test_raise
ae %q{
begin
raise
rescue
:ok
end
}
ae %q{
begin
raise
rescue
:ok
ensure
:ng
end
}
ae %q{
begin
raise
rescue => e
e.class
end
}
ae %q{
begin
raise
rescue StandardError
:ng
rescue Exception
:ok
end
}
ae %q{
begin
begin
raise "a"
rescue
raise "b"
ensure
raise "c"
end
rescue => e
e.message
end
}
end
def test_error_variable
ae %q{
a = nil
1.times{|e|
begin
rescue => err
end
a = err.class
}
}
ae %q{
a = nil
1.times{|e|
begin
raise
rescue => err
end
a = err.class
}
a
}
end
def test_raise_in_other_scope
ae %q{
class E1 < Exception
end
def m
yield
end
begin
begin
begin
m{
raise
}
rescue E1
:ok2
ensure
end
rescue
:ok3
ensure
end
rescue E1
:ok
ensure
end
} do
remove_const :E1
end
ae %q{
$i = 0
def m
iter{
begin
$i += 1
begin
$i += 2
break
ensure
end
ensure
$i += 4
end
$i = 0
}
end
def iter
yield
end
m
$i
}
ae %q{
$i = 0
def m
begin
$i += 1
begin
$i += 2
return
ensure
$i += 3
end
ensure
$i += 4
end
p :end
end
m
$i
}
end
def test_raise_in_cont_sp
ae %q{
def m a, b
a + b
end
m(1, begin
raise
rescue
2
end) +
m(10, begin
raise
rescue
20
ensure
30
end)
}
ae %q{
def m a, b
a + b
end
m(begin
raise
rescue
1
end,
begin
raise
rescue
2
end)
}
end
def test_geterror
ae %q{
$!
}
ae %q{
begin
raise "FOO"
rescue
$!
end
}
ae %q{
def m
$!
end
begin
raise "FOO"
rescue
m()
end
}
ae %q{
$ans = []
def m
$!
end
begin
raise "FOO"
rescue
begin
raise "BAR"
rescue
$ans << m()
end
$ans << m()
end
$ans
}
ae %q{
$ans = []
def m
$!
end
begin
begin
raise "FOO"
ensure
$ans << m()
end
rescue
$ans << m()
end
}
ae %q{
$ans = []
def m
$!
end
def m2
1.times{
begin
return
ensure
$ans << m
end
}
end
m2
$ans
}
end
def test_stack_consistency
ae %q{ #
proc{
begin
raise
break
rescue
:ok
end
}.call
}
ae %q{
proc do
begin
raise StandardError
redo
rescue StandardError
end
end.call
}
end
end