# 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__), 'test_coverage_helper'))
if ENV_JAVA['java.version'] < "1.7"

Sandbox.require_optional_extension 'buildr/java/emma'
artifacts(Buildr::Emma::dependencies).map(&:invoke)


describe Buildr::Emma do
  include TestCoverageHelper

  before do
    # Reloading the extension because the sandbox removes all its actions
    Buildr.module_eval { remove_const :Emma }
    load File.expand_path('../lib/buildr/java/emma.rb')
    @tool_module = Buildr::Emma
  end

  it_should_behave_like 'test coverage tool'

  describe 'project-specific' do
    describe 'metadata file' do
      it 'should have a default value' do
        define('foo').emma.metadata_file.should point_to_path('reports/emma/coverage.em')
      end

      it 'should be overridable' do
        define('foo') { emma.metadata_file = path_to('target/metadata.emma') }
        project('foo').emma.metadata_file.should point_to_path('target/metadata.emma')
      end

      it 'should be created during instrumentation' do
        write 'src/main/java/Foo.java', 'public class Foo {}'
        define('foo')
        task('foo:emma:instrument').invoke
        file(project('foo').emma.metadata_file).should exist
      end
    end

    describe 'coverage file' do
      it 'should have a default value' do
        define('foo').emma.coverage_file.should point_to_path('reports/emma/coverage.ec')
      end

      it 'should be overridable' do
        define('foo') { emma.coverage_file = path_to('target/coverage.emma') }
        project('foo').emma.coverage_file.should point_to_path('target/coverage.emma')
      end

      it 'should be created during test' do
        write 'src/main/java/Foo.java', 'public class Foo {}'
        write_test :for=>'Foo', :in=>'src/test/java'
        define('foo')
        task('foo:test').invoke
        file(project('foo').emma.coverage_file).should exist
      end
    end

    describe 'instrumentation' do
      before do
        ['Foo', 'Bar'].each { |cls| write File.join('src/main/java', "#{cls}.java"), "public class #{cls} {}" }
      end

      it 'should instrument only included classes' do
        define('foo') { emma.include 'Foo' }
        task("foo:emma:instrument").invoke
        Dir.chdir('target/instrumented/classes') { Dir.glob('*').sort.should == ['Foo.class'] }
      end

      it 'should not instrument excluded classes' do
        define('foo') { emma.exclude 'Foo' }
        task("foo:emma:instrument").invoke
        Dir.chdir('target/instrumented/classes') { Dir.glob('*').sort.should == ['Bar.class'] }
      end

      it 'should instrument classes that are included but not excluded' do
        write 'src/main/java/Baz.java', 'public class Baz {}'
        define('foo') { emma.include('Ba*').exclude('*ar') }
        task("foo:emma:instrument").invoke
        Dir.chdir('target/instrumented/classes') { Dir.glob('*').sort.should == ['Baz.class'] }
      end
    end

    describe 'reports' do
      before do
        write 'src/main/java/Foo.java', 'public class Foo {}'
        write_test :for=>'Foo', :in=>'src/test/java'
      end

      describe 'in html' do
        it 'should inform the user if no coverage data' do
          rm 'src/test/java/FooTest.java'
          define('foo')
          lambda { task('foo:emma:html').invoke }.
            should show_info(/No test coverage report for foo. Missing: #{project('foo').emma.coverage_file}/)
        end
      end

      describe 'in xml' do
        it 'should have an xml file' do
          define('foo')
          task('foo:emma:xml').invoke
          file(File.join(project('foo').emma.report_dir, 'coverage.xml')).should exist
        end
      end
    end
  end
end

end
