module RuboCop::Cop::RSpec::InflectedHelper

def boolean_matcher?(node)

def boolean_matcher?(node)
  if cop_config['Strict']
    be_boolthy?(node)
  else
    be_bool?(node) || be_boolthy?(node)
  end
end

def check_inflected(node)

def check_inflected(node)
  predicate_in_actual?(node) do |predicate, to, matcher|
    msg = message_inflected(predicate)
    add_offense(node, message: msg) do |corrector|
      remove_predicate(corrector, predicate)
      corrector.replace(node.loc.selector,
                        true?(to, matcher) ? 'to' : 'not_to')
      rewrite_matcher(corrector, predicate, matcher)
    end
  end
end

def message_inflected(predicate)

def message_inflected(predicate)
  format(MSG_INFLECTED,
         predicate_name: predicate.method_name,
         matcher_name: to_predicate_matcher(predicate.method_name))
end

def predicate?(sym)

def predicate?(sym)
  sym.to_s.end_with?('?')
end

def remove_predicate(corrector, predicate)

def remove_predicate(corrector, predicate)
  range = predicate.loc.dot.with(
    end_pos: predicate.source_range.end_pos
  )
  corrector.remove(range)
  block_range = LocationHelp.block_with_whitespace(predicate)
  corrector.remove(block_range) if block_range
end

def rewrite_matcher(corrector, predicate, matcher)

def rewrite_matcher(corrector, predicate, matcher)
  args = LocationHelp.arguments_with_whitespace(predicate).source
  block_loc = LocationHelp.block_with_whitespace(predicate)
  block = block_loc ? block_loc.source : ''
  corrector.replace(
    matcher,
    to_predicate_matcher(predicate.method_name) + args + block
  )
end

def to_predicate_matcher(name)

rubocop:disable Metrics/MethodLength
def to_predicate_matcher(name)
  case name = name.to_s
  when 'is_a?'
    'be_a'
  when 'instance_of?'
    'be_an_instance_of'
  when 'include?', 'respond_to?'
    name[0..-2]
  when 'exist?', 'exists?'
    'exist'
  when /\Ahas_/
    name.sub('has_', 'have_')[0..-2]
  else
    "be_#{name[0..-2]}"
  end
end

def true?(to_symbol, matcher)

def true?(to_symbol, matcher)
  result = case matcher.method_name
           when :be, :eq
             matcher.first_argument.true_type?
           when :be_truthy, :a_truthy_value
             true
           when :be_falsey, :be_falsy, :a_falsey_value, :a_falsy_value
             false
           end
  to_symbol == :to ? result : !result
end