<!--
   Copyright 1999-2003,2005 The Apache Software Foundation.
   
   Licensed 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.
-->

<!-- ====================================================================== -->
<!-- @author vincent.hardy@eng.sun.com                                      -->
<!-- @version $Id$   -->
<!-- ====================================================================== -->
<testSuite id="swing.unitTesting" 
           name="org.apache.batik.swing package - Unit Testing">
  <testGroup id="swing.memoryLeaks" 
             class="org.apache.batik.swing.JSVGMemoryLeakTest">
    <test id="samples/anne.svg" />
    <test id="samples/tests/spec/scripting/memoryLeak1.svg"/>
  </testGroup>

  <!--test id="NullURITest" 
        class="org.apache.batik.swing.NullURITest" />

  <test id="NullSetSVGDocumentTest" 
        class="org.apache.batik.swing.NullSetSVGDocumentTest" /-->

  <test id="SetSVGDocumentTest" 
        class="org.apache.batik.swing.SetSVGDocumentTest" />

  <testGroup id="swing.interrupt" 
             class="org.apache.batik.swing.JSVGInterruptTest">
    <test id="samples/anne.svg" />
<!--    <test id="samples/sydney.svg" />
    <test id="samples/mines.svg" /> -->
  </testGroup>
</testSuite>
