class RuboCop::Cop::RSpec::DescribedClass


end
subject { MyClass.do_something }
describe MyClass do
# good
end
subject { described_class.do_something }
describe MyClass do
# bad
@example ‘EnforcedStyle: explicit`
end
subject { described_class.do_something }
describe MyClass do
# good
end
subject { MyClass.do_something }
describe MyClass do
# bad
@example `EnforcedStyle: described_class`
This cop can be configured using the `EnforcedStyle` option
each example via described_class.
If the first argument of describe is a class, the class is exposed to
Checks that tests use `described_class`.

def autocorrect(node)

def autocorrect(node)
  replacement = if style == :described_class
                  DESCRIBED_CLASS
                else
                  @described_class.const_name
                end
  lambda do |corrector|
    corrector.replace(node.loc.expression, replacement)
  end
end

def find_usage(node, &block)

def find_usage(node, &block)
  yield(node) if offensive?(node)
  return if scope_change?(node) || node.const_type?
  node.each_child_node do |child|
    find_usage(child, &block)
  end
end

def message(offense)

def message(offense)
  if style == :described_class
    format(MSG, replacement: DESCRIBED_CLASS, src: offense)
  else
    format(MSG, replacement: @described_class.const_name,
                src: DESCRIBED_CLASS)
  end
end

def offensive?(node)

def offensive?(node)
  if style == :described_class
    node.eql?(@described_class)
  else
    node.send_type? && node.method_name == :described_class
  end
end

def on_block(node)

def on_block(node)
  # In case the explicit style is used, we needs to remember what's
  # being described. Thus, we use an ivar for @described_class.
  describe, @described_class, body = described_constant(node)
  return if body.nil?
  return unless top_level_describe?(describe)
  find_usage(body) do |match|
    add_offense(
      match,
      location: :expression,
      message: message(match.const_name)
    )
  end
end

def scope_change?(node)

def scope_change?(node)
  scope_changing_syntax?(node)          ||
    common_instance_exec_closure?(node) ||
    skippable_block?(node)
end

def skip_blocks?

def skip_blocks?
  cop_config['SkipBlocks'].equal?(true)
end

def skippable_block?(node)

def skippable_block?(node)
  node.block_type? && !rspec_block?(node) && skip_blocks?
end