class Shoulda::Matchers::ActiveRecord::HaveDbIndexMatcher

@private

def correct_unique?

def correct_unique?
  return true unless @options.key?(:unique)
  is_unique = matched_index.unique
  is_unique = !is_unique unless @options[:unique]
  unless is_unique
    @missing = "#{table_name} has an index named #{matched_index.name} " <<
    "of unique #{matched_index.unique}, not #{@options[:unique]}."
  end
  is_unique
end

def description

def description
  if @options.key?(:unique)
    "have a #{index_type} index on columns #{@columns.join(' and ')}"
  else
    "have an index on columns #{@columns.join(' and ')}"
  end
end

def expectation

def expectation
  "#{model_class.name} to #{description}"
end

def failure_message

def failure_message
  "Expected #{expectation} (#{@missing})"
end

def failure_message_when_negated

def failure_message_when_negated
  "Did not expect #{expectation}"
end

def index_exists?

def index_exists?
  ! matched_index.nil?
end

def index_type

def index_type
  if @options[:unique]
    'unique'
  else
    'non-unique'
  end
end

def indexes

def indexes
  ::ActiveRecord::Base.connection.indexes(table_name)
end

def initialize(columns)

def initialize(columns)
  @columns = normalize_columns_to_array(columns)
  @options = {}
end

def matched_index

def matched_index
  indexes.detect { |each| each.columns == @columns }
end

def matches?(subject)

def matches?(subject)
  @subject = subject
  index_exists? && correct_unique?
end

def model_class

def model_class
  @subject.class
end

def normalize_columns_to_array(columns)

def normalize_columns_to_array(columns)
  Array.wrap(columns).map(&:to_s)
end

def table_name

def table_name
  model_class.table_name
end

def unique(unique = true)

def unique(unique = true)
  @options[:unique] = unique
  self
end