diff --git a/java/execution/impl/src/com/intellij/testIntegration/RecentTestsData.kt b/java/execution/impl/src/com/intellij/testIntegration/RecentTestsData.kt index b28de358ea41..8e77286b5cd9 100644 --- a/java/execution/impl/src/com/intellij/testIntegration/RecentTestsData.kt +++ b/java/execution/impl/src/com/intellij/testIntegration/RecentTestsData.kt @@ -16,52 +16,70 @@ package com.intellij.testIntegration import com.intellij.execution.RunnerAndConfigurationSettings -import com.intellij.execution.testframework.sm.runner.states.TestStateInfo +import com.intellij.execution.testframework.sm.runner.states.TestStateInfo.Magnitude import com.intellij.openapi.vfs.VirtualFileManager -import com.intellij.util.containers.ContainerUtil import java.util.* +fun SuiteEntry.isMyTest(test: SingleTestEntry): Boolean { + val testName = VirtualFileManager.extractPath(test.url) + return testName.startsWith(this.suiteName) +} + class RecentTestsData { private val runConfigurationSuites = hashMapOf() - private var testsWithoutSuites: MutableList = ContainerUtil.newArrayList() - fun addSuite(url: String, - magnitude: TestStateInfo.Magnitude, - runDate: Date, - runConfiguration: RunnerAndConfigurationSettings) + private var unmatchedRunConfigurationTests: MutableList = arrayListOf() + + private val urlSuites = mutableListOf() + private var unmatchedUrlTests = mutableListOf() + + fun addUrlSuite(url: String, magnitude: Magnitude, runDate: Date) { + val suite = SuiteEntry(url, magnitude, runDate) + + unmatchedUrlTests.filter { suite.isMyTest(it) }.forEach { suite.addTest(it) } + unmatchedUrlTests.filterTo(arrayListOf(), { !suite.isMyTest(it) }) + + urlSuites.add(suite) + } + + fun addRunConfigurationSuite(url: String, + magnitude: Magnitude, + runDate: Date, + runConfiguration: RunnerAndConfigurationSettings) { - val suiteInfo = SuiteEntry(url, magnitude, runDate, runConfiguration) + val suite = SuiteEntry(url, magnitude, runDate) + + unmatchedRunConfigurationTests.filter { suite.isMyTest(it) }.forEach { suite.addTest(it) } + unmatchedRunConfigurationTests = unmatchedRunConfigurationTests.filterTo(arrayListOf(), { !suite.isMyTest(it) }) val configurationId = runConfiguration.uniqueID val suitePack = runConfigurationSuites[configurationId] if (suitePack != null) { - suitePack.addSuite(suiteInfo) - return - } - - runConfigurationSuites[configurationId] = RunConfigurationEntry(runConfiguration, suiteInfo) - } - - - fun addTest(url: String, - magnitude: TestStateInfo.Magnitude, - runDate: Date, - runConfiguration: RunnerAndConfigurationSettings) { - - val testInfo = SingleTestEntry(url, magnitude, runDate, runConfiguration) - - val suite = findSuite(url, runConfiguration) - if (suite != null) { - suite.addTest(testInfo) + suitePack.addSuite(suite) return } - testsWithoutSuites.add(testInfo) + runConfigurationSuites[configurationId] = RunConfigurationEntry(runConfiguration, suite) } - private fun findSuite(url: String, runConfiguration: RunnerAndConfigurationSettings): SuiteEntry? { + fun addUrlTest(url: String, magnitude: Magnitude, runDate: Date) { + val test = SingleTestEntry(url, magnitude, runDate) + findUrlSuite(url)?.addTest(test) ?: unmatchedUrlTests.add(test) + } + + fun addRunConfigurationTest(url: String, magnitude: Magnitude, runDate: Date, runConfiguration: RunnerAndConfigurationSettings) { + val test = SingleTestEntry(url, magnitude, runDate) + findRunConfigurationTest(url, runConfiguration)?.addTest(test) ?: unmatchedRunConfigurationTests.add(test) + } + + private fun findUrlSuite(url: String) = urlSuites.find { + val testName = VirtualFileManager.extractPath(url) + testName.startsWith(it.suiteName) + } + + private fun findRunConfigurationTest(url: String, runConfiguration: RunnerAndConfigurationSettings): SuiteEntry? { val pack: RunConfigurationEntry = runConfigurationSuites[runConfiguration.uniqueID] ?: return null val testName = VirtualFileManager.extractPath(url) @@ -75,10 +93,7 @@ class RecentTestsData { } fun getTestsToShow(): List { - testsWithoutSuites.forEach { - val url = it.url - findSuite(url, it.runConfiguration)?.addTest(it) - } + assert(unmatchedRunConfigurationTests.isEmpty()) val packsByDate = runConfigurationSuites.values.sortedByDescending { it.runDate } return packsByDate.fold(listOf(), { list, pack -> list + pack.entriesToShow() }) diff --git a/java/execution/impl/src/com/intellij/testIntegration/RecentTestsListProvider.java b/java/execution/impl/src/com/intellij/testIntegration/RecentTestsListProvider.java index 1619134f6919..87289e3612dc 100644 --- a/java/execution/impl/src/com/intellij/testIntegration/RecentTestsListProvider.java +++ b/java/execution/impl/src/com/intellij/testIntegration/RecentTestsListProvider.java @@ -100,11 +100,19 @@ public class RecentTestsListProvider { RunnerAndConfigurationSettings runConfiguration = myConfigurationProvider.getConfiguration(record); if (TestLocator.isSuite(url)) { if (runConfiguration != null) { - data.addSuite(url, magnitude, record.date, runConfiguration); + data.addRunConfigurationSuite(url, magnitude, record.date, runConfiguration); + } + else { + data.addUrlSuite(url, magnitude, record.date); } } else { - data.addTest(url, magnitude, record.date, runConfiguration); + if (runConfiguration != null) { + data.addRunConfigurationTest(url, magnitude, record.date, runConfiguration); + } + else { + data.addUrlTest(url, magnitude, record.date); + } } } diff --git a/java/execution/impl/src/com/intellij/testIntegration/RunConfigurationEntry.kt b/java/execution/impl/src/com/intellij/testIntegration/RunConfigurationEntry.kt index bb23cb41a909..7f7b1357e666 100644 --- a/java/execution/impl/src/com/intellij/testIntegration/RunConfigurationEntry.kt +++ b/java/execution/impl/src/com/intellij/testIntegration/RunConfigurationEntry.kt @@ -35,10 +35,9 @@ interface RecentTestsPopupEntry { open fun navigatableElement(locator: TestLocator): PsiElement? = null } -open class SingleTestEntry(val url: String, - override val magnitude: TestStateInfo.Magnitude, - override val runDate: Date, - val runConfiguration: RunnerAndConfigurationSettings) : RecentTestsPopupEntry +open class SingleTestEntry(val url: String, + override val magnitude: TestStateInfo.Magnitude, + override val runDate: Date) : RecentTestsPopupEntry { override val presentation = VirtualFileManager.extractPath(url) @@ -52,10 +51,8 @@ open class SingleTestEntry(val url: String, } -class SuiteEntry(url: String, magnitude: TestStateInfo.Magnitude, runDate: Date, runConfiguration: RunnerAndConfigurationSettings) - : SingleTestEntry(url, magnitude, runDate, runConfiguration) -{ - +class SuiteEntry(url: String, magnitude: TestStateInfo.Magnitude, runDate: Date) : SingleTestEntry(url, magnitude, runDate) { + private val tests = hashSetOf() override val testsUrls: List diff --git a/java/java-tests/testSrc/com/intellij/testIntergration/RecentTestsTest.kt b/java/java-tests/testSrc/com/intellij/testIntergration/RecentTestsTest.kt index ab7fe6a8b8df..82a76ae8aeca 100644 --- a/java/java-tests/testSrc/com/intellij/testIntergration/RecentTestsTest.kt +++ b/java/java-tests/testSrc/com/intellij/testIntergration/RecentTestsTest.kt @@ -40,14 +40,14 @@ class RecentTestsStepTest: LightIdeaTestCase() { } fun `test all tests passed`() { - data.addTest("java:test://Test.textXXX", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) - data.addSuite("java:suite://Test", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) - data.addSuite("java:suite://JavaFormatterSuperDuperTest", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) - data.addTest("java:test://Test.textYYY", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) - data.addTest("java:test://JavaFormatterSuperDuperTest.testItMakesMeSadToFixIt", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) - data.addTest("java:test://Test.textZZZ", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) - data.addTest("java:test://Test.textQQQ", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) - data.addTest("java:test://JavaFormatterSuperDuperTest.testUnconditionalAlignmentErrorneous", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://Test.textXXX", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationSuite("java:suite://Test", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationSuite("java:suite://JavaFormatterSuperDuperTest", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://Test.textYYY", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://JavaFormatterSuperDuperTest.testItMakesMeSadToFixIt", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://Test.textZZZ", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://Test.textQQQ", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://JavaFormatterSuperDuperTest.testUnconditionalAlignmentErrorneous", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) val tests = data.getTestsToShow() assertThat(tests).hasSize(1) @@ -56,13 +56,13 @@ class RecentTestsStepTest: LightIdeaTestCase() { fun `test if one failed in run configuration show failed suite`() { - data.addSuite("java:suite://JavaFormatterSuperDuperTest", TestStateInfo.Magnitude.FAILED_INDEX, now, allTests) - data.addSuite("java:suite://Test", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationSuite("java:suite://JavaFormatterSuperDuperTest", TestStateInfo.Magnitude.FAILED_INDEX, now, allTests) + data.addRunConfigurationSuite("java:suite://Test", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) - data.addTest("java:test://JavaFormatterSuperDuperTest.testItMakesMeSadToFixIt", TestStateInfo.Magnitude.FAILED_INDEX, now, allTests) - data.addTest("java:test://JavaFormatterSuperDuperTest.testUnconditionalAlignmentErrorneous", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://JavaFormatterSuperDuperTest.testItMakesMeSadToFixIt", TestStateInfo.Magnitude.FAILED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://JavaFormatterSuperDuperTest.testUnconditionalAlignmentErrorneous", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) - data.addTest("java:test://Test.textXXX", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://Test.textXXX", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) val tests = data.getTestsToShow() @@ -73,9 +73,9 @@ class RecentTestsStepTest: LightIdeaTestCase() { fun `test if configuration with single test show failed test`() { - data.addSuite("java:suite://JavaFormatterSuperDuperTest", TestStateInfo.Magnitude.FAILED_INDEX, now, allTests) - data.addTest("java:test://JavaFormatterSuperDuperTest.testItMakesMeSadToFixIt", TestStateInfo.Magnitude.FAILED_INDEX, now, allTests) - data.addTest("java:test://JavaFormatterSuperDuperTest.testUnconditionalAlignmentErrorneous", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) + data.addRunConfigurationSuite("java:suite://JavaFormatterSuperDuperTest", TestStateInfo.Magnitude.FAILED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://JavaFormatterSuperDuperTest.testItMakesMeSadToFixIt", TestStateInfo.Magnitude.FAILED_INDEX, now, allTests) + data.addRunConfigurationTest("java:test://JavaFormatterSuperDuperTest.testUnconditionalAlignmentErrorneous", TestStateInfo.Magnitude.PASSED_INDEX, now, allTests) val tests = data.getTestsToShow() assertThat(tests).hasSize(2)