Testing

Testing Overview

Foundry unit tests + coverage-guided invariant fuzzing.

Unit Tests

FilePurposeStatus
CapTable.t.solTest helpers/fixtures✅ Passing
StockIssuance.t.solIssuance logic, error cases✅ Passing
StockTransfer.t.solTransfer mechanics, edge cases✅ Passing
StockCancellation.t.solCancel/partial cancel flows✅ Passing
StockRepurchase.t.solRepurchase flows✅ Passing
StockReissuance.t.solReissuance mechanics✅ Passing
StockRetraction.t.solRetraction flow✅ Passing
StockAcceptance.t.solAcceptance flow✅ Passing
Adjustment.t.solShare adjustment constraints✅ Passing
AccessControl.t.solRole-based access✅ Passing
Issuer.t.solIssuer initialization✅ Passing
Stakeholder.t.solCRUD + duplicates✅ Passing
StockClass.t.solCRUD + duplicates✅ Passing
Wallet.t.solWallet mapping✅ Passing
Minting.t.solBatch minting✅ Passing
CapTableFactory.solFactory + upgrades✅ Passing

Run: make test

Invariant Tests

Stateful fuzzing (7 invariants) validating:

  • shares_issued <= shares_authorized (issuer and stock classes)
  • Stakeholder/stock class index mapping consistency
  • Count consistency between contract and tracked state
  • Stock class authorized never exceeds issuer authorized

Run: make test-invariant (256 runs) or make test-invariant-deep (2000 runs)

Why Both?

  • Unit tests: Specific function behavior, revert messages, single flows, edge cases
  • Invariant tests: Properties hold after random sequences of calls (emergent bugs)

Together they provide broad coverage before audit.