class RuboCop::Cop::RSpec::RepeatedIncludeExample


end
it_should_behave_like ‘a goose’
it_should_behave_like ‘a duck’
context ‘foo’ do
# good
end
it_behaves_like ‘a cool’, ‘person’
it_behaves_like ‘a cool’, ‘thing’
describe ‘foo’ do
# good
end
include_examples ‘cool stuff’
describe ‘bar’ do
end
include_examples ‘cool stuff’
describe ‘foo’ do
# good
end
it_should_behave_like ‘a duck’
it_should_behave_like ‘a duck’
context ‘foo’ do
# bad
end
it_behaves_like ‘a cool’, ‘thing’
it_behaves_like ‘a cool’, ‘thing’
describe ‘foo’ do
# bad
end
include_examples ‘cool stuff’
include_examples ‘cool stuff’
describe ‘foo’ do
# bad
@example
Check for repeated include of shared examples.

def add_repeated_lines(items)

def add_repeated_lines(items)
  repeated_lines = items.map(&:first_line)
  items.map { |item| [item, repeated_lines - [item.first_line]] }
end

def literal_include_examples?(node)

def literal_include_examples?(node)
  include_examples?(node) &&
    node.arguments.all?(&:recursive_literal_or_const?)
end

def message(item, repeats)

def message(item, repeats)
  format(MSG, name: shared_examples_name(item).source, repeat: repeats)
end

def on_begin(node)

def on_begin(node)
  return unless several_include_examples?(node)
  repeated_include_examples(node).each do |item, repeats|
    add_offense(item, message: message(item, repeats))
  end
end

def repeated_include_examples(node)

def repeated_include_examples(node)
  node
    .children
    .select { |child| literal_include_examples?(child) }
    .group_by { |child| signature_keys(child) }
    .values
    .reject(&:one?)
    .flat_map { |items| add_repeated_lines(items) }
end

def signature_keys(item)

def signature_keys(item)
  item.arguments
end