X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse.phpunit/src/net/sourceforge/phpeclipse/phpunit/PHPUnitView.java b/net.sourceforge.phpeclipse.phpunit/src/net/sourceforge/phpeclipse/phpunit/PHPUnitView.java index 6510e34..135cdcd 100644 --- a/net.sourceforge.phpeclipse.phpunit/src/net/sourceforge/phpeclipse/phpunit/PHPUnitView.java +++ b/net.sourceforge.phpeclipse.phpunit/src/net/sourceforge/phpeclipse/phpunit/PHPUnitView.java @@ -1,128 +1,218 @@ +/************************************************************************* + * @author Ali Echihabi (ali_echihabi@ieee.org, ali.echihabi@souss.ca) + * + * Plugin for PHP unit Testing. + * www.phpeclipse.de + * + *************************************************************************/ + package net.sourceforge.phpeclipse.phpunit; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.net.ServerSocket; -import java.net.Socket; +import net.sourceforge.phpeclipse.phpunit.preferences.PHPUnitPreferencePage; +import net.sourceforge.phpeclipse.phpunit.reporthandling.ConnectionListener; +import net.sourceforge.phpeclipse.phpunit.reporthandling.XMLReportHandler; +import net.sourceforge.phpeclipse.phpunit.testpool.TestCase; +import net.sourceforge.phpeclipse.phpunit.testpool.TestPool; +import net.sourceforge.phpeclipse.phpunit.testpool.TestSuite; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.ControlEvent; -import org.eclipse.swt.events.ControlListener; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.widgets.Button; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IToolBarManager; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; +import org.eclipse.swt.widgets.FileDialog; +import org.eclipse.ui.IActionBars; import org.eclipse.ui.part.ViewPart; -/** - * @author Ali Echihabi - * - * To change the template for this generated type comment go to - * Window>Preferences>Java>Code Generation>Code and Comments - */ -/* - * Created on May 22, 2004 - * - * To change the template for this generated file go to - * Window>Preferences>Java>Code Generation>Code and Comments - */ - -/** - * @author Ali Echihabi (ali_echihabi@ieee.org) - * - * Plugin for PHP unit Testing. - * www.phpeclipse.de - * - * This the main view showing the progress and reports. - * - */ - - public class PHPUnitView extends ViewPart { /* - * like J Unit - * a tree. - * The first level nodes are the test suites. - * children are nested test suites. - * leafs: test functions. + * like J Unit a tree. The first level nodes are the test suites. children + * are nested test suites. leafs: test functions. hierarchy: + * package->testsuite1->testcase->test_function */ - - - private int numTests; // total number of tests - private int numTestsRun; // number of tests run so far - private int numFailures; // number of failures so far - private int numErrors; // number of errors so far - private int numPasses; // number of passes so far (they should add up) - - Label labelRuns, labelRunsVal; // Runs: 12 - Label labelErrors, labelErrorsVal; - Label labelFailures, labelFailuresVal; - - Text reportArea; // TODO: replace with Tree display like JUnit - - Button startButton; + + private static PHPUnitView view = null; + + private XMLReportHandler handler; + + private TestPool testPool; + + // private Button startButton; + + private ProgressInfoComposite progressInfoComposite; + + private ResultsInfoComposite resultsInfoComposite; + + // private SettingsInfoComposite settingsInfoComposite; //TODO: move + // somewhere else, launcher, wizard or preferences. + private FileDialog dialog; + + private String testSuiteToRun; + + private Action selectTestAction; + + private Action startTestAction; public PHPUnitView() { - + + if (view == null) + view = this; + } - + + public static PHPUnitView getDefault() { + + return view; + } + public void createPartControl(Composite parent) { - - //viewer = new TreeViewer(parent); - labelRuns = new Label(parent, SWT.WRAP); - labelRuns.setText("Runs: "); - labelRunsVal = new Label(parent, SWT.WRAP); - labelRunsVal.setText("0 / 0"); - - labelFailures = new Label(parent, SWT.WRAP); - labelFailures.setText("Failures: "); - labelFailuresVal = new Label(parent, SWT.WRAP); - labelFailuresVal.setText("0"); - - labelErrors = new Label(parent, SWT.WRAP); - labelErrors.setText("Errors: "); - labelErrorsVal = new Label(parent, SWT.WRAP); - labelErrorsVal.setText("0"); - - reportArea = new Text(parent, SWT.MULTI | SWT.BORDER | - SWT.WRAP | SWT.V_SCROLL | SWT.READ_ONLY); - - startButton = new Button(parent, SWT.CENTER); - startButton.setText("Start Tests"); - startButton.addMouseListener( new MouseListener() { - - public void mouseDoubleClick(MouseEvent arg0) { - // TODO Auto-generated method stub - - } - public void mouseDown(MouseEvent arg0) { - // TODO Auto-generated method stub - startTests(); + // parent.setLayout(new FillLayout(SWT.VERTICAL)); + + dialog = new FileDialog(parent.getShell()); + + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = 1; + + // set title and layout + parent.setLayout(gridLayout); + + // Launch ToolBar: + setActions(); + + // Build the progress info Composites + progressInfoComposite = new ProgressInfoComposite(parent); + progressInfoComposite.setLayoutData(new GridData( + GridData.GRAB_HORIZONTAL | GridData.FILL_HORIZONTAL + | GridData.VERTICAL_ALIGN_BEGINNING)); + + // Build the result info composite + resultsInfoComposite = new ResultsInfoComposite(parent); + resultsInfoComposite.setLayoutData(new GridData(GridData.GRAB_VERTICAL + | GridData.FILL_BOTH)); + + // build the settings composite + // buildSettingsComposite(parent); + + // settingsInfoComposite = new SettingsInfoComposite(parent, SWT.NONE); + + // startButton = new Button(parent, SWT.CENTER); + // startButton.setText("Start Tests"); + // startButton.addMouseListener(new MouseListener() { + // + // public void mouseDoubleClick(MouseEvent arg0) { + // + // } + // + // public void mouseDown(MouseEvent arg0) { + // + // try { + // String testFile = settingsInfoComposite.getTestSuite(); + // startTests(testFile); + // } catch (IOException e) { + // // TODO Auto-generated catch block + // e.printStackTrace(); + // } + // + // + // } + // + // public void mouseUp(MouseEvent arg0) { + // + // + // } + // + // }); // end add action listener. + + } + + /** + * @param parent + */ +// private void buildSettingsComposite(Composite parent) { +// +// // settingsInfoComposite = new Group(parent, SWT.NONE); +// // settingsInfoComposite.setText("Settings"); +// // settingsInfoComposite.setLayout(new GridLayout(2,false)); +// // +// // +// // //the test suite to launch +// // Label testSuiteLabel = new Label(settingsInfoComposite, SWT.NONE); +// // testSuiteLabel.setText("Test suite to run:"); +// // //testSuiteLabel.setLayoutData(new GridData()) +// // Text testSuiteText = new Text(settingsInfoComposite, SWT.NONE); +// // +// // //the path to php +// // Label phpPathLabel = new Label(settingsInfoComposite, SWT.NONE); +// // phpPathLabel.setText("php Path:"); +// // //testSuiteLabel.setLayoutData(new GridData()) +// // Text phpPathText = new Text(settingsInfoComposite, SWT.NONE); +// +// } + + private void setActions() { + + final IActionBars actionBars = getViewSite().getActionBars(); + IToolBarManager toolBarManager = actionBars.getToolBarManager(); + + selectTestAction = new Action() { + + public void run() { + + testSuiteToRun = dialog.open(); + startTestAction.setEnabled(true); } + }; + + selectTestAction.setText("Select Test Suite"); + selectTestAction.setToolTipText("Select Test Suite"); + selectTestAction + .setImageDescriptor(PHPUnitImages.DESC_SELECT_TEST_SUITE); + + toolBarManager.add(selectTestAction); + + startTestAction = new Action() { + + public void run() { + + try { + if (testSuiteToRun == null || testSuiteToRun == "") + return; + + startTests(testSuiteToRun); + // setEnabled(false); + + } catch (IOException e) { + + e.printStackTrace(); + } - public void mouseUp(MouseEvent arg0) { - // TODO Auto-generated method stub - } + }; + + startTestAction.setText("Start Test"); + startTestAction + .setToolTipText("Start Test Suite. Select a Test Suite first."); + startTestAction.setImageDescriptor(PHPUnitImages.DESC_RUN_TEST_SUITE); + startTestAction.setEnabled(false); - - - }); // end add action listener. - - // TODO layout! + toolBarManager.add(startTestAction); } - /* (non-Javadoc) + /* + * (non-Javadoc) + * * @see org.eclipse.ui.IWorkbenchPart#setFocus() */ public void setFocus() { - //markTestPass("hello"); + } /** @@ -130,86 +220,210 @@ public class PHPUnitView extends ViewPart { * * @param testID */ - private void markTestPass(String testID) { - + private void markTestPassed(String testID) { + // testid, use it in hashmap to retrieve tree item of test and // change icon color, increment pass counter, etc... - - - //for now: - reportArea.append("test passed"); + + testPool.getTest(testID).setVerdict(TestCase.PASS); + } - - - - // action to start tests: - private void startTests() { - - // preparation: - // take the full test suite (could containt other test suites). - // create temp php file that starts that suite and uses socketTestReport - // as a test result reporter. - // add listener: localhost , port 13579 - // start listening at port. - - reportArea.append("Tests started \n"); - listenForReports(); - - - + private void markTestFail(String testID) { + + testPool.getTest(testID).setVerdict(TestCase.FAIL); + } - - private void listenForReports() { - - ServerSocket sSocket = null; - Socket serviceSocket = null; - + + public void startTests(String testSuite) throws IOException { + + // testSuite: the name of the file containing the suite we want to run. + // we will put that test suite inside a contained that uses our + // SocketResult. + + // reset from previous run + reset(); + + testSuite = testSuite.replaceAll("\\\\", "/"); + + System.out.println("new: " + testSuite); + + // where the plugin's temp files should go + String tempFolder = "C:\\tmp"; + String tempFileName = "temTest.php"; + + // create the file. + File testFile = new File(tempFolder + "/" + tempFileName); + BufferedWriter out = new BufferedWriter(new FileWriter(testFile)); + + out.write("addTest(new TestSuite(\"" + testSuiteName + "\"));" + + "\n"); + + out.write("$result = new SocketTestResult();" + "\n"); + out.write("$suite->run($result);" + "\n"); + out.write("$result->report(); " + "\n"); + + out.write("" + "\n"); + out.write("" + "\n"); + + out.write("$output = ob_get_contents();" + "\n"); + out.write("$fileHandle = fopen('c:/tmp/phpOut.txt');" + "\n"); + out.write("fclose($fileHandle);" + "\n"); + + out.write("ob_end();" + "\n"); + out.write("?>" + "\n"); + + out.flush(); + out.close(); + + listenForReports(); + try { - - reportArea.append("listening at port 12345"); - - sSocket = new ServerSocket(12345); - - // accept connection from test reporter. - serviceSocket = sSocket.accept(); - - - InputStreamReader reader = new InputStreamReader(serviceSocket.getInputStream()); - BufferedReader in = new BufferedReader(reader); - String report = null; - - // keep listening until the - while ( (report = in.readLine()) != null && (report != "end_all_tests") ) { - - handleReport(report); - } - - reportArea.append("Finished!"); - - sSocket.close(); - serviceSocket.close(); - + Runtime.getRuntime().exec( + "php.exe " + tempFolder + "/" + tempFileName); } catch (Exception e) { - + e.printStackTrace(); - - } - - - - + } + + // testFile.delete(); + + } + + /** + * + */ + private void reset() { + + handler = new XMLReportHandler(); + testPool = new TestPool("Ali Baba"); + + progressInfoComposite.resetInfo(); + resultsInfoComposite.resetInfo(); + } - + + /** + * + */ + private void listenForReports() { + + ConnectionListener conListener = new ConnectionListener(); + conListener.start(this); + + } // end of method + /** * handle this report: test passed, faile, end of all. + * * @param report */ - private void handleReport(String report) { - - reportArea.append("msg: " + report + "\n"); - + public void handleReport(String report) { + + // delegate to the XML report handler. + handler.handle(report, this); + + } + + /** + * @param command + * @param testCount + * @param testID + */ + public void handleCommand(String command, String[] args) { + + if (command.equals("startAll")) { + + // markTestingStarted(new Integer(testCount).intValue()); + + } else if (command.equals("testSuiteStarted")) { + + String testID = args[0]; + String testCount = args[1]; + + // createNewTestSuite("TestSuiteName: " + testID, testID, new + // Integer(testCount).intValue()); + TestSuite suite = new TestSuite(null, "TestSuiteName: " + testID, + testID, new Integer(testCount).intValue()); + testPool.addTestSuite(suite); + + } else if (command.equals("testStarted")) { + + String testID = args[0]; + String testCount = args[1]; + String testName = args[2]; + String parentTestSuiteName = args[3]; + + testPool + .addTest(new TestCase(testID, testName, parentTestSuiteName)); + + } else if (command.equals("testFINISHED")) { + + } else if (command.equals("endAll")) { + + } + + update(); + + } + + /** + * + */ + private void update() { + + // progressInfoComposite.updateInfo(numTests, testPool.getNumTestsRun(), + // numFailures, numErrors); + progressInfoComposite.updateInfo(testPool); + resultsInfoComposite.updateInfo(testPool); + + } + + /** + * @param currentTestID + * @param verdict + */ + public void setTestVerdict(String currentTestID, String verdict) { + + if (verdict.equals("passed")) + markTestPassed(currentTestID); + else + markTestFail(currentTestID); + + } + + /** + * @param currentTestID + * @param exception + */ + public void addTestException(String currentTestID, String exception) { + + // TODO: decide how to show exceptions. don't show them for now. + // reportArea.append(" test " + currentTestID + " exception: " + + // exception + "\n"); + } - -} +} // end of class