<!--

   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.

-->
<!-- ========================================================================= -->
<!-- This file contains the set of tests that should be run for basic default  -->
<!-- regression testing.                                                       -->
<!--                                                                           -->
<!-- @author vincent.hardy@eng.sun.com                                         -->
<!-- @version $Id$  -->
<!-- ========================================================================= -->
<testRun id="regard" name="Batik Standard Regression Test Run">
    <testReportProcessor class="org.apache.batik.test.xml.XMLTestReportProcessor" > 
        <arg class="org.apache.batik.test.xml.XSLXMLReportConsumer">
            <!-- Stylesheet -->
        <arg class="java.lang.String" value="file:test-resources/org/apache/batik/test/svg/HTMLReport.xsl" />
            <!-- Ouput Directory -->
        <arg class="java.lang.String" value="html" />
            <!-- Output file name -->
        <arg class="java.lang.String" value="regardReport.html" />
        </arg>
    </testReportProcessor>

    <!-- ================================================================== -->
    <!--                     Rendering Accuracy Tests                       -->
    <!-- ================================================================== -->

    <!--                                Batik                               -->
    <!--                               Samples                              -->
    <testSuite href="file:test-resources/org/apache/batik/test/samplesRendering.xml" /> 


    <!-- ================================================================== -->
    <!--                         SVG Generator Tests                        -->
    <!-- ================================================================== -->
    <testSuite href="file:test-resources/org/apache/batik/svggen/regsvggen.xml" /> 


    <!-- ================================================================== -->
    <!--                              Unit Testing                          -->
    <!-- ================================================================== -->
    <testSuite href="file:test-resources/org/apache/batik/apps/rasterizer/unitTesting.xml" />
    <testSuite href="file:test-resources/org/apache/batik/test/unitTesting.xml" />  
    <testSuite href="file:test-resources/org/apache/batik/ext/awt/image/codec/unitTesting.xml" />
    <testSuite href="file:test-resources/org/apache/batik/ext/awt/image/spi/unitTesting.xml" />
    <testSuite href="file:test-resources/org/apache/batik/ext/awt/geom/unitTesting.xml" /> 
    <testSuite href="file:test-resources/org/apache/batik/util/unitTesting.xml" />
    <testSuite href="file:test-resources/org/apache/batik/bridge/unitTesting.xml" /> 
    <testSuite href="file:test-resources/org/apache/batik/css/dom/unitTesting.xml" /> 
    <testSuite href="file:test-resources/org/apache/batik/dom/unitTesting.xml" /> 
    <testSuite href="file:test-resources/org/apache/batik/dom/svg/unitTesting.xml" /> 
    <testSuite href="file:test-resources/org/apache/batik/gvt/unitTesting.xml" /> 
    <testSuite href="file:test-resources/org/apache/batik/parser/unitTesting.xml" /> 
    <testSuite href="file:test-resources/org/apache/batik/script/rhino/unitTesting.xml" />
    <testSuite href="file:test-resources/org/apache/batik/swing/unitTesting.xml" />
    <testSuite href="file:test-resources/org/apache/batik/transcoder/unitTesting.xml" /> 
    <testSuite href="file:test-resources/org/apache/batik/transcoder/image/unitTesting.xml" /> 
    <testSuite href="file:test-resources/org/apache/batik/css/engine/value/unitTesting.xml" /> 


</testRun>
