package com.google.jstestdriver.idea.assertFramework.jstd;
import com.google.jstestdriver.idea.assertFramework.library.JstdLibraryUtil;
import com.google.jstestdriver.idea.execution.JstdSettingsUtil;
import com.intellij.codeInspection.LocalInspectionToolSession;
import com.intellij.codeInspection.LocalQuickFix;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.lang.javascript.inspections.JSInspection;
import com.intellij.lang.javascript.psi.JSCallExpression;
import com.intellij.lang.javascript.psi.JSElementVisitor;
import com.intellij.lang.javascript.psi.JSFile;
import com.intellij.lang.javascript.psi.JSReferenceExpression;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.util.ObjectUtils;
import org.jetbrains.annotations.NotNull;
public class JsTestDriverTestCaseWithoutTestsInspection extends JSInspection {
@Override
public boolean isEnabledByDefault() {
return false;
}
@NotNull
@Override
protected PsiElementVisitor createVisitor(ProblemsHolder holder, LocalInspectionToolSession session) {
JSFile jsFile = ObjectUtils.tryCast(holder.getFile(), JSFile.class);
if (jsFile == null) {
return JSElementVisitor.NOP_ELEMENT_VISITOR;
}
Project project = holder.getProject();
if (!ApplicationManager.getApplication().isUnitTestMode()) {
if (!JstdSettingsUtil.areJstdConfigFilesInProjectCached(project)) {
return JSElementVisitor.NOP_ELEMENT_VISITOR;
}
}
VirtualFile virtualFile = jsFile.getVirtualFile();
if (virtualFile != null) {
boolean inScope = JstdLibraryUtil.isFileInJstdLibScope(project, virtualFile);
if (!inScope) {
return JSElementVisitor.NOP_ELEMENT_VISITOR;
}
}
JstdTestFileStructure testFileStructure = JstdTestFileStructureBuilder.getInstance().fetchCachedTestFileStructure(jsFile);
for (JstdTestCaseStructure structure : testFileStructure.getTestCaseStructures()) {
if (structure.getTestCount() == 0) {
JSCallExpression callExpression = structure.getEnclosingCallExpression();
if (callExpression.isValid()) {
JSReferenceExpression methodExpression = ObjectUtils.tryCast(callExpression.getMethodExpression(), JSReferenceExpression.class);
if (methodExpression != null) {
int startOffset = methodExpression.getStartOffsetInParent();
TextRange rangeInElement = TextRange.create(
startOffset,
startOffset + methodExpression.getTextLength()
);
holder.registerProblem(
callExpression,
"TestCase has no tests. Tests names should have 'test' prefix.",
ProblemHighlightType.GENERIC_ERROR_OR_WARNING,
rangeInElement,
LocalQuickFix.EMPTY_ARRAY
);
}
}
}
}
return JSElementVisitor.NOP_ELEMENT_VISITOR;
}
}