<?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 base directory. 
   Use the "jardir" property to specify the path to the directory containing
   the jar. Any other jars in this directory will also be added to the
   classpath.  
   
   The default target, "test," executes clean as a dependency.
-->
  
<project default="test" name="commons-math" basedir=".">
  <property name="defaulttargetdir" value="target"/>
  <property name="libdir" value="target/lib"/>
  <property name="testclassesdir" value="target/test-classes"/>
  <property name="testreportdir" value="target/test-reports"/>
  <property name="defaulttargetdir" value="target"/>
  <property name="jardir" value="${basedir}"/>
   <path id="build.classpath">
    <fileset dir="${libdir}">
      <include name="**/*.jar">
      </include>
    </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>
    <mkdir dir="${libdir}" />
    <condition property="noget">
      <equals arg2="only" arg1="${build.sysclasspath}">
      </equals>
    </condition>
    <!--Test if JUNIT is present in ANT classpath-->
    <available property="Junit.present" classname="junit.framework.Test">
    </available>
  </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" if="Junit.present" depends="clean, junit-present,compile-tests">
    <mkdir dir="${testreportdir}"/>
    <junit dir="./" failureproperty="test.failure" printSummary="yes" fork="true" haltonerror="true">
      <sysproperty key="basedir" value="."/>
      <formatter usefile="false" type="plain"/>
      <classpath>
        <path refid="build.classpath"/>
        <pathelement path="${testclassesdir}"/>
      </classpath>
      <batchtest todir="${testreportdir}">
        <fileset dir="src/test">
          <include name="**/*Test.java"/>
          <exclude name="**/*AbstractTest.java"/>
        </fileset>
      </batchtest>
    </junit>
  </target>
  <target name="junit-present" unless="Junit.present" depends="init">
  <echo>
    ================================= WARNING ================================
    Junit isn't present in your ${ANT_HOME}/lib directory. Tests not executed.
    ==========================================================================
  </echo>
  </target>
  <target name="compile-tests" if="Junit.present" depends="junit-present">
    <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="${testclassesdir}">
      <fileset dir="src/test">
        <include name="**/*.xml"/>
        <include name="**/*.txt"/>
      </fileset>
    </copy>
  </target>
</project>