Skip to content

Commit

Permalink
add test
Browse files Browse the repository at this point in the history
  • Loading branch information
klkvr committed Jul 5, 2024
1 parent c113a59 commit 1c639b2
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 3 deletions.
18 changes: 15 additions & 3 deletions crates/forge/bin/cmd/bind_json.rs
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,7 @@ impl ResolvedState {
fn write(self) -> Result<String> {
let mut result = String::new();
self.write_imports(&mut result);
self.write_vm(&mut result);
self.write_library(&mut result);

fs::create_dir_all(self.target_path.parent().unwrap())?;
Expand All @@ -428,9 +429,7 @@ impl ResolvedState {
.insert(item);
}

result.push_str("pragma solidity >=0.6.2 <0.9.0;\n");
result.push_str("pragma experimental ABIEncoderV2;\n\n");
result.push_str("import {Vm} from \"forge-std/Vm.sol\";\n");
result.push_str("pragma solidity >=0.6.2 <0.9.0;\npragma experimental ABIEncoderV2;\n\n");

for (path, names) in grouped_imports {
result.push_str(&format!(
Expand All @@ -441,6 +440,19 @@ impl ResolvedState {
}
}

/// Writes minimal VM interface to not depend on forge-std version
fn write_vm(&self, result: &mut String) {
result.push_str(r#"
interface Vm {
function parseJsonTypeArray(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory);
function parseJsonType(string calldata json, string calldata typeDescription) external pure returns (bytes memory);
function parseJsonType(string calldata json, string calldata key, string calldata typeDescription) external pure returns (bytes memory);
function serializeJsonType(string calldata typeDescription, bytes memory value) external pure returns (string memory json);
function serializeJsonType(string calldata objectKey, string calldata valueKey, string calldata typeDescription, bytes memory value) external returns (string memory json);
}
"#);
}

fn write_library(&self, result: &mut String) {
result.push_str(
r#"
Expand Down
54 changes: 54 additions & 0 deletions crates/forge/tests/cli/bind_json.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
// tests complete bind-json workflow
// ensures that we can run forge-bind even if files are depending on yet non-existent bindings and
// that generated bindings are correct
forgetest_init!(test_bind_json, |prj, cmd| {
prj.add_test(
"JsonBindings",
r#"
import {JsonBindings} from "utils/JsonBindings.sol";
import {Test} from "forge-std/Test.sol";
struct TopLevelStruct {
uint256 param1;
int8 param2;
}
contract BindJsonTest is Test {
using JsonBindings for *;
struct ContractLevelStruct {
address[][] param1;
address addrParam;
}
function testTopLevel() public {
string memory json = '{"param1": 1, "param2": -1}';
TopLevelStruct memory topLevel = json.deserializeTopLevelStruct();
assertEq(topLevel.param1, 1);
assertEq(topLevel.param2, -1);
json = topLevel.serialize();
TopLevelStruct memory deserialized = json.deserializeTopLevelStruct();
assertEq(keccak256(abi.encode(deserialized)), keccak256(abi.encode(topLevel)));
}
function testContractLevel() public {
ContractLevelStruct memory contractLevel = ContractLevelStruct({
param1: new address[][](2),
addrParam: address(0xBEEF)
});
string memory json = contractLevel.serialize();
assertEq(json, '{"param1":[[],[]],"addrParam":"0x000000000000000000000000000000000000bEEF"}');
ContractLevelStruct memory deserialized = json.deserializeContractLevelStruct();
assertEq(keccak256(abi.encode(deserialized)), keccak256(abi.encode(contractLevel)));
}
}
"#,
)
.unwrap();

cmd.arg("bind-json").assert_success();
cmd.forge_fuse().args(["test"]).assert_success();
});
1 change: 1 addition & 0 deletions crates/forge/tests/cli/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ extern crate foundry_test_utils;
pub mod constants;
pub mod utils;

mod bind_json;
mod build;
mod cache;
mod cmd;
Expand Down

0 comments on commit 1c639b2

Please sign in to comment.