Skip to content

Commit f2c30bb

Browse files
Update tests to check both Roslyn 4.9 and 4.10
1 parent 5e81249 commit f2c30bb

27 files changed

Lines changed: 212 additions & 90 deletions

sonar-dotnet-shared-library/src/test/java/org/sonarsource/dotnet/shared/plugins/protobuf/RazorImporterTestBase.java

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,30 +37,26 @@
3737
import static org.mockito.Mockito.mock;
3838

3939
public class RazorImporterTestBase {
40-
protected final static File TEST_DATA_DIR = new File("src/test/resources/RazorProtobufImporter");
41-
protected final SensorContextTester sensorContext = SensorContextTester.create(TEST_DATA_DIR);
40+
protected final static String TEST_DATA_DIR = "src/test/resources/RazorProtobufImporter";
41+
protected final static String WEB_PROJECT_PATH = Paths.get(TEST_DATA_DIR, "WebProject").toString();
42+
protected final static String ROSLYN_4_9_DIR = Paths.get(TEST_DATA_DIR, "Roslyn 4.9").toString();
43+
protected final static String ROSLYN_4_10_DIR = Paths.get(TEST_DATA_DIR, "Roslyn 4.10").toString();
44+
protected final SensorContextTester sensorContext = SensorContextTester.create(new File(TEST_DATA_DIR));
45+
4246
@Rule
4347
public LogTester logTester = new LogTester();
44-
protected DefaultInputFile CasesInputFile;
45-
protected DefaultInputFile OverlapSymbolReferencesInputFile;
46-
protected DefaultInputFile ProgramInputFile;
47-
protected DefaultInputFile PageRazorFile;
4848

4949
protected static String fileName(String filePath) {
5050
return Paths.get(filePath).getFileName().toString();
5151
}
5252

5353
@Before
54-
public void setUp() throws FileNotFoundException {
54+
public void setUp() {
5555
logTester.setLevel(Level.TRACE);
56-
CasesInputFile = addTestFileToContext("Cases.razor");
57-
PageRazorFile = addTestFileToContext("Page.razor");
58-
OverlapSymbolReferencesInputFile = addTestFileToContext("OverlapSymbolReferences.razor");
59-
ProgramInputFile = addTestFileToContext("Program.cs");
6056
}
6157

62-
private DefaultInputFile addTestFileToContext(String testFilePath) throws FileNotFoundException {
63-
var testFile = new File(TEST_DATA_DIR, testFilePath);
58+
protected DefaultInputFile addTestFileToContext(String testFilePath) throws FileNotFoundException {
59+
var testFile = new File(WEB_PROJECT_PATH, testFilePath);
6460
assertThat(testFile).withFailMessage("no such file: " + testFilePath).isFile();
6561
var inputFile = new TestInputFileBuilder("dummyKey", testFilePath)
6662
.setMetadata(new FileMetadata(mock(AnalysisWarnings.class)).readMetadata(new FileReader(testFile)))

sonar-dotnet-shared-library/src/test/java/org/sonarsource/dotnet/shared/plugins/protobuf/RazorMetricsImporterTest.java

Lines changed: 68 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,11 @@
2121

2222
import java.io.File;
2323
import java.io.FileNotFoundException;
24+
import java.util.Arrays;
2425
import java.util.Collections;
26+
import java.util.function.Function;
27+
import java.util.stream.Collectors;
28+
2529
import org.assertj.core.groups.Tuple;
2630
import org.junit.Before;
2731
import org.junit.Test;
@@ -41,24 +45,57 @@
4145
import static org.sonarsource.dotnet.shared.plugins.ProtobufDataImporter.METRICS_FILENAME;
4246

4347
public class RazorMetricsImporterTest extends RazorImporterTestBase {
44-
private static final File PROTOBUF_FILE = new File(TEST_DATA_DIR, METRICS_FILENAME);
48+
private static final File PROTOBUF_4_9_FILE = new File(ROSLYN_4_9_DIR, METRICS_FILENAME);
49+
private static final File PROTOBUF_4_10_FILE = new File(ROSLYN_4_10_DIR, METRICS_FILENAME);
4550

4651
@Before
4752
@Override
48-
public void setUp() throws FileNotFoundException {
53+
public void setUp() {
4954
super.setUp();
50-
assertThat(PROTOBUF_FILE).withFailMessage("no such file: " + PROTOBUF_FILE).isFile();
55+
assertThat(PROTOBUF_4_9_FILE).withFailMessage("no such file: " + PROTOBUF_4_9_FILE).isFile();
56+
assertThat(PROTOBUF_4_10_FILE).withFailMessage("no such file: " + PROTOBUF_4_10_FILE).isFile();
57+
}
58+
59+
@Test
60+
public void roslyn_metrics_are_imported_before_4_10() throws FileNotFoundException {
61+
var inputFile = addTestFileToContext("Cases.razor");
62+
var noSonarFilter = mock(NoSonarFilter.class);
63+
var fileLinesContext = mock(FileLinesContext.class);
64+
var fileLinesContextFactory = mock(FileLinesContextFactory.class);
65+
when(fileLinesContextFactory.createFor(any(InputFile.class))).thenReturn(fileLinesContext);
66+
67+
new MetricsImporter(sensorContext, fileLinesContextFactory, noSonarFilter, RazorImporterTestBase::fileName).accept(PROTOBUF_4_9_FILE.toPath());
68+
69+
var measures = sensorContext.measures(inputFile.key());
70+
assertThat(measures).hasSize(7);
71+
72+
assertThat(measures).extracting("metric", "value")
73+
.containsOnly(
74+
Tuple.tuple(CoreMetrics.COMPLEXITY, 5),
75+
Tuple.tuple(CoreMetrics.FUNCTIONS, 3),
76+
Tuple.tuple(CoreMetrics.COMMENT_LINES, 0),
77+
Tuple.tuple(CoreMetrics.COGNITIVE_COMPLEXITY, 1),
78+
Tuple.tuple(CoreMetrics.CLASSES, 0),
79+
Tuple.tuple(CoreMetrics.NCLOC, 13),
80+
Tuple.tuple(CoreMetrics.STATEMENTS, 6));
81+
82+
verify(noSonarFilter).noSonarInFile(inputFile, Collections.emptySet());
83+
84+
verifyMetrics(fileLinesContext, CoreMetrics.EXECUTABLE_LINES_DATA_KEY, 8, 23, 24);
85+
verifyMetrics(fileLinesContext, CoreMetrics.NCLOC_DATA_KEY, 3, 5, 8, 9, 13, 16, 18, 19, 21, 22, 23, 24, 25);
86+
87+
assertThat(logTester.logs(Level.DEBUG)).isEmpty();
5188
}
5289

5390
@Test
54-
public void roslyn_metrics_are_imported() {
55-
var inputFile = CasesInputFile;
91+
public void roslyn_metrics_are_imported_starting_with_4_10() throws FileNotFoundException {
92+
var inputFile = addTestFileToContext("Cases.razor");
5693
var noSonarFilter = mock(NoSonarFilter.class);
5794
var fileLinesContext = mock(FileLinesContext.class);
5895
var fileLinesContextFactory = mock(FileLinesContextFactory.class);
5996
when(fileLinesContextFactory.createFor(any(InputFile.class))).thenReturn(fileLinesContext);
6097

61-
new MetricsImporter(sensorContext, fileLinesContextFactory, noSonarFilter, RazorImporterTestBase::fileName).accept(PROTOBUF_FILE.toPath());
98+
new MetricsImporter(sensorContext, fileLinesContextFactory, noSonarFilter, RazorImporterTestBase::fileName).accept(PROTOBUF_4_10_FILE.toPath());
6299

63100
var measures = sensorContext.measures(inputFile.key());
64101
assertThat(measures).hasSize(7);
@@ -75,27 +112,30 @@ public void roslyn_metrics_are_imported() {
75112

76113
verify(noSonarFilter).noSonarInFile(inputFile, Collections.emptySet());
77114

78-
verify(fileLinesContext).setIntValue(CoreMetrics.EXECUTABLE_LINES_DATA_KEY, 8, 1);
79-
verify(fileLinesContext).setIntValue(CoreMetrics.EXECUTABLE_LINES_DATA_KEY, 23, 1);
80-
verify(fileLinesContext).setIntValue(CoreMetrics.EXECUTABLE_LINES_DATA_KEY, 24, 1);
81-
82-
verify(fileLinesContext, times(4)).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 1, 1);
83-
verify(fileLinesContext, times(2)).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 3, 1);
84-
verify(fileLinesContext, times(2)).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 5, 1);
85-
verify(fileLinesContext, times(2)).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 5, 1);
86-
87-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 8, 1);
88-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 9, 1);
89-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 13, 1);
90-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 16, 1);
91-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 18, 1);
92-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 19, 1);
93-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 21, 1);
94-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 22, 1);
95-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 23, 1);
96-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 24, 1);
97-
verify(fileLinesContext).setIntValue(CoreMetrics.NCLOC_DATA_KEY, 25, 1);
98-
99-
assertThat(logTester.logs(Level.DEBUG)).containsExactly("The code line number was out of the range. File Page.razor, Line 4");
115+
verifyMetrics(fileLinesContext, CoreMetrics.EXECUTABLE_LINES_DATA_KEY, 8, 23, 24);
116+
verifyMetrics(fileLinesContext, CoreMetrics.NCLOC_DATA_KEY, 1, 3, 5, 8, 9, 13, 16, 18, 19, 21, 22, 23, 24, 25);
117+
118+
assertThat(logTester.logs(Level.DEBUG)).isEmpty();
119+
}
120+
121+
@Test
122+
public void roslyn_metrics_out_of_range_with_4_10() throws FileNotFoundException {
123+
addTestFileToContext("_Imports.razor");
124+
var fileLinesContextFactory = mock(FileLinesContextFactory.class);
125+
when(fileLinesContextFactory.createFor(any(InputFile.class))).thenReturn(mock(FileLinesContext.class));
126+
127+
new MetricsImporter(sensorContext, fileLinesContextFactory, mock(NoSonarFilter.class), RazorImporterTestBase::fileName).accept(PROTOBUF_4_10_FILE.toPath());
128+
129+
assertThat(logTester.logs(Level.DEBUG)).containsExactly("The code line number was out of the range. File _Imports.razor, Line 4");
130+
}
131+
132+
private void verifyMetrics(FileLinesContext context, String key, int... values) {
133+
var groups = Arrays.stream(values)
134+
.boxed()
135+
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
136+
137+
for (int groupKey : groups.keySet()){
138+
verify(context, times(groups.get(groupKey).intValue())).setIntValue(key, groupKey, 1);
139+
}
100140
}
101141
}

