Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow pass in custom arguments to shouldSupportInterfaces test helper #5350

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions test/helpers/iterate.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,12 @@ module.exports = {

// ================================================ Object helpers =================================================

// Create a new object by mapping the values through a function, keeping the keys
// Create a new object by mapping the values through a function, keeping the keys. Second function can be used to pre-filter entries
// Example: mapValues({a:1,b:2,c:3}, x => x**2) → {a:1,b:4,c:9}
mapValues: (obj, fn) => Object.fromEntries(Object.entries(obj).map(([k, v]) => [k, fn(v)])),
mapValues: (obj, fn, fn2 = () => true) =>
Object.fromEntries(
Object.entries(obj)
.filter(fn2)
.map(([k, v]) => [k, fn(v)]),
),
};
14 changes: 9 additions & 5 deletions test/utils/introspection/SupportsInterface.behavior.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,10 @@ const SIGNATURES = {

const INTERFACE_IDS = mapValues(SIGNATURES, interfaceId);

function shouldSupportInterfaces(interfaces = []) {
function shouldSupportInterfaces(interfaces = [], signatures = SIGNATURES) {
interfaces.unshift('ERC165');
signatures.ERC165 = SIGNATURES.ERC165;
const interfaceIds = mapValues(signatures, interfaceId, ([name]) => interfaces.includes(name));

describe('ERC165', function () {
beforeEach(function () {
Expand All @@ -103,14 +105,14 @@ function shouldSupportInterfaces(interfaces = []) {
describe('when the interfaceId is supported', function () {
it('uses less than 30k gas', async function () {
for (const k of interfaces) {
const interfaceId = INTERFACE_IDS[k] ?? k;
const interfaceId = interfaceIds[k] ?? k;
expect(await this.contractUnderTest.supportsInterface.estimateGas(interfaceId)).to.lte(30_000n);
}
});

it('returns true', async function () {
for (const k of interfaces) {
const interfaceId = INTERFACE_IDS[k] ?? k;
const interfaceId = interfaceIds[k] ?? k;
expect(await this.contractUnderTest.supportsInterface(interfaceId), `does not support ${k}`).to.be.true;
}
});
Expand All @@ -129,10 +131,10 @@ function shouldSupportInterfaces(interfaces = []) {
it('all interface functions are in ABI', async function () {
for (const k of interfaces) {
// skip interfaces for which we don't have a function list
if (SIGNATURES[k] === undefined) continue;
if (signatures[k] === undefined) continue;

// Check the presence of each function in the contract's interface
for (const fnSig of SIGNATURES[k]) {
for (const fnSig of signatures[k]) {
expect(this.contractUnderTest.interface.hasFunction(fnSig), `did not find ${fnSig}`).to.be.true;
}
}
Expand All @@ -141,5 +143,7 @@ function shouldSupportInterfaces(interfaces = []) {
}

module.exports = {
SIGNATURES,
INTERFACE_IDS,
shouldSupportInterfaces,
};
Loading