2011-02-12 21:08:48 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* TestRunner for CakePHP Test suite.
|
|
|
|
*
|
|
|
|
* PHP 5
|
|
|
|
*
|
|
|
|
* CakePHP(tm) : Rapid Development Framework (http://cakephp.org)
|
2011-05-29 21:31:39 +00:00
|
|
|
* Copyright 2005-2011, Cake Software Foundation, Inc. (http://cakefoundation.org)
|
2011-02-12 21:08:48 +00:00
|
|
|
*
|
|
|
|
* Licensed under The MIT License
|
|
|
|
* Redistributions of files must retain the above copyright notice.
|
|
|
|
*
|
2011-05-29 21:31:39 +00:00
|
|
|
* @copyright Copyright 2005-2011, Cake Software Foundation, Inc. (http://cakefoundation.org)
|
2011-02-12 21:08:48 +00:00
|
|
|
* @link http://cakephp.org CakePHP(tm) Project
|
2011-07-26 06:16:14 +00:00
|
|
|
* @package Cake.TestSuite
|
2011-02-12 21:08:48 +00:00
|
|
|
* @since CakePHP(tm) v 2.0
|
|
|
|
* @license MIT License (http://www.opensource.org/licenses/mit-license.php)
|
|
|
|
*/
|
|
|
|
|
2011-09-30 06:25:33 +00:00
|
|
|
require_once 'PHPUnit/TextUI/Command.php';
|
2011-02-12 21:08:48 +00:00
|
|
|
|
2011-02-14 04:26:41 +00:00
|
|
|
App::uses('CakeTestRunner', 'TestSuite');
|
|
|
|
App::uses('CakeTestLoader', 'TestSuite');
|
|
|
|
App::uses('CakeTestSuite', 'TestSuite');
|
|
|
|
App::uses('CakeTestCase', 'TestSuite');
|
|
|
|
App::uses('ControllerTestCase', 'TestSuite');
|
2011-02-14 04:48:28 +00:00
|
|
|
App::uses('CakeTestModel', 'TestSuite/Fixture');
|
2011-02-12 21:08:48 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Class to customize loading of test suites from CLI
|
|
|
|
*
|
2011-07-26 06:16:14 +00:00
|
|
|
* @package Cake.TestSuite
|
2011-02-12 21:08:48 +00:00
|
|
|
*/
|
|
|
|
class CakeTestSuiteCommand extends PHPUnit_TextUI_Command {
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Construct method
|
|
|
|
*
|
|
|
|
* @param array $params list of options to be used for this run
|
2012-03-05 02:51:44 +00:00
|
|
|
* @throws MissingTestLoaderException When a loader class could not be found.
|
2011-02-12 21:08:48 +00:00
|
|
|
*/
|
|
|
|
public function __construct($loader, $params = array()) {
|
2011-12-19 13:18:28 +00:00
|
|
|
if ($loader && !class_exists($loader)) {
|
2011-12-15 06:54:03 +00:00
|
|
|
throw new MissingTestLoaderException(array('class' => $loader));
|
2011-12-19 13:18:28 +00:00
|
|
|
}
|
2011-02-12 21:08:48 +00:00
|
|
|
$this->arguments['loader'] = $loader;
|
|
|
|
$this->arguments['test'] = $params['case'];
|
|
|
|
$this->arguments['testFile'] = $params;
|
|
|
|
$this->_params = $params;
|
2011-02-12 22:36:00 +00:00
|
|
|
|
|
|
|
$this->longOptions['fixture='] = 'handleFixture';
|
2011-02-12 23:39:25 +00:00
|
|
|
$this->longOptions['output='] = 'handleReporter';
|
2011-02-12 21:08:48 +00:00
|
|
|
}
|
|
|
|
|
2011-02-13 04:09:47 +00:00
|
|
|
/**
|
|
|
|
* Ugly hack to get around PHPUnit having a hard coded classname for the Runner. :(
|
|
|
|
*
|
|
|
|
* @param array $argv
|
|
|
|
* @param boolean $exit
|
|
|
|
*/
|
|
|
|
public function run(array $argv, $exit = true) {
|
2011-02-12 22:39:42 +00:00
|
|
|
$this->handleArguments($argv);
|
|
|
|
|
2011-02-13 17:10:27 +00:00
|
|
|
$runner = $this->getRunner($this->arguments['loader']);
|
2011-02-12 22:39:42 +00:00
|
|
|
|
|
|
|
if (is_object($this->arguments['test']) &&
|
|
|
|
$this->arguments['test'] instanceof PHPUnit_Framework_Test) {
|
|
|
|
$suite = $this->arguments['test'];
|
|
|
|
} else {
|
|
|
|
$suite = $runner->getTest(
|
2011-12-15 06:54:03 +00:00
|
|
|
$this->arguments['test'],
|
|
|
|
$this->arguments['testFile']
|
2011-02-12 22:39:42 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (count($suite) == 0) {
|
|
|
|
$skeleton = new PHPUnit_Util_Skeleton_Test(
|
2011-12-15 06:54:03 +00:00
|
|
|
$suite->getName(),
|
|
|
|
$this->arguments['testFile']
|
2011-02-12 22:39:42 +00:00
|
|
|
);
|
|
|
|
|
2011-02-13 04:09:47 +00:00
|
|
|
$result = $skeleton->generate(true);
|
2011-02-12 22:39:42 +00:00
|
|
|
|
|
|
|
if (!$result['incomplete']) {
|
|
|
|
eval(str_replace(array('<?php', '?>'), '', $result['code']));
|
|
|
|
$suite = new PHPUnit_Framework_TestSuite(
|
2011-12-15 06:54:03 +00:00
|
|
|
$this->arguments['test'] . 'Test'
|
2011-02-12 22:39:42 +00:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($this->arguments['listGroups']) {
|
|
|
|
PHPUnit_TextUI_TestRunner::printVersionString();
|
|
|
|
|
|
|
|
print "Available test group(s):\n";
|
|
|
|
|
|
|
|
$groups = $suite->getGroups();
|
|
|
|
sort($groups);
|
|
|
|
|
|
|
|
foreach ($groups as $group) {
|
|
|
|
print " - $group\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
|
|
|
|
}
|
|
|
|
|
|
|
|
unset($this->arguments['test']);
|
|
|
|
unset($this->arguments['testFile']);
|
|
|
|
|
|
|
|
try {
|
|
|
|
$result = $runner->doRun($suite, $this->arguments);
|
2011-12-15 06:54:03 +00:00
|
|
|
} catch (PHPUnit_Framework_Exception $e) {
|
2011-02-12 22:39:42 +00:00
|
|
|
print $e->getMessage() . "\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($exit) {
|
|
|
|
if (isset($result) && $result->wasSuccessful()) {
|
|
|
|
exit(PHPUnit_TextUI_TestRunner::SUCCESS_EXIT);
|
2012-02-23 13:38:02 +00:00
|
|
|
} elseif (!isset($result) || $result->errorCount() > 0) {
|
2011-02-12 22:39:42 +00:00
|
|
|
exit(PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT);
|
2012-03-05 02:51:44 +00:00
|
|
|
} else {
|
2011-02-12 22:39:42 +00:00
|
|
|
exit(PHPUnit_TextUI_TestRunner::FAILURE_EXIT);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2011-02-12 21:08:48 +00:00
|
|
|
|
2011-02-13 17:10:27 +00:00
|
|
|
/**
|
|
|
|
* Create a runner for the command.
|
|
|
|
*
|
|
|
|
* @param $loader The loader to be used for the test run.
|
|
|
|
* @return CakeTestRunner
|
|
|
|
*/
|
|
|
|
public function getRunner($loader) {
|
|
|
|
return new CakeTestRunner($loader, $this->_params);
|
|
|
|
}
|
|
|
|
|
2011-02-12 22:36:00 +00:00
|
|
|
/**
|
|
|
|
* Handler for customizing the FixtureManager class/
|
|
|
|
*
|
|
|
|
* @param string $class Name of the class that will be the fixture manager
|
|
|
|
* @return void
|
|
|
|
*/
|
2011-02-13 17:10:27 +00:00
|
|
|
public function handleFixture($class) {
|
2011-02-12 22:36:00 +00:00
|
|
|
$this->arguments['fixtureManager'] = $class;
|
|
|
|
}
|
2011-02-12 23:39:25 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Handles output flag used to change printing on webrunner.
|
|
|
|
*
|
|
|
|
* @return void
|
|
|
|
*/
|
|
|
|
public function handleReporter($reporter) {
|
|
|
|
$object = null;
|
|
|
|
|
|
|
|
$type = strtolower($reporter);
|
2011-07-24 18:31:44 +00:00
|
|
|
$reporter = ucwords($reporter);
|
|
|
|
$coreClass = 'Cake' . $reporter . 'Reporter';
|
2011-02-14 04:26:41 +00:00
|
|
|
App::uses($coreClass, 'TestSuite/Reporter');
|
2011-02-12 23:39:25 +00:00
|
|
|
|
|
|
|
$appClass = $reporter . 'Reporter';
|
2011-02-14 04:26:41 +00:00
|
|
|
App::uses($appClass, 'TestSuite/Reporter');
|
|
|
|
|
|
|
|
if (!class_exists($appClass)) {
|
2011-02-12 23:39:25 +00:00
|
|
|
$object = new $coreClass(null, $this->_params);
|
2011-02-14 04:26:41 +00:00
|
|
|
} else {
|
2011-02-12 23:39:25 +00:00
|
|
|
$object = new $appClass(null, $this->_params);
|
|
|
|
}
|
2011-02-13 03:32:16 +00:00
|
|
|
return $this->arguments['printer'] = $object;
|
2011-02-12 23:39:25 +00:00
|
|
|
}
|
2012-03-05 02:51:44 +00:00
|
|
|
|
2011-11-03 03:25:09 +00:00
|
|
|
}
|