-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Description
Component
Forge
Describe the feature you would like
Table tests are a way to generate test cases based on a dataset of parameters (the table), enabling code reuse in tests that use the same assertions but with predefined data. An example of a table test can be found here.
There are a few ways to go about this (after brainstorming with @gakonst) these seem like the most viable options:
Setup/run functions
This approach uses a setUpTable*
function that returns the table with testdata and a testTable*
that runs assertions on each entry in the table. Due to constraints with Solidity (again) the UX is going to suck a bit:
function setUpTableSums() public returns (bytes[] memory) {
bytes[] memory entries = new bytes[](2);
entries[0] = abi.encode(1, 2, 3);
entries[1] = abi.encode(4, 5, 9);
}
function testTableSums(uint256 a, uint256 b, uint256 expected) public {
assertEq(a + b, expected);
}
The setUpTable
functions are called once during setup and the table is stored in-memory. The testTable
function is then called in parallel with each entry in the table. If an entry fails we should mark the table test as a failure and provide some info on what entries failed.
The setUpTable
functions returns an array of bytes: each entry in this array is calldata we pass directly to the table test function by prepending the signature of the table test function.
Pros:
- Solidity-only
Cons:
- Uses ABI encode
External files
Same as above, but the table is in a file named after some convention. Each entry is ABI encoded and then passed to the table test function
Pros:
- No ABI encode
Cons:
- Uses external files
Additional context
No response
Metadata
Metadata
Assignees
Labels
Type
Projects
Status