mirror of
https://github.com/actions/setup-dotnet.git
synced 2026-07-01 18:48:20 +01:00
Expand the CSC problem matcher to light up more errors on GitHub. (#717)
Expand csc problem matcher with more real-world scenarios. Co-authored-by: Stephen Cleary <900597+StephenCleary@users.noreply.github.com>
This commit is contained in:
11
.github/csc.json
vendored
11
.github/csc.json
vendored
@@ -4,13 +4,14 @@
|
|||||||
"owner": "csc",
|
"owner": "csc",
|
||||||
"pattern": [
|
"pattern": [
|
||||||
{
|
{
|
||||||
"regexp": "^([^\\s].*)\\((\\d+)(?:,\\d+|,\\d+,\\d+)?\\):\\s+(error|warning)\\s+([a-zA-Z]+(?<!MSB)\\d+):\\s*(.*?)\\s+\\[(.*?)\\]$",
|
"regexp": "^\\s*(?:\\d+>\\s*)?([^\\s].*)\\((\\d+)(?:,(\\d+))?(?:,\\d+)*\\):\\s+(error|warning)\\s+([a-zA-Z]+(?<!MSB)\\d*):\\s*(.*?)\\s+\\[(.*?)\\]$",
|
||||||
"file": 1,
|
"file": 1,
|
||||||
"line": 2,
|
"line": 2,
|
||||||
"severity": 3,
|
"column": 3,
|
||||||
"code": 4,
|
"severity": 4,
|
||||||
"message": 5,
|
"code": 5,
|
||||||
"fromPath": 6
|
"message": 6,
|
||||||
|
"fromPath": 7
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,45 +1,96 @@
|
|||||||
import cscFile from '../.github/csc.json';
|
import cscFile from '../.github/csc.json';
|
||||||
describe('csc tests', () => {
|
describe('csc tests', () => {
|
||||||
test('regular expression in csc.json is valid', async () => {
|
const regexPattern = cscFile['problemMatcher'][0]['pattern'][0]['regexp'];
|
||||||
const regexPattern = cscFile['problemMatcher'][0]['pattern'][0]['regexp'];
|
const regexResultsMap = cscFile['problemMatcher'][0]['pattern'][0];
|
||||||
const regexResultsMap = cscFile['problemMatcher'][0]['pattern'][0];
|
const regex = new RegExp(regexPattern);
|
||||||
|
|
||||||
const regex = new RegExp(regexPattern);
|
const testCases: Array<{input: string; results: Record<string, string>}> = [
|
||||||
|
{
|
||||||
const stringsToMatch = [
|
input:
|
||||||
'Program.cs(10,79): error CS1002: ; expected [/Users/zacharyeisinger/Documents/repo/setup-dotnet/__tests__/sample-broken-csproj/sample.csproj]',
|
'Program.cs(10,79): error CS1002: ; expected [/Users/zacharyeisinger/Documents/repo/setup-dotnet/__tests__/sample-broken-csproj/sample.csproj]',
|
||||||
"S:\\Msbuild\\src\\Build\\Evaluation\\ExpressionShredder.cs(33,7): error CS1003: Syntax error, ',' expected [S:\\msbuild\\src\\Build\\Microsoft.Build.csproj > Properties:prop]"
|
results: {
|
||||||
];
|
|
||||||
// Expected results are calculated according to the csc matcher located in csc.json file
|
|
||||||
const expectedResults = [
|
|
||||||
{
|
|
||||||
file: 'Program.cs',
|
file: 'Program.cs',
|
||||||
line: '10',
|
line: '10',
|
||||||
|
column: '79',
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
code: 'CS1002',
|
code: 'CS1002',
|
||||||
message: '; expected',
|
message: '; expected',
|
||||||
fromPath:
|
fromPath:
|
||||||
'/Users/zacharyeisinger/Documents/repo/setup-dotnet/__tests__/sample-broken-csproj/sample.csproj'
|
'/Users/zacharyeisinger/Documents/repo/setup-dotnet/__tests__/sample-broken-csproj/sample.csproj'
|
||||||
},
|
}
|
||||||
{
|
},
|
||||||
|
{
|
||||||
|
input:
|
||||||
|
"S:\\Msbuild\\src\\Build\\Evaluation\\ExpressionShredder.cs(33,7): error CS1003: Syntax error, ',' expected [S:\\msbuild\\src\\Build\\Microsoft.Build.csproj > Properties:prop]",
|
||||||
|
results: {
|
||||||
file: 'S:\\Msbuild\\src\\Build\\Evaluation\\ExpressionShredder.cs',
|
file: 'S:\\Msbuild\\src\\Build\\Evaluation\\ExpressionShredder.cs',
|
||||||
line: '33',
|
line: '33',
|
||||||
|
column: '7',
|
||||||
severity: 'error',
|
severity: 'error',
|
||||||
code: 'CS1003',
|
code: 'CS1003',
|
||||||
message: "Syntax error, ',' expected",
|
message: "Syntax error, ',' expected",
|
||||||
fromPath:
|
fromPath:
|
||||||
'S:\\msbuild\\src\\Build\\Microsoft.Build.csproj > Properties:prop'
|
'S:\\msbuild\\src\\Build\\Microsoft.Build.csproj > Properties:prop'
|
||||||
}
|
}
|
||||||
];
|
},
|
||||||
|
{
|
||||||
|
// `dotnet format` style error
|
||||||
|
input:
|
||||||
|
'C:\\actions-runner\\_work\\Some\\Folder\\SomeFile.cs(222,8): error WHITESPACE: Fix whitespace formatting. Delete 1 characters. [C:\\actions-runner\\_work\\Some\\Folder\\SomeProject.csproj]',
|
||||||
|
results: {
|
||||||
|
file: 'C:\\actions-runner\\_work\\Some\\Folder\\SomeFile.cs',
|
||||||
|
line: '222',
|
||||||
|
column: '8',
|
||||||
|
severity: 'error',
|
||||||
|
code: 'WHITESPACE',
|
||||||
|
message: 'Fix whitespace formatting. Delete 1 characters.',
|
||||||
|
fromPath: 'C:\\actions-runner\\_work\\Some\\Folder\\SomeProject.csproj'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// CSC error with whitespace prefix
|
||||||
|
input:
|
||||||
|
' /Volumes/Code/ghe_actions-2.301.1/Some/Folder/SomeFile.cs(10,8): error CS1014: A get or set accessor expected [/Volumes/Code/ghe_actions-2.301.1/Some/Folder/SomeProject.csproj]',
|
||||||
|
results: {
|
||||||
|
file: '/Volumes/Code/ghe_actions-2.301.1/Some/Folder/SomeFile.cs',
|
||||||
|
line: '10',
|
||||||
|
column: '8',
|
||||||
|
severity: 'error',
|
||||||
|
code: 'CS1014',
|
||||||
|
message: 'A get or set accessor expected',
|
||||||
|
fromPath:
|
||||||
|
'/Volumes/Code/ghe_actions-2.301.1/Some/Folder/SomeProject.csproj'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
// CSC error with MSBuild prefix
|
||||||
|
input:
|
||||||
|
' 20>C:\\actions-runner\\_work\\Some\\Folder\\SomeFile.cs(8,2): error CS1014: A get or set accessor expected [C:\\actions-runner\\_work\\Some\\Folder\\SomeProject.csproj]',
|
||||||
|
results: {
|
||||||
|
file: 'C:\\actions-runner\\_work\\Some\\Folder\\SomeFile.cs',
|
||||||
|
line: '8',
|
||||||
|
column: '2',
|
||||||
|
severity: 'error',
|
||||||
|
code: 'CS1014',
|
||||||
|
message: 'A get or set accessor expected',
|
||||||
|
fromPath: 'C:\\actions-runner\\_work\\Some\\Folder\\SomeProject.csproj'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
stringsToMatch.map((string, index) => {
|
test.each(testCases)(
|
||||||
const matchedResultsArray = string.match(regex);
|
'regex matches and parses: $input',
|
||||||
for (const propName in expectedResults[index]) {
|
({input, results}: {input: string; results: Record<string, string>}) => {
|
||||||
|
const matchedResultsArray = input.match(regex);
|
||||||
|
expect(matchedResultsArray).not.toBeNull();
|
||||||
|
|
||||||
|
for (const propName in results) {
|
||||||
const propertyIndex = regexResultsMap[propName];
|
const propertyIndex = regexResultsMap[propName];
|
||||||
const expectedPropValue = expectedResults[index][propName];
|
const expectedPropValue = results[propName];
|
||||||
const matchedPropValue = matchedResultsArray![propertyIndex];
|
const matchedPropValue = matchedResultsArray![propertyIndex];
|
||||||
expect(matchedPropValue).toEqual(expectedPropValue);
|
expect(matchedPropValue).toEqual(expectedPropValue);
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
}, 10000);
|
10000
|
||||||
|
);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user