#![allow(dead_code)]
use revm::{
context::result::ResultAndState,
context_interface::result::{ExecutionResult, HaltReason, Output, SuccessReason},
primitives::Bytes,
state::EvmState,
};
pub(crate) const TESTS_TESTDATA: &str = "tests/testdata";
#[cfg(not(feature = "serde"))]
pub(crate) fn compare_or_save_testdata<HaltReasonTy>(
_filename: &str,
_output: &ResultAndState<HaltReasonTy>,
) {
}
#[cfg(feature = "serde")]
pub(crate) fn compare_or_save_testdata<HaltReasonTy>(
filename: &str,
output: &ResultAndState<HaltReasonTy>,
) where
HaltReasonTy: serde::Serialize + for<'a> serde::Deserialize<'a> + PartialEq,
{
use std::{fs, path::PathBuf};
let tests_dir = PathBuf::from(TESTS_TESTDATA);
let testdata_file = tests_dir.join(filename);
if !tests_dir.exists() {
fs::create_dir_all(&tests_dir).unwrap();
}
let output_json = serde_json::to_string_pretty(output).unwrap();
if !testdata_file.exists() {
fs::write(&testdata_file, &output_json).unwrap();
println!("Saved testdata to {}", testdata_file.display());
return;
}
let expected_json = fs::read_to_string(&testdata_file).unwrap();
let expected = serde_json::from_str(&expected_json).unwrap();
if output != &expected {
let expected_pretty = serde_json::to_string_pretty(&expected).unwrap();
panic!(
"Value does not match testdata.\nExpected:\n{expected_pretty}\n\nActual:\n{output_json}",
);
}
}
#[test]
fn template_test() {
let result = ResultAndState::new(
ExecutionResult::Success {
reason: SuccessReason::Stop,
gas_used: 1000,
gas_refunded: 0,
logs: vec![],
output: Output::Call(Bytes::from(vec![4, 5, 6])),
},
EvmState::default(),
);
compare_or_save_testdata::<HaltReason>("template_test.json", &result);
}