@@ -41,6 +41,7 @@ import com.jetbrains.php.lang.psi.elements.NewExpression
4141import com.jetbrains.php.lang.psi.elements.PhpAttribute
4242import com.jetbrains.php.lang.psi.elements.PhpClass
4343import com.jetbrains.php.lang.psi.elements.PhpNamedElement
44+ import com.jetbrains.php.lang.psi.elements.StringLiteralExpression
4445import com.jetbrains.php.lang.psi.elements.PhpYield
4546import com.jetbrains.php.phpunit.PhpMethodLocation
4647import com.jetbrains.php.phpunit.PhpUnitRuntimeConfigurationProducer
@@ -71,6 +72,15 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
7172 testRunnerSettings.configurationFilePath = virtualFile.path
7273 return element
7374 }
75+ if (element is ClassReference && element.parent is NewExpression && element.fqn == TestoClasses .SUITE_CONFIG ) {
76+ val newExpression = element.parent as NewExpression
77+ val suiteName = extractSuiteName(newExpression) ? : return null
78+ testRunnerSettings.scope = PhpTestRunnerSettings .Scope .ConfigurationFile
79+ testRunnerSettings.isUseAlternativeConfigurationFile = true
80+ testRunnerSettings.configurationFilePath = virtualFile.path
81+ testRunnerSettings.suite = suiteName
82+ return element
83+ }
7484 if (element is PhpAttribute ) {
7585 val function = element.owner as ? Function ? : return null
7686 setupConfiguration(testRunnerSettings, function, element.containingFile.virtualFile) ? : return null
@@ -146,6 +156,14 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
146156 return testRunnerSettings.scope == PhpTestRunnerSettings .Scope .ConfigurationFile
147157 && testRunnerSettings.configurationFilePath == element.containingFile.virtualFile.path
148158 }
159+ if (element is ClassReference && element.parent is NewExpression && element.fqn == TestoClasses .SUITE_CONFIG ) {
160+ val testoSettings = testRunnerSettings as ? TestoRunnerSettings ? : return false
161+ val newExpression = element.parent as NewExpression
162+ val suiteName = extractSuiteName(newExpression) ? : return false
163+ return testoSettings.scope == PhpTestRunnerSettings .Scope .ConfigurationFile
164+ && testoSettings.configurationFilePath == element.containingFile.virtualFile.path
165+ && testoSettings.suite == suiteName
166+ }
149167 if (element is PhpClass ) {
150168 return when {
151169 testRunnerSettings.scope != PhpTestRunnerSettings .Scope .File -> false
@@ -292,7 +310,7 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
292310 }
293311
294312 private fun findTestElement (target : PsiElement ? ): PsiElement ? = when (target) {
295- is ClassReference -> target.takeIf { it.parent is NewExpression && it.fqn == TestoClasses .APPLICATION_CONFIG }
313+ is ClassReference -> target.takeIf { it.parent is NewExpression && ( it.fqn == TestoClasses .APPLICATION_CONFIG || it.fqn == TestoClasses . SUITE_CONFIG ) }
296314 is PhpAttribute -> target.takeIf { it.owner.isTestoExecutable() || it.owner.isTestoDataProviderLike() }
297315 is Function -> target.takeIf { it.isTestoExecutable() || it.isTestoDataProviderLike() }
298316 is PhpClass -> target.takeIf { it.isTestoClass() }
@@ -535,6 +553,15 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
535553 }
536554 }
537555
556+ private fun extractSuiteName (newExpression : NewExpression ): String? {
557+ val firstParam = newExpression.parameters.firstOrNull() ? : return null
558+ if (firstParam is StringLiteralExpression ) {
559+ return firstParam.contents
560+ }
561+ val literal = com.intellij.psi.util.PsiTreeUtil .findChildOfType(firstParam, StringLiteralExpression ::class .java)
562+ return literal?.contents
563+ }
564+
538565 private fun getContainingClass (location : Location <* >, method : Method ) = when (location) {
539566 is PhpMethodLocation -> location.containingClass
540567 else -> method.containingClass
0 commit comments