_test_case = &$test_case; } /** * Accessor for test case being run. * @return SimpleTestCase Test case. * @access public */ function &getTestCase() { return $this->_test_case; } /** * Invokes a test method and buffered with setUp() * and tearDown() calls. * @param string $method Test method to call. * @access public */ function invoke($method) { $this->_test_case->setUp(); $this->_test_case->$method(); $this->_test_case->tearDown(); } } /** * Do nothing decorator. Just passes the invocation * straight through. * @package SimpleTest * @subpackage UnitTester */ class SimpleInvokerDecorator { var $_invoker; /** * Stores the invoker to wrap. * @param SimpleInvoker $invoker Test method runner. */ function SimpleInvokerDecorator(&$invoker) { $this->_invoker = &$invoker; } /** * Accessor for test case being run. * @return SimpleTestCase Test case. * @access public */ function &getTestCase() { return $this->_invoker->getTestCase(); } /** * Invokes a test method and buffered with setUp() * and tearDown() calls. * @param string $method Test method to call. * @access public */ function invoke($method) { $this->_invoker->invoke($method); } } /** * Extension that traps errors into an error queue. * @package SimpleTest * @subpackage UnitTester */ class SimpleErrorTrappingInvoker extends SimpleInvokerDecorator { /** /** * Stores the invoker to wrap. * @param SimpleInvoker $invoker Test method runner. */ function SimpleErrorTrappingInvoker(&$invoker) { $this->SimpleInvokerDecorator($invoker); } /** * Invokes a test method and dispatches any * untrapped errors. Called back from * the visiting runner. * @param string $method Test method to call. * @access public */ function invoke($method) { set_error_handler('simpleTestErrorHandler'); parent::invoke($method); $queue = &SimpleErrorQueue::instance(); while (list($severity, $message, $file, $line, $globals) = $queue->extract()) { $test_case = &$this->getTestCase(); $test_case->error($severity, $message, $file, $line, $globals); } restore_error_handler(); } } /** * The standard runner. Will run every method starting * with test Basically the * Mediator pattern. * @package SimpleTest * @subpackage UnitTester */ class SimpleRunner { var $_test_case; var $_scorer; /** * Takes in the test case and reporter to mediate between. * @param SimpleTestCase $test_case Test case to run. * @param SimpleScorer $scorer Reporter to receive events. */ function SimpleRunner(&$test_case, &$scorer) { $this->_test_case = &$test_case; $this->_scorer = &$scorer; } /** * Accessor for test case being run. * @return SimpleTestCase Test case. * @access public */ function &getTestCase() { return $this->_test_case; } /** * Runs the test methods in the test case. * @param SimpleTest $test_case Test case to run test on. * @param string $method Name of test method. * @access public */ function run() { $methods = get_class_methods(get_class($this->_test_case)); $invoker = &$this->_test_case->createInvoker(); foreach ($methods as $method) { if (! $this->_isTest($method)) { continue; } if ($this->_isConstructor($method)) { continue; } $this->_scorer->paintMethodStart($method); if ($this->_scorer->shouldInvoke($this->_test_case->getLabel(), $method)) { $invoker->invoke($method); } $this->_scorer->paintMethodEnd($method); } } /** * Tests to see if the method is the constructor and * so should be ignored. * @param string $method Method name to try. * @return boolean True if constructor. * @access protected */ function _isConstructor($method) { return SimpleTestCompatibility::isA( $this->_test_case, strtolower($method)); } /** * Tests to see if the method is a test that should * be run. Currently any method that starts with 'test' * is a candidate. * @param string $method Method name to try. * @return boolean True if test method. * @access protected */ function _isTest($method) { return strtolower(substr($method, 0, 4)) == 'test'; } /** * Paints the start of a test method. * @param string $test_name Name of test or other label. * @access public */ function paintMethodStart($test_name) { $this->_scorer->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->_scorer->paintMethodEnd($test_name); } /** * Chains to the wrapped reporter. * @param string $message Message is ignored. * @access public */ function paintPass($message) { $this->_scorer->paintPass($message); } /** * Chains to the wrapped reporter. * @param string $message Message is ignored. * @access public */ function paintFail($message) { $this->_scorer->paintFail($message); } /** * Chains to the wrapped reporter. * @param string $message Text of error formatted by * the test case. * @access public */ function paintError($message) { $this->_scorer->paintError($message); } /** * Chains to the wrapped reporter. * @param Exception $exception Object thrown. * @access public */ function paintException($exception) { $this->_scorer->paintException($exception); } /** * Chains to the wrapped reporter. * @param string $message Text to display. * @access public */ function paintMessage($message) { $this->_scorer->paintMessage($message); } /** * Chains to the wrapped reporter. * @param string $message Text to display. * @access public */ function paintFormattedMessage($message) { $this->_scorer->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->_scorer->paintSignal($type, $payload); } } ?>