// Copyright 2015 Pants project contributors (see CONTRIBUTORS.md).
// Licensed under the Apache License, Version 2.0 (see LICENSE).
package com.twitter.intellij.pants.components.impl;
import com.intellij.openapi.application.AccessToken;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.SourceFolder;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.util.ArrayUtil;
import com.twitter.intellij.pants.components.PantsProjectCache;
import com.twitter.intellij.pants.testFramework.PantsCodeInsightFixtureTestCase;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
public class PantsProjectCacheTest extends PantsCodeInsightFixtureTestCase {
@Override
protected void setUp() throws Exception {
super.setUp();
ApplicationManager.getApplication().runWriteAction(
new Runnable() {
@Override
public void run() {
final ModifiableRootModel modifiableRootModel = ModuleRootManager.getInstance(myModule).getModifiableModel();
for (ContentEntry contentEntry : modifiableRootModel.getContentEntries()) {
final SourceFolder[] sourceFolders = contentEntry.getSourceFolders();
for (SourceFolder sourceFolder : sourceFolders) {
contentEntry.removeSourceFolder(sourceFolder);
}
}
modifiableRootModel.commit();
}
}
);
PantsProjectCacheImpl.getInstance(getProject()).projectOpened();
}
@Override
protected void tearDown() throws Exception {
PantsProjectCacheImpl.getInstance(getProject()).projectClosed();
super.tearDown();
}
@NotNull
public VirtualFile getMainContentRoot() {
final VirtualFile result = ArrayUtil.getFirstElement(ModuleRootManager.getInstance(myModule).getContentRoots());
assertNotNull(result);
return result;
}
public void testEmpty() {
final PantsProjectCache cache = PantsProjectCacheImpl.getInstance(myFixture.getProject());
assertFalse(cache.folderContainsSourceRoot(myFixture.getProject().getBaseDir()));
}
public void testLastOne() throws IOException {
final PantsProjectCache cache = PantsProjectCacheImpl.getInstance(myFixture.getProject());
final VirtualFile root = getMainContentRoot();
final AccessToken writeAccessToken = ApplicationManager.getApplication().acquireWriteActionLock(getClass());
try {
PsiTestUtil.addSourceRoot(myModule, VfsUtil.createDirectoryIfMissing(root, "bar"));
PsiTestUtil.addSourceRoot(myModule, VfsUtil.createDirectoryIfMissing(root, "baz"));
assertTrue(cache.folderContainsSourceRoot(VfsUtil.createDirectoryIfMissing(root, "baz")));
assertFalse(cache.folderContainsSourceRoot(VfsUtil.createDirectoryIfMissing(root, "ba")));
assertFalse(cache.folderContainsSourceRoot(VfsUtil.createDirectoryIfMissing(root, "bat")));
}
finally {
writeAccessToken.finish();
}
}
public void testFirstOne() throws IOException {
final PantsProjectCache cache = PantsProjectCacheImpl.getInstance(myFixture.getProject());
final VirtualFile root = getMainContentRoot();
final AccessToken writeAccessToken = ApplicationManager.getApplication().acquireWriteActionLock(getClass());
try {
PsiTestUtil.addSourceRoot(myModule, VfsUtil.createDirectoryIfMissing(root, "abc"));
PsiTestUtil.addSourceRoot(myModule, VfsUtil.createDirectoryIfMissing(root, "foo/bar"));
PsiTestUtil.addSourceRoot(myModule, VfsUtil.createDirectoryIfMissing(root, "foo/baz"));
assertTrue(cache.folderContainsSourceRoot(VfsUtil.createDirectoryIfMissing(root, "abc")));
assertTrue(cache.folderContainsSourceRoot(VfsUtil.createDirectoryIfMissing(root, "foo")));
}
finally {
writeAccessToken.finish();
}
}
}