diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..6c0758e --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: mesour +patreon: mesour \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1395c2d..8119a9c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ +.DS_Store +*.iml +local.properties + .idea/ -out/ +build/ +.gradle \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..bbda55b --- /dev/null +++ b/build.gradle @@ -0,0 +1,47 @@ +plugins { + id 'org.jetbrains.intellij' version "0.7.3" +} + +Properties properties = new Properties() +properties.load(project.rootProject.file("local.properties").newDataInputStream()) + +sourceCompatibility = 1.8 +targetCompatibility = 1.8 + +version '2.1.1' +group 'cz.jiripudil.intellij.nette.tester' + +jar { + archiveName 'intellij-nette-tester-' + version + '.jar' + from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } +} + +runIde { + ideDirectory "${properties.getProperty('runIdeDirectory')}" +} + +def htmlFixer = { htmlFile -> file(htmlFile).text.replace('', '').replace('', '') } + +patchPluginXml { + changeNotes = htmlFixer('src/main/resources/META-INF/change-notes.html') +} + +apply plugin: 'org.jetbrains.intellij' + +intellij { + version ideaVersion + updateSinceUntilBuild false + plugins = [ + "com.jetbrains.php:${phpPluginVersion}", + 'java', + 'properties' + ] + pluginName 'Nette Tester' +} + +repositories { + mavenCentral() + flatDir { + dirs 'libs' + } +} diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 0000000..1ed5f7c --- /dev/null +++ b/gradle.properties @@ -0,0 +1,4 @@ +ideaVersion = 2021.2.3 +phpPluginVersion = 212.5457.49 +#toolboxPluginVersion = 0.4.6 +#annotationPluginVersion = 5.3 \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..62d4c05 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..a4b4429 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..fbd7c51 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..5093609 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,104 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/intellij-nette-tester.iml b/intellij-nette-tester.iml deleted file mode 100644 index 9c04367..0000000 --- a/intellij-nette-tester.iml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/intellij-nette-tester.jar b/intellij-nette-tester.jar deleted file mode 100644 index 03d6989..0000000 Binary files a/intellij-nette-tester.jar and /dev/null differ diff --git a/resources/META-INF/plugin.xml b/resources/META-INF/plugin.xml deleted file mode 100644 index 8e61419..0000000 --- a/resources/META-INF/plugin.xml +++ /dev/null @@ -1,148 +0,0 @@ - - cz.jiripudil.intellij.nette.tester - Nette Tester - 2.1.0 - Jiří Pudil - messages.TesterBundle - - Github - -

This plugin integrates Nette Tester - into PhpStorm IDE.

- ]]>
- - 2.1.0 - - -

2.0.0-beta.3

- - -

2.0.0-beta.2

-

I know I said this release branch would be feature-frozen, but... well... not just yet. I'm far too excited about bringing the new features to be able to postpone them. Semver doesn't play well with the plugin's distribution channel anyway. Here they come:

- - -

2.0.0-beta.1

-

After tens of hours of work, here comes a total rework of the plugin. This beta.1 release marks the feature freeze, now I'd like to focus on fixing bugs and releasing a stable version soon.

- -

To support a wide range of Tester versions, I had to drop a few features. However, they should, in some form or another, be back once OutputHandler refactoring is resolved.

- - -

1.0.0-alpha.4

- - -

1.0.0-alpha.3

- - -

1.0-alpha2

- - -

1.0-alpha

-

Initial alpha version with basic capabilities:

