// // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // //============================================================================= // Please note that most of this file is derived from the code published by // the PHPUnit project (v 3.2.2). // As such, please consider the following notice: /* * PHPUnit * * Copyright (c) 2002-2007, Sebastian Bergmann . * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * Neither the name of Sebastian Bergmann nor the names of his * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ //============================================================================= /** * @copyright Francois Laupretre * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, V 2.0 * @category PHK * @package PHK *///========================================================================== namespace PHK\UnitTest { if (!function_exists('PHK\UnitTest\_phk_load_phpunit_interface')) { function _phk_load_phpunit_interface() { if (!class_exists('PHK\UnitTest\PHPUnit_Runner_PHKTestSuiteLoader',false)) { //============================================================================= /** */ class PHPUnit_Runner_PHKTestSuiteLoader implements \PHPUnit_Runner_TestSuiteLoader { //------------------- public function load($suiteClassName, $suiteClassFile = '') { if (class_exists($suiteClassName, true)) { return new \ReflectionClass($suiteClassName); } else throw new \RuntimeException("Class $suiteClassName could not be found"); } //------------------- public function reload(\ReflectionClass $aClass) { return $aClass; } //--------------------------------- } // End of class //------------------------- } // End of class_exists //============================================================================= if (!class_exists('PHK\UnitTest\PHPUnit_TextUI_PHK',false)) { //============================================================================= /** */ class PHPUnit_TextUI_PHK { //------------------- public static function main() { PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT'); self::handleLoader('PHK\UnitTest\PHPUnit_Runner_PHKTestSuiteLoader'); //---- $arguments=self::handleArguments(); $runner= new \PHPUnit_TextUI_TestRunner; $suite = $runner->getTest($arguments['test'],'',$arguments['syntaxCheck']); try { if (\PHK\Tools\Util::envIsWeb()) echo "
\n";

	$result = $runner->doRun($suite,$arguments);

	if (\PHK\Tools\Util::envIsWeb()) echo "
