From c668cdbe735d1a10ca698e6fed237101eb576c14 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=A9bastien=20Lesaint?= Date: Thu, 11 Jun 2015 10:01:58 +0200 Subject: [PATCH] SONAR-6620 add Variations to Measure in Compute Engine --- .../measure/BatchMeasureToMeasure.java | 21 ++ .../server/computation/measure/Measure.java | 14 +- .../measure/MeasureDtoToMeasure.java | 22 +++ .../computation/measure/MeasureImpl.java | 21 +- .../measure/MeasureVariations.java | 105 ++++++++++ .../measure/BatchMeasureToMeasureTest.java | 48 +++++ .../measure/MeasureDtoToMeasureTest.java | 48 +++++ .../measure/MeasureVariationsTest.java | 182 ++++++++++++++++++ 8 files changed, 457 insertions(+), 4 deletions(-) create mode 100644 server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureVariations.java create mode 100644 server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureVariationsTest.java diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/BatchMeasureToMeasure.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/BatchMeasureToMeasure.java index fb8c6e74169..fd4e01792c1 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/BatchMeasureToMeasure.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/BatchMeasureToMeasure.java @@ -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 + ); + } + } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java index 24685d9f54c..9b17b6aa016 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java @@ -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(); + } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureDtoToMeasure.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureDtoToMeasure.java index 7543916c1de..4d690013ece 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureDtoToMeasure.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureDtoToMeasure.java @@ -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) + ); + } + } diff --git a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureImpl.java b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureImpl.java index b4471e948a3..c5960b19d05 100644 --- a/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureImpl.java +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureImpl.java @@ -19,10 +19,10 @@ */ 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 index 00000000000..bb106c48ec6 --- /dev/null +++ b/server/sonar-server/src/main/java/org/sonar/server/computation/measure/MeasureVariations.java @@ -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(); + } +} diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchMeasureToMeasureTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchMeasureToMeasureTest.java index 71055251a82..a624a2a0fd9 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchMeasureToMeasureTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchMeasureToMeasureTest.java @@ -20,7 +20,11 @@ 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 = 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); + } + } diff --git a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java index ddf953b5bf6..2ca9c841ff9 100644 --- a/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java @@ -20,7 +20,11 @@ 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 = 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 index 00000000000..1f3e056f63e --- /dev/null +++ b/server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureVariationsTest.java @@ -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}"); + + } +} -- 2.39.5