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);
}
}