<project name="testng" default="dev" basedir="." xmlns:ivy="antlib:org.apache.ivy.ant">
  
  <!-- ====================================================================== -->
  <!-- TestNG build file                                                      -->
  <!-- Created cbeust, April 26th, 2004                                       -->
  <!-- ====================================================================== -->

  <property file="build.properties" />
  <property name="optimize" value="false" />

  <!-- ====================================================================== -->
  <!-- PREPARE                                                                -->
  <!-- ====================================================================== -->
  <target name="prepare" depends="retrieve-dependencies"
          description="Performs all preparations required to build.">
    <tstamp />
    <mkdir dir="${build.dir}" />
    <mkdir dir="${other.jars.dir}" />
  </target>

  <!-- ====================================================================== -->
  <!-- DUMP                                                                   -->
  <!-- ====================================================================== -->
  <target name="dump" description="Dumps all properties." depends="prepare">
    <echoproperties />
  </target>

	<!-- ====================================================================== -->
  <!-- VALIDATE                                                               -->
  <!-- ====================================================================== -->

  <target name="validate" description="Validates the build environment.">
    <!-- java greater than 1.6 required to build -->
    <condition property="requiredJavaVersion">
      <or>
        <equals arg1="${ant.java.version}" arg2="1.9" />
        <equals arg1="${ant.java.version}" arg2="1.8" />
        <equals arg1="${ant.java.version}" arg2="1.7" />
      </or>
    </condition>
    <fail unless="requiredJavaVersion"
          message="Java version 1.7 required." />
    <!-- validate ant version too ... -->
  </target>

  <!-- ==================================================================== -->
  <!-- COPY-RESOURCES                                                       -->
  <!-- ==================================================================== -->

  <target name="copy-resources" description="Copies resources.">
    <copy verbose="false"
          file="${src.resources.dir}/testngtasks"
          todir="${build.dir}" />
    <copy todir="${build.dir}">
      <fileset dir="${src.resources.dir}">
        <exclude name="**/.*" />
        <exclude name="**/CVS/*" />
      </fileset>
    </copy>
  </target>


  <target name="dev"
          depends="prepare,validate,copy-resources,build,tests" />

  <target name="all"
          depends="prepare,validate,copy-resources,build,dist,tests,test-ant,javadocs,dist" />

  <target name="build" depends="prepare,compile,testng-jar-all" />

  <target name="testng-jar-all">
    <antcall target="create-jar">
      <param name="jar.file" value="${testng.jar}" />
    </antcall>
    <jar jarfile="${testng.jar}" update="true">
      <zipfileset src="${lib.dir}/${beanshell.jar}" />
      <zipfileset src="${lib.dir}/${jcommander.jar}" />
      <zipfileset src="${lib.dir}/${yaml.jar}" />
    </jar>

  </target>

  <target name="single">
    <ant antfile="build-tests.xml" target="run:single"/>
  </target>

  <!-- ==================================================================== -->
  <!-- Compile                                                              -->
  <!-- ==================================================================== -->

  <path id="compile2.cp">
    <fileset dir="${lib.dir}" includes="${all.jar.files}" />
  </path>

  <target name="compile"
          depends="prepare,copy-resources"
          description="Compiles sources">
    <echo message="                                 -- Compiling sources --" />

    <echo>Src:${src.dir}</echo>
    <javac classpathref="compile2.cp"
           verbose="false"
           target="1.7"
           debug="true"
           optimize="${optimize}"
           destdir="${build.dir}">
      <src path="${src.dir}" />
    </javac>
  </target>

  <target name="compile:all" depends="compile" />

  <target name="examples">
    <ant inheritall="no" antfile="examples/build.xml" />
  </target>

  <target name="tests" depends="build" description="runs all JDK5 tests with JDK5 distro">
    <ant inheritall="no" antfile="build-tests.xml" />
  </target>
  
  <target name="test-ant" depends="build">
    <echo message="                                 -- Testing ant testng task functionality --" />
    <ant inheritall="no" antfile="build-ant.xml" />
  </target>

  <!-- ==================================================================== -->
  <!-- Documentation                                                        -->
  <!-- ==================================================================== -->

  <target name="javadocs" depends="build,javadocs-current" />

  <target name="doclava">
    <javadoc
      docletpath="3rdparty/doclava-1.0.3.jar"
      bootclasspath="${javahome}/jre/lib/rt.jar"
      classpath="${testng.jar}:lib/${ant.jar}:lib/${guice2.jar}:lib/aopalliance-1.0.jar"
      maxmemory="2048M"
      additionalparam="-quiet"
      verbose="false"
      destdir="javadocs"
      >
      <fileset dir="${src.dir}" defaultexcludes="yes">
        <include name="org/testng/*.java" />
      </fileset>
      <fileset dir="${src.dir}" defaultexcludes="yes">
        <include name="org/testng/xml/Xml*.java" />
      </fileset>
      <fileset dir="${src.dir}" defaultexcludes="yes">
        <include name="org/testng/annotations/**" />
      </fileset>
      <doclet name="com.google.doclava.Doclava">
        <param name="-stubs" value="build/stubs" />
        <param name="-hdf"/>
        <param name="project.name" value="TestNG" />
        <!-- versioning -->
        <param name="-since"/>
        <param name="doclava/previous.xml"/>
        <param name="v1" />
        <param name="-apiversion" value="v2"/>
        <!-- federation -->
        <param name="-federate" />
        <param name="JDK"/>
        <param name="http://download.oracle.com/javase/6/docs/api/index.html?"/>
        <param name="-federationxml"/><param name="JDK"/>
        <param name="http://doclava.googlecode.com/svn/static/api/openjdk-6.xml"/>
      </doclet>
    </javadoc>
  </target>

  <target name="javadocs-current">
    <javadoc additionalparam="-quiet" destdir="javadocs" source="1.7" windowtitle="TestNG"
      classpath="${testng.jar}" classpathref="compile2.cp" verbose="false">
      <fileset dir="${src.dir}" defaultexcludes="yes">
        <include name="org/testng/*.java" />
      </fileset>
      <fileset dir="${src.dir}" defaultexcludes="yes">
        <include name="org/testng/xml/Xml*.java" />
      </fileset>
      <fileset dir="${src.dir}" defaultexcludes="yes">
        <include name="org/testng/annotations/**" />
      </fileset>
    </javadoc>
  </target>

  <!-- ==================================================================== -->
  <!-- Distribution                                                         -->
  <!-- ==================================================================== -->

  <target name="dist" depends="build,all-jar-flavors,dist-all-zip,eclipse" />

  <target name="all-jar-flavors" depends="dist-junit,dist-nobsh-guice,dist-bsh-noguice,dist-nobsh-noguice,dist-testng-dist,dist-testng-javadoc" />

  <target name="dist-junit">
    <antcall target="create-jar">
      <param name="jar.file" value="${other.jars.dir}/${testng.junit.jar}" />
    </antcall>
    <jar jarfile="${other.jars.dir}/${testng.junit.jar}" update="true">
      <zipfileset src="${lib.dir}/${beanshell.jar}" />
      <zipfileset src="${lib.dir}/${jcommander.jar}" />
      <zipfileset src="${lib.dir}/${junit.jar}" />
      <zipfileset src="${lib.dir}/${yaml.jar}" />
    </jar>
  </target>

  <target name="dist-nobsh-guice">
    <antcall target="create-jar">
      <param name="jar.file" value="${other.jars.dir}/${testng.nobsh.guice.jar}" />
    </antcall>
    <jar jarfile="${other.jars.dir}/${testng.nobsh.guice.jar}" update="true">
      <zipfileset src="${lib.dir}/${guice2.jar}" />
      <zipfileset src="${lib.dir}/${jcommander.jar}" />
      <zipfileset src="${lib.dir}/${junit.jar}" />
    </jar>
  </target>

  <target name="dist-bsh-noguice">
    <antcall target="create-jar">
      <param name="jar.file" value="${other.jars.dir}/${testng.bsh.noguice.jar}" />
    </antcall>
    <jar jarfile="${other.jars.dir}/${testng.bsh.noguice.jar}" update="true">
      <zipfileset src="${lib.dir}/${beanshell.jar}" />
      <zipfileset src="${lib.dir}/${jcommander.jar}" />
      <zipfileset src="${lib.dir}/${junit.jar}" />
    </jar>
  </target>

  <target name="dist-nobsh-noguice">
    <antcall target="create-jar">
      <param name="jar.file" value="${other.jars.dir}/${testng.nobsh.noguice.jar}" />
    </antcall>
    <jar jarfile="${other.jars.dir}/${testng.bsh.noguice.jar}" update="true">
      <zipfileset src="${lib.dir}/${jcommander.jar}" />
      <zipfileset src="${lib.dir}/${junit.jar}" />
    </jar>
  </target>

  <target name="dist-testng-dist">
    <antcall target="create-jar">
      <param name="jar.file" value="${other.jars.dir}/${testng.dist.jar}" />
    </antcall>
    <jar jarfile="${other.jars.dir}/${testng.dist.jar}" update="true">
      <zipfileset src="${lib.dir}/${jcommander.jar}" />
    </jar>
  </target>

  <target name="dist-testng-javadoc" depends="javadocs">
    <zip destfile="${other.jars.dir}/${testng.javadoc.zip}">
        <fileset dir="javadocs"/>
    </zip>
  </target>

  <target name="create-jar" description="Create a jar file with the Testng classes and nothing else" 
          depends="compile">
    <delete file="${jar.file}" />
    <jar destfile="${jar.file}" >
      <manifest>
        <attribute name="Main-Class" value="org.testng.TestNG" />
        <attribute name="Implementation-Version" value="${testng.version}-${DSTAMP}${TSTAMP}" />
      </manifest>
      <fileset dir="${build.dir}" />
      <fileset file="TESTNG-${testng.version}" />
    </jar>
  </target>

  <target name="dist-all-zip" depends="dist-prepare,javadocs">
    <property name="zip.dir" value="testng-${testng.version}" />
    <echo>Adding ${testng.fullname}</echo>
    <zip zipfile="${testng.zip}">
      <zipfileset prefix="${zip.dir}" dir="${target}">
        <include name="${testng.fullname}.jar" />
      </zipfileset>
      <zipfileset prefix="${zip.dir}" dir="${basedir}" includesfile="FILES" />
      <zipfileset dir="${other.jars.dir}" prefix="${zip.dir}/other-jars"/>
      <zipfileset dir="javadocs" prefix="${zip.dir}/javadocs" />
      <zipfileset dir="src" prefix="${zip.dir}/src" />
      <zipfileset dir="spring" prefix="${zip.dir}/spring" />
      <zipfileset dir="doc" prefix="${zip.dir}/doc" />
      <zipfileset dir="${src.resources.dir}"
               prefix="${zip.dir}/resources" 
            includes="**/*.css"/>
    </zip>
  </target>
  
