package com.google.jstestdriver.idea.assertFramework.qunit.codeInsight;
import com.google.jstestdriver.idea.assertFramework.codeInsight.AbstractJsGenerateAction;
import com.google.jstestdriver.idea.assertFramework.codeInsight.GenerateActionContext;
import com.google.jstestdriver.idea.assertFramework.codeInsight.JsGeneratorUtils;
import com.google.jstestdriver.idea.assertFramework.qunit.QUnitFileStructure;
import com.google.jstestdriver.idea.assertFramework.qunit.QUnitFileStructureBuilder;
import com.google.jstestdriver.idea.assertFramework.qunit.QUnitModuleStructure;
import com.google.jstestdriver.idea.assertFramework.qunit.QUnitTestMethodStructure;
import com.intellij.codeInsight.template.Template;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class QUnitGenerateNewTestAction extends AbstractJsGenerateAction {
@NotNull
@Override
public String getHumanReadableDescription() {
return "QUnit Test";
}
@Override
public boolean isEnabled(@NotNull GenerateActionContext context) {
Runnable generator = createGenerator(context);
return generator != null;
}
@Override
public void actionPerformed(@NotNull GenerateActionContext context) {
Runnable generator = createGenerator(context);
if (generator != null) {
generator.run();
}
}
@Nullable
private static Runnable createGenerator(final @NotNull GenerateActionContext context) {
QUnitFileStructureBuilder builder = QUnitFileStructureBuilder.getInstance();
QUnitFileStructure fileStructure = builder.buildTestFileStructure(context.getJsFile());
return createGenerator(context, fileStructure);
}
@Nullable
private static Runnable createGenerator(final @NotNull GenerateActionContext context, @NotNull final QUnitFileStructure fileStructure) {
if (fileStructure.hasQUnitSymbols()) {
final PsiElement psiElement = context.getPsiElementUnderCaret();
if (psiElement == null) {
return null;
}
return new Runnable() {
@Override
public void run() {
final int caretOffset = context.getDocumentCaretOffset();
QUnitTestMethodStructure testMethodStructure = fileStructure.findTestMethodStructureContainingOffset(caretOffset);
PsiElement element = psiElement;
if (testMethodStructure != null) {
element = testMethodStructure.getCallExpression();
}
QUnitModuleStructure moduleStructureUnderCaret = fileStructure.findModuleStructureContainingOffset(caretOffset);
if (moduleStructureUnderCaret != null) {
element = moduleStructureUnderCaret.getEnclosingCallExpression();
}
int suitableCaretOffset = JsGeneratorUtils.findSuitableOffsetForNewStatement(element, caretOffset);
context.getCaretModel().moveToOffset(suitableCaretOffset);
Template template = JsGeneratorUtils.createDefaultTemplate("test(\"${test name}\", function() {|});");
context.startTemplate(template);
}
};
}
return null;
}
}