/* Copyright (C) 2009 Mobile Sorcery AB This program is free software; you can redistribute it and/or modify it under the terms of the Eclipse Public License v1.0. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Eclipse Public License v1.0 for more details. You should have received a copy of the Eclipse Public License v1.0 along with this program. It is also available at http://www.eclipse.org/legal/epl-v10.html */ package com.mobilesorcery.sdk.testing.internal.ui; import org.eclipse.jdt.internal.junit.ui.CounterPanel; import org.eclipse.jdt.internal.junit.ui.JUnitProgressBar; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ISelectionProvider; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TableViewer; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import com.mobilesorcery.sdk.testing.ITest; import com.mobilesorcery.sdk.testing.ITestSession; import com.mobilesorcery.sdk.testing.ITestSessionListener; import com.mobilesorcery.sdk.testing.ITestSuite; import com.mobilesorcery.sdk.testing.TestManager; import com.mobilesorcery.sdk.testing.TestResult; import com.mobilesorcery.sdk.testing.TestSessionEvent; public class TestRunComposite extends Composite implements ITestSessionListener { private TreeViewer testLog; private TableViewer failureDetails; private TestSessionLabelProvider testSessionsLabelProvider; private CounterPanel counter; private JUnitProgressBar progress; private ITestSession currentTestSession; private FailureDetailsContentProvider failureDetailsContentProvider; public TestRunComposite(Composite parent, int style) { super(parent, style); init(); TestManager.getInstance().addSessionListener(this); addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { TestManager.getInstance().removeSessionListener( TestRunComposite.this); } }); } private void init() { setLayout(new GridLayout(1, false)); counter = new CounterPanel(this); counter.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); progress = new JUnitProgressBar(this); progress.setLayoutData(new GridData(GridData.FILL_HORIZONTAL)); testLog = new TreeViewer(this, SWT.BORDER | SWT.SINGLE); testLog.setContentProvider(new TestSessionContentProvider()); testSessionsLabelProvider = new TestSessionLabelProvider(); testLog.setLabelProvider(testSessionsLabelProvider); testLog.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); failureDetails = new TableViewer(this, SWT.BORDER | SWT.SINGLE); failureDetailsContentProvider = new FailureDetailsContentProvider(); failureDetails.setContentProvider(failureDetailsContentProvider); failureDetails.setLabelProvider(new FailureDetailsLabelProvider()); failureDetails.getControl().setLayoutData(new GridData(GridData.FILL_BOTH)); testLog.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { IStructuredSelection selection = (IStructuredSelection) event.getSelection(); Object selectedTest = selection.getFirstElement(); failureDetails.setInput(selectedTest == null ? FailureDetailsContentProvider.EMPTY : selectedTest); } }); } public void handleEvent(final TestSessionEvent event) { getDisplay().asyncExec(new Runnable() { public void run() { handleEventUI(event); } }); } public void setCurrentTestSession(final ITestSession session) { this.currentTestSession = session; getDisplay().asyncExec(new Runnable() { public void run() { resetTestLog(session); } }); } protected void handleEventUI(final TestSessionEvent event) { ITestSession session = event.session; if (this.currentTestSession == session) { switch (event.type) { case TestSessionEvent.SESSION_STARTED: resetTestLog(event.session); case TestSessionEvent.TEST_DEFINED: case TestSessionEvent.TEST_FINISHED: case TestSessionEvent.TEST_FAILED: case TestSessionEvent.SESSION_FINISHED: ITestSuite suite = event.test.getParentSuite(); updateTree(session); /*if (suite != null) { updateTree(suite); } else { updateTree(event.test); }*/ updateCounter(session); break; default: // Do nothing. } updateTree(event.test); } } private void updateTree(ITest test) { testLog.refresh(test, true); } private void updateCounter(ITestSession session) { int testCount = session.getTestCount(true); TestResult testResult = session.getTestResult(); counter.setTotal(testCount); int runValue = testResult.didTestExecutionFail() ? testCount : testResult.countRunTests(); counter.setRunValue(runValue, 0); progress.setMaximum(testCount); progress.reset(testResult.countFailedTests() > 0, session.getState() == ITestSession.STOPPED, runValue, testCount); } protected void resetTestLog(ITestSession session) { this.currentTestSession = session; testSessionsLabelProvider.setTestSession(session); failureDetailsContentProvider.setTestSession(session); if (session != null) { testLog.setInput(session); failureDetails.setInput(session); updateCounter(session); } } public ISelectionProvider getSelectionProvider() { return testLog; } public ITestSession getTestSession() { return currentTestSession; } public void expandAll() { testLog.expandAll(); } public TreeViewer getTreeViewer() { return testLog; } }