diff --git a/crates/forge/tests/cli/test_cmd/mod.rs b/crates/forge/tests/cli/test_cmd/mod.rs index 0805c62cbb7e3..4a11bce8ce474 100644 --- a/crates/forge/tests/cli/test_cmd/mod.rs +++ b/crates/forge/tests/cli/test_cmd/mod.rs @@ -4234,3 +4234,42 @@ Tip: Run `forge test --rerun` to retry only the 2 failed tests "#]]); }); + +// +#[cfg(not(feature = "isolate-by-default"))] +forgetest_init!(invariant_consistent_output, |prj, cmd| { + prj.update_config(|config| { + config.fuzz.seed = Some(U256::from(100u32)); + config.invariant.runs = 10; + config.invariant.depth = 100; + config.invariant.show_metrics = false; + }); + prj.add_test( + "InvariantOutputTest.t.sol", + r#" +import {Test} from "forge-std/Test.sol"; + +contract InvariantOutputTest is Test { + uint256 count; + + function setCond(uint256 cond) public { + if (cond > type(uint256).max / 2) { + count++; + } + } + + function setUp() public { + targetContract(address(this)); + } + + function invariant_check_count() public view { + require(count < 2, "failed invariant"); + } +} + "#, + ); + + cmd.args(["test", "--mt", "invariant_check_count", "--color", "always"]) + .assert_failure() + .stdout_eq(file!["../../fixtures/invariant_traces.svg": TermSvg]); +}); diff --git a/crates/forge/tests/fixtures/invariant_traces.svg b/crates/forge/tests/fixtures/invariant_traces.svg new file mode 100644 index 0000000000000..37c7bc8ebcf84 --- /dev/null +++ b/crates/forge/tests/fixtures/invariant_traces.svg @@ -0,0 +1,78 @@ + + + + + + + [COMPILING_FILES] with [SOLC_VERSION] + + [SOLC_VERSION] [ELAPSED] + + Compiler run successful! + + + + Ran 1 test for test/InvariantOutputTest.t.sol:InvariantOutputTest + + [FAIL: failed invariant] + + [Sequence] (original: 18, shrunk: 2) + + sender=0x6a3f0afe248BBfEa8188dDf90B4Cf62D35c99493 addr=[test/InvariantOutputTest.t.sol:InvariantOutputTest]0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496 calldata=setCond(uint256) args=[115792089237316195423570985008687907853269984665640564039457584007913129639933 [1.157e77]] + + sender=0xF343C4D80b93a0Aac984Ebf89a625095399CaF11 addr=[test/InvariantOutputTest.t.sol:InvariantOutputTest]0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496 calldata=setCond(uint256) args=[115792089237316195423570985008687907853269984665640564039457584007913129639934 [1.157e77]] + + invariant_check_count() (runs: 1, calls: 100, reverts: 0) + + Suite result: FAILED. 0 passed; 1 failed; 0 skipped; [ELAPSED] + + + + Ran 1 test suite [ELAPSED]: 0 tests passed, 1 failed, 0 skipped (1 total tests) + + + + Failing tests: + + Encountered 1 failing test in test/InvariantOutputTest.t.sol:InvariantOutputTest + + [FAIL: failed invariant] + + [Sequence] (original: 18, shrunk: 2) + + sender=0x6a3f0afe248BBfEa8188dDf90B4Cf62D35c99493 addr=[test/InvariantOutputTest.t.sol:InvariantOutputTest]0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496 calldata=setCond(uint256) args=[115792089237316195423570985008687907853269984665640564039457584007913129639933 [1.157e77]] + + sender=0xF343C4D80b93a0Aac984Ebf89a625095399CaF11 addr=[test/InvariantOutputTest.t.sol:InvariantOutputTest]0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496 calldata=setCond(uint256) args=[115792089237316195423570985008687907853269984665640564039457584007913129639934 [1.157e77]] + + invariant_check_count() (runs: 1, calls: 100, reverts: 0) + + + + Encountered a total of 1 failing tests, 0 tests succeeded + + + + Tip: Run `forge test --rerun` to retry only the 1 failed test + + + + + +