Skip to content

Commit

Permalink
SONAR-5772 Force coverage measure computation by default
Browse files Browse the repository at this point in the history
  • Loading branch information
henryju committed Feb 19, 2015
1 parent ccdf48e commit a5627ab
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 10 deletions.
Expand Up @@ -47,7 +47,7 @@
import org.sonar.plugins.core.sensors.ItCoverageDecorator; import org.sonar.plugins.core.sensors.ItCoverageDecorator;
import org.sonar.plugins.core.sensors.ItLineCoverageDecorator; import org.sonar.plugins.core.sensors.ItLineCoverageDecorator;
import org.sonar.plugins.core.sensors.LineCoverageDecorator; import org.sonar.plugins.core.sensors.LineCoverageDecorator;
import org.sonar.plugins.core.sensors.LinesToCoverDecorator; import org.sonar.plugins.core.sensors.MissingCoverageDecorator;
import org.sonar.plugins.core.sensors.ManualMeasureDecorator; import org.sonar.plugins.core.sensors.ManualMeasureDecorator;
import org.sonar.plugins.core.sensors.OverallBranchCoverageDecorator; import org.sonar.plugins.core.sensors.OverallBranchCoverageDecorator;
import org.sonar.plugins.core.sensors.OverallCoverageDecorator; import org.sonar.plugins.core.sensors.OverallCoverageDecorator;
Expand Down Expand Up @@ -336,7 +336,7 @@ public List getExtensions() {
DirectoriesDecorator.class, DirectoriesDecorator.class,
FilesDecorator.class, FilesDecorator.class,
ManualMeasureDecorator.class, ManualMeasureDecorator.class,
LinesToCoverDecorator.class, MissingCoverageDecorator.class,


// time machine // time machine
TendencyDecorator.class, TendencyDecorator.class,
Expand Down
Expand Up @@ -26,17 +26,25 @@
import org.sonar.api.batch.DependsUpon; import org.sonar.api.batch.DependsUpon;
import org.sonar.api.config.Settings; import org.sonar.api.config.Settings;
import org.sonar.api.measures.CoreMetrics; import org.sonar.api.measures.CoreMetrics;
import org.sonar.api.measures.CoverageMeasuresBuilder;
import org.sonar.api.measures.Measure;
import org.sonar.api.measures.MeasureUtils; import org.sonar.api.measures.MeasureUtils;
import org.sonar.api.measures.Metric; import org.sonar.api.measures.Metric;
import org.sonar.api.resources.Project; import org.sonar.api.resources.Project;
import org.sonar.api.resources.Qualifiers; import org.sonar.api.resources.Qualifiers;
import org.sonar.api.resources.Resource; import org.sonar.api.resources.Resource;
import org.sonar.api.utils.KeyValueFormat;


public final class LinesToCoverDecorator implements Decorator { import java.util.Map;

/**
* Compute coverage when it was not already saved by language plugin.
*/
public final class MissingCoverageDecorator implements Decorator {


private final Settings settings; private final Settings settings;


public LinesToCoverDecorator(Settings settings) { public MissingCoverageDecorator(Settings settings) {
this.settings = settings; this.settings = settings;
} }


Expand All @@ -59,9 +67,24 @@ public boolean shouldExecuteOnProject(Project project) {
public void decorate(Resource resource, DecoratorContext context) { public void decorate(Resource resource, DecoratorContext context) {
if (Qualifiers.isFile(resource)) { if (Qualifiers.isFile(resource)) {
if (!MeasureUtils.hasValue(context.getMeasure(CoreMetrics.LINES_TO_COVER))) { if (!MeasureUtils.hasValue(context.getMeasure(CoreMetrics.LINES_TO_COVER))) {
double ncloc = MeasureUtils.getValue(context.getMeasure(CoreMetrics.NCLOC), 0.0); Measure nclocData = context.getMeasure(CoreMetrics.NCLOC_DATA);
context.saveMeasure(CoreMetrics.LINES_TO_COVER, ncloc); if (MeasureUtils.hasData(nclocData)) {
context.saveMeasure(CoreMetrics.UNCOVERED_LINES, ncloc); CoverageMeasuresBuilder builder = CoverageMeasuresBuilder.create();
Map<Integer, Integer> nclocByLine = KeyValueFormat.parseIntInt(nclocData.getData());
for (Map.Entry<Integer, Integer> entry : nclocByLine.entrySet()) {
if (entry.getValue() == 1) {
builder.setHits(entry.getKey(), 0);
}
}
for (Measure m : builder.createMeasures()) {
context.saveMeasure(m);
}
} else {
// No details about ncloc so fallback on setting high level metrics
double ncloc = MeasureUtils.getValue(context.getMeasure(CoreMetrics.NCLOC), 0.0);
context.saveMeasure(CoreMetrics.LINES_TO_COVER, ncloc);
context.saveMeasure(CoreMetrics.UNCOVERED_LINES, ncloc);
}
} }
} }
} }
Expand Down
Expand Up @@ -42,15 +42,15 @@
import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;


public class LinesToCoverDecoratorTest { public class MissingCoverageDecoratorTest {


private Settings settings; private Settings settings;
private LinesToCoverDecorator decorator; private MissingCoverageDecorator decorator;


@Before @Before
public void prepare() { public void prepare() {
settings = new Settings(new PropertyDefinitions(CorePropertyDefinitions.all())); settings = new Settings(new PropertyDefinitions(CorePropertyDefinitions.all()));
decorator = new LinesToCoverDecorator(settings); decorator = new MissingCoverageDecorator(settings);
} }


@Test @Test
Expand Down Expand Up @@ -89,6 +89,21 @@ public void dontDoAnythingIfLinesToCoverAlreadyDefined() {
verify(context, never()).saveMeasure(eq(CoreMetrics.UNCOVERED_LINES), anyDouble()); verify(context, never()).saveMeasure(eq(CoreMetrics.UNCOVERED_LINES), anyDouble());
} }


@Test
public void testUseNclocDataIfPossible() {
DecoratorContext context = mock(DecoratorContext.class);
File file = File.create("src/Foo.java");

when(context.getMeasure(CoreMetrics.LINES_TO_COVER)).thenReturn(null);
when(context.getMeasure(CoreMetrics.NCLOC_DATA)).thenReturn(new Measure<>(CoreMetrics.NCLOC_DATA, "1=0;2=1;3=0;4=1"));

decorator.decorate(file, context);

verify(context).saveMeasure(new Measure(CoreMetrics.LINES_TO_COVER, 2.0));
verify(context).saveMeasure(new Measure(CoreMetrics.UNCOVERED_LINES, 2.0));
verify(context).saveMeasure(new Measure(CoreMetrics.COVERAGE_LINE_HITS_DATA, "2=0;4=0"));
}

@Test @Test
public void testUseNclocAsLinesToCover() { public void testUseNclocAsLinesToCover() {
DecoratorContext context = mock(DecoratorContext.class); DecoratorContext context = mock(DecoratorContext.class);
Expand Down

0 comments on commit a5627ab

Please sign in to comment.