]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6730 Add boolean measure
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Tue, 1 Sep 2015 14:30:44 +0000 (16:30 +0200)
committerJulien Lancelot <julien.lancelot@sonarsource.com>
Wed, 2 Sep 2015 12:28:19 +0000 (14:28 +0200)
server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureComputerContextImpl.java
server/sonar-server/src/main/java/org/sonar/server/computation/measure/api/MeasureImpl.java
server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureComputerContextImplTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/measure/api/MeasureImplTest.java
sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/Measure.java
sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/MeasureComputer.java
sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestMeasure.java
sonar-plugin-api/src/main/java/org/sonar/api/ce/measure/test/TestMeasureComputerContext.java
sonar-plugin-api/src/test/java/org/sonar/api/ce/measure/test/TestMeasureComputerContextTest.java
sonar-plugin-api/src/test/java/org/sonar/api/ce/measure/test/TestMeasureTest.java

index 434e18d1185bad92dfc205b30831ebc0bda63fb9..13d3a9a4578a91ca79bf5147610d87540168fa8d 100644 (file)
@@ -168,6 +168,13 @@ public class MeasureComputerContextImpl implements MeasureComputerContext {
     measureRepository.add(internalComponent, metric, newMeasureBuilder().create(value));
   }
 
+  @Override
+  public void addMeasure(String metricKey, boolean value) {
+    Metric metric = metricRepository.getByKey(metricKey);
+    validateAddMeasure(metric);
+    measureRepository.add(internalComponent, metric, newMeasureBuilder().create(value));
+  }
+
   private void validateInputMetric(String metric) {
     checkArgument(allowedMetrics.contains(metric), "Only metrics in %s can be used to load measures", definition.getInputMetrics());
   }
index 285a05ab68e900a36a2fec5f868dcb3d816986a1..5d0371d3f413c92fc4e5f3787b2f2fb2e7310197 100644 (file)
@@ -28,6 +28,7 @@ import org.sonar.api.ce.measure.Measure;
 
 import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
+import static org.sonar.server.computation.measure.Measure.ValueType.BOOLEAN;
 import static org.sonar.server.computation.measure.Measure.ValueType.DOUBLE;
 import static org.sonar.server.computation.measure.Measure.ValueType.INT;
 import static org.sonar.server.computation.measure.Measure.ValueType.LONG;
