1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/spec/mspec/lib/mspec/matchers/raise_error.rb
2019-09-29 16:03:47 +02:00

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