package hudson.plugins.cobertura.targets; import hudson.plugins.cobertura.Ratio; import java.io.Serializable; import java.util.EnumMap; import java.util.HashMap; import java.util.Map; /** * Line-by-line coverage information. * * @author Stephen Connolly * @since 29-Aug-2007 17:44:29 */ public class CoveragePaint implements Serializable { /** * Generated */ private static final long serialVersionUID = -6265259191856193735L; class CoveragePaintDetails implements Serializable { /** * Generated */ private static final long serialVersionUID = -9097537016381444671L; int hitCount=0; int branchCount=0; int branchCoverage=0; public CoveragePaintDetails(int hitCount, int branchCount, int branchCoverage) { super(); this.hitCount = hitCount; this.branchCount = branchCount; this.branchCoverage = branchCoverage; } } protected Map<Integer/*line number*/,CoveragePaintDetails> lines=new HashMap<Integer,CoveragePaintDetails>(); public CoveragePaint(CoverageElement source) { // there were no getters against the source ... // this.source = source; } public void paint(int line, int hits) { CoveragePaintDetails d=lines.get(line); if (d==null){ d=new CoveragePaintDetails(0, 0, 0); lines.put(line, d); } d.hitCount+=hits; } public void paint(int line, int hits, int branchCover, int branchCount) { CoveragePaintDetails d=lines.get(line); if (d==null){ d=new CoveragePaintDetails(hits, branchCount, branchCover); lines.put(line, d); } else { d.hitCount+=hits; if (d.branchCount == 0) { d.branchCount = branchCount; d.branchCoverage = branchCover; } else { // TODO find a better algorithm d.branchCount = Math.max(d.branchCount, branchCount); d.branchCoverage = Math.max(d.branchCoverage, branchCover); } } } public void add(CoveragePaint child) { for(Map.Entry<Integer,CoveragePaintDetails> e: child.lines.entrySet()){ CoveragePaintDetails d=lines.get(e.getKey()); if (d!=null){ d.hitCount+=e.getValue().hitCount; d.branchCount=Math.max(d.branchCount, e.getValue().branchCount); if (d.branchCount!=0){ d.branchCoverage=Math.max(d.branchCoverage, e.getValue().branchCoverage); } } else { CoveragePaintDetails dc=e.getValue(); d=new CoveragePaintDetails(dc.hitCount, dc.branchCount, dc.branchCoverage); lines.put(e.getKey(), d); } } } /** * Getter for property 'lineCoverage'. * * @return Value for property 'lineCoverage'. */ public Ratio getLineCoverage() { int covered = 0; for (CoveragePaintDetails d: lines.values()){ if (d.hitCount > 0) { covered++; } } return Ratio.create(covered, lines.size()); } /** * Getter for property 'conditionalCoverage'. * * @return Value for property 'conditionalCoverage'. */ public Ratio getConditionalCoverage() { long maxTotal = 0; long total = 0; for (CoveragePaintDetails d: lines.values()){ maxTotal += d.branchCount; total += d.branchCoverage; } return Ratio.create(total, maxTotal); } /** * Getter for property 'results'. * * @return Value for property 'results'. */ public Map<CoverageMetric, Ratio> getResults() { Map<CoverageMetric, Ratio> result = new EnumMap<CoverageMetric,Ratio>(CoverageMetric.class); result.put(CoverageMetric.LINE, getLineCoverage()); result.put(CoverageMetric.CONDITIONAL, getConditionalCoverage()); return result; } public boolean isPainted(int line) { return lines.get(line) != null; } public int getHits(int line) { CoveragePaintDetails d=lines.get(line); if (d==null){ return 0; } else { return d.hitCount; } } public int getBranchTotal(int line) { CoveragePaintDetails d=lines.get(line); if (d==null){ return 0; } else { return d.branchCount; } } public int getBranchCoverage(int line) { CoveragePaintDetails d=lines.get(line); if (d==null){ return 0; } else { return d.branchCoverage; } } }