| /* |
| * 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); |
| } |
| } |