Skip to content

Commit 18b5d81

Browse files
committed
feat: support test classes
1 parent b64239e commit 18b5d81

File tree

4 files changed

+30
-11
lines changed

4 files changed

+30
-11
lines changed

src/main/kotlin/com/github/xepozz/testo/TestoTestRunLineMarkerProvider.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,15 @@ class TestoTestRunLineMarkerProvider : RunLineMarkerContributor() {
2424
if (element.nameIdentifier != leaf) return null
2525

2626
return when {
27-
element is Function && element.isTesto() -> withExecutorActions(
27+
element is Function && element.isTestoMethod() -> withExecutorActions(
28+
getTestStateIcon(
29+
getLocationHint(element),
30+
element.project,
31+
false,
32+
),
33+
)
34+
35+
element is PhpClass && element.isTestoClass() -> withExecutorActions(
2836
getTestStateIcon(
2937
getLocationHint(element),
3038
element.project,
@@ -47,13 +55,13 @@ class TestoTestRunLineMarkerProvider : RunLineMarkerContributor() {
4755
RUN_TEST_TOOLTIP_PROVIDER
4856
)
4957

50-
fun getLocationHint(element: Function) = when (element) {
58+
fun getLocationHint(element: Function) = when (element) {
5159
is Method -> getLocationHint(element.containingClass!!) + "::" + element.name
5260
else -> getLocationHint(element.containingFile) + "::" + element.fqn
5361
}
5462

55-
fun getLocationHint(element: PhpClass) = getLocationHint(element.containingFile) + "::" + element.fqn
56-
fun getLocationHint(file: PsiFile) = "${TestoFrameworkType.SCHEMA}://" + getFilePathDeploymentAware(file)
63+
fun getLocationHint(element: PhpClass) = getLocationHint(element.containingFile) + "::" + element.fqn
64+
fun getLocationHint(file: PsiFile) = "${TestoFrameworkType.SCHEMA}://" + getFilePathDeploymentAware(file)
5765

5866
fun getFilePathDeploymentAware(psiFile: PsiFile): String {
5967
val localPath = psiFile.virtualFile.path

src/main/kotlin/com/github/xepozz/testo/mixin.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,22 @@ package com.github.xepozz.testo
22

33
import com.intellij.psi.PsiElement
44
import com.jetbrains.php.lang.psi.elements.Function
5+
import com.jetbrains.php.lang.psi.elements.PhpClass
56

6-
fun PsiElement.isTesto(): Boolean {
7+
fun PsiElement.isTestoMethod(): Boolean {
78
return when (this) {
89
is Function -> this.getAttributes(TestoClasses.TEST).isNotEmpty()
910
else -> false
1011
}
1112
}
1213

14+
fun PsiElement.isTestoClass(): Boolean {
15+
return when (this) {
16+
is PhpClass -> name.endsWith("Test") || methods.any { it.isTestoMethod() }
17+
else -> false
18+
}
19+
}
20+
1321
fun <T> Sequence<T>.takeWhileInclusive(predicate: (T) -> Boolean) = sequence {
1422
with(iterator()) {
1523
while (hasNext()) {
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.github.xepozz.testo.references
22

3-
import com.github.xepozz.testo.isTesto
3+
import com.github.xepozz.testo.isTestoClass
4+
import com.github.xepozz.testo.isTestoMethod
45
import com.intellij.codeInsight.daemon.ImplicitUsageProvider
56
import com.intellij.psi.PsiElement
67

78
class TestFunctionImplicitUsageProvider : ImplicitUsageProvider {
8-
override fun isImplicitUsage(element: PsiElement) = element.isTesto()
9+
override fun isImplicitUsage(element: PsiElement) = element.isTestoMethod() || element.isTestoClass()
910

1011
override fun isImplicitRead(element: PsiElement) = false
1112

1213
override fun isImplicitWrite(element: PsiElement) = false
14+
15+
override fun isClassWithCustomizedInitialization(element: PsiElement) = element.isTestoClass()
1316
}

src/main/kotlin/com/github/xepozz/testo/tests/run/TestoRunConfigurationProducer.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.github.xepozz.testo.tests.run
22

3-
import com.github.xepozz.testo.isTesto
3+
import com.github.xepozz.testo.isTestoClass
4+
import com.github.xepozz.testo.isTestoMethod
45
import com.intellij.openapi.project.Project
56
import com.intellij.openapi.util.Condition
67
import com.intellij.openapi.vfs.VirtualFile
@@ -12,7 +13,6 @@ import com.intellij.util.asSafely
1213
import com.jetbrains.php.lang.psi.PhpFile
1314
import com.jetbrains.php.lang.psi.elements.Function
1415
import com.jetbrains.php.lang.psi.elements.PhpClass
15-
import com.jetbrains.php.phpunit.PhpUnitTestDescriptor
1616
import com.jetbrains.php.testFramework.run.PhpTestConfigurationProducer
1717

1818
class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfiguration>(
@@ -34,15 +34,15 @@ class TestoRunConfigurationProducer : PhpTestConfigurationProducer<TestoRunConfi
3434
override fun getConfigurationFactory() = TestoRunConfigurationFactory(TestoRunConfigurationType.INSTANCE)
3535

3636
companion object Companion {
37-
val METHOD = Condition<PsiElement> { it.isTesto() }
37+
val METHOD = Condition<PsiElement> { it.isTestoMethod() }
3838
private val METHOD_NAMER = { element: PsiElement? -> (element as? Function)?.name }
3939
private val FILE_TO_SCOPE = { file: PsiFile? ->
4040
println("file to scope: ${file?.virtualFile?.name}")
4141
file
4242
.asSafely<PhpFile>()
4343
?.let { phpFile ->
4444
PsiTreeUtil.findChildrenOfType(phpFile, PhpClass::class.java)
45-
.firstOrNull { PhpUnitTestDescriptor.INSTANCE.isTestClassName(it.name) }
45+
.firstOrNull { it.isTestoClass() }
4646
}
4747
}
4848
}

0 commit comments

Comments
 (0)