<!--

   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.

-->
<!-- ====================================================================== -->
<!-- @author deweese@apache.org                                             -->
<!-- @version $Id$     -->
<!-- ====================================================================== -->

<testSuite name="Base64 test Suite">
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="ENCODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/zeroByte" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/zeroByte.64" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="DECODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/zeroByte.64" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/zeroByte" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/zeroByte" />
    </test>

    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="ENCODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/oneByte" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/oneByte.64" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="DECODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/oneByte.64" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/oneByte" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/oneByte" />
    </test>

    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="ENCODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/twoByte" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/twoByte.64" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="DECODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/twoByte.64" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/twoByte" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/twoByte" />
    </test>

    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="ENCODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/threeByte" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/threeByte.64" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="DECODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/threeByte.64" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/threeByte" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/threeByte" />
    </test>

    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="ENCODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/fourByte" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/fourByte.64" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="DECODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/fourByte.64" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/fourByte" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/fourByte" />
    </test>

    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="ENCODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/tenByte" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/tenByte.64" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="DECODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/tenByte.64" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/tenByte" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/tenByte" />
    </test>

    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="ENCODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/small" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/small.64" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="DECODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/small.64" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/small" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/small" />
    </test>

    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="ENCODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/medium" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/medium.64" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="DECODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/medium.64" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/medium" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.lang.String" value="DECODE" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/medium.pc.64" />
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/medium" />
    </test>
    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/medium" />
    </test>

    <test class="org.apache.batik.util.Base64Test">
        <arg class="java.net.URL" value="file:test-references/org/apache/batik/util/large" />
    </test>

</testSuite>
