1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/test/ruby/test_exception.rb
kazu 84c25ece86 * test/ruby/test_exception.rb: add a test. cf [ruby-dev:39116]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@26244 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2010-01-05 10:34:00 +00:00

258 lines
4.4 KiB
Ruby

require 'test/unit'
require_relative 'envutil'
class TestException < Test::Unit::TestCase
def test_exception
begin
raise "this must be handled"
assert(false)
rescue
assert(true)
end
$bad = true
begin
raise "this must be handled no.2"
rescue
if $bad
$bad = false
retry
assert(false)
end
end
assert(true)
# exception in rescue clause
$string = "this must be handled no.3"
e = assert_raise(RuntimeError) do
begin
raise "exception in rescue clause"
rescue
raise $string
end
assert(false)
end
assert_equal($string, e.message)
# exception in ensure clause
$string = "exception in ensure clause"
e = assert_raise(RuntimeError) do
begin
raise "this must be handled no.4"
ensure
assert_instance_of(RuntimeError, $!)
assert_equal("this must be handled no.4", $!.message)
raise "exception in ensure clause"
end
assert(false)
end
assert_equal($string, e.message)
$bad = true
begin
begin
raise "this must be handled no.5"
ensure
$bad = false
end
rescue
end
assert(!$bad)
$bad = true
begin
begin
raise "this must be handled no.6"
ensure
$bad = false
end
rescue
end
assert(!$bad)
$bad = true
while true
begin
break
ensure
$bad = false
end
end
assert(!$bad)
assert(catch(:foo) {
loop do
loop do
throw :foo, true
break
end
break
assert(false) # should no reach here
end
false
})
end
def test_else
begin
assert(true)
rescue
assert(false)
else
assert(true)
end
begin
assert(true)
raise
assert(false)
rescue
assert(true)
else
assert(false)
end
begin
assert(true)
begin
assert(true)
rescue
assert(false)
else
assert(true)
end
assert(true)
rescue
assert(false)
else
assert(true)
end
begin
assert(true)
begin
assert(true)
raise
assert(false)
rescue
assert(true)
else
assert(false)
end
assert(true)
rescue
assert(false)
else
assert(true)
end
begin
assert(true)
begin
assert(true)
rescue
assert(false)
else
assert(true)
end
assert(true)
raise
assert(false)
rescue
assert(true)
else
assert(false)
end
begin
assert(true)
begin
assert(true)
raise
assert(false)
rescue
assert(true)
else
assert(false)
end
assert(true)
raise
assert(false)
rescue
assert(true)
else
assert(false)
end
end
def test_raise_with_wrong_number_of_arguments
assert_raise(TypeError) { raise nil }
assert_raise(TypeError) { raise 1, 1 }
assert_raise(ArgumentError) { raise 1, 1, 1, 1 }
end
def test_errat
assert_in_out_err([], "p $@", %w(nil), [])
assert_in_out_err([], "$@ = 1", [], /\$! not set \(ArgumentError\)$/)
assert_in_out_err([], <<-INPUT, [], /backtrace must be Array of String \(TypeError\)$/)
begin
raise
rescue
$@ = 1
end
INPUT
assert_in_out_err([], <<-INPUT, [], /^foo: unhandled exception$/)
begin
raise
rescue
$@ = 'foo'
raise
end
INPUT
assert_in_out_err([], <<-INPUT, [], /^foo: unhandled exception\s+from bar\s+from baz$/)
begin
raise
rescue
$@ = %w(foo bar baz)
raise
end
INPUT
end
def test_safe4
cmd = proc{raise SystemExit}
safe0_p = proc{|*args| args}
test_proc = proc {
$SAFE = 4
begin
cmd.call
rescue SystemExit => e
safe0_p["SystemExit: #{e.inspect}"]
raise e
rescue Exception => e
safe0_p["Exception (NOT SystemExit): #{e.inspect}"]
raise e
end
}
assert_raise(SystemExit, '[ruby-dev:38760]') {test_proc.call}
end
def test_thread_signal_backtrace
stdout, stderr, status = EnvUtil.invoke_ruby("-d", <<-RUBY, false, true)
Thread.start do
begin
Process.kill(:INT, $$)
ensure
raise "in ensure"
end
end.join
RUBY
assert_not_match(/:0/, stderr, "[ruby-dev:39116]")
end
end