/** * Copyright (c) 2005-2011 by Appcelerator, Inc. All Rights Reserved. * Licensed under the terms of the Eclipse Public License (EPL). * Please see the license.txt included with this distribution for details. * Any modifications to this file must keep this entire header intact. */ package org.python.pydev.debug.pyunit; import java.util.ArrayList; import java.util.List; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.runtime.Assert; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunch; import org.eclipse.debug.core.ILaunchListener; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.jface.action.IAction; import org.eclipse.swt.widgets.Tree; import org.python.pydev.debug.pyunit.HistoryAction.HistoryMenuCreator; import org.python.pydev.debug.pyunit.HistoryAction.IActionsMenu; import org.python.pydev.debug.ui.launching.UnitTestLaunchShortcut; import org.python.pydev.editor.codecompletion.revisited.javaintegration.AbstractWorkbenchTestCase; import com.aptana.shared_core.callbacks.ICallback; /** * This test uses actual launches! */ public class PyUnitView2TestTestWorkbench extends AbstractWorkbenchTestCase implements ILaunchListener { public static Test suite() { TestSuite suite = new TestSuite(PyUnitView2TestTestWorkbench.class.getName()); suite.addTestSuite(PyUnitView2TestTestWorkbench.class); if (suite.countTestCases() == 0) { throw new Error("There are no test cases to run"); } else { return suite; } } private ILaunch launchAdded; private List<ILaunch> launchesRemoved = new ArrayList<ILaunch>(); protected void setUp() throws Exception { //no need for default setup closeWelcomeView(); super.setUp(); String testCaseContents = "" + "import unittest\n" + "\n" + "class TestCase(unittest.TestCase):\n" + " \n" + " def testMet1(self):\n" + " print 'ok'\n" + "\n" + " def testMet2(self):\n" + " self.fail('failed')\n" + " \n" + " def testMet2__todo(self):\n" + " raise RuntimeError('error')\n" + " \n" + ""; setFileContents(testCaseContents); } public void testPyUnitView2() throws Exception { ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager(); launchManager.addLaunchListener(this); UnitTestLaunchShortcut unitTestLaunchShortcut = new UnitTestLaunchShortcut(); unitTestLaunchShortcut.launch(editor, "run"); //1 minute for the launch to complete should be enough goToManual(60 * 1000, new ICallback<Boolean, Object>() { public Boolean call(Object arg) { PyUnitView view = PyUnitView.getView(); PyUnitTestRun currentTestRun = view.getCurrentTestRun(); if (currentTestRun == null) { return false; } return launchesRemoved.size() == 1; } }); PyUnitView view = PyUnitView.getView(); ShowOnlyFailuresAction action = (ShowOnlyFailuresAction) getPyUnitViewAction(view, ShowOnlyFailuresAction.class); action.setChecked(false);//clicking it should do this. action.run(); assertTrue(!action.isChecked()); //note that only 3 methods appear in the tree because we've selected to show all methods (not only errors/failures) ICallback<Boolean, Object> callback = getPyUnitViewOkCallback(0, 3); goToManual(15 * 1000, callback); assertTrue(callback.call(THROW_ERROR)); executePyUnitViewAction(PyUnitView.getView(), RelaunchAction.class); callback = getPyUnitViewOkCallback(1, 3); goToManual(15 * 1000, callback); assertTrue(callback.call(THROW_ERROR)); executePyUnitViewAction(PyUnitView.getView(), RelaunchErrorsAction.class); action = (ShowOnlyFailuresAction) getPyUnitViewAction(view, ShowOnlyFailuresAction.class); action.setChecked(true);//clicking it should do this. action.run(); assertTrue(action.isChecked()); //note that only 2 methods appear in the tree because we've selected to show only errors/failures callback = getPyUnitViewOkCallback(2, 2); goToManual(15 * 1000, callback); assertTrue(callback.call(THROW_ERROR)); } private static final String THROW_ERROR = "THROW_ERROR"; private ICallback<Boolean, Object> getPyUnitViewOkCallback(final int historySize, final int methodsAppearingInTree) { return new ICallback<Boolean, Object>() { public Boolean call(Object arg) { PyUnitView view = PyUnitView.getView(); PyUnitTestRun currentTestRun = view.getCurrentTestRun(); if (currentTestRun == null) { if (arg == THROW_ERROR) { throw new AssertionError("currentTestRun == null"); } return false; } if (!currentTestRun.getFinished()) { if (arg == THROW_ERROR) { throw new AssertionError("!currentTestRun.getFinished()"); } return false; } Tree tree = view.getTree(); if (tree.getItemCount() != methodsAppearingInTree) { if (arg == THROW_ERROR) { throw new AssertionError("tree.getItemCount() " + tree.getItemCount() + "!= methodsRun " + methodsAppearingInTree); } return false; } CounterPanel counterPanel = view.getCounterPanel(); if (!counterPanel.fNumberOfErrors.getText().equals("1")) { if (arg == THROW_ERROR) { throw new AssertionError("!counterPanel.fNumberOfErrors.getText().equals(\"1\")"); } return false; } if (!counterPanel.fNumberOfFailures.getText().equals("1")) { if (arg == THROW_ERROR) { throw new AssertionError("!counterPanel.fNumberOfFailures.getText().equals(\"1\")"); } return false; } HistoryAction historyAction = (HistoryAction) getPyUnitViewAction(view, HistoryAction.class); HistoryAction.HistoryMenuCreator menuCreator = (HistoryMenuCreator) historyAction.getMenuCreator(); final List<SetCurrentRunAction> actions = new ArrayList<SetCurrentRunAction>(); final List<ClearTerminatedAction> terminatedActions = new ArrayList<ClearTerminatedAction>(); IActionsMenu actionsMenu = new IActionsMenu() { public void add(IAction action) { if (action instanceof SetCurrentRunAction) { actions.add((SetCurrentRunAction) action); } else if (action instanceof ClearTerminatedAction) { terminatedActions.add((ClearTerminatedAction) action); } } }; menuCreator.fillMenuManager(actionsMenu); if (historySize + 1 != actions.size()) { //+1 to count for the current! if (arg == THROW_ERROR) { throw new AssertionError("historySize + 1 != actions.size()"); } return false; } return true; } }; } public void launchRemoved(ILaunch launch) { Assert.isTrue(this.launchAdded == launch); this.launchesRemoved.add(launch); this.launchAdded = null; } public void launchAdded(ILaunch launch) { Assert.isTrue(this.launchAdded == null); this.launchAdded = launch; } public void launchChanged(ILaunch launch) { } }