also rename context to be more specific add Component to the API make it more versatiletags/5.2-RC1
@@ -24,7 +24,6 @@ import com.google.common.base.Optional; | |||
import java.util.Objects; | |||
import javax.annotation.CheckForNull; | |||
import javax.annotation.Nullable; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.measure.Measure; | |||
public class AverageFormula implements Formula<AverageFormula.AverageCounter> { | |||
@@ -49,7 +48,7 @@ public class AverageFormula implements Formula<AverageFormula.AverageCounter> { | |||
} | |||
@Override | |||
public Optional<Measure> createMeasure(AverageCounter counter, Component.Type componentType) { | |||
public Optional<Measure> createMeasure(AverageCounter counter, CreateMeasureContext context) { | |||
Optional<Double> mainValueOptional = counter.getMainValue(); | |||
Optional<Double> byValueOptional = counter.getByValue(); | |||
if (mainValueOptional.isPresent() && byValueOptional.isPresent()) { | |||
@@ -123,12 +122,12 @@ public class AverageFormula implements Formula<AverageFormula.AverageCounter> { | |||
} | |||
@Override | |||
public void aggregate(CounterContext counterContext) { | |||
Optional<Double> mainValueOptional = getDoubleValue(counterContext.getMeasure(mainMetric)); | |||
public void aggregate(FileAggregateContext context) { | |||
Optional<Double> mainValueOptional = getDoubleValue(context.getMeasure(mainMetric)); | |||
if (!mainValueOptional.isPresent() && fallbackMetric != null) { | |||
mainValueOptional = getDoubleValue(counterContext.getMeasure(fallbackMetric)); | |||
mainValueOptional = getDoubleValue(context.getMeasure(fallbackMetric)); | |||
} | |||
Optional<Double> byValueOptional = getDoubleValue(counterContext.getMeasure(byMetric)); | |||
Optional<Double> byValueOptional = getDoubleValue(context.getMeasure(byMetric)); | |||
addValuesIfPresent(mainValueOptional, byValueOptional); | |||
} | |||
@@ -35,6 +35,6 @@ public interface Counter<T extends Counter<T>> { | |||
/** | |||
* This method is called on {@link Type#FILE} levels, in order to populate the counter with one or more {@link Type#FILE} measures. | |||
*/ | |||
void aggregate(CounterContext counterContext); | |||
void aggregate(FileAggregateContext context); | |||
} |
@@ -0,0 +1,39 @@ | |||
/* | |||
* 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.formula; | |||
import java.util.List; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.period.Period; | |||
/** | |||
* Context passing information to implementation of {@link Formula#createMeasure(Counter, CreateMeasureContext)} method. | |||
*/ | |||
public interface CreateMeasureContext { | |||
/** | |||
* The component for which the measure is to be created. | |||
*/ | |||
Component getComponent(); | |||
/** | |||
* The periods for which variations of the measure can be created. | |||
*/ | |||
List<Period> getPeriods(); | |||
} |
@@ -39,7 +39,8 @@ public class DistributionFormula implements Formula<DistributionFormula.Distribu | |||
} | |||
@Override | |||
public Optional<Measure> createMeasure(DistributionCounter counter, Component.Type componentType) { | |||
public Optional<Measure> createMeasure(DistributionCounter counter, CreateMeasureContext context) { | |||
Component.Type componentType = context.getComponent().getType(); | |||
Optional<String> value = counter.getValue(); | |||
if (value.isPresent() && componentType.isHigherThan(Component.Type.FILE)) { | |||
return Optional.of(Measure.newMeasureBuilder().create(value.get())); | |||
@@ -67,8 +68,8 @@ public class DistributionFormula implements Formula<DistributionFormula.Distribu | |||
} | |||
@Override | |||
public void aggregate(CounterContext counterContext) { | |||
Optional<Measure> measureOptional = counterContext.getMeasure(metricKey); | |||
public void aggregate(FileAggregateContext context) { | |||
Optional<Measure> measureOptional = context.getMeasure(metricKey); | |||
String data = measureOptional.isPresent() ? measureOptional.get().getData() : null; | |||
if (data != null) { | |||
initialized = true; |
@@ -22,15 +22,27 @@ package org.sonar.server.computation.formula; | |||
import com.google.common.base.Optional; | |||
import java.util.List; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.measure.Measure; | |||
import org.sonar.server.computation.period.Period; | |||
public interface CounterContext { | |||
/** | |||
* The context passing information to {@link Counter#aggregate(FileAggregateContext)}. | |||
*/ | |||
public interface FileAggregateContext { | |||
/** | |||
* The Component representing the currently processed File. | |||
*/ | |||
Component getFile(); | |||
/** | |||
* Retrieve the measure for the current File with the metric key if it exists. | |||
*/ | |||
Optional<Measure> getMeasure(String metricKey); | |||
/** | |||
* Lists of Periods defined for the current project. They can be used to aggregate values of MeasureVariations. | |||
* Lists of Periods defined for the current project. They can be used to retrieve variations Measure. | |||
*/ | |||
List<Period> getPeriods(); | |||
@@ -21,7 +21,6 @@ | |||
package org.sonar.server.computation.formula; | |||
import com.google.common.base.Optional; | |||
import org.sonar.server.computation.component.Component.Type; | |||
import org.sonar.server.computation.measure.Measure; | |||
/** | |||
@@ -29,15 +28,18 @@ import org.sonar.server.computation.measure.Measure; | |||
*/ | |||
public interface Formula<COUNTER extends Counter> { | |||
/** | |||
* Method responsible for creating an new instance of a the counter used by this formula. | |||
*/ | |||
COUNTER createNewCounter(); | |||
/** | |||
* This method is used to create a measure on each node, using the value of the counter | |||
* If {@link Optional#absent()} is returned, no measure will be created | |||
* | |||
* @param componentType can be used for instance to not create a measure on {@link Type#FILE} | |||
* @param context the context for which the measure must be created | |||
*/ | |||
Optional<Measure> createMeasure(COUNTER counter, Type componentType); | |||
Optional<Measure> createMeasure(COUNTER counter, CreateMeasureContext context); | |||
/** | |||
* The metric associated to the measure |
@@ -128,7 +128,7 @@ public class FormulaExecutorComponentVisitor extends PathAwareVisitor<FormulaExe | |||
} | |||
private void processFile(Component file, Path<FormulaExecutorComponentVisitor.Counters> path) { | |||
CounterContext counterContext = new CounterContextImpl(file); | |||
FileAggregateContext counterContext = new FileAggregateContextImpl(file); | |||
for (Formula formula : formulas) { | |||
Counter counter = formula.createNewCounter(); | |||
counter.aggregate(counterContext); | |||
@@ -139,7 +139,7 @@ public class FormulaExecutorComponentVisitor extends PathAwareVisitor<FormulaExe | |||
private void addNewMeasure(Component component, Formula formula, Counter counter) { | |||
Metric metric = metricRepository.getByKey(formula.getOutputMetricKey()); | |||
Optional<Measure> measure = formula.createMeasure(counter, component.getType()); | |||
Optional<Measure> measure = formula.createMeasure(counter, new CreateMeasureContextImpl(component)); | |||
if (measure.isPresent()) { | |||
measureRepository.add(component, metric, measure.get()); | |||
} | |||
@@ -151,13 +151,18 @@ public class FormulaExecutorComponentVisitor extends PathAwareVisitor<FormulaExe | |||
} | |||
} | |||
private class CounterContextImpl implements CounterContext { | |||
private class FileAggregateContextImpl implements FileAggregateContext { | |||
private final Component file; | |||
public CounterContextImpl(Component file) { | |||
public FileAggregateContextImpl(Component file) { | |||
this.file = file; | |||
} | |||
@Override | |||
public Component getFile() { | |||
return file; | |||
} | |||
@Override | |||
public Optional<Measure> getMeasure(String metricKey) { | |||
return measureRepository.getRawMeasure(file, metricRepository.getByKey(metricKey)); | |||
@@ -189,4 +194,22 @@ public class FormulaExecutorComponentVisitor extends PathAwareVisitor<FormulaExe | |||
return countersByFormula.get(metricKey); | |||
} | |||
} | |||
private class CreateMeasureContextImpl implements CreateMeasureContext { | |||
private final Component component; | |||
public CreateMeasureContextImpl(Component component) { | |||
this.component = component; | |||
} | |||
@Override | |||
public Component getComponent() { | |||
return component; | |||
} | |||
@Override | |||
public List<Period> getPeriods() { | |||
return periodsHolder.getPeriods(); | |||
} | |||
} | |||
} |
@@ -39,9 +39,9 @@ public class SumFormula implements Formula<SumFormula.SumCounter> { | |||
} | |||
@Override | |||
public Optional<Measure> createMeasure(SumCounter counter, Component.Type componentType) { | |||
public Optional<Measure> createMeasure(SumCounter counter, CreateMeasureContext context) { | |||
Optional<Integer> valueOptional = counter.getValue(); | |||
if (valueOptional.isPresent() && componentType.isHigherThan(Component.Type.FILE)) { | |||
if (valueOptional.isPresent() && context.getComponent().getType().isHigherThan(Component.Type.FILE)) { | |||
return Optional.of(Measure.newMeasureBuilder().create(valueOptional.get())); | |||
} | |||
return Optional.absent(); | |||
@@ -66,8 +66,8 @@ public class SumFormula implements Formula<SumFormula.SumCounter> { | |||
} | |||
@Override | |||
public void aggregate(CounterContext counterContext) { | |||
Optional<Measure> measureOptional = counterContext.getMeasure(metricKey); | |||
public void aggregate(FileAggregateContext context) { | |||
Optional<Measure> measureOptional = context.getMeasure(metricKey); | |||
if (measureOptional.isPresent()) { | |||
addValue(measureOptional.get().getIntValue()); | |||
} |
@@ -27,7 +27,9 @@ import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.sonar.api.measures.CoreMetrics; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.component.DumbComponent; | |||
import org.sonar.server.computation.measure.Measure; | |||
import org.sonar.server.computation.period.PeriodsHolder; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Matchers.anyString; | |||
@@ -47,7 +49,9 @@ public class AverageFormulaTest { | |||
.setByMetricKey(FUNCTIONS_KEY) | |||
.build(); | |||
CounterContext counterContext = mock(CounterContext.class); | |||
FileAggregateContext fileAggregateContext = mock(FileAggregateContext.class); | |||
CreateMeasureContext createMeasureContext = new DumbCreateMeasureContext( | |||
DumbComponent.builder(Component.Type.PROJECT, 1).build(), mock(PeriodsHolder.class)); | |||
@Rule | |||
public ExpectedException thrown = ExpectedException.none(); | |||
@@ -103,9 +107,9 @@ public class AverageFormulaTest { | |||
AverageFormula.AverageCounter counter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
addMeasure(COMPLEXITY_IN_FUNCTIONS_KEY, 10d); | |||
addMeasure(FUNCTIONS_KEY, 2d); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, Component.Type.PROJECT).get().getDoubleValue()).isEqualTo(5d); | |||
assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, createMeasureContext).get().getDoubleValue()).isEqualTo(5d); | |||
} | |||
@Test | |||
@@ -113,12 +117,12 @@ public class AverageFormulaTest { | |||
AverageFormula.AverageCounter anotherCounter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
addMeasure(COMPLEXITY_IN_FUNCTIONS_KEY, 10d); | |||
addMeasure(FUNCTIONS_KEY, 2d); | |||
anotherCounter.aggregate(counterContext); | |||
anotherCounter.aggregate(fileAggregateContext); | |||
AverageFormula.AverageCounter counter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
counter.aggregate(anotherCounter); | |||
assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, Component.Type.PROJECT).get().getDoubleValue()).isEqualTo(5d); | |||
assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, createMeasureContext).get().getDoubleValue()).isEqualTo(5d); | |||
} | |||
@Test | |||
@@ -126,9 +130,9 @@ public class AverageFormulaTest { | |||
AverageFormula.AverageCounter counter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
addMeasure(COMPLEXITY_IN_FUNCTIONS_KEY, 10d); | |||
addMeasure(FUNCTIONS_KEY, 2d); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, Component.Type.PROJECT).get().getDoubleValue()).isEqualTo(5d); | |||
assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, createMeasureContext).get().getDoubleValue()).isEqualTo(5d); | |||
} | |||
@Test | |||
@@ -136,9 +140,9 @@ public class AverageFormulaTest { | |||
AverageFormula.AverageCounter counter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
addMeasure(COMPLEXITY_IN_FUNCTIONS_KEY, 10); | |||
addMeasure(FUNCTIONS_KEY, 2); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, Component.Type.PROJECT).get().getDoubleValue()).isEqualTo(5); | |||
assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, createMeasureContext).get().getDoubleValue()).isEqualTo(5); | |||
} | |||
@Test | |||
@@ -146,19 +150,19 @@ public class AverageFormulaTest { | |||
AverageFormula.AverageCounter counter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
addMeasure(COMPLEXITY_IN_FUNCTIONS_KEY, 10L); | |||
addMeasure(FUNCTIONS_KEY, 2L); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, Component.Type.PROJECT).get().getDoubleValue()).isEqualTo(5L); | |||
assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, createMeasureContext).get().getDoubleValue()).isEqualTo(5L); | |||
} | |||
@Test | |||
public void not_create_measure_when_aggregated_measure_has_no_value() { | |||
AverageFormula.AverageCounter counter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
addMeasure(COMPLEXITY_IN_FUNCTIONS_KEY, 10L); | |||
when(counterContext.getMeasure(FUNCTIONS_KEY)).thenReturn(Optional.of(Measure.newMeasureBuilder().createNoValue())); | |||
counter.aggregate(counterContext); | |||
when(fileAggregateContext.getMeasure(FUNCTIONS_KEY)).thenReturn(Optional.of(Measure.newMeasureBuilder().createNoValue())); | |||
counter.aggregate(fileAggregateContext); | |||
Assertions.assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, Component.Type.PROJECT)).isAbsent(); | |||
Assertions.assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, createMeasureContext)).isAbsent(); | |||
} | |||
@Test | |||
@@ -168,29 +172,29 @@ public class AverageFormulaTest { | |||
AverageFormula.AverageCounter counter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
addMeasure(COMPLEXITY_IN_FUNCTIONS_KEY, 10L); | |||
when(counterContext.getMeasure(FUNCTIONS_KEY)).thenReturn(Optional.of(Measure.newMeasureBuilder().create("data"))); | |||
counter.aggregate(counterContext); | |||
when(fileAggregateContext.getMeasure(FUNCTIONS_KEY)).thenReturn(Optional.of(Measure.newMeasureBuilder().create("data"))); | |||
counter.aggregate(fileAggregateContext); | |||
BASIC_AVERAGE_FORMULA.createMeasure(counter, Component.Type.PROJECT); | |||
BASIC_AVERAGE_FORMULA.createMeasure(counter, createMeasureContext); | |||
} | |||
@Test | |||
public void no_measure_created_when_counter_has_no_value() { | |||
AverageFormula.AverageCounter counter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
when(counterContext.getMeasure(anyString())).thenReturn(Optional.<Measure>absent()); | |||
counter.aggregate(counterContext); | |||
when(fileAggregateContext.getMeasure(anyString())).thenReturn(Optional.<Measure>absent()); | |||
counter.aggregate(fileAggregateContext); | |||
Assertions.assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, Component.Type.PROJECT)).isAbsent(); | |||
Assertions.assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, createMeasureContext)).isAbsent(); | |||
} | |||
@Test | |||
public void not_create_measure_when_only_one_measure() { | |||
AverageFormula.AverageCounter counter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
addMeasure(COMPLEXITY_IN_FUNCTIONS_KEY, 10L); | |||
when(counterContext.getMeasure(FUNCTIONS_KEY)).thenReturn(Optional.<Measure>absent()); | |||
counter.aggregate(counterContext); | |||
when(fileAggregateContext.getMeasure(FUNCTIONS_KEY)).thenReturn(Optional.<Measure>absent()); | |||
counter.aggregate(fileAggregateContext); | |||
Assertions.assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, Component.Type.PROJECT)).isAbsent(); | |||
Assertions.assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, createMeasureContext)).isAbsent(); | |||
} | |||
@Test | |||
@@ -198,9 +202,9 @@ public class AverageFormulaTest { | |||
AverageFormula.AverageCounter counter = BASIC_AVERAGE_FORMULA.createNewCounter(); | |||
addMeasure(COMPLEXITY_IN_FUNCTIONS_KEY, 10d); | |||
addMeasure(FUNCTIONS_KEY, 0d); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
Assertions.assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, Component.Type.PROJECT)).isAbsent(); | |||
Assertions.assertThat(BASIC_AVERAGE_FORMULA.createMeasure(counter, createMeasureContext)).isAbsent(); | |||
} | |||
@Test | |||
@@ -213,12 +217,12 @@ public class AverageFormulaTest { | |||
.build(); | |||
AverageFormula.AverageCounter counter = sut.createNewCounter(); | |||
when(counterContext.getMeasure(COMPLEXITY_IN_FUNCTIONS_KEY)).thenReturn(Optional.<Measure>absent()); | |||
when(fileAggregateContext.getMeasure(COMPLEXITY_IN_FUNCTIONS_KEY)).thenReturn(Optional.<Measure>absent()); | |||
addMeasure(COMPLEXITY_KEY, 10d); | |||
addMeasure(FUNCTIONS_KEY, 2d); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
assertThat(sut.createMeasure(counter, Component.Type.PROJECT).get().getDoubleValue()).isEqualTo(5d); | |||
assertThat(sut.createMeasure(counter, createMeasureContext).get().getDoubleValue()).isEqualTo(5d); | |||
} | |||
@Test | |||
@@ -234,21 +238,21 @@ public class AverageFormulaTest { | |||
addMeasure(COMPLEXITY_IN_FUNCTIONS_KEY, 10d); | |||
addMeasure(COMPLEXITY_KEY, 12d); | |||
addMeasure(FUNCTIONS_KEY, 2d); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
assertThat(sut.createMeasure(counter, Component.Type.PROJECT).get().getDoubleValue()).isEqualTo(5d); | |||
assertThat(sut.createMeasure(counter, createMeasureContext).get().getDoubleValue()).isEqualTo(5d); | |||
} | |||
private void addMeasure(String metricKey, double value) { | |||
when(counterContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value))); | |||
when(fileAggregateContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value))); | |||
} | |||
private void addMeasure(String metricKey, int value) { | |||
when(counterContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value))); | |||
when(fileAggregateContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value))); | |||
} | |||
private void addMeasure(String metricKey, long value) { | |||
when(counterContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value))); | |||
when(fileAggregateContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value))); | |||
} | |||
} |
@@ -26,7 +26,9 @@ import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.component.DumbComponent; | |||
import org.sonar.server.computation.measure.Measure; | |||
import org.sonar.server.computation.period.PeriodsHolder; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Mockito.mock; | |||
@@ -40,7 +42,11 @@ public class DistributionFormulaTest { | |||
@Rule | |||
public ExpectedException thrown = ExpectedException.none(); | |||
CounterContext counterContext = mock(CounterContext.class); | |||
FileAggregateContext fileAggregateContext = mock(FileAggregateContext.class); | |||
CreateMeasureContext projectCreateMeasureContext = new DumbCreateMeasureContext( | |||
DumbComponent.builder(Component.Type.PROJECT, 1).build(), mock(PeriodsHolder.class)); | |||
CreateMeasureContext fileCreateMeasureContext = new DumbCreateMeasureContext( | |||
DumbComponent.builder(Component.Type.FILE, 1).build(), mock(PeriodsHolder.class)); | |||
@Test | |||
public void check_new_counter_class() { | |||
@@ -64,43 +70,43 @@ public class DistributionFormulaTest { | |||
public void create_measure() { | |||
DistributionFormula.DistributionCounter counter = BASIC_DISTRIBUTION_FORMULA.createNewCounter(); | |||
addMeasure(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY, "0=3;3=7;6=10"); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
assertThat(BASIC_DISTRIBUTION_FORMULA.createMeasure(counter, Component.Type.PROJECT).get().getData()).isEqualTo("0=3;3=7;6=10"); | |||
assertThat(BASIC_DISTRIBUTION_FORMULA.createMeasure(counter, projectCreateMeasureContext).get().getData()).isEqualTo("0=3;3=7;6=10"); | |||
} | |||
@Test | |||
public void create_measure_when_counter_is_aggregating_from_another_counter() { | |||
DistributionFormula.DistributionCounter anotherCounter = BASIC_DISTRIBUTION_FORMULA.createNewCounter(); | |||
addMeasure(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY, "0=3;3=7;6=10"); | |||
anotherCounter.aggregate(counterContext); | |||
anotherCounter.aggregate(fileAggregateContext); | |||
DistributionFormula.DistributionCounter counter = BASIC_DISTRIBUTION_FORMULA.createNewCounter(); | |||
counter.aggregate(anotherCounter); | |||
assertThat(BASIC_DISTRIBUTION_FORMULA.createMeasure(counter, Component.Type.PROJECT).get().getData()).isEqualTo("0=3;3=7;6=10"); | |||
assertThat(BASIC_DISTRIBUTION_FORMULA.createMeasure(counter, projectCreateMeasureContext).get().getData()).isEqualTo("0=3;3=7;6=10"); | |||
} | |||
@Test | |||
public void create_no_measure_when_no_value() { | |||
DistributionFormula.DistributionCounter counter = BASIC_DISTRIBUTION_FORMULA.createNewCounter(); | |||
when(counterContext.getMeasure(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY)).thenReturn(Optional.<Measure>absent()); | |||
counter.aggregate(counterContext); | |||
when(fileAggregateContext.getMeasure(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY)).thenReturn(Optional.<Measure>absent()); | |||
counter.aggregate(fileAggregateContext); | |||
Assertions.assertThat(BASIC_DISTRIBUTION_FORMULA.createMeasure(counter, Component.Type.PROJECT)).isAbsent(); | |||
Assertions.assertThat(BASIC_DISTRIBUTION_FORMULA.createMeasure(counter, projectCreateMeasureContext)).isAbsent(); | |||
} | |||
@Test | |||
public void not_create_measure_when_on_file() { | |||
DistributionFormula.DistributionCounter counter = BASIC_DISTRIBUTION_FORMULA.createNewCounter(); | |||
addMeasure(FUNCTION_COMPLEXITY_DISTRIBUTION_KEY, "0=3;3=7;6=10"); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
Assertions.assertThat(BASIC_DISTRIBUTION_FORMULA.createMeasure(counter, Component.Type.FILE)).isAbsent(); | |||
Assertions.assertThat(BASIC_DISTRIBUTION_FORMULA.createMeasure(counter, fileCreateMeasureContext)).isAbsent(); | |||
} | |||
private void addMeasure(String metricKey, String value) { | |||
when(counterContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value))); | |||
when(fileAggregateContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value))); | |||
} | |||
} |
@@ -0,0 +1,45 @@ | |||
/* | |||
* 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.formula; | |||
import java.util.List; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.period.Period; | |||
import org.sonar.server.computation.period.PeriodsHolder; | |||
public class DumbCreateMeasureContext implements CreateMeasureContext { | |||
private final Component component; | |||
private final PeriodsHolder periodsHolder; | |||
public DumbCreateMeasureContext(Component component, PeriodsHolder periodsHolder) { | |||
this.component = component; | |||
this.periodsHolder = periodsHolder; | |||
} | |||
@Override | |||
public Component getComponent() { | |||
return component; | |||
} | |||
@Override | |||
public List<Period> getPeriods() { | |||
return periodsHolder.getPeriods(); | |||
} | |||
} |
@@ -179,7 +179,7 @@ public class FormulaExecutorComponentVisitorTest { | |||
} | |||
@Override | |||
public Optional<Measure> createMeasure(FakeCounter counter, Component.Type componentType) { | |||
public Optional<Measure> createMeasure(FakeCounter counter, CreateMeasureContext context) { | |||
if (counter.value <= 0) { | |||
return Optional.absent(); | |||
} | |||
@@ -201,8 +201,8 @@ public class FormulaExecutorComponentVisitorTest { | |||
} | |||
@Override | |||
public void aggregate(CounterContext counterContext) { | |||
Optional<Measure> measureOptional = counterContext.getMeasure(LINES_KEY); | |||
public void aggregate(FileAggregateContext context) { | |||
Optional<Measure> measureOptional = context.getMeasure(LINES_KEY); | |||
if (measureOptional.isPresent()) { | |||
value += measureOptional.get().getIntValue(); | |||
} | |||
@@ -217,7 +217,7 @@ public class FormulaExecutorComponentVisitorTest { | |||
} | |||
@Override | |||
public Optional<Measure> createMeasure(FakeVariationCounter counter, Component.Type componentType) { | |||
public Optional<Measure> createMeasure(FakeVariationCounter counter, CreateMeasureContext context) { | |||
Optional<MeasureVariations> measureVariations = counter.values.toMeasureVariations(); | |||
if (measureVariations.isPresent()) { | |||
return Optional.of( | |||
@@ -244,12 +244,12 @@ public class FormulaExecutorComponentVisitorTest { | |||
} | |||
@Override | |||
public void aggregate(CounterContext counterContext) { | |||
Optional<Measure> measureOptional = counterContext.getMeasure(NEW_LINES_TO_COVER_KEY); | |||
public void aggregate(FileAggregateContext context) { | |||
Optional<Measure> measureOptional = context.getMeasure(NEW_LINES_TO_COVER_KEY); | |||
if (!measureOptional.isPresent()) { | |||
return; | |||
} | |||
for (Period period : counterContext.getPeriods()) { | |||
for (Period period : context.getPeriods()) { | |||
this.values.increment( | |||
period, | |||
(int) measureOptional.get().getVariations().getVariation(period.getIndex())); |
@@ -26,7 +26,9 @@ import org.junit.Rule; | |||
import org.junit.Test; | |||
import org.junit.rules.ExpectedException; | |||
import org.sonar.server.computation.component.Component; | |||
import org.sonar.server.computation.component.DumbComponent; | |||
import org.sonar.server.computation.measure.Measure; | |||
import org.sonar.server.computation.period.PeriodsHolder; | |||
import static org.assertj.core.api.Assertions.assertThat; | |||
import static org.mockito.Mockito.mock; | |||
@@ -40,7 +42,11 @@ public class SumFormulaTest { | |||
@Rule | |||
public ExpectedException thrown = ExpectedException.none(); | |||
CounterContext counterContext = mock(CounterContext.class); | |||
FileAggregateContext fileAggregateContext = mock(FileAggregateContext.class); | |||
CreateMeasureContext projectCreateMeasureContext = new DumbCreateMeasureContext( | |||
DumbComponent.builder(Component.Type.PROJECT, 1).build(), mock(PeriodsHolder.class)); | |||
CreateMeasureContext fileCreateMeasureContext = new DumbCreateMeasureContext( | |||
DumbComponent.builder(Component.Type.FILE, 2).build(), mock(PeriodsHolder.class)); | |||
@Test | |||
public void check_create_new_counter_class() { | |||
@@ -64,43 +70,43 @@ public class SumFormulaTest { | |||
public void create_measure() { | |||
SumFormula.SumCounter counter = BASIC_SUM_FORMULA.createNewCounter(); | |||
addMeasure(LINES_KEY, 10); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
assertThat(BASIC_SUM_FORMULA.createMeasure(counter, Component.Type.PROJECT).get().getIntValue()).isEqualTo(10); | |||
assertThat(BASIC_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext).get().getIntValue()).isEqualTo(10); | |||
} | |||
@Test | |||
public void create_measure_when_counter_is_aggregating_from_another_counter() { | |||
SumFormula.SumCounter anotherCounter = BASIC_SUM_FORMULA.createNewCounter(); | |||
addMeasure(LINES_KEY, 10); | |||
anotherCounter.aggregate(counterContext); | |||
anotherCounter.aggregate(fileAggregateContext); | |||
SumFormula.SumCounter counter = BASIC_SUM_FORMULA.createNewCounter(); | |||
counter.aggregate(anotherCounter); | |||
assertThat(BASIC_SUM_FORMULA.createMeasure(counter, Component.Type.PROJECT).get().getIntValue()).isEqualTo(10); | |||
assertThat(BASIC_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext).get().getIntValue()).isEqualTo(10); | |||
} | |||
@Test | |||
public void not_create_measure_on_file() { | |||
SumFormula.SumCounter counter = BASIC_SUM_FORMULA.createNewCounter(); | |||
addMeasure(LINES_KEY, 10); | |||
counter.aggregate(counterContext); | |||
counter.aggregate(fileAggregateContext); | |||
Assertions.assertThat(BASIC_SUM_FORMULA.createMeasure(counter, Component.Type.FILE)).isAbsent(); | |||
Assertions.assertThat(BASIC_SUM_FORMULA.createMeasure(counter, fileCreateMeasureContext)).isAbsent(); | |||
} | |||
@Test | |||
public void not_create_measure_when_value_is_zero() { | |||
SumFormula.SumCounter counter = BASIC_SUM_FORMULA.createNewCounter(); | |||
when(counterContext.getMeasure(LINES_KEY)).thenReturn(Optional.<Measure>absent()); | |||
counter.aggregate(counterContext); | |||
when(fileAggregateContext.getMeasure(LINES_KEY)).thenReturn(Optional.<Measure>absent()); | |||
counter.aggregate(fileAggregateContext); | |||
Assertions.assertThat(BASIC_SUM_FORMULA.createMeasure(counter, Component.Type.PROJECT)).isAbsent(); | |||
Assertions.assertThat(BASIC_SUM_FORMULA.createMeasure(counter, projectCreateMeasureContext)).isAbsent(); | |||
} | |||
private void addMeasure(String metricKey, int value) { | |||
when(counterContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value))); | |||
when(fileAggregateContext.getMeasure(metricKey)).thenReturn(Optional.of(Measure.newMeasureBuilder().create(value))); | |||
} | |||
} |