]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-6620 add Variations to Measure in Compute Engine
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Thu, 11 Jun 2015 08:01:58 +0000 (10:01 +0200)
committerSébastien Lesaint <sebastien.lesaint@sonarsource.com>
Mon, 15 Jun 2015 11:07:53 +0000 (13:07 +0200)
server/sonar-server/src/main/java/org/sonar/server/computation/measure/BatchMeasureToMeasure.java
server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java
server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureDtoToMeasure.java
server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureImpl.java
server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureVariations.java [new file with mode: 0644]
server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchMeasureToMeasureTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java
server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureVariationsTest.java [new file with mode: 0644]

index fb8c6e741699ae3447997f77be442bfcebc422c2..fd4e01792c10a95b827a6ef5a3aff4898321c73c 100644 (file)
@@ -112,7 +112,28 @@ public class BatchMeasureToMeasure {
         measure.setQualityGateStatus(new QualityGateStatus(qualityGateStatus.get(), text));
       }
     }
+    if (hasAnyVariation(batchMeasure))  {
+      measure.setVariations(createVariations(batchMeasure));
+    }
     return Optional.of((Measure) measure);
   }
 
+  private static boolean hasAnyVariation(BatchReport.Measure batchMeasure) {
+    return batchMeasure.hasVariationValue1()
+        || batchMeasure.hasVariationValue2()
+        || batchMeasure.hasVariationValue3()
+        || batchMeasure.hasVariationValue4()
+        || batchMeasure.hasVariationValue5();
+  }
+
+  private static MeasureVariations createVariations(BatchReport.Measure batchMeasure) {
+    return new MeasureVariations(
+        batchMeasure.hasVariationValue1() ? batchMeasure.getVariationValue1() : null,
+        batchMeasure.hasVariationValue2() ? batchMeasure.getVariationValue2() : null,
+        batchMeasure.hasVariationValue3() ? batchMeasure.getVariationValue3() : null,
+        batchMeasure.hasVariationValue4() ? batchMeasure.getVariationValue4() : null,
+        batchMeasure.hasVariationValue5() ? batchMeasure.getVariationValue5() : null
+    );
+  }
+
 }
index 24685d9f54cf10dd32d9dba4296bbceb560d58a3..9b17b6aa01664da9347bbe229d305488e3133245 100644 (file)
@@ -23,8 +23,6 @@ import com.google.common.base.Optional;
 import javax.annotation.CheckForNull;
 import javax.annotation.Nullable;
 
-import static java.util.Objects.requireNonNull;
-
 public interface Measure {
 
   enum ValueType {
@@ -127,4 +125,16 @@ public interface Measure {
    */
   QualityGateStatus getQualityGateStatus();
 
+  /**
+   * Any Measure, which ever is its value type, can have a Variations.
+   */
+  boolean hasVariations();
+
+  /**
+   * The variations of this measure.
+   *
+   * @throws IllegalStateException if the measure has no MeasureVariations
+   */
+  MeasureVariations getVariations();
+
 }
index 7543916c1dea20394ceda81521381585f75d8dfd..4d690013ece86ec10c1c419776d8aadd7a63b726 100644 (file)
@@ -114,8 +114,30 @@ public class MeasureDtoToMeasure {
         measure.setQualityGateStatus(new QualityGateStatus(qualityGateStatus.get(), measureDto.getAlertText()));
       }
     }
+    if (hasAnyVariation(measureDto)) {
+      measure.setVariations(createVariations(measureDto));
+    }
 
     return Optional.of((Measure) measure);
   }
 