<!--
  <target name="dist-maven-bundle" depends="dist-all-zip">
    <mkdir dir="${build.maven-bundle.dir}" />
    <copy file="bundle-pom.xml" tofile="${build.maven-bundle.dir}/pom.xml" overwrite="true">
      <filterchain>
        <expandproperties/>
      </filterchain>
    </copy>
    <jar destfile="${build.maven-bundle.dir}/${sources.testng.jar}">
      <fileset dir="${src.dir}" />
    </jar>

    <exec executable="gpg">
      <arg value="- -yes" />
      <arg value="-ab" />
      <arg value="${testng.jar}" />
    </exec>

    <exec executable="gpg">
      <arg value="- -yes" />
      <arg value="-ab" />
      <arg value="${build.maven-bundle.dir}/pom.xml" />
    </exec>

    <exec executable="gpg">
      <arg value="- -yes" />
      <arg value="-ab" />
      <arg value="${build.maven-bundle.dir}/${sources.testng.jar}" />
    </exec>

    <jar destfile="${testng.maven-bundle}">
      <fileset file="${build.maven-bundle.dir}/pom.xml" />
      <fileset file="${build.maven-bundle.dir}/${sources.testng.jar}" />
      <fileset file="${build.maven-bundle.dir}/*asc" />
      <fileset file="${testng.jar}" />
      <fileset file="${testng.jar}.asc" />
    </jar>
  </target>
