require File.expand_path(File.dirname(__FILE__) + '/../../test_helper')

describe ::Inch::CLI::CommandParser do
  before do
    Dir.chdir fixture_path(:ruby, :simple)
    @command_parser = ::Inch::CLI::CommandParser
  end

  it 'should run without args' do
    out, err = capture_io do
      @command = @command_parser.run
    end
    refute out.empty?, 'there should be some output'
    assert err.empty?, 'there should be no errors'
    assert_equal ::Inch::CLI::Command::Suggest, @command.class
  end

  it 'should run Command::Suggest with filelist in args' do
    out, err = capture_io do
      @command = @command_parser.run('suggest', 'lib/**/*.rb', 'app/**/*.rb')
    end
    refute out.empty?, 'there should be some output'
    assert err.empty?, 'there should be no errors'
    assert_equal ::Inch::CLI::Command::Suggest, @command.class
  end

  it 'should run Command::Suggest with only filelist in args' do
    out, err = capture_io do
      @command = @command_parser.run('lib/**/*.rb', 'app/**/*.rb')
    end
    refute out.empty?, 'there should be some output'
    assert err.empty?, 'there should be no errors'
    assert_equal ::Inch::CLI::Command::Suggest, @command.class
  end

  it 'should run Command::Suggest with only switches in args' do
    out, err = capture_io do
      @command = @command_parser.run('--no-color')
    end
    refute out.empty?, 'there should be some output'
    assert err.empty?, 'there should be no errors'
    assert_equal ::Inch::CLI::Command::Suggest, @command.class
  end

  it 'should run Command::List with filelist in args' do
    out, err = capture_io do
      @command = @command_parser.run('list', 'lib/**/*.rb', 'app/**/*.rb')
    end
    refute out.empty?, 'there should be some output'
    assert err.empty?, 'there should be no errors'
    assert_equal ::Inch::CLI::Command::List, @command.class
  end

  it 'should run Command::Show with filelist in args' do
    out, err = capture_io do
      @command = @command_parser.run('show', 'Foo')
    end
    refute out.empty?, 'there should be some output'
    assert err.empty?, 'there should be no errors'
    assert_equal ::Inch::CLI::Command::Show, @command.class
  end

  it 'should output info when run with --help' do
    out, err = capture_io do
      @command = @command_parser.run('--help')
    end
    refute out.empty?, 'there should be some output'
    assert_match(/\bUsage\b.+inch/, out)
    assert err.empty?, 'there should be no errors'
  end
end