ef_tests/
suite.rs
1use crate::{
4 case::{Case, Cases},
5 result::assert_tests_pass,
6};
7use std::path::{Path, PathBuf};
8use walkdir::{DirEntry, WalkDir};
9
10pub trait Suite {
12 type Case: Case;
14
15 fn suite_name(&self) -> String;
23
24 fn run(&self) {
30 let suite_path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
32 .join("ethereum-tests")
33 .join(self.suite_name());
34
35 assert!(suite_path.exists(), "Test suite path does not exist: {suite_path:?}");
37
38 let test_cases = find_all_files_with_extension(&suite_path, ".json")
40 .into_iter()
41 .map(|test_case_path| {
42 let case = Self::Case::load(&test_case_path).expect("test case should load");
43 (test_case_path, case)
44 })
45 .collect();
46
47 let results = Cases { test_cases }.run();
49
50 assert_tests_pass(&self.suite_name(), &suite_path, &results);
52 }
53}
54
55fn find_all_files_with_extension(path: &Path, extension: &str) -> Vec<PathBuf> {
57 WalkDir::new(path)
58 .into_iter()
59 .filter_map(Result::ok)
60 .filter(|e| e.file_name().to_string_lossy().ends_with(extension))
61 .map(DirEntry::into_path)
62 .collect()
63}