#!/bin/env php
|
Size: | 14237 |
Storage flags: |
<?php
//=============================================================================
//
// Copyright Francois Laupretre <phk@tekwire.net>
//
// 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 <sb@sebastian-bergmann.de>.
* 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 <phk@tekwire.net>
* @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 "<pre>\n";
$result = $runner->doRun($suite,$arguments);
if (\PHK\Tools\Util::envIsWeb()) echo "</pre>\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 <package> [switches] [UnitTest]\n\n";
if (class_exists('Image_GraphViz', FALSE)) {
print " --log-graphviz <file> Log test execution in GraphViz markup.\n";
}
print " --log-json <file> Log test execution in JSON format.\n" .
" --log-tap <file> Log test execution in TAP format to file.\n" .
" --log-xml <file> Log test execution in XML format to file.\n";
if (extension_loaded('xdebug')) {
print " --log-metrics <file> Write metrics report in XML format.\n" .
" --log-pmd <file> Write violations report in PMD XML format.\n\n" .
" --coverage-html <dir> Generate code coverage report in HTML format.\n" .
" --coverage-xml <file> Write code coverage information in XML format.\n\n";
}
if (extension_loaded('pdo')) {
print " --test-db-dsn <dsn> DSN for the test database.\n" .
" --test-db-log-rev <r> 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 <file> Write agile documentation in HTML format to file.\n" .
" --testdox-text <file> Write agile documentation in Text format to file.\n\n" .
" --filter <pattern> 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 <loader> TestSuiteLoader implementation to use.\n" .
" --repeat <times> 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 <file> 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
//===========================================================================
?>