Browse Source

add Component to contexts in Formula API

also rename context to be more specific
add Component to the API make it more versatile
tags/5.2-RC1
Sébastien Lesaint 9 years ago
parent
commit
a90d9e4497

+ 5
- 6
server/sonar-server/src/main/java/org/sonar/server/computation/formula/AverageFormula.java View File

@@ -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);
}


+ 1
- 1
server/sonar-server/src/main/java/org/sonar/server/computation/formula/Counter.java View File

@@ -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);

}

+ 39
- 0
server/sonar-server/src/main/java/org/sonar/server/computation/formula/CreateMeasureContext.java View File

@@ -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();
}

+ 4
- 3
server/sonar-server/src/main/java/org/sonar/server/computation/formula/DistributionFormula.java View File

@@ -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;

server/sonar-server/src/main/java/org/sonar/server/computation/formula/CounterContext.java → server/sonar-server/src/main/java/org/sonar/server/computation/formula/FileAggregateContext.java View File

@@ -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();


+ 5
- 3
server/sonar-server/src/main/java/org/sonar/server/computation/formula/Formula.java View File

@@ -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

+ 27
- 4
server/sonar-server/src/main/java/org/sonar/server/computation/formula/FormulaExecutorComponentVisitor.java View File

@@ -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();
}
}
}

+ 4
- 4
server/sonar-server/src/main/java/org/sonar/server/computation/formula/SumFormula.java View File

@@ -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());
}

+ 37
- 33
server/sonar-server/src/test/java/org/sonar/server/computation/formula/AverageFormulaTest.java View File

@@ -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)));
}

}

+ 17
- 11
server/sonar-server/src/test/java/org/sonar/server/computation/formula/DistributionFormulaTest.java View File

@@ -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)));
}

}

+ 45
- 0
server/sonar-server/src/test/java/org/sonar/server/computation/formula/DumbCreateMeasureContext.java View File

@@ -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();
}
}

+ 7
- 7
server/sonar-server/src/test/java/org/sonar/server/computation/formula/FormulaExecutorComponentVisitorTest.java View File

@@ -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()));

+ 17
- 11
server/sonar-server/src/test/java/org/sonar/server/computation/formula/SumFormulaTest.java View File

@@ -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)));
}

}

Loading…
Cancel
Save