Skip to content

Commit

Permalink
feat(line-markers): Add support for running files (#17)
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
olivernybroe authored Jul 9, 2020
1 parent 2ad5f61 commit 68c5272
Show file tree
Hide file tree
Showing 9 changed files with 79 additions and 217 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
22 changes: 0 additions & 22 deletions src/main/java/com/pestphp/pest/PestTestRunLineMarkerProvider.java
Original file line number Diff line number Diff line change
@@ -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) {
Expand All @@ -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);
}
}
56 changes: 7 additions & 49 deletions src/main/java/com/pestphp/pest/PestUtil.java
Original file line number Diff line number Diff line change
@@ -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";
Expand Down Expand Up @@ -57,49 +52,12 @@ public static boolean isPestTestFunction(@NotNull FunctionReference reference) {
return ((StringLiteralExpression) parameter).getContents();
}

public static List<PestRunConfiguration> 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<PestRunConfiguration> 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(
Expand Down
33 changes: 0 additions & 33 deletions src/main/java/com/pestphp/pest/action/BasePestRunAction.java

This file was deleted.

This file was deleted.

39 changes: 0 additions & 39 deletions src/main/java/com/pestphp/pest/action/RunSingleTestAction.java

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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
);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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?>(
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<PsiElement> { element: PsiElement? ->
(element is FunctionReference
&& PestUtil.isPestTestFunction((element as FunctionReference?)!!))
}
private val METHOD_NAMER = Function<PsiElement, String?> { element: PsiElement? ->
if (element is FunctionReference) {
PestUtil.getTestName(element)
}
null
}
private val FILE_TO_SCOPE = Function<PsiFile, PsiElement?> { file: PsiFile? ->
if (PestUtil.isPestTestFile(file)) {
return@Function file
}
null
}
}
}

0 comments on commit 68c5272

Please sign in to comment.