package com.haskforce.resolve;
import com.haskforce.HaskellLightPlatformCodeInsightFixtureTestCase;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import java.io.File;
import java.util.Collection;
import java.util.regex.Pattern;
public abstract class HaskellResolveTestCase extends HaskellLightPlatformCodeInsightFixtureTestCase {
protected PsiReference referencedElement;
protected PsiElement resolvedElement;
public HaskellResolveTestCase(String srcName) {
super(srcName, srcName);
}
public HaskellResolveTestCase() {
this("resolve");
}
@Override
protected String getTestDataPath() {
return FileUtil.join(super.getTestDataPath(), getTestName(false));
}
private Collection<File> getTestDataFiles() {
return com.haskforce.utils.FileUtil.findFilesRecursively(new File(getTestDataPath()));
}
@Override
protected void setUp() throws Exception {
super.setUp();
for (File file : getTestDataFiles()) {
if (file.isDirectory()) continue;
String text = FileUtil.loadFile(file, CharsetToolkit.UTF8);
text = StringUtil.convertLineSeparators(text);
int referencedOffset = text.indexOf("<ref>");
text = text.replace("<ref>", "");
int resolvedOffset = text.indexOf("<resolved>");
text = text.replace("<resolved>", "");
String relativePath = file.getCanonicalPath().substring(
file.getCanonicalPath().indexOf(getTestDataPath()) + getTestDataPath().length() + 1
);
VirtualFile vFile = myFixture.getTempDirFixture().createFile(relativePath, text);
PsiFile psiFile = myFixture.configureFromTempProjectFile(relativePath);
if (referencedOffset != -1) {
referencedElement = psiFile.findReferenceAt(referencedOffset);
if (referencedElement == null) fail("Reference was null in " + file.getName());
}
if (resolvedOffset != -1) {
final PsiReference ref = psiFile.findReferenceAt(resolvedOffset);
if (ref == null) { fail("Reference was null in " + file.getName()); }
resolvedElement = ref.getElement();
if (resolvedElement == null) { fail("Reference returned null element in " + file.getName()); }
}
}
}
protected void doTest() { doTest(true); }
protected void doTest(boolean succeed) {
if (succeed && referencedElement == null) { fail("Could not find reference at caret."); }
if (succeed && resolvedElement == null) { fail("Could not find resolved element."); }
if (succeed) {
PsiElement resolvedActual = referencedElement.resolve();
assertEquals(
"Could not resolve expected reference.\n" +
"Expected: " + resolvedElement + " (" + resolvedElement.getText() + ")\n" +
"Actual: " + resolvedActual + " (" + resolvedActual.getText() + ")",
resolvedElement,
resolvedActual
);
} else {
assertFalse("Resolved unexpected reference.", resolvedElement.equals(referencedElement.resolve()));
}
}
}