Skip to content

Commit

Permalink
Improve customError testing (#4376)
Browse files Browse the repository at this point in the history
  • Loading branch information
Amxx authored Jun 20, 2023
1 parent b66c77a commit dac2457
Showing 1 changed file with 36 additions and 35 deletions.
71 changes: 36 additions & 35 deletions test/helpers/customError.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,42 +2,43 @@ const { expect } = require('chai');

/** Revert handler that supports custom errors. */
async function expectRevertCustomError(promise, expectedErrorName, args) {
try {
await promise;
expect.fail("Expected promise to throw but it didn't");
} catch (revert) {
if (!Array.isArray(args)) {
expect.fail('Expected 3rd array parameter for error arguments');
}
// The revert message for custom errors looks like:
// VM Exception while processing transaction:
// reverted with custom error 'InvalidAccountNonce("0x70997970C51812dc3A010C7d01b50e0d17dc79C8", 0)'

// We trim out anything inside the single quotes as comma-separated values
const [, error] = revert.message.match(/'(.*)'/);

// Attempt to parse as an error
const match = error.match(/(?<name>\w+)\((?<args>.*)\)/);
if (!match) {
expect.fail(`Couldn't parse "${error}" as a custom error`);
}
// Extract the error name and parameters
const errorName = match.groups.name;
const argMatches = [...match.groups.args.matchAll(/-?\w+/g)];

// Assert error name
expect(errorName).to.be.equal(
expectedErrorName,
`Unexpected custom error name (with found args: [${argMatches.map(([a]) => a)}])`,
);

// Coerce to string for comparison since `arg` can be either a number or hex.
const sanitizedExpected = args.map(arg => arg.toString().toLowerCase());
const sanitizedActual = argMatches.map(([arg]) => arg.toString().toLowerCase());

// Assert argument equality
expect(sanitizedActual).to.have.members(sanitizedExpected, `Unexpected ${errorName} arguments`);
if (!Array.isArray(args)) {
expect.fail('Expected 3rd array parameter for error arguments');
}

await promise.then(
() => expect.fail("Expected promise to throw but it didn't"),
({ message }) => {
// The revert message for custom errors looks like:
// VM Exception while processing transaction:
// reverted with custom error 'InvalidAccountNonce("0x70997970C51812dc3A010C7d01b50e0d17dc79C8", 0)'

// We trim out anything inside the single quotes as comma-separated values
const [, error] = message.match(/'(.*)'/);

// Attempt to parse as an error
const match = error.match(/(?<name>\w+)\((?<args>.*)\)/);
if (!match) {
expect.fail(`Couldn't parse "${error}" as a custom error`);
}
// Extract the error name and parameters
const errorName = match.groups.name;
const argMatches = [...match.groups.args.matchAll(/-?\w+/g)];

// Assert error name
expect(errorName).to.be.equal(
expectedErrorName,
`Unexpected custom error name (with found args: [${argMatches.map(([a]) => a)}])`,
);

// Coerce to string for comparison since `arg` can be either a number or hex.
const sanitizedExpected = args.map(arg => arg.toString().toLowerCase());
const sanitizedActual = argMatches.map(([arg]) => arg.toString().toLowerCase());

// Assert argument equality
expect(sanitizedActual).to.have.members(sanitizedExpected, `Unexpected ${errorName} arguments`);
},
);
}

module.exports = {
Expand Down

0 comments on commit dac2457

Please sign in to comment.