--- /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.
+ */
+
+/**
+ * A TestResult collects the results of executing a test case.
+ *
+ * @since Class available since Release 2.0.0
+ */
+class PHPUnit_Framework_TestResult implements Countable
+{
+ /**
+ * @var array
+ */
+ protected $passed = array();
+
+ /**
+ * @var array
+ */
+ protected $errors = array();
+
+ /**
+ * @var array
+ */
+ protected $failures = array();
+
+ /**
+ * @var array
+ */
+ protected $notImplemented = array();
+
+ /**
+ * @var array
+ */
+ protected $risky = array();
+
+ /**
+ * @var array
+ */
+ protected $skipped = array();
+
+ /**
+ * @var array
+ */
+ protected $listeners = array();
+
+ /**
+ * @var int
+ */
+ protected $runTests = 0;
+
+ /**
+ * @var float
+ */
+ protected $time = 0;
+
+ /**
+ * @var PHPUnit_Framework_TestSuite
+ */
+ protected $topTestSuite = null;
+
+ /**
+ * Code Coverage information.
+ *
+ * @var PHP_CodeCoverage
+ */
+ protected $codeCoverage;
+
+ /**
+ * @var bool
+ */
+ protected $convertErrorsToExceptions = true;
+
+ /**
+ * @var bool
+ */
+ protected $stop = false;
+
+ /**
+ * @var bool
+ */
+ protected $stopOnError = false;
+
+ /**
+ * @var bool
+ */
+ protected $stopOnFailure = false;
+
+ /**
+ * @var bool
+ */
+ protected $beStrictAboutTestsThatDoNotTestAnything = false;
+
+ /**
+ * @var bool
+ */
+ protected $beStrictAboutOutputDuringTests = false;
+
+ /**
+ * @var bool
+ */
+ protected $beStrictAboutTestSize = false;
+
+ /**
+ * @var bool
+ */
+ protected $beStrictAboutTodoAnnotatedTests = false;
+
+ /**
+ * @var bool
+ */
+ protected $stopOnRisky = false;
+
+ /**
+ * @var bool
+ */
+ protected $stopOnIncomplete = false;
+
+ /**
+ * @var bool
+ */
+ protected $stopOnSkipped = false;
+
+ /**
+ * @var bool
+ */
+ protected $lastTestFailed = false;
+
+ /**
+ * @var int
+ */
+ protected $timeoutForSmallTests = 1;
+
+ /**
+ * @var int
+ */
+ protected $timeoutForMediumTests = 10;
+
+ /**
+ * @var int
+ */
+ protected $timeoutForLargeTests = 60;
+
+ /**
+ * Registers a TestListener.
+ *
+ * @param PHPUnit_Framework_TestListener
+ */
+ public function addListener(PHPUnit_Framework_TestListener $listener)
+ {
+ $this->listeners[] = $listener;
+ }
+
+ /**
+ * Unregisters a TestListener.
+ *
+ * @param PHPUnit_Framework_TestListener $listener
+ */
+ public function removeListener(PHPUnit_Framework_TestListener $listener)
+ {
+ foreach ($this->listeners as $key => $_listener) {
+ if ($listener === $_listener) {
+ unset($this->listeners[$key]);
+ }
+ }
+ }
+
+ /**
+ * Flushes all flushable TestListeners.
+ *
+ * @since Method available since Release 3.0.0
+ */
+ public function flushListeners()
+ {
+ foreach ($this->listeners as $listener) {
+ if ($listener instanceof PHPUnit_Util_Printer) {
+ $listener->flush();
+ }
+ }
+ }
+
+ /**
+ * Adds an error to the list of errors.
+ *
+ * @param PHPUnit_Framework_Test $test
+ * @param Exception $e
+ * @param float $time
+ */
+ public function addError(PHPUnit_Framework_Test $test, Exception $e, $time)
+ {
+ if ($e instanceof PHPUnit_Framework_RiskyTest) {
+ $this->risky[] = new PHPUnit_Framework_TestFailure($test, $e);
+ $notifyMethod = 'addRiskyTest';
+
+ if ($this->stopOnRisky) {
+ $this->stop();
+ }
+ } elseif ($e instanceof PHPUnit_Framework_IncompleteTest) {
+ $this->notImplemented[] = new PHPUnit_Framework_TestFailure($test, $e);
+ $notifyMethod = 'addIncompleteTest';
+
+ if ($this->stopOnIncomplete) {
+ $this->stop();
+ }
+ } elseif ($e instanceof PHPUnit_Framework_SkippedTest) {
+ $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e);
+ $notifyMethod = 'addSkippedTest';
+
+ if ($this->stopOnSkipped) {
+ $this->stop();
+ }
+ } else {
+ $this->errors[] = new PHPUnit_Framework_TestFailure($test, $e);
+ $notifyMethod = 'addError';
+
+ if ($this->stopOnError || $this->stopOnFailure) {
+ $this->stop();
+ }
+ }
+
+ foreach ($this->listeners as $listener) {
+ $listener->$notifyMethod($test, $e, $time);
+ }
+
+ $this->lastTestFailed = true;
+ $this->time += $time;
+ }
+
+ /**
+ * Adds a failure to the list of failures.
+ * The passed in exception caused the failure.
+ *
+ * @param PHPUnit_Framework_Test $test
+ * @param PHPUnit_Framework_AssertionFailedError $e
+ * @param float $time
+ */
+ public function addFailure(PHPUnit_Framework_Test $test, PHPUnit_Framework_AssertionFailedError $e, $time)
+ {
+ if ($e instanceof PHPUnit_Framework_RiskyTest ||
+ $e instanceof PHPUnit_Framework_OutputError) {
+ $this->risky[] = new PHPUnit_Framework_TestFailure($test, $e);
+ $notifyMethod = 'addRiskyTest';
+
+ if ($this->stopOnRisky) {
+ $this->stop();
+ }
+ } elseif ($e instanceof PHPUnit_Framework_IncompleteTest) {
+ $this->notImplemented[] = new PHPUnit_Framework_TestFailure($test, $e);
+ $notifyMethod = 'addIncompleteTest';
+
+ if ($this->stopOnIncomplete) {
+ $this->stop();
+ }
+ } elseif ($e instanceof PHPUnit_Framework_SkippedTest) {
+ $this->skipped[] = new PHPUnit_Framework_TestFailure($test, $e);
+ $notifyMethod = 'addSkippedTest';
+
+ if ($this->stopOnSkipped) {
+ $this->stop();
+ }
+ } else {
+ $this->failures[] = new PHPUnit_Framework_TestFailure($test, $e);
+ $notifyMethod = 'addFailure';
+
+ if ($this->stopOnFailure) {
+ $this->stop();
+ }
+ }
+
+ foreach ($this->listeners as $listener) {
+ $listener->$notifyMethod($test, $e, $time);
+ }
+
+ $this->lastTestFailed = true;
+ $this->time += $time;
+ }
+
+ /**
+ * Informs the result that a testsuite will be started.
+ *
+ * @param PHPUnit_Framework_TestSuite $suite
+ *
+ * @since Method available since Release 2.2.0
+ */
+ public function startTestSuite(PHPUnit_Framework_TestSuite $suite)
+ {
+ if ($this->topTestSuite === null) {
+ $this->topTestSuite = $suite;
+ }
+
+ foreach ($this->listeners as $listener) {
+ $listener->startTestSuite($suite);
+ }
+ }
+
+ /**
+ * Informs the result that a testsuite was completed.
+ *
+ * @param PHPUnit_Framework_TestSuite $suite
+ *
+ * @since Method available since Release 2.2.0
+ */
+ public function endTestSuite(PHPUnit_Framework_TestSuite $suite)
+ {
+ foreach ($this->listeners as $listener) {
+ $listener->endTestSuite($suite);
+ }
+ }
+
+ /**
+ * Informs the result that a test will be started.
+ *
+ * @param PHPUnit_Framework_Test $test
+ */
+ public function startTest(PHPUnit_Framework_Test $test)
+ {
+ $this->lastTestFailed = false;
+ $this->runTests += count($test);
+
+ foreach ($this->listeners as $listener) {
+ $listener->startTest($test);
+ }
+ }
+
+ /**
+ * Informs the result that a test was completed.
+ *
+ * @param PHPUnit_Framework_Test $test
+ * @param float $time
+ */
+ public function endTest(PHPUnit_Framework_Test $test, $time)
+ {
+ foreach ($this->listeners as $listener) {
+ $listener->endTest($test, $time);
+ }
+
+ if (!$this->lastTestFailed && $test instanceof PHPUnit_Framework_TestCase) {
+ $class = get_class($test);
+ $key = $class . '::' . $test->getName();
+
+ $this->passed[$key] = array(
+ 'result' => $test->getResult(),
+ 'size' => PHPUnit_Util_Test::getSize(
+ $class,
+ $test->getName(false)
+ )
+ );
+
+ $this->time += $time;
+ }
+ }
+
+ /**
+ * Returns true if no risky test occurred.
+ *
+ * @return bool
+ *
+ * @since Method available since Release 4.0.0
+ */
+ public function allHarmless()
+ {
+ return $this->riskyCount() == 0;
+ }
+
+ /**
+ * Gets the number of risky tests.
+ *
+ * @return int
+ *
+ * @since Method available since Release 4.0.0
+ */
+ public function riskyCount()
+ {
+ return count($this->risky);
+ }
+
+ /**
+ * Returns true if no incomplete test occurred.
+ *
+ * @return bool
+ */
+ public function allCompletelyImplemented()
+ {
+ return $this->notImplementedCount() == 0;
+ }
+
+ /**
+ * Gets the number of incomplete tests.
+ *
+ * @return int
+ */
+ public function notImplementedCount()
+ {
+ return count($this->notImplemented);
+ }
+
+ /**
+ * Returns an Enumeration for the risky tests.
+ *
+ * @return array
+ *
+ * @since Method available since Release 4.0.0
+ */
+ public function risky()
+ {
+ return $this->risky;
+ }
+
+ /**
+ * Returns an Enumeration for the incomplete tests.
+ *
+ * @return array
+ */
+ public function notImplemented()
+ {
+ return $this->notImplemented;
+ }
+
+ /**
+ * Returns true if no test has been skipped.
+ *
+ * @return bool
+ *
+ * @since Method available since Release 3.0.0
+ */
+ public function noneSkipped()
+ {
+ return $this->skippedCount() == 0;
+ }
+
+ /**
+ * Gets the number of skipped tests.
+ *
+ * @return int
+ *
+ * @since Method available since Release 3.0.0
+ */
+ public function skippedCount()
+ {
+ return count($this->skipped);
+ }
+
+ /**
+ * Returns an Enumeration for the skipped tests.
+ *
+ * @return array
+ *
+ * @since Method available since Release 3.0.0
+ */
+ public function skipped()
+ {
+ return $this->skipped;
+ }
+
+ /**
+ * Gets the number of detected errors.
+ *
+ * @return int
+ */
+ public function errorCount()
+ {
+ return count($this->errors);
+ }
+
+ /**
+ * Returns an Enumeration for the errors.
+ *
+ * @return array
+ */
+ public function errors()
+ {
+ return $this->errors;
+ }
+
+ /**
+ * Gets the number of detected failures.
+ *
+ * @return int
+ */
+ public function failureCount()
+ {
+ return count($this->failures);
+ }
+
+ /**
+ * Returns an Enumeration for the failures.
+ *
+ * @return array
+ */
+ public function failures()
+ {
+ return $this->failures;
+ }
+
+ /**
+ * Returns the names of the tests that have passed.
+ *
+ * @return array
+ *
+ * @since Method available since Release 3.4.0
+ */
+ public function passed()
+ {
+ return $this->passed;
+ }
+
+ /**
+ * Returns the (top) test suite.
+ *
+ * @return PHPUnit_Framework_TestSuite
+ *
+ * @since Method available since Release 3.0.0
+ */
+ public function topTestSuite()
+ {
+ return $this->topTestSuite;
+ }
+
+ /**
+ * Returns whether code coverage information should be collected.
+ *
+ * @return bool If code coverage should be collected
+ *
+ * @since Method available since Release 3.2.0
+ */
+ public function getCollectCodeCoverageInformation()
+ {
+ return $this->codeCoverage !== null;
+ }
+
+ /**
+ * Runs a TestCase.
+ *
+ * @param PHPUnit_Framework_Test $test
+ */
+ public function run(PHPUnit_Framework_Test $test)
+ {
+ PHPUnit_Framework_Assert::resetCount();
+
+ $error = false;
+ $failure = false;
+ $incomplete = false;
+ $risky = false;
+ $skipped = false;
+
+ $this->startTest($test);
+
+ $errorHandlerSet = false;
+
+ if ($this->convertErrorsToExceptions) {
+ $oldErrorHandler = set_error_handler(
+ array('PHPUnit_Util_ErrorHandler', 'handleError'),
+ E_ALL | E_STRICT
+ );
+
+ if ($oldErrorHandler === null) {
+ $errorHandlerSet = true;
+ } else {
+ restore_error_handler();
+ }
+ }
+
+ $collectCodeCoverage = $this->codeCoverage !== null &&
+ !$test instanceof PHPUnit_Extensions_SeleniumTestCase &&
+ !$test instanceof PHPUnit_Framework_Warning;
+
+ if ($collectCodeCoverage) {
+ // We need to blacklist test source files when no whitelist is used.
+ if (!$this->codeCoverage->filter()->hasWhitelist()) {
+ $classes = $this->getHierarchy(get_class($test), true);
+
+ foreach ($classes as $class) {
+ $this->codeCoverage->filter()->addFileToBlacklist(
+ $class->getFileName()
+ );
+ }
+ }
+
+ $this->codeCoverage->start($test);
+ }
+
+ PHP_Timer::start();
+
+ try {
+ if (!$test instanceof PHPUnit_Framework_Warning &&
+ $test->getSize() != PHPUnit_Util_Test::UNKNOWN &&
+ $this->beStrictAboutTestSize &&
+ extension_loaded('pcntl') && class_exists('PHP_Invoker')) {
+ switch ($test->getSize()) {
+ case PHPUnit_Util_Test::SMALL:
+ $_timeout = $this->timeoutForSmallTests;
+ break;
+
+ case PHPUnit_Util_Test::MEDIUM:
+ $_timeout = $this->timeoutForMediumTests;
+ break;
+
+ case PHPUnit_Util_Test::LARGE:
+ $_timeout = $this->timeoutForLargeTests;
+ break;
+ }
+
+ $invoker = new PHP_Invoker;
+ $invoker->invoke(array($test, 'runBare'), array(), $_timeout);
+ } else {
+ $test->runBare();
+ }
+ } catch (PHPUnit_Framework_AssertionFailedError $e) {
+ $failure = true;
+
+ if ($e instanceof PHPUnit_Framework_RiskyTestError) {
+ $risky = true;
+ } elseif ($e instanceof PHPUnit_Framework_IncompleteTestError) {
+ $incomplete = true;
+ } elseif ($e instanceof PHPUnit_Framework_SkippedTestError) {
+ $skipped = true;
+ }
+ } catch (PHPUnit_Framework_Exception $e) {
+ $error = true;
+ } catch (Throwable $e) {
+ $e = new PHPUnit_Framework_ExceptionWrapper($e);
+ $error = true;
+ } catch (Exception $e) {
+ $e = new PHPUnit_Framework_ExceptionWrapper($e);
+ $error = true;
+ }
+
+ $time = PHP_Timer::stop();
+ $test->addToAssertionCount(PHPUnit_Framework_Assert::getCount());
+
+ if ($this->beStrictAboutTestsThatDoNotTestAnything &&
+ $test->getNumAssertions() == 0) {
+ $risky = true;
+ }
+
+ if ($collectCodeCoverage) {
+ $append = !$risky && !$incomplete && !$skipped;
+ $linesToBeCovered = array();
+ $linesToBeUsed = array();
+
+ if ($append && $test instanceof PHPUnit_Framework_TestCase) {
+ $linesToBeCovered = PHPUnit_Util_Test::getLinesToBeCovered(
+ get_class($test),
+ $test->getName(false)
+ );
+
+ $linesToBeUsed = PHPUnit_Util_Test::getLinesToBeUsed(
+ get_class($test),
+ $test->getName(false)
+ );
+ }
+
+ try {
+ $this->codeCoverage->stop(
+ $append,
+ $linesToBeCovered,
+ $linesToBeUsed
+ );
+ } catch (PHP_CodeCoverage_Exception_UnintentionallyCoveredCode $cce) {
+ $this->addFailure(
+ $test,
+ new PHPUnit_Framework_UnintentionallyCoveredCodeError(
+ 'This test executed code that is not listed as code to be covered or used:' .
+ PHP_EOL . $cce->getMessage()
+ ),
+ $time
+ );
+ } catch (PHPUnit_Framework_InvalidCoversTargetException $cce) {
+ $this->addFailure(
+ $test,
+ new PHPUnit_Framework_InvalidCoversTargetError(
+ $cce->getMessage()
+ ),
+ $time
+ );
+ } catch (PHP_CodeCoverage_Exception $cce) {
+ $error = true;
+
+ if (!isset($e)) {
+ $e = $cce;
+ }
+ }
+ }
+
+ if ($errorHandlerSet === true) {
+ restore_error_handler();
+ }
+
+ if ($error === true) {
+ $this->addError($test, $e, $time);
+ } elseif ($failure === true) {
+ $this->addFailure($test, $e, $time);
+ } elseif ($this->beStrictAboutTestsThatDoNotTestAnything &&
+ $test->getNumAssertions() == 0) {
+ $this->addFailure(
+ $test,
+ new PHPUnit_Framework_RiskyTestError(
+ 'This test did not perform any assertions'
+ ),
+ $time
+ );
+ } elseif ($this->beStrictAboutOutputDuringTests && $test->hasOutput()) {
+ $this->addFailure(
+ $test,
+ new PHPUnit_Framework_OutputError(
+ sprintf(
+ 'This test printed output: %s',
+ $test->getActualOutput()
+ )
+ ),
+ $time
+ );
+ } elseif ($this->beStrictAboutTodoAnnotatedTests && $test instanceof PHPUnit_Framework_TestCase) {
+ $annotations = $test->getAnnotations();
+
+ if (isset($annotations['method']['todo'])) {
+ $this->addFailure(
+ $test,
+ new PHPUnit_Framework_RiskyTestError(
+ 'Test method is annotated with @todo'
+ ),
+ $time
+ );
+ }
+ }
+
+ $this->endTest($test, $time);
+ }
+
+ /**
+ * Gets the number of run tests.
+ *
+ * @return int
+ */
+ public function count()
+ {
+ return $this->runTests;
+ }
+
+ /**
+ * Checks whether the test run should stop.
+ *
+ * @return bool
+ */
+ public function shouldStop()
+ {
+ return $this->stop;
+ }
+
+ /**
+ * Marks that the test run should stop.
+ */
+ public function stop()
+ {
+ $this->stop = true;
+ }
+
+ /**
+ * Returns the PHP_CodeCoverage object.
+ *
+ * @return PHP_CodeCoverage
+ *
+ * @since Method available since Release 3.5.0
+ */
+ public function getCodeCoverage()
+ {
+ return $this->codeCoverage;
+ }
+
+ /**
+ * Sets the PHP_CodeCoverage object.
+ *
+ * @param PHP_CodeCoverage $codeCoverage
+ *
+ * @since Method available since Release 3.6.0
+ */
+ public function setCodeCoverage(PHP_CodeCoverage $codeCoverage)
+ {
+ $this->codeCoverage = $codeCoverage;
+ }
+
+ /**
+ * Enables or disables the error-to-exception conversion.
+ *
+ * @param bool $flag
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 3.2.14
+ */
+ public function convertErrorsToExceptions($flag)
+ {
+ if (!is_bool($flag)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+ }
+
+ $this->convertErrorsToExceptions = $flag;
+ }
+
+ /**
+ * Returns the error-to-exception conversion setting.
+ *
+ * @return bool
+ *
+ * @since Method available since Release 3.4.0
+ */
+ public function getConvertErrorsToExceptions()
+ {
+ return $this->convertErrorsToExceptions;
+ }
+
+ /**
+ * Enables or disables the stopping when an error occurs.
+ *
+ * @param bool $flag
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 3.5.0
+ */
+ public function stopOnError($flag)
+ {
+ if (!is_bool($flag)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+ }
+
+ $this->stopOnError = $flag;
+ }
+
+ /**
+ * Enables or disables the stopping when a failure occurs.
+ *
+ * @param bool $flag
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 3.1.0
+ */
+ public function stopOnFailure($flag)
+ {
+ if (!is_bool($flag)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+ }
+
+ $this->stopOnFailure = $flag;
+ }
+
+ /**
+ * @param bool $flag
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 4.0.0
+ */
+ public function beStrictAboutTestsThatDoNotTestAnything($flag)
+ {
+ if (!is_bool($flag)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+ }
+
+ $this->beStrictAboutTestsThatDoNotTestAnything = $flag;
+ }
+
+ /**
+ * @return bool
+ *
+ * @since Method available since Release 4.0.0
+ */
+ public function isStrictAboutTestsThatDoNotTestAnything()
+ {
+ return $this->beStrictAboutTestsThatDoNotTestAnything;
+ }
+
+ /**
+ * @param bool $flag
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 4.0.0
+ */
+ public function beStrictAboutOutputDuringTests($flag)
+ {
+ if (!is_bool($flag)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+ }
+
+ $this->beStrictAboutOutputDuringTests = $flag;
+ }
+
+ /**
+ * @return bool
+ *
+ * @since Method available since Release 4.0.0
+ */
+ public function isStrictAboutOutputDuringTests()
+ {
+ return $this->beStrictAboutOutputDuringTests;
+ }
+
+ /**
+ * @param bool $flag
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 4.0.0
+ */
+ public function beStrictAboutTestSize($flag)
+ {
+ if (!is_bool($flag)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+ }
+
+ $this->beStrictAboutTestSize = $flag;
+ }
+
+ /**
+ * @return bool
+ *
+ * @since Method available since Release 4.0.0
+ */
+ public function isStrictAboutTestSize()
+ {
+ return $this->beStrictAboutTestSize;
+ }
+
+ /**
+ * @param bool $flag
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 4.2.0
+ */
+ public function beStrictAboutTodoAnnotatedTests($flag)
+ {
+ if (!is_bool($flag)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+ }
+
+ $this->beStrictAboutTodoAnnotatedTests = $flag;
+ }
+
+ /**
+ * @return bool
+ *
+ * @since Method available since Release 4.2.0
+ */
+ public function isStrictAboutTodoAnnotatedTests()
+ {
+ return $this->beStrictAboutTodoAnnotatedTests;
+ }
+
+ /**
+ * Enables or disables the stopping for risky tests.
+ *
+ * @param bool $flag
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 4.0.0
+ */
+ public function stopOnRisky($flag)
+ {
+ if (!is_bool($flag)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+ }
+
+ $this->stopOnRisky = $flag;
+ }
+
+ /**
+ * Enables or disables the stopping for incomplete tests.
+ *
+ * @param bool $flag
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 3.5.0
+ */
+ public function stopOnIncomplete($flag)
+ {
+ if (!is_bool($flag)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+ }
+
+ $this->stopOnIncomplete = $flag;
+ }
+
+ /**
+ * Enables or disables the stopping for skipped tests.
+ *
+ * @param bool $flag
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 3.1.0
+ */
+ public function stopOnSkipped($flag)
+ {
+ if (!is_bool($flag)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'boolean');
+ }
+
+ $this->stopOnSkipped = $flag;
+ }
+
+ /**
+ * Returns the time spent running the tests.
+ *
+ * @return float
+ */
+ public function time()
+ {
+ return $this->time;
+ }
+
+ /**
+ * Returns whether the entire test was successful or not.
+ *
+ * @return bool
+ */
+ public function wasSuccessful()
+ {
+ return empty($this->errors) && empty($this->failures);
+ }
+
+ /**
+ * Sets the timeout for small tests.
+ *
+ * @param int $timeout
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 3.6.0
+ */
+ public function setTimeoutForSmallTests($timeout)
+ {
+ if (!is_integer($timeout)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
+ }
+
+ $this->timeoutForSmallTests = $timeout;
+ }
+
+ /**
+ * Sets the timeout for medium tests.
+ *
+ * @param int $timeout
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 3.6.0
+ */
+ public function setTimeoutForMediumTests($timeout)
+ {
+ if (!is_integer($timeout)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
+ }
+
+ $this->timeoutForMediumTests = $timeout;
+ }
+
+ /**
+ * Sets the timeout for large tests.
+ *
+ * @param int $timeout
+ *
+ * @throws PHPUnit_Framework_Exception
+ *
+ * @since Method available since Release 3.6.0
+ */
+ public function setTimeoutForLargeTests($timeout)
+ {
+ if (!is_integer($timeout)) {
+ throw PHPUnit_Util_InvalidArgumentHelper::factory(1, 'integer');
+ }
+
+ $this->timeoutForLargeTests = $timeout;
+ }
+
+ /**
+ * Returns the class hierarchy for a given class.
+ *
+ * @param string $className
+ * @param bool $asReflectionObjects
+ *
+ * @return array
+ */
+ protected function getHierarchy($className, $asReflectionObjects = false)
+ {
+ if ($asReflectionObjects) {
+ $classes = array(new ReflectionClass($className));
+ } else {
+ $classes = array($className);
+ }
+
+ $done = false;
+
+ while (!$done) {
+ if ($asReflectionObjects) {
+ $class = new ReflectionClass(
+ $classes[count($classes) - 1]->getName()
+ );
+ } else {
+ $class = new ReflectionClass($classes[count($classes) - 1]);
+ }
+
+ $parent = $class->getParentClass();
+
+ if ($parent !== false) {
+ if ($asReflectionObjects) {
+ $classes[] = $parent;
+ } else {
+ $classes[] = $parent->getName();
+ }
+ } else {
+ $done = true;
+ }
+ }
+
+ return $classes;
+ }
+}