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
+ );
+ }
+
}
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
-import static java.util.Objects.requireNonNull;
-
public interface Measure {
enum ValueType {
*/
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();
+
}
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)
+ );
+ }
+
}
*/
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 {
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;
@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;
+ }
}
--- /dev/null
+/*
+ * 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();
+ }
+}
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;
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);
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);
+ }
+
}
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;
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);
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);
+ }
}
--- /dev/null
+/*
+ * 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}");
+
+ }
+}