<?php /** * base include file for SimpleTest * @package SimpleTest * @subpackage UnitTester * @version $Id: scorer.php 1723 2008-04-08 00:34:10Z lastcraft $ */ /**#@+*/ require_once(dirname(__FILE__) . '/invoker.php'); /**#@-*/ /** * Can receive test events and display them. Display * is achieved by making display methods available * and visiting the incoming event. * @package SimpleTest * @subpackage UnitTester * @abstract */ class SimpleScorer { var $_passes; var $_fails; var $_exceptions; var $_is_dry_run; /** * Starts the test run with no results. * @access public */ function SimpleScorer() { $this->_passes = 0; $this->_fails = 0; $this->_exceptions = 0; $this->_is_dry_run = false; } /** * Signals that the next evaluation will be a dry * run. That is, the structure events will be * recorded, but no tests will be run. * @param boolean $is_dry Dry run if true. * @access public */ function makeDry($is_dry = true) { $this->_is_dry_run = $is_dry; } /** * The reporter has a veto on what should be run. * @param string $test_case_name name of test case. * @param string $method Name of test method. * @access public */ function shouldInvoke($test_case_name, $method) { return ! $this->_is_dry_run; } /** * Can wrap the invoker in preperation for running * a test. * @param SimpleInvoker $invoker Individual test runner. * @return SimpleInvoker Wrapped test runner. * @access public */ function &createInvoker(&$invoker) { return $invoker; } /** * Accessor for current status. Will be false * if there have been any failures or exceptions. * Used for command line tools. * @return boolean True if no failures. * @access public */ function getStatus() { if ($this->_exceptions + $this->_fails > 0) { return false; } return true; } /** * Paints the start of a group test. * @param string $test_name Name of test or other label. * @param integer $size Number of test cases starting. * @access public */ function paintGroupStart($test_name, $size) { } /** * Paints the end of a group test. * @param string $test_name Name of test or other label. * @access public */ function paintGroupEnd($test_name) { } /** * Paints the start of a test case. * @param string $test_name Name of test or other label. * @access public */ function paintCaseStart($test_name) { } /** * Paints the end of a test case. * @param string $test_name Name of test or other label. * @access public */ function paintCaseEnd($test_name) { } /** * Paints the start of a test method. * @param string $test_name Name of test or other label. * @access public */ function paintMethodStart($test_name) { } /** * Paints the end of a test method. * @param string $test_name Name of test or other label. * @access public */ function paintMethodEnd($test_name) { } /** * Increments the pass count. * @param string $message Message is ignored. * @access public */ function paintPass($message) { $this->_passes++; } /** * Increments the fail count. * @param string $message Message is ignored. * @access public */ function paintFail($message) { $this->_fails++; } /** * Deals with PHP 4 throwing an error. * @param string $message Text of error formatted by * the test case. * @access public */ function paintError($message) { $this->_exceptions++; } /** * Deals with PHP 5 throwing an exception. * @param Exception $exception The actual exception thrown. * @access public */ function paintException($exception) { $this->_exceptions++; } /** * Prints the message for skipping tests. * @param string $message Text of skip condition. * @access public */ function paintSkip($message) { } /** * Accessor for the number of passes so far. * @return integer Number of passes. * @access public */ function getPassCount() { return $this->_passes; } /** * Accessor for the number of fails so far. * @return integer Number of fails. * @access public */ function getFailCount() { return $this->_fails; } /** * Accessor for the number of untrapped errors * so far. * @return integer Number of exceptions. * @access public */ function getExceptionCount() { return $this->_exceptions; } /** * Paints a simple supplementary message. * @param string $message Text to display. * @access public */ function paintMessage($message) { } /** * Paints a formatted ASCII message such as a * variable dump. * @param string $message Text to display. * @access public */ function paintFormattedMessage($message) { } /** * By default just ignores user generated events. * @param string $type Event type as text. * @param mixed $payload Message or object. * @access public */ function paintSignal($type, $payload) { } } /** * Recipient of generated test messages that can display * page footers and headers. Also keeps track of the * test nesting. This is the main base class on which * to build the finished test (page based) displays. * @package SimpleTest * @subpackage UnitTester */ class SimpleReporter extends SimpleScorer { var $_test_stack; var $_size; var $_progress; /** * Starts the display with no results in. * @access public */ function SimpleReporter() { $this->SimpleScorer(); $this->_test_stack = array(); $this->_size = null; $this->_progress = 0; } /** * Gets the formatter for variables and other small * generic data items. * @return SimpleDumper Formatter. * @access public */ function getDumper() { return new SimpleDumper(); } /** * Paints the start of a group test. Will also paint * the page header and footer if this is the * first test. Will stash the size if the first * start. * @param string $test_name Name of test that is starting. * @param integer $size Number of test cases starting. * @access public */ function paintGroupStart($test_name, $size) { if (! isset($this->_size)) { $this->_size = $size; } if (count($this->_test_stack) == 0) { $this->paintHeader($test_name); } $this->_test_stack[] = $test_name; } /** * Paints the end of a group test. Will paint the page * footer if the stack of tests has unwound. * @param string $test_name Name of test that is ending. * @param integer $progress Number of test cases ending. * @access public */ function paintGroupEnd($test_name) { array_pop($this->_test_stack); if (count($this->_test_stack) == 0) { $this->paintFooter($test_name); } } /** * Paints the start of a test case. Will also paint * the page header and footer if this is the * first test. Will stash the size if the first * start. * @param string $test_name Name of test that is starting. * @access public */ function paintCaseStart($test_name) { if (! isset($this->_size)) { $this->_size = 1; } if (count($this->_test_stack) == 0) { $this->paintHeader($test_name); } $this->_test_stack[] = $test_name; } /** * Paints the end of a test case. Will paint the page * footer if the stack of tests has unwound. * @param string $test_name Name of test that is ending. * @access public */ function paintCaseEnd($test_name) { $this->_progress++; array_pop($this->_test_stack); if (count($this->_test_stack) == 0) { $this->paintFooter($test_name); } } /** * Paints the start of a test method. * @param string $test_name Name of test that is starting. * @access public */ function paintMethodStart($test_name) { $this->_test_stack[] = $test_name; } /** * Paints the end of a test method. Will paint the page * footer if the stack of tests has unwound. * @param string $test_name Name of test that is ending. * @access public */ function paintMethodEnd($test_name) { array_pop($this->_test_stack); } /** * Paints the test document header. * @param string $test_name First test top level * to start. * @access public * @abstract */ function paintHeader($test_name) { } /** * Paints the test document footer. * @param string $test_name The top level test. * @access public * @abstract */ function paintFooter($test_name) { } /** * Accessor for internal test stack. For * subclasses that need to see the whole test * history for display purposes. * @return array List of methods in nesting order. * @access public */ function getTestList() { return $this->_test_stack; } /** * Accessor for total test size in number * of test cases. Null until the first * test is started. * @return integer Total number of cases at start. * @access public */ function getTestCaseCount() { return $this->_size; } /** * Accessor for the number of test cases * completed so far. * @return integer Number of ended cases. * @access public */ function getTestCaseProgress() { return $this->_progress; } /** * Static check for running in the comand line. * @return boolean True if CLI. * @access public * @static */ function inCli() { return php_sapi_name() == 'cli'; } } /** * For modifying the behaviour of the visual reporters. * @package SimpleTest * @subpackage UnitTester */ class SimpleReporterDecorator { var $_reporter; /** * Mediates between the reporter and the test case. * @param SimpleScorer $reporter Reporter to receive events. */ function SimpleReporterDecorator(&$reporter) { $this->_reporter = &$reporter; } /** * Signals that the next evaluation will be a dry * run. That is, the structure events will be * recorded, but no tests will be run. * @param boolean $is_dry Dry run if true. * @access public */ function makeDry($is_dry = true) { $this->_reporter->makeDry($is_dry); } /** * Accessor for current status. Will be false * if there have been any failures or exceptions. * Used for command line tools. * @return boolean True if no failures. * @access public */ function getStatus() { return $this->_reporter->getStatus(); } /** * The reporter has a veto on what should be run. * @param string $test_case_name name of test case. * @param string $method Name of test method. * @return boolean True if test should be run. * @access public */ function shouldInvoke($test_case_name, $method) { return $this->_reporter->shouldInvoke($test_case_name, $method); } /** * Can wrap the invoker in preperation for running * a test. * @param SimpleInvoker $invoker Individual test runner. * @return SimpleInvoker Wrapped test runner. * @access public */ function &createInvoker(&$invoker) { return $this->_reporter->createInvoker($invoker); } /** * Gets the formatter for variables and other small * generic data items. * @return SimpleDumper Formatter. * @access public */ function getDumper() { return $this->_reporter->getDumper(); } /** * Paints the start of a group test. * @param string $test_name Name of test or other label. * @param integer $size Number of test cases starting. * @access public */ function paintGroupStart($test_name, $size) { $this->_reporter->paintGroupStart($test_name, $size); } /** * Paints the end of a group test. * @param string $test_name Name of test or other label. * @access public */ function paintGroupEnd($test_name) { $this->_reporter->paintGroupEnd($test_name); } /** * Paints the start of a test case. * @param string $test_name Name of test or other label. * @access public */ function paintCaseStart($test_name) { $this->_reporter->paintCaseStart($test_name); } /** * Paints the end of a test case. * @param string $test_name Name of test or other label. * @access public */ function paintCaseEnd($test_name) { $this->_reporter->paintCaseEnd($test_name); } /** * Paints the start of a test method. * @param string $test_name Name of test or other label. * @access public */ function paintMethodStart($test_name) { $this->_reporter->paintMethodStart($test_name); } /** * Paints the end of a test method. * @param string $test_name Name of test or other label. * @access public */ function paintMethodEnd($test_name) { $this->_reporter->paintMethodEnd($test_name); } /** * Chains to the wrapped reporter. * @param string $message Message is ignored. * @access public */ function paintPass($message) { $this->_reporter->paintPass($message); } /** * Chains to the wrapped reporter. * @param string $message Message is ignored. * @access public */ function paintFail($message) { $this->_reporter->paintFail($message); } /** * Chains to the wrapped reporter. * @param string $message Text of error formatted by * the test case. * @access public */ function paintError($message) { $this->_reporter->paintError($message); } /** * Chains to the wrapped reporter. * @param Exception $exception Exception to show. * @access public */ function paintException($exception) { $this->_reporter->paintException($exception); } /** * Prints the message for skipping tests. * @param string $message Text of skip condition. * @access public */ function paintSkip($message) { $this->_reporter->paintSkip($message); } /** * Chains to the wrapped reporter. * @param string $message Text to display. * @access public */ function paintMessage($message) { $this->_reporter->paintMessage($message); } /** * Chains to the wrapped reporter. * @param string $message Text to display. * @access public */ function paintFormattedMessage($message) { $this->_reporter->paintFormattedMessage($message); } /** * Chains to the wrapped reporter. * @param string $type Event type as text. * @param mixed $payload Message or object. * @return boolean Should return false if this * type of signal should fail the * test suite. * @access public */ function paintSignal($type, &$payload) { $this->_reporter->paintSignal($type, $payload); } } /** * For sending messages to multiple reporters at * the same time. * @package SimpleTest * @subpackage UnitTester */ class MultipleReporter { var $_reporters = array(); /** * Adds a reporter to the subscriber list. * @param SimpleScorer $reporter Reporter to receive events. * @access public */ function attachReporter(&$reporter) { $this->_reporters[] = &$reporter; } /** * Signals that the next evaluation will be a dry * run. That is, the structure events will be * recorded, but no tests will be run. * @param boolean $is_dry Dry run if true. * @access public */ function makeDry($is_dry = true) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->makeDry($is_dry); } } /** * Accessor for current status. Will be false * if there have been any failures or exceptions. * If any reporter reports a failure, the whole * suite fails. * @return boolean True if no failures. * @access public */ function getStatus() { for ($i = 0; $i < count($this->_reporters); $i++) { if (! $this->_reporters[$i]->getStatus()) { return false; } } return true; } /** * The reporter has a veto on what should be run. * It requires all reporters to want to run the method. * @param string $test_case_name name of test case. * @param string $method Name of test method. * @access public */ function shouldInvoke($test_case_name, $method) { for ($i = 0; $i < count($this->_reporters); $i++) { if (! $this->_reporters[$i]->shouldInvoke($test_case_name, $method)) { return false; } } return true; } /** * Every reporter gets a chance to wrap the invoker. * @param SimpleInvoker $invoker Individual test runner. * @return SimpleInvoker Wrapped test runner. * @access public */ function &createInvoker(&$invoker) { for ($i = 0; $i < count($this->_reporters); $i++) { $invoker = &$this->_reporters[$i]->createInvoker($invoker); } return $invoker; } /** * Gets the formatter for variables and other small * generic data items. * @return SimpleDumper Formatter. * @access public */ function getDumper() { return new SimpleDumper(); } /** * Paints the start of a group test. * @param string $test_name Name of test or other label. * @param integer $size Number of test cases starting. * @access public */ function paintGroupStart($test_name, $size) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintGroupStart($test_name, $size); } } /** * Paints the end of a group test. * @param string $test_name Name of test or other label. * @access public */ function paintGroupEnd($test_name) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintGroupEnd($test_name); } } /** * Paints the start of a test case. * @param string $test_name Name of test or other label. * @access public */ function paintCaseStart($test_name) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintCaseStart($test_name); } } /** * Paints the end of a test case. * @param string $test_name Name of test or other label. * @access public */ function paintCaseEnd($test_name) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintCaseEnd($test_name); } } /** * Paints the start of a test method. * @param string $test_name Name of test or other label. * @access public */ function paintMethodStart($test_name) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintMethodStart($test_name); } } /** * Paints the end of a test method. * @param string $test_name Name of test or other label. * @access public */ function paintMethodEnd($test_name) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintMethodEnd($test_name); } } /** * Chains to the wrapped reporter. * @param string $message Message is ignored. * @access public */ function paintPass($message) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintPass($message); } } /** * Chains to the wrapped reporter. * @param string $message Message is ignored. * @access public */ function paintFail($message) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintFail($message); } } /** * Chains to the wrapped reporter. * @param string $message Text of error formatted by * the test case. * @access public */ function paintError($message) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintError($message); } } /** * Chains to the wrapped reporter. * @param Exception $exception Exception to display. * @access public */ function paintException($exception) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintException($exception); } } /** * Prints the message for skipping tests. * @param string $message Text of skip condition. * @access public */ function paintSkip($message) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintSkip($message); } } /** * Chains to the wrapped reporter. * @param string $message Text to display. * @access public */ function paintMessage($message) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintMessage($message); } } /** * Chains to the wrapped reporter. * @param string $message Text to display. * @access public */ function paintFormattedMessage($message) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintFormattedMessage($message); } } /** * Chains to the wrapped reporter. * @param string $type Event type as text. * @param mixed $payload Message or object. * @return boolean Should return false if this * type of signal should fail the * test suite. * @access public */ function paintSignal($type, &$payload) { for ($i = 0; $i < count($this->_reporters); $i++) { $this->_reporters[$i]->paintSignal($type, $payload); } } } ?>