You are here

class PHP_CodeCoverage_Driver_PHPDBG in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php \PHP_CodeCoverage_Driver_PHPDBG

Driver for PHPDBG's code coverage functionality.

@since Class available since Release 2.2.0 @codeCoverageIgnore

Hierarchy

Expanded class hierarchy of PHP_CodeCoverage_Driver_PHPDBG

File

vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php, line 17

View source
class PHP_CodeCoverage_Driver_PHPDBG implements PHP_CodeCoverage_Driver {

  /**
   * Constructor.
   */
  public function __construct() {
    if (PHP_SAPI !== 'phpdbg') {
      throw new PHP_CodeCoverage_Exception('This driver requires the PHPDBG SAPI');
    }
    if (!function_exists('phpdbg_start_oplog')) {
      throw new PHP_CodeCoverage_Exception('This build of PHPDBG does not support code coverage');
    }
  }

  /**
   * Start collection of code coverage information.
   */
  public function start() {
    phpdbg_start_oplog();
  }

  /**
   * Stop collection of code coverage information.
   *
   * @return array
   */
  public function stop() {
    static $fetchedLines = array();
    $dbgData = phpdbg_end_oplog();
    if ($fetchedLines == array()) {
      $sourceLines = phpdbg_get_executable();
    }
    else {
      $newFiles = array_diff(get_included_files(), array_keys($fetchedLines));
      if ($newFiles) {
        $sourceLines = phpdbg_get_executable(array(
          'files' => $newFiles,
        ));
      }
      else {
        $sourceLines = array();
      }
    }
    foreach ($sourceLines as $file => $lines) {
      foreach ($lines as $lineNo => $numExecuted) {
        $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED;
      }
    }
    $fetchedLines = array_merge($fetchedLines, $sourceLines);
    return $this
      ->detectExecutedLines($fetchedLines, $dbgData);
  }

  /**
   * Convert phpdbg based data into the format CodeCoverage expects
   *
   * @param  array $sourceLines
   * @param  array $dbgData
   * @return array
   */
  private function detectExecutedLines(array $sourceLines, array $dbgData) {
    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;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
PHP_CodeCoverage_Driver::LINE_EXECUTED constant
PHP_CodeCoverage_Driver::LINE_NOT_EXECUTABLE constant
PHP_CodeCoverage_Driver::LINE_NOT_EXECUTED constant
PHP_CodeCoverage_Driver_PHPDBG::detectExecutedLines private function Convert phpdbg based data into the format CodeCoverage expects
PHP_CodeCoverage_Driver_PHPDBG::start public function Start collection of code coverage information. Overrides PHP_CodeCoverage_Driver::start
PHP_CodeCoverage_Driver_PHPDBG::stop public function Stop collection of code coverage information. Overrides PHP_CodeCoverage_Driver::stop
PHP_CodeCoverage_Driver_PHPDBG::__construct public function Constructor.