- - ]]>
- - - - com.intellij.modules.lang - com.jetbrains.php - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 0000000..affd0c4 --- /dev/null +++ b/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = 'intellij-nette-tester' + diff --git a/src/cz/jiripudil/intellij/nette/tester/TesterBundle.java b/src/main/java/cz/jiripudil/intellij/nette/tester/TesterBundle.java similarity index 85% rename from src/cz/jiripudil/intellij/nette/tester/TesterBundle.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/TesterBundle.java index 6da50fe..e4c3a98 100644 --- a/src/cz/jiripudil/intellij/nette/tester/TesterBundle.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/TesterBundle.java @@ -1,6 +1,6 @@ package cz.jiripudil.intellij.nette.tester; -import com.intellij.CommonBundle; +import com.intellij.AbstractBundle; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.PropertyKey; @@ -15,6 +15,6 @@ private TesterBundle() { } public static String message(@PropertyKey(resourceBundle = BUNDLE_NAME) String key, Object... params) { - return CommonBundle.message(BUNDLE, key, params); + return AbstractBundle.message(BUNDLE, key, params); } } diff --git a/src/cz/jiripudil/intellij/nette/tester/TesterIcons.java b/src/main/java/cz/jiripudil/intellij/nette/tester/TesterIcons.java similarity index 73% rename from src/cz/jiripudil/intellij/nette/tester/TesterIcons.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/TesterIcons.java index 96d4b20..b0fca96 100644 --- a/src/cz/jiripudil/intellij/nette/tester/TesterIcons.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/TesterIcons.java @@ -6,9 +6,9 @@ public class TesterIcons { /** file icon */ - public static final Icon RUN_CLASS = IconLoader.getIcon("/icons/runClass.png"); - public static final Icon RUN_METHOD = IconLoader.getIcon("/icons/runMethod.png"); - public static final Icon RUN = IconLoader.getIcon("/icons/run.png"); - public static final Icon TESTER_CONFIG = IconLoader.getIcon("/icons/testConfig.png"); + public static final Icon RUN_CLASS = IconLoader.getIcon("/icons/runClass.png", TesterIcons.class); + public static final Icon RUN_METHOD = IconLoader.getIcon("/icons/runMethod.png", TesterIcons.class); + public static final Icon RUN = IconLoader.getIcon("/icons/run.png", TesterIcons.class); + public static final Icon TESTER_CONFIG = IconLoader.getIcon("/icons/testConfig.png", TesterIcons.class); } diff --git a/src/cz/jiripudil/intellij/nette/tester/TesterPostStartupActivity.java b/src/main/java/cz/jiripudil/intellij/nette/tester/TesterPostStartupActivity.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/TesterPostStartupActivity.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/TesterPostStartupActivity.java diff --git a/src/cz/jiripudil/intellij/nette/tester/TesterTestFinder.java b/src/main/java/cz/jiripudil/intellij/nette/tester/TesterTestFinder.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/TesterTestFinder.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/TesterTestFinder.java diff --git a/src/cz/jiripudil/intellij/nette/tester/TesterUtil.java b/src/main/java/cz/jiripudil/intellij/nette/tester/TesterUtil.java similarity index 86% rename from src/cz/jiripudil/intellij/nette/tester/TesterUtil.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/TesterUtil.java index 15f4d76..a8cd33b 100644 --- a/src/cz/jiripudil/intellij/nette/tester/TesterUtil.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/TesterUtil.java @@ -12,8 +12,12 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.psi.PsiFile; +import com.intellij.psi.util.PsiTreeUtil; import com.jetbrains.php.PhpClassHierarchyUtils; import com.jetbrains.php.lang.PhpLangUtil; +import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment; import com.jetbrains.php.lang.psi.elements.Method; import com.jetbrains.php.lang.psi.elements.PhpClass; import cz.jiripudil.intellij.nette.tester.configuration.TesterRunConfiguration; @@ -128,13 +132,33 @@ public static List getMethodRunConfigurations( return configurations; } + /** + * Returns a doc. comment from which Nette Tester reads annotations. + * Nette Tester reads them from first unindented doc. comment. + * @see Comment parsing + */ + @Nullable + public static PhpDocComment findDocCommentRedByTester(PsiFile file) { + for (PhpDocComment comment: PsiTreeUtil.findChildrenOfType(file, PhpDocComment.class)) { + if (comment.getPrevSibling().getText().endsWith("\n")) { + return comment; + } + } + return null; + } + + public static boolean hasValidFileName(VirtualFile file) { + return "phpt".equals(file.getExtension()) + || ("php".equals(file.getExtension()) && StringUtil.endsWith(file.getNameWithoutExtension(), "Test")); + } + public static void doNotify( @NotNull String title, @NotNull @Nls(capitalization = Nls.Capitalization.Sentence) String content, @NotNull NotificationType type, @Nullable Project project ) { - Notification notification = new Notification(NOTIFICATION_GROUP, title, content, NotificationType.ERROR); + Notification notification = new Notification(NOTIFICATION_GROUP, title, content, type); doNotify(notification, project); } diff --git a/src/cz/jiripudil/intellij/nette/tester/action/BaseTesterRunAction.java b/src/main/java/cz/jiripudil/intellij/nette/tester/action/BaseTesterRunAction.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/action/BaseTesterRunAction.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/action/BaseTesterRunAction.java diff --git a/src/cz/jiripudil/intellij/nette/tester/action/TesterCreateMethodRunTestAction.java b/src/main/java/cz/jiripudil/intellij/nette/tester/action/TesterCreateMethodRunTestAction.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/action/TesterCreateMethodRunTestAction.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/action/TesterCreateMethodRunTestAction.java diff --git a/src/cz/jiripudil/intellij/nette/tester/action/TesterCreateRunTestAction.java b/src/main/java/cz/jiripudil/intellij/nette/tester/action/TesterCreateRunTestAction.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/action/TesterCreateRunTestAction.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/action/TesterCreateRunTestAction.java diff --git a/src/cz/jiripudil/intellij/nette/tester/action/TesterMethodRunTestAction.java b/src/main/java/cz/jiripudil/intellij/nette/tester/action/TesterMethodRunTestAction.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/action/TesterMethodRunTestAction.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/action/TesterMethodRunTestAction.java diff --git a/src/cz/jiripudil/intellij/nette/tester/action/TesterRunTestAction.java b/src/main/java/cz/jiripudil/intellij/nette/tester/action/TesterRunTestAction.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/action/TesterRunTestAction.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/action/TesterRunTestAction.java diff --git a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterAbstractGenerateMethodAction.java b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterAbstractGenerateMethodAction.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterAbstractGenerateMethodAction.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterAbstractGenerateMethodAction.java diff --git a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateSetupMethodAction.java b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateSetupMethodAction.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateSetupMethodAction.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateSetupMethodAction.java diff --git a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateTeardownMethodAction.java b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateTeardownMethodAction.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateTeardownMethodAction.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateTeardownMethodAction.java diff --git a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateTestMethodAction.java b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateTestMethodAction.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateTestMethodAction.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterGenerateTestMethodAction.java diff --git a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNamespaceMapper.java b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNamespaceMapper.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNamespaceMapper.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNamespaceMapper.java diff --git a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseAction.java b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseAction.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseAction.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseAction.java diff --git a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseDialog.form b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseDialog.form similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseDialog.form rename to src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseDialog.form diff --git a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseDialog.java b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseDialog.java similarity index 97% rename from src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseDialog.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseDialog.java index b3f7368..386880b 100644 --- a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseDialog.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterNewTestCaseDialog.java @@ -1,8 +1,8 @@ package cz.jiripudil.intellij.nette.tester.codeGeneration; import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.editor.event.DocumentAdapter; import com.intellij.openapi.editor.event.DocumentEvent; +import com.intellij.openapi.editor.event.DocumentListener; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectFileIndex; @@ -59,7 +59,7 @@ public class TesterNewTestCaseDialog extends PhpBaseNewClassDialog { super(project, directory); this.init(contentPane, nameTextField, namespaceComboBox, namespaceCompletionHint, fileNameTextField, directoryComboBox, directoryCompletionHint); - testTargetTextField.addDocumentListener(new DocumentAdapter() { + testTargetTextField.addDocumentListener(new DocumentListener() { @Override public void documentChanged(DocumentEvent e) { TesterNewTestCaseDialog.this.addUpdateRequest(() -> { @@ -81,7 +81,7 @@ public void documentChanged(DocumentEvent e) { }); } }); - PhpCompletionUtil.installClassCompletion(testTargetTextField, null, this.getDisposable()); + PhpCompletionUtil.installClassCompletion(testTargetTextField, null, this.getDisposable(), null); String codeCompletionShortcut = PhpUiUtil.getShortcutTextByActionName("CodeCompletion"); testTargetCompletionHint.setText(TesterBundle.message("dialog.newTestCase.completionShortcut", codeCompletionShortcut, "class reference")); @@ -132,7 +132,7 @@ public String getTemplateName() { @NotNull @Override - protected String getExtension() { + public String getExtension() { TesterProjectSettings settings = TesterUtil.getTesterSettings(getProject()); return settings != null ? settings.getDefaultExtension() : "phpt"; } diff --git a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterTestCreator.java b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterTestCreator.java similarity index 96% rename from src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterTestCreator.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterTestCreator.java index 1f5e97b..63e41bd 100644 --- a/src/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterTestCreator.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/codeGeneration/TesterTestCreator.java @@ -38,6 +38,6 @@ static PhpClass findClass(PsiFile psiFile) { @Override public void createTest(Project project, Editor editor, PsiFile psiFile) { - (new TesterNewTestCaseAction(false)).invoke(project, psiFile.getContainingDirectory(), psiFile, null); + (new TesterNewTestCaseAction(false)).invoke(project, psiFile.getContainingDirectory(), psiFile, null, editor); } } diff --git a/src/main/java/cz/jiripudil/intellij/nette/tester/completion/PhpDocCompletionContributor.java b/src/main/java/cz/jiripudil/intellij/nette/tester/completion/PhpDocCompletionContributor.java new file mode 100644 index 0000000..994145a --- /dev/null +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/completion/PhpDocCompletionContributor.java @@ -0,0 +1,75 @@ +package cz.jiripudil.intellij.nette.tester.completion; + +import com.intellij.codeInsight.completion.*; +import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.patterns.PlatformPatterns; +import com.intellij.psi.PsiElement; +import com.intellij.util.ProcessingContext; +import com.jetbrains.php.completion.insert.PhpSymbolInsertHandler; +import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocComment; +import com.jetbrains.php.lang.documentation.phpdoc.psi.PhpDocPsiElement; +import com.jetbrains.php.lang.psi.PhpPsiUtil; +import com.jetbrains.php.lang.psi.elements.Method; +import com.jetbrains.php.lang.psi.elements.PhpPsiElement; +import cz.jiripudil.intellij.nette.tester.TesterUtil; +import org.jetbrains.annotations.NotNull; + +public class PhpDocCompletionContributor extends CompletionContributor { + public PhpDocCompletionContributor() { + this.extend(CompletionType.BASIC, PlatformPatterns.psiElement().withParent(PhpDocPsiElement.class), new DocTagsCompletionProvider()); + } + + private static class DocTagsCompletionProvider extends CompletionProvider { + private static final String[] fileTags = new String[]{ + "@phpVersion", "@dataProvider", "@multiple", "@exitCode", "@httpCode", + "@outputMatch", "@outputMatchFile", "@phpIni", "@phpExtension" + }; + private static final String[] fileTagsNoArgument = new String[]{"@testCase", "@skip"}; + private static final String[] methodTags = new String[]{"@dataProvider"}; + + @Override + protected void addCompletions( + @NotNull CompletionParameters parameters, + @NotNull ProcessingContext context, + @NotNull CompletionResultSet result + ) { + if (!TesterUtil.hasValidFileName(parameters.getOriginalFile().getVirtualFile())) { + return; + } + + PsiElement currentElement = parameters.getPosition().getOriginalElement(); + PhpDocComment docCommentAtCaret = PhpPsiUtil.getParentByCondition(currentElement, PhpDocComment.INSTANCEOF); + if (docCommentAtCaret == null) { + return; + } + + boolean atTagName = currentElement.getText().startsWith("@"); + if (isDocCommentRedByTester(docCommentAtCaret)) { + for (String tag : fileTags) { + result.addElement(createDocTagLookup(tag, atTagName, true)); + } + for (String tag : fileTagsNoArgument) { + result.addElement(createDocTagLookup(tag, atTagName, false)); + } + } else { + PhpPsiElement next = docCommentAtCaret.getNextPsiSibling(); + if (next instanceof Method && TesterUtil.isTestMethod((Method) next)) { + for (String tag : methodTags) { + result.addElement(createDocTagLookup(tag, atTagName, true)); + } + } + } + } + + private static boolean isDocCommentRedByTester(PhpDocComment docComment) { + return docComment.equals(TesterUtil.findDocCommentRedByTester(docComment.getContainingFile())); + } + + private static LookupElementBuilder createDocTagLookup(String tagName, boolean atTagName, boolean withArgument) { + String lookupString = atTagName ? tagName.substring(1) : tagName; + LookupElementBuilder builder = LookupElementBuilder.create(lookupString).withBoldness(true); + return withArgument ? builder.withInsertHandler(new PhpSymbolInsertHandler(' ', true)) : builder; + } + } + +} \ No newline at end of file diff --git a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfiguration.java b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfiguration.java similarity index 90% rename from src/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfiguration.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfiguration.java index 5c62925..a9db6bc 100644 --- a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfiguration.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfiguration.java @@ -1,9 +1,6 @@ package cz.jiripudil.intellij.nette.tester.configuration; -import com.intellij.execution.DefaultExecutionResult; -import com.intellij.execution.ExecutionException; -import com.intellij.execution.ExecutionResult; -import com.intellij.execution.Executor; +import com.intellij.execution.*; import com.intellij.execution.configurations.*; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.process.ProcessTerminatedListener; @@ -18,15 +15,16 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.PathUtil; import com.intellij.util.xmlb.annotations.Attribute; +import com.intellij.xdebugger.XDebugProcess; +import com.intellij.xdebugger.XDebugSession; import com.jetbrains.php.config.PhpProjectConfigurationFacade; import com.jetbrains.php.config.commandLine.PhpCommandLinePathProcessor; import com.jetbrains.php.config.commandLine.PhpCommandSettings; import com.jetbrains.php.config.commandLine.PhpCommandSettingsBuilder; import com.jetbrains.php.config.interpreters.PhpInterpreter; -import com.jetbrains.php.run.PhpCommandLineSettings; -import com.jetbrains.php.run.PhpExecutionUtil; -import com.jetbrains.php.run.PhpRefactoringListenerRunConfiguration; -import com.jetbrains.php.run.PhpRunUtil; +import com.jetbrains.php.debug.common.PhpDebugProcessFactory; +import com.jetbrains.php.debug.xdebug.debugger.XdebugDriver; +import com.jetbrains.php.run.*; import com.jetbrains.php.util.PhpConfigurationUtil; import com.jetbrains.php.util.pathmapper.PhpPathMapper; import cz.jiripudil.intellij.nette.tester.TesterBundle; @@ -36,13 +34,17 @@ import org.jdom.Element; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.debugger.DebuggableRunConfiguration; +import java.net.InetAddress; +import java.net.InetSocketAddress; import java.util.Collections; import java.util.List; import java.util.Map; -public class TesterRunConfiguration extends PhpRefactoringListenerRunConfiguration implements LocatableConfiguration { +public class TesterRunConfiguration extends PhpRefactoringListenerRunConfiguration implements LocatableConfiguration, DebuggableRunConfiguration { private boolean isGenerated; + private String host = null; TesterRunConfiguration(@NotNull Project project, @NotNull ConfigurationFactory factory, String name) { super(project, factory, name); @@ -105,7 +107,7 @@ public void checkConfiguration() throws RuntimeConfigurationException { @Override public RunProfileState getState(@NotNull Executor executor, @NotNull ExecutionEnvironment executionEnvironment) throws ExecutionException { try { - return this.getState(executionEnvironment, this.createCommand(Collections.emptyMap(), Collections.emptyList(), false)); + return this.getState(executionEnvironment, this.createCommand(Collections.emptyMap(), Collections.emptyList(), true)); } catch (CloneNotSupportedException e) { return null; } @@ -204,14 +206,12 @@ protected void fixSettingsBeforeSerialization(@NotNull TesterSettings settings) public void readExternal(Element element) throws InvalidDataException { super.readExternal(element); - if (!isNewSerializationUsed()) { - isGenerated = "true".equals(element.getAttributeValue("isGeneratedName")); - } + isGenerated = "true".equals(element.getAttributeValue("isGeneratedName")); } @Override public void writeExternal(@NotNull Element element) throws WriteExternalException { - if (!isNewSerializationUsed() && isGeneratedName()) { + if (isGeneratedName()) { element.setAttribute("isGeneratedName", "true"); } @@ -294,4 +294,20 @@ public void setValue(@Nullable String newName) { return pathsToUpdate; } + + @Override + public @NotNull InetSocketAddress computeDebugAddress(RunProfileState state) throws ExecutionException { + if (host == null) { + return new InetSocketAddress(InetAddress.getLoopbackAddress(), 9000); + } + else { + return new InetSocketAddress(host, 9000); + } + } + + @Override + public @NotNull XDebugProcess createDebugProcess(@NotNull InetSocketAddress inetSocketAddress, @NotNull XDebugSession session, @Nullable ExecutionResult result, @NotNull ExecutionEnvironment executionEnvironment) throws ExecutionException { + //XdebugDriver + return PhpDebugProcessFactory.forExternalConnection(session, inetSocketAddress.toString(), XdebugDriver.INSTANCE); + } } diff --git a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfigurationProducer.java b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfigurationProducer.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfigurationProducer.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfigurationProducer.java diff --git a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfigurationType.java b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfigurationType.java similarity index 83% rename from src/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfigurationType.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfigurationType.java index f8ce666..40fae79 100644 --- a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfigurationType.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterRunConfigurationType.java @@ -11,8 +11,10 @@ import org.jetbrains.annotations.NotNull; public class TesterRunConfigurationType extends ConfigurationTypeBase { + final static private @NotNull String ID = "nette-tester"; + protected TesterRunConfigurationType() { - super("nette-tester", TesterBundle.message("configurationType.displayName"), TesterBundle.message("configurationType.description"), PhpIcons.PHP_TEST_FILE); + super(ID, TesterBundle.message("configurationType.displayName"), TesterBundle.message("configurationType.description"), PhpIcons.PHP_TEST_FILE); this.addFactory(createFactory(this)); } @@ -21,7 +23,7 @@ static TesterRunConfigurationType getInstance() { } public static ConfigurationFactory createFactory(TesterRunConfigurationType type) { - return new PhpRunConfigurationFactoryBase(type) { + return new PhpRunConfigurationFactoryBase(type, ID) { @NotNull @Override public RunConfiguration createTemplateConfiguration(@NotNull Project project) { diff --git a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterSettings.java b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterSettings.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/configuration/TesterSettings.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterSettings.java diff --git a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfiguration.java b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfiguration.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfiguration.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfiguration.java diff --git a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationProducer.java b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationProducer.java similarity index 74% rename from src/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationProducer.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationProducer.java index 9ecb633..7de84b9 100644 --- a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationProducer.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationProducer.java @@ -1,9 +1,9 @@ package cz.jiripudil.intellij.nette.tester.configuration; import com.intellij.execution.actions.ConfigurationContext; -import com.intellij.execution.actions.RunConfigurationProducer; -import com.intellij.ide.scratch.ScratchFileType; -import com.intellij.openapi.fileTypes.FileTypeManager; +import com.intellij.execution.actions.LazyRunConfigurationProducer; +import com.intellij.execution.configurations.ConfigurationFactory; +import com.intellij.ide.scratch.ScratchUtil; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; @@ -16,23 +16,28 @@ import com.jetbrains.php.lang.psi.elements.Method; import com.jetbrains.php.run.script.PhpScriptRunConfiguration; import cz.jiripudil.intellij.nette.tester.TesterUtil; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class TesterTestMethodRunConfigurationProducer extends RunConfigurationProducer { +public class TesterTestMethodRunConfigurationProducer extends LazyRunConfigurationProducer { protected TesterTestMethodRunConfigurationProducer() { - super(TesterTestMethodRunConfigurationType.getInstance()); + super(); } @Override - protected boolean setupConfigurationFromContext(TesterTestMethodRunConfiguration runConfiguration, ConfigurationContext context, Ref ref) { + protected boolean setupConfigurationFromContext( + @NotNull TesterTestMethodRunConfiguration runConfiguration, + ConfigurationContext context, + @NotNull Ref ref + ) { PsiElement element = context.getPsiLocation(); Method method = PhpPsiUtil.getParentByCondition(element, parent -> parent instanceof Method); - if (method != null && isValid(method)) { + if (isValid(method)) { VirtualFile file = method.getContainingFile().getVirtualFile(); ref.set(method); - if (!FileTypeManager.getInstance().isFileOfType(file, ScratchFileType.INSTANCE)) { + if (!ScratchUtil.isScratch(file)) { VirtualFile root = ProjectRootManager.getInstance(element.getProject()).getFileIndex().getContentRootForFile(file); if (root == null) { return false; @@ -50,11 +55,11 @@ protected boolean setupConfigurationFromContext(TesterTestMethodRunConfiguration } @Override - public boolean isConfigurationFromContext(TesterTestMethodRunConfiguration runConfiguration, ConfigurationContext context) { + public boolean isConfigurationFromContext(@NotNull TesterTestMethodRunConfiguration runConfiguration, ConfigurationContext context) { PsiElement element = context.getPsiLocation(); Method method = PhpPsiUtil.getParentByCondition(element, parent -> parent instanceof Method); - if (method != null && isValid(method)) { + if (isValid(method)) { VirtualFile containingVirtualFile = method.getContainingFile().getVirtualFile(); PhpScriptRunConfiguration.Settings settings = runConfiguration.getSettings(); String path = settings.getPath(); @@ -82,4 +87,10 @@ private boolean isValid(@Nullable PsiFile containingFile) { && containingFile.getFileType() == PhpFileType.INSTANCE && containingFile.getVirtualFile() != null; } + + @NotNull + @Override + public ConfigurationFactory getConfigurationFactory() { + return TesterTestMethodRunConfigurationType.createFactory(); + } } diff --git a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationType.java b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationType.java similarity index 82% rename from src/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationType.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationType.java index 4b89fca..4cb6882 100644 --- a/src/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationType.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/TesterTestMethodRunConfigurationType.java @@ -11,8 +11,10 @@ import org.jetbrains.annotations.NotNull; public class TesterTestMethodRunConfigurationType extends ConfigurationTypeBase { + final static private @NotNull String ID = "nette-tester-method"; + protected TesterTestMethodRunConfigurationType() { - super("nette-tester-method", TesterBundle.message("configurationType.method.displayName"), TesterBundle.message("configurationType.method.description"), PhpIcons.PHP_TEST_METHOD); + super(ID, TesterBundle.message("configurationType.method.displayName"), TesterBundle.message("configurationType.method.description"), PhpIcons.PHP_TEST_METHOD); this.addFactory(createFactory(this)); } @@ -25,7 +27,7 @@ public static ConfigurationFactory createFactory() { } public static ConfigurationFactory createFactory(TesterTestMethodRunConfigurationType type) { - return new PhpRunConfigurationFactoryBase(type) { + return new PhpRunConfigurationFactoryBase(type, ID) { @NotNull @Override public RunConfiguration createTemplateConfiguration(@NotNull Project project) { diff --git a/src/cz/jiripudil/intellij/nette/tester/configuration/editor/PhpCommandLineSettingsEditor.form b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/editor/PhpCommandLineSettingsEditor.form similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/configuration/editor/PhpCommandLineSettingsEditor.form rename to src/main/java/cz/jiripudil/intellij/nette/tester/configuration/editor/PhpCommandLineSettingsEditor.form diff --git a/src/cz/jiripudil/intellij/nette/tester/configuration/editor/PhpCommandLineSettingsEditor.java b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/editor/PhpCommandLineSettingsEditor.java similarity index 98% rename from src/cz/jiripudil/intellij/nette/tester/configuration/editor/PhpCommandLineSettingsEditor.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/configuration/editor/PhpCommandLineSettingsEditor.java index eb21dea..f766447 100644 --- a/src/cz/jiripudil/intellij/nette/tester/configuration/editor/PhpCommandLineSettingsEditor.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/configuration/editor/PhpCommandLineSettingsEditor.java @@ -32,7 +32,6 @@ public class PhpCommandLineSettingsEditor extends SettingsEditor { - if ( ! runReferencedClassNames.contains(testClass.getFQN())) { - ExtendsList extendsList = testClass.getExtendsList(); - TextRange highlightRange = new TextRange(0, extendsList.getStartOffsetInParent() + extendsList.getTextLength()); + if (!runReferencedClassNames.contains(testClass.getFQN())) { problemsHolder.registerProblem( - testClass, TesterBundle.message("inspections.runTestCase.description"), ProblemHighlightType.GENERIC_ERROR_OR_WARNING, - highlightRange, ADD_RUN_METHOD_CALL_QUICK_FIX, ! testClass.isFinal() ? MAKE_ABSTRACT_QUICK_FIX : null + testClass.getNameIdentifier() != null ? testClass.getNameIdentifier() : testClass, + TesterBundle.message("inspections.runTestCase.description"), + ADD_RUN_METHOD_CALL_QUICK_FIX, + !testClass.isFinal() ? MAKE_ABSTRACT_QUICK_FIX : null ); } }); @@ -101,16 +102,15 @@ public String getName() { @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor problemDescriptor) { - PsiElement element = problemDescriptor.getPsiElement(); - if ( ! (element instanceof PhpClass)) { + PhpClass phpClass = getPhpClassElement(problemDescriptor.getPsiElement()); + if (phpClass == null) { return; } - PsiFile containingFile = element.getContainingFile(); + PsiFile containingFile = phpClass.getContainingFile(); PsiDocumentManager manager = PsiDocumentManager.getInstance(project); Document document = manager.getDocument(containingFile); - PhpClass phpClass = (PhpClass) element; String template = "\n\n(new " + phpClass.getName() + "())->run();"; Statement runMethodCall = PhpPsiElementFactory.createStatement(project, template); @@ -141,16 +141,15 @@ public String getName() { @Override public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor problemDescriptor) { - PsiElement element = problemDescriptor.getPsiElement(); - if ( ! (element instanceof PhpClass)) { + PhpClass phpClass = getPhpClassElement(problemDescriptor.getPsiElement()); + if (phpClass == null) { return; } - PsiFile containingFile = element.getContainingFile(); + PsiFile containingFile = phpClass.getContainingFile(); PsiDocumentManager manager = PsiDocumentManager.getInstance(project); Document document = manager.getDocument(containingFile); - PhpClass phpClass = (PhpClass) element; PsiElement abstractKeyword = PhpPsiElementFactory.createFromText(project, LeafPsiElement.class, "abstract"); if (abstractKeyword == null) { return; @@ -165,4 +164,9 @@ public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor proble } } } + + @Nullable + private static PhpClass getPhpClassElement(PsiElement element) { + return element instanceof PhpClass ? (PhpClass) element : PsiTreeUtil.getParentOfType(element, PhpClass.class); + } } diff --git a/src/cz/jiripudil/intellij/nette/tester/inspections/TestFileNameInspection.java b/src/main/java/cz/jiripudil/intellij/nette/tester/inspections/TestFileNameInspection.java similarity index 90% rename from src/cz/jiripudil/intellij/nette/tester/inspections/TestFileNameInspection.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/inspections/TestFileNameInspection.java index c2f2222..ebb6d68 100644 --- a/src/cz/jiripudil/intellij/nette/tester/inspections/TestFileNameInspection.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/inspections/TestFileNameInspection.java @@ -3,7 +3,6 @@ import com.intellij.codeInspection.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; @@ -30,18 +29,13 @@ public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean is @Override public void visitPhpFile(PhpFile phpFile) { PhpClass testClass = PhpPsiUtil.findClass(phpFile, TesterUtil::isTestClass); - if (testClass != null && ! hasValidName(phpFile.getVirtualFile())) { + if (testClass != null && ! TesterUtil.hasValidFileName(phpFile.getVirtualFile())) { holder.registerProblem(phpFile, TesterBundle.message("inspections.fileName.description"), CHANGE_EXTENSION_TO_PHPT_QUICK_FIX, ADD_TEST_SUFFIX_QUICK_FIX); } } }; } - private boolean hasValidName(VirtualFile file) { - return "phpt".equals(file.getExtension()) - || ("php".equals(file.getExtension()) && StringUtil.endsWith(file.getNameWithoutExtension(), "Test")); - } - private static class ChangeExtensionToPhptQuickFix implements LocalQuickFix { @Nls @NotNull @@ -105,7 +99,7 @@ public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor proble } try { - virtualFile.rename(this, newName + "." + virtualFile.getExtension()); + virtualFile.rename(this, newName + "" + virtualFile.getExtension()); } catch (IOException e) { LOG.error(e); diff --git a/src/cz/jiripudil/intellij/nette/tester/lineMarker/TesterMethodRunLineMarkerProvider.java b/src/main/java/cz/jiripudil/intellij/nette/tester/lineMarker/TesterMethodRunLineMarkerProvider.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/lineMarker/TesterMethodRunLineMarkerProvider.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/lineMarker/TesterMethodRunLineMarkerProvider.java diff --git a/src/cz/jiripudil/intellij/nette/tester/lineMarker/TesterRunLineMarkerProvider.java b/src/main/java/cz/jiripudil/intellij/nette/tester/lineMarker/TesterRunLineMarkerProvider.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/lineMarker/TesterRunLineMarkerProvider.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/lineMarker/TesterRunLineMarkerProvider.java diff --git a/src/cz/jiripudil/intellij/nette/tester/projectSettings/TesterConfigurable.java b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/TesterConfigurable.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/projectSettings/TesterConfigurable.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/TesterConfigurable.java diff --git a/src/cz/jiripudil/intellij/nette/tester/projectSettings/TesterNamespaceMapping.java b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/TesterNamespaceMapping.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/projectSettings/TesterNamespaceMapping.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/TesterNamespaceMapping.java diff --git a/src/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettings.java b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettings.java similarity index 94% rename from src/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettings.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettings.java index f2615fb..3b34815 100644 --- a/src/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettings.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettings.java @@ -29,7 +29,7 @@ public String getTesterVersion() { } public String getSetupFile() { - return testerVersion.equals("< 2.0") ? "setup.php" : "setup2-0.php"; + return testerVersion.equals("< 2.0") ? "src/main/resources/setup.php" : "src/main/resources/setup2-0.php"; } public void setTesterVersion(@NotNull String defaultExtension) { diff --git a/src/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettingsManager.java b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettingsManager.java similarity index 84% rename from src/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettingsManager.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettingsManager.java index 611ad61..a89b69a 100644 --- a/src/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettingsManager.java +++ b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/TesterProjectSettingsManager.java @@ -18,7 +18,7 @@ public TesterProjectSettingsManager() { @NotNull public static TesterProjectSettingsManager getInstance(@NotNull Project project) { - return ServiceManager.getService(project, TesterProjectSettingsManager.class); + return project.getService(TesterProjectSettingsManager.class); } @Nullable @@ -28,7 +28,7 @@ public TesterProjectSettings getState() { } @Override - public void loadState(TesterProjectSettings settings) { + public void loadState(@NotNull TesterProjectSettings settings) { this.settings = settings; } } diff --git a/src/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceMappingTable.java b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceMappingTable.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceMappingTable.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceMappingTable.java diff --git a/src/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceTableCellEditor.form b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceTableCellEditor.form similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceTableCellEditor.form rename to src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceTableCellEditor.form diff --git a/src/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceTableCellEditor.java b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceTableCellEditor.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceTableCellEditor.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/editor/NamespaceTableCellEditor.java diff --git a/src/cz/jiripudil/intellij/nette/tester/projectSettings/editor/TesterConfigurableForm.form b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/editor/TesterConfigurableForm.form similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/projectSettings/editor/TesterConfigurableForm.form rename to src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/editor/TesterConfigurableForm.form diff --git a/src/cz/jiripudil/intellij/nette/tester/projectSettings/editor/TesterConfigurableForm.java b/src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/editor/TesterConfigurableForm.java similarity index 100% rename from src/cz/jiripudil/intellij/nette/tester/projectSettings/editor/TesterConfigurableForm.java rename to src/main/java/cz/jiripudil/intellij/nette/tester/projectSettings/editor/TesterConfigurableForm.java diff --git a/src/main/resources/META-INF/change-notes.html b/src/main/resources/META-INF/change-notes.html new file mode 100644 index 0000000..c3d07cf --- /dev/null +++ b/src/main/resources/META-INF/change-notes.html @@ -0,0 +1,75 @@ + +

2.1.1

+
    +
  • Added Gradle (improvement for development)
  • +
  • Added completion for Nette tester annotations
  • +
  • Fixed typo (#47)
  • +
  • Fixed bug in internalFileTemplate (#50)
  • +
  • Fixed problems with tester class run (#36)
  • +
+ +

2.1.0

+
    +
  • Added run line markers to run TestCase or test methods
  • +
  • Added support for run configuration in Docker
  • +
  • Added support for Nette Tester 2.0
  • +
  • Fixed Compatibility with PHPStorm 2019.2 (#43)
  • +
  • Fixed bug java.lang.NullPointerException on phpstorm startup (#45)
  • +
+ +

2.0.0-beta.3

+
    +
  • The Create Test dialog does not autoupdate the target namespace and directory if invoked from the directory context (#26)
  • +
  • Added some handy inspections that make sure all your tests are actually executed (#3, #32)
  • +
  • You can right-click a single test case file to run it (#23)
  • +
  • Added support for nette/tester@dev-master for the time being (#30)
  • +
  • Fixed: bootstrap relative path resolves correctly if the target directory does not exist (#25)
  • +
  • Fixed: comparison failure reporting was broken on Unix systems
  • +
+ +

2.0.0-beta.2

+

I know I said this release branch would be feature-frozen, but... well... not just yet. I'm far too excited about bringing the new features to be able to postpone them. Semver doesn't play well with the plugin's distribution channel anyway. Here they come:

+
    +
  • In the project settings, you can configure the path to your bootstrap file; it is then automatically required in the created test files (see #20 for instructions if it does not work right away)
  • +
  • You can now right-click a single test method to run or debug it in isolation (#9)
  • +
  • Fixed: OutputHandler now recognizes and correctly parses the diff command generated on Windows (#21)
  • +
  • Fixed: OutputHandler no longer reports unsuccessful builds as "terminated" (#22)
  • +
+ +

2.0.0-beta.1

+

After tens of hours of work, here comes a total rework of the plugin. This beta.1 release marks the feature freeze, now I'd like to focus on fixing bugs and releasing a stable version soon.

+
    +
  • Most importantly, it no longer relies on a specific fork nette/tester. As of 2.0.0, the plugin supports all 1.* versions of Nette Tester. Hooray!
  • +
  • You can navigate between the class and its test, or create a test case for a class easily. The navigation is based on convention (class name + Test suffix), the creation assumes your tests reside in the same namespace as the code; if you use a different scheme, you can configure source to test namespace mapping in the project settings under PHP > Nette Tester.
  • +
  • The plugin ships with a run configuration producer for directories, so you can right-click a directory and run the tests within it. For this to be truly one-click action, you should configure the Tester executable in the Nette Tester default run configuration template.
  • +
  • You can view the diff of comparison failures (Assert::same() and alike) right in the test results window.
  • +
  • Output stack traces are decorated with links to files, provided you set Tester\Dumper::$maxPathSegments to a high enough value in your test environment.
  • +
+

To support a wide range of Tester versions, I had to drop a few features. However, they should, in some form or another, be back once OutputHandler refactoring is resolved.

+
    +
  • The plugin no longer groups TestCase methods in the test results window.
  • +
  • The plugin no longer lets you navigate to the tests from the test results window, nor run or debug them directly.
  • +
+ +

1.0.0-alpha.4

+
    +
  • Fixed compatibility with PhpStorm 2016.3.
  • +
+ +

1.0.0-alpha.3

+
    +
  • Fixed compatibility with PhpStorm 2016.3.
  • +
+ +

1.0-alpha2

+
    +
  • Fixed compatibility with PhpStorm 2016.1.
  • +
+ +

1.0-alpha

+

Initial alpha version with basic capabilities:

+
    +
  • Tester run configuration type and editor.
  • +
  • Displays results in the Test Runner window.
  • +
+ \ No newline at end of file diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml new file mode 100644 index 0000000..636a78d --- /dev/null +++ b/src/main/resources/META-INF/plugin.xml @@ -0,0 +1,85 @@ + + cz.jiripudil.intellij.nette.tester + Nette Tester + + Jiří Pudil, Matouš Němec + messages.TesterBundle + + Github + +

This plugin integrates Nette Tester + into PhpStorm IDE.

+ ]]>
+ + + + + + com.intellij.modules.lang + com.jetbrains.php + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/resources/META-INF/pluginIcon.svg b/src/main/resources/META-INF/pluginIcon.svg similarity index 100% rename from resources/META-INF/pluginIcon.svg rename to src/main/resources/META-INF/pluginIcon.svg diff --git a/resources/fileTemplates/internal/Tester TestCase.ft b/src/main/resources/fileTemplates/internal/Tester TestCase.php.ft similarity index 100% rename from resources/fileTemplates/internal/Tester TestCase.ft rename to src/main/resources/fileTemplates/internal/Tester TestCase.php.ft diff --git a/resources/icons/run.png b/src/main/resources/icons/run.png similarity index 100% rename from resources/icons/run.png rename to src/main/resources/icons/run.png diff --git a/resources/icons/runClass.png b/src/main/resources/icons/runClass.png similarity index 100% rename from resources/icons/runClass.png rename to src/main/resources/icons/runClass.png diff --git a/resources/icons/runMethod.png b/src/main/resources/icons/runMethod.png similarity index 100% rename from resources/icons/runMethod.png rename to src/main/resources/icons/runMethod.png diff --git a/resources/icons/testConfig.png b/src/main/resources/icons/testConfig.png similarity index 100% rename from resources/icons/testConfig.png rename to src/main/resources/icons/testConfig.png diff --git a/resources/inspectionDescriptions/TestCaseAnnotation.html b/src/main/resources/inspectionDescriptions/TestCaseAnnotation.html similarity index 100% rename from resources/inspectionDescriptions/TestCaseAnnotation.html rename to src/main/resources/inspectionDescriptions/TestCaseAnnotation.html diff --git a/resources/inspectionDescriptions/TestCaseIsRun.html b/src/main/resources/inspectionDescriptions/TestCaseIsRun.html similarity index 100% rename from resources/inspectionDescriptions/TestCaseIsRun.html rename to src/main/resources/inspectionDescriptions/TestCaseIsRun.html diff --git a/resources/inspectionDescriptions/TestFileName.html b/src/main/resources/inspectionDescriptions/TestFileName.html similarity index 100% rename from resources/inspectionDescriptions/TestFileName.html rename to src/main/resources/inspectionDescriptions/TestFileName.html diff --git a/resources/messages/TesterBundle.properties b/src/main/resources/messages/TesterBundle.properties similarity index 96% rename from resources/messages/TesterBundle.properties rename to src/main/resources/messages/TesterBundle.properties index cd2c0e8..0acf8ad 100644 --- a/resources/messages/TesterBundle.properties +++ b/src/main/resources/messages/TesterBundle.properties @@ -62,11 +62,11 @@ runConfiguration.editor.cli.title=Command Line runConfiguration.editor.cli.interpreterOptions=Interpreter options: runConfiguration.editor.cli.workingDirectory=Custom working directory: -runConfiguration.mainConfiguration.missing.title=Run configuration 'tester' missing -runConfiguration.mainConfiguration.missing.description=To use line markers, you need create run configuration named 'tester' with interpreter. +runConfiguration.mainConfiguration.missing.title=Run configuration 'tests' missing +runConfiguration.mainConfiguration.missing.description=To use line markers, you need create run configuration named 'tests' with interpreter. -runConfiguration.mainConfiguration.invalid.title=Run configuration 'tester' is invalid -runConfiguration.mainConfiguration.invalid.description=To use line markers, you need valid run configuration named 'tester'. +runConfiguration.mainConfiguration.invalid.title=Run configuration 'tests' is invalid +runConfiguration.mainConfiguration.invalid.description=To use line markers, you need valid run configuration named 'tests'. runConfiguration.mainConfiguration.alreadyCreated.title=Run configuration already created runConfiguration.mainConfiguration.alreadyCreated.description=Run configuration already exists. It can not be created again. diff --git a/resources/setup.php b/src/main/resources/setup.php similarity index 100% rename from resources/setup.php rename to src/main/resources/setup.php diff --git a/resources/setup2-0.php b/src/main/resources/setup2-0.php similarity index 100% rename from resources/setup2-0.php rename to src/main/resources/setup2-0.php