diff --git a/packages/istanbul-reports/lib/html/annotator.js b/packages/istanbul-reports/lib/html/annotator.js index be8a4534..84d8fc39 100644 --- a/packages/istanbul-reports/lib/html/annotator.js +++ b/packages/istanbul-reports/lib/html/annotator.js @@ -164,6 +164,22 @@ function annotateBranches(fileCoverage, structuredText) { gt; closeSpan = lt + '/span' + gt; + // If the branch is an implicit else from an if statement, + // then the coverage report won't show a statistic. + // Therefore, the previous branch will be used to report that + // there is no coverage on that implicit branch. + if ( + count === 0 && + startLine === undefined && + branchMeta[branchName].type === 'if' + ) { + const prevMeta = metaArray[i - 1]; + startCol = prevMeta.start.column; + endCol = prevMeta.end.column + 1; + startLine = prevMeta.start.line; + endLine = prevMeta.end.line; + } + if (count === 0 && structuredText[startLine]) { //skip branches taken if (endLine !== startLine) { diff --git a/packages/istanbul-reports/test/fixtures/github-649.json b/packages/istanbul-reports/test/fixtures/github-649.json new file mode 100644 index 00000000..078b36fa --- /dev/null +++ b/packages/istanbul-reports/test/fixtures/github-649.json @@ -0,0 +1,127 @@ +{ + "path": "/Users/benjamincoe/bcoe/istanbul-lib-instrument/src/index.js", + "statementMap": { + "0": { + "start": { + "line": 1, + "column": 0 + }, + "end": { + "line": 9, + "column": 2 + } + }, + "1": { + "start": { + "line": 2, + "column": 10 + }, + "end": { + "line": 2, + "column": 11 + } + }, + "2": { + "start": { + "line": 4, + "column": 4 + }, + "end": { + "line": 6, + "column": 5 + } + }, + "3": { + "start": { + "line": 5, + "column": 6 + }, + "end": { + "line": 5, + "column": 12 + } + }, + "4": { + "start": { + "line": 8, + "column": 4 + }, + "end": { + "line": 8, + "column": 13 + } + } + }, + "fnMap": { + "0": { + "name": "(anonymous_0)", + "decl": { + "start": { + "line": 1, + "column": 16 + }, + "end": { + "line": 1, + "column": 17 + } + }, + "loc": { + "start": { + "line": 1, + "column": 28 + }, + "end": { + "line": 9, + "column": 1 + } + }, + "line": 1 + } + }, + "branchMap": { + "0": { + "loc": { + "start": { + "line": 4, + "column": 4 + }, + "end": { + "line": 6, + "column": 5 + } + }, + "type": "if", + "locations": [{ + "start": { + "line": 4, + "column": 4 + }, + "end": { + "line": 6, + "column": 5 + } + }, { + "start": { + }, + "end": { + } + } + ], + "line": 4 + } + }, + "s": { + "0": 1, + "1": 1, + "2": 1, + "3": 1, + "4": 1 + }, + "f": { + "0": 1 + }, + "b": { + "0": [1, 0] + }, + "hash": "edc1f904dd2d4c7214941451a07aabfc0aee6ec0" +} diff --git a/packages/istanbul-reports/test/html/annotator.js b/packages/istanbul-reports/test/html/annotator.js index 78cc5331..b55b072b 100644 --- a/packages/istanbul-reports/test/html/annotator.js +++ b/packages/istanbul-reports/test/html/annotator.js @@ -81,5 +81,25 @@ describe('annotator', () => { ' function test () {};' ); }); + + // see: https://github.com/istanbuljs/istanbuljs/issues/649 + it('handles implicit else branches', () => { + const annotated = annotator(getFixture('github-649'), { + getSource() { + return `exports.testy = function () { + let a = 0; + + if (!a) { + a = 3; + } + + return a; + };`; + } + }); + annotated.annotatedCode[3].should.equal( + ' E if (!a) {' + ); + }); }); });