comparison vendor/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4c8ae668cc8c
1 <?php
2 /*
3 * This file is part of the PHP_CodeCoverage package.
4 *
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10
11 /**
12 * Driver for PHPDBG's code coverage functionality.
13 *
14 * @since Class available since Release 2.2.0
15 * @codeCoverageIgnore
16 */
17 class PHP_CodeCoverage_Driver_PHPDBG implements PHP_CodeCoverage_Driver
18 {
19 /**
20 * Constructor.
21 */
22 public function __construct()
23 {
24 if (PHP_SAPI !== 'phpdbg') {
25 throw new PHP_CodeCoverage_Exception(
26 'This driver requires the PHPDBG SAPI'
27 );
28 }
29
30 if (!function_exists('phpdbg_start_oplog')) {
31 throw new PHP_CodeCoverage_Exception(
32 'This build of PHPDBG does not support code coverage'
33 );
34 }
35 }
36
37 /**
38 * Start collection of code coverage information.
39 */
40 public function start()
41 {
42 phpdbg_start_oplog();
43 }
44
45 /**
46 * Stop collection of code coverage information.
47 *
48 * @return array
49 */
50 public function stop()
51 {
52 static $fetchedLines = array();
53
54 $dbgData = phpdbg_end_oplog();
55
56 if ($fetchedLines == array()) {
57 $sourceLines = phpdbg_get_executable();
58 } else {
59 $newFiles = array_diff(
60 get_included_files(),
61 array_keys($fetchedLines)
62 );
63
64 if ($newFiles) {
65 $sourceLines = phpdbg_get_executable(
66 array('files' => $newFiles)
67 );
68 } else {
69 $sourceLines = array();
70 }
71 }
72
73 foreach ($sourceLines as $file => $lines) {
74 foreach ($lines as $lineNo => $numExecuted) {
75 $sourceLines[$file][$lineNo] = self::LINE_NOT_EXECUTED;
76 }
77 }
78
79 $fetchedLines = array_merge($fetchedLines, $sourceLines);
80
81 return $this->detectExecutedLines($fetchedLines, $dbgData);
82 }
83
84 /**
85 * Convert phpdbg based data into the format CodeCoverage expects
86 *
87 * @param array $sourceLines
88 * @param array $dbgData
89 * @return array
90 */
91 private function detectExecutedLines(array $sourceLines, array $dbgData)
92 {
93 foreach ($dbgData as $file => $coveredLines) {
94 foreach ($coveredLines as $lineNo => $numExecuted) {
95 // phpdbg also reports $lineNo=0 when e.g. exceptions get thrown.
96 // make sure we only mark lines executed which are actually executable.
97 if (isset($sourceLines[$file][$lineNo])) {
98 $sourceLines[$file][$lineNo] = self::LINE_EXECUTED;
99 }
100 }
101 }
102
103 return $sourceLines;
104 }
105 }