First test helpers tests (#1369)
* Removed unused advanceToBlock.
* Added advanceBlock tests.
* Fixed advanceToBlock tests.
* Added single argument tests.
* Finished inLogs tests.
* Fixed linter errors.
* Fixed linter errors.
(cherry picked from commit 9f822906b8)
This commit is contained in:
committed by
Leo Arias
parent
7ec6079784
commit
10a5864fdf
62
contracts/mocks/EventEmitter.sol
Normal file
62
contracts/mocks/EventEmitter.sol
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
pragma solidity ^0.4.24;
|
||||||
|
|
||||||
|
contract EventEmitter {
|
||||||
|
event Argumentless();
|
||||||
|
event ShortUint(uint8 value);
|
||||||
|
event ShortInt(int8 value);
|
||||||
|
event LongUint(uint256 value);
|
||||||
|
event LongInt(int256 value);
|
||||||
|
event Address(address value);
|
||||||
|
event Boolean(bool value);
|
||||||
|
event String(string value);
|
||||||
|
event LongUintBooleanString(
|
||||||
|
uint256 uintValue,
|
||||||
|
bool booleanValue,
|
||||||
|
string stringValue
|
||||||
|
);
|
||||||
|
|
||||||
|
function emitArgumentless() public {
|
||||||
|
emit Argumentless();
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitShortUint(uint8 value) public {
|
||||||
|
emit ShortUint(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitShortInt(int8 value) public {
|
||||||
|
emit ShortInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitLongUint(uint256 value) public {
|
||||||
|
emit LongUint(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitLongInt(int256 value) public {
|
||||||
|
emit LongInt(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitAddress(address value) public {
|
||||||
|
emit Address(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitBoolean(bool value) public {
|
||||||
|
emit Boolean(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitString(string value) public {
|
||||||
|
emit String(value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitLongUintBooleanString(
|
||||||
|
uint256 uintValue,
|
||||||
|
bool booleanValue,
|
||||||
|
string stringValue)
|
||||||
|
public {
|
||||||
|
emit LongUintBooleanString(uintValue, booleanValue, stringValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
function emitLongUintAndBoolean(uint256 uintValue, bool boolValue) public {
|
||||||
|
emit LongUint(uintValue);
|
||||||
|
emit Boolean(boolValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -10,18 +10,6 @@ function advanceBlock () {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
// Advances the block number so that the last mined block is `number`.
|
|
||||||
async function advanceToBlock (number) {
|
|
||||||
if (web3.eth.blockNumber > number) {
|
|
||||||
throw Error(`block number ${number} is in the past (current is ${web3.eth.blockNumber})`);
|
|
||||||
}
|
|
||||||
|
|
||||||
while (web3.eth.blockNumber < number) {
|
|
||||||
await advanceBlock();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
advanceBlock,
|
advanceBlock,
|
||||||
advanceToBlock,
|
|
||||||
};
|
};
|
||||||
|
|||||||
19
test/helpers/test/advanceToBlock.test.js
Normal file
19
test/helpers/test/advanceToBlock.test.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
const advanceToBlock = require('../advanceToBlock');
|
||||||
|
|
||||||
|
const BigNumber = web3.BigNumber;
|
||||||
|
require('chai')
|
||||||
|
.use(require('chai-bignumber')(BigNumber))
|
||||||
|
.should();
|
||||||
|
|
||||||
|
describe('advanceToBlock', function () {
|
||||||
|
beforeEach(function () {
|
||||||
|
this.startingBlock = web3.eth.blockNumber;
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('advanceBlock', function () {
|
||||||
|
it('increases the block number by one', async function () {
|
||||||
|
await advanceToBlock.advanceBlock();
|
||||||
|
web3.eth.blockNumber.should.be.bignumber.equal(this.startingBlock + 1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
232
test/helpers/test/expectEvent.test.js
Normal file
232
test/helpers/test/expectEvent.test.js
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
const expectEvent = require('../expectEvent');
|
||||||
|
const EventEmitter = artifacts.require('EventEmitter');
|
||||||
|
|
||||||
|
const BigNumber = web3.BigNumber;
|
||||||
|
const should = require('chai')
|
||||||
|
.use(require('chai-bignumber')(BigNumber))
|
||||||
|
.should();
|
||||||
|
|
||||||
|
describe('expectEvent', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
this.emitter = await EventEmitter.new();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('inLogs', function () {
|
||||||
|
describe('with no arguments', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
({ logs: this.logs } = await this.emitter.emitArgumentless());
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts emitted events', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'Argumentless');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an unemitted event is requested', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'UnemittedEvent'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with single argument', function () {
|
||||||
|
context('short uint value', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
this.value = 42;
|
||||||
|
({ logs: this.logs } = await this.emitter.emitShortUint(this.value));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts emitted events with correct JavaScript number', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'ShortUint', { value: this.value });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts emitted events with correct BigNumber', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'ShortUint', { value: new BigNumber(this.value) });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an unemitted event is requested', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'UnemittedEvent', { value: this.value }));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an incorrect value is passed', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'ShortUint', { value: 23 }));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('short int value', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
this.value = -42;
|
||||||
|
({ logs: this.logs } = await this.emitter.emitShortInt(this.value));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts emitted events with correct JavaScript number', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'ShortInt', { value: this.value });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts emitted events with correct BigNumber', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'ShortInt', { value: new BigNumber(this.value) });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an unemitted event is requested', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'UnemittedEvent', { value: this.value }));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an incorrect value is passed', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'ShortInt', { value: -23 }));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('long uint value', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
this.bigNumValue = new BigNumber('123456789012345678901234567890');
|
||||||
|
({ logs: this.logs } = await this.emitter.emitLongUint(this.bigNumValue));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts emitted events with correct BigNumber', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'LongUint', { value: this.bigNumValue });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an unemitted event is requested', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'UnemittedEvent', { value: this.bigNumValue }));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an incorrect value is passed', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'LongUint', { value: 2300 }));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('long int value', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
this.bigNumValue = new BigNumber('-123456789012345678901234567890');
|
||||||
|
({ logs: this.logs } = await this.emitter.emitLongInt(this.bigNumValue));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts emitted events with correct BigNumber', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'LongInt', { value: this.bigNumValue });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an unemitted event is requested', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'UnemittedEvent', { value: this.bigNumValue }));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an incorrect value is passed', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'LongInt', { value: -2300 }));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('address value', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
this.value = '0x811412068e9fbf25dc300a29e5e316f7122b282c';
|
||||||
|
({ logs: this.logs } = await this.emitter.emitAddress(this.value));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts emitted events with correct address', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'Address', { value: this.value });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an unemitted event is requested', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'UnemittedEvent', { value: this.value }));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an incorrect value is passed', function () {
|
||||||
|
should.Throw(() =>
|
||||||
|
expectEvent.inLogs(this.logs, 'Address', { value: '0x21d04e022e0b52b5d5bcf90b7f1aabf406be002d' })
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('boolean value', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
this.value = true;
|
||||||
|
({ logs: this.logs } = await this.emitter.emitBoolean(this.value));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts emitted events with correct address', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'Boolean', { value: this.value });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an unemitted event is requested', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'UnemittedEvent', { value: this.value }));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an incorrect value is passed', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'Boolean', { value: false }));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('string value', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
this.value = 'OpenZeppelin';
|
||||||
|
({ logs: this.logs } = await this.emitter.emitString(this.value));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts emitted events with correct string', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'String', { value: this.value });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an unemitted event is requested', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'UnemittedEvent', { value: this.value }));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an incorrect value is passed', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'String', { value: 'ClosedZeppelin' }));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with multiple arguments', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
this.uintValue = new BigNumber('123456789012345678901234567890');
|
||||||
|
this.booleanValue = true;
|
||||||
|
this.stringValue = 'OpenZeppelin';
|
||||||
|
({ logs: this.logs } =
|
||||||
|
await this.emitter.emitLongUintBooleanString(this.uintValue, this.booleanValue, this.stringValue));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts correct values', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'LongUintBooleanString', {
|
||||||
|
uintValue: this.uintValue, booleanValue: this.booleanValue, stringValue: this.stringValue,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws with correct values assigned to wrong arguments', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'LongUintBooleanString', {
|
||||||
|
uintValue: this.booleanValue, booleanValue: this.uintValue, stringValue: this.stringValue,
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws when any of the values is incorrect', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'LongUintBooleanString', {
|
||||||
|
uintValue: 23, booleanValue: this.booleanValue, stringValue: this.stringValue,
|
||||||
|
}));
|
||||||
|
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'LongUintBooleanString', {
|
||||||
|
uintValue: this.uintValue, booleanValue: false, stringValue: this.stringValue,
|
||||||
|
}));
|
||||||
|
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'LongUintBooleanString', {
|
||||||
|
uintValue: this.uintValue, booleanValue: this.booleanValue, stringValue: 'ClosedZeppelin',
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('with multiple events', function () {
|
||||||
|
beforeEach(async function () {
|
||||||
|
this.uintValue = 42;
|
||||||
|
this.booleanValue = true;
|
||||||
|
({ logs: this.logs } = await this.emitter.emitLongUintAndBoolean(this.uintValue, this.booleanValue));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('accepts all emitted events with correct values', function () {
|
||||||
|
expectEvent.inLogs(this.logs, 'LongUint', { value: this.uintValue });
|
||||||
|
expectEvent.inLogs(this.logs, 'Boolean', { value: this.booleanValue });
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if an unemitted event is requested', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'UnemittedEvent', { value: this.uintValue }));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws if incorrect values are passed', function () {
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'LongUint', { value: 23 }));
|
||||||
|
should.Throw(() => expectEvent.inLogs(this.logs, 'Boolean', { value: false }));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user