* * 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; }