def run(result)
begin
@_result = result
@internal_data.test_started
yield(STARTED, name)
yield(STARTED_OBJECT, self)
processed_exception_in_setup = false
begin
catch do |tag|
run_setup do
begin
run_test
run_cleanup
add_pass
rescue Exception
@internal_data.interrupted
unless handle_exception($!)
processed_exception_in_setup = true
raise
end
throw(tag)
end
end
end
rescue Exception
if processed_exception_in_setup
raise
else
@internal_data.interrupted
raise unless handle_exception($!)
end
ensure
begin
run_teardown
rescue Exception
raise unless handle_exception($!)
end
end
@internal_data.test_finished
result.add_run
yield(FINISHED, name)
yield(FINISHED_OBJECT, self)
ensure
end
end