diff --git a/java/execution/impl/src/com/intellij/testIntegration/RecentTestsData.java b/java/execution/impl/src/com/intellij/testIntegration/RecentTestsData.java index 1c84338e3b6a..23f7a2468485 100644 --- a/java/execution/impl/src/com/intellij/testIntegration/RecentTestsData.java +++ b/java/execution/impl/src/com/intellij/testIntegration/RecentTestsData.java @@ -18,6 +18,7 @@ package com.intellij.testIntegration; import com.intellij.execution.testframework.sm.runner.states.TestStateInfo; import com.intellij.openapi.util.Condition; import com.intellij.openapi.vfs.VirtualFileManager; +import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.Nullable; @@ -140,20 +141,35 @@ public class RecentTestsData { private static List suiteToTestList(SuiteInfo suite) { List result = ContainerUtil.newArrayList(); + + if (suite.canTrustSuiteMagnitude() && suite.isPassed()) { + result.add(suite.getUrl()); + return result; + } - TestStateInfo.Magnitude suiteMagnitude = suite.getMagnitude(); - Set allTests = suite.getTests(); - - List sameMagnitudeTests = suite.getTests(suiteMagnitude); - if (sameMagnitudeTests.size() == allTests.size() || suite.getMagnitude() == IGNORED_INDEX) { + List failedTests = suite.getFailedTests(); + sortTestsByRecent(failedTests); + + if (failedTests.size() == suite.getTotalTestsCount()) { + result.add(suite.getUrl()); + } + else if (failedTests.size() < 3) { + result.addAll(ContainerUtil.map(failedTests, new Function() { + @Override + public String fun(TestInfo testInfo) { + return testInfo.getUrl(); + } + })); result.add(suite.getUrl()); } else { result.add(suite.getUrl()); - Collections.sort(sameMagnitudeTests, TEST_BY_RECENT_COMPARATOR); - for (TestInfo test : sameMagnitudeTests) { - result.add(test.getUrl()); - } + result.addAll(ContainerUtil.map(failedTests, new Function() { + @Override + public String fun(TestInfo testInfo) { + return testInfo.getUrl(); + } + })); } return result; @@ -199,6 +215,30 @@ class SuiteInfo extends TestInfo { return mostRecent; } + public boolean canTrustSuiteMagnitude() { + Date suiteRunDate = getRunDate(); + for (TestInfo test : tests) { + if (test.getRunDate().getTime() > suiteRunDate.getTime()) { + return false; + } + } + return true; + } + + public boolean isPassed() { + return getMagnitude() == IGNORED_INDEX || getMagnitude() == PASSED_INDEX || getMagnitude() == COMPLETE_INDEX; + } + + public List getFailedTests() { + List failed = ContainerUtil.newSmartList(); + for (TestInfo test : tests) { + if (test.getMagnitude() == FAILED_INDEX || test.getMagnitude() == ERROR_INDEX) { + failed.add(test); + } + } + return failed; + } + public String getSuiteName() { return mySuiteName; } @@ -206,13 +246,9 @@ class SuiteInfo extends TestInfo { public void addTest(TestInfo info) { tests.add(info); } - - public Set getTests() { - return tests; - } - - public List getTests(TestStateInfo.Magnitude magnitude) { - return select(tests, magnitude); + + public int getTotalTestsCount() { + return tests.size(); } } diff --git a/java/java-tests/testSrc/com/intellij/testIntergration/RecentTestsTest.kt b/java/java-tests/testSrc/com/intellij/testIntergration/RecentTestsTest.kt index 6ec778ff886d..80aba33b4705 100644 --- a/java/java-tests/testSrc/com/intellij/testIntergration/RecentTestsTest.kt +++ b/java/java-tests/testSrc/com/intellij/testIntergration/RecentTestsTest.kt @@ -151,15 +151,70 @@ class RecentTestsStepTest { val step = SelectTestStep(map, runner) val expected = listOf( - "java:suite://JavaFormatterFailed", "java:test://JavaFormatterFailed.fail", - "java:suite://JavaFormatterSuperDuperTest", + "java:suite://JavaFormatterFailed", "java:test://JavaFormatterSuperDuperTest.testFail", + "java:suite://JavaFormatterSuperDuperTest", "java:suite://Test" ) assertThat(step.values).isEqualTo(expected) } + + @Test + fun `if failed more than 2 tests show suite first`() { + val storage = TestStorage() + storage.addSuite("ASTest", false) + storage.addTest("ASTest.failed1", false, Date(3000)) + storage.addTest("ASTest.failed2", false, Date(2000)) + storage.addTest("ASTest.failed3", false, Date(1000)) + storage.addTest("ASTest.passed1", true) + + val step = SelectTestStep(storage.getMap(), runner) + val values = step.values.map { VirtualFileManager.extractPath(it) } + + assertThat(values).isEqualTo(listOf( + "ASTest", + "ASTest.failed1", + "ASTest.failed2", + "ASTest.failed3" + )) + } + + @Test + fun `if failed less than 3 tests, show tests first`() { + val storage = TestStorage() + + storage.addSuite("ASTest", false) + storage.addTest("ASTest.failed1", false, Date(3000)) + storage.addTest("ASTest.failed2", false, Date(2000)) + storage.addTest("ASTest.passed1", true) + + val step = SelectTestStep(storage.getMap(), runner) + val values = step.values.map { VirtualFileManager.extractPath(it) } + + assertThat(values).isEqualTo(listOf( + "ASTest.failed1", + "ASTest.failed2", + "ASTest" + )) + } + + @Test + fun `if all failed show only suite`() { + val storage = TestStorage() + + storage.addSuite("ASTest", false) + storage.addTest("ASTest.failed1", false) + storage.addTest("ASTest.failed2", false) + storage.addTest("ASTest.failed3", false) + storage.addTest("ASTest.failed4", false) + + val step = SelectTestStep(storage.getMap(), runner) + val values = step.values.map { VirtualFileManager.extractPath(it) } + + assertThat(values).isEqualTo(listOf("ASTest")) + } @Ignore @Test