class RuboCop::Cop::RSpec::ReceiveCounts


expect(foo).to receive(:bar).at_most(:twice).times
expect(foo).to receive(:bar).at_most(:once)
expect(foo).to receive(:bar).at_least(:twice)
expect(foo).to receive(:bar).at_least(:once)
expect(foo).to receive(:bar).twice
expect(foo).to receive(:bar).once
# good
expect(foo).to receive(:bar).at_most(2).times
expect(foo).to receive(:bar).at_most(1).times
expect(foo).to receive(:bar).at_least(2).times
expect(foo).to receive(:bar).at_least(1).times
expect(foo).to receive(:bar).exactly(2).times
expect(foo).to receive(:bar).exactly(1).times
# bad
@example
Check for ‘once` and `twice` receive counts matchers usage.

def autocorrect(node)

def autocorrect(node)
  lambda do |corrector|
    replacement = matcher_for(
      node.method_name,
      node.first_argument.source.to_i
    )
    original = range(node.parent, node)
    corrector.replace(original, replacement)
  end
end

def matcher_for(method, count)

def matcher_for(method, count)
  matcher = count == 1 ? 'once' : 'twice'
  if method == :exactly
    ".#{matcher}"
  else
    ".#{method}(:#{matcher})"
  end
end

def message_for(node, source)

def message_for(node, source)
  alternative = matcher_for(
    node.method_name,
    node.first_argument.source.to_i
  )
  format(MSG, alternative: alternative, original: source)
end

def on_send(node)

def on_send(node)
  receive_counts(node) do |offending_node|
    return unless stub?(offending_node.receiver)
    offending_range = range(node, offending_node)
    add_offense(
      offending_node,
      message: message_for(offending_node, offending_range.source),
      location: offending_range
    )
  end
end

def range(node, offending_node)

def range(node, offending_node)
  offending_node.loc.dot.with(
    end_pos: node.loc.expression.end_pos
  )
end