summaryrefslogtreecommitdiff
path: root/tests/UnitTests/simpletest/runner.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/UnitTests/simpletest/runner.php')
-rw-r--r--tests/UnitTests/simpletest/runner.php300
1 files changed, 300 insertions, 0 deletions
diff --git a/tests/UnitTests/simpletest/runner.php b/tests/UnitTests/simpletest/runner.php
new file mode 100644
index 00000000..5a14332d
--- /dev/null
+++ b/tests/UnitTests/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);
+ }
+ }
+?>