Skip to content

Commit e8f9096

Browse files
authored
fix empty coverage range issue (#1177)
1 parent f635a8e commit e8f9096

File tree

2 files changed

+44
-1
lines changed

2 files changed

+44
-1
lines changed

src/test-provider/test-coverage.ts

+18-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ export class JestFileCoverage extends vscode.FileCoverage {
2424
return this.iCoverage;
2525
}
2626

27+
private isInvalidRange = (range: Range): boolean =>
28+
range.start.line === undefined || range.end.line === undefined;
29+
2730
public loadDetails(): vscode.FileCoverageDetail[] {
2831
if (this.details) {
2932
return this.details;
@@ -40,9 +43,14 @@ export class JestFileCoverage extends vscode.FileCoverage {
4043
return statement.location.end.character;
4144
}
4245
};
46+
4347
// transform istanbul line number from 1-based to vscode 0-based
4448
// and replace null end-column with the end of line, if available
45-
const transformRange = (range: Range): vscode.Range => {
49+
const transformRange = (range: Range): vscode.Range | undefined => {
50+
if (this.isInvalidRange(range)) {
51+
return;
52+
}
53+
4654
const endColumn = range.end.column ?? getEOL(range.end.line) ?? range.start.column;
4755
return new vscode.Range(
4856
range.start.line - 1,
@@ -57,6 +65,9 @@ export class JestFileCoverage extends vscode.FileCoverage {
5765
Object.entries(transformed.statementMap).forEach(([statementId, range]) => {
5866
const executionCount = transformed.s[statementId];
5967
const vRange = transformRange(range);
68+
if (!vRange) {
69+
return;
70+
}
6071
const statementCoverage = new vscode.StatementCoverage(executionCount, vRange);
6172
details.push(statementCoverage);
6273
statementByLine[vRange.start.line] = statementCoverage;
@@ -67,6 +78,9 @@ export class JestFileCoverage extends vscode.FileCoverage {
6778
branch.locations.forEach((location, index) => {
6879
const branchExecutionCount = transformed.b[branchId][index];
6980
const vRange = transformRange(location);
81+
if (!vRange) {
82+
return;
83+
}
7084
const branchCoverage = new vscode.BranchCoverage(
7185
branchExecutionCount > 0,
7286
vRange,
@@ -83,6 +97,9 @@ export class JestFileCoverage extends vscode.FileCoverage {
8397
Object.entries(transformed.fnMap).forEach(([functionId, func]) => {
8498
const executionCount = transformed.f[functionId];
8599
const vRange = transformRange(func.loc);
100+
if (!vRange) {
101+
return;
102+
}
86103
details.push(new vscode.DeclarationCoverage(func.name, executionCount, vRange));
87104
});
88105
} catch (e) {

tests/test-provider/test-coverage.test.ts

+26
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,32 @@ describe('test-coverage', () => {
169169
expect(console.error).toHaveBeenCalled();
170170
console.error = saved;
171171
});
172+
describe('will skip empty ranges', () => {
173+
it('for statements', () => {
174+
fileCoverageMock = createFileCoverageMock();
175+
fileCoverageMock.statementMap['3'] = {
176+
start: {},
177+
end: {},
178+
};
179+
jestFileCoverage = new JestFileCoverage(fileCoverageMock);
180+
jestFileCoverage.loadDetails();
181+
expect(vscode.StatementCoverage).toHaveBeenCalledTimes(2);
182+
});
183+
it('for branches', () => {
184+
fileCoverageMock = createFileCoverageMock();
185+
fileCoverageMock.branchMap['1'].locations[1] = { start: {}, end: {} };
186+
jestFileCoverage = new JestFileCoverage(fileCoverageMock);
187+
jestFileCoverage.loadDetails();
188+
expect(vscode.BranchCoverage).toHaveBeenCalledTimes(1);
189+
});
190+
it('for functions', () => {
191+
fileCoverageMock = createFileCoverageMock();
192+
fileCoverageMock.fnMap['1'].loc = { start: {}, end: {} };
193+
jestFileCoverage = new JestFileCoverage(fileCoverageMock);
194+
jestFileCoverage.loadDetails();
195+
expect(vscode.DeclarationCoverage).toHaveBeenCalledTimes(0);
196+
});
197+
});
172198
});
173199
});
174200

0 commit comments

Comments
 (0)