Skip to content

Commit fb6ba3c

Browse files
committed
#55 Refactor some code and add tests for coverage 2
1 parent 77dfdd1 commit fb6ba3c

File tree

11 files changed

+187
-41
lines changed

11 files changed

+187
-41
lines changed

pom.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,8 +52,8 @@
5252
<properties>
5353
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
5454
<jdk.version>1.8</jdk.version>
55-
<jdk.min.version>1.8</jdk.min.version>
56-
<jdk.max.version>1.8</jdk.max.version>
55+
<jdk.min.version>11</jdk.min.version>
56+
<jdk.max.version>11</jdk.max.version>
5757
<maven.compiler.source>1.8</maven.compiler.source>
5858
<maven.compiler.target>1.8</maven.compiler.target>
5959
<sonar.apiVersion>6.7.7</sonar.apiVersion>

src/main/java/fr/cnes/sonar/plugins/icode/check/ICodeSensor.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import java.io.FileInputStream;
5353
import java.io.FileNotFoundException;
5454
import java.io.IOException;
55-
import java.net.URI;
5655
import java.nio.file.Paths;
5756
import java.util.*;
5857

@@ -210,14 +209,11 @@ private void executeEmbeddedICode(final SensorContext sensorContext) {
210209
}
211210

212211
/**
213-
* <h1>{@link #sonarCheck(Set, List, List)}</h1>
214-
* <p>
215212
* This method apply all rules of the different contributions set in
216213
* parameter except the one excluded. File in parameters are being analyzed
217214
* by each contribution able to handle it or none if it isn't.
218-
* </p>
219-
* <p>
220-
* <strong>Important :</strong> Default configurations to run analysis are
215+
*
216+
* Important: Default configurations to run analysis are
221217
* available when setting parameters.
222218
*
223219
* @param pInputFiles
@@ -368,7 +364,6 @@ static void saveIssue(final SensorContext sensorContext, final CheckResult resul
368364
final FilePredicates predicates = fileSystem.predicates();
369365
final NewIssue issue = sensorContext.newIssue();
370366
final String fileToFind = result.getFile().getPath();
371-
System.err.println(fileToFind);
372367
final FilePredicate predicate = predicates.hasRelativePath(fileToFind);
373368
final InputFile file = fileSystem.inputFile(predicate);
374369
if(Objects.nonNull(file)) {

src/main/java/fr/cnes/sonar/plugins/icode/languages/ICodeLanguage.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public ICodeLanguage(final Configuration configuration, final String key, final
5454
public String[] getFileSuffixes() {
5555
String[] suffixes = filterEmptyStrings(configuration.getStringArray(getSuffixKey()));
5656
if (suffixes.length == 0) {
57-
suffixes = getDefaultSuffixes().split(",");
57+
suffixes = filterEmptyStrings(getDefaultSuffixes().split(","));
5858
}
5959
return suffixes;
6060
}
@@ -80,9 +80,9 @@ public String[] getFileSuffixes() {
8080
*
8181
* @return Output String array without empty string values.
8282
*/
83-
private static String[] filterEmptyStrings(String[] stringArray) {
83+
public static String[] filterEmptyStrings(final String[] stringArray) {
8484
List<String> nonEmptyStrings = new ArrayList<>();
85-
for (String string : stringArray) {
85+
for (final String string : stringArray) {
8686
if (StringUtils.isNotBlank(string.trim())) {
8787
nonEmptyStrings.add(string.trim());
8888
}
@@ -97,7 +97,7 @@ private static String[] filterEmptyStrings(String[] stringArray) {
9797
* @return True if obj is this.
9898
*/
9999
@Override
100-
public boolean equals(Object obj) {
100+
public boolean equals(final Object obj) {
101101
return obj==this;
102102
}
103103

src/main/java/fr/cnes/sonar/plugins/icode/measures/ICodeMetricsProcessor.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ public static void saveExtraMeasures(final SensorContext context, final Map<Stri
175175

176176
// Collect all measures on methods into specific list
177177
for(final CheckResult result : results) {
178-
final String type = Objects.isNull(result.getLocation()) || result.getLocation().isEmpty() ? CLASS : METHOD;
178+
final String type = Objects.isNull(result.getLocation()) || result.getLocation().isEmpty() ?
179+
CLASS : result.getLocation();
179180
final String id = result.getName();
180181
if(id.contains(COMMON_METRICS_KEY_PART) && type.equals(METHOD)) {
181182
final List<AnalysisRule> sub = measures.getOrDefault(id, new ArrayList<>());

src/main/java/fr/cnes/sonar/plugins/icode/measures/ICodeNestingMetric.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public List<Metric> getMetrics() {
6464
* @return The definition of the computer.
6565
*/
6666
@Override
67-
public MeasureComputerDefinition define(MeasureComputerDefinitionContext defContext) {
67+
public MeasureComputerDefinition define(final MeasureComputerDefinitionContext defContext) {
6868
MeasureComputerDefinition.Builder def = defContext.newDefinitionBuilder();
6969
def.setInputMetrics(KEY);
7070
def.setOutputMetrics(KEY);
@@ -77,11 +77,11 @@ public MeasureComputerDefinition define(MeasureComputerDefinitionContext defCont
7777
* @param context Context of the computation.
7878
*/
7979
@Override
80-
public void compute(MeasureComputerContext context) {
80+
public void compute(final MeasureComputerContext context) {
8181
Iterable<Measure> children = context.getChildrenMeasures(KEY);
8282
if(children.iterator().hasNext()){
8383
int max = 0;
84-
for (Measure child : children){
84+
for (final Measure child : children){
8585
max = Math.max(max, child.getIntValue());
8686
}
8787
context.addMeasure(KEY, max);

src/main/java/fr/cnes/sonar/plugins/icode/model/AnalysisRule.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,8 @@ public AnalysisRule(final CheckResult checkResult) {
7777
this.result.setResultId(checkResult.getId());
7878
this.result.setResultLine(String.valueOf(checkResult.getLine()));
7979
this.result.setResultMessage(checkResult.getMessage());
80-
this.result.setResultTypePlace(Objects.isNull(checkResult.getLocation()) || checkResult.getLocation().isEmpty() ? "class" : "method");
80+
this.result.setResultTypePlace(Objects.isNull(checkResult.getLocation()) || checkResult.getLocation().isEmpty() ?
81+
"class" : checkResult.getLocation());
8182
this.result.setResultValue(String.valueOf(checkResult.getValue()));
8283
}
8384

src/main/java/fr/cnes/sonar/plugins/icode/model/XmlHandler.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@
2525
* Class used to unmarshal i-Code xml file (results and rules definition).
2626
*
2727
* It contains useful methods to handle xml files.
28-
*
29-
* @author lequal
3028
*/
3129
public class XmlHandler {
3230

@@ -44,12 +42,12 @@ private XmlHandler(){}
4442
* @return AnalysisReport: the main structure of the report.
4543
*/
4644
public static Object unmarshal(final InputStream file, final Class<?> cls){
47-
XStream xStream = new XStream() {
45+
final XStream xStream = new XStream() {
4846
@Override
4947
protected MapperWrapper wrapMapper(MapperWrapper next) {
5048
return new MapperWrapper(next) {
5149
@Override
52-
public boolean shouldSerializeMember(Class definedIn, String fieldName) {
50+
public boolean shouldSerializeMember(final Class definedIn, final String fieldName) {
5351
return (definedIn != Object.class) && super.shouldSerializeMember(definedIn, fieldName);
5452
}
5553
};

src/test/java/fr/cnes/sonar/plugins/icode/languages/ICodeLanguagesTest.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,34 @@ public void test_given_settings_when_getFileSuffixes_then_settings() {
4040
assertArrayEquals(expected, fortran90Language.getFileSuffixes());
4141
}
4242

43+
@Test
44+
public void test_get_file_suffixes_with_strange_language_suffixes() {
45+
final Configuration settings = new MapSettings()
46+
.setProperty("toto", ".notstrange,,strange,., ")
47+
.asConfig();
48+
final ICodeLanguage strangeLanguage = new ICodeLanguage(settings, "strange", "Strange") {
49+
@Override
50+
public String getSuffixKey() {
51+
return "toto";
52+
}
53+
54+
@Override
55+
public String getDefaultSuffixes() {
56+
return ".notstrange,,strange,., ";
57+
}
58+
};
59+
String[] expected = new String[]{".notstrange","strange","."};
60+
String[] actual = strangeLanguage.getFileSuffixes();
61+
assertArrayEquals(expected, actual);
62+
}
63+
64+
@Test
65+
public void test_all_possibilities_with_filter_empty_strings() {
66+
String[] expected = new String[]{".notstrange","strange","."};
67+
String[] actual = ICodeLanguage.filterEmptyStrings(new String[]{".notstrange","","strange","."," "});
68+
assertArrayEquals(expected, actual);
69+
}
70+
4371
@Test
4472
public void test_strange_properties() {
4573
final String[] values = {
@@ -70,6 +98,7 @@ public void test_equals_ans_hashcode() {
7098
ICodeLanguage l2 = new Fortran77Language(settings);
7199

72100
Assert.assertFalse(l1.equals(l2));
101+
Assert.assertTrue(l1.equals(l1));
73102
Assert.assertFalse(l1.equals(new ShellLanguage(settings)));
74103

75104
Assert.assertNotEquals(l1.hashCode(), l2.hashCode());

src/test/java/fr/cnes/sonar/plugins/icode/measures/ComputeNestingMetricTest.java

Lines changed: 49 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package fr.cnes.sonar.plugins.icode.measures;
1818

1919
import org.junit.Test;
20+
import org.junit.jupiter.api.Assertions;
2021
import org.mockito.Mockito;
2122
import org.sonar.api.ce.measure.Component;
2223
import org.sonar.api.ce.measure.Measure;
@@ -27,45 +28,75 @@
2728
import org.sonar.api.measures.Metric;
2829

2930
import java.util.ArrayList;
31+
import java.util.Iterator;
3032
import java.util.List;
3133

34+
import static org.junit.jupiter.api.Assertions.fail;
35+
import static org.mockito.ArgumentMatchers.anyInt;
36+
import static org.mockito.ArgumentMatchers.anyString;
37+
import static org.mockito.Mockito.*;
38+
3239
public class ComputeNestingMetricTest {
3340

3441
@Test
3542
public void test_metric_definition() {
36-
MeasureComputerDefinition measureComputerDefinition = Mockito.mock(MeasureComputerDefinition.class);
37-
MeasureComputer.MeasureComputerDefinition.Builder builder = Mockito.mock(MeasureComputer.MeasureComputerDefinition.Builder.class);
43+
MeasureComputerDefinition measureComputerDefinition = mock(MeasureComputerDefinition.class);
44+
MeasureComputer.MeasureComputerDefinition.Builder builder = mock(MeasureComputer.MeasureComputerDefinition.Builder.class);
3845
List<Metric> allMetrics = (new ICodeNestingMetric()).getMetrics();
3946
String[] metricsKey = new String[]{allMetrics.get(0).key()};
40-
Mockito.when(builder.setInputMetrics(metricsKey)).thenReturn(builder);
41-
Mockito.when(builder.setOutputMetrics(metricsKey)).thenReturn(builder);
42-
Mockito.when(builder.build()).thenReturn(measureComputerDefinition);
43-
MeasureComputerDefinitionContext measureComputerDefinitionContext = Mockito.mock(MeasureComputerDefinitionContext.class);
44-
Mockito.when(measureComputerDefinitionContext.newDefinitionBuilder()).thenReturn(builder);
47+
when(builder.setInputMetrics(metricsKey)).thenReturn(builder);
48+
when(builder.setOutputMetrics(metricsKey)).thenReturn(builder);
49+
when(builder.build()).thenReturn(measureComputerDefinition);
50+
MeasureComputerDefinitionContext measureComputerDefinitionContext = mock(MeasureComputerDefinitionContext.class);
51+
when(measureComputerDefinitionContext.newDefinitionBuilder()).thenReturn(builder);
4552
ICodeNestingMetric compute = new ICodeNestingMetric();
4653
compute.define(measureComputerDefinitionContext);
4754
}
4855

4956
@Test
5057
public void test_given_context_when_compute_then_newComputedMeasures() {
51-
org.sonar.api.ce.measure.Component componentFile = Mockito.mock(org.sonar.api.ce.measure.Component.class);
52-
Mockito.when(componentFile.getType()).thenReturn(Component.Type.DIRECTORY);
53-
MeasureComputerContext context = Mockito.mock(MeasureComputerContext.class);
54-
Mockito.when(context.getComponent()).thenReturn(componentFile);
58+
org.sonar.api.ce.measure.Component componentFile = mock(org.sonar.api.ce.measure.Component.class);
59+
when(componentFile.getType()).thenReturn(Component.Type.DIRECTORY);
60+
MeasureComputerContext context = mock(MeasureComputerContext.class);
61+
when(context.getComponent()).thenReturn(componentFile);
5562
ArrayList<Measure> childsMeasures = new ArrayList<>();
56-
Measure aMeasureMin = Mockito.mock(Measure.class);
57-
Mockito.when(aMeasureMin.getIntValue()).thenReturn(1);
58-
Mockito.when(aMeasureMin.getDoubleValue()).thenReturn(1.);
59-
Measure aMeasureMax = Mockito.mock(Measure.class);
60-
Mockito.when(aMeasureMax.getIntValue()).thenReturn(5);
61-
Mockito.when(aMeasureMax.getDoubleValue()).thenReturn(5.);
63+
Measure aMeasureMin = mock(Measure.class);
64+
when(aMeasureMin.getIntValue()).thenReturn(1);
65+
when(aMeasureMin.getDoubleValue()).thenReturn(1.);
66+
Measure aMeasureMax = mock(Measure.class);
67+
when(aMeasureMax.getIntValue()).thenReturn(5);
68+
when(aMeasureMax.getDoubleValue()).thenReturn(5.);
6269
childsMeasures.add(aMeasureMin);
6370
childsMeasures.add(aMeasureMax);
64-
Mockito.when(context.getChildrenMeasures(ICodeNestingMetric.NESTING_MAX.key())).thenReturn(childsMeasures);
71+
when(context.getChildrenMeasures(ICodeNestingMetric.NESTING_MAX.key())).thenReturn(childsMeasures);
6572
ICodeNestingMetric computeModule = new ICodeNestingMetric();
6673
computeModule.compute(context);
6774
Mockito.verify(context).addMeasure(ICodeNestingMetric.NESTING_MAX.key(), 5);
6875
}
6976

77+
@Test
78+
public void test_compute_metric_without_children() {
79+
80+
// Create a mock for the context.
81+
MeasureComputerContext context = mock(MeasureComputerContext.class);
82+
83+
final Iterable iter = () -> new Iterator() {
84+
@Override
85+
public boolean hasNext() {
86+
return false;
87+
}
7088

89+
@Override
90+
public Object next() {
91+
return null;
92+
}
93+
};
94+
95+
when(context.getChildrenMeasures(ICodeNestingMetric.KEY)).thenReturn(iter);
96+
doAnswer(invocationOnMock -> fail()).when(context).addMeasure(anyString(), anyInt());
97+
98+
final ICodeNestingMetric nestingMetric = new ICodeNestingMetric();
99+
nestingMetric.compute(context);
100+
Assertions.assertTrue(true);
101+
}
71102
}

src/test/java/fr/cnes/sonar/plugins/icode/measures/ICodeMetricsProcessorTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
import java.net.URISyntaxException;
3636
import java.nio.charset.Charset;
3737
import java.util.HashMap;
38+
import java.util.List;
3839
import java.util.Map;
3940

4041
public class ICodeMetricsProcessorTest {
@@ -200,6 +201,51 @@ public void test_compute_complexity() {
200201
Assert.assertEquals(1, context.measures(key).size());
201202
}
202203

204+
@Test
205+
public void test_save_extra_measure_with_null_location() {
206+
207+
final CheckResult checkResult = new CheckResult("F77.MET.ComplexitySimplified",
208+
"F77.MET.ComplexitySimplified", "f77");
209+
checkResult.setLocation(null);
210+
checkResult.setMessage("empty message");
211+
checkResult.setLine(1);
212+
checkResult.setValue(1.0f);
213+
checkResult.setFile(new File("clanhb.f"));
214+
215+
ICodeMetricsProcessor.saveExtraMeasures(context, files, List.of(checkResult));
216+
Assert.assertEquals(0, context.measures(clanhb_f.key()).size());
217+
}
218+
219+
@Test
220+
public void test_save_extra_measure_with_empty_location() {
221+
222+
final CheckResult checkResult = new CheckResult("F77.MET.ComplexitySimplified",
223+
"F77.MET.ComplexitySimplified", "f77");
224+
checkResult.setLocation("");
225+
checkResult.setMessage("empty message");
226+
checkResult.setLine(1);
227+
checkResult.setValue(1.0f);
228+
checkResult.setFile(new File("clanhb.f"));
229+
230+
ICodeMetricsProcessor.saveExtraMeasures(context, files, List.of(checkResult));
231+
Assert.assertEquals(0, context.measures(clanhb_f.key()).size());
232+
}
233+
234+
@Test
235+
public void test_save_extra_measure_with_method_location() {
236+
237+
final CheckResult checkResult = new CheckResult("F77.MET.ComplexitySimplified",
238+
"F77.MET.ComplexitySimplified", "f77");
239+
checkResult.setLocation("method");
240+
checkResult.setMessage("empty message");
241+
checkResult.setLine(1);
242+
checkResult.setValue(1.0f);
243+
checkResult.setFile(new File("clanhb.f"));
244+
245+
ICodeMetricsProcessor.saveExtraMeasures(context, files, List.of(checkResult));
246+
Assert.assertEquals(1, context.measures(clanhb_f.key()).size());
247+
}
248+
203249
@Test
204250
public void test_compute_nesting() {
205251

0 commit comments

Comments
 (0)