#
# 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.
#

# $Id$

# The location of the "junit.jar" JAR file
junit.jar = ${junit.home}/junit-4.11.jar

# The location of the "junit.jar" JAR file
hamcrest.jar = ${hamcrest.home}/hamcrest-core-1.3.jar

# The location of the Easymock jar
easymock.jar = ${easymock.home}/easymock-3.2.jar

# Whether or not to fork tests
junit.fork = true

# The name of this component
component.name = commons-collections4

# The primary package name of this component
component.package = org.apache.commons.collections4

# The title of this component
component.title = Commons Collections

# The current version number of this component
component.version = 4.1

# The name that is used to create the jar file
final.name = ${component.name}-${component.version}

# The base directory for compilation targets
build.home = target

# The base directory for component configuration files
conf.home = src/conf

# The base directory for component sources
source.home = src/main/java

# The base directory for unit test sources
test.home = src/test/java

# Should Java compilations set the 'debug' compiler option?
compile.debug = true

# Should Java compilations set the 'deprecation' compiler option?
compile.deprecation = true

# Should Java compilations set the 'optimize' compiler option?
compile.optimize = true

# Generate class files for specific VM version (e.g., 1.1 or 1.2). 
# Note that the default value depends on the JVM that is running Ant. 
# In particular, if you use JDK 1.4+ the generated classes will not be usable
# for a 1.1 Java VM unless you explicitly set this attribute to the value 1.1 
# (which is the default value for JDK 1.1 to 1.3).
compile.target = 1.6

# Specifies the source version for the Java compiler.
# Corresponds to the source attribute for the ant javac task. 
# Valid values are 1.3, 1.4, 1.5. 
compile.source = 1.6

# Specifies the source encoding.
compile.encoding = ISO-8859-1

# Should all tests fail if one does?
test.failonerror = true

# The test runner to execute
test.runner = junit.textui.TestRunner
