Skip to content
Back to skills

Forge Testing

ASecurity

Foundry cheatcodes, assertions, and forge test CLI. Use for vm.prank, expectRevert, verbosity, and general Foundry mechanics. For Crane/IndexedEx protocol and Diamond tests, prefer crane-testing and production-first deploy paths over mocks.

  • 9 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 10, 2026
code-qualitybashtestingdebugging

Works with

  • cli

Security analysis

A100/100

Pro scans all 4 files and shows the line behind each finding

Scanned September 10, 2026

npx -y skills add cyotee/indexedex --skill forge-testing --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Forge Testing?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Forge Testing
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/cyotee-forge-testing/badge)](https://www.skillsdirectory.com/skills/cyotee-forge-testing)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: forge-testing
description: Foundry cheatcodes, assertions, and forge test CLI. Use for vm.prank, expectRevert, verbosity, and general Foundry mechanics. For Crane/IndexedEx protocol and Diamond tests, prefer crane-testing and production-first deploy paths over mocks.
---

# Forge Testing

Write native Solidity tests using Foundry's testing framework.

## Crane / IndexedEx note (read first)

In this monorepo, **prefer production contracts and factory/TestBase deploy paths**. Do not invent mocks for facets, DFPkgs, vaults, or managers.

- **Crane:** use `crane-testing` + inherit `CraneTest` (not `new` for production Crane contracts).
- **IndexedEx:** use `indexedex-testing` + `IndexedexTest` / protocol TestBases.
- This skill covers **Foundry mechanics** (cheatcodes, asserts, CLI). Its generic `new MyContract()` / mock examples are **not** the preferred pattern for Crane or IndexedEx features.

## When to Use

- Foundry cheatcodes, assertions, verbosity, CLI filters
- Debugging failing tests with traces
- Fork/select fork mechanics (combined with project TestBases)
- Not the primary skill for Diamond/DFPkg/vault test design — use `crane-testing` / `indexedex-testing`

## Quick Start (generic Foundry)

For Crane work, replace `new MyContract()` with factory/TestBase setup from `crane-testing`.

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {Test, console} from "forge-std/Test.sol";
import {MyContract} from "../src/MyContract.sol";

contract MyContractTest is Test {
    MyContract public target;

    function setUp() public {
        // Generic example only. Crane: inherit CraneTest + factories.
        target = new MyContract();
    }

    function test_BasicFunction() public {
        uint256 result = target.doSomething();
        assertEq(result, 42);
    }

    function testFail_ShouldRevert() public {
        target.functionThatReverts();
    }
}
```

## Test Naming Conventions

| Prefix | Behavior |
|--------|----------|
| `test_` or `test` | Expected to pass |
| `testFail_` or `testFail` | Expected to revert |
| `testFuzz_` | Fuzz test with random inputs |

## Running Tests

```bash
# Run all tests
forge test

# Run specific test contract
forge test --match-contract MyContractTest

# Run specific test function
forge test --match-test test_BasicFunction

# Run with verbosity (show logs)
forge test -vvv

# Watch mode
forge test --watch
```

## Verbosity Levels

| Flag | Output |
|------|--------|
| (none) | Summary only |
| `-vv` | Logs and assertion failures |
| `-vvv` | Stack traces for failures |
| `-vvvv` | Setup traces for failures |
| `-vvvvv` | All traces including setup |

## Essential Cheatcodes

See [cheatcodes.md](cheatcodes.md) for the complete reference.

### State Manipulation

```solidity
// Set caller for next call
vm.prank(address(0x123));

// Set caller for multiple calls
vm.startPrank(address(0x123));
// ... calls as 0x123
vm.stopPrank();

// Give ETH to address
vm.deal(address(0x123), 1 ether);

// Set block timestamp
vm.warp(block.timestamp + 1 days);

// Set block number
vm.roll(block.number + 100);
```

### Expecting Reverts

```solidity
// Expect any revert
vm.expectRevert();
target.functionThatReverts();

// Expect specific error
vm.expectRevert("Insufficient balance");
target.withdraw(1000);

// Expect custom error
vm.expectRevert(InsufficientBalance.selector);
target.withdraw(1000);
```

### Expecting Events

```solidity
// Expect event (check all indexed topics + data)
vm.expectEmit(true, true, true, true);
emit Transfer(from, to, amount);
target.transfer(to, amount);
```

## Assertions

See [assertions.md](assertions.md) for the complete reference.

```solidity
// Equality
assertEq(a, b);
assertEq(a, b, "custom error message");

// Comparisons
assertGt(a, b);  // a > b
assertGe(a, b);  // a >= b
assertLt(a, b);  // a < b
assertLe(a, b);  // a <= b

// Approximate equality (for decimals)
assertApproxEqAbs(a, b, maxDelta);
assertApproxEqRel(a, b, maxPercentDelta);

// Boolean
assertTrue(condition);
assertFalse(condition);
```

## Console Logging

```solidity
import {console} from "forge-std/Test.sol";

console.log("Value:", someValue);
console.log("Address:", someAddress);
console.logBytes32(someHash);
```

## Common Patterns

See [patterns.md](patterns.md) for detailed examples.

### Testing as Different Users

```solidity
address alice = makeAddr("alice");
address bob = makeAddr("bob");

vm.deal(alice, 10 ether);
vm.prank(alice);
target.deposit{value: 1 ether}();
```

### Fork Testing

```solidity
function setUp() public {
    vm.createSelectFork("mainnet");
}

function test_InteractWithMainnet() public {
    IERC20 dai = IERC20(0x6B175474E89094C44Da98b954EesdfeCaE69310);
    // Test against real mainnet state
}
```

### Storage Manipulation

```solidity
// Write to specific storage slot
vm.store(address(target), bytes32(uint256(0)), bytes32(uint256(100)));

// Read from storage slot
bytes32 value = vm.load(address(target), bytes32(uint256(0)));
```

Files in this skill

  • SKILL.md4.9 KB
  • assertions.md4.7 KB
  • cheatcodes.md6.8 KB
  • patterns.md10 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.