# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with this
# work for additional information regarding copyright ownership.  The ASF
# licenses this file to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
# License for the specific language governing permissions and limitations under
# the License.

require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helpers'))

describe Project, '.shell' do

  it 'should return the project\'s shell task' do
    define('foo')
    project('foo').shell.name.should eql('foo:shell')
  end

  it 'should return a ShellTask' do
    define('foo')
    project('foo').shell.should be_kind_of(Shell::ShellTask)
  end

  it 'should include compile and test.compile dependencies' do
    define('foo') do
      compile.using(:javac).with 'group:compile:jar:1.0'
      test.compile.using(:javac).with 'group:test:jar:1.0'
    end
    project('foo').shell.classpath.should include(artifact('group:compile:jar:1.0'))
    project('foo').shell.classpath.should include(artifact('group:test:jar:1.0'))
  end

  it 'should respond to using() and return self' do
    define 'foo' do
      shell.using(:foo=>'Fooing').should be(shell)
    end
  end

  it 'should respond to using() and accept options' do
    define 'foo' do
      shell.using :foo=>'Fooing'
    end
    project('foo').shell.options[:foo].should eql('Fooing')
  end

  it 'should select provider using shell.using' do
    define 'foo' do
      shell.using :bsh
    end
    project('foo').shell.provider.should be_a(Shell::BeanShell)
  end

  it 'should select runner based on compile language' do
    write 'src/main/java/Test.java', 'class Test {}'
    define 'foo' do
      # compile language detected as :java
    end
    project('foo').shell.provider.should be_a(Shell::BeanShell)
  end

  it 'should depend on project''s compile task' do
    define 'foo'
    project('foo').shell.prerequisites.should include(project('foo').compile)
  end

  it 'should be local task' do
    define 'foo' do
      define('bar') do
        shell.using :bsh
      end
    end
    task = project('foo:bar').shell
    task.should_receive(:invoke_prerequisites)
    task.should_receive(:run)
    in_original_dir(project('foo:bar').base_dir) { task('shell').invoke }
  end

  it 'should not recurse' do
    define 'foo' do
      shell.using :bsh
      define('bar') { shell.using :bsh }
    end
    project('foo:bar').shell.should_not_receive(:invoke_prerequisites)
    project('foo:bar').shell.should_not_receive(:run)
    project('foo').shell.should_receive(:run)
    project('foo').shell.invoke
  end

  it 'should call shell provider with task configuration' do
    define 'foo' do
      shell.using :bsh
    end
    shell = project('foo').shell
    shell.provider.should_receive(:launch).with(shell)
    project('foo').shell.invoke
  end
end

shared_examples_for "shell provider" do

  it 'should have launch method accepting shell task' do
    @instance.method(:launch).should_not be_nil
    @instance.method(:launch).arity.should === 1
  end

end

Shell.providers.each do |provider|
  describe provider do
    before do
      @provider = provider
      @project = define('foo') {}
      @instance = provider.new(@project)
      @project.shell.using @provider.to_sym
    end

    it_should_behave_like "shell provider"

    it 'should call Java::Commands.java with :java_args' do
      @project.shell.using :java_args => ["-Xx"]
      Java::Commands.should_receive(:java).with do |*args|
        args.last.should be_a(Hash)
        args.last.keys.should include(:java_args)
        args.last[:java_args].should include('-Xx')
      end
      project('foo').shell.invoke
    end

    it 'should call Java::Commands.java with :properties' do
      @project.shell.using :properties => {:foo => "bar"}
      Java::Commands.should_receive(:java).with do |*args|
        args.last.should be_a(Hash)
        args.last.keys.should include(:properties)
        args.last[:properties][:foo].should == "bar"
      end
      project('foo').shell.invoke
    end
  end
end
