From 72e02c82b33ecdc6350ca11bcdd31633c2e09036 Mon Sep 17 00:00:00 2001 From: Julien Lancelot Date: Fri, 7 Aug 2015 16:46:59 +0200 Subject: SONAR-6730 Replace step executing MeasureComputers by a visitor --- .../computation/component/DequeBasedPath.java | 2 +- .../measure/MeasureComputersVisitor.java | 56 ++++++++ .../server/computation/step/ComponentVisitors.java | 8 +- .../server/computation/step/ComputationSteps.java | 4 +- .../step/ComputePluginMeasuresStep.java | 78 ---------- .../measure/MeasureComputersVisitorTest.java | 153 ++++++++++++++++++++ .../step/ComputePluginMeasuresStepTest.java | 160 --------------------- 7 files changed, 217 insertions(+), 244 deletions(-) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureComputersVisitor.java delete mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputePluginMeasuresStep.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureComputersVisitorTest.java delete mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputePluginMeasuresStepTest.java diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/component/DequeBasedPath.java b/server/sonar-server/src/main/java/org/sonar/server/computation/component/DequeBasedPath.java index 0c7bb8f64a7..733f9782271 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/component/DequeBasedPath.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/component/DequeBasedPath.java @@ -25,7 +25,7 @@ import java.util.Deque; import java.util.Iterator; import java.util.NoSuchElementException; -public class DequeBasedPath implements PathAwareVisitor.Path, Iterable> { +final class DequeBasedPath implements PathAwareVisitor.Path, Iterable> { private final Deque> deque = new ArrayDeque<>(); @Override diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureComputersVisitor.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureComputersVisitor.java new file mode 100644 index 00000000000..e0e105a547f --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureComputersVisitor.java @@ -0,0 +1,56 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.server.computation.measure; + +import org.sonar.api.ce.measure.MeasureComputer; +import org.sonar.server.computation.component.ProjectSettingsRepository; +import org.sonar.server.computation.component.TypeAwareVisitorAdapter; +import org.sonar.server.computation.measure.api.MeasureComputerImplementationContext; +import org.sonar.server.computation.metric.MetricRepository; + +import static org.sonar.server.computation.component.Component.Type.FILE; +import static org.sonar.server.computation.component.Visitor.Order.PRE_ORDER; + +public class MeasureComputersVisitor extends TypeAwareVisitorAdapter { + + private final MetricRepository metricRepository; + private final MeasureRepository measureRepository; + private final ProjectSettingsRepository settings; + + private final MeasureComputersHolder measureComputersHolder; + + public MeasureComputersVisitor(MetricRepository metricRepository, MeasureRepository measureRepository, ProjectSettingsRepository settings, + MeasureComputersHolder measureComputersHolder) { + super(FILE, PRE_ORDER); + this.metricRepository = metricRepository; + this.measureRepository = measureRepository; + this.settings = settings; + this.measureComputersHolder = measureComputersHolder; + } + + @Override + public void visitAny(org.sonar.server.computation.component.Component component) { + for (MeasureComputer computer : measureComputersHolder.getMeasureComputers()) { + MeasureComputerImplementationContext measureComputerContext = new MeasureComputerImplementationContext(component, computer, settings, measureRepository, metricRepository); + computer.getImplementation().compute(measureComputerContext); + } + } +} diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComponentVisitors.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComponentVisitors.java index 35673b68066..34257d49906 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComponentVisitors.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComponentVisitors.java @@ -28,6 +28,7 @@ import java.util.List; import javax.annotation.Nonnull; import org.sonar.server.computation.component.Visitor; import org.sonar.server.computation.container.ComputeEngineContainer; +import org.sonar.server.computation.measure.MeasureComputersVisitor; import org.sonar.server.computation.sqale.SqaleMeasuresVisitor; /** @@ -35,8 +36,11 @@ import org.sonar.server.computation.sqale.SqaleMeasuresVisitor; */ public class ComponentVisitors { - private static final List> ORDERED_VISITOR_CLASSES = ImmutableList.of( - SqaleMeasuresVisitor.class + private static final List> ORDERED_VISITOR_CLASSES = ImmutableList.of( + SqaleMeasuresVisitor.class, + + // Must be after all other visitors as it requires measures computed by previous visitors + MeasureComputersVisitor.class ); /** diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java index 982942e0517..da0a1a9243b 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java @@ -65,10 +65,8 @@ public class ComputationSteps { // must be executed after the measures required for common rules (coverage, comment density, duplications) IntegrateIssuesStep.class, - ExecuteVisitorsStep.class, - FeedMeasureComputers.class, - ComputePluginMeasuresStep.class, + ExecuteVisitorsStep.class, // Must be executed after computation of all measures FillMeasuresWithVariationsStep.class, diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputePluginMeasuresStep.java b/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputePluginMeasuresStep.java deleted file mode 100644 index 9d4692a811b..00000000000 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputePluginMeasuresStep.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -package org.sonar.server.computation.step; - -import org.sonar.api.ce.measure.MeasureComputer; -import org.sonar.server.computation.component.DepthTraversalTypeAwareCrawler; -import org.sonar.server.computation.component.ProjectSettingsRepository; -import org.sonar.server.computation.component.TreeRootHolder; -import org.sonar.server.computation.measure.MeasureComputersHolder; -import org.sonar.server.computation.measure.MeasureRepository; -import org.sonar.server.computation.measure.api.MeasureComputerImplementationContext; -import org.sonar.server.computation.metric.MetricRepository; - -import static org.sonar.server.computation.component.Component.Type.FILE; -import static org.sonar.server.computation.component.Visitor.Order.PRE_ORDER; - -public class ComputePluginMeasuresStep implements ComputationStep { - - private final TreeRootHolder treeRootHolder; - private final MetricRepository metricRepository; - private final MeasureRepository measureRepository; - private final ProjectSettingsRepository settings; - - private final MeasureComputersHolder measureComputersHolder; - - public ComputePluginMeasuresStep(TreeRootHolder treeRootHolder, MetricRepository metricRepository, MeasureRepository measureRepository, ProjectSettingsRepository settings, - MeasureComputersHolder measureComputersHolder) { - this.treeRootHolder = treeRootHolder; - this.metricRepository = metricRepository; - this.measureRepository = measureRepository; - this.settings = settings; - this.measureComputersHolder = measureComputersHolder; - } - - @Override - public void execute() { - new NewMetricDefinitionsVisitor().visit(treeRootHolder.getRoot()); - } - - private class NewMetricDefinitionsVisitor extends DepthTraversalTypeAwareCrawler { - - public NewMetricDefinitionsVisitor() { - super(FILE, PRE_ORDER); - } - - @Override - public void visitAny(org.sonar.server.computation.component.Component component) { - for (MeasureComputer computer : measureComputersHolder.getMeasureComputers()) { - MeasureComputerImplementationContext measureComputerContext = new MeasureComputerImplementationContext(component, computer, settings, measureRepository, metricRepository); - computer.getImplementation().compute(measureComputerContext); - } - } - } - - @Override - public String getDescription() { - return "Compute measures from plugin"; - } - -} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureComputersVisitorTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureComputersVisitorTest.java new file mode 100644 index 00000000000..1780a720025 --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureComputersVisitorTest.java @@ -0,0 +1,153 @@ +/* + * SonarQube, open source software quality management tool. + * Copyright (C) 2008-2014 SonarSource + * mailto:contact AT sonarsource DOT com + * + * SonarQube is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or (at your option) any later version. + * + * SonarQube is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +package org.sonar.server.computation.measure; + +import java.util.Arrays; +import java.util.Collections; +import org.junit.Rule; +import org.junit.Test; +import org.sonar.api.ce.measure.MeasureComputer; +import org.sonar.server.computation.component.Component; +import org.sonar.server.computation.component.Visitor; +import org.sonar.server.computation.component.VisitorsCrawler; +import org.sonar.server.computation.measure.api.MeasureComputerImpl; +import org.sonar.server.computation.metric.MetricRepositoryRule; + +import static com.google.common.collect.Lists.newArrayList; +import static org.assertj.core.api.Assertions.assertThat; +import static org.sonar.api.measures.CoreMetrics.COMMENT_LINES; +import static org.sonar.api.measures.CoreMetrics.COMMENT_LINES_KEY; +import static org.sonar.api.measures.CoreMetrics.NCLOC; +import static org.sonar.api.measures.CoreMetrics.NCLOC_KEY; +import static org.sonar.server.computation.component.Component.Type.DIRECTORY; +import static org.sonar.server.computation.component.Component.Type.FILE; +import static org.sonar.server.computation.component.Component.Type.MODULE; +import static org.sonar.server.computation.component.Component.Type.PROJECT; +import static org.sonar.server.computation.component.DumbComponent.builder; +import static org.sonar.server.computation.measure.Measure.newMeasureBuilder; +import static org.sonar.server.computation.measure.MeasureRepoEntry.entryOf; +import static org.sonar.server.computation.measure.MeasureRepoEntry.toEntries; + +public class MeasureComputersVisitorTest { + + private static final String NEW_METRIC_KEY = "new_metric_key"; + private static final String NEW_METRIC_NAME = "new metric name"; + + private static final org.sonar.api.measures.Metric NEW_METRIC = new org.sonar.api.measures.Metric.Builder(NEW_METRIC_KEY, NEW_METRIC_NAME, + org.sonar.api.measures.Metric.ValueType.INT) + .create(); + + private static final int ROOT_REF = 1; + private static final int MODULE_REF = 12; + private static final int DIRECTORY_REF = 123; + private static final int FILE_1_REF = 1231; + private static final int FILE_2_REF = 1232; + + private static final Component ROOT = builder(PROJECT, ROOT_REF).setKey("project") + .addChildren( + builder(MODULE, MODULE_REF).setKey("module") + .addChildren( + builder(DIRECTORY, DIRECTORY_REF).setKey("directory") + .addChildren( + builder(FILE, FILE_1_REF).setKey("file1").build(), + builder(FILE, FILE_2_REF).setKey("file2").build() + ).build() + ).build() + ).build(); + + @Rule + public MetricRepositoryRule metricRepository = new MetricRepositoryRule() + .add(NCLOC) + .add(COMMENT_LINES) + .add(NEW_METRIC); + + @Rule + public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(ROOT, metricRepository); + + MeasureComputersHolderImpl measureComputersHolder = new MeasureComputersHolderImpl(); + + @Test + public void compute_plugin_measure() throws Exception { + measureRepository.addRawMeasure(FILE_1_REF, NCLOC_KEY, newMeasureBuilder().create(10)); + measureRepository.addRawMeasure(FILE_1_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(2)); + measureRepository.addRawMeasure(FILE_2_REF, NCLOC_KEY, newMeasureBuilder().create(40)); + measureRepository.addRawMeasure(FILE_2_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(5)); + measureRepository.addRawMeasure(DIRECTORY_REF, NCLOC_KEY, newMeasureBuilder().create(50)); + measureRepository.addRawMeasure(DIRECTORY_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); + measureRepository.addRawMeasure(MODULE_REF, NCLOC_KEY, newMeasureBuilder().create(50)); + measureRepository.addRawMeasure(MODULE_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); + measureRepository.addRawMeasure(ROOT_REF, NCLOC_KEY, newMeasureBuilder().create(50)); + measureRepository.addRawMeasure(ROOT_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); + + measureComputersHolder.setMeasureComputers(newArrayList( + new MeasureComputerImpl.MeasureComputerBuilderImpl() + .setInputMetrics(NCLOC_KEY, COMMENT_LINES_KEY) + .setOutputMetrics(NEW_METRIC_KEY) + .setImplementation( + new MeasureComputer.Implementation() { + @Override + public void compute(Context ctx) { + org.sonar.api.ce.measure.Measure ncloc = ctx.getMeasure(NCLOC_KEY); + org.sonar.api.ce.measure.Measure comment = ctx.getMeasure(COMMENT_LINES_KEY); + if (ncloc != null && comment != null) { + ctx.addMeasure(NEW_METRIC_KEY, ncloc.getIntValue() + comment.getIntValue()); + } + } + } + ) + .build() + )); + + VisitorsCrawler visitorsCrawler = new VisitorsCrawler(Arrays.asList(new MeasureComputersVisitor(metricRepository, measureRepository, null, measureComputersHolder))); + visitorsCrawler.visit(ROOT); + + assertThat(toEntries(measureRepository.getAddedRawMeasures(FILE_1_REF))).containsOnly(entryOf(NEW_METRIC_KEY, newMeasureBuilder().create(12))); + assertThat(toEntries(measureRepository.getAddedRawMeasures(FILE_2_REF))).containsOnly(entryOf(NEW_METRIC_KEY, newMeasureBuilder().create(45))); + assertThat(toEntries(measureRepository.getAddedRawMeasures(DIRECTORY_REF))).containsOnly(entryOf(NEW_METRIC_KEY, newMeasureBuilder().create(57))); + assertThat(toEntries(measureRepository.getAddedRawMeasures(MODULE_REF))).containsOnly(entryOf(NEW_METRIC_KEY, newMeasureBuilder().create(57))); + assertThat(toEntries(measureRepository.getAddedRawMeasures(ROOT_REF))).containsOnly(entryOf(NEW_METRIC_KEY, newMeasureBuilder().create(57))); + } + + @Test + public void nothing_to_compute() throws Exception { + measureRepository.addRawMeasure(FILE_1_REF, NCLOC_KEY, newMeasureBuilder().create(10)); + measureRepository.addRawMeasure(FILE_1_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(2)); + measureRepository.addRawMeasure(FILE_2_REF, NCLOC_KEY, newMeasureBuilder().create(40)); + measureRepository.addRawMeasure(FILE_2_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(5)); + measureRepository.addRawMeasure(DIRECTORY_REF, NCLOC_KEY, newMeasureBuilder().create(50)); + measureRepository.addRawMeasure(DIRECTORY_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); + measureRepository.addRawMeasure(MODULE_REF, NCLOC_KEY, newMeasureBuilder().create(50)); + measureRepository.addRawMeasure(MODULE_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); + measureRepository.addRawMeasure(ROOT_REF, NCLOC_KEY, newMeasureBuilder().create(50)); + measureRepository.addRawMeasure(ROOT_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); + + measureComputersHolder.setMeasureComputers(Collections.emptyList()); + VisitorsCrawler visitorsCrawler = new VisitorsCrawler(Arrays.asList(new MeasureComputersVisitor(metricRepository, measureRepository, null, measureComputersHolder))); + visitorsCrawler.visit(ROOT); + + assertThat(toEntries(measureRepository.getAddedRawMeasures(FILE_1_REF))).isEmpty(); + assertThat(toEntries(measureRepository.getAddedRawMeasures(FILE_2_REF))).isEmpty(); + assertThat(toEntries(measureRepository.getAddedRawMeasures(DIRECTORY_REF))).isEmpty(); + assertThat(toEntries(measureRepository.getAddedRawMeasures(MODULE_REF))).isEmpty(); + assertThat(toEntries(measureRepository.getAddedRawMeasures(ROOT_REF))).isEmpty(); + } + +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputePluginMeasuresStepTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputePluginMeasuresStepTest.java deleted file mode 100644 index 4b3c42f8340..00000000000 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputePluginMeasuresStepTest.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * SonarQube, open source software quality management tool. - * Copyright (C) 2008-2014 SonarSource - * mailto:contact AT sonarsource DOT com - * - * SonarQube is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * SonarQube is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -package org.sonar.server.computation.step; - -import java.util.Collections; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.sonar.api.ce.measure.Measure; -import org.sonar.api.ce.measure.MeasureComputer; -import org.sonar.server.computation.batch.TreeRootHolderRule; -import org.sonar.server.computation.measure.MeasureComputersHolderImpl; -import org.sonar.server.computation.measure.MeasureRepositoryRule; -import org.sonar.server.computation.measure.api.MeasureComputerImpl; -import org.sonar.server.computation.metric.MetricRepositoryRule; - -import static com.google.common.collect.Lists.newArrayList; -import static org.assertj.core.api.Assertions.assertThat; -import static org.sonar.api.measures.CoreMetrics.COMMENT_LINES; -import static org.sonar.api.measures.CoreMetrics.COMMENT_LINES_KEY; -import static org.sonar.api.measures.CoreMetrics.NCLOC; -import static org.sonar.api.measures.CoreMetrics.NCLOC_KEY; -import static org.sonar.server.computation.component.Component.Type.DIRECTORY; -import static org.sonar.server.computation.component.Component.Type.FILE; -import static org.sonar.server.computation.component.Component.Type.MODULE; -import static org.sonar.server.computation.component.Component.Type.PROJECT; -import static org.sonar.server.computation.component.DumbComponent.builder; -import static org.sonar.server.computation.measure.Measure.newMeasureBuilder; -import static org.sonar.server.computation.measure.MeasureRepoEntry.entryOf; -import static org.sonar.server.computation.measure.MeasureRepoEntry.toEntries; - -public class ComputePluginMeasuresStepTest { - - private static final String NEW_METRIC_KEY = "new_metric_key"; - private static final String NEW_METRIC_NAME = "new metric name"; - - private static final org.sonar.api.measures.Metric NEW_METRIC = new org.sonar.api.measures.Metric.Builder(NEW_METRIC_KEY, NEW_METRIC_NAME, - org.sonar.api.measures.Metric.ValueType.INT) - .create(); - - private static final int ROOT_REF = 1; - private static final int MODULE_REF = 12; - private static final int DIRECTORY_REF = 123; - private static final int FILE_1_REF = 1231; - private static final int FILE_2_REF = 1232; - - @Rule - public TreeRootHolderRule treeRootHolder = new TreeRootHolderRule(); - - @Rule - public MetricRepositoryRule metricRepository = new MetricRepositoryRule() - .add(NCLOC) - .add(COMMENT_LINES) - .add(NEW_METRIC); - - @Rule - public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository); - - @Before - public void setUp() throws Exception { - treeRootHolder.setRoot( - builder(PROJECT, ROOT_REF).setKey("project") - .addChildren( - builder(MODULE, MODULE_REF).setKey("module") - .addChildren( - builder(DIRECTORY, DIRECTORY_REF).setKey("directory") - .addChildren( - builder(FILE, FILE_1_REF).setKey("file1").build(), - builder(FILE, FILE_2_REF).setKey("file2").build() - ).build() - ).build() - ).build()); - } - - MeasureComputersHolderImpl measureComputersHolder = new MeasureComputersHolderImpl(); - - @Test - public void compute_plugin_measure() throws Exception { - measureRepository.addRawMeasure(FILE_1_REF, NCLOC_KEY, newMeasureBuilder().create(10)); - measureRepository.addRawMeasure(FILE_1_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(2)); - measureRepository.addRawMeasure(FILE_2_REF, NCLOC_KEY, newMeasureBuilder().create(40)); - measureRepository.addRawMeasure(FILE_2_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(5)); - measureRepository.addRawMeasure(DIRECTORY_REF, NCLOC_KEY, newMeasureBuilder().create(50)); - measureRepository.addRawMeasure(DIRECTORY_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); - measureRepository.addRawMeasure(MODULE_REF, NCLOC_KEY, newMeasureBuilder().create(50)); - measureRepository.addRawMeasure(MODULE_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); - measureRepository.addRawMeasure(ROOT_REF, NCLOC_KEY, newMeasureBuilder().create(50)); - measureRepository.addRawMeasure(ROOT_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); - - measureComputersHolder.setMeasureComputers(newArrayList( - new MeasureComputerImpl.MeasureComputerBuilderImpl() - .setInputMetrics(NCLOC_KEY, COMMENT_LINES_KEY) - .setOutputMetrics(NEW_METRIC_KEY) - .setImplementation( - new MeasureComputer.Implementation() { - @Override - public void compute(Context ctx) { - Measure ncloc = ctx.getMeasure(NCLOC_KEY); - Measure comment = ctx.getMeasure(COMMENT_LINES_KEY); - if (ncloc != null && comment != null) { - ctx.addMeasure(NEW_METRIC_KEY, ncloc.getIntValue() + comment.getIntValue()); - } - } - } - ) - .build() - )); - ComputationStep underTest = new ComputePluginMeasuresStep(treeRootHolder, metricRepository, measureRepository, null, measureComputersHolder); - underTest.execute(); - - assertThat(toEntries(measureRepository.getAddedRawMeasures(FILE_1_REF))).containsOnly(entryOf(NEW_METRIC_KEY, newMeasureBuilder().create(12))); - assertThat(toEntries(measureRepository.getAddedRawMeasures(FILE_2_REF))).containsOnly(entryOf(NEW_METRIC_KEY, newMeasureBuilder().create(45))); - assertThat(toEntries(measureRepository.getAddedRawMeasures(DIRECTORY_REF))).containsOnly(entryOf(NEW_METRIC_KEY, newMeasureBuilder().create(57))); - assertThat(toEntries(measureRepository.getAddedRawMeasures(MODULE_REF))).containsOnly(entryOf(NEW_METRIC_KEY, newMeasureBuilder().create(57))); - assertThat(toEntries(measureRepository.getAddedRawMeasures(ROOT_REF))).containsOnly(entryOf(NEW_METRIC_KEY, newMeasureBuilder().create(57))); - } - - @Test - public void nothing_to_compute() throws Exception { - measureRepository.addRawMeasure(FILE_1_REF, NCLOC_KEY, newMeasureBuilder().create(10)); - measureRepository.addRawMeasure(FILE_1_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(2)); - measureRepository.addRawMeasure(FILE_2_REF, NCLOC_KEY, newMeasureBuilder().create(40)); - measureRepository.addRawMeasure(FILE_2_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(5)); - measureRepository.addRawMeasure(DIRECTORY_REF, NCLOC_KEY, newMeasureBuilder().create(50)); - measureRepository.addRawMeasure(DIRECTORY_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); - measureRepository.addRawMeasure(MODULE_REF, NCLOC_KEY, newMeasureBuilder().create(50)); - measureRepository.addRawMeasure(MODULE_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); - measureRepository.addRawMeasure(ROOT_REF, NCLOC_KEY, newMeasureBuilder().create(50)); - measureRepository.addRawMeasure(ROOT_REF, COMMENT_LINES_KEY, newMeasureBuilder().create(7)); - - measureComputersHolder.setMeasureComputers(Collections.emptyList()); - ComputationStep underTest = new ComputePluginMeasuresStep(treeRootHolder, metricRepository, measureRepository, null, measureComputersHolder); - underTest.execute(); - - assertThat(toEntries(measureRepository.getAddedRawMeasures(FILE_1_REF))).isEmpty(); - assertThat(toEntries(measureRepository.getAddedRawMeasures(FILE_2_REF))).isEmpty(); - assertThat(toEntries(measureRepository.getAddedRawMeasures(DIRECTORY_REF))).isEmpty(); - assertThat(toEntries(measureRepository.getAddedRawMeasures(MODULE_REF))).isEmpty(); - assertThat(toEntries(measureRepository.getAddedRawMeasures(ROOT_REF))).isEmpty(); - } - -} -- cgit v1.2.3