<?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

       https://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="extended-taskdef" default="testRun">

  <description>
    Try and replicate a reported problem.

  </description>
  <property name="src" value="Foo.java"/>
  <property name="taskdefs" value="tasks.properties"/>

  <target name="write" >
    <echo file="${src}">
      import org.apache.tools.ant.BuildException;

      public class Foo extends org.apache.tools.ant.taskdefs.WaitFor {

        public void execute() {
          throw  new BuildException("executing the Foo task");
        }
      }
    </echo>
    <propertyfile file="${taskdefs}">
      <entry key="foo2" value="Foo"/>
    </propertyfile>
  </target>

  <target name="compile" depends="write">
    <javac srcdir="${basedir}" includes="${src}"/>
  </target>

  <target name="testRun" depends="compile">
    <taskdef name="foo" classname="Foo"
        classpath="${basedir}"/>
    <foo maxwait="5" maxwaitunit="second"
        timeoutproperty="foo">
      <or/>
    </foo>
  </target>

  <target name="testRun2" depends="compile">
    <taskdef resource="${taskdefs}" classpath="${basedir}"/>
    <foo2 maxwait="5" maxwaitunit="second"
        timeoutproperty="foo">
      <or/>
    </foo2>
  </target>


  <target name="teardown">
    <delete>
      <fileset dir="${basedir}"
          includes="${src},*.class"/>
    </delete>
    <delete file="${taskdefs}" />
  </target>

</project>
