class Spec::Matchers::RaiseError

:nodoc:

def actual_error

def actual_error
  @actual_error.nil? ? " but nothing was raised" : ", got #{@actual_error.inspect}"
end

def description

def description
  "raise #{expected_error}"
end

def eval_block

def eval_block
  @eval_block = true
  begin
    @block[@actual_error]
    @eval_block_passed = true
  rescue Exception => err
    @actual_error = err
  end
end

def expected_error

def expected_error
  case @expected_message
  when nil
    @expected_error
  when Regexp
    "#{@expected_error} with message matching #{@expected_message.inspect}"
  else
    "#{@expected_error} with #{@expected_message.inspect}"
  end
end

def failure_message

def failure_message
  if @eval_block
    return @actual_error.message
  else
    return "expected #{expected_error}#{actual_error}"
  end
end

def initialize(error_or_message=Exception, message=nil, &block)

:nodoc:
def initialize(error_or_message=Exception, message=nil, &block)
  @block = block
  case error_or_message
  when String, Regexp
    @expected_error, @expected_message = Exception, error_or_message
  else
    @expected_error, @expected_message = error_or_message, message
  end
end

def matches?(proc)

def matches?(proc)
  @raised_expected_error = false
  @with_expected_message = false
  @eval_block = false
  @eval_block_passed = false
  begin
    proc.call
  rescue @expected_error => @actual_error
    @raised_expected_error = true
    @with_expected_message = verify_message
  rescue Exception => @actual_error
    # This clause should be empty, but rcov will not report it as covered
    # unless something (anything) is executed within the clause
    rcov_error_report = "http://eigenclass.org/hiki.rb?rcov-0.8.0"
  end
  unless negative_expectation?
    eval_block if @raised_expected_error && @with_expected_message && @block
  end
ensure
  return (@raised_expected_error && @with_expected_message) ? (@eval_block ? @eval_block_passed : true) : false
end

def negative_expectation?

def negative_expectation?
  # YES - I'm a bad person... help me find a better way - ryand
  caller.first(3).find { |s| s =~ /should_not/ }
end

def negative_failure_message

def negative_failure_message
  "expected no #{expected_error}#{actual_error}"
end

def verify_message

def verify_message
  case @expected_message
  when nil
    return true
  when Regexp
    return @expected_message =~ @actual_error.message
  else
    return @expected_message == @actual_error.message
  end
end