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