diff --git a/lib/modules/coverage/contract_source.js b/lib/modules/coverage/contract_source.js index 23de91bb..9171d92c 100644 --- a/lib/modules/coverage/contract_source.js +++ b/lib/modules/coverage/contract_source.js @@ -1,5 +1,3 @@ -const util = require('util'); - const SourceMap = require('./source_map'); class ContractSource { @@ -99,7 +97,7 @@ class ContractSource { } } - /*eslint complexity: ["error", 27]*/ + /*eslint complexity: ["error", 34]*/ generateCodeCoverage(trace) { if(!this.ast || !this.contractBytecode) throw new Error('Error generating coverage: solc output was not assigned'); @@ -135,7 +133,7 @@ class ContractSource { // We don't need to do anything with these. Just carry on. break; - case 'IfStatement': + case 'IfStatement': { location = this.sourceMapToLocations(node.src); let trueBranchLocation = this.sourceMapToLocations(node.trueBody.src); @@ -173,10 +171,12 @@ class ContractSource { sourceMapToNodeType[node.src] = [{type: 'b', id: node.id, body: {loc: location}}]; break; + } - case 'EmitStatement': + case 'EmitStatement': { children = [node.eventCall]; break; + } case 'BinaryOperation': case 'ExpressionStatement': @@ -235,7 +235,7 @@ class ContractSource { markLocations = [location]; break; - case 'ForStatement': + case 'ForStatement': { // For statements will be a bit of a special case. We want to count the body // iterations but we only want to count the for loop being hit once. Because // of this, we cover the initialization on the node. @@ -255,8 +255,9 @@ class ContractSource { children = node.body.statements; markLocations = [initializationLocation]; break; + } - case 'VariableDeclarationStatement': + case 'VariableDeclarationStatement': { location = this.sourceMapToLocations(node.src); coverage.s[node.id] = 0; @@ -267,6 +268,7 @@ class ContractSource { sourceMapToNodeType[node.src].push({type: 's', id: node.id, body: {loc: location}, foo: 'bar'}); break; + } default: console.log(`Don't know how to handle node type ${node.nodeType}`); diff --git a/lib/modules/coverage/source_map.js b/lib/modules/coverage/source_map.js index 35696093..119d69ea 100644 --- a/lib/modules/coverage/source_map.js +++ b/lib/modules/coverage/source_map.js @@ -33,8 +33,8 @@ class SourceMap { let [offset, length, id, jump] = sourceMapString.split(":"); - (offset == '') ? offset = this.offset : offset = parseInt(offset, 10); - (id == '' || id == undefined) ? id = this.id : id = parseInt(id, 10); + offset = (offset == '') ? this.offset : parseInt(offset, 10); + id = (id == '' || id == undefined) ? this.id : parseInt(id, 10); length = parseInt(length, 10); return new SourceMap(offset, length, id, jump); @@ -48,7 +48,7 @@ class SourceMap { let parts = [this.offset, this.length]; if(this.id !== undefined && this.id != '') { - parts.push(this.id) + parts.push(this.id); } else if(defaultId !== undefined) { parts.push(defaultId); } diff --git a/test/coverage.js b/test/coverage.js index b6db6607..88a4e460 100644 --- a/test/coverage.js +++ b/test/coverage.js @@ -41,7 +41,7 @@ describe('ContractSources', () => { it('should throw an error when the file does not exist', (done) => { assert.throws(() => { new ContractSources(['fixtures/404.sol']); - }, 'Error loading fixtures/404.sol: ENOENT'); + }, "ENOENT: no such file or directory, open 'fixtures/404.sol'"); done(); }); @@ -162,10 +162,10 @@ contract x { var bytecode = contractSource.contractBytecode['x']; - assert.deepEqual({instruction: 'PUSH1', sourceMap: {offset: 26, length: 487, id: 0}, seen: false}, bytecode[0]); - assert.deepEqual({instruction: 'PUSH1', sourceMap: SourceMap.empty(), seen: false}, bytecode[2]); - assert.deepEqual({instruction: 'MSTORE', sourceMap: SourceMap.empty(), seen: false}, bytecode[4]); - assert.deepEqual({instruction: 'PUSH1', sourceMap: SourceMap.empty(), seen: false}, bytecode[5]); + assert.deepEqual({instruction: 'PUSH1', sourceMap: {offset: 26, length: 487, id: 0, jump: '-'}, jump: '-', seen: false}, bytecode[0]); + assert.deepEqual({instruction: 'PUSH1', sourceMap: SourceMap.empty(), seen: false, jump: undefined}, bytecode[2]); + assert.deepEqual({instruction: 'MSTORE', sourceMap: SourceMap.empty(), seen: false, jump: undefined}, bytecode[4]); + assert.deepEqual({instruction: 'PUSH1', sourceMap: SourceMap.empty(), seen: false, jump: undefined}, bytecode[5]); done(); }); @@ -213,8 +213,8 @@ contract x { // In the fixture, the branch has an ID of 61, and the function has the // ID of 63 - assert.deepEqual([1,1], coverage.b['61']); - assert.equal(4, coverage.f['63']); + assert.deepEqual([1,0], coverage.b['61']); + assert.equal(6, coverage.f['63']); done(); });