/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.framework.core;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.fileEditor.FileDocumentManager;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.FileTypeRegistry;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.roots.OrderRootType;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.PsiManagerImpl;
import com.intellij.testFramework.PsiTestData;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.util.IncorrectOperationException;
import gw.plugin.ij.framework.SmartTextRange;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/**
* @author Mike
*/
public abstract class PsiTestCase extends ModuleTestCase {
protected PsiManagerImpl myPsiManager;
private String myDataRoot;
@Override
protected void beforeMethod() throws Exception {
super.beforeMethod();
myPsiManager = (PsiManagerImpl) PsiManager.getInstance(myProject);
}
@Override
protected void afterMethod() throws Exception {
myPsiManager = null;
super.afterMethod();
}
protected PsiFile createDummyFile(String fileName, String text) throws IncorrectOperationException {
FileType type = FileTypeRegistry.getInstance().getFileTypeByFileName(fileName);
return PsiFileFactory.getInstance(myProject).createFileFromText(fileName, type, text);
}
protected PsiFile createFile(@NonNls String fileName, String text) throws Exception {
return createFile(myModule, fileName, text);
}
protected PsiFile createFile(Module module, String fileName, String text) throws Exception {
File dir = createTempDirectory();
VirtualFile vDir = LocalFileSystem.getInstance().refreshAndFindFileByPath(dir.getCanonicalPath().replace(File.separatorChar, '/'));
return createFile(module, vDir, fileName, text);
}
protected PsiFile createFile(final Module module, final VirtualFile vDir, final String fileName, final String text) throws IOException {
return new WriteAction<PsiFile>() {
@Override
protected void run(Result<PsiFile> result) throws Throwable {
if (!ModuleRootManager.getInstance(module).getFileIndex().isInSourceContent(vDir)) {
addSourceContentToRoots(module, vDir);
}
final VirtualFile vFile = vDir.createChildData(vDir, fileName);
VfsUtil.saveText(vFile, text);
assertNotNull(vFile);
final PsiFile file = myPsiManager.findFile(vFile);
assertNotNull(file);
result.setResult(file);
}
}.execute().getResultObject();
}
protected void addSourceContentToRoots(final Module module, final VirtualFile vDir) {
PsiTestUtil.addSourceContentToRoots(module, vDir);
}
protected String getTestDataPath() {
return PathManagerEx.getTestDataPath();
}
protected PsiTestData createData() {
return new PsiTestData();
}
protected static void printText(String text) {
final String q = "\"";
System.out.print(q);
text = StringUtil.convertLineSeparators(text);
StringTokenizer tokenizer = new StringTokenizer(text, "\n", true);
while (tokenizer.hasMoreTokens()) {
final String token = tokenizer.nextToken();
if (token.equals("\n")) {
System.out.print(q);
System.out.println();
System.out.print(q);
continue;
}
System.out.print(token);
}
System.out.print(q);
System.out.println();
}
protected void addLibraryToRoots(final VirtualFile jarFile, OrderRootType rootType) {
addLibraryToRoots(myModule, jarFile, rootType);
}
protected static void addLibraryToRoots(final Module module, final VirtualFile root, final OrderRootType rootType) {
assertEquals(OrderRootType.CLASSES, rootType);
ModuleRootModificationUtil.addModuleLibrary(module, root.getUrl());
}
public com.intellij.openapi.editor.Document getDocument(PsiFile file) {
return PsiDocumentManager.getInstance(getProject()).getDocument(file);
}
public com.intellij.openapi.editor.Document getDocument(VirtualFile file) {
return FileDocumentManager.getInstance().getDocument(file);
}
public void commitDocument(com.intellij.openapi.editor.Document document) {
PsiDocumentManager.getInstance(getProject()).commitDocument(document);
}
// public List<SmartTextRange> psis2Ranges(Collection<PsiReference> psis) {
// List<SmartTextRange> ranges = new ArrayList<SmartTextRange>();
// for (PsiReference psi : psis) {
// ranges.add(new SmartTextRange(psi.getElement()));
// }
// return ranges;
// }
@NotNull
public List<SmartTextRange> psis2Ranges(@NotNull List<PsiElement> psis) {
List<SmartTextRange> ranges = new ArrayList<>();
for (PsiElement psi : psis) {
ranges.add(new SmartTextRange(psi));
}
return ranges;
}
}