<?xml version="1.0" encoding="UTF-8"?>

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

<!--
   Compiles and runs unit tests against distribution jar(s).  Use .antrc or the 
   command line to control the jdk used to execute this build file.  
   
   Assumes that the distribution jar to be tested is in the basedir/lib, along
   with any dependent jars (junit, hamcrest). Use the "libdir" property to specify
   the path to the directory containing these jars. 
   
   The default target, "test," executes clean as a dependency.
-->
  
<project default="test" name="commons-math" basedir=".">
  <property name="libdir" value="lib"/>
  <property name="testclassesdir" value="target/test-classes"/>
  <property name="testreportdir" value="target/test-reports"/>
  <property name="defaulttargetdir" value="target"/>
  <property name="test.resources" value="src/test/resources"/>
  <property name="build.home" value="target"/>
  <path id="build.classpath">
    <fileset dir="${libdir}">
      <include name="*.jar" />
    </fileset>
  </path>
  <target name="clean" description="o Clean up the generated directories">
    <delete dir="${defaulttargetdir}"/>
  </target>
  <target name="init" description="o Initializes some properties">
    <echo>
    JAVA ENVIRONMENT
    **************************Java runtime version*****************************
    ${java.runtime.version}
    **************************Java class path**********************************
    ${java.class.path}
    **************************Java home****************************************
    ${java.home}
     *************************Java library path*******************************
    Java library path: ${java.library.path}
    ===========================================================================
    </echo>
  </target>
  <target name="test" description="o Run the test cases" if="test.failure" depends="internal-test">
    <fail message="There were test failures.">
    </fail>
  </target>
  <target name="internal-test" depends="clean,compile-tests">
    <mkdir dir="${testreportdir}"/>
    <junit dir="./" failureproperty="test.failure" printSummary="yes"
           fork="true" haltonerror="true" showOutput="true">
      <sysproperty key="basedir" value="."/>
      <formatter type="brief"/>
      <classpath>
        <path refid="build.classpath"/>
        <pathelement path="${testclassesdir}"/>
      </classpath>
      <batchtest todir="${testreportdir}">
        <fileset dir="src/test/java">
          <include name="**/*Test.java"/>
          <exclude name="**/*AbstractTest.java"/>
        </fileset>
      </batchtest>
    </junit>
  </target>
  <target name="compile-tests" >
    <mkdir dir="${testclassesdir}"/>
    <javac destdir="${testclassesdir}" deprecation="true" debug="true"
            optimize="false" excludes="**/package.html">
      <src>
        <pathelement location="src/test"/>
      </src>
      <classpath>
        <path refid="build.classpath"/>
      </classpath>
    </javac>
	<copy todir="${build.home}/test-classes">
	  <fileset dir="${test.resources}">
      </fileset>
	</copy>
  </target>
</project>

