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 test__toString() { $this->if($scoreCoverage = new score\coverage())->and($score = new \mock\mageekguy\atoum\runner\score())->and($score->getMockController()->getCoverage = function () use($scoreCoverage) { return $scoreCoverage; })->and($runner = new atoum\runner())->and($runner->setScore($score))->and($defaultField = new testedClass())->and($customField = new testedClass())->and($customField->setTitlePrompt($titlePrompt = new prompt(uniqid())))->and($customField->setClassPrompt($classPrompt = new prompt(uniqid())))->and($customField->setMethodPrompt($methodPrompt = new prompt(uniqid())))->and($customField->setTitleColorizer($titleColorizer = new colorizer(uniqid(), uniqid())))->and($customField->setCoverageColorizer($coverageColorizer = new colorizer(uniqid(), uniqid())))->and($customField->setLocale($locale = new locale()))->then->castToString($defaultField)->isEmpty()->castToString($customField)->isEmpty()->if($defaultField->handleEvent(atoum\runner::runStart, $runner))->and($customField->handleEvent(atoum\runner::runStart, $runner))->then->castToString($defaultField)->isEmpty()->castToString($customField)->isEmpty()->if($defaultField->handleEvent(atoum\runner::runStop, $runner))->and($customField->handleEvent(atoum\runner::runStop, $runner))->then->castToString($defaultField)->isEmpty()->castToString($customField)->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->isAbstract = false)->and($methodController->getFileName = function () use(&$classFile) { return $classFile; })->and($methodController->getDeclaringClass = $class)->and($methodController->getName = function () use(&$methodName) { return $methodName; })->and($methodController->getStartLine = 6)->and($methodController->getEndLine = 8)->and($classController->getMethods = array(new \mock\reflectionMethod(uniqid(), uniqid(), $methodController)))->and($className = uniqid())->and($methodName = uniqid())->and($scoreCoverage->setReflectionClassFactory(function () use($class) { return $class; }))->and($scoreCoverage->addXdebugDataForTest($this, $xdebugData = array($classFile = uniqid() => array(5 => 1, 6 => 2, 7 => 3, 8 => 2, 9 => 1), uniqid() => array(5 => 2, 6 => 3, 7 => 4, 8 => 3, 9 => 2))))->and($defaultField = new testedClass())->and($customField = new testedClass())->and($customField->setTitlePrompt($titlePrompt = new prompt(uniqid())))->and($customField->setClassPrompt($classPrompt = new prompt(uniqid())))->and($customField->setMethodPrompt($methodPrompt = new prompt(uniqid())))->and($customField->setTitleColorizer($titleColorizer = new colorizer(uniqid(), uniqid())))->and($customField->setCoverageColorizer($coverageColorizer = new colorizer(uniqid(), uniqid())))->and($customField->setLocale($locale = new locale()))->then->castToString($defaultField)->isEmpty()->castToString($customField)->isEmpty()->if($defaultField->handleEvent(atoum\runner::runStart, $runner))->and($customField->handleEvent(atoum\runner::runStart, $runner))->then->castToString($defaultField)->isEmpty()->castToString($customField)->isEmpty()->if($defaultField->handleEvent(atoum\runner::runStop, $runner))->and($customField->handleEvent(atoum\runner::runStop, $runner))->then->castToString($defaultField)->isEqualTo($defaultField->getTitlePrompt() . sprintf($defaultField->getLocale()->_('Code coverage value : %3.2f%%'), $scoreCoverage->getValue() * 100) . PHP_EOL . $defaultField->getClassPrompt() . sprintf($defaultField->getLocale()->_('Class %s: %3.2f%%'), $className, $scoreCoverage->getValueForClass($className) * 100.0) . PHP_EOL . $defaultField->getMethodPrompt() . sprintf($defaultField->getLocale()->_(' ::%s(): %3.2f%%'), $methodName, $scoreCoverage->getValueForMethod($className, $methodName) * 100.0) . PHP_EOL)->castToString($customField)->isEqualTo($titlePrompt . sprintf($locale->_('%s : %s'), $titleColorizer->colorize($locale->_('Code coverage value')), $coverageColorizer->colorize(sprintf('%3.2f%%', $scoreCoverage->getValue() * 100.0))) . PHP_EOL . $classPrompt . sprintf($locale->_('%s: %s'), $titleColorizer->colorize(sprintf($locale->_('Class %s'), $className)), $coverageColorizer->colorize(sprintf('%3.2f%%', $scoreCoverage->getValueForClass($className) * 100.0))) . PHP_EOL . $methodPrompt . sprintf($locale->_('%s: %s'), $titleColorizer->colorize(sprintf($locale->_(' ::%s()'), $methodName)), $coverageColorizer->colorize(sprintf('%3.2f%%', $scoreCoverage->getValueForClass($className, $methodName) * 100.0))) . PHP_EOL); }
public function testIsInExcludedDirectories() { $this->if($coverage = new testedClass())->then->boolean($coverage->isInExcludedDirectories(uniqid()))->isFalse()->if($coverage->excludeDirectory($directory = uniqid()))->then->boolean($coverage->isInExcludedDirectories(uniqid()))->isFalse()->boolean($coverage->isInExcludedDirectories($directory . DIRECTORY_SEPARATOR . uniqid()))->isTrue()->boolean($coverage->isInExcludedDirectories($directory . uniqid() . DIRECTORY_SEPARATOR . uniqid()))->isFalse(); }
/** * @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; }
public function merge(score\coverage $coverage) { $paths = $coverage->getPaths(); $branches = $coverage->getBranches(); $classes = $coverage->getClasses(); $methods = $coverage->getMethods(); foreach ($methods as $class => $methods) { $reflectedClass = call_user_func($this->reflectionClassFactory, $class); if ($this->isExcluded($reflectedClass) === false) { if (isset($this->classes[$class]) === false) { $this->classes[$class] = $classes[$class]; } if (isset($paths[$class]) && isset($this->paths[$class]) === false) { $this->paths[$class] = $paths[$class]; } if (isset($branches[$class]) && isset($this->branches[$class]) === false) { $this->branches[$class] = $branches[$class]; } foreach ($methods as $method => $lines) { if (isset($paths[$class]) === true) { if (isset($this->paths[$class][$method]) === false) { $this->paths[$class][$method] = $paths[$class][$method]; } foreach ($paths[$class][$method] as $index => $path) { if ($this->paths[$class][$method][$index]['hit'] < $path['hit']) { $this->paths[$class][$method][$index]['hit'] = $path['hit']; } } } if (isset($branches[$class]) === true) { if (isset($this->branches[$class][$method]) === false) { $this->branches[$class][$method] = $branches[$class][$method]; } foreach ($branches[$class][$method] as $index => $branch) { if ($this->branches[$class][$method][$index]['hit'] < $branch['hit']) { $this->branches[$class][$method][$index]['hit'] = $branch['hit']; } foreach ($branch['out'] as $outIndex => $outOp) { if (isset($this->branches[$class][$method][$index]['out'][$outIndex]) === false) { $this->branches[$class][$method][$index]['out'][$outIndex] = $outOp; } } foreach ($branch['out_hit'] as $outIndex => $hit) { if (isset($this->branches[$class][$method][$index]['out_hit'][$outIndex]) === false) { $this->branches[$class][$method][$index]['out_hit'][$outIndex] = $hit; } else { if ($this->branches[$class][$method][$index]['out_hit'][$outIndex] < $hit) { $this->branches[$class][$method][$index]['out_hit'][$outIndex] = $hit; } } } } } if (isset($this->methods[$class][$method]) === true || $this->isExcluded($this->getDeclaringClass($reflectedClass->getMethod($method))) === false) { foreach ($lines as $line => $call) { if (isset($this->methods[$class][$method][$line]) === false || $this->methods[$class][$method][$line] < $call) { $this->methods[$class][$method][$line] = $call; } } } } } } return $this; }
public function merge(score\coverage $coverage) { $classes = $coverage->getClasses(); $methods = $coverage->getMethods(); foreach ($methods as $class => $methods) { $reflectedClass = call_user_func($this->reflectionClassFactory, $class); if ($this->isExcluded($reflectedClass) === false) { if (isset($this->classes[$class]) === false) { $this->classes[$class] = $classes[$class]; } foreach ($methods as $method => $lines) { if (isset($this->methods[$class][$method]) === true || $this->isExcluded($this->getDeclaringClass($reflectedClass->getMethod($method))) === false) { foreach ($lines as $line => $call) { if (isset($this->methods[$class][$method][$line]) === false || $this->methods[$class][$method][$line] < $call) { $this->methods[$class][$method][$line] = $call; } } } } } } return $this; }