Browse Source

double values of Measures must have only 1 decimal (rounded up)

tags/5.2-RC1
Sébastien Lesaint 9 years ago
parent
commit
01992f79d9

+ 19
- 1
server/sonar-server/src/main/java/org/sonar/server/computation/measure/Measure.java View File

@@ -20,16 +20,24 @@
package org.sonar.server.computation.measure;

import com.google.common.base.Optional;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Locale;
import java.util.Objects;
import javax.annotation.CheckForNull;
import javax.annotation.Nullable;

import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkState;
import static java.util.Objects.requireNonNull;

public final class Measure {

/**
* Default precision when saving a double value type
*/
private static final int DEFAULT_PRECISION = 1;

public enum ValueType {
NO_VALUE, BOOLEAN, INT, LONG, DOUBLE, STRING, LEVEL
}
@@ -86,7 +94,7 @@ public final class Measure {
this.valueType = valueType;
this.ruleId = ruleId;
this.characteristicId = characteristicId;
this.value = value;
this.value = scale(value);
this.data = data;
this.dataLevel = dataLevel;
this.description = description;
@@ -94,6 +102,16 @@ public final class Measure {
this.variations = variations;
}

@CheckForNull
private static Double scale(@Nullable Double value) {
if (value == null) {
return null;
}
checkArgument(!Double.isNaN(value), "Measure value can not be NaN");
BigDecimal bd = BigDecimal.valueOf(value);
return bd.setScale(DEFAULT_PRECISION, RoundingMode.HALF_UP).doubleValue();
}

public static NewMeasureBuilder newMeasureBuilder() {
return new NewMeasureBuilder();
}

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/computation/measure/BatchMeasureToMeasureTest.java View File

@@ -250,7 +250,7 @@ public class BatchMeasureToMeasureTest {

assertThat(measure.isPresent());
assertThat(measure.get().getValueType()).isEqualTo(Measure.ValueType.DOUBLE);
assertThat(measure.get().getDoubleValue()).isEqualTo(10.6395d);
assertThat(measure.get().getDoubleValue()).isEqualTo(10.6d);
assertThat(measure.get().getData()).isEqualTo(SOME_DATA);
assertThat(measure.get().getQualityGateStatus().getStatus()).isEqualTo(Measure.Level.OK);
assertThat(measure.get().getQualityGateStatus().getText()).isEqualTo(SOME_ALERT_TEXT);

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/computation/measure/BestValueOptimizationTest.java View File

@@ -147,7 +147,7 @@ public class BestValueOptimizationTest {

assertThat(underTest.apply(newMeasureBuilder().create(36.5d))).isTrue();
assertThat(underTest.apply(newMeasureBuilder().setVariations(SOME_EMPTY_VARIATIONS).create(36.5d))).isTrue();
assertThat(underTest.apply(newMeasureBuilder().create(36.52d))).isFalse();
assertThat(underTest.apply(newMeasureBuilder().create(36.6d))).isFalse();
}

@Test

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureDtoToMeasureTest.java View File

@@ -241,7 +241,7 @@ public class MeasureDtoToMeasureTest {

assertThat(measure.isPresent());
assertThat(measure.get().getValueType()).isEqualTo(Measure.ValueType.DOUBLE);
assertThat(measure.get().getDoubleValue()).isEqualTo(10.6395d);
assertThat(measure.get().getDoubleValue()).isEqualTo(10.6d);
assertThat(measure.get().getData()).isEqualTo(SOME_DATA);
assertThat(measure.get().getQualityGateStatus().getStatus()).isEqualTo(Level.OK);
assertThat(measure.get().getQualityGateStatus().getText()).isEqualTo(SOME_ALERT_TEXT);

+ 45
- 36
server/sonar-server/src/test/java/org/sonar/server/computation/measure/MeasureTest.java View File

@@ -36,18 +36,19 @@ import org.sonar.server.computation.measure.Measure.ValueType;

import static com.google.common.collect.FluentIterable.from;
import static org.assertj.core.api.Assertions.assertThat;
import static org.sonar.server.computation.measure.Measure.newMeasureBuilder;

@RunWith(DataProviderRunner.class)
public class MeasureTest {

private static final Measure INT_MEASURE = Measure.newMeasureBuilder().create((int) 1);
private static final Measure LONG_MEASURE = Measure.newMeasureBuilder().create(1l);
private static final Measure DOUBLE_MEASURE = Measure.newMeasureBuilder().create(1d);
private static final Measure STRING_MEASURE = Measure.newMeasureBuilder().create("some_sT ring");
private static final Measure TRUE_MEASURE = Measure.newMeasureBuilder().create(true);
private static final Measure FALSE_MEASURE = Measure.newMeasureBuilder().create(false);
private static final Measure LEVEL_MEASURE = Measure.newMeasureBuilder().create(Measure.Level.OK);
private static final Measure NO_VALUE_MEASURE = Measure.newMeasureBuilder().createNoValue();
private static final Measure INT_MEASURE = newMeasureBuilder().create((int) 1);
private static final Measure LONG_MEASURE = newMeasureBuilder().create(1l);
private static final Measure DOUBLE_MEASURE = newMeasureBuilder().create(1d);
private static final Measure STRING_MEASURE = newMeasureBuilder().create("some_sT ring");
private static final Measure TRUE_MEASURE = newMeasureBuilder().create(true);
private static final Measure FALSE_MEASURE = newMeasureBuilder().create(false);
private static final Measure LEVEL_MEASURE = newMeasureBuilder().create(Measure.Level.OK);
private static final Measure NO_VALUE_MEASURE = newMeasureBuilder().createNoValue();

private static final List<Measure> MEASURES = ImmutableList.of(
INT_MEASURE, LONG_MEASURE, DOUBLE_MEASURE, STRING_MEASURE, TRUE_MEASURE, FALSE_MEASURE, NO_VALUE_MEASURE, LEVEL_MEASURE
@@ -109,7 +110,7 @@ public class MeasureTest {
executionException.expect(UnsupportedOperationException.class);
executionException.expectMessage("A measure can not be associated to both a Characteristic and a Rule");

Measure.newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC_ID).forRule(SOME_RULE_ID);
newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC_ID).forRule(SOME_RULE_ID);
}

@Test
@@ -117,34 +118,34 @@ public class MeasureTest {
executionException.expect(UnsupportedOperationException.class);
executionException.expectMessage("A measure can not be associated to both a Characteristic and a Rule");

Measure.newMeasureBuilder().forRule(SOME_RULE_ID).forCharacteristic(SOME_CHARACTERISTIC_ID);
newMeasureBuilder().forRule(SOME_RULE_ID).forCharacteristic(SOME_CHARACTERISTIC_ID);
}

@Test
public void getRuleId_returns_null_when_ruleKey_has_not_been_set() {
assertThat(Measure.newMeasureBuilder().createNoValue().getRuleId()).isNull();
assertThat(Measure.newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC_ID).createNoValue().getRuleId()).isNull();
assertThat(newMeasureBuilder().createNoValue().getRuleId()).isNull();
assertThat(newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC_ID).createNoValue().getRuleId()).isNull();
}

@Test
public void getRuleId_returns_key_set_in_builder() {
assertThat(Measure.newMeasureBuilder().forRule(SOME_RULE_ID).createNoValue().getRuleId()).isEqualTo(SOME_RULE_ID);
assertThat(newMeasureBuilder().forRule(SOME_RULE_ID).createNoValue().getRuleId()).isEqualTo(SOME_RULE_ID);
}

@Test
public void getCharacteristicId_returns_null_when_ruleKey_has_not_been_set() {
assertThat(Measure.newMeasureBuilder().createNoValue().getCharacteristicId()).isNull();
assertThat(Measure.newMeasureBuilder().forRule(SOME_RULE_ID).createNoValue().getCharacteristicId()).isNull();
assertThat(newMeasureBuilder().createNoValue().getCharacteristicId()).isNull();
assertThat(newMeasureBuilder().forRule(SOME_RULE_ID).createNoValue().getCharacteristicId()).isNull();
}

@Test
public void getCharacteristicId_returns_id_set_in_builder() {
assertThat(Measure.newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC_ID).createNoValue().getCharacteristicId()).isEqualTo(SOME_CHARACTERISTIC_ID);
assertThat(newMeasureBuilder().forCharacteristic(SOME_CHARACTERISTIC_ID).createNoValue().getCharacteristicId()).isEqualTo(SOME_CHARACTERISTIC_ID);
}

@Test(expected = NullPointerException.class)
public void create_from_String_throws_NPE_if_arg_is_null() {
Measure.newMeasureBuilder().create((String) null);
newMeasureBuilder().create((String) null);
}

@Test
@@ -262,52 +263,52 @@ public class MeasureTest {
public void getAlertStatus_returns_argument_from_setQualityGateStatus() {
QualityGateStatus someStatus = new QualityGateStatus(Measure.Level.OK);

assertThat(Measure.newMeasureBuilder().setQualityGateStatus(someStatus).create(true, null).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(Measure.newMeasureBuilder().setQualityGateStatus(someStatus).create(false, null).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(Measure.newMeasureBuilder().setQualityGateStatus(someStatus).create((int) 1, null).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(Measure.newMeasureBuilder().setQualityGateStatus(someStatus).create((long) 1, null).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(Measure.newMeasureBuilder().setQualityGateStatus(someStatus).create((double) 1, null).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(Measure.newMeasureBuilder().setQualityGateStatus(someStatus).create("str").getQualityGateStatus()).isEqualTo(someStatus);
assertThat(Measure.newMeasureBuilder().setQualityGateStatus(someStatus).create(Measure.Level.OK).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(newMeasureBuilder().setQualityGateStatus(someStatus).create(true, null).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(newMeasureBuilder().setQualityGateStatus(someStatus).create(false, null).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(newMeasureBuilder().setQualityGateStatus(someStatus).create((int) 1, null).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(newMeasureBuilder().setQualityGateStatus(someStatus).create((long) 1, null).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(newMeasureBuilder().setQualityGateStatus(someStatus).create((double) 1, null).getQualityGateStatus()).isEqualTo(someStatus);
assertThat(newMeasureBuilder().setQualityGateStatus(someStatus).create("str").getQualityGateStatus()).isEqualTo(someStatus);
assertThat(newMeasureBuilder().setQualityGateStatus(someStatus).create(Measure.Level.OK).getQualityGateStatus()).isEqualTo(someStatus);
}

@Test(expected = NullPointerException.class)
public void newMeasureBuilder_setQualityGateStatus_throws_NPE_if_arg_is_null() {
Measure.newMeasureBuilder().setQualityGateStatus(null);
newMeasureBuilder().setQualityGateStatus(null);
}

@Test(expected = NullPointerException.class)
public void newMeasureBuilder_setVariations_throws_NPE_if_arg_is_null() {
Measure.newMeasureBuilder().setVariations(null);
newMeasureBuilder().setVariations(null);
}

@Test(expected = NullPointerException.class)
public void newMeasureBuilder_setDescription_throws_NPE_if_arg_is_null() {
Measure.newMeasureBuilder().setDescription(null);
newMeasureBuilder().setDescription(null);
}

@Test(expected = NullPointerException.class)
public void updateMeasureBuilder_setQualityGateStatus_throws_NPE_if_arg_is_null() {
Measure.updatedMeasureBuilder(Measure.newMeasureBuilder().createNoValue()).setQualityGateStatus(null);
Measure.updatedMeasureBuilder(newMeasureBuilder().createNoValue()).setQualityGateStatus(null);
}

@Test(expected = NullPointerException.class)
public void updateMeasureBuilder_setVariations_throws_NPE_if_arg_is_null() {
Measure.updatedMeasureBuilder(Measure.newMeasureBuilder().createNoValue()).setVariations(null);
Measure.updatedMeasureBuilder(newMeasureBuilder().createNoValue()).setVariations(null);
}

@Test(expected = UnsupportedOperationException.class)
public void updateMeasureBuilder_setQualityGateStatus_throws_USO_if_measure_already_has_a_QualityGateStatus() {
QualityGateStatus qualityGateStatus = new QualityGateStatus(Measure.Level.ERROR);

Measure.updatedMeasureBuilder(Measure.newMeasureBuilder().setQualityGateStatus(qualityGateStatus).createNoValue()).setQualityGateStatus(qualityGateStatus);
Measure.updatedMeasureBuilder(newMeasureBuilder().setQualityGateStatus(qualityGateStatus).createNoValue()).setQualityGateStatus(qualityGateStatus);
}

@Test(expected = UnsupportedOperationException.class)
public void updateMeasureBuilder_setVariations_throws_USO_if_measure_already_has_Variations() {
MeasureVariations variations = new MeasureVariations(1d);

Measure.updatedMeasureBuilder(Measure.newMeasureBuilder().setVariations(variations).createNoValue()).setVariations(variations);
Measure.updatedMeasureBuilder(newMeasureBuilder().setVariations(variations).createNoValue()).setVariations(variations);
}

@Test
@@ -327,11 +328,11 @@ public class MeasureTest {
public void getData_returns_argument_from_factory_method() {
String someData = "lololool";

assertThat(Measure.newMeasureBuilder().create(true, someData).getData()).isEqualTo(someData);
assertThat(Measure.newMeasureBuilder().create(false, someData).getData()).isEqualTo(someData);
assertThat(Measure.newMeasureBuilder().create((int) 1, someData).getData()).isEqualTo(someData);
assertThat(Measure.newMeasureBuilder().create((long) 1, someData).getData()).isEqualTo(someData);
assertThat(Measure.newMeasureBuilder().create((double) 1, someData).getData()).isEqualTo(someData);
assertThat(newMeasureBuilder().create(true, someData).getData()).isEqualTo(someData);
assertThat(newMeasureBuilder().create(false, someData).getData()).isEqualTo(someData);
assertThat(newMeasureBuilder().create((int) 1, someData).getData()).isEqualTo(someData);
assertThat(newMeasureBuilder().create((long) 1, someData).getData()).isEqualTo(someData);
assertThat(newMeasureBuilder().create((double) 1, someData).getData()).isEqualTo(someData);
}

@Test
@@ -339,6 +340,14 @@ public class MeasureTest {
assertThat(LEVEL_MEASURE.getData()).isNull();
}

@Test
public void double_values_are_scaled_to_1_digit_and_round() {
assertThat(newMeasureBuilder().create(30.27777d).getDoubleValue()).isEqualTo(30.3d);
assertThat(newMeasureBuilder().create(30d).getDoubleValue()).isEqualTo(30d);
assertThat(newMeasureBuilder().create(30.01d).getDoubleValue()).isEqualTo(30d);
assertThat(newMeasureBuilder().create(30.1d).getDoubleValue()).isEqualTo(30.1d);
}

private enum WrapInArray implements Function<Measure, Measure[]> {
INSTANCE;


+ 1
- 2
server/sonar-server/src/test/java/org/sonar/server/computation/step/CustomMeasuresCopyStepTest.java View File

@@ -19,7 +19,6 @@
*/
package org.sonar.server.computation.step;

import org.assertj.core.data.Offset;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Rule;
@@ -93,7 +92,7 @@ public class CustomMeasuresCopyStepTest {
ArgumentCaptor<Measure> measureCaptor = ArgumentCaptor.forClass(Measure.class);
verify(measureRepository).add(eq(file1), eq(floatMetric), measureCaptor.capture());
Measure fileMeasure = measureCaptor.getValue();
assertThat(fileMeasure.getDoubleValue()).isEqualTo(3.14, Offset.offset(0.001));
assertThat(fileMeasure.getDoubleValue()).isEqualTo(3.1d);

verify(measureRepository).add(eq(project), eq(stringMetric), measureCaptor.capture());
Measure projectMeasure = measureCaptor.getValue();

+ 1
- 1
server/sonar-server/src/test/java/org/sonar/server/computation/step/PersistMeasuresStepTest.java View File

@@ -188,7 +188,7 @@ public class PersistMeasuresStepTest extends BaseStepTest {
assertThat(dto.get("metricId")).isEqualTo(doubleMetric.getId().longValue());
assertThat(dto.get("ruleId")).isEqualTo(rule.getId().longValue());
assertThat(dto.get("characteristicId")).isNull();
assertThat(dto.get("value")).isEqualTo(123.123d);
assertThat(dto.get("value")).isEqualTo(123.1d);
assertThat(dto.get("severity")).isNull();
}


Loading…
Cancel
Save