public static function main()
{
global $isLocal;
// check number of arguments
$isLocal = !isset($_SERVER['HTTP_USER_AGENT']);
$arguments = array('listGroups' => FALSE, 'loader' => NULL, 'useDefaultConfiguration' => TRUE);
$loader = NULL;
$startPos = 1;
$canCountTest = true;
global $config_file;
if ($isLocal && $_SERVER['argv'][1] == "-config" || !$isLocal && strcmp($config_file, "") != 0 && strcmp($config_file, "/*config_xml*/") != 0) {
// check if configuration specified
$canCountTest = false;
$path = $isLocal ? $_SERVER['argv'][2] : $config_file;
//$_GET["config_xml"];
$arguments['configuration'] = $path;
$startPos = 3;
$configuration = PHPUnit_Util_Configuration::getInstance($path);
$phpunit = $configuration->getPHPUnitConfiguration();
if (isset($phpunit['testSuiteLoaderClass'])) {
if (isset($phpunit['testSuiteLoaderFile'])) {
$file = $phpunit['testSuiteLoaderFile'];
} else {
$file = '';
}
$command = new PHPUnit_TextUI_Command();
$loader = $command->handleLoader($phpunit['testSuiteLoaderClass'], $file);
$arguments['loader'] = $loader;
}
$configuration->handlePHPConfiguration();
$phpunitConfiguration = $configuration->getPHPUnitConfiguration();
if (isset($phpunitConfiguration['bootstrap'])) {
PHPUnit_Util_Fileloader::load($phpunitConfiguration['bootstrap']);
}
$browsers = $configuration->getSeleniumBrowserConfiguration();
if (!empty($browsers)) {
require_once 'PHPUnit/Extensions/SeleniumTestCase.php';
PHPUnit_Extensions_SeleniumTestCase::$browsers = $browsers;
}
}
if ($isLocal && $_SERVER['argv'][$startPos] == "-group" || !$isLocal && isset($_GET["groups"])) {
$arguments['groups'] = explode(',', $isLocal ? $_SERVER['argv'][$startPos + 1] : $_GET["groups"]);
$startPos += 2;
}
if ($isLocal && $_SERVER['argv'][$startPos] == "-exclude-group" || !$isLocal && isset($_GET["exclude_groups"])) {
$arguments['excludeGroups'] = explode(',', $isLocal ? $_SERVER['argv'][$startPos + 1] : $_GET["exclude_groups"]);
$startPos += 2;
}
$check = $isLocal ? $_SERVER['argv'][$startPos] : $_GET["mode"];
if ($check == "c") {
$suiteClassName = $isLocal ? $_SERVER['argv'][$startPos + 1] : $_GET["class"];
$suiteClassFile = $isLocal ? $_SERVER['argv'][$startPos + 2] : $_GET["file"];
try {
// $testClass = ();
if ($loader == NULL) {
$loader = new PHPUnit_Runner_StandardTestSuiteLoader();
}
$testClass = $loader->load($suiteClassName, $suiteClassFile, FALSE);
} catch (Exception $e) {
myExceptionHandler($e);
return;
}
try {
// if class is a suite
$suiteMethod = $testClass->getMethod('suite');
if ($suiteMethod->isAbstract() || !$suiteMethod->isPublic() || !$suiteMethod->isStatic()) {
return;
}
try {
// ?? suite does not have testName argument
$test = $suiteMethod->invoke(NULL, $testClass->getName());
$test->setName($suiteClassName);
if ($canCountTest) {
print traceCommand("testCount", "count", (string) sizeof($test));
}
self::runTest($test, $suiteClassFile, $arguments);
} catch (ReflectionException $e) {
myExceptionHandler($e);
return;
}
} catch (ReflectionException $e) {
$test = new PHPUnit_Framework_TestSuite($testClass);
if ($canCountTest) {
print traceCommand("testCount", "count", (string) sizeof($test));
}
self::runTest($test, $suiteClassFile, $arguments);
}
} else {
if ($check == "d") {
// if run directory
// in remote case we put this script in the test directory
$suiteDirName = $isLocal ? $_SERVER['argv'][$startPos + 1] : dirname(__FILE__);
if (is_dir($suiteDirName) && !is_file($suiteDirName . '.php')) {
$testCollector = new PHPUnit_Runner_IncludePathTestCollector(array($suiteDirName));
// $test = new PHPUnit_Framework_TestSuite($suiteDirName);
$filenames = $testCollector->collectTests();
$number = 0;
$alltests = array();
foreach ($filenames as $filename) {
$tests = self::collectTestsFromFile($filename);
foreach ($tests as $currenttest) {
$number += sizeof($currenttest);
$alltests[] = $currenttest;
$alltests[] = $filename;
}
}
if ($canCountTest) {
print traceCommand("testCount", "count", (string) $number);
}
for ($i = 0; $i < count($alltests); $i += 2) {
self::runTest($alltests[$i], $alltests[$i + 1], $arguments);
}
return;
}
} else {
if ($check == 'f') {
// if run all in file
$filename = $isLocal ? $_SERVER['argv'][$startPos + 1] : $_GET["file"];
$tests = self::collectTestsFromFile($filename);
$test = new PHPUnit_Framework_TestSuite();
$number = 0;
foreach ($tests as $currenttest) {
if ($tests) {
$test->addTest($currenttest);
$number += sizeof($currenttest);
}
}
if ($canCountTest) {
print traceCommand("testCount", "count", $number);
}
foreach ($tests as $currentTest) {
self::runTest($currentTest, $filename, $arguments);
}
return;
} else {
if ($check == 'm') {
$suiteMethodName = $isLocal ? $_SERVER['argv'][$startPos + 1] : $_GET["method"];
$suiteClassName = $isLocal ? $_SERVER['argv'][$startPos + 2] : $_GET["class"];
$suiteClassFile = $isLocal ? $_SERVER['argv'][$startPos + 3] : $_GET["file"];
try {
$testClass = new PHPUnit_Runner_StandardTestSuiteLoader();
$testClass = $testClass->load($suiteClassName, $suiteClassFile, FALSE);
} catch (Exception $e) {
myExceptionHandler($e);
return;
}
try {
// if class is a suite
$suiteMethod = $testClass->getMethod($suiteMethodName);
if ($suiteMethodName == 'suite') {
if ($suiteMethod->isAbstract() || !$suiteMethod->isPublic() || !$suiteMethod->isStatic()) {
return;
}
try {
$test = $suiteMethod->invoke(NULL, $testClass->getName());
$test->setName($suiteClassName);
if ($canCountTest) {
print traceCommand("testCount", "count", (string) sizeof($test));
}
self::runTest($test, $suiteClassFile, $arguments);
} catch (ReflectionException $e) {
myExceptionHandler($e);
return;
}
} else {
$test = PHPUnit_Framework_TestSuite::createTest($testClass, $suiteMethodName);
$testSuite = new PHPUnit_Framework_TestSuite();
$testSuite->addTest($test);
$testSuite->setName($suiteClassName);
if ($canCountTest) {
print traceCommand("testCount", "count", (string) sizeof($test));
}
self::runTest($testSuite, $suiteClassFile, $arguments);
}
} catch (ReflectionException $e) {
myExceptionHandler($e);
return;
}
} else {
if ($check == 'x') {
$testSuite = $configuration->getTestSuiteConfiguration();
self::runTest($testSuite, "", $arguments);
}
}
}
}
}
}