* Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org) * * Licensed under The Open Group Test Suite License * Redistributions of files must retain the above copyright notice. * * @copyright Copyright 2005-2009, Cake Software Foundation, Inc. (http://cakefoundation.org) * @link http://cakephp.org * @package cake * @subpackage cake.cake.tests.libs * @since CakePHP(tm) v 1.2.0.4433 * @license http://www.opensource.org/licenses/opengroup.php The Open Group Test Suite License */ include_once dirname(__FILE__) . DS . 'cake_base_reporter.php'; /** * CakeHtmlReporter Reports Results of TestSuites and Test Cases * in an HTML format / context. * * @package cake * @subpackage cake.tests.lib */ class CakeHtmlReporter extends SimpleReporter { /** * Character set for the output of test reporting. * * @var string * @access protected */ var $_character_set; /** * Toggle to show passes in output. * * @var boolean * @access protected */ var $_show_passes = false; /** * Time the test runs started. * * @var integer * @access protected */ var $_timeStart = 0; /** * Time the test runs ended * * @var integer * @access protected */ var $_timeEnd = 0; /** * Duration of all test methods. * * @var integer * @access protected */ var $_timeDuration = 0; /** * Array of request parameters. Usually parsed GET params. * * @var array */ var $params = array(); /** * Does nothing yet. The first output will * be sent on the first test start. For use * by a web browser. * * ### Params * * - show_passes - Should passes be shown * - plugin - Plugin test being run? * - app - App test being run. * - case - The case being run * * @param string $character_set The character set to output with. Defaults to ISO-8859-1 * @param array $params Array of request parameters the reporter should use. See above. * @access public */ function CakeHtmlReporter($character_set = 'ISO-8859-1', $params = array()) { $this->SimpleReporter(); $this->_character_set = !empty($character_set) ? $character_set : 'ISO-8859-1'; $this->params = $params; } /** * Paints the top of the web page setting the * title to the name of the starting test. * * @param string $test_name Name class of test. * @return void * @access public */ function paintHeader($testName) { $this->sendNoCacheHeaders(); echo "

$testName

\n"; echo "\n"; echo "
"; echo $this->getTestCaseProgress() . "/" . $this->getTestCaseCount(); echo " test cases complete:\n"; echo "" . $this->getPassCount() . " passes, "; echo "" . $this->getFailCount() . " fails and "; echo "" . $this->getExceptionCount() . " exceptions."; echo "
\n"; echo '
'; echo '

Time taken by tests (in seconds): ' . $this->_timeDuration . '

'; if (function_exists('memory_get_peak_usage')) { echo '

Peak memory use: (in bytes): ' . number_format(memory_get_peak_usage()) . '

'; } echo $this->_paintLinks(); echo '
'; } /** * Renders the links that for accessing things in the test suite. * * @return void */ function _paintLinks() { $show = $query = array(); if (!empty($this->params['group'])) { $show['show'] = 'groups'; } elseif (!empty($this->params['case'])) { $show['show'] = 'cases'; } if (!empty($this->params['app'])) { $show['app'] = $query['app'] = 'true'; } if (!empty($this->params['plugin'])) { $show['plugin'] = $query['plugin'] = $this->params['plugin']; } if (!empty($this->params['case'])) { $query['case'] = $this->params['case']; } elseif (!empty($this->params['group'])) { $query['group'] = $this->params['group']; } $show = $this->_queryString($show); $query = $this->_queryString($query); echo "

Run more tests | Show Passes | \n"; echo " Analyze Code Coverage

\n"; } /** * Convert an array of parameters into a query string url * * @param array $url Url hash to be converted * @return string Converted url query string */ function _queryString($url) { $out = '?'; $params = array(); foreach ($url as $key => $value) { $params[] = "$key=$value"; } $out .= implode('&', $params); return $out; } /** * Paints the test failure with a breadcrumbs * trail of the nesting test suites below the * top level test. * * @param string $message Failure message displayed in * the context of the other tests. * @return void * @access public */ function paintFail($message) { parent::paintFail($message); echo "
  • \n"; echo "Failed"; echo "
    " . $this->_htmlEntities($message) . "
    \n"; $breadcrumb = $this->getTestList(); array_shift($breadcrumb); echo "
    " . implode(" -> ", $breadcrumb) . "
    \n"; echo "
  • \n"; } /** * Paints the test pass with a breadcrumbs * trail of the nesting test suites below the * top level test. * * @param string $message Pass message displayed in the context of the other tests. * @return void * @access public */ function paintPass($message) { parent::paintPass($message); if (isset($this->params['show_passes']) && $this->params['show_passes']) { echo "
  • \n"; echo "Passed "; $breadcrumb = $this->getTestList(); array_shift($breadcrumb); echo implode(" -> ", $breadcrumb); echo "
    " . $this->_htmlEntities($message) . "\n"; echo "
  • \n"; } } /** * Paints a PHP error. * * @param string $message Message is ignored. * @return void * @access public */ function paintError($message) { parent::paintError($message); echo "
  • \n"; echo "Error"; echo "
    " . $this->_htmlEntities($message) . "
    \n"; $breadcrumb = $this->getTestList(); array_shift($breadcrumb); echo "
    " . implode(" -> ", $breadcrumb) . "
    \n"; echo "
  • \n"; } /** * Paints a PHP exception. * * @param Exception $exception Exception to display. * @return void * @access public */ function paintException($exception) { parent::paintException($exception); echo "
  • \n"; echo "Exception"; $message = 'Unexpected exception of type [' . get_class($exception) . '] with message ['. $exception->getMessage() . '] in ['. $exception->getFile() . ' line ' . $exception->getLine() . ']'; echo "
    " . $this->_htmlEntities($message) . "
    \n"; $breadcrumb = $this->getTestList(); array_shift($breadcrumb); echo "
    " . implode(" -> ", $breadcrumb) . "
    \n"; echo "
  • \n"; } /** * Prints the message for skipping tests. * * @param string $message Text of skip condition. * @return void * @access public */ function paintSkip($message) { parent::paintSkip($message); echo "
  • \n"; echo "Skipped "; echo $this->_htmlEntities($message); echo "
  • \n"; } /** * Paints formatted text such as dumped variables. * * @param string $message Text to show. * @return void * @access public */ function paintFormattedMessage($message) { echo '
    ' . $this->_htmlEntities($message) . '
    '; } /** * Character set adjusted entity conversion. * * @param string $message Plain text or Unicode message. * @return string Browser readable message. * @access protected */ function _htmlEntities($message) { return htmlentities($message, ENT_COMPAT, $this->_character_set); } } ?>