From 84afef3c212e5c73163195fb968d2ab11cb05c98 Mon Sep 17 00:00:00 2001 From: Arne Blankerts Date: Fri, 2 Aug 2013 02:13:55 +0200 Subject: [PATCH 1/2] 1st working implementation of XML based code coverage output --- PHP/CodeCoverage/Autoload.php | 11 ++ PHP/CodeCoverage/Report/XML.php | 180 ++++++++++++++++++ PHP/CodeCoverage/Report/XML/Directory.php | 4 + PHP/CodeCoverage/Report/XML/File.php | 42 ++++ PHP/CodeCoverage/Report/XML/File/Coverage.php | 22 +++ PHP/CodeCoverage/Report/XML/File/Method.php | 36 ++++ PHP/CodeCoverage/Report/XML/File/Report.php | 41 ++++ PHP/CodeCoverage/Report/XML/File/Unit.php | 54 ++++++ PHP/CodeCoverage/Report/XML/Node.php | 56 ++++++ PHP/CodeCoverage/Report/XML/Project.php | 32 ++++ PHP/CodeCoverage/Report/XML/Tests.php | 18 ++ PHP/CodeCoverage/Report/XML/Totals.php | 87 +++++++++ 12 files changed, 583 insertions(+) create mode 100644 PHP/CodeCoverage/Report/XML.php create mode 100644 PHP/CodeCoverage/Report/XML/Directory.php create mode 100644 PHP/CodeCoverage/Report/XML/File.php create mode 100644 PHP/CodeCoverage/Report/XML/File/Coverage.php create mode 100644 PHP/CodeCoverage/Report/XML/File/Method.php create mode 100644 PHP/CodeCoverage/Report/XML/File/Report.php create mode 100644 PHP/CodeCoverage/Report/XML/File/Unit.php create mode 100644 PHP/CodeCoverage/Report/XML/Node.php create mode 100644 PHP/CodeCoverage/Report/XML/Project.php create mode 100644 PHP/CodeCoverage/Report/XML/Tests.php create mode 100644 PHP/CodeCoverage/Report/XML/Totals.php diff --git a/PHP/CodeCoverage/Autoload.php b/PHP/CodeCoverage/Autoload.php index dfc810774..6c3b8abc4 100644 --- a/PHP/CodeCoverage/Autoload.php +++ b/PHP/CodeCoverage/Autoload.php @@ -80,6 +80,17 @@ function ($class) 'php_codecoverage_report_node_iterator' => '/CodeCoverage/Report/Node/Iterator.php', 'php_codecoverage_report_php' => '/CodeCoverage/Report/PHP.php', 'php_codecoverage_report_text' => '/CodeCoverage/Report/Text.php', + 'php_codecoverage_report_xml' => '/CodeCoverage/Report/XML.php', + 'php_codecoverage_report_xml_directory' => '/CodeCoverage/Report/XML/Directory.php', + 'php_codecoverage_report_xml_file' => '/CodeCoverage/Report/XML/File.php', + 'php_codecoverage_report_xml_file_coverage' => '/CodeCoverage/Report/XML/File/Coverage.php', + 'php_codecoverage_report_xml_file_method' => '/CodeCoverage/Report/XML/File/Method.php', + 'php_codecoverage_report_xml_file_report' => '/CodeCoverage/Report/XML/File/Report.php', + 'php_codecoverage_report_xml_file_unit' => '/CodeCoverage/Report/XML/File/Unit.php', + 'php_codecoverage_report_xml_node' => '/CodeCoverage/Report/XML/Node.php', + 'php_codecoverage_report_xml_project' => '/CodeCoverage/Report/XML/Project.php', + 'php_codecoverage_report_xml_tests' => '/CodeCoverage/Report/XML/Tests.php', + 'php_codecoverage_report_xml_totals' => '/CodeCoverage/Report/XML/Totals.php', 'php_codecoverage_util' => '/CodeCoverage/Util.php', 'php_codecoverage_util_invalidargumenthelper' => '/CodeCoverage/Util/InvalidArgumentHelper.php' ); diff --git a/PHP/CodeCoverage/Report/XML.php b/PHP/CodeCoverage/Report/XML.php new file mode 100644 index 000000000..d60faa768 --- /dev/null +++ b/PHP/CodeCoverage/Report/XML.php @@ -0,0 +1,180 @@ +target = $target; + $this->initTargetDirectory($target); + $report = $coverage->getReport(); + + $this->project = new PHP_CodeCoverage_Report_XML_Project( + $coverage->getReport()->getName() + ); + $this->processTests($coverage->getTests()); + + $this->processDirectory($report, $this->project); + + $index = $this->project->asDom(); + $index->formatOutput = true; + $index->preserveWhiteSpace = false; + $index->save($target . '/index.xml'); + } + + private function initTargetDirectory($dir) { + if (file_exists($dir)) { + + if (!is_dir($dir)) { + throw new PHP_CodeCoverage_Exception("'$dir' exists but is not a directory."); + } + + if (!is_writable($dir)) { + throw new PHP_CodeCoverage_Exception("'$dir' exists but is not writable."); + } + } else if (!@mkdir($dir, 0777, true)) { + throw new PHP_CodeCoverage_Exception("'$dir' could not be created."); + } + } + + private function processDirectory(PHP_CodeCoverage_Report_Node_Directory $directory, PHP_CodeCoverage_Report_XML_Node $context) { + $dirObject = $context->addDirectory($directory->getName()); + $this->setTotals($directory, $dirObject->getTotals()); + foreach($directory as $node) { + if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) { + $this->processDirectory($node, $dirObject); + continue; + } + if ($node instanceof PHP_CodeCoverage_Report_Node_File) { + $this->processFile($node, $dirObject); + continue; + } + throw new PHP_CodeCoverage_Exception('Unknown node type for XML Report'); + } + } + + private function processFile(PHP_CodeCoverage_Report_Node_File $file, PHP_CodeCoverage_Report_XML_Directory $context) { + $fileObject = $context->addFile($file->getName(), $file->getId() . '.xml'); + $this->setTotals($file, $fileObject->getTotals()); + + $fileReport = new PHP_CodeCoverage_Report_XML_File_Report($file->getName()); + $this->setTotals($file, $fileReport->getTotals()); + + foreach($file->getClassesAndTraits() as $unit) { + $this->processUnit($unit, $fileReport); + } + + foreach($file->getFunctions() as $function) { + $this->processFunction($function, $fileReport); + } + + foreach($file->getCoverageData() as $line => $tests) { + if (!is_array($tests) || count($tests) == 0) { + continue; + } + $coverage = $fileReport->getLineCoverage($line); + foreach($tests as $test) { + $coverage->addTest($test); + } + } + + $this->initTargetDirectory($this->target . dirname($file->getId()) . '/'); + $fileDom = $fileReport->asDom(); + $fileDom->formatOutput = true; + $fileDom->preserveWhiteSpace = false; + $fileDom->save($this->target . $file->getId() . '.xml'); + } + + private function processUnit($unit, PHP_CodeCoverage_Report_XML_File_Report $report) { + if (isset($unit['className'])) { + $unitObject = $report->getClassObject($unit['className']); + } else { + $unitObject = $report->getTraitObject($unit['traitName']); + } + + $unitObject->setLines( + $unit['startLine'], + $unit['executableLines'], + $unit['executedLines'] + ); + $unitObject->setCrap($unit['crap']); + + $unitObject->setPackage( + $unit['package']['fullPackage'], + $unit['package']['package'], + $unit['package']['subpackage'], + $unit['package']['category'] + ); + + $unitObject->setNamespace($unit['package']['namespace']); + + foreach($unit['methods'] as $method) { + $methodObject = $unitObject->addMethod($method['methodName']); + $methodObject->setSignature($method['signature']); + $methodObject->setLines($method['startLine'], $method['endLine']); + $methodObject->setCrap($method['crap']); + $methodObject->setTotals($method['executableLines'], $method['executedLines'], $method['coverage']); + } + } + + private function processFunction($function, PHP_CodeCoverage_Report_XML_File_Report $report) { + $functionObject = $report->getFunctionObject($function['functionName']); + $functionObject->setSignature($function['signature']); + $functionObject->setLines($function['startLine']); + $functionObject->setCrap($function['crap']); + $functionObject->setTotals($function['executableLines'], $function['executedLines'], $function['coverage']); + } + + private function processTests(array $tests) { + $testsObject = $this->project->getTests(); + foreach($tests as $test => $result) { + if ($test == 'UNCOVERED_FILES_FROM_WHITELIST') { + continue; + } + $testsObject->addTest($test, $result); + } + } + + private function setTotals(PHP_CodeCoverage_Report_Node $node, PHP_CodeCoverage_Report_XML_Totals $totals) { + $loc = $node->getLinesOfCode(); + $totals->setNumLines( + $loc['loc'], + $loc['cloc'], + $loc['ncloc'], + $node->getNumExecutableLines(), + $node->getNumExecutedLines() + ); + + $totals->setNumClasses( + $node->getNumClasses(), + $node->getNumTestedClasses() + ); + + $totals->setNumTraits( + $node->getNumTraits(), + $node->getNumTestedTraits() + ); + + $totals->setNumMethods( + $node->getNumMethods(), + $node->getNumTestedMethods() + ); + + $totals->setNumFunctions( + $node->getNumFunctions(), + $node->getNumTestedFunctions() + ); + } + +} diff --git a/PHP/CodeCoverage/Report/XML/Directory.php b/PHP/CodeCoverage/Report/XML/Directory.php new file mode 100644 index 000000000..008df0d16 --- /dev/null +++ b/PHP/CodeCoverage/Report/XML/Directory.php @@ -0,0 +1,4 @@ +contextNode = $context; + $this->dom = $context->ownerDocument; + } + + public function getTotals() { + $totalsContainer = $this->contextNode->firstChild; + if (!$totalsContainer) { + $totalsContainer = $this->contextNode->appendChild( + $this->dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'totals') + ); + } + return new PHP_CodeCoverage_Report_XML_Totals($totalsContainer); + } + + public function getLineCoverage($line) { + $coverage = $this->contextNode->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'coverage')->item(0); + if (!$coverage) { + $coverage = $this->contextNode->appendChild( + $this->dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'coverage') + ); + } + $lineNode = $coverage->appendChild( + $this->dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'line') + ); + return new PHP_CodeCoverage_Report_XML_File_Coverage($lineNode, $line); + } + +} diff --git a/PHP/CodeCoverage/Report/XML/File/Coverage.php b/PHP/CodeCoverage/Report/XML/File/Coverage.php new file mode 100644 index 000000000..1f67e8180 --- /dev/null +++ b/PHP/CodeCoverage/Report/XML/File/Coverage.php @@ -0,0 +1,22 @@ +contextNode = $context; + $this->setLine($line); + } + + private function setLine($line) { + $this->contextNode->setAttribute('nr', $line); + } + + public function addTest($test) { + $covered = $this->contextNode->appendChild( + $this->contextNode->ownerDocument->createElementNS('http://xml.phpunit.de/coverage/1.0', 'covered') + ); + $covered->setAttribute('by', $test); + } + +} diff --git a/PHP/CodeCoverage/Report/XML/File/Method.php b/PHP/CodeCoverage/Report/XML/File/Method.php new file mode 100644 index 000000000..5a895b813 --- /dev/null +++ b/PHP/CodeCoverage/Report/XML/File/Method.php @@ -0,0 +1,36 @@ +contextNode = $context; + $this->setName($name); + } + + private function setName($name) { + $this->contextNode->setAttribute('name', $name); + } + + public function setSignature($signature) { + $this->contextNode->setAttribute('signature', $signature); + } + + public function setLines($start, $end = NULL) { + $this->contextNode->setAttribute('start', $start); + if ($end !== NULL) { + $this->contextNode->setAttribute('end', $end); + } + } + + public function setTotals($executable, $executed, $coverage) { + $this->contextNode->setAttribute('executable', $executable); + $this->contextNode->setAttribute('executed', $executed); + $this->contextNode->setAttribute('coverage', $coverage); + } + + public function setCrap($crap) { + $this->contextNode->setAttribute('crap', $crap); + } + +} diff --git a/PHP/CodeCoverage/Report/XML/File/Report.php b/PHP/CodeCoverage/Report/XML/File/Report.php new file mode 100644 index 000000000..cdcb99ef0 --- /dev/null +++ b/PHP/CodeCoverage/Report/XML/File/Report.php @@ -0,0 +1,41 @@ +dom = new \DOMDocument(); + $this->dom->loadXML(''); + $this->contextNode = $this->dom->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'file')->item(0); + $this->setName($name); + } + + private function setName($name) { + $this->contextNode->setAttribute('name', $name); + } + + public function asDom() { + return $this->dom; + } + + public function getFunctionObject($name) { + $node = $this->contextNode->appendChild( + $this->dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'function') + ); + return new PHP_CodeCoverage_Report_XML_File_Method($node, $name); + } + + public function getClassObject($name) { + return $this->getUnitObject('class', $name); + } + + public function getTraitObject($name) { + return $this->getUnitObject('trait', $name); + } + + private function getUnitObject($tagName, $name) { + $node = $this->contextNode->appendChild( + $this->dom->createElementNS('http://xml.phpunit.de/coverage/1.0', $tagName) + ); + return new PHP_CodeCoverage_Report_XML_File_Unit($node, $name); + } + +} diff --git a/PHP/CodeCoverage/Report/XML/File/Unit.php b/PHP/CodeCoverage/Report/XML/File/Unit.php new file mode 100644 index 000000000..955af2f61 --- /dev/null +++ b/PHP/CodeCoverage/Report/XML/File/Unit.php @@ -0,0 +1,54 @@ +contextNode = $context; + $this->setName($name); + } + + private function setName($name) { + $this->contextNode->setAttribute('name', $name); + } + + public function setLines($start, $executable, $executed) { + $this->contextNode->setAttribute('start', $start); + $this->contextNode->setAttribute('executable', $executable); + $this->contextNode->setAttribute('executed', $executed); + } + + public function setCrap($crap) { + $this->contextNode->setAttribute('crap', $crap); + } + + public function setPackage($full, $package, $sub, $category) { + $node = $this->contextNode->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'package')->item(0); + if (!$node) { + $node = $this->contextNode->appendChild( + $this->contextNode->ownerDocument->createElementNS('http://xml.phpunit.de/coverage/1.0', 'package') + ); + } + $node->setAttribute('full', $full); + $node->setAttribute('name', $package); + $node->setAttribute('sub', $sub); + $node->setAttribute('category', $category); + } + + public function setNamespace($namespace) { + $node = $this->contextNode->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'namespace')->item(0); + if (!$node) { + $node = $this->contextNode->appendChild( + $this->contextNode->ownerDocument->createElementNS('http://xml.phpunit.de/coverage/1.0', 'namespace') + ); + } + $node->setAttribute('name', $namespace); + } + + public function addMethod($name) { + $node = $this->contextNode->appendChild( + $this->contextNode->ownerDocument->createElementNS('http://xml.phpunit.de/coverage/1.0', 'method') + ); + return new PHP_CodeCoverage_Report_XML_File_Method($node, $name); + } +} diff --git a/PHP/CodeCoverage/Report/XML/Node.php b/PHP/CodeCoverage/Report/XML/Node.php new file mode 100644 index 000000000..abf0ef125 --- /dev/null +++ b/PHP/CodeCoverage/Report/XML/Node.php @@ -0,0 +1,56 @@ +setContextNode($context); + } + + protected function setContextNode(\DOMElement $context) { + $this->contextNode = $context; + $this->dom = $context->ownerDocument; + } + + public function getDom() { + return $this->dom; + } + + protected function getContextNode() { + return $this->contextNode; + } + + public function getTotals() { + $totalsContainer = $this->getContextNode()->firstChild; + if (!$totalsContainer) { + $totalsContainer = $this->getContextNode()->appendChild( + $this->dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'totals') + ); + } + return new PHP_CodeCoverage_Report_XML_Totals($totalsContainer); + } + + public function addDirectory($name) { + $dirNode = $this->getDom()->createElementNS('http://xml.phpunit.de/coverage/1.0', 'directory'); + $dirNode->setAttribute('name', $name); + $this->getContextNode()->appendChild($dirNode); + return new PHP_CodeCoverage_Report_XML_Directory($dirNode); + } + + public function addFile($name, $href) { + $fileNode = $this->getDom()->createElementNS('http://xml.phpunit.de/coverage/1.0', 'file'); + $fileNode->setAttribute('name', $name); + $fileNode->setAttribute('href', $href); + $this->getContextNode()->appendChild($fileNode); + return new PHP_CodeCoverage_Report_XML_File($fileNode); + } + +} diff --git a/PHP/CodeCoverage/Report/XML/Project.php b/PHP/CodeCoverage/Report/XML/Project.php new file mode 100644 index 000000000..418efa2dc --- /dev/null +++ b/PHP/CodeCoverage/Report/XML/Project.php @@ -0,0 +1,32 @@ +init(); + $this->setProjectName($name); + } + + private function init() { + $dom = new DOMDocument(); + $dom->loadXML(''); + $this->setContextNode($dom->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'project')->item(0)); + } + + private function setProjectName($name) { + $this->getContextNode()->setAttribute('name', $name); + } + + public function getTests() { + $testsNode = $this->getContextNode()->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'tests')->item(0); + if (!$testsNode) { + $testsNode = $this->getContextNode()->appendChild( + $this->getDom()->createElementNS('http://xml.phpunit.de/coverage/1.0', 'tests') + ); + } + return new PHP_CodeCoverage_Report_XML_Tests($testsNode); + } + + public function asDom() { + return $this->getDom(); + } +} diff --git a/PHP/CodeCoverage/Report/XML/Tests.php b/PHP/CodeCoverage/Report/XML/Tests.php new file mode 100644 index 000000000..2cff2ff35 --- /dev/null +++ b/PHP/CodeCoverage/Report/XML/Tests.php @@ -0,0 +1,18 @@ +contextNode = $context; + } + + public function addTest($test, $result) { + $node = $this->contextNode->appendChild( + $this->contextNode->ownerDocument->createElementNS('http://xml.phpunit.de/coverage/1.0', 'test') + ); + $node->setAttribute('name', $test); + $node->setAttribute('result', $result); + } + +} diff --git a/PHP/CodeCoverage/Report/XML/Totals.php b/PHP/CodeCoverage/Report/XML/Totals.php new file mode 100644 index 000000000..7946b957b --- /dev/null +++ b/PHP/CodeCoverage/Report/XML/Totals.php @@ -0,0 +1,87 @@ +container = $container; + $dom = $container->ownerDocument; + $this->linesNode = $dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'lines'); + $this->methodsNode = $dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'methods'); + $this->functionsNode = $dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'functions'); + $this->classesNode = $dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'classes'); + $this->traitsNode = $dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'traits'); + + $container->appendChild($this->linesNode); + $container->appendChild($this->methodsNode); + $container->appendChild($this->functionsNode); + $container->appendChild($this->classesNode); + $container->appendChild($this->traitsNode); + } + + public function getContainer() { + return $this->container; + } + + public function setNumLines($loc, $cloc, $ncloc, $executable, $executed) { + $this->linesNode->setAttribute('total', $loc); + $this->linesNode->setAttribute('comments', $cloc); + $this->linesNode->setAttribute('code', $ncloc); + $this->linesNode->setAttribute('executable', $executable); + $this->linesNode->setAttribute('executed', $executed); + $this->linesNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($executed,$executable, true)); + } + + public function setNumClasses($count, $tested) { + $this->classesNode->setAttribute('count', $count); + $this->classesNode->setAttribute('tested', $tested); + $this->classesNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, true)); + } + + public function setNumTraits($count, $tested) { + $this->traitsNode->setAttribute('count', $count); + $this->traitsNode->setAttribute('tested', $tested); + $this->traitsNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, true)); + } + + public function setNumMethods($count, $tested) { + $this->methodsNode->setAttribute('count', $count); + $this->methodsNode->setAttribute('tested', $tested); + $this->methodsNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, true)); + } + + public function setNumFunctions($count, $tested) { + $this->functionsNode->setAttribute('count', $count); + $this->functionsNode->setAttribute('tested', $tested); + $this->functionsNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, true)); + } + +} From 35f07bc68f24f6bebf29f39a4baed0a0851e6b85 Mon Sep 17 00:00:00 2001 From: Arne Blankerts Date: Fri, 2 Aug 2013 22:07:33 +0200 Subject: [PATCH 2/2] Adjust formatting to make PHPCS happy --- PHP/CodeCoverage/Report/XML.php | 51 +++++++++++-------- PHP/CodeCoverage/Report/XML/Directory.php | 1 - PHP/CodeCoverage/Report/XML/File.php | 11 ++-- PHP/CodeCoverage/Report/XML/File/Coverage.php | 11 ++-- PHP/CodeCoverage/Report/XML/File/Method.php | 20 +++++--- PHP/CodeCoverage/Report/XML/File/Report.php | 21 +++++--- PHP/CodeCoverage/Report/XML/File/Unit.php | 24 ++++++--- PHP/CodeCoverage/Report/XML/Node.php | 23 ++++++--- PHP/CodeCoverage/Report/XML/Project.php | 17 ++++--- PHP/CodeCoverage/Report/XML/Tests.php | 8 +-- PHP/CodeCoverage/Report/XML/Totals.php | 31 ++++++----- 11 files changed, 137 insertions(+), 81 deletions(-) diff --git a/PHP/CodeCoverage/Report/XML.php b/PHP/CodeCoverage/Report/XML.php index d60faa768..3174e7630 100644 --- a/PHP/CodeCoverage/Report/XML.php +++ b/PHP/CodeCoverage/Report/XML.php @@ -28,12 +28,13 @@ public function process(PHP_CodeCoverage $coverage, $target) $this->processDirectory($report, $this->project); $index = $this->project->asDom(); - $index->formatOutput = true; - $index->preserveWhiteSpace = false; + $index->formatOutput = TRUE; + $index->preserveWhiteSpace = FALSE; $index->save($target . '/index.xml'); } - private function initTargetDirectory($dir) { + private function initTargetDirectory($dir) + { if (file_exists($dir)) { if (!is_dir($dir)) { @@ -43,15 +44,17 @@ private function initTargetDirectory($dir) { if (!is_writable($dir)) { throw new PHP_CodeCoverage_Exception("'$dir' exists but is not writable."); } - } else if (!@mkdir($dir, 0777, true)) { + } + else if (!@mkdir($dir, 0777, TRUE)) { throw new PHP_CodeCoverage_Exception("'$dir' could not be created."); } } - private function processDirectory(PHP_CodeCoverage_Report_Node_Directory $directory, PHP_CodeCoverage_Report_XML_Node $context) { + private function processDirectory(PHP_CodeCoverage_Report_Node_Directory $directory, PHP_CodeCoverage_Report_XML_Node $context) + { $dirObject = $context->addDirectory($directory->getName()); $this->setTotals($directory, $dirObject->getTotals()); - foreach($directory as $node) { + foreach ($directory as $node) { if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) { $this->processDirectory($node, $dirObject); continue; @@ -64,42 +67,45 @@ private function processDirectory(PHP_CodeCoverage_Report_Node_Directory $direct } } - private function processFile(PHP_CodeCoverage_Report_Node_File $file, PHP_CodeCoverage_Report_XML_Directory $context) { + private function processFile(PHP_CodeCoverage_Report_Node_File $file, PHP_CodeCoverage_Report_XML_Directory $context) + { $fileObject = $context->addFile($file->getName(), $file->getId() . '.xml'); $this->setTotals($file, $fileObject->getTotals()); $fileReport = new PHP_CodeCoverage_Report_XML_File_Report($file->getName()); $this->setTotals($file, $fileReport->getTotals()); - foreach($file->getClassesAndTraits() as $unit) { + foreach ($file->getClassesAndTraits() as $unit) { $this->processUnit($unit, $fileReport); } - foreach($file->getFunctions() as $function) { + foreach ($file->getFunctions() as $function) { $this->processFunction($function, $fileReport); } - foreach($file->getCoverageData() as $line => $tests) { + foreach ($file->getCoverageData() as $line => $tests) { if (!is_array($tests) || count($tests) == 0) { continue; } $coverage = $fileReport->getLineCoverage($line); - foreach($tests as $test) { + foreach ($tests as $test) { $coverage->addTest($test); } } $this->initTargetDirectory($this->target . dirname($file->getId()) . '/'); $fileDom = $fileReport->asDom(); - $fileDom->formatOutput = true; - $fileDom->preserveWhiteSpace = false; + $fileDom->formatOutput = TRUE; + $fileDom->preserveWhiteSpace = FALSE; $fileDom->save($this->target . $file->getId() . '.xml'); } - private function processUnit($unit, PHP_CodeCoverage_Report_XML_File_Report $report) { + private function processUnit($unit, PHP_CodeCoverage_Report_XML_File_Report $report) + { if (isset($unit['className'])) { $unitObject = $report->getClassObject($unit['className']); - } else { + } + else { $unitObject = $report->getTraitObject($unit['traitName']); } @@ -119,7 +125,7 @@ private function processUnit($unit, PHP_CodeCoverage_Report_XML_File_Report $rep $unitObject->setNamespace($unit['package']['namespace']); - foreach($unit['methods'] as $method) { + foreach ($unit['methods'] as $method) { $methodObject = $unitObject->addMethod($method['methodName']); $methodObject->setSignature($method['signature']); $methodObject->setLines($method['startLine'], $method['endLine']); @@ -128,7 +134,8 @@ private function processUnit($unit, PHP_CodeCoverage_Report_XML_File_Report $rep } } - private function processFunction($function, PHP_CodeCoverage_Report_XML_File_Report $report) { + private function processFunction($function, PHP_CodeCoverage_Report_XML_File_Report $report) + { $functionObject = $report->getFunctionObject($function['functionName']); $functionObject->setSignature($function['signature']); $functionObject->setLines($function['startLine']); @@ -136,9 +143,10 @@ private function processFunction($function, PHP_CodeCoverage_Report_XML_File_Rep $functionObject->setTotals($function['executableLines'], $function['executedLines'], $function['coverage']); } - private function processTests(array $tests) { + private function processTests(array $tests) + { $testsObject = $this->project->getTests(); - foreach($tests as $test => $result) { + foreach ($tests as $test => $result) { if ($test == 'UNCOVERED_FILES_FROM_WHITELIST') { continue; } @@ -146,7 +154,8 @@ private function processTests(array $tests) { } } - private function setTotals(PHP_CodeCoverage_Report_Node $node, PHP_CodeCoverage_Report_XML_Totals $totals) { + private function setTotals(PHP_CodeCoverage_Report_Node $node, PHP_CodeCoverage_Report_XML_Totals $totals) + { $loc = $node->getLinesOfCode(); $totals->setNumLines( $loc['loc'], @@ -177,4 +186,4 @@ private function setTotals(PHP_CodeCoverage_Report_Node $node, PHP_CodeCoverage_ ); } -} +} \ No newline at end of file diff --git a/PHP/CodeCoverage/Report/XML/Directory.php b/PHP/CodeCoverage/Report/XML/Directory.php index 008df0d16..bad00ed51 100644 --- a/PHP/CodeCoverage/Report/XML/Directory.php +++ b/PHP/CodeCoverage/Report/XML/Directory.php @@ -1,4 +1,3 @@ contextNode = $context; $this->dom = $context->ownerDocument; } - public function getTotals() { + public function getTotals() + { $totalsContainer = $this->contextNode->firstChild; if (!$totalsContainer) { $totalsContainer = $this->contextNode->appendChild( @@ -26,7 +28,8 @@ public function getTotals() { return new PHP_CodeCoverage_Report_XML_Totals($totalsContainer); } - public function getLineCoverage($line) { + public function getLineCoverage($line) + { $coverage = $this->contextNode->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'coverage')->item(0); if (!$coverage) { $coverage = $this->contextNode->appendChild( @@ -39,4 +42,4 @@ public function getLineCoverage($line) { return new PHP_CodeCoverage_Report_XML_File_Coverage($lineNode, $line); } -} +} \ No newline at end of file diff --git a/PHP/CodeCoverage/Report/XML/File/Coverage.php b/PHP/CodeCoverage/Report/XML/File/Coverage.php index 1f67e8180..3528c5a6d 100644 --- a/PHP/CodeCoverage/Report/XML/File/Coverage.php +++ b/PHP/CodeCoverage/Report/XML/File/Coverage.php @@ -3,20 +3,23 @@ class PHP_CodeCoverage_Report_XML_File_Coverage { private $contextNode; - public function __construct(\DOMElement $context, $line) { + public function __construct(\DOMElement $context, $line) + { $this->contextNode = $context; $this->setLine($line); } - private function setLine($line) { + private function setLine($line) + { $this->contextNode->setAttribute('nr', $line); } - public function addTest($test) { + public function addTest($test) + { $covered = $this->contextNode->appendChild( $this->contextNode->ownerDocument->createElementNS('http://xml.phpunit.de/coverage/1.0', 'covered') ); $covered->setAttribute('by', $test); } -} +} \ No newline at end of file diff --git a/PHP/CodeCoverage/Report/XML/File/Method.php b/PHP/CodeCoverage/Report/XML/File/Method.php index 5a895b813..c6dd897c0 100644 --- a/PHP/CodeCoverage/Report/XML/File/Method.php +++ b/PHP/CodeCoverage/Report/XML/File/Method.php @@ -3,34 +3,40 @@ class PHP_CodeCoverage_Report_XML_File_Method { private $contextNode; - public function __construct(\DOMElement $context, $name) { + public function __construct(\DOMElement $context, $name) + { $this->contextNode = $context; $this->setName($name); } - private function setName($name) { + private function setName($name) + { $this->contextNode->setAttribute('name', $name); } - public function setSignature($signature) { + public function setSignature($signature) + { $this->contextNode->setAttribute('signature', $signature); } - public function setLines($start, $end = NULL) { + public function setLines($start, $end = NULL) + { $this->contextNode->setAttribute('start', $start); if ($end !== NULL) { $this->contextNode->setAttribute('end', $end); } } - public function setTotals($executable, $executed, $coverage) { + public function setTotals($executable, $executed, $coverage) + { $this->contextNode->setAttribute('executable', $executable); $this->contextNode->setAttribute('executed', $executed); $this->contextNode->setAttribute('coverage', $coverage); } - public function setCrap($crap) { + public function setCrap($crap) + { $this->contextNode->setAttribute('crap', $crap); } -} +} \ No newline at end of file diff --git a/PHP/CodeCoverage/Report/XML/File/Report.php b/PHP/CodeCoverage/Report/XML/File/Report.php index cdcb99ef0..32a16cb6e 100644 --- a/PHP/CodeCoverage/Report/XML/File/Report.php +++ b/PHP/CodeCoverage/Report/XML/File/Report.php @@ -1,37 +1,44 @@ dom = new \DOMDocument(); $this->dom->loadXML(''); $this->contextNode = $this->dom->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'file')->item(0); $this->setName($name); } - private function setName($name) { + private function setName($name) + { $this->contextNode->setAttribute('name', $name); } - public function asDom() { + public function asDom() + { return $this->dom; } - public function getFunctionObject($name) { + public function getFunctionObject($name) + { $node = $this->contextNode->appendChild( $this->dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'function') ); return new PHP_CodeCoverage_Report_XML_File_Method($node, $name); } - public function getClassObject($name) { + public function getClassObject($name) + { return $this->getUnitObject('class', $name); } - public function getTraitObject($name) { + public function getTraitObject($name) + { return $this->getUnitObject('trait', $name); } - private function getUnitObject($tagName, $name) { + private function getUnitObject($tagName, $name) + { $node = $this->contextNode->appendChild( $this->dom->createElementNS('http://xml.phpunit.de/coverage/1.0', $tagName) ); diff --git a/PHP/CodeCoverage/Report/XML/File/Unit.php b/PHP/CodeCoverage/Report/XML/File/Unit.php index 955af2f61..6ef09987e 100644 --- a/PHP/CodeCoverage/Report/XML/File/Unit.php +++ b/PHP/CodeCoverage/Report/XML/File/Unit.php @@ -3,26 +3,31 @@ class PHP_CodeCoverage_Report_XML_File_Unit { private $contextNode; - public function __construct(\DOMElement $context, $name) { + public function __construct(\DOMElement $context, $name) + { $this->contextNode = $context; $this->setName($name); } - private function setName($name) { + private function setName($name) + { $this->contextNode->setAttribute('name', $name); } - public function setLines($start, $executable, $executed) { + public function setLines($start, $executable, $executed) + { $this->contextNode->setAttribute('start', $start); $this->contextNode->setAttribute('executable', $executable); $this->contextNode->setAttribute('executed', $executed); } - public function setCrap($crap) { + public function setCrap($crap) + { $this->contextNode->setAttribute('crap', $crap); } - public function setPackage($full, $package, $sub, $category) { + public function setPackage($full, $package, $sub, $category) + { $node = $this->contextNode->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'package')->item(0); if (!$node) { $node = $this->contextNode->appendChild( @@ -35,7 +40,8 @@ public function setPackage($full, $package, $sub, $category) { $node->setAttribute('category', $category); } - public function setNamespace($namespace) { + public function setNamespace($namespace) + { $node = $this->contextNode->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'namespace')->item(0); if (!$node) { $node = $this->contextNode->appendChild( @@ -45,10 +51,12 @@ public function setNamespace($namespace) { $node->setAttribute('name', $namespace); } - public function addMethod($name) { + public function addMethod($name) + { $node = $this->contextNode->appendChild( $this->contextNode->ownerDocument->createElementNS('http://xml.phpunit.de/coverage/1.0', 'method') ); return new PHP_CodeCoverage_Report_XML_File_Method($node, $name); } -} + +} \ No newline at end of file diff --git a/PHP/CodeCoverage/Report/XML/Node.php b/PHP/CodeCoverage/Report/XML/Node.php index abf0ef125..a802d89c8 100644 --- a/PHP/CodeCoverage/Report/XML/Node.php +++ b/PHP/CodeCoverage/Report/XML/Node.php @@ -11,24 +11,29 @@ class PHP_CodeCoverage_Report_XML_Node { */ private $contextNode; - public function __construct(\DOMElement $context) { + public function __construct(\DOMElement $context) + { $this->setContextNode($context); } - protected function setContextNode(\DOMElement $context) { + protected function setContextNode(\DOMElement $context) + { $this->contextNode = $context; $this->dom = $context->ownerDocument; } - public function getDom() { + public function getDom() + { return $this->dom; } - protected function getContextNode() { + protected function getContextNode() + { return $this->contextNode; } - public function getTotals() { + public function getTotals() + { $totalsContainer = $this->getContextNode()->firstChild; if (!$totalsContainer) { $totalsContainer = $this->getContextNode()->appendChild( @@ -38,14 +43,16 @@ public function getTotals() { return new PHP_CodeCoverage_Report_XML_Totals($totalsContainer); } - public function addDirectory($name) { + public function addDirectory($name) + { $dirNode = $this->getDom()->createElementNS('http://xml.phpunit.de/coverage/1.0', 'directory'); $dirNode->setAttribute('name', $name); $this->getContextNode()->appendChild($dirNode); return new PHP_CodeCoverage_Report_XML_Directory($dirNode); } - public function addFile($name, $href) { + public function addFile($name, $href) + { $fileNode = $this->getDom()->createElementNS('http://xml.phpunit.de/coverage/1.0', 'file'); $fileNode->setAttribute('name', $name); $fileNode->setAttribute('href', $href); @@ -53,4 +60,4 @@ public function addFile($name, $href) { return new PHP_CodeCoverage_Report_XML_File($fileNode); } -} +} \ No newline at end of file diff --git a/PHP/CodeCoverage/Report/XML/Project.php b/PHP/CodeCoverage/Report/XML/Project.php index 418efa2dc..27581df72 100644 --- a/PHP/CodeCoverage/Report/XML/Project.php +++ b/PHP/CodeCoverage/Report/XML/Project.php @@ -1,22 +1,26 @@ init(); $this->setProjectName($name); } - private function init() { + private function init() + { $dom = new DOMDocument(); $dom->loadXML(''); $this->setContextNode($dom->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'project')->item(0)); } - private function setProjectName($name) { + private function setProjectName($name) + { $this->getContextNode()->setAttribute('name', $name); } - public function getTests() { + public function getTests() + { $testsNode = $this->getContextNode()->getElementsByTagNameNS('http://xml.phpunit.de/coverage/1.0', 'tests')->item(0); if (!$testsNode) { $testsNode = $this->getContextNode()->appendChild( @@ -26,7 +30,8 @@ public function getTests() { return new PHP_CodeCoverage_Report_XML_Tests($testsNode); } - public function asDom() { + public function asDom() + { return $this->getDom(); } -} +} \ No newline at end of file diff --git a/PHP/CodeCoverage/Report/XML/Tests.php b/PHP/CodeCoverage/Report/XML/Tests.php index 2cff2ff35..fe16d5b31 100644 --- a/PHP/CodeCoverage/Report/XML/Tests.php +++ b/PHP/CodeCoverage/Report/XML/Tests.php @@ -3,11 +3,13 @@ class PHP_CodeCoverage_Report_XML_Tests { private $contextNode; - public function __construct(\DOMElement $context) { + public function __construct(\DOMElement $context) + { $this->contextNode = $context; } - public function addTest($test, $result) { + public function addTest($test, $result) + { $node = $this->contextNode->appendChild( $this->contextNode->ownerDocument->createElementNS('http://xml.phpunit.de/coverage/1.0', 'test') ); @@ -15,4 +17,4 @@ public function addTest($test, $result) { $node->setAttribute('result', $result); } -} +} \ No newline at end of file diff --git a/PHP/CodeCoverage/Report/XML/Totals.php b/PHP/CodeCoverage/Report/XML/Totals.php index 7946b957b..466f64c64 100644 --- a/PHP/CodeCoverage/Report/XML/Totals.php +++ b/PHP/CodeCoverage/Report/XML/Totals.php @@ -31,7 +31,8 @@ class PHP_CodeCoverage_Report_XML_Totals { */ private $traitsNode; - public function __construct(\DOMElement $container) { + public function __construct(\DOMElement $container) + { $this->container = $container; $dom = $container->ownerDocument; $this->linesNode = $dom->createElementNS('http://xml.phpunit.de/coverage/1.0', 'lines'); @@ -47,41 +48,47 @@ public function __construct(\DOMElement $container) { $container->appendChild($this->traitsNode); } - public function getContainer() { + public function getContainer() + { return $this->container; } - public function setNumLines($loc, $cloc, $ncloc, $executable, $executed) { + public function setNumLines($loc, $cloc, $ncloc, $executable, $executed) + { $this->linesNode->setAttribute('total', $loc); $this->linesNode->setAttribute('comments', $cloc); $this->linesNode->setAttribute('code', $ncloc); $this->linesNode->setAttribute('executable', $executable); $this->linesNode->setAttribute('executed', $executed); - $this->linesNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($executed,$executable, true)); + $this->linesNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($executed,$executable, TRUE)); } - public function setNumClasses($count, $tested) { + public function setNumClasses($count, $tested) + { $this->classesNode->setAttribute('count', $count); $this->classesNode->setAttribute('tested', $tested); - $this->classesNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, true)); + $this->classesNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, TRUE)); } - public function setNumTraits($count, $tested) { + public function setNumTraits($count, $tested) + { $this->traitsNode->setAttribute('count', $count); $this->traitsNode->setAttribute('tested', $tested); - $this->traitsNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, true)); + $this->traitsNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, TRUE)); } - public function setNumMethods($count, $tested) { + public function setNumMethods($count, $tested) + { $this->methodsNode->setAttribute('count', $count); $this->methodsNode->setAttribute('tested', $tested); - $this->methodsNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, true)); + $this->methodsNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, TRUE)); } - public function setNumFunctions($count, $tested) { + public function setNumFunctions($count, $tested) + { $this->functionsNode->setAttribute('count', $count); $this->functionsNode->setAttribute('tested', $tested); - $this->functionsNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, true)); + $this->functionsNode->setAttribute('percent', PHP_CodeCoverage_Util::percent($tested,$count, TRUE)); } }