|
|
|
@ -0,0 +1,110 @@ |
|
|
|
|
/* eslint-env node, mocha */ |
|
|
|
|
|
|
|
|
|
const path = require('path'); |
|
|
|
|
const getInstrumentedVersion = require('./../lib/instrumentSolidity.js'); |
|
|
|
|
const util = require('./util/util.js'); |
|
|
|
|
const CoverageMap = require('./../lib/coverageMap'); |
|
|
|
|
const vm = require('./util/vm'); |
|
|
|
|
const assert = require('assert'); |
|
|
|
|
|
|
|
|
|
describe('asserts and requires', () => { |
|
|
|
|
const filePath = path.resolve('./test.sol'); |
|
|
|
|
const pathPrefix = './'; |
|
|
|
|
|
|
|
|
|
it('should cover assert statements as if they are if statements when they pass', done => { |
|
|
|
|
const contract = util.getCode('assert/Assert.sol'); |
|
|
|
|
const info = getInstrumentedVersion(contract, filePath); |
|
|
|
|
const coverage = new CoverageMap(); |
|
|
|
|
coverage.addContract(info, filePath); |
|
|
|
|
|
|
|
|
|
vm.execute(info.contract, 'a', [true]).then(events => { |
|
|
|
|
const mapping = coverage.generate(events, pathPrefix); |
|
|
|
|
assert.deepEqual(mapping[filePath].l, { |
|
|
|
|
5: 1, |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].b, { |
|
|
|
|
1: [1, 0], |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].s, { |
|
|
|
|
1: 1, |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].f, { |
|
|
|
|
1: 1, |
|
|
|
|
}); |
|
|
|
|
done(); |
|
|
|
|
}).catch(done); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('should cover assert statements as if they are if statements when they fail', done => { |
|
|
|
|
const contract = util.getCode('assert/Assert.sol'); |
|
|
|
|
const info = getInstrumentedVersion(contract, filePath); |
|
|
|
|
const coverage = new CoverageMap(); |
|
|
|
|
coverage.addContract(info, filePath); |
|
|
|
|
|
|
|
|
|
vm.execute(info.contract, 'a', [false]).then(events => { |
|
|
|
|
const mapping = coverage.generate(events, pathPrefix); |
|
|
|
|
assert.deepEqual(mapping[filePath].l, { |
|
|
|
|
5: 1, |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].b, { |
|
|
|
|
1: [0, 1], |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].s, { |
|
|
|
|
1: 1, |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].f, { |
|
|
|
|
1: 1, |
|
|
|
|
}); |
|
|
|
|
done(); |
|
|
|
|
}).catch(done); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('should cover multi-line require statements as if they are if statements when they pass', done => { |
|
|
|
|
const contract = util.getCode('assert/RequireMultiline.sol'); |
|
|
|
|
const info = getInstrumentedVersion(contract, filePath); |
|
|
|
|
const coverage = new CoverageMap(); |
|
|
|
|
coverage.addContract(info, filePath); |
|
|
|
|
|
|
|
|
|
vm.execute(info.contract, 'a', [true, true, true]).then(events => { |
|
|
|
|
const mapping = coverage.generate(events, pathPrefix); |
|
|
|
|
assert.deepEqual(mapping[filePath].l, { |
|
|
|
|
5: 1, |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].b, { |
|
|
|
|
1: [1, 0], |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].s, { |
|
|
|
|
1: 1, |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].f, { |
|
|
|
|
1: 1, |
|
|
|
|
}); |
|
|
|
|
done(); |
|
|
|
|
}).catch(done); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
it('should cover multi-line require statements as if they are if statements when they fail', done => { |
|
|
|
|
const contract = util.getCode('assert/RequireMultiline.sol'); |
|
|
|
|
const info = getInstrumentedVersion(contract, filePath); |
|
|
|
|
const coverage = new CoverageMap(); |
|
|
|
|
coverage.addContract(info, filePath); |
|
|
|
|
|
|
|
|
|
vm.execute(info.contract, 'a', [true, true, false]).then(events => { |
|
|
|
|
const mapping = coverage.generate(events, pathPrefix); |
|
|
|
|
assert.deepEqual(mapping[filePath].l, { |
|
|
|
|
5: 1, |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].b, { |
|
|
|
|
1: [0, 1], |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].s, { |
|
|
|
|
1: 1, |
|
|
|
|
}); |
|
|
|
|
assert.deepEqual(mapping[filePath].f, { |
|
|
|
|
1: 1, |
|
|
|
|
}); |
|
|
|
|
done(); |
|
|
|
|
}).catch(done); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
}); |