<?php /** * Autorunner which runs all tests cases found in a file * that includes this module. * @package SimpleTest * @version $Id: autorun.php 1721 2008-04-07 19:27:10Z lastcraft $ */ require_once dirname(__FILE__) . '/unit_tester.php'; require_once dirname(__FILE__) . '/mock_objects.php'; require_once dirname(__FILE__) . '/collector.php'; require_once dirname(__FILE__) . '/default_reporter.php'; $GLOBALS['SIMPLETEST_AUTORUNNER_INITIAL_CLASSES'] = get_declared_classes(); register_shutdown_function('simpletest_autorun'); /** * Exit handler to run all recent test cases if no test has * so far been run. Uses the DefaultReporter which can have * it's output controlled with SimpleTest::prefer(). */ function simpletest_autorun() { if (tests_have_run()) { return; } $candidates = array_intersect( capture_new_classes(), classes_defined_in_initial_file()); $loader = new SimpleFileLoader(); $suite = $loader->createSuiteFromClasses( basename(initial_file()), $loader->selectRunnableTests($candidates)); $result = $suite->run(new DefaultReporter()); if (SimpleReporter::inCli()) { exit($result ? 0 : 1); } } /** * Checks the current test context to see if a test has * ever been run. * @return boolean True if tests have run. */ function tests_have_run() { if ($context = SimpleTest::getContext()) { return (boolean)$context->getTest(); } return false; } /** * The first autorun file. * @return string Filename of first autorun script. */ function initial_file() { static $file = false; if (! $file) { $file = reset(get_included_files()); } return $file; } /** * Just the classes from the first autorun script. May * get a few false positives, as it just does a regex based * on following the word "class". * @return array List of all possible classes in first * autorun script. */ function classes_defined_in_initial_file() { if (preg_match_all('/\bclass\s+(\w+)/i', file_get_contents(initial_file()), $matches)) { return array_map('strtolower', $matches[1]); } return array(); } /** * Every class since the first autorun include. This * is safe enough if require_once() is alwyas used. * @return array Class names. */ function capture_new_classes() { global $SIMPLETEST_AUTORUNNER_INITIAL_CLASSES; return array_map('strtolower', array_diff(get_declared_classes(), $SIMPLETEST_AUTORUNNER_INITIAL_CLASSES ? $SIMPLETEST_AUTORUNNER_INITIAL_CLASSES : array())); } ?>