Вход Регистрация
Файл: vendor/phpunit/php-code-coverage/src/Driver/Xdebug3Driver.php
Строк: 122
<?php declare(strict_types=1);
/*
 * This file is part of phpunit/php-code-coverage.
 *
 * (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.
 */
namespace SebastianBergmannCodeCoverageDriver;

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 
SebastianBergmannCodeCoverageFilter;
use 
SebastianBergmannCodeCoverageRawCodeCoverageData;

/**
 * @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');
    }
}
Онлайн: 0
Реклама