From 1c1186af1c547277cb06797a4ec631658b143028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ernesto=20Garc=C3=ADa?= Date: Tue, 10 Dec 2024 11:47:32 -0600 Subject: [PATCH] Allow pass in custom arguments to `shouldSupportInterfaces` test helper (#5350) Co-authored-by: Hadrien Croubois --- test/helpers/iterate.js | 9 +++++++-- .../introspection/SupportsInterface.behavior.js | 14 +++++++++----- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/test/helpers/iterate.js b/test/helpers/iterate.js index c7403d523..8c8e9649d 100644 --- a/test/helpers/iterate.js +++ b/test/helpers/iterate.js @@ -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)]), + ), }; diff --git a/test/utils/introspection/SupportsInterface.behavior.js b/test/utils/introspection/SupportsInterface.behavior.js index 8a7bc4b5e..78f6ddba5 100644 --- a/test/utils/introspection/SupportsInterface.behavior.js +++ b/test/utils/introspection/SupportsInterface.behavior.js @@ -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 () { @@ -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; } }); @@ -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; } } @@ -141,5 +143,7 @@ function shouldSupportInterfaces(interfaces = []) { } module.exports = { + SIGNATURES, + INTERFACE_IDS, shouldSupportInterfaces, };