package com.google.jstestdriver.idea.assertFramework.jasmine;
import com.google.common.collect.Lists;
import com.google.inject.internal.Maps;
import com.google.jstestdriver.idea.assertFramework.AbstractTestFileStructure;
import com.google.jstestdriver.idea.assertFramework.JstdRunElement;
import com.intellij.lang.javascript.psi.JSFile;
import com.intellij.openapi.util.TextRange;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
import java.util.Map;
public class JasmineFileStructure extends AbstractTestFileStructure {
private final List<JasmineSuiteStructure> mySuiteStructures = Lists.newArrayList();
private final Map<String, JasmineSuiteStructure> mySuiteMap = Maps.newHashMap();
public JasmineFileStructure(@NotNull JSFile jsFile) {
super(jsFile);
}
public void addDescribeStructure(JasmineSuiteStructure suiteStructure) {
mySuiteStructures.add(suiteStructure);
mySuiteMap.put(suiteStructure.getName(), suiteStructure);
}
@Nullable
public JasmineSuiteStructure findTopLevelSuiteByName(String suiteName) {
return mySuiteMap.get(suiteName);
}
public int getTopLevelSuiteCount() {
return mySuiteStructures.size();
}
public boolean hasJasmineSymbols() {
return getTopLevelSuiteCount() > 0;
}
@Nullable
public JasmineSuiteStructure findLowestSuiteStructureContainingOffset(int offset) {
for (JasmineSuiteStructure suiteStructure : mySuiteStructures) {
JasmineSuiteStructure inner = suiteStructure.findLowestSuiteStructureContainingOffset(offset);
if (inner != null) {
return inner;
}
}
return null;
}
@Nullable
public JasmineSpecStructure findSpecContainingOffset(int offset) {
for (JasmineSuiteStructure suiteStructure : mySuiteStructures) {
JasmineSpecStructure specStructure = suiteStructure.findSpecContainingOffset(offset);
if (specStructure != null) {
return specStructure;
}
}
return null;
}
@Override
@Nullable
public JstdRunElement findJstdRunElement(@NotNull TextRange textRange) {
for (JasmineSuiteStructure suiteStructure : mySuiteStructures) {
JstdRunElement jstdRunElement = suiteStructure.findJstdRunElement(textRange);
if (jstdRunElement != null) {
return jstdRunElement;
}
}
return null;
}
@Override
public PsiElement findPsiElement(@NotNull String testCaseName, @Nullable String testMethodName) {
JasmineSuiteStructure suiteStructure = mySuiteMap.get(testCaseName);
if (suiteStructure != null) {
if (testMethodName != null) {
JasmineSpecStructure specStructure = suiteStructure.getInnerSpecByName(testMethodName);
if (specStructure != null) {
return specStructure.getEnclosingCallExpression();
}
} else {
return suiteStructure.getEnclosingCallExpression();
}
}
return null;
}
}