home *** CD-ROM | disk | FTP | other *** search
- <?php
- /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
-
- /**
- * PHP Version 4
- *
- * Copyright (c) 2002-2005, Sebastian Bergmann <sb@sebastian-bergmann.de>.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- *
- * * Neither the name of Sebastian Bergmann nor the names of his
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRIC
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- *
- * @category Testing
- * @package PHPUnit
- * @author Wolfram Kriesing <wolfram@kriesing.de>
- * @copyright 2002-2005 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- * @version CVS: $Id: HTML.php,v 1.19 2005/11/10 09:47:15 sebastian Exp $
- * @link http://pear.php.net/package/PHPUnit
- * @since File available since Release 1.0.0
- */
-
- /**
- * HTML GUI.
- *
- * @category Testing
- * @package PHPUnit
- * @author Wolfram Kriesing <wolfram@kriesing.de>
- * @copyright 2002-2005 Sebastian Bergmann <sb@sebastian-bergmann.de>
- * @license http://www.opensource.org/licenses/bsd-license.php BSD License
- * @version Release: 1.3.2
- * @link http://pear.php.net/package/PHPUnit
- * @since Class available since Release 1.0.0
- */
- class PHPUnit_GUI_HTML
- {
- var $_suites = array();
-
- /**
- * the current implementation of PHPUnit is designed
- * this way that adding a suite to another suite only
- * grabs all the tests and adds them to the suite, so you
- * have no chance to find out which test goes with which suite
- * therefore you can simply pass an array of suites to this constructor here
- *
- * @param array The suites to be tested. If not given, then you might
- * be using the SetupDecorator, which detects them automatically
- * when calling getSuitesFromDir()
- */
- function PHPUnit_GUI_HTML($suites = array())
- {
- if (!is_array($suites)) {
- $this->_suites = array($suites);
- } else {
- $this->_suites = $suites;
- }
- }
-
- /**
- * Add suites to the GUI
- *
- * @param object this should be an instance of PHPUnit_TestSuite
- */
- function addSuites($suites)
- {
- $this->_suites = array_merge($this->_suites,$suites);
- }
-
- /**
- * this prints the HTML code straight out
- *
- */
- function show()
- {
- $request = $_REQUEST;
- $showPassed = FALSE;
- $submitted = @$request['submitted'];
-
- if ($submitted) {
- $showPassed = @$request['showOK'] ? TRUE : FALSE;
- }
-
- $suiteResults = array();
-
- foreach ($this->_suites as $aSuite) {
- $aSuiteResult = array();
-
- // remove the first directory's name from the test-suite name, since it
- // mostly is something like 'tests' or alike
- $removablePrefix = explode('_',$aSuite->getName());
- $aSuiteResult['name'] = str_replace($removablePrefix[0].'_', '', $aSuite->getName());
-
- if ($submitted && isset($request[$aSuiteResult['name']])) {
- $result = PHPUnit::run($aSuite);
-
- $aSuiteResult['counts']['run'] = $result->runCount();
- $aSuiteResult['counts']['error'] = $result->errorCount();
- $aSuiteResult['counts']['failure'] = $result->failureCount();
-
- $aSuiteResult['results'] = $this->_prepareResult($result,$showPassed);
-
- $per = 100/$result->runCount();
- $failed = ($per*$result->errorCount())+($per*$result->failureCount());
- $aSuiteResult['percent'] = round(100-$failed,2);
- } else {
- $aSuiteResult['addInfo'] = 'NOT EXECUTED';
- }
-
- $suiteResults[] = $aSuiteResult;
- }
-
- $final['name'] = 'OVERALL RESULT';
- $final['counts'] = array();
- $final['percent'] = 0;
- $numExecutedTests = 0;
-
- foreach ($suiteResults as $aSuiteResult) {
- if (sizeof(@$aSuiteResult['counts'])) {
- foreach ($aSuiteResult['counts'] as $key=>$aCount) {
- if (!isset($final['counts'][$key])) {
- $final['counts'][$key] = 0;
- }
-
- $final['counts'][$key] += $aCount;
- }
- }
- }
-
- if (isset($final['counts']['run'])) {
- $per = 100/$final['counts']['run'];
- $failed = ($per*$final['counts']['error'])+($per*$final['counts']['failure']);
- $final['percent'] = round(100-$failed,2);
- } else {
- $final['percent'] = 0;
- }
-
- array_unshift($suiteResults,$final);
-
- include 'PHPUnit/GUI/HTML.tpl';
- }
-
- function _prepareResult($result,$showPassed)
- {
- $ret = array();
- $failures = $result->failures();
-
- foreach($failures as $aFailure) {
- $ret['failures'][] = $this->_prepareFailure($aFailure);
- }
-
- $errors = $result->errors();
-
- foreach($errors as $aError) {
- $ret['errors'][] = $this->_prepareErrors($aError);
- }
-
- if ($showPassed) {
- $passed = $result->passedTests();
-
- foreach($passed as $aPassed) {
- $ret['passed'][] = $this->_preparePassedTests($aPassed);
- }
- }
-
- return $ret;
- }
-
- function _prepareFailure($failure)
- {
- $test = $failure->failedTest();
- $ret['testName'] = $test->getName();
- $exception = $failure->thrownException();
-
- // a serialized string starts with a 'character:decimal:{'
- // if so we try to unserialize it
- // this piece of the regular expression is for detecting a serialized
- // type like 'a:3:' for an array with three element or an object i.e. 'O:12:"class":3'
- $serialized = '(\w:\d+:(?:"[^"]+":\d+:)?\{.*\})';
-
- // Spaces might make a diff, so we shall show them properly (since a
- // user agent ignores them).
- if (preg_match('/^(.*)expected ' . $serialized . ', actual ' . $serialized . '$/sU', $exception, $matches)) {
- ob_start();
- print_r(unserialize($matches[2]));
- $ret['expected'] = htmlspecialchars($matches[1]) . "<pre>" . htmlspecialchars(rtrim(ob_get_contents())) . "</pre>";
- // Improved compatibility, ob_clean() would be PHP >= 4.2.0 only.
- ob_end_clean();
-
- ob_start();
- print_r(unserialize($matches[3]));
- $ret['actual'] = htmlspecialchars($matches[1]) . "<pre>" . htmlspecialchars(rtrim(ob_get_contents())) . "</pre>";
- ob_end_clean();
- }
-
- else if (preg_match('/^(.*)expected (.*), actual (.*)$/sU', $exception, $matches)) {
- $ret['expected'] = nl2br(str_replace(" ", " ", htmlspecialchars($matches[1] . $matches[2])));
- $ret['actual'] = nl2br(str_replace(" ", " ", htmlspecialchars($matches[1] . $matches[3])));
- } else {
- $ret['message'] = nl2br(str_replace(" ", " ", htmlspecialchars($exception)));
- }
-
- return $ret;
- }
-
- function _preparePassedTests($passed)
- {
- $ret['testName'] = $passed->getName();
- return $ret;
- }
-
- function _prepareError($error)
- {
- $ret['testName'] = $error->getName();
- $ret['message'] = $error->toString();
- return $ret;
- }
- }
-
- /*
- * Local variables:
- * tab-width: 4
- * c-basic-offset: 4
- * c-hanging-comment-ender-p: nil
- * End:
- */
- ?>
-