<?xml version="1.0"?>

<project name="move-test" basedir="." default="testFilterSet">

  <target name="testFilterSet">
    <copy file="copy.filterset" tofile="move.filterset"/>
    <move file="move.filterset" tofile="move.filterset.tmp">
      <filterset>
        <filter token="TITLE" value="Apache Ant Project"/>
      </filterset>
    </move>
  </target>

  <target name="testFilterChain">
    <copy file="copy.filterset" tofile="move.filterchain"/>
    <move file="move.filterchain" tofile="move.filterchain.tmp">
      <filterchain>
        <replacetokens>
          <token key="TITLE" value="Apache Ant Project"/>
        </replacetokens>
      </filterchain>
    </move>
  </target>

  <!-- Bugzilla Report 11732 -->
  <target name="testDirectoryRemoval">
    <mkdir dir="A/B"/>
    <mkdir dir="A/C"/>
    <mkdir dir="A/D"/>
    <touch file="A/B/1"/>
    <touch file="A/C/2"/>
    <touch file="A/D/3"/>
    <mkdir dir="E"/>
    <move todir="E" includeemptydirs="true">
      <fileset dir="A">
        <include name="C"/>
        <include name="D"/>
        <include name="C/**"/>
        <include name="D/**"/>
      </fileset>
    </move>
  </target>

  <!-- Bugzilla Report 18886 -->
  <target name="testDirectoryRetaining">
    <mkdir dir="A"/>
    <touch file="A/1"/>
    <mkdir dir="E"/>
    <move todir="E" includeemptydirs="true">
      <fileset dir="A" includes="1"/>
    </move>
  </target>

  <target name="testCompleteDirectoryMove">
    <mkdir dir="A"/>
    <touch file="A/1"/>
    <move todir="E">
      <fileset dir="A"/>
    </move>
  </target>

  <target name="testCompleteDirectoryMove2">
    <mkdir dir="A"/>
    <touch file="A/1"/>
    <move todir="E">
      <path>
        <fileset dir="A"/>
      </path>
    </move>
  </target>

  <target name="testPathElementMove">
    <mkdir dir="A"/>
    <touch file="A/1"/>
    <move todir="E" flatten="true">
      <path>
        <pathelement location="A/1"/>
      </path>
    </move>
  </target>

  <target name="testMoveFileAndFileset">
    <mkdir dir="A" />
    <touch>
      <filelist dir="A" files="1,2,3" />
    </touch>
    <move todir="E" file="A/1">
      <fileset dir="A" includes="2,3" />
    </move>
    <fail message="A unavailable">
      <condition>
        <not>
          <available file="A" type="dir" />
        </not>
      </condition>
    </fail>
    <fail message="A/1 not moved">
      <condition>
        <or>
          <available file="A/1" type="file" />
          <not>
            <available file="E/1" type="file" />
          </not>
        </or>
      </condition>
    </fail>
    <fail message="A/2 not moved">
      <condition>
        <or>
          <available file="A/2" type="file" />
          <not>
            <available file="E/2" type="file" />
          </not>
        </or>
      </condition>
    </fail>
    <fail message="A/3 not moved">
      <condition>
        <or>
          <available file="A/3" type="file" />
          <not>
            <available file="E/3" type="file" />
          </not>
        </or>
      </condition>
    </fail>
  </target>

  <macrodef name="verifymove">
    <attribute name="newfile" />
    <attribute name="olddir" />
    <sequential>
        <fail message="@{newfile} not available">
          <condition>
            <not>
              <available file="@{newfile}" type="file" />
            </not>
          </condition>
        </fail>
        <fail message="@{olddir} remains">
          <condition>
            <available file="@{olddir}" type="dir" />
          </condition>
        </fail>
    </sequential>
  </macrodef>

  <target name="testCompleteDirectoryMoveToExistingDir">
    <mkdir dir="A" />
    <touch file="A/1" />
    <mkdir dir="E" />
    <touch file="E/2" />
    <move todir="E">
      <fileset dir="A" />
    </move>
    <verifymove newfile="E/1" olddir="A" />
    <fail message="E/2 unavailable">
      <condition>
        <not>
          <available file="E/2" type="file" />
        </not>
      </condition>
    </fail>
  </target>

  <target name="testCompleteDirectoryMoveFileToFile">
    <mkdir dir="A"/>
    <touch file="A/1"/>
    <move file="A" tofile="E" />
    <verifymove newfile="E/1" olddir="A" />
  </target>

  <target name="testCompleteDirectoryMoveFileToDir">
    <mkdir dir="A"/>
    <touch file="A/1"/>
    <move file="A" todir="E" />
    <verifymove newfile="E/A/1" olddir="A" />
  </target>

  <target name="testCompleteDirectoryMoveFileAndFileset">
    <mkdir dir="A/1" />
    <touch file="A/2" />
    <move file="A/1" todir="E">
      <fileset dir="A" includes="2" />
    </move>
    <fail message="A unavailable">
      <condition>
        <not>
          <available file="A" type="dir" />
        </not>
      </condition>
    </fail>
    <fail message="E/1 unavailable">
      <condition>
        <not>
          <available file="E/1" type="dir" />
        </not>
      </condition>
    </fail>
    <fail message="E/2 unavailable">
      <condition>
        <not>
          <available file="E/2" type="file" />
        </not>
      </condition>
    </fail>
  </target>

  <target name="testCompleteDirectoryMoveFileToExistingFile">
    <mkdir dir="A"/>
    <touch file="A/1"/>
    <touch file="E"/>
    <move file="A" tofile="E" />
  </target>

  <target name="testCompleteDirectoryMoveFileToExistingDir">
    <mkdir dir="A"/>
    <touch file="A/1"/>
    <mkdir dir="E"/>
    <move file="A" tofile="E" />
    <verifymove newfile="E/1" olddir="A" />
  </target>

  <target name="testCompleteDirectoryMoveFileToDirWithExistingFile">
    <mkdir dir="A"/>
    <touch file="A/1"/>
    <mkdir dir="E"/>
    <touch file="E/A"/>
    <move file="A" todir="E" />
  </target>

  <target name="testCompleteDirectoryMoveFileToDirWithExistingDir">
    <mkdir dir="A"/>
    <touch file="A/1"/>
    <mkdir dir="E"/>
    <mkdir dir="E/A"/>
    <move file="A" todir="E" />
    <verifymove newfile="E/A/1" olddir="A" />
  </target>

  <target name="cleanup"> 
    <delete file="move.filterset.tmp"/>
    <delete file="move.filterchain.tmp"/>
    <delete dir="A" />
    <delete file="B" />
    <delete dir="E" />
  </target>

</project>
