mud test
This command runs the tests in a MUD project. Internally, it runs the following steps:
- Starts an
anvil(opens in a new tab) instance. - Deploys the
Worldand all relatedSystems usingmud deploy. - Runs tests using
forge test(opens in a new tab) and passes the deployed world address to the tests via theWORLD_ADDRESSenvironment variable.
Command line options
| Option | Meaning | Type | Default value |
|---|---|---|---|
--version | Show version number | boolean | false |
--configPath | Path to the config file | string | mud.config.ts |
--printConfig | Print the resolved config | boolean | false |
--saveDeployment | Save the deployment info to a file | boolean | true |
--profile | The foundry profile to use | string | local |
--srcDir | Source directory | string | Foundry src directory |
--skipBuild | Skip rebuilding the contracts before deploying | boolean | false |
--alwaysRunPostDeploy | Run PostDeploy.s.sol after each deploy | boolean | false (run the script only when deploying a new World) |
--port | Port for the testing anvil instance | number | 4242 |
--help | Show help | boolean | false |
Examples
pnpm mud testWriting MUD tests
MUD test contracts inherit from MudTest (opens in a new tab).
This contract gets the World address from the $WORLD_ADDRESS environment variable and sets it as the Store address.
Line by line explanation of a test
This is an explanation of the test (opens in a new tab) for the React template (opens in a new tab) contracts.
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.21;
import "forge-std/Test.sol";
import { MudTest } from "@latticexyz/world/test/MudTest.t.sol";Import the general definitions required in all MUD tests.
import { IWorld } from "../src/codegen/world/IWorld.sol";
import { Tasks, TasksData } from "../src/codegen/index.sol";Import the definitions required for this test, the World we can access and the tables we'll use.
contract TasksTest is MudTest {
function testWorldExists() public {MUD tests are Foundry tests (opens in a new tab).
Any public function that starts with test is a test that gets executed.
uint256 codeSize;
address addr = worldAddress;The World address comes from the MudTest (opens in a new tab).
assembly {
codeSize := extcodesize(addr)
}
assertTrue(codeSize > 0);
}Use extcodesize (opens in a new tab) to get the size of the World contract.
If the deploy process failed, there wouldn't be any code there.
function testTasks() public {
// Expect task to exist that we created during PostDeploy script
TasksData memory task = Tasks.get("1");Use the structure for a table entry's values that is created as part of code generation.
assertEq(task.description, "Walk the dog");
assertEq(task.completedAt, 0);Verify the information that is prepopulated by the PostDeploy.s.sol script (opens in a new tab).
// Expect the task to be completed after calling completeTask from our TasksSystem
IWorld(worldAddress).completeTask("1");Call a System to modify the table data.
assertEq(Tasks.getCompletedAt("1"), block.timestamp);
}
}Verify that the call changed the data correctly.