test_case.php.svn-base

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 709 行 · 第 1/2 页

SVN-BASE
709
字号
<?php/** *  Base include file for SimpleTest *  @package    SimpleTest *  @subpackage UnitTester *  @version    $Id: test_case.php 1726 2008-04-08 01:20:10Z lastcraft $ *//**#@+ * Includes SimpleTest files and defined the root constant * for dependent libraries. */require_once(dirname(__FILE__) . '/invoker.php');require_once(dirname(__FILE__) . '/errors.php');require_once(dirname(__FILE__) . '/compatibility.php');require_once(dirname(__FILE__) . '/scorer.php');require_once(dirname(__FILE__) . '/expectation.php');require_once(dirname(__FILE__) . '/dumper.php');require_once(dirname(__FILE__) . '/simpletest.php');if (version_compare(phpversion(), '5') >= 0) {    require_once(dirname(__FILE__) . '/exceptions.php');    require_once(dirname(__FILE__) . '/reflection_php5.php');} else {    require_once(dirname(__FILE__) . '/reflection_php4.php');}if (! defined('SIMPLE_TEST')) {    /**     * @ignore     */    define('SIMPLE_TEST', dirname(__FILE__) . DIRECTORY_SEPARATOR);}/**#@-*//** *    Basic test case. This is the smallest unit of a test *    suite. It searches for *    all methods that start with the the string "test" and *    runs them. Working test cases extend this class. *    @package      SimpleTest *    @subpackage   UnitTester */class SimpleTestCase {    var $_label = false;    var $_reporter;    var $_observers;    var $_should_skip = false;    /**     *    Sets up the test with no display.     *    @param string $label    If no test name is given then     *                            the class name is used.     *    @access public     */    function SimpleTestCase($label = false) {        if ($label) {            $this->_label = $label;        }    }    /**     *    Accessor for the test name for subclasses.     *    @return string           Name of the test.     *    @access public     */    function getLabel() {        return $this->_label ? $this->_label : get_class($this);    }    /**     *    This is a placeholder for skipping tests. In this     *    method you place skipIf() and skipUnless() calls to     *    set the skipping state.     *    @access public     */    function skip() {    }    /**     *    Will issue a message to the reporter and tell the test     *    case to skip if the incoming flag is true.     *    @param string $should_skip    Condition causing the tests to be skipped.     *    @param string $message        Text of skip condition.     *    @access public     */    function skipIf($should_skip, $message = '%s') {        if ($should_skip && ! $this->_should_skip) {            $this->_should_skip = true;            $message = sprintf($message, 'Skipping [' . get_class($this) . ']');            $this->_reporter->paintSkip($message . $this->getAssertionLine());        }    }    /**     *    Will issue a message to the reporter and tell the test     *    case to skip if the incoming flag is false.     *    @param string $shouldnt_skip  Condition causing the tests to be run.     *    @param string $message        Text of skip condition.     *    @access public     */    function skipUnless($shouldnt_skip, $message = false) {        $this->skipIf(! $shouldnt_skip, $message);    }    /**     *    Used to invoke the single tests.     *    @return SimpleInvoker        Individual test runner.     *    @access public     */    function &createInvoker() {        $invoker = &new SimpleErrorTrappingInvoker(new SimpleInvoker($this));        if (version_compare(phpversion(), '5') >= 0) {            $invoker = &new SimpleExceptionTrappingInvoker($invoker);        }        return $invoker;    }    /**     *    Uses reflection to run every method within itself     *    starting with the string "test" unless a method     *    is specified.     *    @param SimpleReporter $reporter    Current test reporter.     *    @return boolean                    True if all tests passed.     *    @access public     */    function run(&$reporter) {        $context = &SimpleTest::getContext();        $context->setTest($this);        $context->setReporter($reporter);        $this->_reporter = &$reporter;        $started = false;        foreach ($this->getTests() as $method) {            if ($reporter->shouldInvoke($this->getLabel(), $method)) {                $this->skip();                if ($this->_should_skip) {                    break;                }                if (! $started) {                    $reporter->paintCaseStart($this->getLabel());                    $started = true;                }                $invoker = &$this->_reporter->createInvoker($this->createInvoker());                $invoker->before($method);                $invoker->invoke($method);                $invoker->after($method);            }        }        if ($started) {            $reporter->paintCaseEnd($this->getLabel());        }        unset($this->_reporter);        return $reporter->getStatus();    }    /**     *    Gets a list of test names. Normally that will     *    be all internal methods that start with the     *    name "test". This method should be overridden     *    if you want a different rule.     *    @return array        List of test names.     *    @access public     */    function getTests() {        $methods = array();        foreach (get_class_methods(get_class($this)) as $method) {            if ($this->_isTest($method)) {                $methods[] = $method;            }        }        return $methods;    }    /**     *    Tests to see if the method is a test that should     *    be run. Currently any method that starts with 'test'     *    is a candidate unless it is the constructor.     *    @param string $method        Method name to try.     *    @return boolean              True if test method.     *    @access protected     */    function _isTest($method) {        if (strtolower(substr($method, 0, 4)) == 'test') {            return ! SimpleTestCompatibility::isA($this, strtolower($method));        }        return false;    }    /**     *    Announces the start of the test.     *    @param string $method    Test method just started.     *    @access public     */    function before($method) {        $this->_reporter->paintMethodStart($method);        $this->_observers = array();    }    /**     *    Sets up unit test wide variables at the start     *    of each test method. To be overridden in     *    actual user test cases.     *    @access public     */    function setUp() {    }    /**     *    Clears the data set in the setUp() method call.     *    To be overridden by the user in actual user test cases.     *    @access public     */    function tearDown() {    }    /**     *    Announces the end of the test. Includes private clean up.     *    @param string $method    Test method just finished.     *    @access public     */    function after($method) {        for ($i = 0; $i < count($this->_observers); $i++) {            $this->_observers[$i]->atTestEnd($method, $this);        }        $this->_reporter->paintMethodEnd($method);    }    /**     *    Sets up an observer for the test end.     *    @param object $observer    Must have atTestEnd()     *                               method.     *    @access public     */    function tell(&$observer) {        $this->_observers[] = &$observer;    }    /**     *    @deprecated     */    function pass($message = "Pass") {        if (! isset($this->_reporter)) {            trigger_error('Can only make assertions within test methods');        }        $this->_reporter->paintPass(                $message . $this->getAssertionLine());        return true;    }    /**     *    Sends a fail event with a message.     *    @param string $message        Message to send.     *    @access public     */    function fail($message = "Fail") {        if (! isset($this->_reporter)) {            trigger_error('Can only make assertions within test methods');        }        $this->_reporter->paintFail(                $message . $this->getAssertionLine());        return false;    }    /**     *    Formats a PHP error and dispatches it to the     *    reporter.     *    @param integer $severity  PHP error code.     *    @param string $message    Text of error.     *    @param string $file       File error occoured in.     *    @param integer $line      Line number of error.     *    @access public     */    function error($severity, $message, $file, $line) {        if (! isset($this->_reporter)) {            trigger_error('Can only make assertions within test methods');        }        $this->_reporter->paintError(                "Unexpected PHP error [$message] severity [$severity] in [$file line $line]");    }    /**     *    Formats an exception and dispatches it to the     *    reporter.     *    @param Exception $exception    Object thrown.     *    @access public     */    function exception($exception) {        $this->_reporter->paintException($exception);    }    /**     *    @deprecated     */    function signal($type, &$payload) {        if (! isset($this->_reporter)) {            trigger_error('Can only make assertions within test methods');        }        $this->_reporter->paintSignal($type, $payload);    }    /**     *    Runs an expectation directly, for extending the     *    tests with new expectation classes.     *    @param SimpleExpectation $expectation  Expectation subclass.     *    @param mixed $compare               Value to compare.     *    @param string $message                 Message to display.     *    @return boolean                        True on pass     *    @access public     */    function assert(&$expectation, $compare, $message = '%s') {        if ($expectation->test($compare)) {            return $this->pass(sprintf(                    $message,                    $expectation->overlayMessage($compare, $this->_reporter->getDumper())));        } else {            return $this->fail(sprintf(                    $message,                    $expectation->overlayMessage($compare, $this->_reporter->getDumper())));        }    }    /**     *    @deprecated     */    function assertExpectation(&$expectation, $compare, $message = '%s') {        return $this->assert($expectation, $compare, $message);    }    /**     *    Uses a stack trace to find the line of an assertion.     *    @return string           Line number of first assert*     *                             method embedded in format string.     *    @access public     */    function getAssertionLine() {        $trace = new SimpleStackTrace(array('assert', 'expect', 'pass', 'fail', 'skip'));        return $trace->traceMethod();    }    /**     *    Sends a formatted dump of a variable to the     *    test suite for those emergency debugging     *    situations.     *    @param mixed $variable    Variable to display.     *    @param string $message    Message to display.     *    @return mixed             The original variable.     *    @access public     */    function dump($variable, $message = false) {        $dumper = $this->_reporter->getDumper();        $formatted = $dumper->dump($variable);        if ($message) {            $formatted = $message . "\n" . $formatted;        }        $this->_reporter->paintFormattedMessage($formatted);        return $variable;    }

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?