package mobi.hsz.idea.gitignore.resolving;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFileSystemItem;
import com.intellij.psi.PsiPolyVariantReference;
import com.intellij.psi.ResolveResult;
import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import mobi.hsz.idea.gitignore.file.type.kind.GitFileType;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
import java.util.List;
public class ResolvingTest extends LightPlatformCodeInsightFixtureTestCase {
@Override
protected boolean isWriteActionRequired() {
return true;
}
public void testSimple() {
myFixture.getTempDirFixture().createFile("fileName.txt");
doTest("fileNa<caret>me.txt", "fileName.txt");
}
public void testNestedDirectory() throws IOException {
myFixture.getTempDirFixture().findOrCreateDir("dir").createChildData(this, "fileName.txt");
doTest("dir/file<caret>Name.txt", "dir/fileName.txt");
}
public void testInHiddenDirectory() throws IOException {
myFixture.getTempDirFixture().findOrCreateDir(".hidden").createChildData(this, "fileName.txt");
doTest(".hidden/file<caret>Name.txt", ".hidden/fileName.txt");
}
public void testGlob() throws IOException {
VirtualFile dir = myFixture.getTempDirFixture().findOrCreateDir("glob");
dir.createChildData(this, "fileName1.txt");
dir.createChildData(this, "fileName2.txt");
doTest("glob/*<caret>.txt", "glob/fileName1.txt", "glob/fileName2.txt");
}
public void testGlobInParent() throws IOException {
myFixture.getTempDirFixture().findOrCreateDir("glob1").createChildData(this, "fileName.txt");
myFixture.getTempDirFixture().findOrCreateDir("glob2").createChildData(this, "fileName.txt");
doTest("*/file<caret>Name.txt", "glob1/fileName.txt", "glob2/fileName.txt");
}
public void testInvalidRegex() throws IOException {
myFixture.getTempDirFixture().findOrCreateDir("glob").createChildData(this, "fileName1.txt");
doTest("glob/fileN(<caret>.txt");
}
public void testNegation() throws IOException {
myFixture.getTempDirFixture().createFile("fileName.txt");
doTest("!fileNa<caret>me.txt", "fileName.txt");
}
public void testNested() throws IOException {
myFixture.getTempDirFixture().findOrCreateDir("dir1").createChildData(this, "fileName.txt");
myFixture.getTempDirFixture().findOrCreateDir("dir2").createChildData(this, "fileName.txt");
doTest("file<caret>Name.txt", "dir1/fileName.txt", "dir2/fileName.txt");
}
private void doTest(@NotNull String beforeText, String... expectedResolve) {
myFixture.configureByText(GitFileType.INSTANCE, beforeText);
PsiPolyVariantReference reference = ((PsiPolyVariantReference) myFixture.getReferenceAtCaretPosition());
assertNotNull(reference);
final VirtualFile rootFile = myFixture.getFile().getContainingDirectory().getVirtualFile();
ResolveResult[] resolveResults = reference.multiResolve(true);
List<String> actualResolve = ContainerUtil.map(resolveResults, new Function<ResolveResult, String>() {
@Override
public String fun(ResolveResult resolveResult) {
PsiElement resolveResultElement = resolveResult.getElement();
assertNotNull(resolveResultElement);
assertInstanceOf(resolveResultElement, PsiFileSystemItem.class);
PsiFileSystemItem fileSystemItem = (PsiFileSystemItem) resolveResultElement;
return VfsUtilCore.getRelativePath(fileSystemItem.getVirtualFile(), rootFile, '/');
}
});
assertContainsElements(actualResolve, expectedResolve);
}
}