<?php
/**
 * PHPUnit
 *
 * Copyright (c) 2002-2008, Sebastian Bergmann <sb@sebastian-bergmann.de>.
 * 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 <sb@sebastian-bergmann.de>
 * @copyright  2002-2008 Sebastian Bergmann <sb@sebastian-bergmann.de>
 * @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 <sb@sebastian-bergmann.de>
 * @copyright  2002-2008 Sebastian Bergmann <sb@sebastian-bergmann.de>
 * @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();
  }
}
?>