@@ -36,7 +37,7 @@ import static org.sonar.server.computation.measure.Measure.ValueType.STRING;
 @Immutable
 public class MeasureImpl implements Measure {
 
-  private static final Set<org.sonar.server.computation.measure.Measure.ValueType> ALLOWED_VALUE_TYPES = ImmutableSet.of(INT, LONG, DOUBLE, STRING);
+  private static final Set<org.sonar.server.computation.measure.Measure.ValueType> ALLOWED_VALUE_TYPES = ImmutableSet.of(INT, LONG, DOUBLE, STRING, BOOLEAN);
 
   private final org.sonar.server.computation.measure.Measure measure;
 
@@ -69,6 +70,12 @@ public class MeasureImpl implements Measure {
     return measure.getStringValue();
   }
 
+  @Override
+  public boolean getBooleanValue() {
+    checkValueType(BOOLEAN);
+    return measure.getBooleanValue();
+  }
+
   private void checkValueType(org.sonar.server.computation.measure.Measure.ValueType expected) {
     checkState(measure.getValueType() == expected, String.format(
       "Value can not be converted to %s because current value type is a %s",
index 74c2cd64b3acd2cbee51a76c49d7fa67869de9ff..683324ed989a727f011f6695f39876d8388dde1a 100644 (file)
@@ -60,6 +60,7 @@ public class MeasureComputerContextImplTest {
   private static final String DOUBLE_METRIC_KEY = "double_metric_key";
   private static final String LONG_METRIC_KEY = "long_metric_key";
   private static final String STRING_METRIC_KEY = "string_metric_key";
+  private static final String BOOLEAN_METRIC_KEY = "boolean_metric_key";
 
   private static final int PROJECT_REF = 1;
   private static final int FILE_1_REF = 12341;
@@ -84,7 +85,9 @@ public class MeasureComputerContextImplTest {
     .add(new MetricImpl(2, INT_METRIC_KEY, "int metric", Metric.MetricType.INT))
     .add(new MetricImpl(3, DOUBLE_METRIC_KEY, "double metric", Metric.MetricType.FLOAT))
     .add(new MetricImpl(4, LONG_METRIC_KEY, "long metric", Metric.MetricType.MILLISEC))
-    .add(new MetricImpl(5, STRING_METRIC_KEY, "string metric", Metric.MetricType.STRING));
+    .add(new MetricImpl(5, STRING_METRIC_KEY, "string metric", Metric.MetricType.STRING))
+    .add(new MetricImpl(6, BOOLEAN_METRIC_KEY, "boolean metric", Metric.MetricType.BOOL))
+    ;
 
   @Rule
   public MeasureRepositoryRule measureRepository = MeasureRepositoryRule.create(treeRootHolder, metricRepository);
@@ -216,6 +219,16 @@ public class MeasureComputerContextImplTest {
     assertThat(measure.get().getStringValue()).isEqualTo("data");
   }
 
+  @Test
+  public void add_boolean_measure_create_measure_of_type_boolean_with_right_value() throws Exception {
+    MeasureComputerContextImpl underTest = newContext(PROJECT_REF, NCLOC_KEY, BOOLEAN_METRIC_KEY);
+    underTest.addMeasure(BOOLEAN_METRIC_KEY, true);
+
+    Optional<Measure> measure = measureRepository.getAddedRawMeasure(PROJECT_REF, BOOLEAN_METRIC_KEY);
+    assertThat(measure).isPresent();
+    assertThat(measure.get().getBooleanValue()).isTrue();
+  }
+
   @Test
   public void fail_with_IAE_when_add_measure_is_called_on_metric_not_in_output_list() throws Exception {
     thrown.expect(IllegalArgumentException.class);
index cd7d24d690ffc348b7d7c846168d556e896c2e35..c6b11e3fdbd10a2517a1952922b8540b5d409791 100644 (file)
@@ -92,10 +92,25 @@ public class MeasureImplTest {
     measure.getStringValue();
   }
 
+  @Test
+  public void get_boolean_value() throws Exception {
+    MeasureImpl measure = new MeasureImpl(Measure.newMeasureBuilder().create(true));
+    assertThat(measure.getBooleanValue()).isTrue();
+  }
+
+  @Test
+  public void fail_with_ISE_when_not_boolean_value() throws Exception {
+    thrown.expect(IllegalStateException.class);
+    thrown.expectMessage("Value can not be converted to boolean because current value type is a DOUBLE");
+
+    MeasureImpl measure = new MeasureImpl(Measure.newMeasureBuilder().create(1d));
+    measure.getBooleanValue();
+  }
+
   @Test
   public void fail_with_ISE_when_creating_measure_with_no_value() throws Exception {
     thrown.expect(IllegalStateException.class);
-    thrown.expectMessage("Only following types are allowed [INT, LONG, DOUBLE, STRING]");
+    thrown.expectMessage("Only following types are allowed [INT, LONG, DOUBLE, STRING, BOOLEAN]");
 
     new MeasureImpl(Measure.newMeasureBuilder().createNoValue());
   }
@@ -103,7 +118,7 @@ public class MeasureImplTest {
   @Test
   public void fail_with_ISE_when_creating_measure_with_not_allowed_value() throws Exception {
     thrown.expect(IllegalStateException.class);
-    thrown.expectMessage("Only following types are allowed [INT, LONG, DOUBLE, STRING]");
+    thrown.expectMessage("Only following types are allowed [INT, LONG, DOUBLE, STRING, BOOLEAN]");
 
     new MeasureImpl(Measure.newMeasureBuilder().create(Measure.Level.ERROR));
   }
index 948f33eee6c04d7bc879c2880578026fdc8cface..dc53a428d3fe0b59070529f6cb7f16bb0b111654 100644 (file)
@@ -30,29 +30,36 @@ public interface Measure {
   /**
    * The value of this measure as a integer.
    *
-   * @throws IllegalStateException if the value type of the metric is not a integer {see @link org.sonar.api.measures.Metric.ValueType}
+   * @throws IllegalStateException if the value type of the metric is not a integer. See {@link org.sonar.api.measures.Metric.ValueType}
    */
   int getIntValue();
 
   /**
    * The value of this measure as a long.
    *
-   * @throws IllegalStateException if the value type of the metric is not a long {see @link org.sonar.api.measures.Metric.ValueType}
+   * @throws IllegalStateException if the value type of the metric is not a long. See {@link org.sonar.api.measures.Metric.ValueType}
    */
   long getLongValue();
 
   /**
    * The value of this measure as a double.
    *
-   * @throws IllegalStateException if the value type of the metric is not a double {see @link org.sonar.api.measures.Metric.ValueType}
+   * @throws IllegalStateException if the value type of the metric is not a double. See {@link org.sonar.api.measures.Metric.ValueType}
    */
   double getDoubleValue();
 
   /**
    * The value of this measure as a string.
    *
-   * @throws IllegalStateException if the value type of the metric is not a string {see @link org.sonar.api.measures.Metric.ValueType}
+   * @throws IllegalStateException if the value type of the metric is not a string. See {@link org.sonar.api.measures.Metric.ValueType}
    */
   String getStringValue();
 
+  /**
+   * The value of this measure as a boolean.
+   *
+   * @throws IllegalStateException if the value type of the metric is not a boolean. See {@link org.sonar.api.measures.Metric.ValueType}
+   */
+  boolean getBooleanValue();
+
 }
index 76a8dfa5c96d4ccc70f7dacdbf6f831743ae9585..df3e4f2ce37797d08c157e509d21c4694f7b799f 100644 (file)
@@ -212,6 +212,14 @@ public interface MeasureComputer {
      */
     void addMeasure(String metric, String value);
 
+    /**
+     * Add a new measure of a given metric which measure type will be boolean
+     *
+     * @throws IllegalArgumentException if the metric is not listed in {@link MeasureComputerDefinition#getOutputMetrics()}
+     * @throws UnsupportedOperationException if a measure for the specified metric already exists for the current component
+     */
+    void addMeasure(String metric, boolean value);
+
     /**
      * Return list of all issues (open, closed, etc.) of current component.
      */
index fbe8bc9067902f9664d327ce50ff1a773013746f..b74eda4aee0490f972b61e4cc423f90234bc30c3 100644 (file)
@@ -33,6 +33,7 @@ public class TestMeasure implements Measure {
   private Long longValue;
   private Double doubleValue;
   private String stringValue;
+  private Boolean booleanValue;
 
   public static TestMeasure createMeasure(double doubleValue){
     TestMeasure measure = new TestMeasure();
@@ -58,6 +59,12 @@ public class TestMeasure implements Measure {
     return measure;
   }
 
+  public static TestMeasure createMeasure(boolean booleanValue) {
+    TestMeasure measure = new TestMeasure();
+    measure.booleanValue = requireNonNull(booleanValue, "Value cannot be null");
+    return measure;
+  }
+
   @Override
   public int getIntValue() {
     checkState(intValue != null, "Not an integer measure");
@@ -81,4 +88,10 @@ public class TestMeasure implements Measure {
     checkState(stringValue != null, "Not a string measure");
     return stringValue;
   }
+
+  @Override
+  public boolean getBooleanValue() {
+    checkState(booleanValue != null, "Not a boolean measure");
+    return booleanValue;
+  }
 }
index 55ed0218b99a43e40c3b29d2048884f1b5033d89..9a0aac70bc4caa463b4be18ba9931bcc054cd453 100644 (file)
@@ -131,6 +131,17 @@ public class TestMeasureComputerContext implements MeasureComputerContext {
     componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
   }
 
+  @Override
+  public void addMeasure(String metricKey, boolean value) {
+    validateAddMeasure(metricKey);
+    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
+  }
+
+
+  public void addInputMeasure(String metricKey, boolean value) {
+    componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
+  }
+
   public void addInputMeasure(String metricKey, String value) {
     componentMeasureByMetricKey.put(metricKey, TestMeasure.createMeasure(value));
   }
index 8ad7b6730b07392d11ebed2c2b9356b7797fc85e..ea3cda844a600588cd7a3448bfd940e151af0b6e 100644 (file)
@@ -91,6 +91,13 @@ public class TestMeasureComputerContextTest {
     assertThat(underTest.getMeasure(INPUT_METRIC).getStringValue()).isEqualTo("text");
   }
 
+  @Test
+  public void get_boolean_measure() throws Exception {
+    underTest.addInputMeasure(INPUT_METRIC, true);
+
+    assertThat(underTest.getMeasure(INPUT_METRIC).getBooleanValue()).isTrue();
+  }
+
   @Test
   public void fail_with_IAE_when_trying_to_get_measure_on_unknown_metric() throws Exception {
     thrown.expect(IllegalArgumentException.class);
index fb54b4ba8f15eff8d71348df593e05cf60f2dfb5..b1786bdd143a4ddefc1fc3da68657d78ed5c5159 100644 (file)
@@ -51,6 +51,11 @@ public class TestMeasureTest {
     assertThat(TestMeasure.createMeasure("value").getStringValue()).isEqualTo("value");
   }
 
+  @Test
+  public void create_boolean_measure() throws Exception {
+    assertThat(TestMeasure.createMeasure(true).getBooleanValue()).isTrue();
+  }
+
   @Test
   public void getDoubleValue_fails_with_ISE_when_not_a_double() throws Exception {
     thrown.expect(IllegalStateException.class);
@@ -82,4 +87,12 @@ public class TestMeasureTest {
 
     TestMeasure.createMeasure(10).getStringValue();
   }
+
+  @Test
+  public void getBooleanValue_fails_with_ISE_when_not_a_boolean() throws Exception {
+    thrown.expect(IllegalStateException.class);
+    thrown.expectMessage("Not a boolean measure");
+
+    TestMeasure.createMeasure(10).getBooleanValue();
+  }
 }