<?xml version="1.0"?>
<project name="projunittest" default="build" basedir=".">
    <!--
      Sample Ant build.xml file for performing Unit Testing and generating Unit Test reports.
    -->

    <taskdef resource="net/sf/antcontrib/antcontrib.properties"/>

    <!--
    Support overriding of user specific build.properties if ${build.environment}/build.properties exists.
    -->
    <if>
        <available file="${basedir}/build-config/${build.environment}/build.properties" type="file" />
        <then>
            <echo message="build.environment=${build.environment}" />
            <property name="build.config.dir" value="${basedir}/build-config/${build.environment}" />
        </then>
        <else>
            <property name="build.config.dir" value="${basedir}/build-config/${user.name}" />
        </else>
    </if>
    <property name="build.config.properties" value="${build.config.dir}/build.properties" />
    <echo message="Settings in ${build.config.properties} will take precedence" />
    <property file="${build.config.properties}" />

    <property file="${basedir}/build-config/build.properties" />

    <property name="build.dir" value="${basedir}/build" />
    <property name="build.classes" value="${build.dir}/classes" />
    <property name="test.dir" value="${build.dir}/test" />
    <property name="testresult.dir" value="${build.dir}/testResult" />      
    <property name="deployment.dir" value="${build.dir}/deployment" />
    <property name="deployment.jar_filename" value="${deployment.dir}/projunittest.jar" />

    <!--
    Setup classpaths
    -->
    <fileset id="oracle.classpath" dir="${oracle.home}/jdbc/lib">
        <include name="**/ojdbc14.jar" />
    </fileset>

    <fileset id="projunittest.libraries" dir="${basedir}/lib">
        <include name="**/*.jar" />
    </fileset>

    <path id="build.classpath">
        <fileset refid="oracle.classpath" />
        <fileset refid="projunittest.libraries" />
    </path>

    <!--
    Configure junit
    -->
    <path id="junit.classpath">
        <fileset dir="${junit.home}">
            <include name="**/junit.jar" />
        </fileset>
    </path>

    <!--
    Build's targets
    -->
    <target name="build"
        description="Clean, compile, and create jar file"
        depends="clean, compile, dist-jar" />

    <target name="clean" description="Remove classes and build directories">
        <delete dir="${build.dir}" />
    </target>

    <target name="prepare" description="Prepare the output directories">
        <mkdir dir="${build.dir}" />
        <mkdir dir="${build.classes}" />
        <mkdir dir="${deployment.dir}" />
                <mkdir dir="${test.dir}" />
                <mkdir dir="${testresult.dir}" />
    </target>

    <target name="compile" description="Compile all java files" depends="prepare">
        <javac srcdir="${basedir}/src"
            destdir="${build.classes}"
            source="${javac.source}"
            debug="${javac.debug}"
            deprecation="${javac.deprecation}"
            optimize="${javac.optimize}"
            verbose="${javac.verbose}">
            <classpath refid="build.classpath"/>
        </javac>
    </target>
        
    <target name="dist-jar" description="Build the projunittest.jar" depends="compile">
        <jar destfile="${deployment.jar_filename}"
            basedir="${build.classes}"
            update="true">
            <manifest>
                <attribute name="Built-By" value="${user.name}" />
                <attribute name="Specification-Title" value="${spec.title}" />
                <attribute name="Implementation-Title" value="${impl.title}" />
                <attribute name="Specification-Vendor" value="${spec.vendor}" />
                <attribute name="Implementation-Vendor" value="${impl.vendor}" />
                <attribute name="Specification-Version" value="${spec.version}" />
                <attribute name="Implementation-Version" value="${impl.version} (built on ${TODAY})" />
            </manifest>
        </jar>
    </target>

    <target name="compile-junit_test" description="Compile JUnit tests" depends="clean, compile">
        <javac srcdir="${basedir}/test"
            destdir="${test.dir}"
            source="${javac.source}"
            debug="${javac.debug}"
            deprecation="${javac.deprecation}"
            optimize="${javac.optimize}">
            <classpath refid="build.classpath"/>
            <classpath refid="junit.classpath" />
            <classpath><pathelement location="${build.classes}" /></classpath>
        </javac>
    </target>

    <target name="run-junit_tests" description="Compile and run junit tests" depends="compile-junit_test">
        <junit haltonfailure="no" printsummary="on">
            <classpath refid="build.classpath" />
            <classpath refid="junit.classpath" />
            <classpath><pathelement location="${build.classes}" /></classpath>            
            <classpath><pathelement location="${test.dir}" /></classpath>

            <!-- Set any required system properties here. -->
            <sysproperty key="projunittest.properties.file" value="${build.config.dir}/projunittest.properties"/>

            <formatter type="brief" usefile="false"/>
            <formatter type="xml" />
            <batchtest todir="${testresult.dir}" >
                <fileset dir="${test.dir}" includes="**/*TestSuite.class"/>
            </batchtest>
        </junit>
    </target>

    <target name="report-junit_tests" description="Generate unit test reports" depends="run-junit_tests">
        <junitreport todir="${testresult.dir}">
            <fileset dir="${testresult.dir}">
                <include name="TEST-*.xml"/>
            </fileset>
            <report format="noframes" todir="${testresult.dir}"/>
        </junitreport>
    </target>
</project>