protected function makePackageElement(\DOMDocument $document, score\coverage $coverage) { $package = $document->createElement('package'); $package->setAttribute('name', $this->getPackage()); foreach ($coverage->getClasses() as $class => $file) { $package->appendChild($this->makeFileElement($document, $file, $class, $coverage->getCoverageForClass($class))); } $package->appendChild($this->makePackageMetricsElement($document, sizeof($coverage->getClasses()))); return $package; }
public function testGetCoverageForMethod() { $this->if($coverage = new testedClass())->then->array($coverage->getCoverageForClass(uniqid()))->isEmpty()->if($classController = new mock\controller())->and($classController->disableMethodChecking())->and($classController->__construct = function () { })->and($classController->getName = function () use(&$className) { return $className; })->and($classController->getFileName = function () use(&$classFile) { return $classFile; })->and($classController->getTraits = array())->and($classController->getStartLine = 1)->and($classController->getEndLine = 12)->and($class = new \mock\reflectionClass(uniqid(), $classController))->and($methodController = new mock\controller())->and($methodController->__construct = function () { })->and($methodController->getName = function () use(&$methodName) { return $methodName; })->and($methodController->isAbstract = false)->and($methodController->getFileName = function () use(&$classFile) { return $classFile; })->and($methodController->getDeclaringClass = function () use($class) { return $class; })->and($methodController->getStartLine = 4)->and($methodController->getEndLine = 8)->and($classController->getMethods = array(new \mock\reflectionMethod(uniqid(), uniqid(), $methodController)))->and($classFile = uniqid())->and($className = uniqid())->and($methodName = uniqid())->and($xdebugData = array($classFile => array(3 => -2, 4 => 1, 5 => -1, 6 => -1, 7 => -1, 8 => -2, 9 => -1), uniqid() => array(5 => 2, 6 => 3, 7 => 4, 8 => 3, 9 => 2)))->and($expected = array(4 => 1, 5 => -1, 6 => -1, 7 => -1, 8 => -2))->and($coverage = new testedClass())->and($coverage->setReflectionClassFactory(function () use($class) { return $class; }))->and($coverage->addXdebugDataForTest($this, $xdebugData))->then->array($coverage->getCoverageForMethod($className, $methodName))->isEqualTo($expected); }
/** * @param Coverage $coverage * * @return array */ protected function getCoverageReport(Coverage $coverage) { $sources = []; $directoriesCoverage = []; foreach ($coverage->getClasses() as $class => $file) { $path = new Path($file); $source = $this->getSourceCode($path); $fileName = $this->getFileName($path); $hierarchy = $this->getHierarchy($fileName); $linesCoverage = $this->getLinesCoverage($coverage->getCoverageForClass($class)); foreach ($hierarchy as $item) { $itemPath = $item['path']; $itemName = $item['name']; $itemType = $item['type']; if (isset($directoriesCoverage[$itemPath])) { $directoriesCoverage[$itemPath]['relevantLines'] += $linesCoverage['relevantLines']; $directoriesCoverage[$itemPath]['coveredLines'] += $linesCoverage['coveredLines']; $directoriesCoverage[$itemPath]['totalLines'] += count($linesCoverage['lines']); } else { $directoriesCoverage[$itemPath] = ['directories' => [], 'files' => [], 'relevantLines' => $linesCoverage['relevantLines'], 'coveredLines' => $linesCoverage['coveredLines'], 'totalLines' => count($linesCoverage['lines'])]; } if ($itemType == 'directory') { $directoriesCoverage[$itemPath]['directories'][$itemName] = ['relevantLines' => 0, 'coveredLines' => 0, 'totalLines' => 0]; } else { $calculatedCoverage = 1; if ($linesCoverage['relevantLines'] > 0) { $calculatedCoverage = (double) ($linesCoverage['coveredLines'] / $linesCoverage['relevantLines']); } $directoriesCoverage[$itemPath]['files'][$itemName] = ['relevantLines' => $linesCoverage['relevantLines'], 'coveredLines' => $linesCoverage['coveredLines'], 'totalLines' => count($linesCoverage['lines']), 'coverage' => $calculatedCoverage]; } } foreach ($directoriesCoverage as $path => &$directoryCoverageItem) { $calculatedCoverage = 1; if ($directoryCoverageItem['relevantLines'] > 0) { $calculatedCoverage = (double) ($directoryCoverageItem['coveredLines'] / $directoryCoverageItem['relevantLines']); } $directoryCoverageItem['coverage'] = $calculatedCoverage; foreach ($directoryCoverageItem['directories'] as $directoryName => &$directoryCoverage) { $directoryCoverage['relevantLines'] = $directoriesCoverage[$path . $directoryName . '/']['relevantLines']; $directoryCoverage['coveredLines'] = $directoriesCoverage[$path . $directoryName . '/']['coveredLines']; $directoryCoverage['totalLines'] = $directoriesCoverage[$path . $directoryName . '/']['totalLines']; $calculatedCoverage = 1; if ($directoryCoverage['relevantLines'] > 0) { $calculatedCoverage = (double) ($directoryCoverage['coveredLines'] / $directoryCoverage['relevantLines']); } $directoryCoverage['coverage'] = $calculatedCoverage; } } $sources[] = ['name' => $fileName, 'className' => str_replace(array('.php', '/'), array('', '\\'), $fileName), 'source' => $source, 'coverage' => $linesCoverage]; } return ['sources' => $sources, 'directories' => $directoriesCoverage, 'relevantLines' => $directoriesCoverage['/']['relevantLines'], 'coveredLines' => $directoriesCoverage['/']['coveredLines']]; }
protected function makeSourceElement(score\coverage $coverage) { $sources = array(); foreach ($coverage->getClasses() as $class => $file) { $path = new atoum\fs\path($file); $source = $this->adapter->file_get_contents((string) $path->resolve()); $sources[] = array('name' => ltrim((string) $path->relativizeFrom($this->sourceDir), '.' . DIRECTORY_SEPARATOR), 'source' => $source, 'coverage' => $this->makeCoverageElement($coverage->getCoverageForClass($class))); } return $sources; }