소스 검색

Allow pass in custom arguments to `shouldSupportInterfaces` test helper (#5350)

Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
Ernesto García 10 달 전
부모
커밋
1c1186af1c
2개의 변경된 파일16개의 추가작업 그리고 7개의 파일을 삭제
  1. 7 2
      test/helpers/iterate.js
  2. 9 5
      test/utils/introspection/SupportsInterface.behavior.js

+ 7 - 2
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)]),
+    ),
 };

+ 9 - 5
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,
 };