<?xml version="1.0"?>
<!--

  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.

-->

<project name="flexunit-tests" default="test">

  <property name="FLEX_HOME" location="${basedir}"/>
  <property name="FLEXUNIT_HOME" value="${FLEX_HOME}/../flex-flexunit"/>

  <property name="exit" value="false"/>
  
  <target name="test" depends="test-check,test-run,test-clean"
    description="Runs FlexUnit tests"/>

  <target name="test-check">

    <available
      type="dir" file="${FLEXUNIT_HOME}" 
      property="FLEXUNIT_HOME.set" />

    <fail message="The FLEXUNIT_HOME variable is not set to a directory" 
        unless="FLEXUNIT_HOME.set"/>

    <echo message="FLEXUNIT_HOME is set: ${FLEXUNIT_HOME}"/>

    <available
      type="dir" file="${project.root}" 
      property="project.root.set" />

    <fail message="The 'project.root' variable is not set to a directory" 
        unless="project.root.set"/>

    <echo message="'project.root' is set: ${project.root}"/>

  </target>
  
  <target name="test-run" unless="${exit}">

    <property name="tests.bin" location="${basedir}/bin-tests"/>

    <taskdef resource="flexUnitTasks.tasks">
      <classpath>
        <fileset dir="${FLEXUNIT_HOME}/FlexUnit4AntTasks/target">
          <include name="flexUnitTasks*.jar"/>
        </fileset>
      </classpath>
    </taskdef>

    <echo message="Unit tests for '${project.root}'"/>

    <mkdir dir="${tests.bin}"/>

    <flexunit
      workingDir="${tests.bin}" 
      toDir="${tests.bin}/report" 
      haltonfailure="false" 
      verbose="true" 
      localTrusted="true">
      
      <source dir="${project.root}/src"/>
      
      <testSource dir="${project.root}/src">
        <include name="**/*Tests.as"/>
      </testSource>
      
      <library dir="${FLEXUNIT_HOME}/FlexUnit4/target"/>
      <library dir="${FLEXUNIT_HOME}/FlexUnit4CIListener/target"/>
    </flexunit>

    <mkdir dir="${FLEX_HOME}/test-reports"/>

    <copy todir="${FLEX_HOME}/test-reports">
      <fileset dir="${project.root}">
        <include name="TEST-*.xml" />
      </fileset>
    </copy>

  </target>

  <target name="test-clean" unless="${exit}">

    <echo message="Clean up test artefacts"/>

    <delete dir="${tests.bin}"/>

    <delete>
      <fileset dir="${project.root}">
        <include name="TEST-*.xml" />
      </fileset>
    </delete>

  </target>
  
</project>