summaryrefslogtreecommitdiff
path: root/vendor/phpunit/php-code-coverage/src/Driver/Xdebug2Driver.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/phpunit/php-code-coverage/src/Driver/Xdebug2Driver.php')
-rw-r--r--vendor/phpunit/php-code-coverage/src/Driver/Xdebug2Driver.php128
1 files changed, 128 insertions, 0 deletions
diff --git a/vendor/phpunit/php-code-coverage/src/Driver/Xdebug2Driver.php b/vendor/phpunit/php-code-coverage/src/Driver/Xdebug2Driver.php
new file mode 100644
index 000000000..74cbbfbcd
--- /dev/null
+++ b/vendor/phpunit/php-code-coverage/src/Driver/Xdebug2Driver.php
@@ -0,0 +1,128 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of phpunit/php-code-coverage.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace SebastianBergmann\CodeCoverage\Driver;
+
+use const XDEBUG_CC_BRANCH_CHECK;
+use const XDEBUG_CC_DEAD_CODE;
+use const XDEBUG_CC_UNUSED;
+use const XDEBUG_FILTER_CODE_COVERAGE;
+use const XDEBUG_PATH_INCLUDE;
+use const XDEBUG_PATH_WHITELIST;
+use function defined;
+use function extension_loaded;
+use function ini_get;
+use function phpversion;
+use function sprintf;
+use function version_compare;
+use function xdebug_get_code_coverage;
+use function xdebug_set_filter;
+use function xdebug_start_code_coverage;
+use function xdebug_stop_code_coverage;
+use SebastianBergmann\CodeCoverage\Filter;
+use SebastianBergmann\CodeCoverage\RawCodeCoverageData;
+
+/**
+ * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage
+ */
+final class Xdebug2Driver extends Driver
+{
+ /**
+ * @var bool
+ */
+ private $pathCoverageIsMixedCoverage;
+
+ /**
+ * @throws WrongXdebugVersionException
+ * @throws Xdebug2NotEnabledException
+ * @throws XdebugNotAvailableException
+ */
+ public function __construct(Filter $filter)
+ {
+ if (!extension_loaded('xdebug')) {
+ throw new XdebugNotAvailableException;
+ }
+
+ if (version_compare(phpversion('xdebug'), '3', '>=')) {
+ throw new WrongXdebugVersionException(
+ sprintf(
+ 'This driver requires Xdebug 2 but version %s is loaded',
+ phpversion('xdebug')
+ )
+ );
+ }
+
+ if (!ini_get('xdebug.coverage_enable')) {
+ throw new Xdebug2NotEnabledException;
+ }
+
+ if (!$filter->isEmpty()) {
+ if (defined('XDEBUG_PATH_WHITELIST')) {
+ $listType = XDEBUG_PATH_WHITELIST;
+ } else {
+ $listType = XDEBUG_PATH_INCLUDE;
+ }
+
+ xdebug_set_filter(
+ XDEBUG_FILTER_CODE_COVERAGE,
+ $listType,
+ $filter->files()
+ );
+ }
+
+ $this->pathCoverageIsMixedCoverage = version_compare(phpversion('xdebug'), '2.9.6', '<');
+ }
+
+ public function canCollectBranchAndPathCoverage(): bool
+ {
+ return true;
+ }
+
+ public function canDetectDeadCode(): bool
+ {
+ return true;
+ }
+
+ public function start(): void
+ {
+ $flags = XDEBUG_CC_UNUSED;
+
+ if ($this->detectsDeadCode() || $this->collectsBranchAndPathCoverage()) {
+ $flags |= XDEBUG_CC_DEAD_CODE;
+ }
+
+ if ($this->collectsBranchAndPathCoverage()) {
+ $flags |= XDEBUG_CC_BRANCH_CHECK;
+ }
+
+ xdebug_start_code_coverage($flags);
+ }
+
+ public function stop(): RawCodeCoverageData
+ {
+ $data = xdebug_get_code_coverage();
+
+ xdebug_stop_code_coverage();
+
+ if ($this->collectsBranchAndPathCoverage()) {
+ if ($this->pathCoverageIsMixedCoverage) {
+ return RawCodeCoverageData::fromXdebugWithMixedCoverage($data);
+ }
+
+ return RawCodeCoverageData::fromXdebugWithPathCoverage($data);
+ }
+
+ return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data);
+ }
+
+ public function nameAndVersion(): string
+ {
+ return 'Xdebug ' . phpversion('xdebug');
+ }
+}