class RuboCop::Cop::RSpec::ImplicitBlockExpectation


end
expect { do_something }.to change(something).to(new_value)
it ‘changes something to a new value’ do
# good
it { is_expected.to change(something).to(new_value) }
subject { -> { do_something } }
# bad
@example
Prefer using explicit block expectations.
Check that implicit block expectation syntax is not used.

def find_subject(block_node)

def find_subject(block_node)
  block_node.body.child_nodes.find { |send_node| subject?(send_node) }
end

def multi_statement_example_group?(node)

def multi_statement_example_group?(node)
  example_group_with_body?(node) && node.body.begin_type?
end

def nearest_subject(node)

def nearest_subject(node)
  node
    .each_ancestor(:block)
    .lazy
    .select { |block_node| multi_statement_example_group?(block_node) }
    .map { |block_node| find_subject(block_node) }
    .find(&:itself)
end

def on_send(node)

def on_send(node)
  implicit_expect(node) do |implicit_expect|
    subject = nearest_subject(implicit_expect)
    add_offense(implicit_expect) if lambda_subject?(subject&.body)
  end
end