Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: /** Chris@0: * Driver for Xdebug's code coverage functionality. Chris@0: * Chris@0: * @since Class available since Release 1.0.0 Chris@0: * @codeCoverageIgnore Chris@0: */ Chris@0: class PHP_CodeCoverage_Driver_Xdebug implements PHP_CodeCoverage_Driver Chris@0: { Chris@0: /** Chris@0: * Constructor. Chris@0: */ Chris@0: public function __construct() Chris@0: { Chris@0: if (!extension_loaded('xdebug')) { Chris@0: throw new PHP_CodeCoverage_Exception('This driver requires Xdebug'); Chris@0: } Chris@0: Chris@0: if (version_compare(phpversion('xdebug'), '2.2.0-dev', '>=') && Chris@0: !ini_get('xdebug.coverage_enable')) { Chris@0: throw new PHP_CodeCoverage_Exception( Chris@0: 'xdebug.coverage_enable=On has to be set in php.ini' Chris@0: ); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Start collection of code coverage information. Chris@0: */ Chris@0: public function start() Chris@0: { Chris@0: xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Stop collection of code coverage information. Chris@0: * Chris@0: * @return array Chris@0: */ Chris@0: public function stop() Chris@0: { Chris@0: $data = xdebug_get_code_coverage(); Chris@0: xdebug_stop_code_coverage(); Chris@0: Chris@0: return $this->cleanup($data); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param array $data Chris@0: * @return array Chris@0: * @since Method available since Release 2.0.0 Chris@0: */ Chris@0: private function cleanup(array $data) Chris@0: { Chris@0: foreach (array_keys($data) as $file) { Chris@0: unset($data[$file][0]); Chris@0: Chris@0: if ($file != 'xdebug://debug-eval' && file_exists($file)) { Chris@0: $numLines = $this->getNumberOfLinesInFile($file); Chris@0: Chris@0: foreach (array_keys($data[$file]) as $line) { Chris@0: if (isset($data[$file][$line]) && $line > $numLines) { Chris@0: unset($data[$file][$line]); Chris@0: } Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: return $data; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $file Chris@0: * @return int Chris@0: * @since Method available since Release 2.0.0 Chris@0: */ Chris@0: private function getNumberOfLinesInFile($file) Chris@0: { Chris@0: $buffer = file_get_contents($file); Chris@0: $lines = substr_count($buffer, "\n"); Chris@0: Chris@0: if (substr($buffer, -1) !== "\n") { Chris@0: $lines++; Chris@0: } Chris@0: Chris@0: return $lines; Chris@0: } Chris@0: }