sonar-dotnet-shared-library/src/test/java/org/sonarsource/dotnet/shared/plugins/protobuf/RazorSymbolRefsImporterTest.java

Lines changed: 43 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,57 @@
3030
import static org.sonarsource.dotnet.shared.plugins.ProtobufDataImporter.SYMBOLREFS_FILENAME;
3131

3232
public class RazorSymbolRefsImporterTest extends RazorImporterTestBase {
33-
private final File protobuf = new File(TEST_DATA_DIR, SYMBOLREFS_FILENAME);
33+
private static final File PROTOBUF_4_9_FILE = new File(ROSLYN_4_9_DIR, SYMBOLREFS_FILENAME);
34+
private static final File PROTOBUF_4_10_FILE = new File(ROSLYN_4_10_DIR, SYMBOLREFS_FILENAME);
3435

3536
@Override
3637
@Before
37-
public void setUp() throws FileNotFoundException {
38+
public void setUp() {
3839
super.setUp();
39-
assertThat(protobuf).withFailMessage("no such file: " + protobuf).isFile();
40+
assertThat(PROTOBUF_4_9_FILE).withFailMessage("no such file: " + PROTOBUF_4_9_FILE).isFile();
4041
}
4142

4243
@Test
43-
public void test_symbol_refs_get_imported_cases() {
44+
public void test_symbol_refs_get_imported_cases_before_4_10() throws FileNotFoundException {
4445

45-
var inputFile = CasesInputFile;
46+
verifySymbolRef(PROTOBUF_4_9_FILE);
47+
}
48+
49+
@Test
50+
public void test_symbol_refs_get_imported_cases_after_4_10() throws FileNotFoundException {
51+
verifySymbolRef(PROTOBUF_4_10_FILE);
52+
}
53+
54+
@Test
55+
public void test_symbol_refs_get_imported_overlapSymbolReferences_before_4_10() throws FileNotFoundException {
56+
var inputFile = addTestFileToContext("OverlapSymbolReferences.razor");
57+
var sut = new SymbolRefsImporter(sensorContext, s -> Paths.get(s).getFileName().toString());
58+
sut.accept(PROTOBUF_4_9_FILE.toPath());
59+
sut.save();
60+
61+
var references = sensorContext.referencesForSymbolAt(inputFile.key(), 1, 1);
62+
assertThat(references)
63+
.isNotNull() // The symbol declaration can be found,
64+
.isEmpty(); // but there are no references, due to the overlap.
65+
66+
assertThat(logTester.logs(Level.DEBUG)).containsExactly(
67+
"The declaration token at Range[from [line=1, lineOffset=0] to [line=1, lineOffset=17]] overlaps with the referencing token Range[from [line=1, lineOffset=6] to [line=1, lineOffset=23]] in file OverlapSymbolReferences.razor");
68+
}
69+
70+
@Test
71+
public void test_symbol_refs_get_imported_overlapSymbolReferences_after_4_10() throws FileNotFoundException {
72+
var inputFile = addTestFileToContext("OverlapSymbolReferences.razor");
73+
var sut = new SymbolRefsImporter(sensorContext, s -> Paths.get(s).getFileName().toString());
74+
sut.accept(PROTOBUF_4_10_FILE.toPath());
75+
sut.save();
76+
77+
// the issue with overlapping symbols has been fixed in dotnet 8.0.5
78+
assertThat(sensorContext.referencesForSymbolAt(inputFile.key(), 1, 11)).hasSize(1);
79+
assertThat(logTester.logs(Level.DEBUG)).isEmpty();
80+
}
81+
82+
private void verifySymbolRef(File protobuf) throws FileNotFoundException {
83+
var inputFile = addTestFileToContext("Cases.razor");;
4684
var sut = new SymbolRefsImporter(sensorContext, RazorImporterTestBase::fileName);
4785
sut.accept(protobuf.toPath());
4886
sut.save();
@@ -57,16 +95,4 @@ public void test_symbol_refs_get_imported_cases() {
5795

5896
assertThat(logTester.logs(Level.DEBUG)).isEmpty();
5997
}
60-
61-
@Test
62-
public void test_symbol_refs_get_imported_overlapSymbolReferences() {
63-
var inputFile = OverlapSymbolReferencesInputFile;
64-
var sut = new SymbolRefsImporter(sensorContext, s -> Paths.get(s).getFileName().toString());
65-
sut.accept(protobuf.toPath());
66-
sut.save();
67-
68-
// the issue with overlapping symbols has been fixed in dotnet 8.0.5
69-
assertThat(sensorContext.referencesForSymbolAt(inputFile.key(), 1, 11)).hasSize(1);
70-
assertThat(logTester.logs(Level.DEBUG)).isEmpty();
71-
}
7298
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
�
2+
�C:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\obj\Debug\net8.0\BlazorWebAssembly.AssemblyInfo.csutf-8�
3+
�C:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\obj\Debug\net8.0\.NETCoreApp,Version=v8.0.AssemblyAttributes.csutf-8|
4+
sC:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\Program.csutf-8
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"sdk": {
3+
"version": "8.0.300"
4+
}
5+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Roslyn version: 4.10.0.0Language version: CSharp12!Concurrent execution: enabled��File 'C:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\obj\Debug\net8.0\Microsoft.CodeAnalysis.Razor.Compiler\Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator\_Imports_razor.g.cs' was recognized as razor generated��File 'C:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\obj\Debug\net8.0\Microsoft.CodeAnalysis.Razor.Compiler\Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator\OverlapSymbolReferences_razor.g.cs' was recognized as razor generated��File 'C:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\obj\Debug\net8.0\Microsoft.CodeAnalysis.Razor.Compiler\Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator\Cases_razor.g.cs' was recognized as razor generated��File 'C:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\obj\Debug\net8.0\BlazorWebAssembly.AssemblyInfo.cs' was recognized as generated��File 'C:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\obj\Debug\net8.0\.NETCoreApp,Version=v8.0.AssemblyAttributes.cs' was recognized as generated

sonar-dotnet-shared-library/src/test/resources/RazorProtobufImporter/Roslyn 4.10/metrics.pb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
�
2+
wC:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\_Imports.razor8r�
3+
�C:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\OverlapSymbolReferences.razor8r�
4+
tC:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\Cases.razor 8r x��
5+
sC:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\Program.cs 8r

sonar-dotnet-shared-library/src/test/resources/RazorProtobufImporter/Roslyn 4.10/symrefs.pb

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
y
2+
wC:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\_Imports.razor�
3+
�C:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\OverlapSymbolReferences.razor
4+
 # 4�
5+
tC:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\Cases.razor
6+
  ( )2
7+
    & (
8+
   ' 
9+
10+
 �
11+
sC:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\Program.cs
12+
13+
 
14+
15+
 

sonar-dotnet-shared-library/src/test/resources/RazorProtobufImporter/token-cpd.pb renamed to sonar-dotnet-shared-library/src/test/resources/RazorProtobufImporter/Roslyn 4.10/token-cpd.pb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-

2-
hC:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\Program.cs
1+

2+
sC:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\Program.cs
33
namespace 
44
WebAss
55


sonar-dotnet-shared-library/src/test/resources/RazorProtobufImporter/Roslyn 4.10/token-type.pb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
�
2+
sC:\src\work\sonar-dotnet\sonar-dotnet-shared-library\src\test\resources\RazorProtobufImporter\WebProject\Program.cs
3+
 
4+
      
5+
    

0 commit comments

Comments
 (0)