You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							478 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
	
	
							478 lines
						
					
					
						
							13 KiB
						
					
					
				<?php
 | 
						|
/**
 | 
						|
 *  Global state for SimpleTest and kicker script in future versions.
 | 
						|
 *  @package    SimpleTest
 | 
						|
 *  @subpackage UnitTester
 | 
						|
 *  @version    $Id: simpletest.php 1723 2008-04-08 00:34:10Z lastcraft $
 | 
						|
 */
 | 
						|
 | 
						|
/**#@+
 | 
						|
 * include SimpleTest files
 | 
						|
 */
 | 
						|
if (version_compare(phpversion(), '5') >= 0) {
 | 
						|
    require_once(dirname(__FILE__) . '/reflection_php5.php');
 | 
						|
} else {
 | 
						|
    require_once(dirname(__FILE__) . '/reflection_php4.php');
 | 
						|
}
 | 
						|
require_once(dirname(__FILE__) . '/default_reporter.php');
 | 
						|
require_once(dirname(__FILE__) . '/compatibility.php');
 | 
						|
/**#@-*/
 | 
						|
 | 
						|
/**
 | 
						|
 *    Registry and test context. Includes a few
 | 
						|
 *    global options that I'm slowly getting rid of.
 | 
						|
 *    @package  SimpleTest
 | 
						|
 *    @subpackage   UnitTester
 | 
						|
 */
 | 
						|
