blob: 1f0f7c73f588a408b9a88062aeb27a457d63b2cb [file] [log] [blame]
/*
* Copyright 2000-2010 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 org.zmlx.hg4idea.test;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vcs.changes.Change;
import com.intellij.openapi.vcs.changes.ChangeListManagerImpl;
import com.intellij.openapi.vcs.changes.LocalChangeList;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.containers.HashSet;
import com.intellij.util.ui.UIUtil;
import org.testng.Assert;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static org.testng.Assert.assertNotNull;
/**
* The ChangeListManagerImpl extension with some useful helper methods for tests.
* @author Kirill Likhodedov
*/
public class HgTestChangeListManager {
private ChangeListManagerImpl peer;
public HgTestChangeListManager(Project project) {
peer = ChangeListManagerImpl.getInstanceImpl(project);
}
/**
* Adds the specified unversioned files to the repository (to the default change list).
* Shortcut for ChangeListManagerImpl.addUnversionedFiles().
*/
public void addUnversionedFilesToVcs(VirtualFile... files) {
peer.addUnversionedFiles(peer.getDefaultChangeList(), Arrays.asList(files));
ensureUpToDate();
}
/**
* Updates the change list manager and checks that the given files are in the default change list.
* @param only Set this to true if you want ONLY the specified files to be in the change list.
* If set to false, the change list may contain some other files apart from the given ones.
* @param files Files to be checked.
*/
public void checkFilesAreInList(boolean only, VirtualFile... files) {
ensureUpToDate();
final Collection<Change> changes = peer.getDefaultChangeList().getChanges();
if (only) {
Assert.assertEquals(changes.size(), files.length);
}
final Collection<VirtualFile> filesInChangeList = new HashSet<VirtualFile>();
for (Change c : changes) {
filesInChangeList.add(c.getVirtualFile());
}
for (VirtualFile f : files) {
Assert.assertTrue(filesInChangeList.contains(f));
}
}
/**
* Commits all changes of the given files.
*/
public void commitFiles(VirtualFile... files) {
ensureUpToDate();
final List<Change> changes = new ArrayList<Change>(files.length);
for (VirtualFile f : files) {
changes.addAll(peer.getChangesIn(f));
}
final LocalChangeList list = peer.getDefaultChangeList();
assertNotNull(list);
list.setComment("A comment to a commit");
UIUtil.invokeAndWaitIfNeeded(new Runnable() {
@Override
public void run() {
Assert.assertTrue(peer.commitChangesSynchronouslyWithResult(list, changes));
}
});
ensureUpToDate();
}
/**
* Ensures the ChangelistManager is up to date.
* It is called after each operation in the HgTestChangeListManager.
*/
public void ensureUpToDate() {
if (!ApplicationManager.getApplication().isDispatchThread()) { // for dispatch thread no need to force update.
peer.ensureUpToDate(false);
}
}
}