diff options
Diffstat (limited to 'tests/test_tools/simpletest/runner.php')
-rw-r--r-- | tests/test_tools/simpletest/runner.php | 300 |
1 files changed, 300 insertions, 0 deletions
diff --git a/tests/test_tools/simpletest/runner.php b/tests/test_tools/simpletest/runner.php new file mode 100644 index 00000000..411efe7e --- /dev/null +++ b/tests/test_tools/simpletest/runner.php @@ -0,0 +1,300 @@ +<?php + /** + * Base include file for SimpleTest + * @package SimpleTest + * @subpackage UnitTester + * @version $Id: runner.php,v 1.29 2005/01/11 04:03:46 lastcraft Exp $ + */ + + /**#@+ + * Includes SimpleTest files and defined the root constant + * for dependent libraries. + */ + require_once(dirname(__FILE__) . '/errors.php'); + require_once(dirname(__FILE__) . '/options.php'); + require_once(dirname(__FILE__) . '/scorer.php'); + require_once(dirname(__FILE__) . '/expectation.php'); + require_once(dirname(__FILE__) . '/dumper.php'); + if (! defined('SIMPLE_TEST')) { + define('SIMPLE_TEST', dirname(__FILE__) . '/'); + } + /**#@-*/ + + /** + * This is called by the class runner to run a + * single test method. Will also run the setUp() + * and tearDown() methods. + * @package SimpleTest + * @subpackage UnitTester + */ + class SimpleInvoker { + protected $_test_case; + + /** + * Stashes the test case for later. + * @param SimpleTestCase $test_case Test case to run. + */ + function SimpleInvoker($test_case) { + $this->_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 { + protected $_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 { + protected $_test_case; + protected $_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); + } + } +?> |