<?xml version="1.0"?>
<project name="test" basedir=".">
  <path id="testclasses">
    <pathelement location="../../../../build/testcases" />
    <pathelement path="${java.class.path}" />
  </path>

  <mapper id="testmapper"
          classname="org.apache.tools.ant.taskdefs.MultiMapTest$TestMapper"
          classpathref="testclasses"/>

  <property name="map.ext" value=".copy2"/>
  <property name="rootScratchDir" value="test_multi_mapper_scratch_area"/>
  <property name="baseScratchSrc" value="${rootScratchDir}/src"/>
  <property name="baseScratchDest" value="${rootScratchDir}/dest"/>

  <target name="setup">
    <delete dir="${baseScratchSrc}"/>
    <mkdir dir="${baseScratchSrc}"/>
    <delete dir="${baseScratchDest}"/>
    <mkdir dir="${baseScratchDest}"/>
    <touch file="${baseScratchSrc}/somefile.txt"/>
  </target>

  <!-- test simple single file to multiple file move -->
  <target name="multicopy" depends="setup">
    <copy todir="${baseScratchDest}" enablemultiplemappings="true">
      <fileset dir="${baseScratchSrc}" includes="somefile.txt"/>
      <mapper refid="testmapper"/>
    </copy>
    <condition property="multicopy.outcome">
      <and>
        <available file="${baseScratchDest}/somefile.txt"/>
        <available file="${baseScratchDest}/somefile.txt${map.ext}"/>
      </and>
    </condition>
    <fail unless="multicopy.outcome">multicopy failed</fail>
  </target>

  <target name="multimove" depends="setup">
    <move todir="${baseScratchDest}" enablemultiplemappings="true">
      <fileset dir="${baseScratchSrc}" includes="somefile.txt"/>
      <mapper refid="testmapper"/>
    </move>
    <condition property="test2.outcome">
      <and>
        <available file="${baseScratchDest}/somefile.txt"/>
        <available file="${baseScratchDest}/somefile.txt${map.ext}"/>
        <not>
          <available file="${baseScratchSrc}/somefile.txt"/>
        </not>
        <not>
          <available file="${baseScratchSrc}/somefile.txt${map.ext}"/>
        </not>
      </and>
    </condition>
    <fail unless="test2.outcome">mulitmove failed</fail>
  </target>
  
  <!-- 
       test traditional single file to single file copy explicitly telling
       task to ignore multiple mappings
       -->

  <target name="singlecopy" depends="setup">
    <copy todir="${baseScratchDest}" enablemultiplemappings="false">
      <fileset dir="${baseScratchSrc}" includes="somefile.txt"/>
      <mapper refid="testmapper"/>
    </copy>
    <condition property="singlecopy.outcome">
      <and>
        <available file="${baseScratchDest}/somefile.txt"/>
        <not>
          <available file="${baseScratchDest}/somefile.txt${map.ext}"/>
        </not>
        <available file="${baseScratchSrc}/somefile.txt"/>
      </and>
    </condition>
    <fail unless="singlecopy.outcome">singlecopy failed</fail>
  </target>

  <target name="singlemove" depends="setup">
    <move todir="${baseScratchDest}" enablemultiplemappings="false">
      <fileset dir="${baseScratchSrc}" includes="somefile.txt"/>
      <mapper refid="testmapper"/>
    </move>
    <condition property="singlemove.outcome">
      <and>
        <available file="${baseScratchDest}/somefile.txt"/>
        <not>
          <available file="${baseScratchDest}/somefile.txt${map.ext}"/>
        </not>
        <not>
          <available file="${baseScratchSrc}/somefile.txt"/>
        </not>
      </and>
    </condition>
    <fail unless="singlemove.outcome">singlemove failed</fail>
  </target>

  <!-- test dir w/ file + empty dir multimap copy -->
  <target name="copywithempty">
    <delete dir="${baseScratchSrc}"/>
    <mkdir dir="${baseScratchSrc}/dirwithfile"/>
    <mkdir dir="${baseScratchSrc}/emptydir"/>
    <touch file="${baseScratchSrc}/dirwithfile/somefile.txt"/>

    <delete dir="${baseScratchDest}"/>
    <mkdir dir="${baseScratchDest}"/>

    <copy todir="${baseScratchDest}" enablemultiplemappings="true">
      <fileset dir="${baseScratchSrc}" includes="**/*"/>
      <mapper refid="testmapper"/>
    </copy>
    <condition property="copywithempty.outcome">
      <and>
        <available file="${baseScratchDest}/dirwithfile"/>
        <available file="${baseScratchDest}/dirwithfile${map.ext}"/>
        <available file="${baseScratchDest}/dirwithfile/somefile.txt"/>
        <available file="${baseScratchDest}/dirwithfile/somefile.txt${map.ext}"/>
        <not>
          <available file="${baseScratchDest}/dirwithfile${map.ext}/somefile.txt"/>
        </not>
        <not>
          <available file="${baseScratchDest}/dirwithfile${map.ext}/somefile.txt${map.ext}"/>
        </not>
        <available file="${baseScratchDest}/emptydir"/>
        <available file="${baseScratchDest}/emptydir${map.ext}"/>
      </and>
    </condition>
    <fail unless="copywithempty.outcome">copywithempty failed</fail>
  </target>
  <!-- test dir w/ file + empty dir multimap move -->
  <target name="movewithempty">
    <delete dir="${baseScratchSrc}"/>
    <mkdir dir="${baseScratchSrc}/dirwithfile"/>
    <mkdir dir="${baseScratchSrc}/emptydir"/>
    <touch file="${baseScratchSrc}/dirwithfile/somefile.txt"/>

    <delete dir="${baseScratchDest}"/>
    <mkdir dir="${baseScratchDest}"/>

    <move todir="${baseScratchDest}" enablemultiplemappings="true">
      <fileset dir="${baseScratchSrc}" includes="**/*"/>
      <mapper refid="testmapper"/>
    </move>
    <condition property="movewithempty.outcome">
      <and>
        <available file="${baseScratchDest}/dirwithfile"/>
        <available file="${baseScratchDest}/dirwithfile${map.ext}"/>
        <available file="${baseScratchDest}/dirwithfile/somefile.txt"/>
        <available file="${baseScratchDest}/dirwithfile/somefile.txt${map.ext}"/>
        <not>
          <available file="${baseScratchDest}/dirwithfile${map.ext}/somefile.txt"/>
        </not>
        <not>
          <available file="${baseScratchDest}/dirwithfile${map.ext}/somefile.txt${map.ext}"/>
        </not>
        <available file="${baseScratchDest}/emptydir"/>
        <available file="${baseScratchDest}/emptydir${map.ext}"/>
        <not>
          <available file="${baseScratchSrc}/dirwithfile"/>
        </not>
        <not>
          <available file="${baseScratchSrc}/emptydir"/>
        </not>
      </and>
    </condition>
    <fail unless="movewithempty.outcome">movewithempty failed</fail>
  </target>

  <target name="cleanup">
    <delete dir="${rootScratchDir}"/>
  </target>

</project>
