From 68c527259986ae8f6defebbce23533f598d5b310 Mon Sep 17 00:00:00 2001 From: Oliver Nybroe Date: Thu, 9 Jul 2020 12:41:06 +0200 Subject: [PATCH] feat(line-markers): Add support for running files (#17) * Rename .java to .kt * feat(line-markers): Add support for running files The line markers now works, however they always run the whole file. * feat(line-markers): Add support for running files The line markers now works, however they always run the whole file. --- CHANGELOG.md | 1 + .../pest/PestTestRunLineMarkerProvider.java | 22 -------- src/main/java/com/pestphp/pest/PestUtil.java | 56 +++---------------- .../pest/action/BasePestRunAction.java | 33 ----------- .../action/CreateRunSingleTestAction.java | 39 ------------- .../pest/action/RunSingleTestAction.java | 39 ------------- .../configuration/PestRunConfiguration.java | 29 +++++++--- .../PestRunConfigurationProducer.java | 26 --------- .../PestRunConfigurationProducer.kt | 51 +++++++++++++++++ 9 files changed, 79 insertions(+), 217 deletions(-) delete mode 100644 src/main/java/com/pestphp/pest/action/BasePestRunAction.java delete mode 100644 src/main/java/com/pestphp/pest/action/CreateRunSingleTestAction.java delete mode 100644 src/main/java/com/pestphp/pest/action/RunSingleTestAction.java delete mode 100644 src/main/java/com/pestphp/pest/configuration/PestRunConfigurationProducer.java create mode 100644 src/main/kotlin/com/pestphp/pest/configuration/PestRunConfigurationProducer.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ab44f7f..c875a262 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ## [Unreleased] ### Added - Basic autocompletion for `$this` for PhpUnit TestCase base class ([#11](https://github.com/pestphp/pest-intellij/pull/11)) +- Line markers now works, but runs the whole file and not the single test. ([#17](https://github.com/pestphp/pest-intellij/pull/17)) ## [v0.1.1] ### Added diff --git a/src/main/java/com/pestphp/pest/PestTestRunLineMarkerProvider.java b/src/main/java/com/pestphp/pest/PestTestRunLineMarkerProvider.java index d25a4464..9f4faf03 100644 --- a/src/main/java/com/pestphp/pest/PestTestRunLineMarkerProvider.java +++ b/src/main/java/com/pestphp/pest/PestTestRunLineMarkerProvider.java @@ -1,24 +1,14 @@ package com.pestphp.pest; -import com.intellij.execution.TestStateStorage; import com.intellij.execution.lineMarker.RunLineMarkerContributor; -import com.intellij.execution.testframework.TestIconMapper; -import com.intellij.execution.testframework.sm.runner.states.TestStateInfo; -import com.intellij.icons.AllIcons; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import com.intellij.util.ObjectUtils; import com.jetbrains.php.lang.lexer.PhpTokenTypes; import com.jetbrains.php.lang.psi.PhpPsiUtil; import com.jetbrains.php.lang.psi.elements.FunctionReference; -import com.pestphp.pest.action.CreateRunSingleTestAction; -import com.pestphp.pest.action.RunSingleTestAction; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.swing.*; - public class PestTestRunLineMarkerProvider extends RunLineMarkerContributor { @Override public @Nullable Info getInfo(@NotNull PsiElement leaf) { @@ -36,19 +26,7 @@ public class PestTestRunLineMarkerProvider extends RunLineMarkerContributor { return null; } - String testName = PestUtil.getTestName(element); - - if (testName == null) { - testName = "Unknown"; - } - - AnAction[] actions = new AnAction[2]; - actions[0] = new RunSingleTestAction(element, testName); - actions[1] = new CreateRunSingleTestAction(element, testName); - - // return RunLineMarkerContributor.withExecutorActions(getTestStateIcon(getLocationHint(testName), leaf.getProject(), false)); return RunLineMarkerContributor.withExecutorActions(PestIcons.RUN_SINGLE_TEST); - // return new Info(PestIcons.RUN_SINGLE_TEST, actions, RunLineMarkerContributor.RUN_TEST_TOOLTIP_PROVIDER); } } diff --git a/src/main/java/com/pestphp/pest/PestUtil.java b/src/main/java/com/pestphp/pest/PestUtil.java index 7ccd60cb..507652c9 100644 --- a/src/main/java/com/pestphp/pest/PestUtil.java +++ b/src/main/java/com/pestphp/pest/PestUtil.java @@ -1,28 +1,23 @@ package com.pestphp.pest; -import com.intellij.execution.RunManager; -import com.intellij.execution.RunnerAndConfigurationSettings; -import com.intellij.execution.configurations.RuntimeConfigurationException; import com.intellij.notification.Notification; import com.intellij.notification.NotificationType; import com.intellij.notification.Notifications; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement; import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.php.lang.psi.PhpFile; import com.jetbrains.php.lang.psi.elements.FunctionReference; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; -import com.pestphp.pest.configuration.PestRunConfiguration; -import com.pestphp.pest.configuration.PestRunConfigurationType; +import com.jetbrains.php.testFramework.PhpTestFrameworkSettingsManager; import org.jetbrains.annotations.Nls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.List; -import java.util.stream.Collectors; public class PestUtil { private static final String NOTIFICATION_GROUP = "Pest"; @@ -57,49 +52,12 @@ public static boolean isPestTestFunction(@NotNull FunctionReference reference) { return ((StringLiteralExpression) parameter).getContents(); } - public static List getRunConfigurations(@NotNull Project project) { - return RunManager.getInstance(project) - .getConfigurationSettingsList(PestRunConfigurationType.class) + public static boolean isEnabled(@NotNull Project project) { + return PhpTestFrameworkSettingsManager + .getInstance(project) + .getConfigurations(PestFrameworkType.getInstance()) .stream() - .map(RunnerAndConfigurationSettings::getConfiguration) - .filter(configuration -> configuration instanceof PestRunConfiguration) - .map(configuration -> (PestRunConfiguration) configuration) - .collect(Collectors.toList()); - } - - @Nullable - public static PestRunConfiguration getMainConfiguration( - @NotNull Project project, - @NotNull List configurations - ) { - @Nullable PestRunConfiguration mainConfiguration = configurations.stream() - .filter(configuration -> "tests".equals(configuration.getName())) - .findAny() - .orElse(null); - if (mainConfiguration == null) { - PestUtil.doNotify( - PestBundle.message("runConfiguration.mainConfiguration.missing.title"), - PestBundle.message("runConfiguration.mainConfiguration.missing.description"), - NotificationType.ERROR, - project - ); - return null; - - } - - try { - mainConfiguration.checkConfiguration(); - return mainConfiguration; - - } catch (RuntimeConfigurationException ex) { - PestUtil.doNotify( - PestBundle.message("runConfiguration.mainConfiguration.invalid.title"), - PestBundle.message("runConfiguration.mainConfiguration.invalid.description"), - NotificationType.ERROR, - project - ); - } - return null; + .anyMatch(config -> StringUtil.isNotEmpty(config.getExecutablePath())); } public static void doNotify( diff --git a/src/main/java/com/pestphp/pest/action/BasePestRunAction.java b/src/main/java/com/pestphp/pest/action/BasePestRunAction.java deleted file mode 100644 index 8a25923f..00000000 --- a/src/main/java/com/pestphp/pest/action/BasePestRunAction.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.pestphp.pest.action; - -import com.intellij.execution.RunnerAndConfigurationSettings; -import com.intellij.ide.actions.runAnything.RunAnythingAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.project.Project; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public abstract class BasePestRunAction extends RunAnythingAction { - protected Project project; - protected boolean wasCreated = false; - - BasePestRunAction(@NotNull Project project) { - this.project = project; - } - - protected Project getProject() { - return project; - } - - @Nullable - abstract protected RunnerAndConfigurationSettings prepareAction(); - - protected boolean isTemporary() { - return false; - } - - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - prepareAction(); - } -} diff --git a/src/main/java/com/pestphp/pest/action/CreateRunSingleTestAction.java b/src/main/java/com/pestphp/pest/action/CreateRunSingleTestAction.java deleted file mode 100644 index 22760b67..00000000 --- a/src/main/java/com/pestphp/pest/action/CreateRunSingleTestAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.pestphp.pest.action; - -import com.intellij.execution.RunManager; -import com.intellij.execution.RunnerAndConfigurationSettings; -import com.intellij.execution.configurations.RuntimeConfigurationException; -import com.intellij.psi.PsiElement; -import com.pestphp.pest.PestBundle; -import com.pestphp.pest.PestIcons; -import com.pestphp.pest.PestUtil; -import com.pestphp.pest.configuration.PestRunConfiguration; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.List; -import java.util.stream.Collectors; - -public class CreateRunSingleTestAction extends BasePestRunAction { - private final String path; - private final String testName; - - public CreateRunSingleTestAction(@NotNull PsiElement element, - @NotNull String testName) { - super(element.getProject()); - - this.path = element.getContainingFile().getVirtualFile().getPath(); - this.testName = testName; - - getTemplatePresentation().setText(PestBundle.message( - "CREATE_SINGLE_TEST", - testName - )); - getTemplatePresentation().setIcon(PestIcons.CONFIG); - } - - @Nullable - protected RunnerAndConfigurationSettings prepareAction() { - return null; - } -} diff --git a/src/main/java/com/pestphp/pest/action/RunSingleTestAction.java b/src/main/java/com/pestphp/pest/action/RunSingleTestAction.java deleted file mode 100644 index ac095146..00000000 --- a/src/main/java/com/pestphp/pest/action/RunSingleTestAction.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.pestphp.pest.action; - -import com.intellij.execution.ProgramRunnerUtil; -import com.intellij.execution.RunnerAndConfigurationSettings; -import com.intellij.execution.executors.DefaultRunExecutor; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.psi.PsiElement; -import com.pestphp.pest.PestBundle; -import com.pestphp.pest.PestIcons; -import org.jetbrains.annotations.NotNull; - -public class RunSingleTestAction extends CreateRunSingleTestAction { - public RunSingleTestAction(@NotNull PsiElement element, @NotNull String testName) { - super(element, testName); - - getTemplatePresentation().setText(PestBundle.message( - "RUN_SINGLE_TEST", - testName - )); - getTemplatePresentation().setIcon(PestIcons.RUN_SINGLE_TEST); - } - - protected boolean isTemporary() { - return false; - } - - @Override - public void actionPerformed(@NotNull AnActionEvent e) { - RunnerAndConfigurationSettings forRun = prepareAction(); - if (forRun == null) { - return; - } - - ProgramRunnerUtil.executeConfiguration( - forRun, - DefaultRunExecutor.getRunExecutorInstance() - ); - } -} diff --git a/src/main/java/com/pestphp/pest/configuration/PestRunConfiguration.java b/src/main/java/com/pestphp/pest/configuration/PestRunConfiguration.java index 1d6eab2d..7b15243d 100644 --- a/src/main/java/com/pestphp/pest/configuration/PestRunConfiguration.java +++ b/src/main/java/com/pestphp/pest/configuration/PestRunConfiguration.java @@ -5,18 +5,37 @@ import com.intellij.execution.configurations.RunConfiguration; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; +import com.intellij.psi.xml.XmlFile; import com.intellij.util.TextFieldCompletionProvider; import com.jetbrains.php.lang.PhpFileType; +import com.jetbrains.php.phpunit.PhpUnitUtil; import com.jetbrains.php.testFramework.run.*; import com.jetbrains.php.testFramework.run.PhpTestRunnerSettings.Scope; import com.pestphp.pest.PestFrameworkType; +import com.pestphp.pest.PestUtil; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.EnumMap; public class PestRunConfiguration extends PhpTestRunConfiguration { - private static final PhpDefaultTestRunnerSettingsValidator VALIDATOR; + public static final PhpDefaultTestRunnerSettingsValidator VALIDATOR = new PhpDefaultTestRunnerSettingsValidator( + Collections.singletonList(PhpFileType.INSTANCE), + (file, name) -> { + if (PhpUnitUtil.isPhpUnitConfigurationFile(file)) { + return true; + } + + if (PestUtil.isPestTestFile(file)) { + // TODO: Add a check for name being a valid test in the file. + return true; + } + + return false; + }, + false, + false + ); protected PestRunConfiguration(Project project, ConfigurationFactory factory, String name) { super( @@ -54,12 +73,4 @@ protected void addCompletionVariants(@NotNull String text, int offset, @NotNull }; } - static { - VALIDATOR = new PhpDefaultTestRunnerSettingsValidator( - Collections.singletonList(PhpFileType.INSTANCE), - (file, name) -> true, - false, - false - ); - } } diff --git a/src/main/java/com/pestphp/pest/configuration/PestRunConfigurationProducer.java b/src/main/java/com/pestphp/pest/configuration/PestRunConfigurationProducer.java deleted file mode 100644 index 29c26e71..00000000 --- a/src/main/java/com/pestphp/pest/configuration/PestRunConfigurationProducer.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.pestphp.pest.configuration; - -import com.intellij.execution.actions.ConfigurationContext; -import com.intellij.execution.actions.LazyRunConfigurationProducer; -import com.intellij.execution.configurations.ConfigurationFactory; -import com.intellij.openapi.util.Ref; -import com.intellij.psi.PsiElement; -import org.jetbrains.annotations.NotNull; - -public class PestRunConfigurationProducer extends LazyRunConfigurationProducer { - @NotNull - @Override - public ConfigurationFactory getConfigurationFactory() { - return PestRunConfigurationType.getInstance(); - } - - @Override - protected boolean setupConfigurationFromContext(@NotNull PestRunConfiguration configuration, @NotNull ConfigurationContext context, @NotNull Ref sourceElement) { - return false; - } - - @Override - public boolean isConfigurationFromContext(@NotNull PestRunConfiguration configuration, @NotNull ConfigurationContext context) { - return false; - } -} diff --git a/src/main/kotlin/com/pestphp/pest/configuration/PestRunConfigurationProducer.kt b/src/main/kotlin/com/pestphp/pest/configuration/PestRunConfigurationProducer.kt new file mode 100644 index 00000000..7ecbfe2a --- /dev/null +++ b/src/main/kotlin/com/pestphp/pest/configuration/PestRunConfigurationProducer.kt @@ -0,0 +1,51 @@ +package com.pestphp.pest.configuration + +import com.intellij.execution.configurations.ConfigurationFactory +import com.intellij.openapi.project.Project +import com.intellij.openapi.util.Condition +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiDirectory +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import com.intellij.util.Function +import com.jetbrains.php.lang.psi.elements.FunctionReference +import com.jetbrains.php.testFramework.run.PhpTestConfigurationProducer +import com.pestphp.pest.PestUtil + +class PestRunConfigurationProducer : PhpTestConfigurationProducer( + PestRunConfiguration.VALIDATOR, + FILE_TO_SCOPE, + METHOD_NAMER, + METHOD +) { + override fun getConfigurationFactory(): ConfigurationFactory = PestRunConfigurationType.getInstance() + + override fun isEnabled(project: Project): Boolean = PestUtil.isEnabled(project) + + override fun getWorkingDirectory(element: PsiElement): VirtualFile? { + if (element is PsiDirectory) { + return element.parentDirectory?.virtualFile + } + + return element.containingFile?.containingDirectory?.virtualFile + } + + companion object { + private val METHOD = Condition { element: PsiElement? -> + (element is FunctionReference + && PestUtil.isPestTestFunction((element as FunctionReference?)!!)) + } + private val METHOD_NAMER = Function { element: PsiElement? -> + if (element is FunctionReference) { + PestUtil.getTestName(element) + } + null + } + private val FILE_TO_SCOPE = Function { file: PsiFile? -> + if (PestUtil.isPestTestFile(file)) { + return@Function file + } + null + } + } +} \ No newline at end of file