+  private static boolean hasAnyVariation(MeasureDto measureDto) {
+    for (int i = 1; i < 6; i++) {
+      if (measureDto.getVariation(i) != null) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  private static MeasureVariations createVariations(MeasureDto measureDto) {
+    return new MeasureVariations(
+        measureDto.getVariation(1),
+        measureDto.getVariation(2),
+        measureDto.getVariation(3),
+        measureDto.getVariation(4),
+        measureDto.getVariation(5)
+    );
+  }
+
 }
index b4471e948a393a97e0cf64e8cac2de6f4fd47a3a..c5960b19d05cdcab5c6854dd4205b2ec9368c5c8 100644 (file)
  */
 package org.sonar.server.computation.measure;
 
-import com.google.common.base.Preconditions;
 import java.util.Locale;
 import javax.annotation.Nullable;
 
+import static com.google.common.base.Preconditions.checkState;
 import static java.util.Objects.requireNonNull;
 
 public final class MeasureImpl implements Measure {
@@ -36,6 +36,8 @@ public final class MeasureImpl implements Measure {
   private final Level dataLevel;
   @Nullable
   private QualityGateStatus qualityGateStatus;
+  @Nullable
+  private MeasureVariations variations;
 
   protected MeasureImpl(ValueType valueType, @Nullable Double value, @Nullable String data, @Nullable Level dataLevel) {
     this.valueType = valueType;
@@ -141,8 +143,23 @@ public final class MeasureImpl implements Measure {
 
   @Override
   public QualityGateStatus getQualityGateStatus() {
-    Preconditions.checkState(qualityGateStatus != null, "Measure does not have an QualityGate status");
+    checkState(qualityGateStatus != null, "Measure does not have an QualityGate status");
     return this.qualityGateStatus;
   }
 
+  public MeasureImpl setVariations(MeasureVariations variations) {
+    this.variations = requireNonNull(variations, "Can not set null MeasureVariations");
+    return this;
+  }
+
+  @Override
+  public boolean hasVariations() {
+    return variations != null;
+  }
+
+  @Override
+  public MeasureVariations getVariations() {
+    checkState(variations != null, "Measure does not have variations");
+    return variations;
+  }
 }
diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureVariations.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureVariations.java
new file mode 100644 (file)
index 0000000..bb106c4
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * 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 com.google.common.base.Objects;
+import java.util.Arrays;
+import javax.annotation.concurrent.Immutable;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Predicates.notNull;
+import static com.google.common.collect.FluentIterable.from;
+
+@Immutable
+public final class MeasureVariations {
+  private final Double[] variations = new Double[5];
+
+  public MeasureVariations(Double... variations) {
+    checkArgument(variations.length <= 5, "There can not be more than 5 variations");
+    checkArgument(!from(Arrays.asList(variations)).filter(notNull()).isEmpty(), "There must be at least one variation");
+    System.arraycopy(variations, 0, this.variations, 0, variations.length);
+  }
+
+  public boolean hasVariation1() {
+    return hasVariation(0);
+  }
+
+  public boolean hasVariation2() {
+    return hasVariation(1);
+  }
+
+  public boolean hasVariation3() {
+    return hasVariation(2);
+  }
+
+  public boolean hasVariation4() {
+    return hasVariation(3);
+  }
+
+  public boolean hasVariation5() {
+    return hasVariation(4);
+  }
+
+  private void checkHasVariation(int i) {
+    if (!hasVariation(i)) {
+      throw new IllegalStateException(String.format("Variation %s has not been set", i + 1));
+    }
+  }
+
+  private boolean hasVariation(int i) {
+    return variations[i] != null;
+  }
+
+  public double getVariation1() {
+    return getVariation(0);
+  }
+
+  public double getVariation2() {
+    return getVariation(1);
+  }
+
+  public double getVariation3() {
+    return getVariation(2);
+  }
+
+  public double getVariation4() {
+    return getVariation(3);
+  }
+
+  public double getVariation5() {
+    return getVariation(4);
+  }
+
+  private double getVariation(int i) {
+    checkHasVariation(i);
+    return variations[i];
+  }
+
+  @Override
+  public String toString() {
+    return Objects.toStringHelper(this)
+      .add("1", variations[0])
+      .add("2", variations[1])
+      .add("3", variations[2])
+      .add("4", variations[3])
+      .add("5", variations[4])
+      .toString();
+  }
+}
index 71055251a82ab2bda8d01ea6cea2d5cd9a5ab50b..a624a2a0fd99603d9353f468617a2be01cfc8845 100644 (file)
 package org.sonar.server.computation.measure;
 
 import com.google.common.base.Optional;
+import com.tngtech.java.junit.dataprovider.DataProvider;
+import com.tngtech.java.junit.dataprovider.DataProviderRunner;
+import com.tngtech.java.junit.dataprovider.UseDataProvider;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.sonar.batch.protocol.output.BatchReport;
 import org.sonar.server.computation.metric.Metric;
 import org.sonar.server.computation.metric.MetricImpl;
@@ -28,6 +32,7 @@ import org.sonar.server.computation.metric.MetricImpl;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.guava.api.Assertions.assertThat;
 
+@RunWith(DataProviderRunner.class)
 public class BatchMeasureToMeasureTest {
   private static final Metric SOME_INT_METRIC = new MetricImpl("key", "name", Metric.MetricType.INT);
   private static final Metric SOME_LONG_METRIC = new MetricImpl("key", "name", Metric.MetricType.WORK_DUR);
@@ -279,4 +284,47 @@ public class BatchMeasureToMeasureTest {
     assertThat(measure.get().getQualityGateStatus().getText()).isEqualTo(SOME_ALERT_TEXT);
   }
 
+  @DataProvider
+  public static Object[][] all_types_batch_measure_builders() {
+    return new Object[][] {
+      {BatchReport.Measure.newBuilder().setBooleanValue(true), SOME_BOOLEAN_METRIC},
+      {BatchReport.Measure.newBuilder().setIntValue(1), SOME_INT_METRIC},
+      {BatchReport.Measure.newBuilder().setLongValue(1), SOME_LONG_METRIC},
+      {BatchReport.Measure.newBuilder().setDoubleValue(1), SOME_DOUBLE_METRIC},
+      {BatchReport.Measure.newBuilder().setStringValue("1"), SOME_STRING_METRIC},
+      {BatchReport.Measure.newBuilder().setStringValue(Measure.Level.OK.name()), SOME_LEVEL_METRIC}
+    };
+  }
+
+  @Test
+  @UseDataProvider("all_types_batch_measure_builders")
+  public void toMeasure_creates_no_MeasureVariation_if_dto_has_none_whichever_the_ValueType(BatchReport.Measure.Builder builder, Metric metric) {
+    assertThat(underTest.toMeasure(builder.build(), metric).get().hasVariations()).isFalse();
+  }
+
+  @Test
+  @UseDataProvider("all_types_batch_measure_builders")
+  public void toMeasure_creates_MeasureVariation_and_maps_the_right_one(BatchReport.Measure.Builder builder, Metric metric) {
+    assertThat(underTest.toMeasure(builder.setVariationValue1(1).build(), metric).get().getVariations().getVariation1()).isEqualTo(1);
+    assertThat(underTest.toMeasure(builder.setVariationValue2(2).build(), metric).get().getVariations().getVariation2()).isEqualTo(2);
+    assertThat(underTest.toMeasure(builder.setVariationValue3(3).build(), metric).get().getVariations().getVariation3()).isEqualTo(3);
+    assertThat(underTest.toMeasure(builder.setVariationValue4(4).build(), metric).get().getVariations().getVariation4()).isEqualTo(4);
+    assertThat(underTest.toMeasure(builder.setVariationValue5(5).build(), metric).get().getVariations().getVariation5()).isEqualTo(5);
+  }
+
+  @Test
+  public void toMeasure_creates_MeasureVariation_and_maps_the_right_one() {
+    BatchReport.Measure batchMeasure = BatchReport.Measure.newBuilder()
+      .setStringValue("1").setVariationValue2(2).setVariationValue3(3).setVariationValue5(5)
+      .build();
+
+    Optional<Measure> measure = underTest.toMeasure(batchMeasure, SOME_STRING_METRIC);
+
+    assertThat(measure.get().getVariations().hasVariation1()).isFalse();
+    assertThat(measure.get().getVariations().getVariation2()).isEqualTo(2);
+    assertThat(measure.get().getVariations().getVariation3()).isEqualTo(3);
+    assertThat(measure.get().getVariations().hasVariation4()).isFalse();
+    assertThat(measure.get().getVariations().getVariation5()).isEqualTo(5);
+  }
+
 }
index ddf953b5bf6cdcc22c1a19b13c1aa1f125e970bc..2ca9c841ff90700e32386a5df49d2b03c4704bb4 100644 (file)
 package org.sonar.server.computation.measure;
 
 import com.google.common.base.Optional;
+import com.tngtech.java.junit.dataprovider.DataProvider;
+import com.tngtech.java.junit.dataprovider.DataProviderRunner;
+import com.tngtech.java.junit.dataprovider.UseDataProvider;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.sonar.core.measure.db.MeasureDto;
 import org.sonar.server.computation.measure.Measure.Level;
 import org.sonar.server.computation.metric.Metric;
@@ -29,6 +33,7 @@ import org.sonar.server.computation.metric.MetricImpl;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.guava.api.Assertions.assertThat;
 
+@RunWith(DataProviderRunner.class)
 public class MeasureDtoToMeasureTest {
   private static final Metric SOME_INT_METRIC = new MetricImpl("key", "name", Metric.MetricType.INT);
   private static final Metric SOME_LONG_METRIC = new MetricImpl("key", "name", Metric.MetricType.WORK_DUR);
@@ -273,4 +278,47 @@ public class MeasureDtoToMeasureTest {
     assertThat(measure.get().getQualityGateStatus().getStatus()).isEqualTo(Level.OK);
     assertThat(measure.get().getQualityGateStatus().getText()).isEqualTo(SOME_ALERT_TEXT);
   }
+
+  @DataProvider
+  public static Object[][] all_types_MeasureDtos() {
+    return new Object[][] {
+        {new MeasureDto().setValue(1d), SOME_BOOLEAN_METRIC},
+        {new MeasureDto().setValue(1d), SOME_INT_METRIC},
+        {new MeasureDto().setValue(1d), SOME_LONG_METRIC},
+        {new MeasureDto().setValue(1d), SOME_DOUBLE_METRIC},
+        {new MeasureDto().setData("1"), SOME_STRING_METRIC},
+        {new MeasureDto().setData(Measure.Level.OK.name()), SOME_LEVEL_METRIC}
+    };
+  }
+
+  @Test
+  @UseDataProvider("all_types_MeasureDtos")
+  public void toMeasure_creates_no_MeasureVariation_if_dto_has_none_whichever_the_ValueType(MeasureDto measureDto, Metric metric) {
+    assertThat(underTest.toMeasure(measureDto, metric).get().hasVariations()).isFalse();
+  }
+
+  @Test
+  @UseDataProvider("all_types_MeasureDtos")
+  public void toMeasure_creates_MeasureVariation_and_maps_the_right_one(MeasureDto builder, Metric metric) {
+    assertThat(underTest.toMeasure(builder.setVariation(1, 1d), metric).get().getVariations().getVariation1()).isEqualTo(1);
+    assertThat(underTest.toMeasure(builder.setVariation(2, 2d), metric).get().getVariations().getVariation2()).isEqualTo(2);
+    assertThat(underTest.toMeasure(builder.setVariation(3, 3d), metric).get().getVariations().getVariation3()).isEqualTo(3);
+    assertThat(underTest.toMeasure(builder.setVariation(4, 4d), metric).get().getVariations().getVariation4()).isEqualTo(4);
+    assertThat(underTest.toMeasure(builder.setVariation(5, 5d), metric).get().getVariations().getVariation5()).isEqualTo(5);
+  }
+
+  @Test
+  public void toMeasure_creates_MeasureVariation_and_maps_the_right_one() {
+    MeasureDto measureDto = new MeasureDto()
+        .setData("1")
+        .setVariation(2, 2d).setVariation(3, 3d).setVariation(5, 5d);
+
+    Optional<Measure> measure = underTest.toMeasure(measureDto, SOME_STRING_METRIC);
+
+    assertThat(measure.get().getVariations().hasVariation1()).isFalse();
+    assertThat(measure.get().getVariations().getVariation2()).isEqualTo(2);
+    assertThat(measure.get().getVariations().getVariation3()).isEqualTo(3);
+    assertThat(measure.get().getVariations().hasVariation4()).isFalse();
+    assertThat(measure.get().getVariations().getVariation5()).isEqualTo(5);
+  }
 }
diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureVariationsTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureVariationsTest.java
new file mode 100644 (file)
index 0000000..1f3e056
--- /dev/null
@@ -0,0 +1,182 @@
+/*
+ * 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 javax.annotation.Nullable;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Fail.fail;
+
+public class MeasureVariationsTest {
+  public static final String NO_VARIATION_ERROR_MESSAGE = "There must be at least one variation";
+  @Rule
+  public ExpectedException expectedException = ExpectedException.none();
+
+  @Test
+  public void constructor_throws_IAE_if_array_arg_has_more_than_5_elements() {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage("There can not be more than 5 variations");
+
+    new MeasureVariations(1d, 2d, 3d, 4d, 5d, 6d);
+  }
+
+  @Test
+  public void constructor_throws_IAE_if_no_arg() {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage(NO_VARIATION_ERROR_MESSAGE);
+
+    new MeasureVariations();
+  }
+
+  @Test
+  public void constructor_throws_IAE_if_single_arg_is_null() {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage(NO_VARIATION_ERROR_MESSAGE);
+
+    new MeasureVariations((Double) null);
+  }
+
+  @Test
+  public void constructor_throws_IAE_if_two_args_are_null() {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage(NO_VARIATION_ERROR_MESSAGE);
+
+    new MeasureVariations((Double) null, (Double) null);
+  }
+
+  @Test
+  public void constructor_throws_IAE_if_three_args_are_null() {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage(NO_VARIATION_ERROR_MESSAGE);
+
+    new MeasureVariations((Double) null, (Double) null, (Double) null);
+  }
+
+  @Test
+  public void constructor_throws_IAE_if_four_args_are_null() {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage(NO_VARIATION_ERROR_MESSAGE);
+
+    new MeasureVariations((Double) null, (Double) null, (Double) null, (Double) null);
+  }
+
+  @Test
+  public void constructor_throws_IAE_if_five_args_are_null() {
+    expectedException.expect(IllegalArgumentException.class);
+    expectedException.expectMessage(NO_VARIATION_ERROR_MESSAGE);
+
+    new MeasureVariations((Double) null, (Double) null, (Double) null, (Double) null, (Double) null);
+  }
+
+  @Test
+  public void verify_has_variationX_and_getVariationX() {
+    verifyAsVariations(new MeasureVariations(1d), 1d, null, null, null, null);
+
+    verifyAsVariations(new MeasureVariations(1d, 2d), 1d, 2d, null, null, null);
+    verifyAsVariations(new MeasureVariations(null, 2d), null, 2d, null, null, null);
+    verifyAsVariations(new MeasureVariations(1d, null), 1d, null, null, null, null);
+
+    verifyAsVariations(new MeasureVariations(1d, 2d, 3d), 1d, 2d, 3d, null, null);
+    verifyAsVariations(new MeasureVariations(null, 2d, 3d), null, 2d, 3d, null, null);
+    verifyAsVariations(new MeasureVariations(1d, null, 3d), 1d, null, 3d, null, null);
+    verifyAsVariations(new MeasureVariations(null, null, 3d), null, null, 3d, null, null);
+    verifyAsVariations(new MeasureVariations(1d, 2d, null), 1d, 2d, null, null, null);
+
+    verifyAsVariations(new MeasureVariations(1d, 2d, 3d, 4d), 1d, 2d, 3d, 4d, null);
+    verifyAsVariations(new MeasureVariations(null, 2d, 3d, 4d), null, 2d, 3d, 4d, null);
+    verifyAsVariations(new MeasureVariations(null, 2d, null, 4d), null, 2d, null, 4d, null);
+    verifyAsVariations(new MeasureVariations(null, null, 3d, 4d), null, null, 3d, 4d, null);
+    verifyAsVariations(new MeasureVariations(null, null, null, 4d), null, null, null, 4d, null);
+    verifyAsVariations(new MeasureVariations(1d, null, 3d, 4d), 1d, null, 3d, 4d, null);
+    verifyAsVariations(new MeasureVariations(1d, 2d, null, 4d), 1d, 2d, null, 4d, null);
+    verifyAsVariations(new MeasureVariations(1d, 2d, 3d, null), 1d, 2d, 3d, null, null);
+
+    verifyAsVariations(new MeasureVariations(1d, 2d, 3d, 4d, 5d), 1d, 2d, 3d, 4d, 5d);
+    verifyAsVariations(new MeasureVariations(null, 2d, 3d, 4d, 5d), null, 2d, 3d, 4d, 5d);
+    verifyAsVariations(new MeasureVariations(1d, null, 3d, 4d, 5d), 1d, null, 3d, 4d, 5d);
+    verifyAsVariations(new MeasureVariations(1d, 2d, null, 4d, 5d), 1d, 2d, null, 4d, 5d);
+    verifyAsVariations(new MeasureVariations(1d, 2d, 3d, null, 5d), 1d, 2d, 3d, null, 5d);
+    verifyAsVariations(new MeasureVariations(1d, 2d, 3d, 4d, null), 1d, 2d, 3d, 4d, null);
+  }
+
+  private static void verifyAsVariations(MeasureVariations measureVariations,
+    @Nullable Double variation1, @Nullable Double variation2, @Nullable Double variation3, @Nullable Double variation4, @Nullable Double variation5) {
+    assertThat(measureVariations.hasVariation1()).isEqualTo(variation1 != null);
+    try {
+      if (variation1 == null) {
+        measureVariations.getVariation1();
+        fail("An exception should have been raised");
+      }
+      assertThat(measureVariations.getVariation1()).isEqualTo(variation1);
+    } catch (IllegalStateException e) {
+      assertThat(e.getMessage()).isEqualTo("Variation 1 has not been set");
+    }
+    assertThat(measureVariations.hasVariation2()).isEqualTo(variation2 != null);
+    try {
+      if (variation2 == null) {
+        measureVariations.getVariation2();
+        fail("An exception should have been raised");
+      }
+      assertThat(measureVariations.getVariation2()).isEqualTo(variation2);
+    } catch (IllegalStateException e) {
+      assertThat(e.getMessage()).isEqualTo("Variation 2 has not been set");
+    }
+    assertThat(measureVariations.hasVariation3()).isEqualTo(variation3 != null);
+    try {
+      if (variation3 == null) {
+        measureVariations.getVariation3();
+        fail("An exception should have been raised");
+      }
+      assertThat(measureVariations.getVariation3()).isEqualTo(variation3);
+    } catch (IllegalStateException e) {
+      assertThat(e.getMessage()).isEqualTo("Variation 3 has not been set");
+    }
+    assertThat(measureVariations.hasVariation4()).isEqualTo(variation4 != null);
+    try {
+      if (variation4 == null) {
+        measureVariations.getVariation4();
+        fail("An exception should have been raised");
+      }
+      assertThat(measureVariations.getVariation4()).isEqualTo(variation4);
+    } catch (IllegalStateException e) {
+      assertThat(e.getMessage()).isEqualTo("Variation 4 has not been set");
+    }
+    assertThat(measureVariations.hasVariation5()).isEqualTo(variation5 != null);
+    try {
+      if (variation5 == null) {
+        measureVariations.getVariation5();
+        fail("An exception should have been raised");
+      }
+      assertThat(measureVariations.getVariation5()).isEqualTo(variation5);
+    } catch (IllegalStateException e) {
+      assertThat(e.getMessage()).isEqualTo("Variation 5 has not been set");
+    }
+  }
+
+  @Test
+  public void verify_toString() {
+    assertThat(new MeasureVariations(1d).toString()).isEqualTo("MeasureVariations{1=1.0, 2=null, 3=null, 4=null, 5=null}");
+    assertThat(new MeasureVariations(1d, 2d, 3d, 4d, 5d).toString()).isEqualTo("MeasureVariations{1=1.0, 2=2.0, 3=3.0, 4=4.0, 5=5.0}");
+
+  }
+}