@@ -2,6 +2,7 @@ package org.utbot.cpp.clion.plugin.ui.testsResults
2
2
3
3
import com.intellij.codeInsight.daemon.LineMarkerInfo
4
4
import com.intellij.codeInsight.daemon.LineMarkerProvider
5
+ import com.intellij.icons.AllIcons
5
6
import com.intellij.openapi.actionSystem.AnAction
6
7
import com.intellij.openapi.components.service
7
8
import com.intellij.openapi.diagnostic.Logger
@@ -10,41 +11,66 @@ import com.intellij.psi.PsiElement
10
11
import javax.swing.Icon
11
12
import org.utbot.cpp.clion.plugin.actions.generate.RunWithCoverageAction
12
13
import org.utbot.cpp.clion.plugin.ui.services.TestsResultsStorage
14
+ import testsgen.Testgen
13
15
14
16
class UTBotTestRunLineMarkerProvider : LineMarkerProvider {
15
17
val log = Logger .getInstance(this ::class .java)
16
18
17
19
override fun getLineMarkerInfo (element : PsiElement ): LineMarkerInfo <* >? {
18
- if (element.firstChild != null
19
- // TODO: introduce some alternative to the hardcode of this constants everywhere
20
- || (element.text != " TEST" && element.text != " UTBot" )
21
- || element.containingFile.name.endsWith(" .h" )) {
22
- return null
23
- }
24
- val message = if (element.text == " TEST" ) " UTBot: Run with coverage" else " Run all tests with coverage"
25
- val icon = element.project.service<TestsResultsStorage >().getTestStatusIcon(element)
26
-
27
- return UTBotRunWithCoverageLineMarkerInfo (element, message, icon)
20
+ return UTBotRunWithCoverageLineMarkerInfo .createFromPsiElementOrNull(element)
28
21
}
29
22
30
- private class UTBotRunWithCoverageLineMarkerInfo (
31
- callElement : PsiElement ,
32
- message : String ,
33
- icon : Icon ,
34
- ): LineMarkerInfo<PsiElement>(
35
- callElement,
36
- callElement.textRange,
37
- icon,
38
- { message },
39
- null ,
40
- GutterIconRenderer .Alignment .LEFT ,
41
- { message }
42
- ) {
23
+ private class UTBotRunWithCoverageLineMarkerInfo private constructor(
24
+ callElement : PsiElement ,
25
+ message : String ,
26
+ icon : Icon ,
27
+ ) : LineMarkerInfo<PsiElement>(callElement, callElement.textRange, icon, { message }, null , GutterIconRenderer .Alignment .LEFT , { message }) {
43
28
override fun createGutterRenderer (): GutterIconRenderer {
44
29
return object : LineMarkerGutterIconRenderer <PsiElement >(this ) {
45
30
override fun isNavigateAction (): Boolean = true
46
31
override fun getClickAction (): AnAction ? = element?.let { RunWithCoverageAction (it) }
47
32
}
48
33
}
34
+
35
+
36
+ companion object {
37
+ fun createFromPsiElementOrNull (element : PsiElement ): UTBotRunWithCoverageLineMarkerInfo ? {
38
+ if (element.firstChild != null || (! isSingleTest(element) && ! isAllTests(element)) || element.containingFile.name.endsWith(" .h" )) {
39
+ return null
40
+ }
41
+ val message = if (isSingleTest(element)) " UTBot: Run with coverage" else " Run all tests with coverage"
42
+
43
+ return UTBotRunWithCoverageLineMarkerInfo (element, message, getStatusIcon(element))
44
+ }
45
+
46
+ private fun getStatusIcon (element : PsiElement ): Icon {
47
+ // return icon for Running All Tests
48
+ if (! isAllTests(element)) {
49
+ return AllIcons .RunConfigurations .TestState .Run_run
50
+ }
51
+
52
+ val testName: String = TestNameAndTestSuite .create(element).name
53
+ val testResult: Testgen .TestResultObject ? = element.project.service<TestsResultsStorage >().getTestResultByTestName(testName)
54
+
55
+ // if there's no info about TestResult with the specified name, return icon for running single test
56
+ if (testResult == null || testName.isEmpty()) {
57
+ return AllIcons .RunConfigurations .TestState .Run
58
+ }
59
+
60
+ // return icon corresponding to cached test status
61
+ return when (testResult.status) {
62
+ Testgen .TestStatus .TEST_FAILED -> AllIcons .RunConfigurations .TestState .Red2
63
+ Testgen .TestStatus .TEST_PASSED -> AllIcons .RunConfigurations .TestState .Green2
64
+ else -> AllIcons .RunConfigurations .TestError
65
+ }
66
+ }
67
+ }
68
+ }
69
+
70
+ companion object {
71
+ private const val RUN_SINGLE_TEST_TEXT_MARK = " TEST"
72
+ private const val RUN_ALL_TESTS_TEXT_MARK = " UTBot"
73
+ private fun isSingleTest (element : PsiElement ) = element.text == RUN_SINGLE_TEST_TEXT_MARK
74
+ private fun isAllTests (element : PsiElement ) = element.text == RUN_ALL_TESTS_TEXT_MARK
49
75
}
50
- }
76
+ }
0 commit comments