1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
<?php /* * This file is part of the php-code-coverage package. * * (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 SebastianBergmann\CodeCoverage\Driver;
use SebastianBergmann\CodeCoverage\RuntimeException;
/** * Driver for Xdebug's code coverage functionality. * * @codeCoverageIgnore */ class Xdebug implements Driver { /** * Cache the number of lines for each file * * @var array */ private $cacheNumLines = [];
/** * Constructor. */ public function __construct() { if (!extension_loaded('xdebug')) { throw new RuntimeException('This driver requires Xdebug'); }
if (version_compare(phpversion('xdebug'), '2.2.1', '>=') && !ini_get('xdebug.coverage_enable')) { throw new RuntimeException( 'xdebug.coverage_enable=On has to be set in php.ini' ); } }
/** * Start collection of code coverage information. * * @param bool $determineUnusedAndDead */ public function start($determineUnusedAndDead = true) { if ($determineUnusedAndDead) { xdebug_start_code_coverage(XDEBUG_CC_UNUSED | XDEBUG_CC_DEAD_CODE); } else { xdebug_start_code_coverage(); } }
/** * Stop collection of code coverage information. * * @return array */ public function stop() { $data = xdebug_get_code_coverage(); xdebug_stop_code_coverage();
return $this->cleanup($data); }
/** * @param array $data * * @return array */ private function cleanup(array $data) { foreach (array_keys($data) as $file) { unset($data[$file][0]);
if (strpos($file, 'xdebug://debug-eval') !== 0 && file_exists($file)) { $numLines = $this->getNumberOfLinesInFile($file);
foreach (array_keys($data[$file]) as $line) { if ($line > $numLines) { unset($data[$file][$line]); } } } }
return $data; }
/** * @param string $file * * @return int */ private function getNumberOfLinesInFile($file) { if (!isset($this->cacheNumLines[$file])) { $buffer = file_get_contents($file); $lines = substr_count($buffer, "\n");
if (substr($buffer, -1) !== "\n") { $lines++; }
$this->cacheNumLines[$file] = $lines; }
return $this->cacheNumLines[$file]; } }
|