From 6ea9761823de0ebcea9778bfc1abeae9540f8ffb Mon Sep 17 00:00:00 2001 From: Roman Chernyatchik Date: Wed, 13 Aug 2008 23:18:43 +0400 Subject: [PATCH] Ruby tests runner: initial version of tests statistics tab --- .../runner/GeneralTestEventsProcessor.java | 2 +- .../runner/GeneralToRTestUnitEventsConvertor.java | 36 +-- .../server/OutputToGeneralTestEventsConverter.java | 16 +- .../testunit/runner/states/TestStateInfo.java | 28 +- .../testunit/runner/ui/RTestUnitConsoleView.java | 11 +- .../testunit/runner/ui/RTestUnitResultsForm.java | 6 +- .../testunit/runner/ui/TestResultsViewer.java | 3 +- .../testunit/runner/ui/TestsPresentationUtil.java | 22 ++ .../runner/ui/statistics/ColumnDuration.java | 21 ++ .../runner/ui/statistics/ColumnResults.java | 77 ++++++ .../testunit/runner/ui/statistics/ColumnTest.java | 18 ++ .../ui/statistics/RTestUnitStatisticsPanel.form | 33 +++ .../ui/statistics/RTestUnitStatisticsPanel.java | 42 +++ .../statistics/RTestUnitStatisticsTableModel.java | 130 +++++++++ .../GeneralToRTestUnitEventsConvertorTest.java | 8 +- .../testunit/runner/ui/MockTestResultsViewer.java | 2 +- .../runner/ui/TestsPresentationUtilTest.java | 100 +++++++ .../runner/ui/statistics/ColumnDurationTest.java | 50 ++++ .../runner/ui/statistics/ColumnResultsTests.java | 51 ++++ .../runner/ui/statistics/ColumnTestTest.java | 46 ++++ .../RTestUnitStatisticsTableModelTest.java | 303 +++++++++++++++++++++ 21 files changed, 958 insertions(+), 47 deletions(-) create mode 100644 plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnDuration.java create mode 100644 plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnResults.java create mode 100644 plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnTest.java create mode 100644 plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsPanel.form create mode 100644 plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsPanel.java create mode 100644 plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsTableModel.java create mode 100644 plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnDurationTest.java create mode 100644 plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnResultsTests.java create mode 100644 plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnTestTest.java create mode 100644 plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsTableModelTest.java diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralTestEventsProcessor.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralTestEventsProcessor.java index cda66e1484..ffcdfcc35b 100644 --- a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralTestEventsProcessor.java +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralTestEventsProcessor.java @@ -12,7 +12,7 @@ public interface GeneralTestEventsProcessor extends Disposable { void onTestsCountInSuite(final int count); void onTestStarted(final String testName); - void onTestFinished(final String testName); + void onTestFinished(final String testName, final int duration); void onTestFailure(final String testName, final String localizedMessage, final String stackTrace, final boolean testError); void onTestOutput(final String testName, final String text, final boolean stdOut); diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralToRTestUnitEventsConvertor.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralToRTestUnitEventsConvertor.java index 73184067fe..396d510ff7 100644 --- a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralToRTestUnitEventsConvertor.java +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralToRTestUnitEventsConvertor.java @@ -8,8 +8,8 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.util.Key; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.ruby.support.UIUtil; -import javax.swing.*; import java.util.*; /** @@ -37,7 +37,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce } public void onStartTesting() { - addToInvokeLater(new Runnable() { + UIUtil.addToInvokeLater(new Runnable() { public void run() { mySuitesStack.pushSuite(myTestsRootNode); myTestsRootNode.setStarted(); @@ -49,7 +49,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce } public void onFinishTesting() { - addToInvokeLater(new Runnable() { + UIUtil.addToInvokeLater(new Runnable() { public void run() { if (myIsTestingFinished) { // has been already invoked! @@ -76,7 +76,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce } public void onTestStarted(final String testName) { - addToInvokeLater(new Runnable() { + UIUtil.addToInvokeLater(new Runnable() { public void run() { final String fullName = getFullTestName(testName); @@ -104,7 +104,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce } public void onSuiteStarted(final String suiteName) { - addToInvokeLater(new Runnable() { + UIUtil.addToInvokeLater(new Runnable() { public void run() { final RTestUnitTestProxy parentSuite = getCurrentSuite(); //new suite @@ -122,8 +122,8 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce }); } - public void onTestFinished(final String testName) { - addToInvokeLater(new Runnable() { + public void onTestFinished(final String testName, final int duration) { + UIUtil.addToInvokeLater(new Runnable() { public void run() { final String fullTestName = getFullTestName(testName); final RTestUnitTestProxy testProxy = getProxyByFullTestName(fullTestName); @@ -132,6 +132,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce return; } + //TODO pass duration testProxy.setFinished(); myRunningTestsFullNameToProxy.remove(fullTestName); @@ -142,7 +143,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce } public void onSuiteFinished(final String suiteName) { - addToInvokeLater(new Runnable() { + UIUtil.addToInvokeLater(new Runnable() { public void run() { final RTestUnitTestProxy mySuite = mySuitesStack.popSuite(suiteName); mySuite.setFinished(); @@ -154,7 +155,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce } public void onUncapturedOutput(final String text, final Key outputType) { - addToInvokeLater(new Runnable() { + UIUtil.addToInvokeLater(new Runnable() { public void run() { //if we can locate test - we will send outout to it, otherwise to current test suite final RTestUnitTestProxy currentProxy; @@ -182,7 +183,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce public void onTestFailure(final String testName, final String localizedMessage, final String stackTrace, final boolean isTestError) { - addToInvokeLater(new Runnable() { + UIUtil.addToInvokeLater(new Runnable() { public void run() { final String fullTestName = getFullTestName(testName); final RTestUnitTestProxy testProxy = getProxyByFullTestName(fullTestName); @@ -210,7 +211,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce public void onTestOutput(final String testName, final String text, final boolean stdOut) { - addToInvokeLater(new Runnable() { + UIUtil.addToInvokeLater(new Runnable() { public void run() { final String fullTestName = getFullTestName(testName); final RTestUnitTestProxy testProxy = getProxyByFullTestName(fullTestName); @@ -229,7 +230,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce } public void onTestsCountInSuite(final int count) { - addToInvokeLater(new Runnable() { + UIUtil.addToInvokeLater(new Runnable() { public void run() { fireOnTestsCountInSuite(count); } @@ -330,7 +331,7 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce * Remove listeners, etc */ public void dispose() { - addToInvokeLater(new Runnable() { + UIUtil.addToInvokeLater(new Runnable() { public void run() { myEventsListeners.clear(); @@ -345,13 +346,4 @@ public class GeneralToRTestUnitEventsConvertor implements GeneralTestEventsProce } }); } - - private static void addToInvokeLater(final Runnable runnable) { - final Application application = ApplicationManager.getApplication(); - if (application.isHeadlessEnvironment() || application.isUnitTestMode()) { - runnable.run(); - } else { - SwingUtilities.invokeLater(runnable); - } - } } diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/server/OutputToGeneralTestEventsConverter.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/server/OutputToGeneralTestEventsConverter.java index d1e27a1675..7baf7eb530 100644 --- a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/server/OutputToGeneralTestEventsConverter.java +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/server/OutputToGeneralTestEventsConverter.java @@ -135,9 +135,9 @@ public class OutputToGeneralTestEventsConverter implements ProcessOutputConsumer } } - private void fireOnTestFinished(final String testName) { + private void fireOnTestFinished(final String testName, final int duration) { for (GeneralTestEventsProcessor processor : myProcessors) { - processor.onTestFinished(testName); + processor.onTestFinished(testName, duration); } } @@ -156,6 +156,7 @@ public class OutputToGeneralTestEventsConverter implements ProcessOutputConsumer private class MyServiceMessageVisitor extends DefaultServiceMessageVisitor { @NonNls public static final String KEY_TESTS_COUNT = "testCount"; @NonNls private static final String ATTR_KEY_TEST_ERROR = "error"; + @NonNls private static final String ATTR_KEY_TEST_DURATION = "duration"; public void visitTestSuiteStarted(@NotNull final TestSuiteStarted suiteStarted) { fireOnSuiteStarted(suiteStarted.getSuiteName()); @@ -170,7 +171,16 @@ public class OutputToGeneralTestEventsConverter implements ProcessOutputConsumer } public void visitTestFinished(@NotNull final TestFinished testFinished) { - fireOnTestFinished(testFinished.getTestName()); + final String durationStr = testFinished.getAttributes().get(ATTR_KEY_TEST_DURATION); + + // Test's duration in milliseconds + int duration = 0; + try { + duration = Integer.parseInt(durationStr); + } catch (NumberFormatException ex) { + LOG.error(ex); + } + fireOnTestFinished(testFinished.getTestName(), duration); } public void visitTestIgnored(@NotNull final TestIgnored testIgnored) { diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/states/TestStateInfo.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/states/TestStateInfo.java index 80267967fa..29596eb82e 100644 --- a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/states/TestStateInfo.java +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/states/TestStateInfo.java @@ -1,5 +1,7 @@ package org.jetbrains.plugins.ruby.testing.testunit.runner.states; +import org.jetbrains.plugins.ruby.RBundle; + /** * @author Roman Chernyatchik * @@ -44,24 +46,30 @@ public interface TestStateInfo { //WARN: It is Hack, see PoolOfTestStates, API is necessary enum Magnitude { - SKIPPED_INDEX(0), - COMPLETE_INDEX(1), - NOT_RUN_INDEX(2), - RUNNING_INDEX(3), - TERMINATED_INDEX(4), - IGNORED_INDEX(5), - FAILED_INDEX(6), - ERROR_INDEX(8), - PASSED_INDEX(COMPLETE_INDEX.myValue); + SKIPPED_INDEX(0, RBundle.message("ruby.test.runner.magnitude.skipped.failed.title")), + COMPLETE_INDEX(1, RBundle.message("ruby.test.runner.magnitude.completed.failed.title")), + NOT_RUN_INDEX(2, RBundle.message("ruby.test.runner.magnitude.not.run.failed.title")), + RUNNING_INDEX(3, RBundle.message("ruby.test.runner.magnitude.running.failed.title")), + TERMINATED_INDEX(4, RBundle.message("ruby.test.runner.magnitude.terminated.failed.title")), + IGNORED_INDEX(5, RBundle.message("ruby.test.runner.magnitude.ignored.failed.title")), + FAILED_INDEX(6, RBundle.message("ruby.test.runner.magnitude.assertion.failed.title")), + ERROR_INDEX(8, RBundle.message("ruby.test.runner.magnitude.testerror.title")), + PASSED_INDEX(COMPLETE_INDEX.myValue, RBundle.message("ruby.test.runner.magnitude.passed.title")); private final int myValue; + private final String myTitle; - Magnitude(int value) { + Magnitude(final int value, final String title) { myValue = value; + myTitle = title; } public int getValue() { return myValue; } + + public String getTitle() { + return myTitle; + } } } diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/RTestUnitConsoleView.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/RTestUnitConsoleView.java index 2a2e4ca568..cf4ae6cb84 100644 --- a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/RTestUnitConsoleView.java +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/RTestUnitConsoleView.java @@ -1,13 +1,14 @@ package org.jetbrains.plugins.ruby.testing.testunit.runner.ui; +import com.intellij.execution.ExecutionBundle; import com.intellij.execution.process.ProcessHandler; import com.intellij.execution.testframework.TestConsoleProperties; +import com.intellij.execution.testframework.TestsUIUtil; import com.intellij.execution.testframework.ui.BaseTestsOutputConsoleView; import com.intellij.execution.testframework.ui.PrintableTestProxy; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.util.Disposer; import org.jetbrains.annotations.Nullable; -import org.jetbrains.plugins.ruby.RBundle; import org.jetbrains.plugins.ruby.utils.IdeaInternalUtil; import javax.swing.*; @@ -16,6 +17,8 @@ import javax.swing.*; * @author: Roman Chernyatchik */ public class RTestUnitConsoleView extends BaseTestsOutputConsoleView { + private static final Icon OUTPUT_TAB_ICON = TestsUIUtil.loadIcon("testOuput"); + private TestResultsViewer myResultsViewer; public RTestUnitConsoleView(final TestConsoleProperties consoleProperties, @@ -25,7 +28,9 @@ public class RTestUnitConsoleView extends BaseTestsOutputConsoleView { // Results View myResultsViewer = resultsViewer; - myResultsViewer.addTab(RBundle.message("ruby.test.runner.ui.tabs.output.title"), + + // Console + myResultsViewer.addTab(ExecutionBundle.message("output.tab.title"), OUTPUT_TAB_ICON, getConsole().getComponent()); myResultsViewer.addTestsProxySelectionListener(new TestProxyTreeSelectionListener() { public void onSelected(@Nullable final PrintableTestProxy selectedTestProxy) { @@ -41,7 +46,7 @@ public class RTestUnitConsoleView extends BaseTestsOutputConsoleView { } }); - //TODO[romeo] add tabs: statistics + // init myResultsViewer.initLogFilesManager(); } diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/RTestUnitResultsForm.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/RTestUnitResultsForm.java index dcc30fb795..dd0baca1eb 100644 --- a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/RTestUnitResultsForm.java +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/RTestUnitResultsForm.java @@ -136,8 +136,10 @@ public class RTestUnitResultsForm implements TestFrameworkRunningModel, LogConso return myContentPane; } - public void addTab(@NotNull final String tabTitle, @NotNull final Component component) { - myTabbedPane.addTab(tabTitle, component); + public void addTab(@NotNull final String tabTitle, + @Nullable final Icon icon, + @NotNull final Component component) { + myTabbedPane.addTab(tabTitle, icon, component); } public void addTestsProxySelectionListener(final TestProxyTreeSelectionListener listener) { diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestResultsViewer.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestResultsViewer.java index 5e5fe43138..50b5276e1f 100644 --- a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestResultsViewer.java +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestResultsViewer.java @@ -16,9 +16,10 @@ public interface TestResultsViewer extends Disposable { /** * Add tab to viwer * @param name Tab name + * @param icon * @param contentPane Tab content pane */ - void addTab(final String name, final Component contentPane); + void addTab(final String name, @Nullable final Icon icon, final Component contentPane); /** * Subscribe on test proxy selection events diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestsPresentationUtil.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestsPresentationUtil.java index f89ed9de5a..f5cb550fbb 100644 --- a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestsPresentationUtil.java +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestsPresentationUtil.java @@ -4,6 +4,7 @@ import com.intellij.execution.testframework.PoolOfTestIcons; import com.intellij.execution.testframework.ui.TestsProgressAnimator; import com.intellij.ui.SimpleTextAttributes; import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.ruby.RBundle; import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitConsoleProperties; import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitTestProxy; @@ -144,4 +145,25 @@ public class TestsPresentationUtil { } return null; } + + @Nullable + public static String getTestStatusPresentation(final RTestUnitTestProxy proxy) { + return proxy.getMagnitudeInfo().getTitle(); + } + + @Nullable + public static String getSuiteStatusPresentation(final RTestUnitTestProxy proxy) { + //TODO[romeo] improove + return String.valueOf(proxy.getChildren().size()); + } + + /** + * @param proxy Test or Suite + * @return Duration presentation for given proxy + */ + @Nullable + public static String getDurationPresentation(final RTestUnitTestProxy proxy) { + //TODO[romeo] implement + return ""; + } } diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnDuration.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnDuration.java new file mode 100644 index 0000000000..7b2959d260 --- /dev/null +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnDuration.java @@ -0,0 +1,21 @@ +package org.jetbrains.plugins.ruby.testing.testunit.runner.ui.statistics; + +import com.intellij.util.ui.ColumnInfo; +import org.jetbrains.plugins.ruby.RBundle; +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitTestProxy; +import org.jetbrains.plugins.ruby.testing.testunit.runner.ui.TestsPresentationUtil; + +/** + * @author Roman Chernyatchik +*/ +public class ColumnDuration extends ColumnInfo { + public ColumnDuration() { + super(RBundle.message("ruby.test.runner.ui.tabs.statistics.columns.duration.title")); + } + + public String valueOf(final RTestUnitTestProxy testProxy) { + return TestsPresentationUtil.getDurationPresentation(testProxy); + } + + //TODO sort +} diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnResults.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnResults.java new file mode 100644 index 0000000000..c9bb3191e1 --- /dev/null +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnResults.java @@ -0,0 +1,77 @@ +package org.jetbrains.plugins.ruby.testing.testunit.runner.ui.statistics; + +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitTestProxy; +import org.jetbrains.plugins.ruby.testing.testunit.runner.ui.TestsPresentationUtil; +import org.jetbrains.plugins.ruby.testing.testunit.runner.states.TestStateInfo; +import org.jetbrains.plugins.ruby.RBundle; +import com.intellij.util.ui.ColumnInfo; +import com.intellij.ui.SimpleTextAttributes; +import com.intellij.ui.ColoredTableCellRenderer; +import com.intellij.execution.testframework.TestsUIUtil; + +import javax.swing.table.TableCellRenderer; +import javax.swing.*; +import java.awt.*; + +/** + * @author Roman Chernyatchik +*/ +public class ColumnResults extends ColumnInfo { + public static final SimpleTextAttributes PASSED_ATTRIBUTES = new SimpleTextAttributes(SimpleTextAttributes.STYLE_BOLD, TestsUIUtil.PASSED_COLOR); + public static final SimpleTextAttributes DEFFECT_ATTRIBUTES = new SimpleTextAttributes(SimpleTextAttributes.STYLE_BOLD, Color.RED); + private static final SimpleTextAttributes TERMINATED_ATTRIBUTE = new SimpleTextAttributes(SimpleTextAttributes.STYLE_BOLD, Color.ORANGE); + + //TODO sort + + public ColumnResults() { + super(RBundle.message("ruby.test.runner.ui.tabs.statistics.columns.results.title")); + } + + public String valueOf(final RTestUnitTestProxy testProxy) { + if (testProxy.isSuite()) { + // for suite returns brief statistics + return TestsPresentationUtil.getSuiteStatusPresentation(testProxy); + } + // for test returns test status string + return TestsPresentationUtil.getTestStatusPresentation(testProxy); + } + + @Override + public TableCellRenderer getRenderer(final RTestUnitTestProxy proxy) { + return new ColoredTableCellRenderer() { + protected void customizeCellRenderer(final JTable table, + final Object value, + final boolean selected, + final boolean hasFocus, + final int row, + final int column) { + final String title = value.toString(); + + final TestStateInfo.Magnitude info = proxy.getMagnitudeInfo(); + switch (info) { + case COMPLETE_INDEX: + case PASSED_INDEX: + append(title, PASSED_ATTRIBUTES); + break; + case RUNNING_INDEX: + append(title, SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES); + break; + case NOT_RUN_INDEX: + append(title, SimpleTextAttributes.GRAYED_ATTRIBUTES); + break; + case IGNORED_INDEX: + case SKIPPED_INDEX: + append(title, SimpleTextAttributes.EXCLUDED_ATTRIBUTES); + break; + case ERROR_INDEX: + case FAILED_INDEX: + append(title, DEFFECT_ATTRIBUTES); + break; + case TERMINATED_INDEX: + append(title, TERMINATED_ATTRIBUTE); + break; + } + } + }; + } +} diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnTest.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnTest.java new file mode 100644 index 0000000000..43c173bc9f --- /dev/null +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnTest.java @@ -0,0 +1,18 @@ +package org.jetbrains.plugins.ruby.testing.testunit.runner.ui.statistics; + +import com.intellij.util.ui.ColumnInfo; +import org.jetbrains.plugins.ruby.RBundle; +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitTestProxy; + +/** + * @author Roman Chernyatchik +*/ +public class ColumnTest extends ColumnInfo { + public ColumnTest() { + super(RBundle.message("ruby.test.runner.ui.tabs.statistics.columns.test.title")); + } + + public String valueOf(final RTestUnitTestProxy testProxy) { + return testProxy.getPresentableName(); + } +} diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsPanel.form b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsPanel.form new file mode 100644 index 0000000000..7e0831a3b3 --- /dev/null +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsPanel.form @@ -0,0 +1,33 @@ + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsPanel.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsPanel.java new file mode 100644 index 0000000000..58edb8aecf --- /dev/null +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsPanel.java @@ -0,0 +1,42 @@ +package org.jetbrains.plugins.ruby.testing.testunit.runner.ui.statistics; + +import com.intellij.execution.testframework.TestsUIUtil; +import com.intellij.ui.table.TableView; +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitEventsListener; +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitTestProxy; +import org.jetbrains.plugins.ruby.testing.testunit.runner.ui.TestProxyTreeSelectionListener; + +import javax.swing.*; + +/** + * @author Roman Chernyatchik + */ +public class RTestUnitStatisticsPanel extends JPanel { + public static final Icon STATISTICS_TAB_ICON = TestsUIUtil.loadIcon("testStatistics"); + + private TableView myStatisticsTableView; + private JPanel myContentPane; + + private RTestUnitStatisticsTableModel myTableModel; + + public RTestUnitStatisticsPanel() { + myTableModel = new RTestUnitStatisticsTableModel(); + myStatisticsTableView.setModel(myTableModel); + } + + public JPanel getContentPane() { + return myContentPane; + } + + public TestProxyTreeSelectionListener createSelectionListener() { + return myTableModel.createSelectionListener(); + } + + public RTestUnitEventsListener createTestEventsListener() { + return myTableModel.createTestEventsListener(); + } + + private void createUIComponents() { + myStatisticsTableView = new TableView(); + } +} diff --git a/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsTableModel.java b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsTableModel.java new file mode 100644 index 0000000000..ffb313fc15 --- /dev/null +++ b/plugins/ruby/src/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsTableModel.java @@ -0,0 +1,130 @@ +package org.jetbrains.plugins.ruby.testing.testunit.runner.ui.statistics; + +import com.intellij.execution.testframework.ui.PrintableTestProxy; +import com.intellij.util.ui.ListTableModel; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.ruby.support.UIUtil; +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitEventsAdapter; +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitEventsListener; +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitTestProxy; +import org.jetbrains.plugins.ruby.testing.testunit.runner.ui.TestProxyTreeSelectionListener; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * @author Roman Chernyatchik + */ +public class RTestUnitStatisticsTableModel extends ListTableModel { + private RTestUnitTestProxy myCurrentSuite; + + public RTestUnitStatisticsTableModel() { + super(new ColumnTest(), new ColumnDuration(), new ColumnResults()); + } + + public TestProxyTreeSelectionListener createSelectionListener() { + return new TestProxyTreeSelectionListener() { + public void onSelected(@Nullable final PrintableTestProxy selectedTestProxy) { + final RTestUnitTestProxy proxy; + if (selectedTestProxy instanceof RTestUnitTestProxy) { + proxy = (RTestUnitTestProxy)selectedTestProxy; + } else { + proxy = null; + } + + myCurrentSuite = getCurrentSuiteFor(proxy); + + updateModel(); + } + }; + } + + private void updateModel() { + UIUtil.addToInvokeLater(new Runnable() { + public void run() { + // updates model + setItems(getItemsForSuite(myCurrentSuite)); + } + }); + } + + @NotNull + private List getItemsForSuite(@Nullable final RTestUnitTestProxy suite) { + if (suite == null) { + return Collections.emptyList(); + } + + final List list = new ArrayList(); + list.addAll(suite.getChildren()); + //TODO totatl -- black bolded + return list; + } + + @Nullable + private RTestUnitTestProxy getCurrentSuiteFor(@Nullable final RTestUnitTestProxy proxy) { + if (proxy == null) { + return null; + } + + // If proxy is suite, returns it + final RTestUnitTestProxy suite; + if (proxy.isSuite()) { + suite = proxy; + } + else { + // If proxy is tests returns test's suite + suite = proxy.getParent(); + } + return suite; + } + + public RTestUnitEventsListener createTestEventsListener() { + return new RTestUnitEventsAdapter() { + @Override + public void onSuiteStarted(@NotNull final RTestUnitTestProxy suite) { + if (shouldUpdateModelBySuite(suite)) { + updateModel(); + } + } + + @Override + public void onSuiteFinished(@NotNull final RTestUnitTestProxy suite) { + if (shouldUpdateModelBySuite(suite)) { + updateModel(); + } + } + + @Override + public void onTestStarted(@NotNull final RTestUnitTestProxy test) { + if (shouldUpdateModelByTest(test)) { + updateModel(); + } + } + + @Override + public void onTestFinished(@NotNull final RTestUnitTestProxy test) { + if (shouldUpdateModelByTest(test)) { + updateModel(); + } + } + + private boolean shouldUpdateModelByTest(final RTestUnitTestProxy test) { + // if some suite in statistics is selected + // and test is child of current suite + return isSomeSuiteSelected() && (test.getParent() == myCurrentSuite); + } + + private boolean shouldUpdateModelBySuite(final RTestUnitTestProxy suite) { + // If some suite in statistics is selected + // and suite is current suite in statistics tab or child of current suite + return isSomeSuiteSelected() && (suite == myCurrentSuite || suite.getParent() == myCurrentSuite); + } + + private boolean isSomeSuiteSelected() { + return myCurrentSuite != null; + } + }; + } +} diff --git a/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralToRTestUnitEventsConvertorTest.java b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralToRTestUnitEventsConvertorTest.java index c718cb6ee9..a2a9e3f38b 100644 --- a/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralToRTestUnitEventsConvertorTest.java +++ b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/GeneralToRTestUnitEventsConvertorTest.java @@ -122,7 +122,7 @@ public class GeneralToRTestUnitEventsConvertorTest extends BaseRUnitTestsTestCas onTestStarted("some_test"); final String fullName = myEventsProcessor.getFullTestName("some_test"); final RTestUnitTestProxy proxy = myEventsProcessor.getProxyByFullTestName(fullName); - myEventsProcessor.onTestFinished("some_test"); + myEventsProcessor.onTestFinished("some_test", 10); assertEquals(0, myEventsProcessor.getRunningTestsQuantity()); assertEquals(0, myEventsProcessor.getFailedTestsSet().size()); @@ -167,7 +167,7 @@ public class GeneralToRTestUnitEventsConvertorTest extends BaseRUnitTestsTestCas public void testOnFinishedTesting_WithFailure() { onTestStarted("test"); myEventsProcessor.onTestFailure("test", "", "", false); - myEventsProcessor.onTestFinished("test"); + myEventsProcessor.onTestFinished("test", 10); myEventsProcessor.onFinishTesting(); //Tree @@ -183,7 +183,7 @@ public class GeneralToRTestUnitEventsConvertorTest extends BaseRUnitTestsTestCas public void testOnFinishedTesting_WithError() { onTestStarted("test"); myEventsProcessor.onTestFailure("test", "", "", true); - myEventsProcessor.onTestFinished("test"); + myEventsProcessor.onTestFinished("test", 10); myEventsProcessor.onFinishTesting(); //Tree @@ -228,7 +228,7 @@ public class GeneralToRTestUnitEventsConvertorTest extends BaseRUnitTestsTestCas assertEquals("suite3", test2.getParent().getName()); assertEquals("suite2", test2.getParent().getParent().getName()); - myEventsProcessor.onTestFinished("test2"); + myEventsProcessor.onTestFinished("test2", 10); //check that after finishing suite (suite3), current will be parent of finished suite (i.e. suite2) myEventsProcessor.onSuiteFinished("suite3"); diff --git a/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/MockTestResultsViewer.java b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/MockTestResultsViewer.java index 5830a2d088..924220980e 100644 --- a/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/MockTestResultsViewer.java +++ b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/MockTestResultsViewer.java @@ -22,7 +22,7 @@ public class MockTestResultsViewer implements TestResultsViewer { myRootSuite = suite; } - public void addTab(final String name, final Component contentPane) {} + public void addTab(final String name, final Icon icon, final Component contentPane) {} public void addTestsProxySelectionListener(final TestProxyTreeSelectionListener listener) {} diff --git a/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestsPresentationUtilTest.java b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestsPresentationUtilTest.java index eb1a1022d1..a9553125ec 100644 --- a/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestsPresentationUtilTest.java +++ b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/TestsPresentationUtilTest.java @@ -316,6 +316,106 @@ public class TestsPresentationUtilTest extends BaseRUnitTestsTestCase { } + public void testGetTestStatusPresentation_NotRun() { + assertEquals("Not run", TestsPresentationUtil.getTestStatusPresentation(mySimpleTest)); + } + + public void testGetTestStatusPresentation_Progress() { + mySimpleTest.setStarted(); + assertEquals("Running...", TestsPresentationUtil.getTestStatusPresentation(mySimpleTest)); + } + + public void testGetTestStatusPresentation_Passed() { + mySimpleTest.setStarted(); + mySimpleTest.setFinished(); + assertEquals("Passed", TestsPresentationUtil.getTestStatusPresentation(mySimpleTest)); + } + + public void testGetTestStatusPresentation_Failed() { + mySimpleTest.setStarted(); + mySimpleTest.setTestFailed("", "", false); + assertEquals("Assertion failed", TestsPresentationUtil.getTestStatusPresentation(mySimpleTest)); + mySimpleTest.setFinished(); + assertEquals("Assertion failed", TestsPresentationUtil.getTestStatusPresentation(mySimpleTest)); + } + + public void testGetTestStatusPresentation_TestError() { + mySimpleTest.setStarted(); + mySimpleTest.setTestFailed("", "", true); + assertEquals("Error", TestsPresentationUtil.getTestStatusPresentation(mySimpleTest)); + mySimpleTest.setFinished(); + assertEquals("Error", TestsPresentationUtil.getTestStatusPresentation(mySimpleTest)); + } + + public void testGetTestStatusPresentation_Terminated() { + mySimpleTest.setStarted(); + mySimpleTest.setTerminated(); + assertEquals("Terminated", TestsPresentationUtil.getTestStatusPresentation(mySimpleTest)); + } + + //TODO + //public void testGetSuiteStatusPresentation_NotRun() { + // fail("Not implemented"); + //} + // + //public void testGetSuiteStatusPresentation_Progress() { + // fail("Not implemented"); + //} + // + //public void testGetSuiteStatusPresentation_Passed() { + // fail("Not implemented"); + //} + // + //public void testGetSuiteStatusPresentation_Failed() { + // fail("Not implemented"); + //} + // + //public void testGetSuiteStatusPresentation_TestError() { + // fail("Not implemented"); + //} + // + //public void testGetSuiteStatusPresentation_Terminated() { + // fail("Not implemented"); + //} + + public void testGetDurationPresentation_NotRun() { + assertEquals("", TestsPresentationUtil.getDurationPresentation(mySimpleTest)); + } + + public void testGetDurationPresentation_Progress() { + mySimpleTest.setStarted(); + assertEquals("", TestsPresentationUtil.getDurationPresentation(mySimpleTest)); + } + + public void testGetDurationPresentation_Passed() { + mySimpleTest.setStarted(); + mySimpleTest.setFinished(); + assertEquals("", TestsPresentationUtil.getDurationPresentation(mySimpleTest)); + } + + public void testGetDurationPresentation_Failed() { + mySimpleTest.setStarted(); + mySimpleTest.setTestFailed("", "", false); + assertEquals("", TestsPresentationUtil.getDurationPresentation(mySimpleTest)); + mySimpleTest.setFinished(); + assertEquals("", TestsPresentationUtil.getDurationPresentation(mySimpleTest)); + } + + + public void testGetDurationPresentation_TestError() { + mySimpleTest.setStarted(); + mySimpleTest.setTestFailed("", "", true); + assertEquals("", TestsPresentationUtil.getDurationPresentation(mySimpleTest)); + mySimpleTest.setFinished(); + assertEquals("", TestsPresentationUtil.getDurationPresentation(mySimpleTest)); + } + + public void testGetDurationPresentation_Terminated() { + mySimpleTest.setStarted(); + mySimpleTest.setTerminated(); + assertEquals("", TestsPresentationUtil.getDurationPresentation(mySimpleTest)); + } + private void assertProxyPresentation(final String expectedPresentation, final String parentName, final String childName) { assertEquals(expectedPresentation, diff --git a/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnDurationTest.java b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnDurationTest.java new file mode 100644 index 0000000000..4955573dc1 --- /dev/null +++ b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnDurationTest.java @@ -0,0 +1,50 @@ +package org.jetbrains.plugins.ruby.testing.testunit.runner.ui.statistics; + +import org.jetbrains.plugins.ruby.testing.testunit.runner.BaseRUnitTestsTestCase; + +/** + * @author Roman Chernyatchik + */ +public class ColumnDurationTest extends BaseRUnitTestsTestCase { + private ColumnDuration myColumnDuration; + + @Override + protected void setUp() throws Exception { + super.setUp(); + + myColumnDuration = new ColumnDuration(); + } + + public void testValueOf_NotRun() { + assertEquals("", myColumnDuration.valueOf(mySimpleTest)); + } + + public void testValueOf_InProgress() { + mySimpleTest.setStarted(); + assertEquals("", myColumnDuration.valueOf(mySimpleTest)); + } + + public void testValueOf_TestFailure() { + mySimpleTest.setStarted(); + mySimpleTest.setTestFailed("", "", false); + assertEquals("", myColumnDuration.valueOf(mySimpleTest)); + } + + public void testValueOf_TestPassed() { + mySimpleTest.setStarted(); + mySimpleTest.setFinished(); + assertEquals("", myColumnDuration.valueOf(mySimpleTest)); + } + + public void testValueOf_TestError() { + mySimpleTest.setStarted(); + mySimpleTest.setTestFailed("", "", true); + assertEquals("", myColumnDuration.valueOf(mySimpleTest)); + } + + public void testValueOf_Terminated() { + mySimpleTest.setStarted(); + mySimpleTest.setTerminated(); + assertEquals("", myColumnDuration.valueOf(mySimpleTest)); + } +} diff --git a/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnResultsTests.java b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnResultsTests.java new file mode 100644 index 0000000000..3d6473ba57 --- /dev/null +++ b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnResultsTests.java @@ -0,0 +1,51 @@ +package org.jetbrains.plugins.ruby.testing.testunit.runner.ui.statistics; + +import org.jetbrains.plugins.ruby.testing.testunit.runner.BaseRUnitTestsTestCase; + +/** + * @author Roman Chernyatchik + */ +public class ColumnResultsTests extends BaseRUnitTestsTestCase { + private ColumnResults myColumnResults; + + @Override + protected void setUp() throws Exception { + super.setUp(); + + myColumnResults = new ColumnResults(); + //TODO test cell renderer! + } + + public void testValueOf_TestNotRun() { + assertEquals("Not run", myColumnResults.valueOf(mySimpleTest)); + } + + public void testValueOf_TestInProgress() { + mySimpleTest.setStarted(); + assertEquals("Running...", myColumnResults.valueOf(mySimpleTest)); + } + + public void testValueOf_TestFailure() { + mySimpleTest.setStarted(); + mySimpleTest.setTestFailed("", "", false); + assertEquals("Assertion failed", myColumnResults.valueOf(mySimpleTest)); + } + + public void testValueOf_TestPassed() { + mySimpleTest.setStarted(); + mySimpleTest.setFinished(); + assertEquals("Passed", myColumnResults.valueOf(mySimpleTest)); + } + + public void testValueOf_TestError() { + mySimpleTest.setStarted(); + mySimpleTest.setTestFailed("", "", true); + assertEquals("Error", myColumnResults.valueOf(mySimpleTest)); + } + + public void testValueOf_TestTerminated() { + mySimpleTest.setStarted(); + mySimpleTest.setTerminated(); + assertEquals("Terminated", myColumnResults.valueOf(mySimpleTest)); + } +} diff --git a/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnTestTest.java b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnTestTest.java new file mode 100644 index 0000000000..65a0541183 --- /dev/null +++ b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/ColumnTestTest.java @@ -0,0 +1,46 @@ +package org.jetbrains.plugins.ruby.testing.testunit.runner.ui.statistics; + +import org.jetbrains.plugins.ruby.testing.testunit.runner.BaseRUnitTestsTestCase; +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitTestProxy; + +/** + * @author Roman Chernyatchik + */ +public class ColumnTestTest extends BaseRUnitTestsTestCase { + private ColumnTest myColumnTest; + + @Override + protected void setUp() throws Exception { + super.setUp(); + myColumnTest = new ColumnTest(); + } + + public void testValueOf_Test() { + assertEquals("test", myColumnTest.valueOf(createTestProxy("test"))); + + final RTestUnitTestProxy test = createTestProxy("test of suite", mySuite); + assertEquals("test of suite", myColumnTest.valueOf(test)); + } + + public void testValueOf_TestNameCollapsing() { + assertEquals("test", myColumnTest.valueOf(createTestProxy("test"))); + + final RTestUnitTestProxy suiteProxy = createSuiteProxy("MySuite"); + assertEquals("test of suite", myColumnTest.valueOf(createTestProxy("MySuite.test of suite", suiteProxy))); + assertEquals("test of suite", myColumnTest.valueOf(createTestProxy("MySuite test of suite", suiteProxy))); + assertEquals("Not MySuite test of suite", myColumnTest.valueOf(createTestProxy("Not MySuite test of suite", suiteProxy))); + } + + public void testValueOf_Suite() { + final RTestUnitTestProxy suite = createSuiteProxy("my suite", mySuite); + createTestProxy("test", suite); + assertEquals("my suite", myColumnTest.valueOf(suite)); + } + + public void testValueOf_SuiteNameCollapsing() { + final RTestUnitTestProxy suiteProxy = createSuiteProxy("MySuite"); + assertEquals("child suite", myColumnTest.valueOf(createSuiteProxy("MySuite.child suite", suiteProxy))); + assertEquals("child suite", myColumnTest.valueOf(createSuiteProxy("MySuite child suite", suiteProxy))); + assertEquals("Not MySuite child suite", myColumnTest.valueOf(createSuiteProxy("Not MySuite child suite", suiteProxy))); + } +} diff --git a/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsTableModelTest.java b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsTableModelTest.java new file mode 100644 index 0000000000..094c1a8282 --- /dev/null +++ b/plugins/ruby/testSrc/org/jetbrains/plugins/ruby/testing/testunit/runner/ui/statistics/RTestUnitStatisticsTableModelTest.java @@ -0,0 +1,303 @@ +package org.jetbrains.plugins.ruby.testing.testunit.runner.ui.statistics; + +import com.intellij.execution.Location; +import com.intellij.execution.testframework.AbstractTestProxy; +import com.intellij.execution.testframework.Printer; +import com.intellij.execution.testframework.ui.PrintableTestProxy; +import com.intellij.openapi.project.Project; +import com.intellij.pom.Navigatable; +import org.jetbrains.plugins.ruby.testing.testunit.runner.BaseRUnitTestsTestCase; +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitEventsListener; +import org.jetbrains.plugins.ruby.testing.testunit.runner.RTestUnitTestProxy; +import org.jetbrains.plugins.ruby.testing.testunit.runner.ui.TestProxyTreeSelectionListener; + +import java.util.Collections; +import java.util.List; + +/** + * @author Roman Chernyatchik + */ +public class RTestUnitStatisticsTableModelTest extends BaseRUnitTestsTestCase { + private RTestUnitStatisticsTableModel myStatisticsTableModel; + private TestProxyTreeSelectionListener mySelectionListener; + private RTestUnitEventsListener myTestEventsListener; + private RTestUnitTestProxy myRootSuite; + + @Override + protected void setUp() throws Exception { + super.setUp(); + + myStatisticsTableModel = new RTestUnitStatisticsTableModel(); + mySelectionListener = myStatisticsTableModel.createSelectionListener(); + myTestEventsListener = myStatisticsTableModel.createTestEventsListener(); + + myRootSuite = createSuiteProxy("root"); + } + + public void testOnSelected_UnsupportedType() { + assertEmpty(getItems()); + mySelectionListener.onSelected(new PrintableTestProxy() { + public boolean isRoot() { + return false; + } + + public boolean isInProgress() { + return false; + } + + public boolean isDefect() { + return false; + } + + public boolean shouldRun() { + return false; + } + + public int getMagnitude() { + return 0; + } + + public boolean isLeaf() { + return true; + } + + public String getName() { + return "printable"; + } + + public Location getLocation(final Project project) { + return null; + } + + public Navigatable getDescriptor(final Location location) { + return null; + } + + public AbstractTestProxy getParent() { + return null; + } + + public List getChildren() { + return Collections.emptyList(); + } + + public List getAllTests() { + return Collections.emptyList(); + } + + public void setPrintLinstener(final Printer printer) { + // Do nothing + } + + public void printOn(final Printer printer) { + // Do nothing + } + }); + + assertEmpty(getItems()); + } + + public void testOnSelected_Null() { + mySelectionListener.onSelected(null); + + assertEmpty(getItems()); + } + + public void testOnSelected_Test() { + final RTestUnitTestProxy test1 = createTestProxy("test1", myRootSuite); + final RTestUnitTestProxy test2 = createTestProxy("test2", myRootSuite); + mySelectionListener.onSelected(test1); + + assertSameElements(getItems(), test1, test2); + } + + public void testOnSelected_Suite() { + final RTestUnitTestProxy suite1 = createSuiteProxy("suite1", myRootSuite); + final RTestUnitTestProxy test1 = createTestProxy("test1", suite1); + final RTestUnitTestProxy test2 = createTestProxy("test2", suite1); + + final RTestUnitTestProxy suite2 = createSuiteProxy("suite2", myRootSuite); + + mySelectionListener.onSelected(suite1); + assertSameElements(getItems(), test1, test2); + + mySelectionListener.onSelected(suite2); + assertEmpty(getItems()); + + mySelectionListener.onSelected(myRootSuite); + assertSameElements(getItems(), suite1, suite2); + } + + public void testOnSuiteStarted_NoCurrent() { + mySelectionListener.onSelected(null); + + final RTestUnitTestProxy suite1 = createSuiteProxy("suite1", myRootSuite); + createTestProxy("test1", suite1); + createTestProxy("test2", suite1); + + myTestEventsListener.onSuiteStarted(suite1); + assertEmpty(getItems()); + } + + public void testOnSuiteStarted_Current() { + final RTestUnitTestProxy suite = createSuiteProxy("suite1", myRootSuite); + + mySelectionListener.onSelected(suite); + assertEmpty(getItems()); + + final RTestUnitTestProxy test1 = createTestProxy("test1", suite); + final RTestUnitTestProxy test2 = createTestProxy("test2", suite); + myTestEventsListener.onSuiteStarted(suite); + assertSameElements(getItems(), test1, test2); + } + + public void testOnSuiteStarted_Child() { + final RTestUnitTestProxy suite = createSuiteProxy("suite1", myRootSuite); + + mySelectionListener.onSelected(suite); + assertEmpty(getItems()); + + final RTestUnitTestProxy test1 = createTestProxy("test1", suite); + final RTestUnitTestProxy test2 = createTestProxy("test2", suite); + myTestEventsListener.onSuiteStarted(test1); + assertSameElements(getItems(), test1, test2); + } + + public void testOnSuiteStarted_Other() { + final RTestUnitTestProxy suite = createSuiteProxy("suite1", myRootSuite); + final RTestUnitTestProxy other_suite = createSuiteProxy("other_suite", myRootSuite); + + mySelectionListener.onSelected(suite); + assertEmpty(getItems()); + + createTestProxy("test1", suite); + createTestProxy("test2", suite); + myTestEventsListener.onSuiteStarted(other_suite); + assertEmpty(getItems()); + } + + public void testOnSuiteFinished_NoCurrent() { + mySelectionListener.onSelected(null); + + final RTestUnitTestProxy suite1 = createSuiteProxy("suite1", myRootSuite); + createTestProxy("test1", suite1); + createTestProxy("test2", suite1); + + myTestEventsListener.onSuiteFinished(suite1); + assertEmpty(getItems()); + } + + public void testOnSuiteFinished_Current() { + final RTestUnitTestProxy suite = createSuiteProxy("suite1", myRootSuite); + + mySelectionListener.onSelected(suite); + assertEmpty(getItems()); + + final RTestUnitTestProxy test1 = createTestProxy("test1", suite); + final RTestUnitTestProxy test2 = createTestProxy("test2", suite); + myTestEventsListener.onSuiteFinished(suite); + assertSameElements(getItems(), test1, test2); + } + + public void testOnSuiteFinished_Child() { + final RTestUnitTestProxy suite = createSuiteProxy("suite1", myRootSuite); + + mySelectionListener.onSelected(suite); + assertEmpty(getItems()); + + final RTestUnitTestProxy test1 = createTestProxy("test1", suite); + final RTestUnitTestProxy test2 = createTestProxy("test2", suite); + myTestEventsListener.onSuiteFinished(test1); + assertSameElements(getItems(), test1, test2); + } + + public void testOnSuiteFinished_Other() { + final RTestUnitTestProxy suite = createSuiteProxy("suite1", myRootSuite); + final RTestUnitTestProxy other_suite = createSuiteProxy("other_suite", myRootSuite); + + mySelectionListener.onSelected(suite); + assertEmpty(getItems()); + + createTestProxy("test1", suite); + createTestProxy("test2", suite); + myTestEventsListener.onSuiteFinished(other_suite); + assertEmpty(getItems()); + } + + public void testOnTestStarted_NoCurrent() { + mySelectionListener.onSelected(null); + + final RTestUnitTestProxy suite1 = createSuiteProxy("suite1", myRootSuite); + final RTestUnitTestProxy test1 = createTestProxy("test1", suite1); + createTestProxy("test2", suite1); + + myTestEventsListener.onTestStarted(test1); + assertEmpty(getItems()); + } + + public void testOnTestStarted_Child() { + final RTestUnitTestProxy test1 = createTestProxy("test1", myRootSuite); + + mySelectionListener.onSelected(test1); + assertSameElements(getItems(), test1); + + final RTestUnitTestProxy test2 = createTestProxy("test2", myRootSuite); + myTestEventsListener.onTestStarted(test1); + assertSameElements(getItems(), test1, test2); + } + + public void testOnTestStarted_Other() { + final RTestUnitTestProxy test1 = createTestProxy("test1", myRootSuite); + + final RTestUnitTestProxy suite = createSuiteProxy("suite1", myRootSuite); + final RTestUnitTestProxy other_test = createTestProxy("other_test", suite); + + mySelectionListener.onSelected(test1); + assertSameElements(getItems(), test1, suite); + + createTestProxy("test2", myRootSuite); + myTestEventsListener.onTestStarted(other_test); + assertSameElements(getItems(), test1, suite); + } + + public void testOnTestFinished_NoCurrent() { + mySelectionListener.onSelected(null); + + final RTestUnitTestProxy suite1 = createSuiteProxy("suite1", myRootSuite); + final RTestUnitTestProxy test1 = createTestProxy("test1", suite1); + createTestProxy("test2", suite1); + + myTestEventsListener.onTestFinished(test1); + assertEmpty(getItems()); + + } + + public void testOnTestFinished_Child() { + final RTestUnitTestProxy test1 = createTestProxy("test1", myRootSuite); + + mySelectionListener.onSelected(test1); + assertSameElements(getItems(), test1); + + final RTestUnitTestProxy test2 = createTestProxy("test2", myRootSuite); + myTestEventsListener.onTestFinished(test1); + assertSameElements(getItems(), test1, test2); + } + + public void testOnTestFinished_Other() { + final RTestUnitTestProxy test1 = createTestProxy("test1", myRootSuite); + + final RTestUnitTestProxy suite = createSuiteProxy("suite1", myRootSuite); + final RTestUnitTestProxy other_test = createTestProxy("other_test", suite); + + mySelectionListener.onSelected(test1); + assertSameElements(getItems(), test1, suite); + + createTestProxy("test2", myRootSuite); + myTestEventsListener.onTestFinished(other_test); + assertSameElements(getItems(), test1, suite); + } + + private List getItems() { + return myStatisticsTableModel.getItems(); + } +} -- 2.11.4.GIT