--- /dev/null
+<?php
+/*
+ * This file is part of PHPUnit.
+ *
+ * (c) Sebastian Bergmann <sebastian@phpunit.de>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+use SebastianBergmann\Environment\Runtime;
+
+/**
+ * A TestRunner for the Command Line Interface (CLI)
+ * PHP SAPI Module.
+ *
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit_TextUI_TestRunner extends PHPUnit_Runner_BaseTestRunner
+{
+ const SUCCESS_EXIT = 0;
+ const FAILURE_EXIT = 1;
+ const EXCEPTION_EXIT = 2;
+
+ /**
+ * @var PHP_CodeCoverage_Filter
+ */
+ protected $codeCoverageFilter;
+
+ /**
+ * @var PHPUnit_Runner_TestSuiteLoader
+ */
+ protected $loader = null;
+
+ /**
+ * @var PHPUnit_TextUI_ResultPrinter
+ */
+ protected $printer = null;
+
+ /**
+ * @var bool
+ */
+ protected static $versionStringPrinted = false;
+
+ /**
+ * @var array
+ */
+ private $missingExtensions = array();
+
+ /**
+ * @var Runtime
+ */
+ private $runtime;
+
+ /**
+ * @param PHPUnit_Runner_TestSuiteLoader $loader
+ * @param PHP_CodeCoverage_Filter $filter
+ *
+ * @since Method available since Release 3.4.0
+ */
+ public function __construct(PHPUnit_Runner_TestSuiteLoader $loader = null, PHP_CodeCoverage_Filter $filter = null)
+ {
+ if ($filter === null) {
+ $filter = $this->getCodeCoverageFilter();
+ }
+
+ $this->codeCoverageFilter = $filter;
+ $this->loader = $loader;
+ $this->runtime = new Runtime;
+ }
+
+ /**
+ * @param PHPUnit_Framework_Test|ReflectionClass $test
+ * @param array $arguments
+ *
+ * @return PHPUnit_Framework_TestResult
+ *
+ * @throws PHPUnit_Framework_Exception
+ */
+ public static function run($test, array $arguments = array())
+ {
+ if ($test instanceof ReflectionClass) {
+ $test = new PHPUnit_Framework_TestSuite($test);
+ }
+
+ if ($test instanceof PHPUnit_Framework_Test) {
+ $aTestRunner = new self;
+
+ return $aTestRunner->doRun(
+ $test,
+ $arguments
+ );
+ } else {
+ throw new PHPUnit_Framework_Exception(
+ 'No test case or test suite found.'
+ );
+ }
+ }
+
+ /**
+ * @return PHPUnit_Framework_TestResult
+ */
+ protected function createTestResult()
+ {
+ return new PHPUnit_Framework_TestResult;
+ }
+
+ private function processSuiteFilters(PHPUnit_Framework_TestSuite $suite, array $arguments)
+ {
+ if (!$arguments['filter'] &&
+ empty($arguments['groups']) &&
+ empty($arguments['excludeGroups'])) {
+ return;
+ }
+
+ $filterFactory = new PHPUnit_Runner_Filter_Factory();
+
+ if (!empty($arguments['excludeGroups'])) {
+ $filterFactory->addFilter(
+ new ReflectionClass('PHPUnit_Runner_Filter_Group_Exclude'),
+ $arguments['excludeGroups']
+ );
+ }
+
+ if (!empty($arguments['groups'])) {
+ $filterFactory->addFilter(
+ new ReflectionClass('PHPUnit_Runner_Filter_Group_Include'),
+ $arguments['groups']
+ );
+ }
+
+ if ($arguments['filter']) {
+ $filterFactory->addFilter(
+ new ReflectionClass('PHPUnit_Runner_Filter_Test'),
+ $arguments['filter']
+ );
+ }
+ $suite->injectFilter($filterFactory);
+ }
+
+ /**
+ * @param PHPUnit_Framework_Test $suite
+ * @param array $arguments
+ *
+ * @return PHPUnit_Framework_TestResult
+ */
+ public function doRun(PHPUnit_Framework_Test $suite, array $arguments = array())
+ {
+ if (isset($arguments['configuration'])) {
+ $GLOBALS['__PHPUNIT_CONFIGURATION_FILE'] = $arguments['configuration'];
+ }
+
+ $this->handleConfiguration($arguments);
+
+ $this->processSuiteFilters($suite, $arguments);
+
+ if (isset($arguments['bootstrap'])) {
+ $GLOBALS['__PHPUNIT_BOOTSTRAP'] = $arguments['bootstrap'];
+ }
+
+ if ($arguments['backupGlobals'] === false) {
+ $suite->setBackupGlobals(false);
+ }
+
+ if ($arguments['backupStaticAttributes'] === true) {
+ $suite->setBackupStaticAttributes(true);
+ }
+
+ if ($arguments['disallowChangesToGlobalState'] === true) {
+ $suite->setDisallowChangesToGlobalState(true);
+ }
+
+ if (is_integer($arguments['repeat'])) {
+ $test = new PHPUnit_Extensions_RepeatedTest(
+ $suite,
+ $arguments['repeat'],
+ $arguments['processIsolation']
+ );
+
+ $suite = new PHPUnit_Framework_TestSuite();
+ $suite->addTest($test);
+ }
+
+ $result = $this->createTestResult();
+
+ if (!$arguments['convertErrorsToExceptions']) {
+ $result->convertErrorsToExceptions(false);
+ }
+
+ if (!$arguments['convertNoticesToExceptions']) {
+ PHPUnit_Framework_Error_Notice::$enabled = false;
+ }
+
+ if (!$arguments['convertWarningsToExceptions']) {
+ PHPUnit_Framework_Error_Warning::$enabled = false;
+ }
+
+ if ($arguments['stopOnError']) {
+ $result->stopOnError(true);
+ }
+
+ if ($arguments['stopOnFailure']) {
+ $result->stopOnFailure(true);
+ }
+
+ if ($arguments['stopOnIncomplete']) {
+ $result->stopOnIncomplete(true);
+ }
+
+ if ($arguments['stopOnRisky']) {
+ $result->stopOnRisky(true);
+ }
+
+ if ($arguments['stopOnSkipped']) {
+ $result->stopOnSkipped(true);
+ }
+
+ if ($this->printer === null) {
+ if (isset($arguments['printer']) &&
+ $arguments['printer'] instanceof PHPUnit_Util_Printer) {
+ $this->printer = $arguments['printer'];
+ } else {
+ $printerClass = 'PHPUnit_TextUI_ResultPrinter';
+
+ if (isset($arguments['printer']) &&
+ is_string($arguments['printer']) &&
+ class_exists($arguments['printer'], false)) {
+ $class = new ReflectionClass($arguments['printer']);
+
+ if ($class->isSubclassOf('PHPUnit_TextUI_ResultPrinter')) {
+ $printerClass = $arguments['printer'];
+ }
+ }
+
+ $this->printer = new $printerClass(
+ isset($arguments['stderr']) ? 'php://stderr' : null,
+ $arguments['verbose'],
+ $arguments['colors'],
+ $arguments['debug'],
+ $arguments['columns']
+ );
+ }
+ }
+
+ if (!$this->printer instanceof PHPUnit_Util_Log_TAP) {
+ $this->printer->write(
+ PHPUnit_Runner_Version::getVersionString() . "\n"
+ );
+
+ self::$versionStringPrinted = true;
+
+ if ($arguments['verbose']) {
+ $this->printer->write(
+ sprintf(
+ "\nRuntime:\t%s",
+ $this->runtime->getNameWithVersion()
+ )
+ );
+
+ if ($this->runtime->hasXdebug()) {
+ $this->printer->write(
+ sprintf(
+ ' with Xdebug %s',
+ phpversion('xdebug')
+ )
+ );
+ }
+
+ if (isset($arguments['configuration'])) {
+ $this->printer->write(
+ sprintf(
+ "\nConfiguration:\t%s",
+ $arguments['configuration']->getFilename()
+ )
+ );
+ }
+
+ $this->printer->write("\n");
+ }
+
+ if (isset($arguments['deprecatedStrictModeOption'])) {
+ print "Warning:\tDeprecated option \"--strict\" used\n";
+ } elseif (isset($arguments['deprecatedStrictModeSetting'])) {
+ print "Warning:\tDeprecated configuration setting \"strict\" used\n";
+ }
+
+ if (isset($arguments['deprecatedSeleniumConfiguration'])) {
+ print "Warning:\tDeprecated configuration setting \"selenium\" used\n";
+ }
+ }
+
+ foreach ($arguments['listeners'] as $listener) {
+ $result->addListener($listener);
+ }
+
+ $result->addListener($this->printer);
+
+ if (isset($arguments['testdoxHTMLFile'])) {
+ $result->addListener(
+ new PHPUnit_Util_TestDox_ResultPrinter_HTML(
+ $arguments['testdoxHTMLFile']
+ )
+ );
+ }
+
+ if (isset($arguments['testdoxTextFile'])) {
+ $result->addListener(
+ new PHPUnit_Util_TestDox_ResultPrinter_Text(
+ $arguments['testdoxTextFile']
+ )
+ );
+ }
+
+ $codeCoverageReports = 0;
+
+ if (isset($arguments['coverageClover'])) {
+ $codeCoverageReports++;
+ }
+
+ if (isset($arguments['coverageCrap4J'])) {
+ $codeCoverageReports++;
+ }
+
+ if (isset($arguments['coverageHtml'])) {
+ $codeCoverageReports++;
+ }
+
+ if (isset($arguments['coveragePHP'])) {
+ $codeCoverageReports++;
+ }
+
+ if (isset($arguments['coverageText'])) {
+ $codeCoverageReports++;
+ }
+
+ if (isset($arguments['coverageXml'])) {
+ $codeCoverageReports++;
+ }
+
+ if (isset($arguments['noCoverage'])) {
+ $codeCoverageReports = 0;
+ }
+
+ if ($codeCoverageReports > 0 && (!extension_loaded('tokenizer') || !$this->runtime->canCollectCodeCoverage())) {
+ if (!extension_loaded('tokenizer')) {
+ $this->showExtensionNotLoadedWarning(
+ 'tokenizer',
+ 'No code coverage will be generated.'
+ );
+ } elseif (!extension_loaded('Xdebug')) {
+ $this->showExtensionNotLoadedWarning(
+ 'Xdebug',
+ 'No code coverage will be generated.'
+ );
+ }
+
+ $codeCoverageReports = 0;
+ }
+
+ if (!$this->printer instanceof PHPUnit_Util_Log_TAP) {
+ if ($codeCoverageReports > 0 && !$this->codeCoverageFilter->hasWhitelist()) {
+ $this->printer->write("Warning:\tNo whitelist configured for code coverage\n");
+ }
+
+ $this->printer->write("\n");
+ }
+
+ if ($codeCoverageReports > 0) {
+ $codeCoverage = new PHP_CodeCoverage(
+ null,
+ $this->codeCoverageFilter
+ );
+
+ $codeCoverage->setAddUncoveredFilesFromWhitelist(
+ $arguments['addUncoveredFilesFromWhitelist']
+ );
+
+ $codeCoverage->setCheckForUnintentionallyCoveredCode(
+ $arguments['strictCoverage']
+ );
+
+ $codeCoverage->setProcessUncoveredFilesFromWhitelist(
+ $arguments['processUncoveredFilesFromWhitelist']
+ );
+
+ if (isset($arguments['forceCoversAnnotation'])) {
+ $codeCoverage->setForceCoversAnnotation(
+ $arguments['forceCoversAnnotation']
+ );
+ }
+
+ if (isset($arguments['mapTestClassNameToCoveredClassName'])) {
+ $codeCoverage->setMapTestClassNameToCoveredClassName(
+ $arguments['mapTestClassNameToCoveredClassName']
+ );
+ }
+
+ $result->setCodeCoverage($codeCoverage);
+ }
+
+ if ($codeCoverageReports > 1) {
+ if (isset($arguments['cacheTokens'])) {
+ $codeCoverage->setCacheTokens($arguments['cacheTokens']);
+ }
+ }
+
+ if (isset($arguments['jsonLogfile'])) {
+ $result->addListener(
+ new PHPUnit_Util_Log_JSON($arguments['jsonLogfile'])
+ );
+ }
+
+ if (isset($arguments['tapLogfile'])) {
+ $result->addListener(
+ new PHPUnit_Util_Log_TAP($arguments['tapLogfile'])
+ );
+ }
+
+ if (isset($arguments['junitLogfile'])) {
+ $result->addListener(
+ new PHPUnit_Util_Log_JUnit(
+ $arguments['junitLogfile'],
+ $arguments['logIncompleteSkipped']
+ )
+ );
+ }
+
+ $result->beStrictAboutTestsThatDoNotTestAnything($arguments['reportUselessTests']);
+ $result->beStrictAboutOutputDuringTests($arguments['disallowTestOutput']);
+ $result->beStrictAboutTodoAnnotatedTests($arguments['disallowTodoAnnotatedTests']);
+ $result->beStrictAboutTestSize($arguments['enforceTimeLimit']);
+ $result->setTimeoutForSmallTests($arguments['timeoutForSmallTests']);
+ $result->setTimeoutForMediumTests($arguments['timeoutForMediumTests']);
+ $result->setTimeoutForLargeTests($arguments['timeoutForLargeTests']);
+
+ if ($suite instanceof PHPUnit_Framework_TestSuite) {
+ $suite->setRunTestInSeparateProcess($arguments['processIsolation']);
+ }
+
+ $suite->run($result);
+
+ unset($suite);
+ $result->flushListeners();
+
+ if ($this->printer instanceof PHPUnit_TextUI_ResultPrinter) {
+ $this->printer->printResult($result);
+ }
+
+ if (isset($codeCoverage)) {
+ if (isset($arguments['coverageClover'])) {
+ $this->printer->write(
+ "\nGenerating code coverage report in Clover XML format ..."
+ );
+
+ try {
+ $writer = new PHP_CodeCoverage_Report_Clover;
+ $writer->process($codeCoverage, $arguments['coverageClover']);
+
+ $this->printer->write(" done\n");
+ unset($writer);
+ } catch (PHP_CodeCoverage_Exception $e) {
+ $this->printer->write(
+ " failed\n" . $e->getMessage() . "\n"
+ );
+ }
+ }
+
+ if (isset($arguments['coverageCrap4J'])) {
+ $this->printer->write(
+ "\nGenerating Crap4J report XML file ..."
+ );
+
+ try {
+ $writer = new PHP_CodeCoverage_Report_Crap4j($arguments['crap4jThreshold']);
+ $writer->process($codeCoverage, $arguments['coverageCrap4J']);
+
+ $this->printer->write(" done\n");
+ unset($writer);
+ } catch (PHP_CodeCoverage_Exception $e) {
+ $this->printer->write(
+ " failed\n" . $e->getMessage() . "\n"
+ );
+ }
+ }
+
+ if (isset($arguments['coverageHtml'])) {
+ $this->printer->write(
+ "\nGenerating code coverage report in HTML format ..."
+ );
+
+ try {
+ $writer = new PHP_CodeCoverage_Report_HTML(
+ $arguments['reportLowUpperBound'],
+ $arguments['reportHighLowerBound'],
+ sprintf(
+ ' and <a href="https://phpunit.de/">PHPUnit %s</a>',
+ PHPUnit_Runner_Version::id()
+ )
+ );
+
+ $writer->process($codeCoverage, $arguments['coverageHtml']);
+
+ $this->printer->write(" done\n");
+ unset($writer);
+ } catch (PHP_CodeCoverage_Exception $e) {
+ $this->printer->write(
+ " failed\n" . $e->getMessage() . "\n"
+ );
+ }
+ }
+
+ if (isset($arguments['coveragePHP'])) {
+ $this->printer->write(
+ "\nGenerating code coverage report in PHP format ..."
+ );
+
+ try {
+ $writer = new PHP_CodeCoverage_Report_PHP;
+ $writer->process($codeCoverage, $arguments['coveragePHP']);
+
+ $this->printer->write(" done\n");
+ unset($writer);
+ } catch (PHP_CodeCoverage_Exception $e) {
+ $this->printer->write(
+ " failed\n" . $e->getMessage() . "\n"
+ );
+ }
+ }
+
+ if (isset($arguments['coverageText'])) {
+ if ($arguments['coverageText'] == 'php://stdout') {
+ $outputStream = $this->printer;
+ $colors = $arguments['colors'] && $arguments['colors'] != PHPUnit_TextUI_ResultPrinter::COLOR_NEVER;
+ } else {
+ $outputStream = new PHPUnit_Util_Printer($arguments['coverageText']);
+ $colors = false;
+ }
+
+ $processor = new PHP_CodeCoverage_Report_Text(
+ $arguments['reportLowUpperBound'],
+ $arguments['reportHighLowerBound'],
+ $arguments['coverageTextShowUncoveredFiles'],
+ $arguments['coverageTextShowOnlySummary']
+ );
+
+ $outputStream->write(
+ $processor->process($codeCoverage, $colors)
+ );
+ }
+
+ if (isset($arguments['coverageXml'])) {
+ $this->printer->write(
+ "\nGenerating code coverage report in PHPUnit XML format ..."
+ );
+
+ try {
+ $writer = new PHP_CodeCoverage_Report_XML;
+ $writer->process($codeCoverage, $arguments['coverageXml']);
+
+ $this->printer->write(" done\n");
+ unset($writer);
+ } catch (PHP_CodeCoverage_Exception $e) {
+ $this->printer->write(
+ " failed\n" . $e->getMessage() . "\n"
+ );
+ }
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param PHPUnit_TextUI_ResultPrinter $resultPrinter
+ */
+ public function setPrinter(PHPUnit_TextUI_ResultPrinter $resultPrinter)
+ {
+ $this->printer = $resultPrinter;
+ }
+
+ /**
+ * Override to define how to handle a failed loading of
+ * a test suite.
+ *
+ * @param string $message
+ */
+ protected function runFailed($message)
+ {
+ $this->write($message . PHP_EOL);
+ exit(self::FAILURE_EXIT);
+ }
+
+ /**
+ * @param string $buffer
+ *
+ * @since Method available since Release 3.1.0
+ */
+ protected function write($buffer)
+ {
+ if (PHP_SAPI != 'cli' && PHP_SAPI != 'phpdbg') {
+ $buffer = htmlspecialchars($buffer);
+ }
+
+ if ($this->printer !== null) {
+ $this->printer->write($buffer);
+ } else {
+ print $buffer;
+ }
+ }
+
+ /**
+ * Returns the loader to be used.
+ *
+ * @return PHPUnit_Runner_TestSuiteLoader
+ *
+ * @since Method available since Release 2.2.0
+ */
+ public function getLoader()
+ {
+ if ($this->loader === null) {
+ $this->loader = new PHPUnit_Runner_StandardTestSuiteLoader;
+ }
+
+ return $this->loader;
+ }
+
+ /**
+ * @param array $arguments
+ *
+ * @since Method available since Release 3.2.1
+ */
+ protected function handleConfiguration(array &$arguments)
+ {
+ if (isset($arguments['configuration']) &&
+ !$arguments['configuration'] instanceof PHPUnit_Util_Configuration) {
+ $arguments['configuration'] = PHPUnit_Util_Configuration::getInstance(
+ $arguments['configuration']
+ );
+ }
+
+ $arguments['debug'] = isset($arguments['debug']) ? $arguments['debug'] : false;
+ $arguments['filter'] = isset($arguments['filter']) ? $arguments['filter'] : false;
+ $arguments['listeners'] = isset($arguments['listeners']) ? $arguments['listeners'] : array();
+
+ if (isset($arguments['configuration'])) {
+ $arguments['configuration']->handlePHPConfiguration();
+
+ $phpunitConfiguration = $arguments['configuration']->getPHPUnitConfiguration();
+
+ if (isset($phpunitConfiguration['deprecatedStrictModeSetting'])) {
+ $arguments['deprecatedStrictModeSetting'] = true;
+ }
+
+ if (isset($phpunitConfiguration['backupGlobals']) &&
+ !isset($arguments['backupGlobals'])) {
+ $arguments['backupGlobals'] = $phpunitConfiguration['backupGlobals'];
+ }
+
+ if (isset($phpunitConfiguration['backupStaticAttributes']) &&
+ !isset($arguments['backupStaticAttributes'])) {
+ $arguments['backupStaticAttributes'] = $phpunitConfiguration['backupStaticAttributes'];
+ }
+
+ if (isset($phpunitConfiguration['disallowChangesToGlobalState']) &&
+ !isset($arguments['disallowChangesToGlobalState'])) {
+ $arguments['disallowChangesToGlobalState'] = $phpunitConfiguration['disallowChangesToGlobalState'];
+ }
+
+ if (isset($phpunitConfiguration['bootstrap']) &&
+ !isset($arguments['bootstrap'])) {
+ $arguments['bootstrap'] = $phpunitConfiguration['bootstrap'];
+ }
+
+ if (isset($phpunitConfiguration['cacheTokens']) &&
+ !isset($arguments['cacheTokens'])) {
+ $arguments['cacheTokens'] = $phpunitConfiguration['cacheTokens'];
+ }
+
+ if (isset($phpunitConfiguration['colors']) &&
+ !isset($arguments['colors'])) {
+ $arguments['colors'] = $phpunitConfiguration['colors'];
+ }
+
+ if (isset($phpunitConfiguration['convertErrorsToExceptions']) &&
+ !isset($arguments['convertErrorsToExceptions'])) {
+ $arguments['convertErrorsToExceptions'] = $phpunitConfiguration['convertErrorsToExceptions'];
+ }
+
+ if (isset($phpunitConfiguration['convertNoticesToExceptions']) &&
+ !isset($arguments['convertNoticesToExceptions'])) {
+ $arguments['convertNoticesToExceptions'] = $phpunitConfiguration['convertNoticesToExceptions'];
+ }
+
+ if (isset($phpunitConfiguration['convertWarningsToExceptions']) &&
+ !isset($arguments['convertWarningsToExceptions'])) {
+ $arguments['convertWarningsToExceptions'] = $phpunitConfiguration['convertWarningsToExceptions'];
+ }
+
+ if (isset($phpunitConfiguration['processIsolation']) &&
+ !isset($arguments['processIsolation'])) {
+ $arguments['processIsolation'] = $phpunitConfiguration['processIsolation'];
+ }
+
+ if (isset($phpunitConfiguration['stopOnError']) &&
+ !isset($arguments['stopOnError'])) {
+ $arguments['stopOnError'] = $phpunitConfiguration['stopOnError'];
+ }
+
+ if (isset($phpunitConfiguration['stopOnFailure']) &&
+ !isset($arguments['stopOnFailure'])) {
+ $arguments['stopOnFailure'] = $phpunitConfiguration['stopOnFailure'];
+ }
+
+ if (isset($phpunitConfiguration['stopOnIncomplete']) &&
+ !isset($arguments['stopOnIncomplete'])) {
+ $arguments['stopOnIncomplete'] = $phpunitConfiguration['stopOnIncomplete'];
+ }
+
+ if (isset($phpunitConfiguration['stopOnRisky']) &&
+ !isset($arguments['stopOnRisky'])) {
+ $arguments['stopOnRisky'] = $phpunitConfiguration['stopOnRisky'];
+ }
+
+ if (isset($phpunitConfiguration['stopOnSkipped']) &&
+ !isset($arguments['stopOnSkipped'])) {
+ $arguments['stopOnSkipped'] = $phpunitConfiguration['stopOnSkipped'];
+ }
+
+ if (isset($phpunitConfiguration['timeoutForSmallTests']) &&
+ !isset($arguments['timeoutForSmallTests'])) {
+ $arguments['timeoutForSmallTests'] = $phpunitConfiguration['timeoutForSmallTests'];
+ }
+
+ if (isset($phpunitConfiguration['timeoutForMediumTests']) &&
+ !isset($arguments['timeoutForMediumTests'])) {
+ $arguments['timeoutForMediumTests'] = $phpunitConfiguration['timeoutForMediumTests'];
+ }
+
+ if (isset($phpunitConfiguration['timeoutForLargeTests']) &&
+ !isset($arguments['timeoutForLargeTests'])) {
+ $arguments['timeoutForLargeTests'] = $phpunitConfiguration['timeoutForLargeTests'];
+ }
+
+ if (isset($phpunitConfiguration['reportUselessTests']) &&
+ !isset($arguments['reportUselessTests'])) {
+ $arguments['reportUselessTests'] = $phpunitConfiguration['reportUselessTests'];
+ }
+
+ if (isset($phpunitConfiguration['strictCoverage']) &&
+ !isset($arguments['strictCoverage'])) {
+ $arguments['strictCoverage'] = $phpunitConfiguration['strictCoverage'];
+ }
+
+ if (isset($phpunitConfiguration['disallowTestOutput']) &&
+ !isset($arguments['disallowTestOutput'])) {
+ $arguments['disallowTestOutput'] = $phpunitConfiguration['disallowTestOutput'];
+ }
+
+ if (isset($phpunitConfiguration['enforceTimeLimit']) &&
+ !isset($arguments['enforceTimeLimit'])) {
+ $arguments['enforceTimeLimit'] = $phpunitConfiguration['enforceTimeLimit'];
+ }
+
+ if (isset($phpunitConfiguration['disallowTodoAnnotatedTests']) &&
+ !isset($arguments['disallowTodoAnnotatedTests'])) {
+ $arguments['disallowTodoAnnotatedTests'] = $phpunitConfiguration['disallowTodoAnnotatedTests'];
+ }
+
+ if (isset($phpunitConfiguration['verbose']) &&
+ !isset($arguments['verbose'])) {
+ $arguments['verbose'] = $phpunitConfiguration['verbose'];
+ }
+
+ if (isset($phpunitConfiguration['forceCoversAnnotation']) &&
+ !isset($arguments['forceCoversAnnotation'])) {
+ $arguments['forceCoversAnnotation'] = $phpunitConfiguration['forceCoversAnnotation'];
+ }
+
+ if (isset($phpunitConfiguration['mapTestClassNameToCoveredClassName']) &&
+ !isset($arguments['mapTestClassNameToCoveredClassName'])) {
+ $arguments['mapTestClassNameToCoveredClassName'] = $phpunitConfiguration['mapTestClassNameToCoveredClassName'];
+ }
+
+ $groupCliArgs = array();
+
+ if (!empty($arguments['groups'])) {
+ $groupCliArgs = $arguments['groups'];
+ }
+
+ $groupConfiguration = $arguments['configuration']->getGroupConfiguration();
+
+ if (!empty($groupConfiguration['include']) &&
+ !isset($arguments['groups'])) {
+ $arguments['groups'] = $groupConfiguration['include'];
+ }
+
+ if (!empty($groupConfiguration['exclude']) &&
+ !isset($arguments['excludeGroups'])) {
+ $arguments['excludeGroups'] = array_diff($groupConfiguration['exclude'], $groupCliArgs);
+ }
+
+ foreach ($arguments['configuration']->getListenerConfiguration() as $listener) {
+ if (!class_exists($listener['class'], false) &&
+ $listener['file'] !== '') {
+ require_once $listener['file'];
+ }
+
+ if (class_exists($listener['class'])) {
+ if (count($listener['arguments']) == 0) {
+ $listener = new $listener['class'];
+ } else {
+ $listenerClass = new ReflectionClass(
+ $listener['class']
+ );
+ $listener = $listenerClass->newInstanceArgs(
+ $listener['arguments']
+ );
+ }
+
+ if ($listener instanceof PHPUnit_Framework_TestListener) {
+ $arguments['listeners'][] = $listener;
+ }
+ }
+ }
+
+ $loggingConfiguration = $arguments['configuration']->getLoggingConfiguration();
+
+ if (isset($loggingConfiguration['coverage-clover']) &&
+ !isset($arguments['coverageClover'])) {
+ $arguments['coverageClover'] = $loggingConfiguration['coverage-clover'];
+ }
+
+ if (isset($loggingConfiguration['coverage-crap4j']) &&
+ !isset($arguments['coverageCrap4J'])) {
+ $arguments['coverageCrap4J'] = $loggingConfiguration['coverage-crap4j'];
+
+ if (isset($loggingConfiguration['crap4jThreshold']) &&
+ !isset($arguments['crap4jThreshold'])) {
+ $arguments['crap4jThreshold'] = $loggingConfiguration['crap4jThreshold'];
+ }
+ }
+
+ if (isset($loggingConfiguration['coverage-html']) &&
+ !isset($arguments['coverageHtml'])) {
+ if (isset($loggingConfiguration['lowUpperBound']) &&
+ !isset($arguments['reportLowUpperBound'])) {
+ $arguments['reportLowUpperBound'] = $loggingConfiguration['lowUpperBound'];
+ }
+
+ if (isset($loggingConfiguration['highLowerBound']) &&
+ !isset($arguments['reportHighLowerBound'])) {
+ $arguments['reportHighLowerBound'] = $loggingConfiguration['highLowerBound'];
+ }
+
+ $arguments['coverageHtml'] = $loggingConfiguration['coverage-html'];
+ }
+
+ if (isset($loggingConfiguration['coverage-php']) &&
+ !isset($arguments['coveragePHP'])) {
+ $arguments['coveragePHP'] = $loggingConfiguration['coverage-php'];
+ }
+
+ if (isset($loggingConfiguration['coverage-text']) &&
+ !isset($arguments['coverageText'])) {
+ $arguments['coverageText'] = $loggingConfiguration['coverage-text'];
+ if (isset($loggingConfiguration['coverageTextShowUncoveredFiles'])) {
+ $arguments['coverageTextShowUncoveredFiles'] = $loggingConfiguration['coverageTextShowUncoveredFiles'];
+ } else {
+ $arguments['coverageTextShowUncoveredFiles'] = false;
+ }
+ if (isset($loggingConfiguration['coverageTextShowOnlySummary'])) {
+ $arguments['coverageTextShowOnlySummary'] = $loggingConfiguration['coverageTextShowOnlySummary'];
+ } else {
+ $arguments['coverageTextShowOnlySummary'] = false;
+ }
+ }
+
+ if (isset($loggingConfiguration['coverage-xml']) &&
+ !isset($arguments['coverageXml'])) {
+ $arguments['coverageXml'] = $loggingConfiguration['coverage-xml'];
+ }
+
+ if (isset($loggingConfiguration['json']) &&
+ !isset($arguments['jsonLogfile'])) {
+ $arguments['jsonLogfile'] = $loggingConfiguration['json'];
+ }
+
+ if (isset($loggingConfiguration['plain'])) {
+ $arguments['listeners'][] = new PHPUnit_TextUI_ResultPrinter(
+ $loggingConfiguration['plain'],
+ true
+ );
+ }
+
+ if (isset($loggingConfiguration['tap']) &&
+ !isset($arguments['tapLogfile'])) {
+ $arguments['tapLogfile'] = $loggingConfiguration['tap'];
+ }
+
+ if (isset($loggingConfiguration['junit']) &&
+ !isset($arguments['junitLogfile'])) {
+ $arguments['junitLogfile'] = $loggingConfiguration['junit'];
+
+ if (isset($loggingConfiguration['logIncompleteSkipped']) &&
+ !isset($arguments['logIncompleteSkipped'])) {
+ $arguments['logIncompleteSkipped'] = $loggingConfiguration['logIncompleteSkipped'];
+ }
+ }
+
+ if (isset($loggingConfiguration['testdox-html']) &&
+ !isset($arguments['testdoxHTMLFile'])) {
+ $arguments['testdoxHTMLFile'] = $loggingConfiguration['testdox-html'];
+ }
+
+ if (isset($loggingConfiguration['testdox-text']) &&
+ !isset($arguments['testdoxTextFile'])) {
+ $arguments['testdoxTextFile'] = $loggingConfiguration['testdox-text'];
+ }
+
+ if ((isset($arguments['coverageClover']) ||
+ isset($arguments['coverageCrap4J']) ||
+ isset($arguments['coverageHtml']) ||
+ isset($arguments['coveragePHP']) ||
+ isset($arguments['coverageText']) ||
+ isset($arguments['coverageXml'])) &&
+ $this->runtime->canCollectCodeCoverage()) {
+ $filterConfiguration = $arguments['configuration']->getFilterConfiguration();
+ $arguments['addUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['addUncoveredFilesFromWhitelist'];
+ $arguments['processUncoveredFilesFromWhitelist'] = $filterConfiguration['whitelist']['processUncoveredFilesFromWhitelist'];
+
+ if (empty($filterConfiguration['whitelist']['include']['directory']) &&
+ empty($filterConfiguration['whitelist']['include']['file'])) {
+ foreach ($filterConfiguration['blacklist']['include']['directory'] as $dir) {
+ $this->codeCoverageFilter->addDirectoryToBlacklist(
+ $dir['path'],
+ $dir['suffix'],
+ $dir['prefix'],
+ $dir['group']
+ );
+ }
+
+ foreach ($filterConfiguration['blacklist']['include']['file'] as $file) {
+ $this->codeCoverageFilter->addFileToBlacklist($file);
+ }
+
+ foreach ($filterConfiguration['blacklist']['exclude']['directory'] as $dir) {
+ $this->codeCoverageFilter->removeDirectoryFromBlacklist(
+ $dir['path'],
+ $dir['suffix'],
+ $dir['prefix'],
+ $dir['group']
+ );
+ }
+
+ foreach ($filterConfiguration['blacklist']['exclude']['file'] as $file) {
+ $this->codeCoverageFilter->removeFileFromBlacklist($file);
+ }
+ }
+
+ foreach ($filterConfiguration['whitelist']['include']['directory'] as $dir) {
+ $this->codeCoverageFilter->addDirectoryToWhitelist(
+ $dir['path'],
+ $dir['suffix'],
+ $dir['prefix']
+ );
+ }
+
+ foreach ($filterConfiguration['whitelist']['include']['file'] as $file) {
+ $this->codeCoverageFilter->addFileToWhitelist($file);
+ }
+
+ foreach ($filterConfiguration['whitelist']['exclude']['directory'] as $dir) {
+ $this->codeCoverageFilter->removeDirectoryFromWhitelist(
+ $dir['path'],
+ $dir['suffix'],
+ $dir['prefix']
+ );
+ }
+
+ foreach ($filterConfiguration['whitelist']['exclude']['file'] as $file) {
+ $this->codeCoverageFilter->removeFileFromWhitelist($file);
+ }
+ }
+ }
+
+ $arguments['addUncoveredFilesFromWhitelist'] = isset($arguments['addUncoveredFilesFromWhitelist']) ? $arguments['addUncoveredFilesFromWhitelist'] : true;
+ $arguments['processUncoveredFilesFromWhitelist'] = isset($arguments['processUncoveredFilesFromWhitelist']) ? $arguments['processUncoveredFilesFromWhitelist'] : false;
+ $arguments['backupGlobals'] = isset($arguments['backupGlobals']) ? $arguments['backupGlobals'] : null;
+ $arguments['backupStaticAttributes'] = isset($arguments['backupStaticAttributes']) ? $arguments['backupStaticAttributes'] : null;
+ $arguments['disallowChangesToGlobalState'] = isset($arguments['disallowChangesToGlobalState']) ? $arguments['disallowChangesToGlobalState'] : null;
+ $arguments['cacheTokens'] = isset($arguments['cacheTokens']) ? $arguments['cacheTokens'] : false;
+ $arguments['columns'] = isset($arguments['columns']) ? $arguments['columns'] : 80;
+ $arguments['colors'] = isset($arguments['colors']) ? $arguments['colors'] : PHPUnit_TextUI_ResultPrinter::COLOR_DEFAULT;
+ $arguments['convertErrorsToExceptions'] = isset($arguments['convertErrorsToExceptions']) ? $arguments['convertErrorsToExceptions'] : true;
+ $arguments['convertNoticesToExceptions'] = isset($arguments['convertNoticesToExceptions']) ? $arguments['convertNoticesToExceptions'] : true;
+ $arguments['convertWarningsToExceptions'] = isset($arguments['convertWarningsToExceptions']) ? $arguments['convertWarningsToExceptions'] : true;
+ $arguments['excludeGroups'] = isset($arguments['excludeGroups']) ? $arguments['excludeGroups'] : array();
+ $arguments['groups'] = isset($arguments['groups']) ? $arguments['groups'] : array();
+ $arguments['logIncompleteSkipped'] = isset($arguments['logIncompleteSkipped']) ? $arguments['logIncompleteSkipped'] : false;
+ $arguments['processIsolation'] = isset($arguments['processIsolation']) ? $arguments['processIsolation'] : false;
+ $arguments['repeat'] = isset($arguments['repeat']) ? $arguments['repeat'] : false;
+ $arguments['reportHighLowerBound'] = isset($arguments['reportHighLowerBound']) ? $arguments['reportHighLowerBound'] : 90;
+ $arguments['reportLowUpperBound'] = isset($arguments['reportLowUpperBound']) ? $arguments['reportLowUpperBound'] : 50;
+ $arguments['crap4jThreshold'] = isset($arguments['crap4jThreshold']) ? $arguments['crap4jThreshold'] : 30;
+ $arguments['stopOnError'] = isset($arguments['stopOnError']) ? $arguments['stopOnError'] : false;
+ $arguments['stopOnFailure'] = isset($arguments['stopOnFailure']) ? $arguments['stopOnFailure'] : false;
+ $arguments['stopOnIncomplete'] = isset($arguments['stopOnIncomplete']) ? $arguments['stopOnIncomplete'] : false;
+ $arguments['stopOnRisky'] = isset($arguments['stopOnRisky']) ? $arguments['stopOnRisky'] : false;
+ $arguments['stopOnSkipped'] = isset($arguments['stopOnSkipped']) ? $arguments['stopOnSkipped'] : false;
+ $arguments['timeoutForSmallTests'] = isset($arguments['timeoutForSmallTests']) ? $arguments['timeoutForSmallTests'] : 1;
+ $arguments['timeoutForMediumTests'] = isset($arguments['timeoutForMediumTests']) ? $arguments['timeoutForMediumTests'] : 10;
+ $arguments['timeoutForLargeTests'] = isset($arguments['timeoutForLargeTests']) ? $arguments['timeoutForLargeTests'] : 60;
+ $arguments['reportUselessTests'] = isset($arguments['reportUselessTests']) ? $arguments['reportUselessTests'] : false;
+ $arguments['strictCoverage'] = isset($arguments['strictCoverage']) ? $arguments['strictCoverage'] : false;
+ $arguments['disallowTestOutput'] = isset($arguments['disallowTestOutput']) ? $arguments['disallowTestOutput'] : false;
+ $arguments['enforceTimeLimit'] = isset($arguments['enforceTimeLimit']) ? $arguments['enforceTimeLimit'] : false;
+ $arguments['disallowTodoAnnotatedTests'] = isset($arguments['disallowTodoAnnotatedTests']) ? $arguments['disallowTodoAnnotatedTests'] : false;
+ $arguments['verbose'] = isset($arguments['verbose']) ? $arguments['verbose'] : false;
+ }
+
+ /**
+ * @param $extension
+ * @param string $message
+ *
+ * @since Method available since Release 4.7.3
+ */
+ private function showExtensionNotLoadedWarning($extension, $message = '')
+ {
+ if (isset($this->missingExtensions[$extension])) {
+ return;
+ }
+
+ $this->write("Warning:\t" . 'The ' . $extension . ' extension is not loaded' . "\n");
+
+ if (!empty($message)) {
+ $this->write("\t\t" . $message . "\n");
+ }
+
+ $this->missingExtensions[$extension] = true;
+ }
+
+ /**
+ * @return PHP_CodeCoverage_Filter
+ */
+ private function getCodeCoverageFilter()
+ {
+ $filter = new PHP_CodeCoverage_Filter;
+
+ if (defined('__PHPUNIT_PHAR__')) {
+ $filter->addFileToBlacklist(__PHPUNIT_PHAR__);
+ }
+
+ $blacklist = new PHPUnit_Util_Blacklist;
+
+ foreach ($blacklist->getBlacklistedDirectories() as $directory) {
+ $filter->addDirectoryToBlacklist($directory);
+ }
+
+ return $filter;
+ }
+}