/*
 * Copyright 2000-2009 JetBrains s.r.o.
 *
 * Licensed 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 com.intellij.history.core.changes;

import org.junit.Test;

import java.util.List;

public class ChangeListCollectingChangesTest extends ChangeListTestCase {
  @Test
  public void tesChangesForFile() {
    addChangeSet(facade, "1", createFile(r, "file"));
    addChangeSet(facade, "2", changeContent(r, "file", null));

    List<ChangeSet> result = getChangesFor("file");

    assertEquals(2, result.size());

    assertEquals("2", result.get(0).getName());
    assertEquals("1", result.get(1).getName());
  }

  @Test
  public void testSeveralChangesForSameFileInOneChangeSet() {
    addChangeSet(facade, createFile(r, "file"), changeContent(r, "file", null));

    assertEquals(1, getChangesFor("file").size());
  }

  @Test
  public void testChangeSetsWithChangesForAnotherFile() {
    addChangeSet(facade, createFile(r, "file1"), createFile(r, "file2"));

    assertEquals(1, getChangesFor("file1").size());
  }

  @Test
  public void testDoesNotIncludeNonrelativeChangeSet() {
    addChangeSet(facade, "1", createFile(r, "file1"));
    addChangeSet(facade, "2", createFile(r, "file2"));
    addChangeSet(facade, "3", changeContent(r, "file1", null));

    List<ChangeSet> result = getChangesFor("file1");
    assertEquals(2, result.size());

    assertEquals("3", result.get(0).getName());
    assertEquals("1", result.get(1).getName());
  }

  @Test
  public void testChangeSetsForDirectories() {
    add(facade, createDirectory(r, "dir"));
    add(facade, createFile(r, "dir/file"));

    assertEquals(2, getChangesFor("dir").size());
  }

  @Test
  public void testChangeSetsForDirectoriesWithFilesMovedAround() {
    addChangeSet(facade, "1", createDirectory(r, "dir1"), createDirectory(r, "dir2"));
    addChangeSet(facade, "2", createFile(r, "dir1/file"));
    addChangeSet(facade, "3", move(r, "dir1/file", "dir2"));

    List<ChangeSet> cc1 = getChangesFor("dir1");
    List<ChangeSet> cc2 = getChangesFor("dir2");

    assertEquals(3, cc1.size());
    assertEquals("3", cc1.get(0).getName());
    assertEquals("2", cc1.get(1).getName());
    assertEquals("1", cc1.get(2).getName());

    assertEquals(2, cc2.size());
    assertEquals("3", cc2.get(0).getName());
    assertEquals("1", cc2.get(1).getName());
  }

  @Test
  public void testChangeSetsForMovedFiles() {
    addChangeSet(facade, createDirectory(r, "dir1"), createDirectory(r, "dir2"));

    add(facade, createFile(r, "dir1/file"));
    add(facade, move(r, "dir1/file", "dir2"));

    assertEquals(2, getChangesFor("dir2/file").size());
  }

  @Test
  public void testChangingParentChangesItsChildren() {
    add(facade, createDirectory(r, "d"));
    add(facade, createFile(r, "d/file"));

    assertEquals(1, getChangesFor("d/file").size());

    add(facade, rename(r, "d", "dd"));

    assertEquals(2, getChangesFor("dd/file").size());
  }

  @Test
  public void testChangingPreviousParentDoesNotChangeItsChildren() {
    add(facade, createDirectory(r, "d1"));
    add(facade, createDirectory(r, "d2"));
    add(facade, createFile(r, "d1/file"));

    add(facade, move(r, "d1/file", "d2"));
    assertEquals(2, getChangesFor("d2/file").size());

    add(facade, rename(r, "d1", "d11"));
    assertEquals(2, getChangesFor("d2/file").size());
  }

  @Test
  public void testDoesNotIncludePreviousParentChanges() {
    add(facade, createDirectory(r, "dir"));
    add(facade, rename(r, "dir", "dir2"));
    add(facade, createFile(r, "dir2/file"));

    assertEquals(1, getChangesFor("dir2/file").size());
  }

  @Test
  public void testDoesNotIncludePreviousChangesForNewParent() {
    add(facade, createDirectory(r, "dir1"));
    add(facade, createFile(r, "dir1/file"));
    add(facade, createDirectory(r, "dir2"));
    add(facade, rename(r, "dir2", "dir3"));
    add(facade, move(r, "dir1/file", "dir3"));

    assertEquals(2, getChangesFor("dir3/file").size());
  }

  @Test
  public void testDoesNotIncludePreviousLabels() {
    facade.putUserLabel("label", "project");
    add(facade, createFile(r, "file"));
    assertEquals(1, getChangesFor("file").size());
  }

  @Test
  public void testChangesForComplexMovingCase() {
    addChangeSet(facade, createDirectory(r, "d1"),
                 createFile(r, "d1/file"),
                 createDirectory(r, "d1/d11"),
                 createDirectory(r, "d1/d12"),
                 createDirectory(r, "d2"));
    add(facade, move(r, "d1/file", "d1/d11"));
    add(facade, move(r, "d1/d11/file", "d1/d12"));

    assertEquals(3, getChangesFor("d1").size());
    assertEquals(3, getChangesFor("d1/d12/file").size());
    assertEquals(3, getChangesFor("d1/d11").size());
    assertEquals(2, getChangesFor("d1/d12").size());
    assertEquals(1, getChangesFor("d2").size());

    add(facade, new MoveChange(nextId(), "d2/d12", "d1"));

    assertEquals(4, getChangesFor("d1").size());
    assertEquals(4, getChangesFor("d2/d12/file").size());
    assertEquals(2, getChangesFor("d2").size());
    assertEquals(3, getChangesFor("d2/d12").size());
  }

  @Test
  public void testChangesForFileMovedIntoCreatedDir() {
    add(facade, createDirectory(r, "dir1"));

    ChangeSet cs1 = addChangeSet(facade, createFile(r, "dir1/file"));
    ChangeSet cs2 = addChangeSet(facade, createDirectory(r, "dir2"));
    ChangeSet cs3 = addChangeSet(facade, new MoveChange(nextId(), "dir2/file", "dir1"));

    assertEquals(array(cs3, cs1), getChangesFor("dir2/file"));
    assertEquals(array(cs3, cs2), getChangesFor("dir2"));
  }

  @Test
  public void testChangesForRestoreFile() {
    ChangeSet cs1 = addChangeSet(facade, createFile(r, "file"));
    ChangeSet cs2 = addChangeSet(facade, changeContent(r, "file", ""));
    ChangeSet cs3 = addChangeSet(facade, delete(r, "file"));
    ChangeSet cs4 = addChangeSet(facade, createFile(r, "file"));
    ChangeSet cs5 = addChangeSet(facade, changeContent(r, "file", "aaa"));

    assertEquals(array(cs5, cs4, cs3, cs2, cs1), getChangesFor("file"));
  }

  @Test
  public void testChangesForFileRestoredSeveralTimes() {
    ChangeSet cs1 = addChangeSet(facade, createFile(r, "file"));
    ChangeSet cs2 = addChangeSet(facade, delete(r, "file"));
    ChangeSet cs3 = addChangeSet(facade, createFile(r, "file"));
    ChangeSet cs4 = addChangeSet(facade, delete(r, "file"));
    ChangeSet cs5 = addChangeSet(facade, createFile(r, "file"));

    assertEquals(array(cs5, cs4, cs3, cs2, cs1), getChangesFor("file"));
  }

  @Test
  public void testChangesForRestoredDirectory() {
    ChangeSet cs1 = addChangeSet(facade, createDirectory(r, "dir"));
    ChangeSet cs2 = addChangeSet(facade, delete(r, "dir"));
    ChangeSet cs3 = addChangeSet(facade, createDirectory(r, "dir"));

    assertEquals(array(cs3, cs2, cs1), getChangesFor("dir"));
  }

  @Test
  public void testChangesForRestoredDirectoryWithRestoredChildren() {
    ChangeSet cs1 = addChangeSet(facade, createDirectory(r, "dir"));
    ChangeSet cs2 = addChangeSet(facade, createFile(r, "dir/file"));
    ChangeSet cs3 = addChangeSet(facade, delete(r, "dir"));
    ChangeSet cs4 = addChangeSet(facade, createDirectory(r, "dir"));
    ChangeSet cs5 = addChangeSet(facade, createFile(r, "dir/file"));

    assertEquals(array(cs5, cs4, cs3, cs2, cs1), getChangesFor("dir"));
    assertEquals(array(cs5, cs3, cs2), getChangesFor("dir/file"));
  }

  @Test
  public void testChangesForFileIfThereWereSomeDeletedFilesBeforeItsCreation() {
    ChangeSet cs1 = addChangeSet(facade, createFile(r, "f1"));
    ChangeSet cs2 = addChangeSet(facade, delete(r, "f1"));
    ChangeSet cs3 = addChangeSet(facade, createFile(r, "f2"));

    assertEquals(array(cs3), getChangesFor("f2"));
  }

  @Test
  public void testDoesNotIncludeChangeSetIfFileWasRestoredAndDeletedInOneChangeSet() {
    ChangeSet cs1 = addChangeSet(facade, createFile(r, "f"));
    ChangeSet cs2 = addChangeSet(facade, delete(r, "f"));
    ChangeSet cs3 = addChangeSet(facade, createFile(r, "f"), delete(r, "f"));
    ChangeSet cs4 = addChangeSet(facade, createFile(r, "f"));

    assertEquals(array(cs4, cs3, cs2, cs1), getChangesFor("f"));
  }

  @Test
  public void testIncludingChangeSetsWithLabelsInside() {
    ChangeSet cs1 = addChangeSet(facade, createFile(r, "f"));
    ChangeSet cs2 = addChangeSet(facade, new PutLabelChange(nextId(), "label", "project"));

    assertEquals(array(cs2, cs1), getChangesFor("f"));
  }

  @Test
  public void testDoesNotSplitChangeSetsWithLabelsInside() {
    ChangeSet cs1 = addChangeSet(facade, createFile(r, "f"));
    ChangeSet cs2 =
      addChangeSet(facade, changeContent(r, "f", null, -1), new PutLabelChange(nextId(), "label", "project"), changeContent(r, "f", null, -1));

    assertEquals(array(cs2, cs1), getChangesFor("f"));
  }

  @Test
  public void testDoesNotIncludeChangesMadeBetweenDeletionAndRestore() {
    ChangeSet cs1 = addChangeSet(facade, createFile(r, "file"));
    ChangeSet cs2 = addChangeSet(facade, delete(r, "file"));
    ChangeSet cs3 = addChangeSet(facade, new PutLabelChange(nextId(), "", "project"));
    ChangeSet cs4 = addChangeSet(facade, createFile(r, "file"));

    assertEquals(array(cs4, cs2, cs1), getChangesFor("file"));
  }

  @Test
  public void testDoesNotIgnoreDeletionOfChildren() {
    ChangeSet cs1 = addChangeSet(facade, createDirectory(r, "dir"));
    ChangeSet cs2 = addChangeSet(facade, createFile(r, "dir/file"));
    ChangeSet cs3 = addChangeSet(facade, delete(r, "dir/file"));

    assertEquals(array(cs3, cs2, cs1), getChangesFor("dir"));
  }

  @Test
  public void testChangesForRestoredFileWhenParentWasDeletedAfterDeletionOfTheFile() {
    ChangeSet cs1 = addChangeSet(facade, createDirectory(r, "dir1"));
    ChangeSet cs2 = addChangeSet(facade, createDirectory(r, "dir1/dir2"));
    ChangeSet cs3 = addChangeSet(facade, createFile(r, "dir1/dir2/file"));

    ChangeSet cs4 = addChangeSet(facade, delete(r, "dir1/dir2/file"));
    ChangeSet cs5 = addChangeSet(facade, delete(r, "dir1/dir2"));
    ChangeSet cs6 = addChangeSet(facade, delete(r, "dir1"));

    ChangeSet cs7 = addChangeSet(facade, createDirectory(r, "dir1"),
                                 createDirectory(r, "dir1/dir2"),
                                 createFile(r, "dir1/dir2/file"));

    assertEquals(array(cs7, cs4, cs3), getChangesFor("dir1/dir2/file"));
    assertEquals(array(cs7, cs5, cs4, cs3, cs2), getChangesFor("dir1/dir2"));
    assertEquals(array(cs7, cs6, cs5, cs4, cs3, cs2, cs1), getChangesFor("dir1"));
  }

  @Test
  public void testDoesNotIncludeChangesIfFileAndItsParentWasDeletedAndRestoredInOneChangeSet() {
    ChangeSet cs1 = addChangeSet(facade, createDirectory(r, "dir"),
                                 createFile(r, "dir/file"));

    ChangeSet cs2 = addChangeSet(facade, delete(r, "dir/file"),
                                 delete(r, "dir"));

    ChangeSet cs3 = addChangeSet(facade, createDirectory(r, "dir"),
                                 createFile(r, "dir/file"),
                                 delete(r, "dir/file"),
                                 delete(r, "dir"));

    ChangeSet cs4 = addChangeSet(facade, createDirectory(r, "dir"),
                                 createFile(r, "dir/file"));

    assertEquals(array(cs4, cs3, cs2, cs1), getChangesFor("dir/file"));
    assertEquals(array(cs4, cs3, cs2, cs1), getChangesFor("dir"));
  }

  @Test
  public void testFilteredChanges() throws Exception {
    ChangeSet cs1 = addChangeSet(facade, createDirectory(r, "dir"));
    ChangeSet cs2 = addChangeSet(facade, createFile(r, "dir/FooBar"));
    ChangeSet cs3 = addChangeSet(facade, createFile(r, "dir/BarBaz"));

    assertEquals(array(cs2), getChangesFor("dir", "f"));
    assertEquals(array(cs2), getChangesFor("dir", "foo"));
    assertEquals(array(cs2), getChangesFor("dir", "FB"));
    assertEquals(array(cs3), getChangesFor("dir", "bar"));
    assertEquals(array(), getChangesFor("dir", "Baz"));
    assertEquals(array(cs3, cs2), getChangesFor("dir", "*Bar*"));
  }

  @Test
  public void testFilteredChangesDoesnTIncludeChanges() throws Exception {
    ChangeSet cs1 = addChangeSet(facade, createDirectory(r, "dir"));
    ChangeSet cs2 = addChangeSet(facade, createFile(r, "dir/FooBar"));
    ChangeSet cs3 = addChangeSet(facade, createFile(r, "dir/BarBaz"));

    assertEquals(array(cs2), getChangesFor("dir", "f"));
    assertEquals(array(cs2), getChangesFor("dir", "foo"));
    assertEquals(array(cs2), getChangesFor("dir", "FB"));
    assertEquals(array(cs3), getChangesFor("dir", "bar"));
    assertEquals(array(), getChangesFor("dir", "Baz"));
    assertEquals(array(cs3, cs2), getChangesFor("dir", "*Bar*"));
  }

  private List<ChangeSet> getChangesFor(String path) {
    return getChangesFor(path, null);
  }

  private List<ChangeSet> getChangesFor(String path, String pattern) {
    return collectChanges(facade, path, "project", pattern);
  }
}
