# 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.join(File.dirname(__FILE__), '../spec_helpers')
module EclipseHelper
def classpath_xml_elements
task('eclipse').invoke
REXML::Document.new(File.open('.classpath')).root.elements
end
def classpath_sources attribute='path'
classpath_xml_elements.collect("classpathentry[@kind='src']") { |n| n.attributes[attribute] }
end
#
def classpath_specific_output path
specific_output = classpath_xml_elements.collect("classpathentry[@path='#{path}']") { |n| n.attributes['output'] }
raise "expected: one output attribute for path '#{path}, got: #{specific_output.inspect}" if specific_output.length > 1
specific_output[0]
end
#
def classpath_default_output
default_output = classpath_xml_elements.collect("classpathentry[@kind='output']") { |n| n.attributes['path'] }
raise "expected: one path attribute for kind='output', got: #{default_output.inspect}" if default_output.length > 1
default_output[0]
end
def project_xml_elements
task('eclipse').invoke
REXML::Document.new(File.open('.project')).root.elements
end
end
describe Buildr::Eclipse do
include EclipseHelper
describe "eclipse's .project file" do
describe 'scala project' do
SCALA_NATURE = 'ch.epfl.lamp.sdt.core.scalanature'
JAVA_NATURE = 'org.eclipse.jdt.core.javanature'
SCALA_BUILDER = 'ch.epfl.lamp.sdt.core.scalabuilder'
JAVA_BUILDER = 'org.eclipse.jdt.core.javabuilder'
def project_natures
project_xml_elements.collect("natures/nature") { |n| n.text }
end
def build_commands
project_xml_elements.collect("buildSpec/buildCommand/name") { |n| n.text }
end
before do
write 'buildfile'
write 'src/main/scala/Main.scala'
end
it 'should have Scala nature before Java nature' do
define('foo')
project_natures.should include(SCALA_NATURE)
project_natures.should include(JAVA_NATURE)
project_natures.index(SCALA_NATURE).should < project_natures.index(JAVA_NATURE)
end
it 'should have Scala build command and no Java build command' do
define('foo')
build_commands.should include(SCALA_BUILDER)
build_commands.should_not include(JAVA_BUILDER)
end
end
end
describe "eclipse's .classpath file" do
describe 'scala project' do
SCALA_CONTAINER = 'ch.epfl.lamp.sdt.launching.SCALA_CONTAINER'
JAVA_CONTAINER = 'org.eclipse.jdt.launching.JRE_CONTAINER'
def classpath_containers attribute='path'
classpath_xml_elements.collect("classpathentry[@kind='con']") { |n| n.attributes[attribute] }
end
before do
write 'buildfile'
write 'src/main/scala/Main.scala'
end
it 'should have SCALA_CONTAINER before JRE_CONTAINER' do
define('foo')
classpath_containers.should include(SCALA_CONTAINER)
classpath_containers.should include(JAVA_CONTAINER)
classpath_containers.index(SCALA_CONTAINER).should < classpath_containers.index(JAVA_CONTAINER)
end
end
describe 'source folders' do
before do
write 'buildfile'
write 'src/main/java/Main.java'
write 'src/test/java/Test.java'
end
describe 'source', :shared=>true do
it 'should ignore CVS and SVN files' do
define('foo')
classpath_sources('excluding').each do |excluding_attribute|
excluding = excluding_attribute.split('|')
excluding.should include('**/.svn/')
excluding.should include('**/CVS/')
end
end
end
describe 'main code' do
it_should_behave_like 'source'
it 'should accept to come from the default directory' do
define('foo')
classpath_sources.should include('src/main/java')
end
it 'should accept to come from a user-defined directory' do
define('foo') { compile path_to('src/java') }
classpath_sources.should include('src/java')
end
it 'should accept a file task as a main source folder' do
define('foo') { compile apt }
classpath_sources.should include('target/generated/apt')
end
it 'should go to the default target directory' do
define('foo')
classpath_specific_output('src/main/java').should be(nil)
classpath_default_output.should == 'target/classes'
end
end
describe 'test code' do
it_should_behave_like 'source'
it 'should accept to come from the default directory' do
define('foo')
classpath_sources.should include('src/test/java')
end
it 'should accept to come from a user-defined directory' do
define('foo') { test.compile path_to('src/test') }
classpath_sources.should include('src/test')
end
it 'should go to the default target directory' do
define('foo')
classpath_specific_output('src/test/java').should == 'target/test/classes'
end
end
describe 'main resources' do
it_should_behave_like 'source'
before do
write 'src/main/resources/config.xml'
end
it 'should accept to come from the default directory' do
define('foo')
classpath_sources.should include('src/main/resources')
end
it 'should share a classpath entry if it comes from a directory with code' do
write 'src/main/java/config.properties'
define('foo') { resources.from('src/main/java').exclude('**/*.java') }
classpath_sources.select { |path| path == 'src/main/java'}.length.should == 1
end
it 'should go to the default target directory' do
define('foo')
classpath_specific_output('src/main/resources').should == 'target/resources'
end
end
describe 'test resources' do
it_should_behave_like 'source'
before do
write 'src/test/resources/config-test.xml'
end
it 'should accept to come from the default directory' do
define('foo')
classpath_sources.should include('src/test/resources')
end
it 'should share a classpath entry if it comes from a directory with code' do
write 'src/test/java/config-test.properties'
define('foo') { test.resources.from('src/test/java').exclude('**/*.java') }
classpath_sources.select { |path| path == 'src/test/java'}.length.should == 1
end
it 'should go to the default target directory' do
define('foo')
classpath_specific_output('src/test/resources').should == 'target/test/resources'
end
end
describe 'project depending on another project' do
it 'should have the underlying project in its classpath' do
mkdir 'bar'
define('myproject') {
project.version = '1.0'
define('foo') { package :jar }
define('bar') { compile.using(:javac).with project('foo'); }
}
task('eclipse').invoke
REXML::Document.new(File.open(File.join('bar', '.classpath'))).root.
elements.collect("classpathentry[@kind='src']") { |n| n.attributes['path'] }.should include('/myproject-foo')
end
end
end
end
end