Chris@14
|
1 <?php
|
Chris@14
|
2 /*
|
Chris@14
|
3 * This file is part of the php-code-coverage package.
|
Chris@14
|
4 *
|
Chris@14
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@14
|
6 *
|
Chris@14
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@14
|
8 * file that was distributed with this source code.
|
Chris@14
|
9 */
|
Chris@14
|
10
|
Chris@14
|
11 namespace SebastianBergmann\CodeCoverage\Node;
|
Chris@14
|
12
|
Chris@14
|
13 use SebastianBergmann\CodeCoverage\InvalidArgumentException;
|
Chris@14
|
14
|
Chris@14
|
15 /**
|
Chris@14
|
16 * Represents a directory in the code coverage information tree.
|
Chris@14
|
17 */
|
Chris@14
|
18 class Directory extends AbstractNode implements \IteratorAggregate
|
Chris@14
|
19 {
|
Chris@14
|
20 /**
|
Chris@14
|
21 * @var AbstractNode[]
|
Chris@14
|
22 */
|
Chris@14
|
23 private $children = [];
|
Chris@14
|
24
|
Chris@14
|
25 /**
|
Chris@14
|
26 * @var Directory[]
|
Chris@14
|
27 */
|
Chris@14
|
28 private $directories = [];
|
Chris@14
|
29
|
Chris@14
|
30 /**
|
Chris@14
|
31 * @var File[]
|
Chris@14
|
32 */
|
Chris@14
|
33 private $files = [];
|
Chris@14
|
34
|
Chris@14
|
35 /**
|
Chris@14
|
36 * @var array
|
Chris@14
|
37 */
|
Chris@14
|
38 private $classes;
|
Chris@14
|
39
|
Chris@14
|
40 /**
|
Chris@14
|
41 * @var array
|
Chris@14
|
42 */
|
Chris@14
|
43 private $traits;
|
Chris@14
|
44
|
Chris@14
|
45 /**
|
Chris@14
|
46 * @var array
|
Chris@14
|
47 */
|
Chris@14
|
48 private $functions;
|
Chris@14
|
49
|
Chris@14
|
50 /**
|
Chris@14
|
51 * @var array
|
Chris@14
|
52 */
|
Chris@14
|
53 private $linesOfCode = null;
|
Chris@14
|
54
|
Chris@14
|
55 /**
|
Chris@14
|
56 * @var int
|
Chris@14
|
57 */
|
Chris@14
|
58 private $numFiles = -1;
|
Chris@14
|
59
|
Chris@14
|
60 /**
|
Chris@14
|
61 * @var int
|
Chris@14
|
62 */
|
Chris@14
|
63 private $numExecutableLines = -1;
|
Chris@14
|
64
|
Chris@14
|
65 /**
|
Chris@14
|
66 * @var int
|
Chris@14
|
67 */
|
Chris@14
|
68 private $numExecutedLines = -1;
|
Chris@14
|
69
|
Chris@14
|
70 /**
|
Chris@14
|
71 * @var int
|
Chris@14
|
72 */
|
Chris@14
|
73 private $numClasses = -1;
|
Chris@14
|
74
|
Chris@14
|
75 /**
|
Chris@14
|
76 * @var int
|
Chris@14
|
77 */
|
Chris@14
|
78 private $numTestedClasses = -1;
|
Chris@14
|
79
|
Chris@14
|
80 /**
|
Chris@14
|
81 * @var int
|
Chris@14
|
82 */
|
Chris@14
|
83 private $numTraits = -1;
|
Chris@14
|
84
|
Chris@14
|
85 /**
|
Chris@14
|
86 * @var int
|
Chris@14
|
87 */
|
Chris@14
|
88 private $numTestedTraits = -1;
|
Chris@14
|
89
|
Chris@14
|
90 /**
|
Chris@14
|
91 * @var int
|
Chris@14
|
92 */
|
Chris@14
|
93 private $numMethods = -1;
|
Chris@14
|
94
|
Chris@14
|
95 /**
|
Chris@14
|
96 * @var int
|
Chris@14
|
97 */
|
Chris@14
|
98 private $numTestedMethods = -1;
|
Chris@14
|
99
|
Chris@14
|
100 /**
|
Chris@14
|
101 * @var int
|
Chris@14
|
102 */
|
Chris@14
|
103 private $numFunctions = -1;
|
Chris@14
|
104
|
Chris@14
|
105 /**
|
Chris@14
|
106 * @var int
|
Chris@14
|
107 */
|
Chris@14
|
108 private $numTestedFunctions = -1;
|
Chris@14
|
109
|
Chris@14
|
110 /**
|
Chris@14
|
111 * Returns the number of files in/under this node.
|
Chris@14
|
112 *
|
Chris@14
|
113 * @return int
|
Chris@14
|
114 */
|
Chris@14
|
115 public function count()
|
Chris@14
|
116 {
|
Chris@14
|
117 if ($this->numFiles == -1) {
|
Chris@14
|
118 $this->numFiles = 0;
|
Chris@14
|
119
|
Chris@14
|
120 foreach ($this->children as $child) {
|
Chris@14
|
121 $this->numFiles += \count($child);
|
Chris@14
|
122 }
|
Chris@14
|
123 }
|
Chris@14
|
124
|
Chris@14
|
125 return $this->numFiles;
|
Chris@14
|
126 }
|
Chris@14
|
127
|
Chris@14
|
128 /**
|
Chris@14
|
129 * Returns an iterator for this node.
|
Chris@14
|
130 *
|
Chris@14
|
131 * @return \RecursiveIteratorIterator
|
Chris@14
|
132 */
|
Chris@14
|
133 public function getIterator()
|
Chris@14
|
134 {
|
Chris@14
|
135 return new \RecursiveIteratorIterator(
|
Chris@14
|
136 new Iterator($this),
|
Chris@14
|
137 \RecursiveIteratorIterator::SELF_FIRST
|
Chris@14
|
138 );
|
Chris@14
|
139 }
|
Chris@14
|
140
|
Chris@14
|
141 /**
|
Chris@14
|
142 * Adds a new directory.
|
Chris@14
|
143 *
|
Chris@14
|
144 * @param string $name
|
Chris@14
|
145 *
|
Chris@14
|
146 * @return Directory
|
Chris@14
|
147 */
|
Chris@14
|
148 public function addDirectory($name)
|
Chris@14
|
149 {
|
Chris@14
|
150 $directory = new self($name, $this);
|
Chris@14
|
151
|
Chris@14
|
152 $this->children[] = $directory;
|
Chris@14
|
153 $this->directories[] = &$this->children[\count($this->children) - 1];
|
Chris@14
|
154
|
Chris@14
|
155 return $directory;
|
Chris@14
|
156 }
|
Chris@14
|
157
|
Chris@14
|
158 /**
|
Chris@14
|
159 * Adds a new file.
|
Chris@14
|
160 *
|
Chris@14
|
161 * @param string $name
|
Chris@14
|
162 * @param array $coverageData
|
Chris@14
|
163 * @param array $testData
|
Chris@14
|
164 * @param bool $cacheTokens
|
Chris@14
|
165 *
|
Chris@14
|
166 * @return File
|
Chris@14
|
167 *
|
Chris@14
|
168 * @throws InvalidArgumentException
|
Chris@14
|
169 */
|
Chris@14
|
170 public function addFile($name, array $coverageData, array $testData, $cacheTokens)
|
Chris@14
|
171 {
|
Chris@14
|
172 $file = new File(
|
Chris@14
|
173 $name,
|
Chris@14
|
174 $this,
|
Chris@14
|
175 $coverageData,
|
Chris@14
|
176 $testData,
|
Chris@14
|
177 $cacheTokens
|
Chris@14
|
178 );
|
Chris@14
|
179
|
Chris@14
|
180 $this->children[] = $file;
|
Chris@14
|
181 $this->files[] = &$this->children[\count($this->children) - 1];
|
Chris@14
|
182
|
Chris@14
|
183 $this->numExecutableLines = -1;
|
Chris@14
|
184 $this->numExecutedLines = -1;
|
Chris@14
|
185
|
Chris@14
|
186 return $file;
|
Chris@14
|
187 }
|
Chris@14
|
188
|
Chris@14
|
189 /**
|
Chris@14
|
190 * Returns the directories in this directory.
|
Chris@14
|
191 *
|
Chris@14
|
192 * @return array
|
Chris@14
|
193 */
|
Chris@14
|
194 public function getDirectories()
|
Chris@14
|
195 {
|
Chris@14
|
196 return $this->directories;
|
Chris@14
|
197 }
|
Chris@14
|
198
|
Chris@14
|
199 /**
|
Chris@14
|
200 * Returns the files in this directory.
|
Chris@14
|
201 *
|
Chris@14
|
202 * @return array
|
Chris@14
|
203 */
|
Chris@14
|
204 public function getFiles()
|
Chris@14
|
205 {
|
Chris@14
|
206 return $this->files;
|
Chris@14
|
207 }
|
Chris@14
|
208
|
Chris@14
|
209 /**
|
Chris@14
|
210 * Returns the child nodes of this node.
|
Chris@14
|
211 *
|
Chris@14
|
212 * @return array
|
Chris@14
|
213 */
|
Chris@14
|
214 public function getChildNodes()
|
Chris@14
|
215 {
|
Chris@14
|
216 return $this->children;
|
Chris@14
|
217 }
|
Chris@14
|
218
|
Chris@14
|
219 /**
|
Chris@14
|
220 * Returns the classes of this node.
|
Chris@14
|
221 *
|
Chris@14
|
222 * @return array
|
Chris@14
|
223 */
|
Chris@14
|
224 public function getClasses()
|
Chris@14
|
225 {
|
Chris@14
|
226 if ($this->classes === null) {
|
Chris@14
|
227 $this->classes = [];
|
Chris@14
|
228
|
Chris@14
|
229 foreach ($this->children as $child) {
|
Chris@14
|
230 $this->classes = \array_merge(
|
Chris@14
|
231 $this->classes,
|
Chris@14
|
232 $child->getClasses()
|
Chris@14
|
233 );
|
Chris@14
|
234 }
|
Chris@14
|
235 }
|
Chris@14
|
236
|
Chris@14
|
237 return $this->classes;
|
Chris@14
|
238 }
|
Chris@14
|
239
|
Chris@14
|
240 /**
|
Chris@14
|
241 * Returns the traits of this node.
|
Chris@14
|
242 *
|
Chris@14
|
243 * @return array
|
Chris@14
|
244 */
|
Chris@14
|
245 public function getTraits()
|
Chris@14
|
246 {
|
Chris@14
|
247 if ($this->traits === null) {
|
Chris@14
|
248 $this->traits = [];
|
Chris@14
|
249
|
Chris@14
|
250 foreach ($this->children as $child) {
|
Chris@14
|
251 $this->traits = \array_merge(
|
Chris@14
|
252 $this->traits,
|
Chris@14
|
253 $child->getTraits()
|
Chris@14
|
254 );
|
Chris@14
|
255 }
|
Chris@14
|
256 }
|
Chris@14
|
257
|
Chris@14
|
258 return $this->traits;
|
Chris@14
|
259 }
|
Chris@14
|
260
|
Chris@14
|
261 /**
|
Chris@14
|
262 * Returns the functions of this node.
|
Chris@14
|
263 *
|
Chris@14
|
264 * @return array
|
Chris@14
|
265 */
|
Chris@14
|
266 public function getFunctions()
|
Chris@14
|
267 {
|
Chris@14
|
268 if ($this->functions === null) {
|
Chris@14
|
269 $this->functions = [];
|
Chris@14
|
270
|
Chris@14
|
271 foreach ($this->children as $child) {
|
Chris@14
|
272 $this->functions = \array_merge(
|
Chris@14
|
273 $this->functions,
|
Chris@14
|
274 $child->getFunctions()
|
Chris@14
|
275 );
|
Chris@14
|
276 }
|
Chris@14
|
277 }
|
Chris@14
|
278
|
Chris@14
|
279 return $this->functions;
|
Chris@14
|
280 }
|
Chris@14
|
281
|
Chris@14
|
282 /**
|
Chris@14
|
283 * Returns the LOC/CLOC/NCLOC of this node.
|
Chris@14
|
284 *
|
Chris@14
|
285 * @return array
|
Chris@14
|
286 */
|
Chris@14
|
287 public function getLinesOfCode()
|
Chris@14
|
288 {
|
Chris@14
|
289 if ($this->linesOfCode === null) {
|
Chris@14
|
290 $this->linesOfCode = ['loc' => 0, 'cloc' => 0, 'ncloc' => 0];
|
Chris@14
|
291
|
Chris@14
|
292 foreach ($this->children as $child) {
|
Chris@14
|
293 $linesOfCode = $child->getLinesOfCode();
|
Chris@14
|
294
|
Chris@14
|
295 $this->linesOfCode['loc'] += $linesOfCode['loc'];
|
Chris@14
|
296 $this->linesOfCode['cloc'] += $linesOfCode['cloc'];
|
Chris@14
|
297 $this->linesOfCode['ncloc'] += $linesOfCode['ncloc'];
|
Chris@14
|
298 }
|
Chris@14
|
299 }
|
Chris@14
|
300
|
Chris@14
|
301 return $this->linesOfCode;
|
Chris@14
|
302 }
|
Chris@14
|
303
|
Chris@14
|
304 /**
|
Chris@14
|
305 * Returns the number of executable lines.
|
Chris@14
|
306 *
|
Chris@14
|
307 * @return int
|
Chris@14
|
308 */
|
Chris@14
|
309 public function getNumExecutableLines()
|
Chris@14
|
310 {
|
Chris@14
|
311 if ($this->numExecutableLines == -1) {
|
Chris@14
|
312 $this->numExecutableLines = 0;
|
Chris@14
|
313
|
Chris@14
|
314 foreach ($this->children as $child) {
|
Chris@14
|
315 $this->numExecutableLines += $child->getNumExecutableLines();
|
Chris@14
|
316 }
|
Chris@14
|
317 }
|
Chris@14
|
318
|
Chris@14
|
319 return $this->numExecutableLines;
|
Chris@14
|
320 }
|
Chris@14
|
321
|
Chris@14
|
322 /**
|
Chris@14
|
323 * Returns the number of executed lines.
|
Chris@14
|
324 *
|
Chris@14
|
325 * @return int
|
Chris@14
|
326 */
|
Chris@14
|
327 public function getNumExecutedLines()
|
Chris@14
|
328 {
|
Chris@14
|
329 if ($this->numExecutedLines == -1) {
|
Chris@14
|
330 $this->numExecutedLines = 0;
|
Chris@14
|
331
|
Chris@14
|
332 foreach ($this->children as $child) {
|
Chris@14
|
333 $this->numExecutedLines += $child->getNumExecutedLines();
|
Chris@14
|
334 }
|
Chris@14
|
335 }
|
Chris@14
|
336
|
Chris@14
|
337 return $this->numExecutedLines;
|
Chris@14
|
338 }
|
Chris@14
|
339
|
Chris@14
|
340 /**
|
Chris@14
|
341 * Returns the number of classes.
|
Chris@14
|
342 *
|
Chris@14
|
343 * @return int
|
Chris@14
|
344 */
|
Chris@14
|
345 public function getNumClasses()
|
Chris@14
|
346 {
|
Chris@14
|
347 if ($this->numClasses == -1) {
|
Chris@14
|
348 $this->numClasses = 0;
|
Chris@14
|
349
|
Chris@14
|
350 foreach ($this->children as $child) {
|
Chris@14
|
351 $this->numClasses += $child->getNumClasses();
|
Chris@14
|
352 }
|
Chris@14
|
353 }
|
Chris@14
|
354
|
Chris@14
|
355 return $this->numClasses;
|
Chris@14
|
356 }
|
Chris@14
|
357
|
Chris@14
|
358 /**
|
Chris@14
|
359 * Returns the number of tested classes.
|
Chris@14
|
360 *
|
Chris@14
|
361 * @return int
|
Chris@14
|
362 */
|
Chris@14
|
363 public function getNumTestedClasses()
|
Chris@14
|
364 {
|
Chris@14
|
365 if ($this->numTestedClasses == -1) {
|
Chris@14
|
366 $this->numTestedClasses = 0;
|
Chris@14
|
367
|
Chris@14
|
368 foreach ($this->children as $child) {
|
Chris@14
|
369 $this->numTestedClasses += $child->getNumTestedClasses();
|
Chris@14
|
370 }
|
Chris@14
|
371 }
|
Chris@14
|
372
|
Chris@14
|
373 return $this->numTestedClasses;
|
Chris@14
|
374 }
|
Chris@14
|
375
|
Chris@14
|
376 /**
|
Chris@14
|
377 * Returns the number of traits.
|
Chris@14
|
378 *
|
Chris@14
|
379 * @return int
|
Chris@14
|
380 */
|
Chris@14
|
381 public function getNumTraits()
|
Chris@14
|
382 {
|
Chris@14
|
383 if ($this->numTraits == -1) {
|
Chris@14
|
384 $this->numTraits = 0;
|
Chris@14
|
385
|
Chris@14
|
386 foreach ($this->children as $child) {
|
Chris@14
|
387 $this->numTraits += $child->getNumTraits();
|
Chris@14
|
388 }
|
Chris@14
|
389 }
|
Chris@14
|
390
|
Chris@14
|
391 return $this->numTraits;
|
Chris@14
|
392 }
|
Chris@14
|
393
|
Chris@14
|
394 /**
|
Chris@14
|
395 * Returns the number of tested traits.
|
Chris@14
|
396 *
|
Chris@14
|
397 * @return int
|
Chris@14
|
398 */
|
Chris@14
|
399 public function getNumTestedTraits()
|
Chris@14
|
400 {
|
Chris@14
|
401 if ($this->numTestedTraits == -1) {
|
Chris@14
|
402 $this->numTestedTraits = 0;
|
Chris@14
|
403
|
Chris@14
|
404 foreach ($this->children as $child) {
|
Chris@14
|
405 $this->numTestedTraits += $child->getNumTestedTraits();
|
Chris@14
|
406 }
|
Chris@14
|
407 }
|
Chris@14
|
408
|
Chris@14
|
409 return $this->numTestedTraits;
|
Chris@14
|
410 }
|
Chris@14
|
411
|
Chris@14
|
412 /**
|
Chris@14
|
413 * Returns the number of methods.
|
Chris@14
|
414 *
|
Chris@14
|
415 * @return int
|
Chris@14
|
416 */
|
Chris@14
|
417 public function getNumMethods()
|
Chris@14
|
418 {
|
Chris@14
|
419 if ($this->numMethods == -1) {
|
Chris@14
|
420 $this->numMethods = 0;
|
Chris@14
|
421
|
Chris@14
|
422 foreach ($this->children as $child) {
|
Chris@14
|
423 $this->numMethods += $child->getNumMethods();
|
Chris@14
|
424 }
|
Chris@14
|
425 }
|
Chris@14
|
426
|
Chris@14
|
427 return $this->numMethods;
|
Chris@14
|
428 }
|
Chris@14
|
429
|
Chris@14
|
430 /**
|
Chris@14
|
431 * Returns the number of tested methods.
|
Chris@14
|
432 *
|
Chris@14
|
433 * @return int
|
Chris@14
|
434 */
|
Chris@14
|
435 public function getNumTestedMethods()
|
Chris@14
|
436 {
|
Chris@14
|
437 if ($this->numTestedMethods == -1) {
|
Chris@14
|
438 $this->numTestedMethods = 0;
|
Chris@14
|
439
|
Chris@14
|
440 foreach ($this->children as $child) {
|
Chris@14
|
441 $this->numTestedMethods += $child->getNumTestedMethods();
|
Chris@14
|
442 }
|
Chris@14
|
443 }
|
Chris@14
|
444
|
Chris@14
|
445 return $this->numTestedMethods;
|
Chris@14
|
446 }
|
Chris@14
|
447
|
Chris@14
|
448 /**
|
Chris@14
|
449 * Returns the number of functions.
|
Chris@14
|
450 *
|
Chris@14
|
451 * @return int
|
Chris@14
|
452 */
|
Chris@14
|
453 public function getNumFunctions()
|
Chris@14
|
454 {
|
Chris@14
|
455 if ($this->numFunctions == -1) {
|
Chris@14
|
456 $this->numFunctions = 0;
|
Chris@14
|
457
|
Chris@14
|
458 foreach ($this->children as $child) {
|
Chris@14
|
459 $this->numFunctions += $child->getNumFunctions();
|
Chris@14
|
460 }
|
Chris@14
|
461 }
|
Chris@14
|
462
|
Chris@14
|
463 return $this->numFunctions;
|
Chris@14
|
464 }
|
Chris@14
|
465
|
Chris@14
|
466 /**
|
Chris@14
|
467 * Returns the number of tested functions.
|
Chris@14
|
468 *
|
Chris@14
|
469 * @return int
|
Chris@14
|
470 */
|
Chris@14
|
471 public function getNumTestedFunctions()
|
Chris@14
|
472 {
|
Chris@14
|
473 if ($this->numTestedFunctions == -1) {
|
Chris@14
|
474 $this->numTestedFunctions = 0;
|
Chris@14
|
475
|
Chris@14
|
476 foreach ($this->children as $child) {
|
Chris@14
|
477 $this->numTestedFunctions += $child->getNumTestedFunctions();
|
Chris@14
|
478 }
|
Chris@14
|
479 }
|
Chris@14
|
480
|
Chris@14
|
481 return $this->numTestedFunctions;
|
Chris@14
|
482 }
|
Chris@14
|
483 }
|