From 7425effd1953f653d18af74c1e84c79830583e78 Mon Sep 17 00:00:00 2001 From: zYne Date: Wed, 16 Jan 2008 14:00:35 +0000 Subject: [PATCH] --- draft/tests/DoctrineTest.php | 257 ++++++++++++++++++ draft/tests/{ => Query}/ScannerTestCase.php | 0 ...annerTest.php => QueryScannerTestCase.php} | 4 +- draft/tests/run.php | 36 +++ 4 files changed, 294 insertions(+), 3 deletions(-) create mode 100644 draft/tests/DoctrineTest.php rename draft/tests/{ => Query}/ScannerTestCase.php (100%) rename draft/tests/{ScannerTest.php => QueryScannerTestCase.php} (96%) create mode 100644 draft/tests/run.php diff --git a/draft/tests/DoctrineTest.php b/draft/tests/DoctrineTest.php new file mode 100644 index 000000000..aa97df69d --- /dev/null +++ b/draft/tests/DoctrineTest.php @@ -0,0 +1,257 @@ +. + */ + +/** + * Doctrine_UnitTestCase + * + * @package Doctrine + * @author Konsta Vesterinen + * @author Bjarte S. Karlsen + * @license http://www.opensource.org/licenses/lgpl-license.php LGPL + * @category Object Relational Mapping + * @link www.phpdoctrine.com + * @since 1.0 + * @version $Revision$ + */ + +require_once dirname(__FILE__) . '/DoctrineTest/UnitTestCase.php'; +require_once dirname(__FILE__) . '/DoctrineTest/GroupTest.php'; +require_once dirname(__FILE__) . '/DoctrineTest/Doctrine_UnitTestCase.php'; +require_once dirname(__FILE__) . '/DoctrineTest/Reporter.php'; + +class DoctrineTest +{ + + protected $testGroup; // the default test group + protected $groups; + + public function __construct() + { + $this->requireModels(); + $this->testGroup = new GroupTest('Doctrine Framework Unit Tests', 'main'); + } + + /** + * Add a test to be run. + * + * This is a thin wrapper around GroupTest that also store the testcase in + * this class so that it is easier to create custom groups + * + * @param UnitTestCase A test case + */ + public function addTestCase($testCase){ + $this->groups[$testCase->getName()] = $testCase; + $this->testGroup->addTestCase($testCase); + } + + /** + * Run the tests + * + * This method will run the tests with the correct Reporter. It will run + * grouped tests if asked to and filter results. It also has support for + * running coverage report. + * + */ + public function run(){ + $testGroup = $this->testGroup; + if (PHP_SAPI === 'cli') { + require_once(dirname(__FILE__) . '/DoctrineTest/Reporter/Cli.php'); + $reporter = new DoctrineTest_Reporter_Cli(); + $argv = $_SERVER['argv']; + array_shift($argv); + $options = $this->parseOptions($argv); + } else { + require_once(dirname(__FILE__) . '/DoctrineTest/Reporter/Html.php'); + $options = $_GET; + if(isset($options["filter"])){ + $options["filter"] = explode(",", $options["filter"]); + } + if(isset($options["group"])){ + $options["group"] = explode(",", $options["group"]); + } + $reporter = new DoctrineTest_Reporter_Html(); + } + + //replace global group with custom group if we have group option set + if (isset($options['group'])) { + $testGroup = new GroupTest('Doctrine Framework Custom test', 'custom'); + foreach($options['group'] as $group) { + if (isset($this->groups[$group])) { + $testGroup->addTestCase($this->groups[$group]); + } else if (class_exists($group)) { + $testGroup->addTestCase(new $group); + } else { + die($group . " is not a valid group or doctrine test class\n "); + } + } + } + + $filter = ''; + if (isset($options['filter'])) { + $filter = $options['filter']; + } + + //show help text + if (isset($options['help'])) { + echo "Doctrine test runner help\n"; + echo "===========================\n"; + echo " To run all tests simply run this script without arguments. \n"; + echo "\n Flags:\n"; + echo " -coverage will generate coverage report data that can be viewed with the cc.php script in this folder. NB! This takes time. You need xdebug to run this\n"; + echo " -group Use this option to run just a group of tests or tests with a given classname. Groups are currently defined as the variable name they are called in this script.\n"; + echo " -filter case insensitive strings that will be applied to the className of the tests. A test_classname must contain all of these strings to be run\n"; + echo "\nAvailable groups:\n tickets, transaction, driver, data_dict, sequence, export, import, expression, core, relation, data_types, utility, db, event_listener, query_tests, record, cache\n"; + die(); + } + + //generate coverage report + if (isset($options['coverage'])) { + + /* + * The below code will not work for me (meus). It would be nice if + * somebody could give it a try. Just replace this block of code + * with the one below + * + define('PHPCOVERAGE_HOME', dirname(dirname(__FILE__)) . '/vendor/spikephpcoverage'); + require_once PHPCOVERAGE_HOME . '/CoverageRecorder.php'; + require_once PHPCOVERAGE_HOME . '/reporter/HtmlCoverageReporter.php'; + + $covReporter = new HtmlCoverageReporter('Doctrine Code Coverage Report', '', 'coverage2'); + + $includePaths = array('../lib'); + $excludePaths = array(); + $cov = new CoverageRecorder($includePaths, $excludePaths, $covReporter); + + $cov->startInstrumentation(); + $testGroup->run($reporter, $filter); + $cov->stopInstrumentation(); + + $cov->generateReport(); + $covReporter->printTextSummary(); + */ + xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); + $testGroup->run($reporter, $filter); + $result['coverage'] = xdebug_get_code_coverage(); + xdebug_stop_code_coverage(); + file_put_contents(dirname(__FILE__) . '/coverage/coverage.txt', serialize($result)); + require_once dirname(__FILE__) . '/DoctrineTest/Coverage.php'; + $coverageGeneration = new DoctrineTest_Coverage(); + $coverageGeneration->generateReport(); + return; + // */ + + } + $testGroup->run($reporter, $filter); + } + + + /** + * Require all the models needed in the tests + * + */ + public function requireModels() + { + $models = new DirectoryIterator(dirname(__FILE__) . '/../../models/'); + foreach($models as $key => $file) { + if ($file->isFile() && ! $file->isDot()) { + $e = explode('.', $file->getFileName()); + if (end($e) === 'php') { + require_once $file->getPathname(); + } + } + } + } + + /** + * Parse Options from cli into an associative array + * + * @param array $array An argv array from cli + * @return array An array with options + */ + public function parseOptions($array) { + $currentName=''; + $options=array(); + foreach($array as $name) { + if (strpos($name,'-')===0) { + $name=str_replace('-','',$name); + $currentName=$name; + if ( ! isset($options[$currentName])) { + $options[$currentName]=array(); + } + } else { + $values=$options[$currentName]; + array_push($values,$name); + $options[$currentName]=$values; + } + } + return $options; + } + + /** + * Autoload test cases + * + * Will create test case if it does not exist + * + * @param string $class The name of the class to autoload + * @return boolean True + */ + public static function autoload($class) + { + if (strpos($class, 'TestCase') === false) { + return false; + } + + $e = explode('_', $class); + $count = count($e); + + $prefix = array_shift($e); + + if ($prefix !== 'Doctrine') { + return false; + } + + $dir = array_shift($e); + + $file = $dir . '_' . substr(implode('_', $e), 0, -(strlen('_TestCase'))) . 'TestCase.php'; + + if ( $count > 3) { + $file = str_replace('_', DIRECTORY_SEPARATOR, $file); + } else { + $file = str_replace('_', '', $file); + } + + // create a test case file if it doesn't exist + + if ( ! file_exists($file)) { + $contents = file_get_contents('template.tpl'); + $contents = sprintf($contents, $class, $class); + + if ( ! file_exists($dir)) { + mkdir($dir, 0777); + } + + file_put_contents($file, $contents); + } + require_once($file); + + return true; + } +} diff --git a/draft/tests/ScannerTestCase.php b/draft/tests/Query/ScannerTestCase.php similarity index 100% rename from draft/tests/ScannerTestCase.php rename to draft/tests/Query/ScannerTestCase.php diff --git a/draft/tests/ScannerTest.php b/draft/tests/QueryScannerTestCase.php similarity index 96% rename from draft/tests/ScannerTest.php rename to draft/tests/QueryScannerTestCase.php index 0479d91dd..f945d790b 100644 --- a/draft/tests/ScannerTest.php +++ b/draft/tests/QueryScannerTestCase.php @@ -1,9 +1,7 @@ addTestCase(new Doctrine_Query_Scanner_TestCase()); + +$test->addTestCase($queryTests); + + +$test->run(); + +echo memory_get_peak_usage() / 1024 . "\n";