summaryrefslogtreecommitdiff
path: root/vendor/phpunit/php-code-coverage/src/Driver
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2022-03-22 12:24:31 +0300
committerAndrew Dolgov <[email protected]>2022-03-22 12:24:31 +0300
commit1c4f7ab3b838b23afb2ee4dab14acbf75956e952 (patch)
tree0a19274107d717efe92d2c0376cd3105fead5a11 /vendor/phpunit/php-code-coverage/src/Driver
parent711662948768492e8d05b778a7d80eacaec368d2 (diff)
* add phpunit as a dev dependency
* add some basic tests for UrlHelper::rewrite_relative() * fix UrlHelper::rewrite_relative() to work better on non-absolute relative URL paths
Diffstat (limited to 'vendor/phpunit/php-code-coverage/src/Driver')
-rw-r--r--vendor/phpunit/php-code-coverage/src/Driver/Driver.php167
-rw-r--r--vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.php75
-rw-r--r--vendor/phpunit/php-code-coverage/src/Driver/PhpdbgDriver.php93
-rw-r--r--vendor/phpunit/php-code-coverage/src/Driver/Selector.php79
-rw-r--r--vendor/phpunit/php-code-coverage/src/Driver/Xdebug2Driver.php128
-rw-r--r--vendor/phpunit/php-code-coverage/src/Driver/Xdebug3Driver.php119
6 files changed, 661 insertions, 0 deletions
diff --git a/vendor/phpunit/php-code-coverage/src/Driver/Driver.php b/vendor/phpunit/php-code-coverage/src/Driver/Driver.php
new file mode 100644
index 000000000..dc2de68f4
--- /dev/null
+++ b/vendor/phpunit/php-code-coverage/src/Driver/Driver.php
@@ -0,0 +1,167 @@
+<?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 function sprintf;
+use SebastianBergmann\CodeCoverage\BranchAndPathCoverageNotSupportedException;
+use SebastianBergmann\CodeCoverage\DeadCodeDetectionNotSupportedException;
+use SebastianBergmann\CodeCoverage\Filter;
+use SebastianBergmann\CodeCoverage\NoCodeCoverageDriverAvailableException;
+use SebastianBergmann\CodeCoverage\NoCodeCoverageDriverWithPathCoverageSupportAvailableException;
+use SebastianBergmann\CodeCoverage\RawCodeCoverageData;
+
+/**
+ * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage
+ */
+abstract class Driver
+{
+ /**
+ * @var int
+ *
+ * @see http://xdebug.org/docs/code_coverage
+ */
+ public const LINE_NOT_EXECUTABLE = -2;
+
+ /**
+ * @var int
+ *
+ * @see http://xdebug.org/docs/code_coverage
+ */
+ public const LINE_NOT_EXECUTED = -1;
+
+ /**
+ * @var int
+ *
+ * @see http://xdebug.org/docs/code_coverage
+ */
+ public const LINE_EXECUTED = 1;
+
+ /**
+ * @var int
+ *
+ * @see http://xdebug.org/docs/code_coverage
+ */
+ public const BRANCH_NOT_HIT = 0;
+
+ /**
+ * @var int
+ *
+ * @see http://xdebug.org/docs/code_coverage
+ */
+ public const BRANCH_HIT = 1;
+
+ /**
+ * @var bool
+ */
+ private $collectBranchAndPathCoverage = false;
+
+ /**
+ * @var bool
+ */
+ private $detectDeadCode = false;
+
+ /**
+ * @throws NoCodeCoverageDriverAvailableException
+ * @throws PcovNotAvailableException
+ * @throws PhpdbgNotAvailableException
+ * @throws Xdebug2NotEnabledException
+ * @throws Xdebug3NotEnabledException
+ * @throws XdebugNotAvailableException
+ *
+ * @deprecated Use DriverSelector::forLineCoverage() instead
+ */
+ public static function forLineCoverage(Filter $filter): self
+ {
+ return (new Selector)->forLineCoverage($filter);
+ }
+
+ /**
+ * @throws NoCodeCoverageDriverWithPathCoverageSupportAvailableException
+ * @throws Xdebug2NotEnabledException
+ * @throws Xdebug3NotEnabledException
+ * @throws XdebugNotAvailableException
+ *
+ * @deprecated Use DriverSelector::forLineAndPathCoverage() instead
+ */
+ public static function forLineAndPathCoverage(Filter $filter): self
+ {
+ return (new Selector)->forLineAndPathCoverage($filter);
+ }
+
+ public function canCollectBranchAndPathCoverage(): bool
+ {
+ return false;
+ }
+
+ public function collectsBranchAndPathCoverage(): bool
+ {
+ return $this->collectBranchAndPathCoverage;
+ }
+
+ /**
+ * @throws BranchAndPathCoverageNotSupportedException
+ */
+ public function enableBranchAndPathCoverage(): void
+ {
+ if (!$this->canCollectBranchAndPathCoverage()) {
+ throw new BranchAndPathCoverageNotSupportedException(
+ sprintf(
+ '%s does not support branch and path coverage',
+ $this->nameAndVersion()
+ )
+ );
+ }
+
+ $this->collectBranchAndPathCoverage = true;
+ }
+
+ public function disableBranchAndPathCoverage(): void
+ {
+ $this->collectBranchAndPathCoverage = false;
+ }
+
+ public function canDetectDeadCode(): bool
+ {
+ return false;
+ }
+
+ public function detectsDeadCode(): bool
+ {
+ return $this->detectDeadCode;
+ }
+
+ /**
+ * @throws DeadCodeDetectionNotSupportedException
+ */
+ public function enableDeadCodeDetection(): void
+ {
+ if (!$this->canDetectDeadCode()) {
+ throw new DeadCodeDetectionNotSupportedException(
+ sprintf(
+ '%s does not support dead code detection',
+ $this->nameAndVersion()
+ )
+ );
+ }
+
+ $this->detectDeadCode = true;
+ }
+
+ public function disableDeadCodeDetection(): void
+ {
+ $this->detectDeadCode = false;
+ }
+
+ abstract public function nameAndVersion(): string;
+
+ abstract public function start(): void;
+
+ abstract public function stop(): RawCodeCoverageData;
+}
diff --git a/vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.php b/vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.php
new file mode 100644
index 000000000..c30b30c44
--- /dev/null
+++ b/vendor/phpunit/php-code-coverage/src/Driver/PcovDriver.php
@@ -0,0 +1,75 @@
+<?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 pcov\inclusive;
+use function array_intersect;
+use function extension_loaded;
+use function pcov\clear;
+use function pcov\collect;
+use function pcov\start;
+use function pcov\stop;
+use function pcov\waiting;
+use function phpversion;
+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 PcovDriver extends Driver
+{
+ /**
+ * @var Filter
+ */
+ private $filter;
+
+ /**
+ * @throws PcovNotAvailableException
+ */
+ public function __construct(Filter $filter)
+ {
+ if (!extension_loaded('pcov')) {
+ throw new PcovNotAvailableException;
+ }
+
+ $this->filter = $filter;
+ }
+
+ public function start(): void
+ {
+ start();
+ }
+
+ public function stop(): RawCodeCoverageData
+ {
+ stop();
+
+ $filesToCollectCoverageFor = waiting();
+ $collected = [];
+
+ if ($filesToCollectCoverageFor) {
+ if (!$this->filter->isEmpty()) {
+ $filesToCollectCoverageFor = array_intersect($filesToCollectCoverageFor, $this->filter->files());
+ }
+
+ $collected = collect(inclusive, $filesToCollectCoverageFor);
+
+ clear();
+ }
+
+ return RawCodeCoverageData::fromXdebugWithoutPathCoverage($collected);
+ }
+
+ public function nameAndVersion(): string
+ {
+ return 'PCOV ' . phpversion('pcov');
+ }
+}
diff --git a/vendor/phpunit/php-code-coverage/src/Driver/PhpdbgDriver.php b/vendor/phpunit/php-code-coverage/src/Driver/PhpdbgDriver.php
new file mode 100644
index 000000000..7ee13b00f
--- /dev/null
+++ b/vendor/phpunit/php-code-coverage/src/Driver/PhpdbgDriver.php
@@ -0,0 +1,93 @@
+<?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 PHP_SAPI;
+use const PHP_VERSION;
+use function array_diff;
+use function array_keys;
+use function array_merge;
+use function get_included_files;
+use function phpdbg_end_oplog;
+use function phpdbg_get_executable;
+use function phpdbg_start_oplog;
+use SebastianBergmann\CodeCoverage\RawCodeCoverageData;
+
+/**
+ * @internal This class is not covered by the backward compatibility promise for phpunit/php-code-coverage
+ */
+final class PhpdbgDriver extends Driver
+{
+ /**
+ * @throws PhpdbgNotAvailableException
+ */
+ public function __construct()
+ {
+ if (PHP_SAPI !== 'phpdbg') {
+ throw new PhpdbgNotAvailableException;
+ }
+ }
+
+ public function start(): void
+ {
+ phpdbg_start_oplog();
+ }
+
+ public function stop(): RawCodeCoverageData
+ {
+ static $fetchedLines = [];
+
+ $dbgData = phpdbg_end_oplog();
+
+ if ($fetchedLines === []) {
+ $sourceLines = phpdbg_get_executable();
+ } else {
+ $newFiles = array_diff(get_included_files(), array_keys($fetchedLines));
+
+ $sourceLines = [];
+
+ if ($newFiles) {
+ $sourceLines = phpdbg_get_executable(['files' => $newFiles]);
+ }
+ }
+
+ foreach ($sourceLines as $file => $lines) {
+ foreach ($lines as $lineNo => $numExecuted) {
+ $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED;
+ }
+ }
+
+ $fetchedLines = array_merge($fetchedLines, $sourceLines);
+
+ return RawCodeCoverageData::fromXdebugWithoutPathCoverage(
+ $this->detectExecutedLines($fetchedLines, $dbgData)
+ );
+ }
+
+ public function nameAndVersion(): string
+ {
+ return 'PHPDBG ' . PHP_VERSION;
+ }
+
+ private function detectExecutedLines(array $sourceLines, array $dbgData): array
+ {
+ foreach ($dbgData as $file => $coveredLines) {
+ foreach ($coveredLines as $lineNo => $numExecuted) {
+ // phpdbg also reports $lineNo=0 when e.g. exceptions get thrown.
+ // make sure we only mark lines executed which are actually executable.
+ if (isset($sourceLines[$file][$lineNo])) {
+ $sourceLines[$file][$lineNo] = self::LINE_EXECUTED;
+ }
+ }
+ }
+
+ return $sourceLines;
+ }
+}
diff --git a/vendor/phpunit/php-code-coverage/src/Driver/Selector.php b/vendor/phpunit/php-code-coverage/src/Driver/Selector.php
new file mode 100644
index 000000000..936ee8981
--- /dev/null
+++ b/vendor/phpunit/php-code-coverage/src/Driver/Selector.php
@@ -0,0 +1,79 @@
+<?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 function phpversion;
+use function version_compare;
+use SebastianBergmann\CodeCoverage\Filter;
+use SebastianBergmann\CodeCoverage\NoCodeCoverageDriverAvailableException;
+use SebastianBergmann\CodeCoverage\NoCodeCoverageDriverWithPathCoverageSupportAvailableException;
+use SebastianBergmann\Environment\Runtime;
+
+final class Selector
+{
+ /**
+ * @throws NoCodeCoverageDriverAvailableException
+ * @throws PcovNotAvailableException
+ * @throws PhpdbgNotAvailableException
+ * @throws Xdebug2NotEnabledException
+ * @throws Xdebug3NotEnabledException
+ * @throws XdebugNotAvailableException
+ */
+ public function forLineCoverage(Filter $filter): Driver
+ {
+ $runtime = new Runtime;
+
+ if ($runtime->hasPHPDBGCodeCoverage()) {
+ return new PhpdbgDriver;
+ }
+
+ if ($runtime->hasPCOV()) {
+ return new PcovDriver($filter);
+ }
+
+ if ($runtime->hasXdebug()) {
+ if (version_compare(phpversion('xdebug'), '3', '>=')) {
+ $driver = new Xdebug3Driver($filter);
+ } else {
+ $driver = new Xdebug2Driver($filter);
+ }
+
+ $driver->enableDeadCodeDetection();
+
+ return $driver;
+ }
+
+ throw new NoCodeCoverageDriverAvailableException;
+ }
+
+ /**
+ * @throws NoCodeCoverageDriverWithPathCoverageSupportAvailableException
+ * @throws Xdebug2NotEnabledException
+ * @throws Xdebug3NotEnabledException
+ * @throws XdebugNotAvailableException
+ */
+ public function forLineAndPathCoverage(Filter $filter): Driver
+ {
+ if ((new Runtime)->hasXdebug()) {
+ if (version_compare(phpversion('xdebug'), '3', '>=')) {
+ $driver = new Xdebug3Driver($filter);
+ } else {
+ $driver = new Xdebug2Driver($filter);
+ }
+
+ $driver->enableDeadCodeDetection();
+ $driver->enableBranchAndPathCoverage();
+
+ return $driver;
+ }
+
+ throw new NoCodeCoverageDriverWithPathCoverageSupportAvailableException;
+ }
+}
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');
+ }
+}
diff --git a/vendor/phpunit/php-code-coverage/src/Driver/Xdebug3Driver.php b/vendor/phpunit/php-code-coverage/src/Driver/Xdebug3Driver.php
new file mode 100644
index 000000000..b85db4034
--- /dev/null
+++ b/vendor/phpunit/php-code-coverage/src/Driver/Xdebug3Driver.php
@@ -0,0 +1,119 @@
+<?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 function explode;
+use function extension_loaded;
+use function getenv;
+use function in_array;
+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 Xdebug3Driver extends Driver
+{
+ /**
+ * @throws WrongXdebugVersionException
+ * @throws Xdebug3NotEnabledException
+ * @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 3 but version %s is loaded',
+ phpversion('xdebug')
+ )
+ );
+ }
+
+ $mode = getenv('XDEBUG_MODE');
+
+ if ($mode === false || $mode === '') {
+ $mode = ini_get('xdebug.mode');
+ }
+
+ if ($mode === false ||
+ !in_array('coverage', explode(',', $mode), true)) {
+ throw new Xdebug3NotEnabledException;
+ }
+
+ if (!$filter->isEmpty()) {
+ xdebug_set_filter(
+ XDEBUG_FILTER_CODE_COVERAGE,
+ XDEBUG_PATH_INCLUDE,
+ $filter->files()
+ );
+ }
+ }
+
+ 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()) {
+ return RawCodeCoverageData::fromXdebugWithPathCoverage($data);
+ }
+
+ return RawCodeCoverageData::fromXdebugWithoutPathCoverage($data);
+ }
+
+ public function nameAndVersion(): string
+ {
+ return 'Xdebug ' . phpversion('xdebug');
+ }
+}