<!--
   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="org.apache.easyant.plugins;abstract-package-test" xmlns:au="antlib:org.apache.ant.antunit"
    xmlns:ivy="antlib:org.apache.ivy.ant" xmlns:ea="antlib:org.apache.easyant">
    
    <!-- Import your plugin -->
    <property name="target" value="target/test-antunit" />
    <!-- configure easyant in current project -->
    <ea:configure-easyant-ivy-instance />
    <!-- import our local plugin -->
    <ea:import-test-module moduleIvy="../../../module.ivy" sourceDirectory="../../main/resources" />
   
    <!-- Defines a setUp / tearDown (before each test) that cleans the environnement -->
    <target name="clean" description="remove stale build artifacts before / after each test">
        <delete dir="${basedir}" includeemptydirs="true">
            <include name="**/target/**" />
            <include name="**/lib/**" />
        </delete>
    </target>

    <target name="setUp" depends="clean" />
    <target name="tearDown" depends="clean" />

    <target name="test-abstract-package:init" depends="abstract-package:init">
        <au:assertPropertyEquals name="target.artifacts" value="${target}/artifacts" />
    </target>

    <target name="test-abstract-package:compute-metainf" depends="abstract-package:compute-metainf">
        <au:assertPropertyEquals name="package.metainf.basedir" value="${basedir}" />
        <au:assertPropertyEquals name="package.metainf.includes.pattern" value="NOTICE,LICENSE" />
        <au:assertPropertyEquals name="package.metainf.excludes.pattern" value="" />
        <au:assertReferenceSet refid="package.metainf.fileset" />
    </target>

    <target name="prepare-register-artifact">
        <property name="project.ivy.instance" value="project.ivy.instance" />
        <ivy:settings id="project.ivy.instance" />
        <ivy:resolve file="sample-module.ivy" settingsRef="project.ivy.instance" />
        <echo file="${target}/myartifact.jar" />
        <property name="target.main.artifact" value="${target}/myartifact.jar" />
    </target>

    <target name="test-abstract-package:register-main-artifact" depends="prepare-register-artifact,abstract-package:register-main-artifact">
        <au:assertPropertyEquals name="publish.main.type" value="jar" />
        <au:assertPropertyEquals name="publish.main.confs" value="default" />
        <au:assertPropertyEquals name="project.ivy.instance" value="project.ivy.instance" />
    </target>
</project>