@@ -1094,10 +1094,10 @@ contract AContractTest is DSTest {
10941094 . assert_success( )
10951095 . stdout_eq( str ![ [ r#"
10961096...
1097- | File | % Lines | % Statements | % Branches | % Funcs |
1098- |-------------------|--------------- |--------------|--------------|---------------|
1099- | src/AContract.sol | 100 .00% (4 /4) | 50.00% (2/4) | 50.00% (2/4) | 100.00% (1/1) |
1100- | Total | 100 .00% (4 /4) | 50.00% (2/4) | 50.00% (2/4) | 100.00% (1/1) |
1097+ | File | % Lines | % Statements | % Branches | % Funcs |
1098+ |-------------------|--------------|--------------|--------------|---------------|
1099+ | src/AContract.sol | 50 .00% (2 /4) | 50.00% (2/4) | 50.00% (2/4) | 100.00% (1/1) |
1100+ | Total | 50 .00% (2 /4) | 50.00% (2/4) | 50.00% (2/4) | 100.00% (1/1) |
11011101
11021102"# ] ] ) ;
11031103
@@ -1113,3 +1113,92 @@ contract AContractTest is DSTest {
11131113"# ] ] ,
11141114 ) ;
11151115} ) ;
1116+
1117+ // https://github.com/foundry-rs/foundry/issues/8604
1118+ forgetest ! ( test_branch_with_calldata_reads, |prj, cmd| {
1119+ prj. insert_ds_test( ) ;
1120+ prj. add_source(
1121+ "AContract.sol" ,
1122+ r#"
1123+ contract AContract {
1124+ event IsTrue(bool isTrue);
1125+ event IsFalse(bool isFalse);
1126+
1127+ function execute(bool[] calldata isTrue) external {
1128+ for (uint256 i = 0; i < isTrue.length; i++) {
1129+ if (isTrue[i]) {
1130+ emit IsTrue(isTrue[i]);
1131+ } else {
1132+ emit IsFalse(!isTrue[i]);
1133+ }
1134+ }
1135+ }
1136+ }
1137+ "# ,
1138+ )
1139+ . unwrap( ) ;
1140+
1141+ prj. add_source(
1142+ "AContractTest.sol" ,
1143+ r#"
1144+ import "./test.sol";
1145+ import {AContract} from "./AContract.sol";
1146+
1147+ contract AContractTest is DSTest {
1148+ function testTrueCoverage() external {
1149+ AContract a = new AContract();
1150+ bool[] memory isTrue = new bool[](1);
1151+ isTrue[0] = true;
1152+ a.execute(isTrue);
1153+ }
1154+
1155+ function testFalseCoverage() external {
1156+ AContract a = new AContract();
1157+ bool[] memory isFalse = new bool[](1);
1158+ isFalse[0] = false;
1159+ a.execute(isFalse);
1160+ }
1161+ }
1162+ "# ,
1163+ )
1164+ . unwrap( ) ;
1165+
1166+ // Assert 50% coverage for true branches.
1167+ cmd. arg( "coverage" )
1168+ . args( [ "--mt" . to_string( ) , "testTrueCoverage" . to_string( ) ] )
1169+ . assert_success( )
1170+ . stdout_eq( str ![ [ r#"
1171+ ...
1172+ | File | % Lines | % Statements | % Branches | % Funcs |
1173+ |-------------------|--------------|--------------|--------------|---------------|
1174+ | src/AContract.sol | 75.00% (3/4) | 80.00% (4/5) | 50.00% (1/2) | 100.00% (1/1) |
1175+ | Total | 75.00% (3/4) | 80.00% (4/5) | 50.00% (1/2) | 100.00% (1/1) |
1176+
1177+ "# ] ] ) ;
1178+
1179+ // Assert 50% coverage for false branches.
1180+ cmd. forge_fuse( )
1181+ . arg( "coverage" )
1182+ . args( [ "--mt" . to_string( ) , "testFalseCoverage" . to_string( ) ] )
1183+ . assert_success( )
1184+ . stdout_eq( str ![ [ r#"
1185+ ...
1186+ | File | % Lines | % Statements | % Branches | % Funcs |
1187+ |-------------------|--------------|--------------|--------------|---------------|
1188+ | src/AContract.sol | 50.00% (2/4) | 80.00% (4/5) | 50.00% (1/2) | 100.00% (1/1) |
1189+ | Total | 50.00% (2/4) | 80.00% (4/5) | 50.00% (1/2) | 100.00% (1/1) |
1190+
1191+ "# ] ] ) ;
1192+
1193+ // Assert 100% coverage (true/false branches properly covered).
1194+ cmd. forge_fuse( ) . arg( "coverage" ) . args( [ "--summary" . to_string( ) ] ) . assert_success( ) . stdout_eq(
1195+ str ![ [ r#"
1196+ ...
1197+ | File | % Lines | % Statements | % Branches | % Funcs |
1198+ |-------------------|---------------|---------------|---------------|---------------|
1199+ | src/AContract.sol | 100.00% (4/4) | 100.00% (5/5) | 100.00% (2/2) | 100.00% (1/1) |
1200+ | Total | 100.00% (4/4) | 100.00% (5/5) | 100.00% (2/2) | 100.00% (1/1) |
1201+
1202+ "# ] ] ,
1203+ ) ;
1204+ } ) ;
0 commit comments