/** * 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.codecoverage; import junit.framework.Test; import junit.framework.TestSuite; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.TreeViewer; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Event; import org.eclipse.ui.IWorkbench; import org.python.pydev.core.TestCaseUtils; import org.python.pydev.core.docutils.StringUtils; import org.python.pydev.debug.ui.launching.LaunchShortcut; import org.python.pydev.editor.PyEdit; import org.python.pydev.editor.codecompletion.revisited.javaintegration.AbstractWorkbenchTestCase; import org.python.pydev.editorinput.PyOpenEditor; import org.python.pydev.plugin.PydevPlugin; import org.python.pydev.plugin.nature.PythonNature; import com.aptana.shared_core.callbacks.ICallback; public class PyCodeCoverageTestWorkbench extends AbstractWorkbenchTestCase { public static Test suite() { TestSuite suite = new TestSuite(PyCodeCoverageTestWorkbench.class.getName()); suite.addTestSuite(PyCodeCoverageTestWorkbench.class); if (suite.countTestCases() == 0) { throw new Error("There are no test cases to run"); } else { return suite; } } private IFolder sourceFolder; private IFile modCov; /* (non-Javadoc) * @see org.python.pydev.editor.codecompletion.revisited.javaintegration.AbstractWorkbenchTestCase#setUp() */ @Override protected void setUp() throws Exception { closeWelcomeView(); configureInterpreters(); IProgressMonitor monitor = new NullProgressMonitor(); IProject project = createProject(monitor, "coverage_test_project"); sourceFolder = createSourceFolder(monitor, project, true, false); IFile initFile = createPackageStructure(sourceFolder, "pack_cov", monitor); modCov = initFile.getParent().getFile(new Path("mod_cov.py")); setFileContents(modCov, getModCovContents()); PythonNature nature = PythonNature.getPythonNature(project); waitForNatureToBeRecreated(nature); } /** * @return */ private String getModCovContents() { return "" + "import unittest\n" + "\n" + "class TestCase(unittest.TestCase):\n" + " \n" + " def testCovered1(self):\n" + " print('t1')\n" + " print('t2')\n" + " print('t3')\n" + " \n" + " def testCovered2(self):\n" + " print('t1')\n" + " print('t2')\n" + " print('t3')\n" + " \n" + " def testNotCovered(self):\n" + " if False:\n" + " print('t1')\n" + " print('t2')\n" + " print('t3')\n" + " \n" + "if __name__ == '__main__':\n" + " unittest.main()\n" + ""; } public void testPyCodeCoverageView() throws Exception { final PyCodeCoverageView view = PyCodeCoverageView.getView(true); //At this point it should have no folder selected and the option to run things in coverage should be //set to false. assertTrue(!PyCoveragePreferences.getAllRunsDoCoverage()); assertTrue(PyCodeCoverageView.getChosenDir() == null); assertTrue(!view.allRunsGoThroughCoverage.getSelection()); assertTrue(!PyCoveragePreferences.getInternalAllRunsDoCoverage()); view.allRunsGoThroughCoverage.setSelection(true); view.allRunsGoThroughCoverage.notifyListeners(SWT.Selection, new Event()); assertTrue(PyCoveragePreferences.getInternalAllRunsDoCoverage()); assertTrue(!PyCoveragePreferences.getAllRunsDoCoverage()); view.setSelectedContainer(sourceFolder); TreeViewer treeViewer = view.getTreeViewer(); ITreeContentProvider cp = (ITreeContentProvider) treeViewer.getContentProvider(); Object[] elements = cp.getElements(treeViewer.getInput()); assertEquals(1, elements.length); ILabelProvider labelProvider = (ILabelProvider) treeViewer.getLabelProvider(); assertEquals("pack_cov", labelProvider.getText(elements[0])); TestCaseUtils.assertContentsEqual(getInitialCoverageText(), view.getCoverageText()); Object[] expandedElements = treeViewer.getExpandedElements(); assertEquals(0, expandedElements.length); treeViewer.expandAll(); expandedElements = treeViewer.getExpandedElements(); assertEquals(1, expandedElements.length); view.executeRefreshAction(new NullProgressMonitor()); expandedElements = treeViewer.getExpandedElements(); assertEquals(1, expandedElements.length); assertTrue(PyCoveragePreferences.getAllRunsDoCoverage()); final IWorkbench workBench = PydevPlugin.getDefault().getWorkbench(); Display display = workBench.getDisplay(); // Make sure to run the UI thread. final PyEdit modCovEditor = (PyEdit) PyOpenEditor.doOpenEditor(modCov); try { display.syncExec(new Runnable() { public void run() { LaunchShortcut launchShortcut = new LaunchShortcut(); launchShortcut.launch(modCovEditor, "run"); } }); final String modCovCoverageText = StringUtils.replaceNewLines(getModCovCoverageText(), "\n"); //Should be enough time for the refresh to happen! goToManual(10000, new ICallback<Boolean, Object>() { public Boolean call(Object arg) { return modCovCoverageText.equals(StringUtils.replaceNewLines(view.getCoverageText(), "\n")); } }); TestCaseUtils.assertContentsEqual(modCovCoverageText, view.getCoverageText()); //goToManual(); } finally { try { modCovEditor.close(false); } catch (Exception e) { //ignore anything here } } } private String getModCovCoverageText() { return "" + "Name Stmts Miss Cover Missing\n" + "-----------------------------------------------------------------------------\n" + "__init__.py 0 0 - \n" + "mod_cov.py 17 3 82,4% 17-19\n" + "-----------------------------------------------------------------------------\n" + "TOTAL 17 3 82,4% \n" + ""; } private String getInitialCoverageText() { return "" + "Name Stmts Miss Cover Missing\n" + "-----------------------------------------------------------------------------\n" + "__init__.py 0 0 - \n" + "mod_cov.py 17 17 0% 1-22\n" + "-----------------------------------------------------------------------------\n" + "TOTAL 17 17 0% \n" + ""; } }