require 'spec_helper'

describe Launchy::Cli do

  before do
    @old_stderr = $stderr
    $stderr = StringIO.new

    @old_stdout = $stdout
    $stdout = StringIO.new
    Launchy.reset_global_options
  end

  after do
    Launchy.reset_global_options
    $stderr = @old_stderr
    $stdout = @old_stdout
  end

  def cli_test( argv, env, exit_val, stderr_regex, stdout_regex )
    begin
      Launchy::Cli.new.run( argv, env )
    rescue SystemExit => se
      _(se.status).must_equal exit_val
      _($stderr.string).must_match stderr_regex if stderr_regex
      _($stdout.string).must_match stdout_regex if stdout_regex
    end
  end

  it "exits 1 when invalid options are given" do
    cli_test( %w[ -z foo ], {}, 1, /invalid option/, nil )
  end

  %w[ -h --help ].each do |opt|
    it "output help and exits 0 when using #{opt}" do
      cli_test( [ opt ], {}, 0, nil, /Print this message/m )
    end
  end

  %w[ -v --version ].each do |opt|
    it "outputs version and exits 0 when using #{opt}" do
      cli_test( [ opt ], {}, 0, nil, /Launchy version/ )
    end
  end

  it "leaves the url on argv after parsing" do
    l = Launchy::Cli.new
    argv = %w[ --debug --dry-run http://github.com/copiousfreetime/launchy ]
    l.parse( argv , {} )
    _(argv.size).must_equal 1
    _(argv[0]).must_equal "http://github.com/copiousfreetime/launchy" 
  end

  it "prints the command on stdout when using --dry-run" do
   argv = %w[ --debug --dry-run http://github.com/copiousfreetime/launchy ]
   Launchy::Cli.new.good_run( argv, {} )
   _($stdout.string).must_match %r[github.com]
  end

  {
    '--application' => [ :application, 'Browser'],
    '--engine'      => [ :ruby_engine, 'rbx'],
    '--host-os'     => [ :host_os,     'cygwin'] }.each_pair do |opt, val|
    it "the commandline option #{opt} sets the program option #{val[0]}" do
      argv = [ opt, val[1], "http://github.com/copiousfreetime/launchy" ]
      l = Launchy::Cli.new
      rc = l.parse( argv, {} )
      _(rc).must_equal true
      _(argv.size).must_equal 1
      _(argv[0]).must_equal "http://github.com/copiousfreetime/launchy"
      _(l.options[val[0]]).must_equal val[1]
    end
  end
end
 
