diff options
Diffstat (limited to 'spec/mspec/lib/mspec/matchers/raise_error.rb')
-rw-r--r-- | spec/mspec/lib/mspec/matchers/raise_error.rb | 79 |
1 files changed, 79 insertions, 0 deletions
diff --git a/spec/mspec/lib/mspec/matchers/raise_error.rb b/spec/mspec/lib/mspec/matchers/raise_error.rb new file mode 100644 index 0000000000..a5d6e01ec9 --- /dev/null +++ b/spec/mspec/lib/mspec/matchers/raise_error.rb @@ -0,0 +1,79 @@ +require 'mspec/utils/deprecate' + +class RaiseErrorMatcher + def initialize(exception, message, &block) + @exception = exception + @message = message + @block = block + end + + def matches?(proc) + @result = proc.call + return false + rescue Exception => @actual + if matching_exception?(@actual) + 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 + + # The block has its own expectations and will throw an exception if it fails + @block[exc] if @block + + 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 then + message << "but got #{format_exception(@actual)}" + else + message << "but no exception was raised (#{@result.pretty_inspect.chomp} 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 + +class Object + def raise_error(exception=Exception, message=nil, &block) + RaiseErrorMatcher.new(exception, message, &block) + end +end |