-->

  <target name="dist-prepare" depends="update-readme">
    <delete file="{other.jars.dir}/${testng.nobsh.jar}" />
    <mkdir dir="${other.jars.dir}" />
  </target>

  <target name="update-readme">
    <copy file="README.template" tofile="README.md" />
    <replace file="README.md" token="${version}" value="${testng.version}" />
    <touch file="TESTNG-${testng.version}" />
  </target>
      
  <target name="eclipse" description="Used by Cedric to build distributions">
    <property name="jdk15.jar"
              value="${testng-eclipse.dir}/lib/testng.jar" />

    <delete file="${jdk15.jar}" />
    <copy file="${testng.jar}" tofile="${jdk15.jar}" />

    <!-- sources -->
    <property name="sources" value="${testng-eclipse.dir}/lib/testng-sources.jar"/>
    <echo>Sources: ${sources}</echo>
    <jar destfile="${sources}" basedir="src/main/java/" />
  </target>

  <target name="ftp">
    <!--
          <ftp action="put"
             server="beust.com"
             remotedir="w/testng/test-output"
             userid="${userid}"
             password="${password}">
              <fileset dir="c:\weblogic\dev\sandbox\cbeust\testng\test\test-output">
                <include name="index.html" />
                <include name="main.html" />
                <include name="toc.html" />
                <include name="*egression*" />
             </fileset>
        </ftp>
      -->
    <ftp action="put"
         server="beust.com"
         remotedir="w/testng"
         userid="${userid}"
         password="${password}">
      <fileset dir="${root.dir}">
        <include name="${testng.zip}" />
        <include name="javadocs/**" />
        <include name="testng-1.0.dtd" />
      </fileset>
      <fileset dir="${root.dir}/doc">
        <include name="*.html" />
      </fileset>
    </ftp>

  </target>

  <target name="ftp2">
    <ftp action="put"
         server="beust.com"
         remotedir="w/testng"
         userid="${userid}"
         password="${password}">
      <fileset dir="${root.dir}/test">
        <include name="test-output/*" />
      </fileset>
      <fileset dir="${root.dir}/test">
        <include name="test-report/*" />
      </fileset>
    </ftp>
  </target>

  <target name="clean">
    <delete dir="${build.dir}" />
    <delete dir="${target}" />
    <delete dir="${build.maven-bundle.dir}" />
    <delete failonerror="false">
      <fileset dir="." includes="testng*.jar,*.zip" />
    </delete>
    <delete dir="test-output" failonerror="false" />
    <delete dir="test-output-tests" failonerror="false" />
    <ant antfile="build-tests.xml" target="clean" />
    <ant dir="examples" target="clean" />
  </target>

  <!-- ==================================================================== -->
  <!-- Maven1/2 Distribution                                                -->
  <!-- ==================================================================== -->

