. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * * Neither the name of Sebastian Bergmann nor the names of his * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * * @category Testing * @package PHPUnit * @author Sebastian Bergmann * @copyright 2002-2008 Sebastian Bergmann * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @version SVN: $Id: XML.php 1985 2007-12-26 18:11:55Z sb $ * @link http://www.phpunit.de/ * @since File available since Release 3.1.4 */ require_once 'PHPUnit/Runner/Version.php'; require_once 'PHPUnit/Util/Metrics/File.php'; require_once 'PHPUnit/Util/Class.php'; require_once 'PHPUnit/Util/CodeCoverage.php'; require_once 'PHPUnit/Util/Filter.php'; require_once 'PHPUnit/Util/Printer.php'; PHPUnit_Util_Filter::addFileToFilter(__FILE__, 'PHPUNIT'); /** * Generates an XML logfile with code coverage information using the * Clover format "documented" at * http://svn.atlassian.com/svn/public/contrib/bamboo/bamboo-coverage-plugin/trunk/src/test/resources/test-clover-report.xml * * @category Testing * @package PHPUnit * @author Sebastian Bergmann * @copyright 2002-2008 Sebastian Bergmann * @license http://www.opensource.org/licenses/bsd-license.php BSD License * @version Release: 3.2.9 * @link http://www.phpunit.de/ * @since Class available since Release 3.1.4 */ class PHPUnit_Util_Log_CodeCoverage_XML extends PHPUnit_Util_Printer { /** * @param PHPUnit_Framework_TestResult $result * @access public * @todo Count conditionals. */ public function process(PHPUnit_Framework_TestResult $result) { $document = new DOMDocument('1.0', 'UTF-8'); $document->formatOutput = TRUE; $coverage = $document->createElement('coverage'); $coverage->setAttribute('generated', time()); $coverage->setAttribute('phpunit', PHPUnit_Runner_Version::id()); $document->appendChild($coverage); $project = $document->createElement('project'); $project->setAttribute('name', $result->topTestSuite()->getName()); $project->setAttribute('timestamp', time()); $coverage->appendChild($project); $codeCoverageInformation = $result->getCodeCoverageInformation(); $files = PHPUnit_Util_CodeCoverage::getSummary($codeCoverageInformation); $projectFiles = 0; $projectLoc = 0; $projectNcloc = 0; $projectLinesExecutable = 0; $projectLinesExecuted = 0; $projectClasses = 0; $projectMethods = 0; $projectCoveredMethods = 0; $projectConditionals = 0; $projectCoveredConditionals = 0; $projectStatements = 0; $projectCoveredStatements = 0; foreach ($files as $filename => $data) { $projectFiles ++; $fileClasses = 0; $fileConditionals = 0; $fileCoveredConditionals = 0; $fileStatements = 0; $fileCoveredStatements = 0; $fileMethods = 0; $fileCoveredMethods = 0; $file = $document->createElement('file'); $file->setAttribute('name', $filename); $classes = PHPUnit_Util_Class::getClassesInFile($filename); $lines = array(); foreach ($classes as $class) { $methods = $class->getMethods(); $numMethods = 0; $fileClasses ++; $projectClasses ++; $classConditionals = 0; $classCoveredConditionals = 0; $classStatements = 0; $classCoveredStatements = 0; $classCoveredMethods = 0; foreach ($methods as $method) { if ($method->getDeclaringClass()->getName() == $class->getName()) { $startLine = $method->getStartLine(); $numMethods ++; $fileMethods ++; $projectMethods ++; if ($startLine) { $endLine = $method->getEndLine(); $tests = array(); for ($i = $startLine; $i <= $endLine; $i ++) { if (isset($files[$filename][$i])) { if (is_array($files[$filename][$i])) { foreach ($files[$filename][$i] as $_test) { $add = TRUE; foreach ($tests as $test) { if ($test === $_test) { $add = FALSE; break; } } if ($add) { $tests[] = $_test; } } $classCoveredStatements ++; } $classStatements ++; } } $count = count($tests); $lines[$startLine] = array('count' => $count, 'type' => 'method'); if ($count > 0) { $classCoveredMethods ++; $fileCoveredMethods ++; $projectCoveredMethods ++; } } } } $classXML = $document->createElement('class'); $classXML->setAttribute('name', $class->getName()); $file->appendChild($classXML); $classMetricsXML = $document->createElement('metrics'); $classMetricsXML->setAttribute('methods', $numMethods); $classMetricsXML->setAttribute('coveredmethods', $classCoveredMethods); //$classMetricsXML->setAttribute('conditionals', $classConditionals); //$classMetricsXML->setAttribute('coveredconditionals', $classCoveredConditionals); $classMetricsXML->setAttribute('statements', $classStatements); $classMetricsXML->setAttribute('coveredstatements', $classCoveredStatements); $classMetricsXML->setAttribute('elements', $classConditionals + $classStatements + $numMethods); $classMetricsXML->setAttribute('coveredelements', $classCoveredConditionals + $classCoveredStatements + $classCoveredMethods); $classXML->appendChild($classMetricsXML); $fileStatements += $classStatements; $fileCoveredStatements += $classCoveredStatements; } foreach ($data as $_line => $_data) { if (is_array($_data)) { $count = count($_data); } else if ($_data == - 1) { $count = 0; } else if ($_data == - 2) { continue; } $lines[$_line] = array('count' => $count, 'type' => 'stmt'); } ksort($lines); foreach ($lines as $_line => $_data) { $line = $document->createElement('line'); $line->setAttribute('num', $_line); $line->setAttribute('type', $_data['type']); $line->setAttribute('count', $_data['count']); $file->appendChild($line); } if (file_exists($filename)) { $fileMetrics = PHPUnit_Util_Metrics_File::factory($filename, $files); $fileLoc = $fileMetrics->getLoc(); $fileNcloc = $fileMetrics->getNcloc(); $fileLinesExecutable = $fileMetrics->getLocExecutable(); $fileLinesExecuted = $fileMetrics->getLocExecuted(); $fileMetricsXML = $document->createElement('metrics'); $fileMetricsXML->setAttribute('loc', $fileLoc); $fileMetricsXML->setAttribute('ncloc', $fileNcloc); $fileMetricsXML->setAttribute('executablelines', $fileLinesExecutable); $fileMetricsXML->setAttribute('executedlines', $fileLinesExecuted); $fileMetricsXML->setAttribute('classes', $fileClasses); $fileMetricsXML->setAttribute('methods', $fileMethods); $fileMetricsXML->setAttribute('coveredmethods', $fileCoveredMethods); //$fileMetricsXML->setAttribute('conditionals', $fileConditionals); //$fileMetricsXML->setAttribute('coveredconditionals', $fileCoveredConditionals); $fileMetricsXML->setAttribute('statements', $fileStatements); $fileMetricsXML->setAttribute('coveredstatements', $fileCoveredStatements); $fileMetricsXML->setAttribute('elements', $fileConditionals + $fileStatements + $fileMethods); $fileMetricsXML->setAttribute('coveredelements', $fileCoveredConditionals + $fileCoveredStatements + $fileCoveredMethods); $file->appendChild($fileMetricsXML); $project->appendChild($file); $projectLoc += $fileLoc; $projectNcloc += $fileNcloc; $projectLinesExecutable += $fileLinesExecutable; $projectLinesExecuted += $fileLinesExecuted; $projectStatements += $fileStatements; $projectCoveredStatements += $fileCoveredStatements; } } $projectMetricsXML = $document->createElement('metrics'); $projectMetricsXML->setAttribute('files', $projectFiles); $projectMetricsXML->setAttribute('loc', $projectLoc); $projectMetricsXML->setAttribute('ncloc', $projectNcloc); $projectMetricsXML->setAttribute('executablelines', $projectLinesExecutable); $projectMetricsXML->setAttribute('executedlines', $projectLinesExecuted); $projectMetricsXML->setAttribute('classes', $projectClasses); $projectMetricsXML->setAttribute('methods', $projectMethods); $projectMetricsXML->setAttribute('coveredmethods', $projectCoveredMethods); //$projectMetricsXML->setAttribute('conditionals', $projectConditionals); //$projectMetricsXML->setAttribute('coveredconditionals', $projectCoveredConditionals); $projectMetricsXML->setAttribute('statements', $projectStatements); $projectMetricsXML->setAttribute('coveredstatements', $projectCoveredStatements); $projectMetricsXML->setAttribute('elements', $projectConditionals + $projectStatements + $projectMethods); $projectMetricsXML->setAttribute('coveredelements', $projectCoveredConditionals + $projectCoveredStatements + $projectCoveredMethods); $project->appendChild($projectMetricsXML); $this->write($document->saveXML()); $this->flush(); } } ?>