Migrate utils/types/time tests to ethers.js (#4778)

Co-authored-by: Ernesto García <ernestognw@gmail.com>
This commit is contained in:
Hadrien Croubois
2023-12-15 17:50:46 +01:00
committed by GitHub
parent 88211e8fba
commit d155600d55

View File

@ -1,24 +1,22 @@
require('@openzeppelin/test-helpers'); const { ethers } = require('hardhat');
const { expect } = require('chai'); const { expect } = require('chai');
const { clock } = require('../../helpers/time'); const { loadFixture } = require('@nomicfoundation/hardhat-network-helpers');
const {
bigint: { clock },
} = require('../../helpers/time');
const { product } = require('../../helpers/iterate'); const { product } = require('../../helpers/iterate');
const { max } = require('../../helpers/math'); const { max } = require('../../helpers/math');
const Time = artifacts.require('$Time');
const MAX_UINT32 = 1n << (32n - 1n); const MAX_UINT32 = 1n << (32n - 1n);
const MAX_UINT48 = 1n << (48n - 1n); const MAX_UINT48 = 1n << (48n - 1n);
const SOME_VALUES = [0n, 1n, 2n, 15n, 16n, 17n, 42n]; const SOME_VALUES = [0n, 1n, 2n, 15n, 16n, 17n, 42n];
const asUint = (value, size) => { const asUint = (value, size) => {
if (typeof value != 'bigint') { value = ethers.toBigInt(value);
value = BigInt(value); size = ethers.toBigInt(size);
} expect(value).to.be.greaterThanOrEqual(0n, `value is not a valid uint${size}`);
// chai does not support bigint :/ expect(value).to.be.lessThan(1n << size, `value is not a valid uint${size}`);
if (value < 0 || value >= 1n << BigInt(size)) {
throw new Error(`value is not a valid uint${size}`);
}
return value; return value;
}; };
@ -40,18 +38,23 @@ const effectSamplesForTimepoint = timepoint => [
MAX_UINT48, MAX_UINT48,
]; ];
async function fixture() {
const mock = await ethers.deployContract('$Time');
return { mock };
}
contract('Time', function () { contract('Time', function () {
beforeEach(async function () { beforeEach(async function () {
this.mock = await Time.new(); Object.assign(this, await loadFixture(fixture));
}); });
describe('clocks', function () { describe('clocks', function () {
it('timestamp', async function () { it('timestamp', async function () {
expect(await this.mock.$timestamp()).to.be.bignumber.equal(web3.utils.toBN(await clock.timestamp())); expect(await this.mock.$timestamp()).to.equal(await clock.timestamp());
}); });
it('block number', async function () { it('block number', async function () {
expect(await this.mock.$blockNumber()).to.be.bignumber.equal(web3.utils.toBN(await clock.blocknumber())); expect(await this.mock.$blockNumber()).to.equal(await clock.blocknumber());
}); });
}); });
@ -63,28 +66,28 @@ contract('Time', function () {
const delay = 1272825341158973505578n; const delay = 1272825341158973505578n;
it('pack', async function () { it('pack', async function () {
const packed = await this.mock.$pack(valueBefore, valueAfter, effect); expect(await this.mock.$pack(valueBefore, valueAfter, effect)).to.equal(delay);
expect(packed).to.be.bignumber.equal(delay.toString()); expect(packDelay({ valueBefore, valueAfter, effect })).to.equal(delay);
const packed2 = packDelay({ valueBefore, valueAfter, effect });
expect(packed2).to.be.equal(delay);
}); });
it('unpack', async function () { it('unpack', async function () {
const unpacked = await this.mock.$unpack(delay); expect(await this.mock.$unpack(delay)).to.deep.equal([valueBefore, valueAfter, effect]);
expect(unpacked[0]).to.be.bignumber.equal(valueBefore.toString());
expect(unpacked[1]).to.be.bignumber.equal(valueAfter.toString());
expect(unpacked[2]).to.be.bignumber.equal(effect.toString());
const unpacked2 = unpackDelay(delay); expect(unpackDelay(delay)).to.deep.equal({
expect(unpacked2).to.be.deep.equal({ valueBefore, valueAfter, effect }); valueBefore,
valueAfter,
effect,
});
}); });
}); });
it('toDelay', async function () { it('toDelay', async function () {
for (const value of [...SOME_VALUES, MAX_UINT32]) { for (const value of [...SOME_VALUES, MAX_UINT32]) {
const delay = await this.mock.$toDelay(value).then(unpackDelay); expect(await this.mock.$toDelay(value).then(unpackDelay)).to.deep.equal({
expect(delay).to.be.deep.equal({ valueBefore: 0n, valueAfter: value, effect: 0n }); valueBefore: 0n,
valueAfter: value,
effect: 0n,
});
} }
}); });
@ -95,15 +98,14 @@ contract('Time', function () {
for (const effect of effectSamplesForTimepoint(timepoint)) { for (const effect of effectSamplesForTimepoint(timepoint)) {
const isPast = effect <= timepoint; const isPast = effect <= timepoint;
const delay = packDelay({ valueBefore, valueAfter, effect }); const delay = packDelay({ valueBefore, valueAfter, effect });
expect(await this.mock.$get(delay)).to.be.bignumber.equal(String(isPast ? valueAfter : valueBefore)); expect(await this.mock.$get(delay)).to.equal(isPast ? valueAfter : valueBefore);
expect(await this.mock.$getFull(delay)).to.deep.equal([
const result = await this.mock.$getFull(delay); isPast ? valueAfter : valueBefore,
expect(result[0]).to.be.bignumber.equal(String(isPast ? valueAfter : valueBefore)); isPast ? 0n : valueAfter,
expect(result[1]).to.be.bignumber.equal(String(isPast ? 0n : valueAfter)); isPast ? 0n : effect,
expect(result[2]).to.be.bignumber.equal(String(isPast ? 0n : effect)); ]);
} }
}); });
@ -119,22 +121,16 @@ contract('Time', function () {
const expectedvalueBefore = isPast ? valueAfter : valueBefore; const expectedvalueBefore = isPast ? valueAfter : valueBefore;
const expectedSetback = max(minSetback, expectedvalueBefore - newvalueAfter, 0n); const expectedSetback = max(minSetback, expectedvalueBefore - newvalueAfter, 0n);
const result = await this.mock.$withUpdate( expect(
packDelay({ valueBefore, valueAfter, effect }), await this.mock.$withUpdate(packDelay({ valueBefore, valueAfter, effect }), newvalueAfter, minSetback),
newvalueAfter, ).to.deep.equal([
minSetback, packDelay({
); valueBefore: expectedvalueBefore,
valueAfter: newvalueAfter,
expect(result[0]).to.be.bignumber.equal( effect: timepoint + expectedSetback,
String( }),
packDelay({ timepoint + expectedSetback,
valueBefore: expectedvalueBefore, ]);
valueAfter: newvalueAfter,
effect: timepoint + expectedSetback,
}),
),
);
expect(result[1]).to.be.bignumber.equal(String(timepoint + expectedSetback));
} }
}); });
}); });