<!--
   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.
-->
<html>
  <head>
    <meta http-equiv="Content-Language" content="en-us"></meta>
    <link rel="stylesheet" type="text/css" href="style.css">
    <title>AntUnit Ant Library</title>
  </head>

  <body>
    <h2>Introduction</h2>

    <p>This is a library of Ant tasks that support writing tests for
    tasks using build files instead of JUnit.</p>

    <h2>Requirements</h2>

    <p>The current version requires Ant 1.8.1 or later.</p>

    <h2>Where is it?</h2>

    <p>The source code for the library lives in the
    ant-antlibs-antunit git repository - <a
    href="https://gitbox.apache.org/repos/asf?p=ant-antlibs-antunit.git">https://gitbox.apache.org/repos/asf/ant-antlibs-antunit.git</a>.</p>

    <h2>Installation</h2>

    <p>If you are building this from sources, run the antlib target
    and you'll get a file <code>ant-antunit.jar</code>.</p>

    <p>There are several ways to use the tasks:</p>

    <ul>
      <li>The traditional way:
        <pre>
          &lt;taskdef 
            resource="org/apache/ant/antunit/antlib.xml"&gt;
            &lt;classpath&gt;
              &lt;pathelement location="YOUR-PATH-TO/ant-antunit.jar"/&gt;
            &lt;/classpath&gt;
          &lt;/taskdef&gt;
        </pre>

        With this you can use the tasks like plain Ant tasks, they'll
        live in the default namespace.  I.e. if you can run
        &lt;exec&gt; without any namespace prefix, you can do so for
        &lt;antunit&gt; as well.
      </li>

      <li>Similar, but assigning a namespace URI
        <pre>
          &lt;taskdef 
            uri="antlib:org.apache.ant.antunit"
            resource="org/apache/ant/antunit/antlib.xml"&gt;
            &lt;classpath&gt;
              &lt;pathelement location="YOUR-PATH-TO/ant-antunit.jar"/&gt;
            &lt;/classpath&gt;
          &lt;/taskdef&gt;
        </pre>

        This puts you task into a separate namespace than Ant's
        namespace.  You would use the tasks like

        <pre>
          &lt;project
            xmlns:au="antlib:org.apache.ant.antunit"
            xmlns="antlib:org.apache.tools.ant"&gt;
            ...
            &lt;au:assertTrue&gt;
              &lt;equals arg1="1" arg2="2"/&gt;
            &lt;/au:assertTrue&gt;
        </pre>

        or a variation thereof.
      </li>

      <li>Using Ant's autodiscovery.  Place <code>ant-antunit.jar</code>
      into a directory and use <code>ant -lib
      DIR-CONTAINING-THE-JAR</code> or copy it into
      <code>ANT_HOME/lib</code> - and then in your build file, simply
      declare the namespace on the <code>project</code> tag:

        <pre>
          &lt;project
            xmlns:au="antlib:org.apache.ant.antunit"
            xmlns="antlib:org.apache.tools.ant"&gt;
        </pre>

        And all tasks of this library will automatically be available
        in the <code>au</code> namespace without any
        <code>taskdef</code>.
      </li>
    </ul>

    <h2>Tasks and Types</h2>

    <ul>
      <li><a href="antunit.html">antunit</a> - run unit tests, the
      tests are defined using build files that contain targets which
      follow a certain naming convention.  This task borrows a lot of
      ideas from JUnit 3 and the junit task.</li>

      <li><a href="assert.html">assertTrue</a> - asserts a condition
      and throws a custom BuildException if the assertion fails.</li>

      <li><a href="assertions.html">more assertions</a> - useful
      specialized versions of assertTrue.</li>

      <li><a href="expectfailure.html">expectfailure</a> - a task
      container useful for tests that assert build failures.</li>

      <li><a href="logcontent.html">logcontent</a> - an Ant Resource
      that contains the log output of an AntUnit test.</li>
    </ul>

    <hr/>
  </body>
</html>
