00001 <?php
00002
00003
00004 require_once dirname(__FILE__) . '/test_case.php';
00005 require_once dirname(__FILE__) . '/unit_tester.php';
00006 require_once dirname(__FILE__) . '/expectation.php';
00007 require_once dirname(__FILE__) . '/invoker.php';
00008 require_once dirname(__FILE__) . '/scorer.php';
00009 require_once dirname(__FILE__) . '/reporter.php';
00010 require_once dirname(__FILE__) . '/default_reporter.php';
00011 require_once dirname(__FILE__) . '/dumper.php';
00012 require_once dirname(__FILE__) . '/errors.php';
00013 require_once dirname(__FILE__) . '/exceptions.php';
00014 require_once dirname(__FILE__) . '/xml.php';
00015
00020 class SimpleTest {
00030 function ignore($class) {
00031 $registry = &SimpleTest::_getRegistry();
00032 $registry['IgnoreList'][strtolower($class)] = true;
00033 }
00034
00050 function ignoreParentsIfIgnored($classes) {
00051 $registry = &SimpleTest::_getRegistry();
00052 foreach ($classes as $class) {
00053 if (SimpleTest::isIgnored($class)) {
00054 $reflection = new ReflectionClass($class);
00055 if ($parent = $reflection->getParentClass()) {
00056 SimpleTest::ignore($parent->getName());
00057 }
00058 }
00059 }
00060 }
00061
00071 function prefer(&$object) {
00072 $registry = &SimpleTest::_getRegistry();
00073 $registry['Preferred'][] = &$object;
00074 }
00075
00086 function &preferred($classes) {
00087 if (! is_array($classes)) {
00088 $classes = array($classes);
00089 }
00090 $registry = &SimpleTest::_getRegistry();
00091 for ($i = count($registry['Preferred']) - 1; $i >= 0; $i--) {
00092 foreach ($classes as $class) {
00093 if (is_a($registry['Preferred'][$i], $class)) {
00094 return $registry['Preferred'][$i];
00095 }
00096 }
00097 }
00098 return null;
00099 }
00100
00112 function isIgnored($class) {
00113 $registry = &SimpleTest::_getRegistry();
00114 return isset($registry['IgnoreList'][strtolower($class)]);
00115 }
00116
00127 function useProxy($proxy, $username = false, $password = false) {
00128 $registry = &SimpleTest::_getRegistry();
00129 $registry['DefaultProxy'] = $proxy;
00130 $registry['DefaultProxyUsername'] = $username;
00131 $registry['DefaultProxyPassword'] = $password;
00132 }
00133
00139 function getDefaultProxy() {
00140 $registry = &SimpleTest::_getRegistry();
00141 return $registry['DefaultProxy'];
00142 }
00143
00149 function getDefaultProxyUsername() {
00150 $registry = &SimpleTest::_getRegistry();
00151 return $registry['DefaultProxyUsername'];
00152 }
00153
00159 function getDefaultProxyPassword() {
00160 $registry = &SimpleTest::_getRegistry();
00161 return $registry['DefaultProxyPassword'];
00162 }
00163
00170 function &_getRegistry() {
00171 static $registry = false;
00172 if (! $registry) {
00173 $registry = SimpleTest::_getDefaults();
00174 }
00175 return $registry;
00176 }
00177
00185 function &getContext() {
00186 static $context = false;
00187 if (! $context) {
00188 $context = new SimpleTestContext();
00189 }
00190 return $context;
00191 }
00192
00199 function _getDefaults() {
00200 return array(
00201 'StubBaseClass' => 'SimpleStub',
00202 'MockBaseClass' => 'SimpleMock',
00203 'IgnoreList' => array(),
00204 'DefaultProxy' => false,
00205 'DefaultProxyUsername' => false,
00206 'DefaultProxyPassword' => false,
00207 'Preferred' => array(new HtmlReporter(), new TextReporter(), new XmlReporter()));
00208 }
00209 }
00210
00219 class SimpleTestContext {
00220 var $_test;
00221 var $_reporter;
00222 var $_resources;
00223
00228 function clear() {
00229 $this->_resources = array();
00230 }
00231
00239 function setTest(&$test) {
00240 $this->clear();
00241 $this->_test = &$test;
00242 }
00243
00249 function &getTest() {
00250 return $this->_test;
00251 }
00252
00260 function setReporter(&$reporter) {
00261 $this->clear();
00262 $this->_reporter = &$reporter;
00263 }
00264
00270 function &getReporter() {
00271 return $this->_reporter;
00272 }
00273
00280 function &get($resource) {
00281 if (! isset($this->_resources[$resource])) {
00282 $this->_resources[$resource] = &new $resource();
00283 }
00284 return $this->_resources[$resource];
00285 }
00286 }
00287
00292 class SimpleStackTrace {
00293 var $_prefixes;
00294
00300 function SimpleStackTrace($prefixes) {
00301 $this->_prefixes = $prefixes;
00302 }
00303
00312 function traceMethod($stack = false) {
00313 $stack = $stack ? $stack : $this->_captureTrace();
00314 foreach ($stack as $frame) {
00315 if ($this->_frameLiesWithinSimpleTestFolder($frame)) {
00316 continue;
00317 }
00318 if ($this->_frameMatchesPrefix($frame)) {
00319 return ' at [' . $frame['file'] . ' line ' . $frame['line'] . ']';
00320 }
00321 }
00322 return '';
00323 }
00324
00331 function _frameLiesWithinSimpleTestFolder($frame) {
00332 if (isset($frame['file'])) {
00333 $path = dirname(__FILE__);
00334 if (strpos($frame['file'], $path) === 0) {
00335 if (dirname($frame['file']) == $path) {
00336 return true;
00337 }
00338 }
00339 }
00340 return false;
00341 }
00342
00349 function _frameMatchesPrefix($frame) {
00350 foreach ($this->_prefixes as $prefix) {
00351 if (strncmp($frame['function'], $prefix, strlen($prefix)) == 0) {
00352 return true;
00353 }
00354 }
00355 return false;
00356 }
00357
00363 function _captureTrace() {
00364 if (function_exists('debug_backtrace')) {
00365 return array_reverse(debug_backtrace());
00366 }
00367 return array();
00368 }
00369 }