mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
80 lines
1.8 KiB
Ruby
80 lines
1.8 KiB
Ruby
class RaiseErrorMatcher
|
|
def initialize(exception, message, &block)
|
|
@exception = exception
|
|
@message = message
|
|
@block = block
|
|
@actual = nil
|
|
end
|
|
|
|
def matches?(proc)
|
|
@result = proc.call
|
|
return false
|
|
rescue Exception => actual
|
|
@actual = actual
|
|
if matching_exception?(actual)
|
|
# The block has its own expectations and will throw an exception if it fails
|
|
@block[actual] if @block
|
|
|
|
return true
|
|
else
|
|
raise actual
|
|
end
|
|
end
|
|
|
|
def matching_exception?(exc)
|
|
return false unless @exception === exc
|
|
|
|
if @message then
|
|
case @message
|
|
when String
|
|
return false if @message != exc.message
|
|
when Regexp
|
|
return false if @message !~ exc.message
|
|
end
|
|
end
|
|
|
|
return true
|
|
end
|
|
|
|
def exception_class_and_message(exception_class, message)
|
|
if message
|
|
"#{exception_class} (#{message})"
|
|
else
|
|
"#{exception_class}"
|
|
end
|
|
end
|
|
|
|
def format_expected_exception
|
|
exception_class_and_message(@exception, @message)
|
|
end
|
|
|
|
def format_exception(exception)
|
|
exception_class_and_message(exception.class, exception.message)
|
|
end
|
|
|
|
def failure_message
|
|
message = ["Expected #{format_expected_exception}"]
|
|
|
|
if @actual
|
|
message << "but got #{format_exception(@actual)}"
|
|
else
|
|
message << "but no exception was raised (#{MSpec.format(@result)} was returned)"
|
|
end
|
|
|
|
message
|
|
end
|
|
|
|
def negative_failure_message
|
|
message = ["Expected to not get #{format_expected_exception}", ""]
|
|
unless @actual.class == @exception
|
|
message[1] = "but got #{format_exception(@actual)}"
|
|
end
|
|
message
|
|
end
|
|
end
|
|
|
|
module MSpecMatchers
|
|
private def raise_error(exception=Exception, message=nil, &block)
|
|
RaiseErrorMatcher.new(exception, message, &block)
|
|
end
|
|
end
|