Merge branch 'master' of git.labs.intellij.net:idea/community
[idea/community.git] / plugins / hg4idea / testSrc / org / zmlx / hg4idea / test / HgTestChangeListManager.java
1 /*
2  * Copyright 2000-2010 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package org.zmlx.hg4idea.test;
17
18 import com.intellij.openapi.application.ApplicationManager;
19 import com.intellij.openapi.project.Project;
20 import com.intellij.openapi.vcs.changes.Change;
21 import com.intellij.openapi.vcs.changes.ChangeListManagerImpl;
22 import com.intellij.openapi.vcs.changes.LocalChangeList;
23 import com.intellij.openapi.vfs.VirtualFile;
24 import com.intellij.util.containers.HashSet;
25 import org.testng.Assert;
26
27 import java.util.ArrayList;
28 import java.util.Arrays;
29 import java.util.Collection;
30 import java.util.List;
31
32 import static org.testng.Assert.assertNotNull;
33
34 /**
35  * The ChangeListManagerImpl extension with some useful helper methods for tests.
36  * @author Kirill Likhodedov
37  */
38 public class HgTestChangeListManager {
39
40   private ChangeListManagerImpl peer;
41
42   public HgTestChangeListManager(Project project) {
43     peer = ChangeListManagerImpl.getInstanceImpl(project);
44   }
45
46   /**
47    * Adds the specified unversioned files to the repository (to the default change list).
48    * Shortcut for ChangeListManagerImpl.addUnversionedFiles().
49    */
50   public void addUnversionedFilesToVcs(VirtualFile... files) {
51     peer.addUnversionedFiles(peer.getDefaultChangeList(), Arrays.asList(files));
52     ensureUpToDate();
53   }
54
55   /**
56    * Updates the change list manager and checks that the given files are in the default change list.
57    * @param only Set this to true if you want ONLY the specified files to be in the change list.
58    *             If set to false, the change list may contain some other files apart from the given ones.
59    * @param files Files to be checked.
60    */
61   public void checkFilesAreInList(boolean only, VirtualFile... files) {
62     ensureUpToDate();
63
64     final Collection<Change> changes = peer.getDefaultChangeList().getChanges();
65     if (only) {
66       Assert.assertEquals(changes.size(), files.length);
67     }
68     final Collection<VirtualFile> filesInChangeList = new HashSet<VirtualFile>();
69     for (Change c : changes) {
70       filesInChangeList.add(c.getVirtualFile());
71     }
72     for (VirtualFile f : files) {
73       Assert.assertTrue(filesInChangeList.contains(f));
74     }
75   }
76
77   /**
78    * Commits all changes of the given files.
79    */
80   public void commitFiles(VirtualFile... files) {
81     ensureUpToDate();
82     final List<Change> changes = new ArrayList<Change>(files.length);
83     for (VirtualFile f : files) {
84       changes.addAll(peer.getChangesIn(f));
85     }
86     final LocalChangeList list = peer.getDefaultChangeList();
87     assertNotNull(list);
88     list.setComment("A comment to a commit");
89     Assert.assertTrue(peer.commitChangesSynchronouslyWithResult(list, changes));
90     ensureUpToDate();
91   }
92
93   /**
94    * Ensures the ChangelistManager is up to date.
95    * It is called after each operation in the HgTestChangeListManager.
96    */
97   public void ensureUpToDate() {
98     if (!ApplicationManager.getApplication().isDispatchThread()) { // for dispatch thread no need to force update.
99       peer.ensureUpToDate(false);
100     }
101   }
102
103 }