\n"; } catch (\Exception $e) { throw new \RuntimeException('Could not create and run test suite: ' . $e->getMessage()); } if (!\PHK\Tools\Util::envIsWeb()) { if ($result->wasSuccessful()) exit(\PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); else if($result->errorCount() > 0) exit(\PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); else exit(\PHPUnit_TextUI_TestRunner::FAILURE_EXIT); } } //------------------- /** * @access protected * @static */ protected static function handleArguments() { $arguments = array('syntaxCheck' => TRUE); $longOptions = array( 'configuration=', 'exclude-group=', 'filter=', 'group=', 'help', 'loader=', 'log-json=', 'log-tap=', 'log-xml=', 'repeat=', 'skeleton', 'stop-on-failure', 'tap', 'testdox', 'testdox-html=', 'testdox-text=', 'no-syntax-check', 'verbose', 'version', 'wait'); if (class_exists('Image_GraphViz', FALSE)) $longOptions[] = 'log-graphviz='; if (extension_loaded('pdo')) { $longOptions[] = 'test-db-dsn='; $longOptions[] = 'test-db-log-rev='; $longOptions[] = 'test-db-log-prefix='; $longOptions[] = 'test-db-log-info='; } if (extension_loaded('xdebug')) { $longOptions[] = 'coverage-html='; $longOptions[] = 'coverage-xml='; $longOptions[] = 'log-metrics='; $longOptions[] = 'log-pmd='; $longOptions[] = 'report='; } try { //-- Tests if argv exists - allows to run in web mode $options = \PHPUnit_Util_Getopt::getopt( isset($_SERVER['argv']) ? $_SERVER['argv'] : array(),'d:',$longOptions); } catch (\RuntimeException $e) { \PHPUnit_TextUI_TestRunner::showError($e->getMessage()); } $arguments['test']=(isset($options[1][0]) ? $options[1][0] : 'AllTests'); $arguments['testFile'] = ''; foreach ($options[0] as $option) { switch ($option[0]) { case '--configuration': $arguments['configuration'] = $option[1]; break; case '--coverage-xml': $arguments['coverageXML'] = $option[1]; break; case 'd': $ini = explode('=', $option[1]); if (isset($ini[0])) { if (isset($ini[1])) { ini_set($ini[0], $ini[1]); } else ini_set($ini[0], TRUE); } break; case '--help': self::showHelp(); exit(\PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); break; case '--filter': if (preg_match('/^[a-zA-Z0-9_]/', $option[1])) $arguments['filter'] = '/^' . $option[1] . '$/'; else $arguments['filter'] = $option[1]; break; case '--group': $arguments['groups'] = explode(',', $option[1]); break; case '--exclude-group': $arguments['excludeGroups'] = explode(',', $option[1]); break; case '--loader': self::handleLoader($option[1]); break; case '--log-json': $arguments['jsonLogfile'] = $option[1]; break; case '--log-graphviz': $arguments['graphvizLogfile'] = $option[1]; break; case '--log-tap': $arguments['tapLogfile'] = $option[1]; break; case '--log-xml': $arguments['xmlLogfile'] = $option[1]; break; case '--log-pmd': $arguments['pmdXML'] = $option[1]; break; case '--log-metrics': $arguments['metricsXML'] = $option[1]; break; case '--repeat': $arguments['repeat'] = (int)$option[1]; break; case '--stop-on-failure': $arguments['stopOnFailure'] = TRUE; break; case '--test-db-dsn': $arguments['testDatabaseDSN'] = $option[1]; break; case '--test-db-log-rev': $arguments['testDatabaseLogRevision'] = $option[1]; break; case '--test-db-prefix': $arguments['testDatabasePrefix'] = $option[1]; break; case '--test-db-log-info': $arguments['testDatabaseLogInfo'] = $option[1]; break; case '--coverage-html': case '--report': $arguments['reportDirectory'] = $option[1]; break; case '--skeleton': if (isset($arguments['test'])) self::doSkeleton($arguments['test'],''); else { self::showHelp(); exit(\PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); } break; case '--tap': $arguments['printer'] = new \PHPUnit_Util_Log_TAP; break; case '--testdox': $arguments['printer'] = new \PHPUnit_Util_TestDox_ResultPrinter_Text; break; case '--testdox-html': $arguments['testdoxHTMLFile'] = $option[1]; break; case '--testdox-text': $arguments['testdoxTextFile'] = $option[1]; break; case '--no-syntax-check': $arguments['syntaxCheck'] = FALSE; break; case '--verbose': $arguments['verbose'] = TRUE; break; case '--version': \PHPUnit_TextUI_TestRunner::printVersionString(); exit(\PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); break; case '--wait': $arguments['wait'] = TRUE; break; } } if (!isset($arguments['test']) && isset($arguments['configuration'])) { $configuration= new \PHPUnit_Util_Configuration($arguments['configuration']); $testSuite = $configuration->getTestSuiteConfiguration(); if ($testSuite !== NULL) $arguments['test'] = $testSuite; } if ((isset($arguments['testDatabaseLogRevision']) && !isset($arguments['testDatabaseDSN']))) { self::showHelp(); exit(\PHPUnit_TextUI_TestRunner::EXCEPTION_EXIT); } return $arguments; } /** * @param string $test * @param string $testFile * @access protected * @static */ protected static function doSkeleton($test, $testFile) { if ($test !== FALSE) { \PHPUnit_TextUI_TestRunner::printVersionString(); try { $skeleton = new \PHPUnit_Util_Skeleton($test, $testFile); $skeleton->write(); } catch (\Exception $e) { print $e->getMessage() . "\n"; printf('Could not write test class skeleton for "%s" to "%s".' . "\n", $test,$testFile); exit(\PHPUnit_TextUI_TestRunner::FAILURE_EXIT); } printf('Wrote test class skeleton for "%s" to "%s".' . "\n", $test,$skeleton->getTestSourceFile()); exit(\PHPUnit_TextUI_TestRunner::SUCCESS_EXIT); } } /** * @param string $loaderName * @access protected * @static */ protected static function handleLoader($loaderName) { if (!class_exists($loaderName, FALSE)) { \PHPUnit_Util_Fileloader::checkAndLoad(str_replace('_', '/', $loaderName) . '.php'); } if (class_exists($loaderName, FALSE)) { $class = new \ReflectionClass($loaderName); if ($class->implementsInterface('PHPUnit_Runner_TestSuiteLoader') && $class->isInstantiable()) { $loader = $class->newInstance(); } } if (!isset($loader)) { \PHPUnit_TextUI_TestRunner::showError( sprintf('Could not use "%s" as loader.',$loaderName)); } \PHPUnit_TextUI_TestRunner::setLoader($loader); } /** * @access public * @static */ public static function showHelp() { \PHPUnit_TextUI_TestRunner::printVersionString(); print "Usage: php [switches] [UnitTest]\n\n"; if (class_exists('Image_GraphViz', FALSE)) { print " --log-graphviz Log test execution in GraphViz markup.\n"; } print " --log-json Log test execution in JSON format.\n" . " --log-tap Log test execution in TAP format to file.\n" . " --log-xml Log test execution in XML format to file.\n"; if (extension_loaded('xdebug')) { print " --log-metrics Write metrics report in XML format.\n" . " --log-pmd Write violations report in PMD XML format.\n\n" . " --coverage-html Generate code coverage report in HTML format.\n" . " --coverage-xml Write code coverage information in XML format.\n\n"; } if (extension_loaded('pdo')) { print " --test-db-dsn DSN for the test database.\n" . " --test-db-log-rev Revision information for database logging.\n" . " --test-db-prefix ... Prefix that should be stripped from filenames.\n" . " --test-db-log-info ... Additional information for database logging.\n\n"; } print " --testdox-html Write agile documentation in HTML format to file.\n" . " --testdox-text Write agile documentation in Text format to file.\n\n" . " --filter Filter which tests to run.\n" . " --group ... Only runs tests from the specified group(s).\n" . " --exclude-group ... Exclude tests from the specified group(s).\n\n" . " --loader TestSuiteLoader implementation to use.\n" . " --repeat Runs the test(s) repeatedly.\n\n" . " --tap Report test execution progress in TAP format.\n" . " --testdox Report test execution progress in TestDox format.\n\n" . " --no-syntax-check Disable syntax check of test source files.\n" . " --stop-on-failure Stop execution upon first error or failure.\n" . " --verbose Output more verbose information.\n" . " --wait Waits for a keystroke after each test.\n\n" . " --skeleton Generate skeleton UnitTest class for Unit in Unit.php.\n\n" . " --help Prints this usage information.\n" . " --version Prints the version and exits.\n\n" . " --configuration Read configuration from XML file.\n" . " -d key[=value] Sets a php.ini value.\n"; } //--------------------------------- } // End of class PHPUnit_TextUI_PHK //------------------------- } // End of class_exists('PHPUnit_TextUI_PHK') //============================================================================= } // End of function \PHK\UnitTest\_phk_load_phpunit_interface //============================================================================= } // End of function_exists(\PHK\UnitTest\_phk_load_phpunit_interface) //=========================================================================== } // End of namespace //=========================================================================== ?>