require "spec_helper"

describe(Mercenary::Command) do

  context "a basic command" do
    let(:command) { Mercenary::Command.new(:my_name) }
    let(:parent)  { Mercenary::Command.new(:my_parent) }
    let(:with_sub) do
      c = Mercenary::Command.new(:i_have_subcommand)
      add_sub.call(c)
      c
    end
    let(:command_with_parent) do
      Mercenary::Command.new(
        :i_have_parent,
        parent
      )
    end
    let(:add_sub) do
      Proc.new do |c|
        c.command(:sub_command) { |p| }
      end
    end

    it "can be created with just a name" do
      expect(command.name).to eql(:my_name)
    end

    it "can hold a parent command" do
      expect(command_with_parent.parent).to eql(parent)
    end

    it "can create subcommands" do
      expect(add_sub.call(command)).to be_a(Mercenary::Command)
      expect(add_sub.call(command).parent).to eq(command)
    end

    it "can set its version" do
      version = "1.4.2"
      command.version version
      expect(command.version).to eq(version)
    end

    it "can set its syntax" do
      syntax_string = "my_name [options]"
      cmd = described_class.new(:my_name)
      cmd.syntax syntax_string
      expect(cmd.syntax).to eq(syntax_string)
    end

    it "can set its description" do
      desc = "run all the things"
      command.description desc
      expect(command.description).to eq(desc)
    end

    it "can set its options" do
      name = "show_drafts"
      opts  = ['--drafts', 'Render posts in the _drafts folder']
      option = Mercenary::Option.new(name, opts)
      command.option name, *opts
      expect(command.options).to eql([option])
      expect(command.map.values).to include(name)
    end

    it "knows its full name" do
      expect(command_with_parent.full_name).to eql("my_parent i_have_parent")
    end

    it "knows its identity" do
      command_with_parent.version '1.8.7'
      expect(command_with_parent.identity).to eql("my_parent i_have_parent 1.8.7")
    end

    it "raises an ArgumentError if I specify a default_command that isn't there" do
      c = command # some weird NameError with the block below?
      expect { c.default_command(:nope) }.to raise_error(ArgumentError)
    end

    it "sets the default_command" do
      expect(with_sub.default_command(:sub_command).name).to eq(:sub_command)
    end

    context "with an alias" do
      before(:each) do
        command_with_parent.alias(:an_alias)
      end
      it "shows the alias in the summary" do
        expect(command_with_parent.summarize).to eql("  i_have_parent, an_alias  ")
      end

      it "its names_and_aliases method reports both the name and alias" do
        expect(command_with_parent.names_and_aliases).to eql("i_have_parent, an_alias")
      end
    end
  end

end
