<!--
  ~ 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.
  -->

<project name="script" default="alltests">
    <property name="mainDir" value="../.."/>
    <path id="axis.classpath">
        <fileset dir="../../lib">
            <include name="*.jar"/>
        </fileset>
        <pathelement location="./sample.jar"/>
    </path>
    <path id="sample.classpath">
        <path refid="axis.classpath"/>
    </path>

    <target name="alltests"
            depends="testEchoBlockingClient,testEchoBlockingDualClient,testEchoNonBlockingDualClient,testPingClient,testWebServiceWithModuleClient">
    </target>

    <target name="testEchoBlockingClient">
        <java classname="userguide.clients.EchoBlockingClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}"/>
        </java>
    </target>
    <target name="testEchoBlockingDualClient">
        <java classname="userguide.clients.EchoBlockingDualClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}"/>
        </java>
    </target>
    <target name="testEchoNonBlockingDualClient">
        <java classname="userguide.clients.EchoNonBlockingDualClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}"/>
        </java>
    </target>
    <target name="testPingClient">
        <java classname="userguide.clients.PingClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}"/>
        </java>
    </target>
    <target name="testWebServiceWithModuleClient">
        <java classname="userguide.clients.ClientForWebServiceWithModule"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}"/>
        </java>
    </target>

    <target name="testEchoNonBlockingClient">
        <java classname="userguide.clients.EchoNonBlockingClient"
              classpathref="axis.classpath" fork="true">
            <jvmarg value="-Daxis2.repo=${mainDir}"/>
        </java>
    </target>
</project>
