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     = if RUBY_VERSION < '1.9'
                    subject.send(actual.to_sym)
                  else
                    subject.public_send(actual.to_sym)
                  end
    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