Chris@14: Chris@14: * Chris@14: * For the full copyright and license information, please view the LICENSE Chris@14: * file that was distributed with this source code. Chris@14: */ Chris@14: Chris@14: namespace SebastianBergmann\CodeCoverage\Node; Chris@14: Chris@14: use SebastianBergmann\CodeCoverage\InvalidArgumentException; Chris@14: Chris@14: /** Chris@14: * Represents a directory in the code coverage information tree. Chris@14: */ Chris@14: class Directory extends AbstractNode implements \IteratorAggregate Chris@14: { Chris@14: /** Chris@14: * @var AbstractNode[] Chris@14: */ Chris@14: private $children = []; Chris@14: Chris@14: /** Chris@14: * @var Directory[] Chris@14: */ Chris@14: private $directories = []; Chris@14: Chris@14: /** Chris@14: * @var File[] Chris@14: */ Chris@14: private $files = []; Chris@14: Chris@14: /** Chris@14: * @var array Chris@14: */ Chris@14: private $classes; Chris@14: Chris@14: /** Chris@14: * @var array Chris@14: */ Chris@14: private $traits; Chris@14: Chris@14: /** Chris@14: * @var array Chris@14: */ Chris@14: private $functions; Chris@14: Chris@14: /** Chris@14: * @var array Chris@14: */ Chris@14: private $linesOfCode = null; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numFiles = -1; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numExecutableLines = -1; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numExecutedLines = -1; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numClasses = -1; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numTestedClasses = -1; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numTraits = -1; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numTestedTraits = -1; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numMethods = -1; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numTestedMethods = -1; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numFunctions = -1; Chris@14: Chris@14: /** Chris@14: * @var int Chris@14: */ Chris@14: private $numTestedFunctions = -1; Chris@14: Chris@14: /** Chris@14: * Returns the number of files in/under this node. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function count() Chris@14: { Chris@14: if ($this->numFiles == -1) { Chris@14: $this->numFiles = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numFiles += \count($child); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numFiles; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns an iterator for this node. Chris@14: * Chris@14: * @return \RecursiveIteratorIterator Chris@14: */ Chris@14: public function getIterator() Chris@14: { Chris@14: return new \RecursiveIteratorIterator( Chris@14: new Iterator($this), Chris@14: \RecursiveIteratorIterator::SELF_FIRST Chris@14: ); Chris@14: } Chris@14: Chris@14: /** Chris@14: * Adds a new directory. Chris@14: * Chris@14: * @param string $name Chris@14: * Chris@14: * @return Directory Chris@14: */ Chris@14: public function addDirectory($name) Chris@14: { Chris@14: $directory = new self($name, $this); Chris@14: Chris@14: $this->children[] = $directory; Chris@14: $this->directories[] = &$this->children[\count($this->children) - 1]; Chris@14: Chris@14: return $directory; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Adds a new file. Chris@14: * Chris@14: * @param string $name Chris@14: * @param array $coverageData Chris@14: * @param array $testData Chris@14: * @param bool $cacheTokens Chris@14: * Chris@14: * @return File Chris@14: * Chris@14: * @throws InvalidArgumentException Chris@14: */ Chris@14: public function addFile($name, array $coverageData, array $testData, $cacheTokens) Chris@14: { Chris@14: $file = new File( Chris@14: $name, Chris@14: $this, Chris@14: $coverageData, Chris@14: $testData, Chris@14: $cacheTokens Chris@14: ); Chris@14: Chris@14: $this->children[] = $file; Chris@14: $this->files[] = &$this->children[\count($this->children) - 1]; Chris@14: Chris@14: $this->numExecutableLines = -1; Chris@14: $this->numExecutedLines = -1; Chris@14: Chris@14: return $file; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the directories in this directory. Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getDirectories() Chris@14: { Chris@14: return $this->directories; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the files in this directory. Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getFiles() Chris@14: { Chris@14: return $this->files; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the child nodes of this node. Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getChildNodes() Chris@14: { Chris@14: return $this->children; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the classes of this node. Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getClasses() Chris@14: { Chris@14: if ($this->classes === null) { Chris@14: $this->classes = []; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->classes = \array_merge( Chris@14: $this->classes, Chris@14: $child->getClasses() Chris@14: ); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->classes; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the traits of this node. Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getTraits() Chris@14: { Chris@14: if ($this->traits === null) { Chris@14: $this->traits = []; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->traits = \array_merge( Chris@14: $this->traits, Chris@14: $child->getTraits() Chris@14: ); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->traits; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the functions of this node. Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getFunctions() Chris@14: { Chris@14: if ($this->functions === null) { Chris@14: $this->functions = []; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->functions = \array_merge( Chris@14: $this->functions, Chris@14: $child->getFunctions() Chris@14: ); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->functions; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the LOC/CLOC/NCLOC of this node. Chris@14: * Chris@14: * @return array Chris@14: */ Chris@14: public function getLinesOfCode() Chris@14: { Chris@14: if ($this->linesOfCode === null) { Chris@14: $this->linesOfCode = ['loc' => 0, 'cloc' => 0, 'ncloc' => 0]; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $linesOfCode = $child->getLinesOfCode(); Chris@14: Chris@14: $this->linesOfCode['loc'] += $linesOfCode['loc']; Chris@14: $this->linesOfCode['cloc'] += $linesOfCode['cloc']; Chris@14: $this->linesOfCode['ncloc'] += $linesOfCode['ncloc']; Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->linesOfCode; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the number of executable lines. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function getNumExecutableLines() Chris@14: { Chris@14: if ($this->numExecutableLines == -1) { Chris@14: $this->numExecutableLines = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numExecutableLines += $child->getNumExecutableLines(); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numExecutableLines; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the number of executed lines. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function getNumExecutedLines() Chris@14: { Chris@14: if ($this->numExecutedLines == -1) { Chris@14: $this->numExecutedLines = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numExecutedLines += $child->getNumExecutedLines(); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numExecutedLines; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the number of classes. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function getNumClasses() Chris@14: { Chris@14: if ($this->numClasses == -1) { Chris@14: $this->numClasses = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numClasses += $child->getNumClasses(); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numClasses; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the number of tested classes. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function getNumTestedClasses() Chris@14: { Chris@14: if ($this->numTestedClasses == -1) { Chris@14: $this->numTestedClasses = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numTestedClasses += $child->getNumTestedClasses(); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numTestedClasses; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the number of traits. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function getNumTraits() Chris@14: { Chris@14: if ($this->numTraits == -1) { Chris@14: $this->numTraits = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numTraits += $child->getNumTraits(); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numTraits; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the number of tested traits. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function getNumTestedTraits() Chris@14: { Chris@14: if ($this->numTestedTraits == -1) { Chris@14: $this->numTestedTraits = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numTestedTraits += $child->getNumTestedTraits(); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numTestedTraits; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the number of methods. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function getNumMethods() Chris@14: { Chris@14: if ($this->numMethods == -1) { Chris@14: $this->numMethods = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numMethods += $child->getNumMethods(); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numMethods; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the number of tested methods. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function getNumTestedMethods() Chris@14: { Chris@14: if ($this->numTestedMethods == -1) { Chris@14: $this->numTestedMethods = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numTestedMethods += $child->getNumTestedMethods(); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numTestedMethods; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the number of functions. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function getNumFunctions() Chris@14: { Chris@14: if ($this->numFunctions == -1) { Chris@14: $this->numFunctions = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numFunctions += $child->getNumFunctions(); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numFunctions; Chris@14: } Chris@14: Chris@14: /** Chris@14: * Returns the number of tested functions. Chris@14: * Chris@14: * @return int Chris@14: */ Chris@14: public function getNumTestedFunctions() Chris@14: { Chris@14: if ($this->numTestedFunctions == -1) { Chris@14: $this->numTestedFunctions = 0; Chris@14: Chris@14: foreach ($this->children as $child) { Chris@14: $this->numTestedFunctions += $child->getNumTestedFunctions(); Chris@14: } Chris@14: } Chris@14: Chris@14: return $this->numTestedFunctions; Chris@14: } Chris@14: }