package com.google.jstestdriver.idea.execution.tree;
import com.google.common.collect.Maps;
import com.google.jstestdriver.TestResult;
import com.intellij.execution.Location;
import com.intellij.execution.PsiLocation;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.util.Collection;
import java.util.Map;
class JstdConfigFileNode extends Node {
private final BrowserNode myBrowserNode;
private final VirtualFile myVirtualFile;
private final String myAbsoluteFilePath;
private final Map<String, TestCaseNode> myTestCaseMap = Maps.newHashMap();
private boolean myFake;
public JstdConfigFileNode(@NotNull BrowserNode browserNode, @Nullable VirtualFile directory, @NotNull String absoluteFilePath, boolean fake) {
super(createTestProxy(directory, absoluteFilePath));
myBrowserNode = browserNode;
myVirtualFile = LocalFileSystem.getInstance().findFileByIoFile(new File(absoluteFilePath));
myAbsoluteFilePath = absoluteFilePath;
myFake = fake;
browserNode.registerJstdConfigFileNode(this);
}
public static SMTestProxyWithPrinterAndLocation createTestProxy(@Nullable VirtualFile directory, @NotNull String absoluteFilePath) {
final VirtualFile virtualFile = LocalFileSystem.getInstance().findFileByIoFile(new File(absoluteFilePath));
String displayPath = calcDisplayPath(directory, virtualFile, absoluteFilePath);
return new SMTestProxyWithPrinterAndLocation(displayPath, true, new LocationProvider() {
@Override
public Location provideLocation(@NotNull Project project) {
if (virtualFile == null) {
return null;
}
PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile);
return PsiLocation.fromPsiElement(psiFile);
}
});
}
private static String calcDisplayPath(VirtualFile directory, VirtualFile virtualFile, String absoluteFilePath) {
if (directory == null || virtualFile == null) return absoluteFilePath;
String directoryPath = directory.getPath();
String vfp = virtualFile.getPath();
if (vfp.startsWith(directoryPath)) {
String res = vfp.substring(directoryPath.length());
return res.startsWith("/") || res.startsWith("\\") ? res.substring(1) : res;
}
return absoluteFilePath;
}
public BrowserNode getBrowserNode() {
return myBrowserNode;
}
@Nullable
public VirtualFile getVirtualFile() {
return myVirtualFile;
}
@NotNull
public String getAbsoluteFilePath() {
return myAbsoluteFilePath;
}
@NotNull
public File getConfigFile() {
return new File(myAbsoluteFilePath);
}
public TestCaseNode getTestCaseNode(String testCase) {
return myTestCaseMap.get(testCase);
}
public void registerTestCaseNode(@NotNull TestCaseNode testCaseNode) {
myTestCaseMap.put(testCaseNode.getName(), testCaseNode);
}
@Override
public Collection<? extends Node> getChildren() {
return myTestCaseMap.values();
}
@Override
public void setTestFailed(TestResult.Result result) {
if (!myFake) {
super.setTestFailed(result);
}
}
}