/*
 *  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.
 *
 */

package org.apache.tools.ant.taskdefs;

import org.apache.tools.ant.BuildFileRule;
import org.apache.tools.ant.FileUtilities;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;

import java.io.File;
import java.io.IOException;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

/**
 * Tests the Move task.
 *
 */
public class MoveTest {

    @Rule
    public final BuildFileRule buildRule = new BuildFileRule();

    @Before
    public void setUp() {
        buildRule.configureProject("src/etc/testcases/taskdefs/move.xml");
        buildRule.executeTarget("setUp");
    }

    @Test
    public void testFilterSet() throws IOException {
        buildRule.executeTarget("testFilterSet");
        File tmp  = new File(buildRule.getProject().getProperty("output"), "move.filterset.tmp");
        File check  = new File(buildRule.getProject().getBaseDir(), "expected/copy.filterset.filtered");
        assertTrue(tmp.exists());
        assertEquals(FileUtilities.getFileContents(check), FileUtilities.getFileContents(tmp));
    }

    @Test
    public void testFilterChain() throws IOException {
        buildRule.executeTarget("testFilterChain");
        File tmp  = new File(buildRule.getProject().getProperty("output"), "move.filterchain.tmp");
        File check  = new File(buildRule.getProject().getBaseDir(), "expected/copy.filterset.filtered");
        assertTrue(tmp.exists());
        assertEquals(FileUtilities.getFileContents(check), FileUtilities.getFileContents(tmp));
    }

    /** Bugzilla Report 11732 */
    @Test
    public void testDirectoryRemoval() throws IOException {

        buildRule.executeTarget("testDirectoryRemoval");
        String output = buildRule.getProject().getProperty("output");
        assertTrue(!new File(output,"E/B/1").exists());
        assertTrue(new File(output, "E/C/2").exists());
        assertTrue(new File(output,"E/D/3").exists());
        assertTrue(new File(output,"A/B/1").exists());
        assertTrue(!new File(output,"A/C/2").exists());
        assertTrue(!new File(output,"A/D/3").exists());
        assertTrue(!new File(output,"A/C").exists());
        assertTrue(!new File(output,"A/D").exists());
    }

    /** Bugzilla Report 18886 */
    @Test
    public void testDirectoryRetaining() throws IOException {
        buildRule.executeTarget("testDirectoryRetaining");
        String output = buildRule.getProject().getProperty("output");
        assertTrue(new File(output,"E").exists());
        assertTrue(new File(output,"E/1").exists());
        assertTrue(!new File(output,"A/1").exists());
        assertTrue(new File(output,"A").exists());
    }

    @Test
    public void testCompleteDirectoryMove() throws IOException {
        testCompleteDirectoryMove("testCompleteDirectoryMove");
    }

    @Test
    public void testCompleteDirectoryMove2() throws IOException {
        testCompleteDirectoryMove("testCompleteDirectoryMove2");
    }

    private void testCompleteDirectoryMove(String target) throws IOException {
        buildRule.executeTarget(target);
        String output = buildRule.getProject().getProperty("output");
        assertTrue(new File(output,"E").exists());
        assertTrue(new File(output,"E/1").exists());
        assertTrue(!new File(output,"A/1").exists());
        // <path> swallows the basedir, it seems
        //assertTrue(!new File(getOutputDir(),"A").exists());
    }

    @Test
    public void testPathElementMove() throws IOException {
        buildRule.executeTarget("testPathElementMove");
        String output = buildRule.getProject().getProperty("output");
        assertTrue(new File(output,"E").exists());
        assertTrue(new File(output,"E/1").exists());
        assertTrue(!new File(output,"A/1").exists());
        assertTrue(new File(output,"A").exists());
    }

    @Test
    public void testMoveFileAndFileset() {
        buildRule.executeTarget("testMoveFileAndFileset");
    }

    @Test
    public void testCompleteDirectoryMoveToExistingDir() {
        buildRule.executeTarget("testCompleteDirectoryMoveToExistingDir");
    }

    @Test
    public void testCompleteDirectoryMoveFileToFile() {
        buildRule.executeTarget("testCompleteDirectoryMoveFileToFile");
    }

    @Test
    public void testCompleteDirectoryMoveFileToDir() {
        buildRule.executeTarget("testCompleteDirectoryMoveFileToDir");
    }

    @Test
    public void testCompleteDirectoryMoveFileAndFileset() {
        buildRule.executeTarget("testCompleteDirectoryMoveFileAndFileset");
    }

    @Test
    public void testCompleteDirectoryMoveFileToExistingFile() {
        buildRule.executeTarget("testCompleteDirectoryMoveFileToExistingFile");
    }

    @Test
    public void testCompleteDirectoryMoveFileToExistingDir() {
        buildRule.executeTarget("testCompleteDirectoryMoveFileToExistingDir");
    }

    @Test
    public void testCompleteDirectoryMoveFileToDirWithExistingFile() {
        buildRule.executeTarget("testCompleteDirectoryMoveFileToDirWithExistingFile");
    }

    @Test
    public void testCompleteDirectoryMoveFileToDirWithExistingDir() {
        buildRule.executeTarget("testCompleteDirectoryMoveFileToDirWithExistingDir");
    }

}