class SimpleTest {
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Reads the SimpleTest version from the release file.
 | 
						|
     *    @return string        Version string.
 | 
						|
     *    @static
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function getVersion() {
 | 
						|
        $content = file(dirname(__FILE__) . '/VERSION');
 | 
						|
        return trim($content[0]);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Sets the name of a test case to ignore, usually
 | 
						|
     *    because the class is an abstract case that should
 | 
						|
     *    not be run. Once PHP4 is dropped this will disappear
 | 
						|
     *    as a public method and "abstract" will rule.
 | 
						|
     *    @param string $class        Add a class to ignore.
 | 
						|
     *    @static
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function ignore($class) {
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        $registry['IgnoreList'][strtolower($class)] = true;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Scans the now complete ignore list, and adds
 | 
						|
     *    all parent classes to the list. If a class
 | 
						|
     *    is not a runnable test case, then it's parents
 | 
						|
     *    wouldn't be either. This is syntactic sugar
 | 
						|
     *    to cut down on ommissions of ignore()'s or
 | 
						|
     *    missing abstract declarations. This cannot
 | 
						|
     *    be done whilst loading classes wiithout forcing
 | 
						|
     *    a particular order on the class declarations and
 | 
						|
     *    the ignore() calls. It's just nice to have the ignore()
 | 
						|
     *    calls at the top of the file before the actual declarations.
 | 
						|
     *    @param array $classes     Class names of interest.
 | 
						|
     *    @static
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function ignoreParentsIfIgnored($classes) {
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        foreach ($classes as $class) {
 | 
						|
            if (SimpleTest::isIgnored($class)) {
 | 
						|
                $reflection = new SimpleReflection($class);
 | 
						|
                if ($parent = $reflection->getParent()) {
 | 
						|
                    SimpleTest::ignore($parent);
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *   Puts the object to the global pool of 'preferred' objects
 | 
						|
     *   which can be retrieved with SimpleTest :: preferred() method.
 | 
						|
     *   Instances of the same class are overwritten.
 | 
						|
     *   @param object $object      Preferred object
 | 
						|
     *   @static
 | 
						|
     *   @access public
 | 
						|
     *   @see preferred()
 | 
						|
     */
 | 
						|
    function prefer(&$object) {
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        $registry['Preferred'][] = &$object;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *   Retrieves 'preferred' objects from global pool. Class filter
 | 
						|
     *   can be applied in order to retrieve the object of the specific
 | 
						|
     *   class
 | 
						|
     *   @param array|string $classes       Allowed classes or interfaces.
 | 
						|
     *   @static
 | 
						|
     *   @access public
 | 
						|
     *   @return array|object|null
 | 
						|
     *   @see prefer()
 | 
						|
     */
 | 
						|
    function &preferred($classes) {
 | 
						|
        if (! is_array($classes)) {
 | 
						|
            $classes = array($classes);
 | 
						|
        }
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        for ($i = count($registry['Preferred']) - 1; $i >= 0; $i--) {
 | 
						|
            foreach ($classes as $class) {
 | 
						|
                if (SimpleTestCompatibility::isA($registry['Preferred'][$i], $class)) {
 | 
						|
                    return $registry['Preferred'][$i];
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return null;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Test to see if a test case is in the ignore
 | 
						|
     *    list. Quite obviously the ignore list should
 | 
						|
     *    be a separate object and will be one day.
 | 
						|
     *    This method is internal to SimpleTest. Don't
 | 
						|
     *    use it.
 | 
						|
     *    @param string $class        Class name to test.
 | 
						|
     *    @return boolean             True if should not be run.
 | 
						|
     *    @access public
 | 
						|
     *    @static
 | 
						|
     */
 | 
						|
    function isIgnored($class) {
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        return isset($registry['IgnoreList'][strtolower($class)]);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function setMockBaseClass($mock_base) {
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        $registry['MockBaseClass'] = $mock_base;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function getMockBaseClass() {
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        return $registry['MockBaseClass'];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Sets proxy to use on all requests for when
 | 
						|
     *    testing from behind a firewall. Set host
 | 
						|
     *    to false to disable. This will take effect
 | 
						|
     *    if there are no other proxy settings.
 | 
						|
     *    @param string $proxy     Proxy host as URL.
 | 
						|
     *    @param string $username  Proxy username for authentication.
 | 
						|
     *    @param string $password  Proxy password for authentication.
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function useProxy($proxy, $username = false, $password = false) {
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        $registry['DefaultProxy'] = $proxy;
 | 
						|
        $registry['DefaultProxyUsername'] = $username;
 | 
						|
        $registry['DefaultProxyPassword'] = $password;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Accessor for default proxy host.
 | 
						|
     *    @return string       Proxy URL.
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function getDefaultProxy() {
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        return $registry['DefaultProxy'];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Accessor for default proxy username.
 | 
						|
     *    @return string    Proxy username for authentication.
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function getDefaultProxyUsername() {
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        return $registry['DefaultProxyUsername'];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Accessor for default proxy password.
 | 
						|
     *    @return string    Proxy password for authentication.
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function getDefaultProxyPassword() {
 | 
						|
        $registry = &SimpleTest::_getRegistry();
 | 
						|
        return $registry['DefaultProxyPassword'];
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Accessor for global registry of options.
 | 
						|
     *    @return hash           All stored values.
 | 
						|
     *    @access private
 | 
						|
     *    @static
 | 
						|
     */
 | 
						|
    function &_getRegistry() {
 | 
						|
        static $registry = false;
 | 
						|
        if (! $registry) {
 | 
						|
            $registry = SimpleTest::_getDefaults();
 | 
						|
        }
 | 
						|
        return $registry;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Accessor for the context of the current
 | 
						|
     *    test run.
 | 
						|
     *    @return SimpleTestContext    Current test run.
 | 
						|
     *    @access public
 | 
						|
     *    @static
 | 
						|
     */
 | 
						|
    function &getContext() {
 | 
						|
        static $context = false;
 | 
						|
        if (! $context) {
 | 
						|
            $context = new SimpleTestContext();
 | 
						|
        }
 | 
						|
        return $context;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Constant default values.
 | 
						|
     *    @return hash       All registry defaults.
 | 
						|
     *    @access private
 | 
						|
     *    @static
 | 
						|
     */
 | 
						|
    function _getDefaults() {
 | 
						|
        return array(
 | 
						|
                'StubBaseClass' => 'SimpleStub',
 | 
						|
                'MockBaseClass' => 'SimpleMock',
 | 
						|
                'IgnoreList' => array(),
 | 
						|
                'DefaultProxy' => false,
 | 
						|
                'DefaultProxyUsername' => false,
 | 
						|
                'DefaultProxyPassword' => false,
 | 
						|
                'Preferred' => array(new HtmlReporter(), new TextReporter(), new XmlReporter()));
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 *    Container for all components for a specific
 | 
						|
 *    test run. Makes things like error queues
 | 
						|
 *    available to PHP event handlers, and also
 | 
						|
 *    gets around some nasty reference issues in
 | 
						|
 *    the mocks.
 | 
						|
 *    @package  SimpleTest
 | 
						|
 */
 | 
						|
class SimpleTestContext {
 | 
						|
    var $_test;
 | 
						|
    var $_reporter;
 | 
						|
    var $_resources;
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Clears down the current context.
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function clear() {
 | 
						|
        $this->_resources = array();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Sets the current test case instance. This
 | 
						|
     *    global instance can be used by the mock objects
 | 
						|
     *    to send message to the test cases.
 | 
						|
     *    @param SimpleTestCase $test        Test case to register.
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function setTest(&$test) {
 | 
						|
        $this->clear();
 | 
						|
        $this->_test = &$test;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Accessor for currently running test case.
 | 
						|
     *    @return SimpleTestCase    Current test.
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function &getTest() {
 | 
						|
        return $this->_test;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Sets the current reporter. This
 | 
						|
     *    global instance can be used by the mock objects
 | 
						|
     *    to send messages.
 | 
						|
     *    @param SimpleReporter $reporter     Reporter to register.
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function setReporter(&$reporter) {
 | 
						|
        $this->clear();
 | 
						|
        $this->_reporter = &$reporter;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Accessor for current reporter.
 | 
						|
     *    @return SimpleReporter    Current reporter.
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function &getReporter() {
 | 
						|
        return $this->_reporter;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Accessor for the Singleton resource.
 | 
						|
     *    @return object       Global resource.
 | 
						|
     *    @access public
 | 
						|
     *    @static
 | 
						|
     */
 | 
						|
    function &get($resource) {
 | 
						|
        if (! isset($this->_resources[$resource])) {
 | 
						|
            $this->_resources[$resource] = &new $resource();
 | 
						|
        }
 | 
						|
        return $this->_resources[$resource];
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 *    Interrogates the stack trace to recover the
 | 
						|
 *    failure point.
 | 
						|
 *    @package SimpleTest
 | 
						|
 *    @subpackage UnitTester
 | 
						|
 */
 | 
						|
class SimpleStackTrace {
 | 
						|
    var $_prefixes;
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Stashes the list of target prefixes.
 | 
						|
     *    @param array $prefixes      List of method prefixes
 | 
						|
     *                                to search for.
 | 
						|
     */
 | 
						|
    function SimpleStackTrace($prefixes) {
 | 
						|
        $this->_prefixes = $prefixes;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Extracts the last method name that was not within
 | 
						|
     *    Simpletest itself. Captures a stack trace if none given.
 | 
						|
     *    @param array $stack      List of stack frames.
 | 
						|
     *    @return string           Snippet of test report with line
 | 
						|
     *                             number and file.
 | 
						|
     *    @access public
 | 
						|
     */
 | 
						|
    function traceMethod($stack = false) {
 | 
						|
        $stack = $stack ? $stack : $this->_captureTrace();
 | 
						|
        foreach ($stack as $frame) {
 | 
						|
            if ($this->_frameLiesWithinSimpleTestFolder($frame)) {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            if ($this->_frameMatchesPrefix($frame)) {
 | 
						|
                return ' at [' . $frame['file'] . ' line ' . $frame['line'] . ']';
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return '';
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Test to see if error is generated by SimpleTest itself.
 | 
						|
     *    @param array $frame     PHP stack frame.
 | 
						|
     *    @return boolean         True if a SimpleTest file.
 | 
						|
     *    @access private
 | 
						|
     */
 | 
						|
    function _frameLiesWithinSimpleTestFolder($frame) {
 | 
						|
        if (isset($frame['file'])) {
 | 
						|
            $path = substr(SIMPLE_TEST, 0, -1);
 | 
						|
            if (strpos($frame['file'], $path) === 0) {
 | 
						|
                if (dirname($frame['file']) == $path) {
 | 
						|
                    return true;
 | 
						|
                }
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Tries to determine if the method call is an assert, etc.
 | 
						|
     *    @param array $frame     PHP stack frame.
 | 
						|
     *    @return boolean         True if matches a target.
 | 
						|
     *    @access private
 | 
						|
     */
 | 
						|
    function _frameMatchesPrefix($frame) {
 | 
						|
        foreach ($this->_prefixes as $prefix) {
 | 
						|
            if (strncmp($frame['function'], $prefix, strlen($prefix)) == 0) {
 | 
						|
                return true;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    Grabs a current stack trace.
 | 
						|
     *    @return array        Fulle trace.
 | 
						|
     *    @access private
 | 
						|
     */
 | 
						|
    function _captureTrace() {
 | 
						|
        if (function_exists('debug_backtrace')) {
 | 
						|
            return array_reverse(debug_backtrace());
 | 
						|
        }
 | 
						|
        return array();
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 *    @package SimpleTest
 | 
						|
 *    @subpackage UnitTester
 | 
						|
 *    @deprecated
 | 
						|
 */
 | 
						|
class SimpleTestOptions extends SimpleTest {
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function getVersion() {
 | 
						|
        return Simpletest::getVersion();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function ignore($class) {
 | 
						|
        return Simpletest::ignore($class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function isIgnored($class) {
 | 
						|
        return Simpletest::isIgnored($class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function setMockBaseClass($mock_base) {
 | 
						|
        return Simpletest::setMockBaseClass($mock_base);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function getMockBaseClass() {
 | 
						|
        return Simpletest::getMockBaseClass();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function useProxy($proxy, $username = false, $password = false) {
 | 
						|
        return Simpletest::useProxy($proxy, $username, $password);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function getDefaultProxy() {
 | 
						|
        return Simpletest::getDefaultProxy();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function getDefaultProxyUsername() {
 | 
						|
        return Simpletest::getDefaultProxyUsername();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     *    @deprecated
 | 
						|
     */
 | 
						|
    function getDefaultProxyPassword() {
 | 
						|
        return Simpletest::getDefaultProxyPassword();
 | 
						|
    }
 | 
						|
}
 | 
						|
?>
 | 
						|
 |