package jetbrains.mps.baseLanguage.unitTest.execution.tool; /*Generated by MPS */ import javax.swing.table.TableModel; import java.util.List; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import javax.swing.event.TableModelListener; import jetbrains.mps.baseLanguage.unitTest.execution.client.TestRunState; import jetbrains.mps.smodel.ModelAccess; import jetbrains.mps.baseLanguage.unitTest.execution.client.TestStateListener; import jetbrains.mps.baseLanguage.unitTest.execution.TestEvent; import org.jetbrains.annotations.Nullable; import java.util.Map; import jetbrains.mps.baseLanguage.unitTest.execution.client.ITestNodeWrapper; import jetbrains.mps.internal.collections.runtime.SetSequence; import jetbrains.mps.internal.collections.runtime.MapSequence; import com.intellij.openapi.application.ApplicationManager; import javax.swing.event.TableModelEvent; import jetbrains.mps.internal.collections.runtime.IWhereFilter; public class StatisticsTableModel implements TableModel { private static final List<String> TEST_COLUMNS = ListSequence.fromListAndArray(new ArrayList<String>(), "Test", "Time elapsed", "Usage Delta", "Usage Before", "Usage After", "Results"); private final List<TableModelListener> myListeners = ListSequence.fromList(new ArrayList<TableModelListener>()); private List<TestStatisticsRow> myRows; private List<TestStatisticsRow> myFilteredRows = ListSequence.fromList(new ArrayList<TestStatisticsRow>()); protected String myFilterTestCase = null; protected String myFilterTestMethod = null; private final TestNameMap<TestCaseRow, TestMethodRow> myMap = new TestNameMap<TestCaseRow, TestMethodRow>(); private final TestRunState myState; public StatisticsTableModel(final TestRunState state) { myState = state; ModelAccess.instance().runReadAction(new Runnable() { public void run() { setTests(state.getTestsMap()); } }); myState.addListener(new TestStateListener() { @Override public void onTestStart(TestEvent event) { TestMethodRow row = findRowForEvent(event); if (row != null) { row.setStartTime(event.getTime()); row.setUsageBefore(event.getMemoryUsage()); fireTableChanged(); } } @Nullable private TestMethodRow findRowForEvent(TestEvent event) { return getRow(event.getTestCaseName(), event.getTestMethodName()); } @Override public void onTestFinish(TestEvent event) { TestMethodRow row = findRowForEvent(event); if (row != null) { row.setFinishTime(event.getTime()); row.setUsageAfter(event.getMemoryUsage()); if (row.getFailed() == 0 && row.getErrored() == 0) { row.setSucceed(); } fireTableChanged(); } } @Override public void onTestFailure(TestEvent event) { TestMethodRow row = findRowForEvent(event); if (row != null) { row.setErrored(); fireTableChanged(); } } @Override public void onTestAssumptionFailure(TestEvent event) { TestMethodRow row = findRowForEvent(event); if (row != null) { row.setFailed(); fireTableChanged(); } } @Override public void onLooseTest(String className, String methodName) { TestMethodRow row = getRow(className, methodName); if (row != null) { row.setErrored(); fireTableChanged(); } } }); } private void setTests(Map<ITestNodeWrapper, List<ITestNodeWrapper>> tests) { myRows = ListSequence.fromList(new ArrayList<TestStatisticsRow>()); TotalRow totalRow = new TotalRow(); ListSequence.fromList(myRows).addElement(totalRow); myMap.clear(); for (ITestNodeWrapper testCase : SetSequence.fromSet(MapSequence.fromMap(tests).keySet())) { TestCaseRow testCaseRow = new TestCaseRow(testCase); totalRow.addRow(testCaseRow); ListSequence.fromList(myRows).addElement(testCaseRow); myMap.put(testCase, testCaseRow); for (ITestNodeWrapper testMethod : ListSequence.fromList(MapSequence.fromMap(tests).get(testCase))) { TestMethodRow testMethodRow = new TestMethodRow(testMethod); testCaseRow.addRow(testMethodRow); ListSequence.fromList(myRows).addElement(testMethodRow); myMap.put(testCase, testMethod, testMethodRow); } } filter(); } public TestMethodRow getRow(String testCase, String testMethod) { return myMap.get(testCase, testMethod); } private void fireTableChanged() { ApplicationManager.getApplication().invokeLater(new Runnable() { @Override public void run() { for (TableModelListener listener : ListSequence.fromList(myListeners)) { listener.tableChanged(new TableModelEvent(StatisticsTableModel.this)); } } }); } @Override public int getRowCount() { return ListSequence.fromList(myFilteredRows).count(); } @Override public Object getValueAt(int rowIndex, int columnIndex) { return ListSequence.fromList(myFilteredRows).getElement(rowIndex); } public void setFilter(String testCase, String testMethod) { myFilterTestCase = testCase; myFilterTestMethod = testMethod; filter(); } private void filter() { myFilteredRows = ListSequence.fromList(myRows).where(new IWhereFilter<TestStatisticsRow>() { public boolean accept(TestStatisticsRow it) { return it.matches(myFilterTestCase, myFilterTestMethod); } }).toListSequence(); fireTableChanged(); } @Override public int getColumnCount() { return ListSequence.fromList(TEST_COLUMNS).count(); } @Override public String getColumnName(int columnIndex) { return ListSequence.fromList(TEST_COLUMNS).getElement(columnIndex); } @Override public Class<?> getColumnClass(int columnIndex) { return TestStatisticsRow.class; } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return false; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { } @Override public void addTableModelListener(TableModelListener listener) { ListSequence.fromList(myListeners).addElement(listener); } @Override public void removeTableModelListener(TableModelListener listener) { ListSequence.fromList(myListeners).removeElement(listener); } }