2003-09-04 12:18:59 -04:00
|
|
|
require 'test/unit'
|
2008-05-14 08:52:17 -04:00
|
|
|
require_relative 'envutil'
|
2003-09-04 12:18:59 -04:00
|
|
|
|
|
|
|
class TestException < Test::Unit::TestCase
|
|
|
|
def test_exception
|
|
|
|
begin
|
|
|
|
raise "this must be handled"
|
|
|
|
assert(false)
|
|
|
|
rescue
|
|
|
|
assert(true)
|
|
|
|
end
|
2003-09-05 11:15:43 -04:00
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
$bad = true
|
|
|
|
begin
|
|
|
|
raise "this must be handled no.2"
|
|
|
|
rescue
|
|
|
|
if $bad
|
|
|
|
$bad = false
|
|
|
|
retry
|
|
|
|
assert(false)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
assert(true)
|
2003-09-05 11:15:43 -04:00
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
# exception in rescue clause
|
|
|
|
$string = "this must be handled no.3"
|
2008-09-24 13:44:39 -04:00
|
|
|
e = assert_raise(RuntimeError) do
|
2003-09-04 12:18:59 -04:00
|
|
|
begin
|
|
|
|
raise "exception in rescue clause"
|
2003-09-05 11:15:43 -04:00
|
|
|
rescue
|
2003-09-04 12:18:59 -04:00
|
|
|
raise $string
|
|
|
|
end
|
|
|
|
assert(false)
|
|
|
|
end
|
2003-09-05 11:15:43 -04:00
|
|
|
assert_equal($string, e.message)
|
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
# exception in ensure clause
|
2003-09-05 11:15:43 -04:00
|
|
|
$string = "exception in ensure clause"
|
2008-09-24 13:44:39 -04:00
|
|
|
e = assert_raise(RuntimeError) do
|
2003-09-04 12:18:59 -04:00
|
|
|
begin
|
|
|
|
raise "this must be handled no.4"
|
2003-09-05 11:15:43 -04:00
|
|
|
ensure
|
|
|
|
assert_instance_of(RuntimeError, $!)
|
|
|
|
assert_equal("this must be handled no.4", $!.message)
|
2003-09-04 12:18:59 -04:00
|
|
|
raise "exception in ensure clause"
|
|
|
|
end
|
|
|
|
assert(false)
|
|
|
|
end
|
2003-09-05 11:15:43 -04:00
|
|
|
assert_equal($string, e.message)
|
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
$bad = true
|
|
|
|
begin
|
|
|
|
begin
|
|
|
|
raise "this must be handled no.5"
|
|
|
|
ensure
|
|
|
|
$bad = false
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
end
|
|
|
|
assert(!$bad)
|
2003-09-05 11:15:43 -04:00
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
$bad = true
|
|
|
|
begin
|
|
|
|
begin
|
|
|
|
raise "this must be handled no.6"
|
|
|
|
ensure
|
|
|
|
$bad = false
|
|
|
|
end
|
|
|
|
rescue
|
|
|
|
end
|
|
|
|
assert(!$bad)
|
2003-09-05 11:15:43 -04:00
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
$bad = true
|
|
|
|
while true
|
|
|
|
begin
|
|
|
|
break
|
|
|
|
ensure
|
|
|
|
$bad = false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
assert(!$bad)
|
2003-09-05 11:15:43 -04:00
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
assert(catch(:foo) {
|
|
|
|
loop do
|
|
|
|
loop do
|
|
|
|
throw :foo, true
|
|
|
|
break
|
|
|
|
end
|
|
|
|
break
|
|
|
|
assert(false) # should no reach here
|
|
|
|
end
|
|
|
|
false
|
|
|
|
})
|
2003-09-05 11:15:43 -04:00
|
|
|
|
2003-09-04 12:18:59 -04:00
|
|
|
end
|
2003-10-04 14:06:19 -04:00
|
|
|
|
|
|
|
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
|
2008-05-14 08:52:17 -04:00
|
|
|
|
|
|
|
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
|
2008-07-15 11:26:04 -04:00
|
|
|
assert_in_out_err([], "p $@", %w(nil), [])
|
2008-05-14 08:52:17 -04:00
|
|
|
|
2008-07-15 11:26:04 -04:00
|
|
|
assert_in_out_err([], "$@ = 1", [], /\$! not set \(ArgumentError\)$/)
|
2008-05-14 08:52:17 -04:00
|
|
|
|
2008-07-15 11:26:04 -04:00
|
|
|
assert_in_out_err([], <<-INPUT, [], /backtrace must be Array of String \(TypeError\)$/)
|
|
|
|
begin
|
|
|
|
raise
|
|
|
|
rescue
|
|
|
|
$@ = 1
|
|
|
|
end
|
|
|
|
INPUT
|
2008-05-14 08:52:17 -04:00
|
|
|
|
2008-07-15 11:26:04 -04:00
|
|
|
assert_in_out_err([], <<-INPUT, [], /^foo: unhandled exception$/)
|
|
|
|
begin
|
|
|
|
raise
|
|
|
|
rescue
|
|
|
|
$@ = 'foo'
|
|
|
|
raise
|
|
|
|
end
|
|
|
|
INPUT
|
2008-05-14 08:52:17 -04:00
|
|
|
|
2008-07-15 11:26:04 -04:00
|
|
|
assert_in_out_err([], <<-INPUT, [], /^foo: unhandled exception\s+from bar\s+from baz$/)
|
|
|
|
begin
|
|
|
|
raise
|
|
|
|
rescue
|
|
|
|
$@ = %w(foo bar baz)
|
|
|
|
raise
|
|
|
|
end
|
|
|
|
INPUT
|
2008-05-14 08:52:17 -04:00
|
|
|
end
|
2009-07-16 05:28:12 -04:00
|
|
|
|
|
|
|
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
|
2010-01-05 05:34:00 -05:00
|
|
|
|
2010-01-27 09:25:19 -05:00
|
|
|
def test_thread_signal_location
|
2010-01-05 05:34:00 -05:00
|
|
|
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
|
2010-01-22 10:03:32 -05:00
|
|
|
|
|
|
|
def test_errinfo
|
|
|
|
begin
|
|
|
|
raise "foo"
|
|
|
|
assert(false)
|
|
|
|
rescue => e
|
|
|
|
assert_equal(e, $!)
|
|
|
|
1.times { assert_equal(e, $!) }
|
|
|
|
end
|
|
|
|
|
|
|
|
assert_equal(nil, $!)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_inspect
|
|
|
|
assert_equal("#<Exception: Exception>", Exception.new.inspect)
|
|
|
|
|
|
|
|
e = Class.new(Exception)
|
|
|
|
e.class_eval do
|
|
|
|
def to_s; ""; end
|
|
|
|
end
|
|
|
|
assert_equal(e.inspect, e.new.inspect)
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_set_backtrace
|
|
|
|
e = Exception.new
|
|
|
|
|
|
|
|
e.set_backtrace("foo")
|
|
|
|
assert_equal(["foo"], e.backtrace)
|
|
|
|
|
|
|
|
e.set_backtrace(%w(foo bar baz))
|
|
|
|
assert_equal(%w(foo bar baz), e.backtrace)
|
|
|
|
|
|
|
|
assert_raise(TypeError) { e.set_backtrace(1) }
|
|
|
|
assert_raise(TypeError) { e.set_backtrace([1]) }
|
|
|
|
end
|
|
|
|
|
|
|
|
def test_exit_success_p
|
|
|
|
begin
|
|
|
|
exit
|
|
|
|
rescue SystemExit => e
|
|
|
|
end
|
|
|
|
assert(e.success?)
|
|
|
|
|
|
|
|
begin
|
|
|
|
abort
|
|
|
|
rescue SystemExit => e
|
|
|
|
end
|
|
|
|
assert(!e.success?)
|
|
|
|
end
|
2010-05-04 05:51:27 -04:00
|
|
|
|
|
|
|
def test_nomethoderror
|
|
|
|
bug3237 = '[ruby-core:29948]'
|
|
|
|
str = "\u2600"
|
|
|
|
id = :"\u2604"
|
|
|
|
e = assert_raise(NoMethodError) {str.__send__(id)}
|
|
|
|
assert_equal("undefined method `#{id}' for #{str.inspect}:String", e.message, bug3237)
|
|
|
|
end
|
2003-09-04 12:18:59 -04:00
|
|
|
end
|