class RSpec::Mocks::MessageExpectation

def actual_received_count_matters?

def actual_received_count_matters?
  @at_least || @at_most || @exactly
end

def advise(*args)

def advise(*args)
  similar_messages << args
end

def any_number_of_times(&block)

def any_number_of_times(&block)
  @method_block = block if block
  @expected_received_count = :any
  self
end

def at_least(n, &block)

def at_least(n, &block)
  @method_block = block if block
  set_expected_received_count :at_least, n
  self
end

def at_most(n, &block)

def at_most(n, &block)
  @method_block = block if block
  set_expected_received_count :at_most, n
  self
end

def clear_actual_received_count!

def clear_actual_received_count!
  @actual_received_count = 0
end

def exactly(n, &block)

def exactly(n, &block)
  @method_block = block if block
  set_expected_received_count :exactly, n
  self
end

def expected_messages_received?

def expected_messages_received?
  ignoring_args? || matches_exact_count? ||
     matches_at_least_count? || matches_at_most_count?
end

def generate_error

def generate_error
  if similar_messages.empty?
    @error_generator.raise_expectation_error(@sym, @expected_received_count, @actual_received_count, *@args_expectation.args)
  else
    @error_generator.raise_similar_message_args_error(self, *@similar_messages)
  end
end

def ignoring_args?

def ignoring_args?
  @expected_received_count == :any
end

def increase_actual_received_count!

def increase_actual_received_count!
  @actual_received_count += 1
end

def matches_at_least_count?

def matches_at_least_count?
  @at_least && @actual_received_count >= @expected_received_count
end

def matches_at_most_count?

def matches_at_most_count?
  @at_most && @actual_received_count <= @expected_received_count
end

def matches_exact_count?

def matches_exact_count?
  @expected_received_count == @actual_received_count
end

def matches_name_but_not_args(sym, *args)

def matches_name_but_not_args(sym, *args)
  @sym == sym and not @args_expectation.args_match?(*args)
end

def negative_expectation_for?(sym)

def negative_expectation_for?(sym)
  return false
end

def never

def never
  @expected_received_count = 0
  self
end

def once(&block)

def once(&block)
  @method_block = block if block
  set_expected_received_count :exactly, 1
  self
end

def ordered(&block)

def ordered(&block)
  @method_block = block if block
  @order_group.register(self)
  @ordered = true
  self
end

def set_expected_received_count(relativity, n)

def set_expected_received_count(relativity, n)
  @at_least = (relativity == :at_least)
  @at_most = (relativity == :at_most)
  @exactly = (relativity == :exactly)
  @expected_received_count = case n
    when Numeric
      n
    when :once
      1
    when :twice
      2
  end
end

def similar_messages

def similar_messages
  @similar_messages ||= []
end

def times(&block)

def times(&block)
  @method_block = block if block
  self
end

def twice(&block)

def twice(&block)
  @method_block = block if block
  set_expected_received_count :exactly, 2
  self
end

def verify_messages_received

def verify_messages_received
  return if expected_messages_received? || failed_fast?
  generate_error
rescue RSpec::Mocks::MockExpectationError => error
  error.backtrace.insert(0, @expected_from)
  Kernel::raise error
end

def with(*args, &block)

def with(*args, &block)
  @return_block = block if block_given? unless args.empty?
  @args_expectation = ArgumentExpectation.new(*args, &block)
  self
end