]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6730 Replace step executing MeasureComputers by a visitor
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 7 Aug 2015 14:46:59 +0000 (16:46 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 10 Aug 2015 12:18:19 +0000 (14:18 +0200)
server/sonar-server/src/main/java/org/sonar/server/computation/component/DequeBasedPath.java
server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureComputersVisitor.java [new file with mode: 0644]
server/sonar-server/src/main/java/org/sonar/server/computation/step/ComponentVisitors.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputationSteps.java
server/sonar-server/src/main/java/org/sonar/server/computation/step/ComputePluginMeasuresStep.java [deleted file]
server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureComputersVisitorTest.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/step/ComputePluginMeasuresStepTest.java [deleted file]

index 0c7bb8f64a7ee57ba1897ae4d2f0d1554e7d1876..733f97822718cf8c0ede31e4f581ecf36400c9b8 100644 (file)
@@ -25,7 +25,7 @@ import java.util.Deque;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
-public class DequeBasedPath<T> implements PathAwareVisitor.Path<T>, Iterable<PathAwareVisitor.PathElement<T>> {
+final class DequeBasedPath<T> implements PathAwareVisitor.Path<T>, Iterable<PathAwareVisitor.PathElement<T>> {
   private final Deque<PathAwareVisitor.PathElement<T>> 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 (file)
index 0000000..e0e105a
--- /dev/null
@@ -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);
+    }
+  }
+}
index 35673b68066d4fe34265f2c541b7c6ef73745819..34257d49906a27f6ed823bbf94be6ebe499d23f7 100644 (file)
@@ -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<Class<? extends Visitor>> ORDERED_VISITOR_CLASSES = ImmutableList.<Visitor>of(
-    SqaleMeasuresVisitor.class
+  private static final List<Class<? extends Visitor>> ORDERED_VISITOR_CLASSES = ImmutableList.of(
+    SqaleMeasuresVisitor.class,
+
+    // Must be after all other visitors as it requires measures computed by previous visitors
+    MeasureComputersVisitor.class    
   );
 
   /**
index 982942e0517347c1c9a1a72d59ea9bf6cd551c27..da0a1a9243bd15aaa9465515d1c636455508a6ae 100644 (file)
@@ -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 (file)
index 9d4692a..0000000
+++ /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 (file)
index 0000000..1780a72
--- /dev/null
@@ -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<Integer> 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.<Visitor>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.<MeasureComputer>emptyList());
+    VisitorsCrawler visitorsCrawler = new VisitorsCrawler(Arrays.<Visitor>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 (file)
index 4b3c42f..0000000
+++ /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<Integer> 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.<MeasureComputer>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();
-  }
-
-}