. */ require_once 'phing/system/util/Properties.php'; /** * Saves coverage output of the test to a specified database * * @author Michiel Rook * @version $Id: CoverageMerger.php 905 2010-10-05 16:28:03Z mrook $ * @package phing.tasks.ext.coverage * @since 2.1.0 */ class CoverageMerger { private static function mergeCodeCoverage($left, $right) { $coverageMerged = array(); reset($left); reset($right); while (current($left) && current($right)) { $linenr_left = key($left); $linenr_right = key($right); if ($linenr_left < $linenr_right) { $coverageMerged[$linenr_left] = current($left); next($left); } elseif ($linenr_right < $linenr_left) { $coverageMerged[$linenr_right] = current($right); next($right); } else { if ((current($left) < 0) || (current($right) < 0)) { $coverageMerged[$linenr_right] = current($right); } else { $coverageMerged[$linenr_right] = current($left) + current($right); } next($left); next($right); } } while (current($left)) { $coverageMerged[key($left)] = current($left); next($left); } while (current($right)) { $coverageMerged[key($right)] = current($right); next($right); } return $coverageMerged; } static function merge($project, $codeCoverageInformation) { $coverageDatabase = $project->getProperty('coverage.database'); if (!$coverageDatabase) { throw new BuildException("Property coverage.database is not set - please include coverage-setup in your build file"); } $database = new PhingFile($coverageDatabase); $props = new Properties(); $props->load($database); $coverageTotal = $codeCoverageInformation; foreach ($coverageTotal as $filename => $data) { $lines = array(); $filename = strtolower($filename); if ($props->getProperty($filename) != null) { foreach ($data as $_line => $_data) { if (is_array($_data)) { $count = count($_data); } else if ($_data == -1) { // not executed $count = -1; } else if ($_data == -2) { // dead code $count = -2; } $lines[$_line] = $count; } ksort($lines); $file = unserialize($props->getProperty($filename)); $left = $file['coverage']; $coverageMerged = CoverageMerger::mergeCodeCoverage($left, $lines); $file['coverage'] = $coverageMerged; $props->setProperty($filename, serialize($file)); } } $props->store($database); } }