1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/ruby/language/fixtures/rescue_captures.rb
2020-06-27 15:51:37 +02:00

107 lines
1.9 KiB
Ruby

module RescueSpecs
class Captor
attr_accessor :captured_error
def self.should_capture_exception
captor = new
captor.capture('some text').should == :caught # Ensure rescue body still runs
captor.captured_error.message.should == 'some text'
end
end
class ClassVariableCaptor < Captor
def capture(msg)
raise msg
rescue => @@captured_error
:caught
end
def captured_error
self.class.remove_class_variable(:@@captured_error)
end
end
class ConstantCaptor < Captor
# Using lambda gets around the dynamic constant assignment warning
CAPTURE = -> msg {
begin
raise msg
rescue => CapturedError
:caught
end
}
def capture(msg)
CAPTURE.call(msg)
end
def captured_error
self.class.send(:remove_const, :CapturedError)
end
end
class GlobalVariableCaptor < Captor
def capture(msg)
raise msg
rescue => $captured_error
:caught
end
def captured_error
$captured_error.tap do
$captured_error = nil # Can't remove globals, only nil them out
end
end
end
class InstanceVariableCaptor < Captor
def capture(msg)
raise msg
rescue => @captured_error
:caught
end
end
class LocalVariableCaptor < Captor
def capture(msg)
raise msg
rescue => captured_error
@captured_error = captured_error
:caught
end
end
class SafeNavigationSetterCaptor < Captor
def capture(msg)
raise msg
rescue => self&.captured_error
:caught
end
end
class SetterCaptor < Captor
def capture(msg)
raise msg
rescue => self.captured_error
:caught
end
end
class SquareBracketsCaptor < Captor
def capture(msg)
@hash = {}
raise msg
rescue => self[:error]
:caught
end
def []=(key, value)
@hash[key] = value
end
def captured_error
@hash[:error]
end
end
end