require_relative '../../spec_helper'
require 'getoptlong'

describe "GetoptLong#set_options" do
  before :each do
    @opts = GetoptLong.new
  end

  it "allows setting command line options" do
    argv ["--size", "10k", "-v", "arg1", "arg2"] do
      @opts.set_options(
        ["--size", GetoptLong::REQUIRED_ARGUMENT],
        ["--verbose", "-v", GetoptLong::NO_ARGUMENT]
      )

      @opts.get.should == ["--size", "10k"]
      @opts.get.should == ["--verbose", ""]
      @opts.get.should == nil
    end
  end

  it "discards previously defined command line options" do
    argv ["--size", "10k", "-v", "arg1", "arg2"] do
      @opts.set_options(
        ["--size", GetoptLong::REQUIRED_ARGUMENT],
        ["--verbose", "-v", GetoptLong::NO_ARGUMENT]
      )

      @opts.set_options(
        ["-s", "--size", GetoptLong::REQUIRED_ARGUMENT],
        ["-v", GetoptLong::NO_ARGUMENT]
      )

      @opts.get.should == ["-s", "10k"]
      @opts.get.should == ["-v", ""]
      @opts.get.should == nil
    end
  end

  it "raises an ArgumentError if too many argument flags where given" do
    argv [] do
      -> {
        @opts.set_options(["--size", GetoptLong::NO_ARGUMENT, GetoptLong::REQUIRED_ARGUMENT])
      }.should raise_error(ArgumentError)
    end
  end

  it "raises a RuntimeError if processing has already started" do
    argv [] do
      @opts.get
      -> {
        @opts.set_options()
      }.should raise_error(RuntimeError)
    end
  end

  it "raises an ArgumentError if no argument flag was given" do
    argv [] do
      -> {
        @opts.set_options(["--size"])
      }.should raise_error(ArgumentError)
    end
  end

  it "raises an ArgumentError if one of the given arguments is not an Array" do
    argv [] do
      -> {
        @opts.set_options(
          ["--size", GetoptLong::REQUIRED_ARGUMENT],
          "test")
      }.should raise_error(ArgumentError)
    end
  end

  it "raises an ArgumentError if the same option is given twice" do
    argv [] do
      -> {
        @opts.set_options(
          ["--size", GetoptLong::NO_ARGUMENT],
          ["--size", GetoptLong::OPTIONAL_ARGUMENT])
      }.should raise_error(ArgumentError)

      -> {
        @opts.set_options(
          ["--size", GetoptLong::NO_ARGUMENT],
          ["-s", "--size", GetoptLong::OPTIONAL_ARGUMENT])
      }.should raise_error(ArgumentError)
    end
  end

  it "raises an ArgumentError if the given option is invalid" do
    argv [] do
      -> {
        @opts.set_options(["-size", GetoptLong::NO_ARGUMENT])
      }.should raise_error(ArgumentError)
    end
  end
end
