RSpec::Matchers.define :be_valid_option do |_|
  match do |actual|
    subject.option?(actual)
  end

  failure_message do |actual|
    format('expected that "%s" is a valid option', actual)
  end

  failure_message_when_negated do |actual|
    format('expected that "%s" is not a valid option', actual)
  end
end

RSpec::Matchers.define :have_option_value do |expected|
  match do |actual|
    @old_actual = actual
    @actual     = subject.public_send(actual.to_sym)
    values_match? expected, @actual
  end

  diffable

  failure_message do |_actual|
    format(%(expected that option "%s" has value "%s"), @old_actual, expected)
  end

  failure_message_when_negated do |_actual|
    format(%(expected that option "%s" does not have value "%s"), @old_actual, expected)
  end
end