<!--
  <target name="maven-plugin">
    <jar destfile="maven-testng-plugin-${testng-maven.version}.jar"
         basedir="./maven/" />
  </target>
-->

  <!-- ==================================================================== -->
  <!-- Ivy                                                                  -->
  <!-- ==================================================================== -->

  <target name="retrieve-dependencies" description="Retrieve dependencies with ivy">
    <ivy:retrieve log="quiet" />
  </target>

  <target name="publish">
    <ivy:resolve />
    <mkdir dir="dist/jars" />
    <copy file="${testng.jar}" todir="dist/jars" />
    <ivy:publish organisation="org.testng" resolver="local" overwrite="true"/>
  </target>

  <target name="pom">
    <ivy:makepom ivyfile="ivy.xml" pomfile="ivy-pom.xml" />
  </target>

  <!-- ==================================================================== -->
  <!-- Code coverage                                                        -->
  <!-- ==================================================================== -->

<!--
  <property name="cobertura.dir" value="../cobertura-1.9.4.1" />

  <path id="cobertura.classpath">
      <fileset dir="${cobertura.dir}">
          <include name="cobertura.jar" />
          <include name="lib/**/*.jar" />
      </fileset>
  </path>

  <taskdef classpathref="cobertura.classpath" resource="tasks.properties" />

  <target name="coverage:create">
    <cobertura-instrument classpath="cobertura-1.9.4.1/lib/*" todir="target/instrumented-classes">
      <fileset dir="${build.dir}">
        <include name="**/*.class" />
      </fileset>
    </cobertura-instrument>
  </target>

  <target name="coverage">
    <cobertura-report srcdir="${src.dir}" destdir="target/coverage-report"/>
  </target>
-->

</project>