diff --git a/crates/forge-runner/src/lib.rs b/crates/forge-runner/src/lib.rs index 57a0ef6e84..34c26b45c0 100644 --- a/crates/forge-runner/src/lib.rs +++ b/crates/forge-runner/src/lib.rs @@ -1,6 +1,7 @@ use crate::coverage_api::run_coverage; use crate::forge_config::{ExecutionDataToSave, ForgeConfig}; -use crate::package_tests::TestCase; +use crate::package_tests::with_config_resolved::TestCaseResolvedConfig; +use crate::package_tests::{TestCase, TestCaseDeprecated}; use crate::running::{run_fuzz_test, run_test}; use crate::test_case_summary::TestCaseSummary; use anyhow::Result; @@ -58,9 +59,12 @@ const BUILTINS: [&str; 11] = [ ]; pub trait TestCaseFilter { - fn should_be_run(&self, test_case: &TestCase) -> bool + // TODO: Remove in next PRs + fn should_be_run(&self, test_case: &TestCaseDeprecated) -> bool where T: TestCaseIsIgnored; + + fn should_run(&self, is_test_case_ignored: bool) -> bool; } pub trait TestCaseIsIgnored { @@ -113,16 +117,24 @@ pub fn maybe_generate_coverage( #[must_use] #[tracing::instrument(skip_all, level = "debug")] pub fn run_for_test_case( - case: Arc, + case: &Arc, casm_program: Arc, forge_config: Arc, versioned_program_path: Arc, send: Sender<()>, ) -> JoinHandle> { + // TODO: Change all tests running functions to use `TestCase` in next PRs + let deprecated_test_case: TestCaseDeprecated = TestCaseDeprecated { + name: case.name.clone(), + test_details: case.test_details.clone(), + config: case.config.clone(), + }; + let deprecated_test_case = Arc::new(deprecated_test_case); + if case.config.fuzzer_config.is_none() { tokio::task::spawn(async move { let res = run_test( - case, + deprecated_test_case, casm_program, forge_config, versioned_program_path, @@ -134,7 +146,7 @@ pub fn run_for_test_case( } else { tokio::task::spawn(async move { let res = run_with_fuzzing( - case, + deprecated_test_case, casm_program, forge_config.clone(), versioned_program_path, diff --git a/crates/forge-runner/src/package_tests.rs b/crates/forge-runner/src/package_tests.rs index 34c98270b1..a160e13176 100644 --- a/crates/forge-runner/src/package_tests.rs +++ b/crates/forge-runner/src/package_tests.rs @@ -1,6 +1,7 @@ use crate::forge_config::ForgeTrackedResource; use crate::package_tests::raw::TestTargetRaw; use crate::package_tests::with_config::{TestCaseWithConfig, TestTargetWithConfig}; +use crate::package_tests::with_config_resolved::{TestCaseResolvedConfig, sanitize_test_case_name}; use crate::running::config_run::run_config_pass; use crate::running::hints_to_params; use anyhow::{Result, anyhow}; @@ -135,7 +136,7 @@ pub struct TestTargetDeprecated { pub sierra_program: ProgramArtifact, pub sierra_program_path: Arc, pub casm_program: Arc, - pub test_cases: Vec>, + pub test_cases: Vec>, } // TODO: Remove in next PRs @@ -207,13 +208,36 @@ impl TestTargetDeprecated { } } +// TODO: Remove in next PRs #[derive(Debug, Clone, PartialEq)] -pub struct TestCase { +pub struct TestCaseDeprecated { pub test_details: TestDetails, pub name: String, pub config: C, } +#[derive(Debug, Clone, PartialEq)] +pub struct TestCase { + pub test_details: TestDetails, + pub name: String, + pub config: TestCaseResolvedConfig, +} + +impl TestCase { + #[must_use] + pub fn new(name: &str, test_details: TestDetails, config: TestCaseResolvedConfig) -> Self { + Self { + name: sanitize_test_case_name(name), + test_details, + config, + } + } + + pub fn try_into_program(&self, casm_program: &RawCasmProgram) -> Result { + self.test_details.try_into_program(casm_program) + } +} + #[derive(Debug, Clone)] pub struct TestTarget { pub tests_location: TestTargetLocation, diff --git a/crates/forge-runner/src/package_tests/with_config.rs b/crates/forge-runner/src/package_tests/with_config.rs index c74de5cafe..70974c62cb 100644 --- a/crates/forge-runner/src/package_tests/with_config.rs +++ b/crates/forge-runner/src/package_tests/with_config.rs @@ -1,4 +1,4 @@ -use super::{TestCase, TestTargetDeprecated}; +use super::{TestCaseDeprecated, TestTargetDeprecated}; use crate::{ TestCaseIsIgnored, expected_result::{ExpectedPanicValue, ExpectedTestResult}, @@ -11,7 +11,7 @@ use conversions::serde::serialize::SerializeToFeltVec; pub type TestTargetWithConfig = TestTargetDeprecated; -pub type TestCaseWithConfig = TestCase; +pub type TestCaseWithConfig = TestCaseDeprecated; /// Test case with config that has not yet been resolved /// see [`super::with_config_resolved::TestCaseResolvedConfig`] for more info diff --git a/crates/forge-runner/src/package_tests/with_config_resolved.rs b/crates/forge-runner/src/package_tests/with_config_resolved.rs index b3a744a508..b7509329fd 100644 --- a/crates/forge-runner/src/package_tests/with_config_resolved.rs +++ b/crates/forge-runner/src/package_tests/with_config_resolved.rs @@ -1,4 +1,4 @@ -use super::{TestCase, TestTargetDeprecated}; +use super::{TestCaseDeprecated, TestTargetDeprecated}; use crate::{TestCaseIsIgnored, expected_result::ExpectedTestResult, package_tests::TestDetails}; use anyhow::Result; use cairo_vm::types::program::Program; @@ -11,9 +11,10 @@ use url::Url; pub type TestTargetWithResolvedConfig = TestTargetDeprecated; -pub type TestCaseWithResolvedConfig = TestCase; +pub type TestCaseWithResolvedConfig = TestCaseDeprecated; -fn sanitize_test_case_name(name: &str) -> String { +#[must_use] +pub fn sanitize_test_case_name(name: &str) -> String { // Test names generated by `#[test]` and `#[fuzzer]` macros contain internal suffixes name.replace("__snforge_internal_test_generated", "") .replace("__snforge_internal_fuzzer_generated", "") diff --git a/crates/forge/src/run_tests/package.rs b/crates/forge/src/run_tests/package.rs index 10fca94288..b13b35cd62 100644 --- a/crates/forge/src/run_tests/package.rs +++ b/crates/forge/src/run_tests/package.rs @@ -1,7 +1,4 @@ -use super::{ - resolve_config::resolve_config, - test_target::{TestTargetRunResult, run_for_test_target}, -}; +use super::test_target::{TestTargetRunResult, run_for_test_target}; use crate::scarb::load_package_config; use crate::{ TestArgs, @@ -11,12 +8,10 @@ use crate::{ messages::{ collected_tests_count::CollectedTestsCountMessage, tests_summary::TestsSummaryMessage, }, + resolve_config::resolve_config, workspace::WorkspaceDirs, }, - scarb::{ - config::{ForgeConfigFromScarb, ForkTarget}, - load_test_artifacts, - }, + scarb::config::{ForgeConfigFromScarb, ForkTarget}, shared_cache::FailedTestsCache, test_filter::{NameFilter, TestsFilter}, warn::warn_if_incompatible_rpc_version, @@ -25,11 +20,8 @@ use anyhow::Result; use cheatnet::runtime_extensions::forge_runtime_extension::contracts_data::ContractsData; use console::Style; use forge_runner::{ - forge_config::ForgeConfig, - package_tests::{ - TestTargetDeprecated, raw::TestTargetRaw, - with_config_resolved::TestTargetWithResolvedConfig, - }, + forge_config::{ForgeConfig, ForgeTrackedResource}, + package_tests::{TestCandidate, TestCase, TestTarget}, test_case_summary::AnyTestCaseSummary, test_target_summary::TestTargetSummary, }; @@ -64,7 +56,7 @@ impl PackageTestResult { } pub struct RunForPackageArgs { - pub test_targets: Vec, + pub test_targets: Vec>, pub tests_filter: TestsFilter, pub forge_config: Arc, pub fork_targets: Vec, @@ -74,14 +66,13 @@ pub struct RunForPackageArgs { impl RunForPackageArgs { #[tracing::instrument(skip_all, level = "debug")] pub fn build( + test_targets: Vec>, package: PackageMetadata, scarb_metadata: &Metadata, args: &TestArgs, workspace_dirs: &WorkspaceDirs, ui: &UI, ) -> Result { - let raw_test_targets = load_test_artifacts(&workspace_dirs.artifacts_dir, &package)?; - let contracts = get_contracts_artifacts_and_source_sierra_paths( &workspace_dirs.artifacts_dir, &package, @@ -126,7 +117,7 @@ impl RunForPackageArgs { ); Ok(RunForPackageArgs { - test_targets: raw_test_targets, + test_targets, forge_config, tests_filter: test_filter, fork_targets: forge_config_from_scarb.fork, @@ -137,22 +128,23 @@ impl RunForPackageArgs { #[tracing::instrument(skip_all, level = "debug")] async fn test_package_with_config_resolved( - test_targets: Vec, + test_targets: Vec>, fork_targets: &[ForkTarget], block_number_map: &mut BlockNumberMap, - forge_config: &ForgeConfig, tests_filter: &TestsFilter, -) -> Result> { + tracked_resource: &ForgeTrackedResource, +) -> Result>> { let mut test_targets_with_resolved_config = Vec::with_capacity(test_targets.len()); for test_target in test_targets { - let test_target = TestTargetDeprecated::from_raw_deprecated( + let test_target = resolve_config( test_target, - &forge_config.test_runner_config.tracked_resource, - )?; - - let test_target = - resolve_config(test_target, fork_targets, block_number_map, tests_filter).await?; + fork_targets, + block_number_map, + tests_filter, + tracked_resource, + ) + .await?; test_targets_with_resolved_config.push(test_target); } @@ -160,7 +152,7 @@ async fn test_package_with_config_resolved( Ok(test_targets_with_resolved_config) } -fn sum_test_cases(test_targets: &[TestTargetWithResolvedConfig]) -> usize { +fn sum_test_cases(test_targets: &[TestTarget]) -> usize { test_targets.iter().map(|tc| tc.test_cases.len()).sum() } @@ -180,8 +172,8 @@ pub async fn run_for_package( test_targets, &fork_targets, block_number_map, - &forge_config, &tests_filter, + &forge_config.test_runner_config.tracked_resource, ) .await?; let all_tests = sum_test_cases(&test_targets); diff --git a/crates/forge/src/run_tests/resolve_config.rs b/crates/forge/src/run_tests/resolve_config.rs index f011413419..7ec9e400c1 100644 --- a/crates/forge/src/run_tests/resolve_config.rs +++ b/crates/forge/src/run_tests/resolve_config.rs @@ -1,26 +1,34 @@ +use std::sync::Arc; + use super::maat::env_ignore_fork_tests; use crate::{ block_number_map::BlockNumberMap, scarb::config::ForkTarget, test_filter::TestsFilter, }; use anyhow::{Result, anyhow}; use cheatnet::runtime_extensions::forge_config_extension::config::{ - BlockId, InlineForkConfig, OverriddenForkConfig, RawForkConfig, + BlockId, InlineForkConfig, OverriddenForkConfig, RawForgeConfig, RawForkConfig, }; use conversions::byte_array::ByteArray; use forge_runner::{ TestCaseFilter, + forge_config::ForgeTrackedResource, package_tests::{ + TestCandidate, TestCase, TestTarget, with_config::TestTargetWithConfig, with_config_resolved::{ ResolvedForkConfig, TestCaseResolvedConfig, TestCaseWithResolvedConfig, TestTargetWithResolvedConfig, }, }, + running::config_run::run_config_pass, }; +use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use starknet_api::block::BlockNumber; +use universal_sierra_compiler_api::compile_raw_sierra_at_path; +// TODO: Remove in next PRs #[tracing::instrument(skip_all, level = "debug")] -pub async fn resolve_config( +pub async fn resolve_config_deprecated( test_target: TestTargetWithConfig, fork_targets: &[ForkTarget], block_number_map: &mut BlockNumberMap, @@ -59,6 +67,89 @@ pub async fn resolve_config( }) } +#[tracing::instrument(skip_all, level = "debug")] +pub async fn resolve_config( + test_target: TestTarget, + fork_targets: &[ForkTarget], + block_number_map: &mut BlockNumberMap, + tests_filter: &TestsFilter, + tracked_resource: &ForgeTrackedResource, +) -> Result> { + let env_ignore_fork_tests = env_ignore_fork_tests(); + + let casm_program = Arc::new(compile_raw_sierra_at_path( + test_target.sierra_program_path.as_std_path(), + )?); + + let raw_configs: Vec<_> = test_target + .test_cases + .par_iter() + .map(|test_candidate| { + let raw_config = run_config_pass( + &test_candidate.test_details, + &casm_program, + tracked_resource, + )?; + Ok((test_candidate, raw_config)) + }) + .collect::>>()?; + + let mut test_cases = Vec::with_capacity(raw_configs.len()); + for (test_candidate, raw_config) in raw_configs { + let resolved_config = resolved_config_from_raw( + raw_config, + tests_filter, + fork_targets, + block_number_map, + env_ignore_fork_tests, + ) + .await?; + + test_cases.push(TestCase::new( + &test_candidate.name, + test_candidate.test_details.clone(), + resolved_config, + )); + } + + Ok(TestTarget { + tests_location: test_target.tests_location, + sierra_program: test_target.sierra_program, + sierra_program_path: test_target.sierra_program_path, + casm_program: Some(casm_program), + test_cases, + }) +} + +async fn resolved_config_from_raw( + raw_config: RawForgeConfig, + tests_filter: &TestsFilter, + fork_targets: &[ForkTarget], + block_number_map: &mut BlockNumberMap, + env_ignore_fork_tests: bool, +) -> Result { + let ignored = raw_config.ignore.is_some_and(|v| v.is_ignored) + || (env_ignore_fork_tests && raw_config.fork.is_some()); + let fork_config = if tests_filter.should_run(ignored) { + resolve_fork_config(raw_config.fork, block_number_map, fork_targets).await? + } else { + None + }; + + let resolved_config = TestCaseResolvedConfig { + available_gas: raw_config.available_gas, + ignored, + fork_config, + expected_result: raw_config.should_panic.into(), + fuzzer_config: raw_config.fuzzer, + disable_predeployed_contracts: raw_config + .disable_predeployed_contracts + .is_some_and(|v| v.is_disabled), + }; + + Ok(resolved_config) +} + async fn resolve_fork_config( fork_config: Option, block_number_map: &mut BlockNumberMap, @@ -225,7 +316,7 @@ mod tests { ); assert!( - resolve_config( + resolve_config_deprecated( mocked_tests, &[create_fork_target( "definitely_non_existing", @@ -261,7 +352,7 @@ mod tests { FailedTestsCache::default(), ); - let resolved = resolve_config( + let resolved = resolve_config_deprecated( test_target, &[], &mut BlockNumberMap::default(), @@ -301,7 +392,7 @@ mod tests { FailedTestsCache::default(), ); - let resolved = resolve_config( + let resolved = resolve_config_deprecated( test_target, &fork_targets, &mut BlockNumberMap::default(), @@ -345,7 +436,7 @@ mod tests { FailedTestsCache::default(), ); - let resolved = resolve_config( + let resolved = resolve_config_deprecated( test_target, &fork_targets, &mut BlockNumberMap::default(), @@ -401,7 +492,7 @@ mod tests { FailedTestsCache::default(), ); - let resolved = resolve_config( + let resolved = resolve_config_deprecated( test_target, &fork_targets, &mut BlockNumberMap::default(), @@ -469,7 +560,7 @@ mod tests { FailedTestsCache::default(), ); - let resolved = resolve_config( + let resolved = resolve_config_deprecated( test_target, &fork_targets, &mut BlockNumberMap::default(), @@ -526,7 +617,7 @@ mod tests { FailedTestsCache::default(), ); - let resolved = resolve_config( + let resolved = resolve_config_deprecated( test_target, &fork_targets, &mut BlockNumberMap::default(), @@ -575,7 +666,7 @@ mod tests { FailedTestsCache::default(), ); - let resolved = resolve_config( + let resolved = resolve_config_deprecated( test_target, &[], &mut BlockNumberMap::default(), @@ -623,7 +714,7 @@ mod tests { FailedTestsCache::default(), ); - let resolved = resolve_config( + let resolved = resolve_config_deprecated( test_target, &fork_targets, &mut BlockNumberMap::default(), @@ -667,7 +758,7 @@ mod tests { FailedTestsCache::default(), ); - let resolved = resolve_config( + let resolved = resolve_config_deprecated( test_target, &fork_targets, &mut BlockNumberMap::default(), diff --git a/crates/forge/src/run_tests/test_target.rs b/crates/forge/src/run_tests/test_target.rs index 085fd76873..6aecb57175 100644 --- a/crates/forge/src/run_tests/test_target.rs +++ b/crates/forge/src/run_tests/test_target.rs @@ -1,11 +1,10 @@ use anyhow::Result; use forge_runner::messages::TestResultMessage; +use forge_runner::package_tests::{TestCase, TestTarget}; use forge_runner::{ TestCaseFilter, forge_config::ForgeConfig, - maybe_generate_coverage, maybe_save_trace_and_profile, - package_tests::with_config_resolved::TestTargetWithResolvedConfig, - run_for_test_case, + maybe_generate_coverage, maybe_save_trace_and_profile, run_for_test_case, test_case_summary::{AnyTestCaseSummary, TestCaseSummary}, test_target_summary::TestTargetSummary, }; @@ -24,7 +23,7 @@ pub enum TestTargetRunResult { #[tracing::instrument(skip_all, level = "debug")] pub async fn run_for_test_target( - tests: TestTargetWithResolvedConfig, + tests: TestTarget, forge_config: Arc, tests_filter: &impl TestCaseFilter, ui: Arc, @@ -47,7 +46,7 @@ pub async fn run_for_test_target( for case in tests.test_cases { let case_name = case.name.clone(); - if !tests_filter.should_be_run(&case) { + if !tests_filter.should_run(case.config.ignored) { tasks.push(tokio::task::spawn(async { // TODO TestCaseType should also be encoded in the test case definition Ok(AnyTestCaseSummary::Single(TestCaseSummary::Ignored { @@ -60,8 +59,8 @@ pub async fn run_for_test_target( let case = Arc::new(case); tasks.push(run_for_test_case( - case, - casm_program.clone(), + &case, + casm_program.clone().unwrap(), forge_config.clone(), tests.sierra_program_path.clone(), send.clone(), diff --git a/crates/forge/src/run_tests/workspace.rs b/crates/forge/src/run_tests/workspace.rs index 732d428036..7c82f1d38f 100644 --- a/crates/forge/src/run_tests/workspace.rs +++ b/crates/forge/src/run_tests/workspace.rs @@ -47,7 +47,6 @@ impl WorkspaceDirs { type TestTargets = Vec>; -#[expect(dead_code)] fn collect_packages_with_tests( workspace_dirs: &WorkspaceDirs, packages: &[PackageMetadata], @@ -103,10 +102,19 @@ pub async fn run_for_workspace( let packages_len = packages.len(); - for package in packages { - env::set_current_dir(&package.root)?; + let packages_with_tests = collect_packages_with_tests(&workspace_dirs, &packages)?; - let args = RunForPackageArgs::build(package, scarb_metadata, &args, &workspace_dirs, &ui)?; + for (package_metadata, test_targets) in packages_with_tests { + env::set_current_dir(&package_metadata.root)?; + + let args = RunForPackageArgs::build( + test_targets, + package_metadata, + scarb_metadata, + &args, + &workspace_dirs, + &ui, + )?; let result = run_for_package(args, &mut block_number_map, ui.clone()).await?; diff --git a/crates/forge/src/test_filter.rs b/crates/forge/src/test_filter.rs index f9ba77285d..ea50ec3eef 100644 --- a/crates/forge/src/test_filter.rs +++ b/crates/forge/src/test_filter.rs @@ -1,7 +1,6 @@ use crate::shared_cache::FailedTestsCache; use anyhow::Result; -use forge_runner::package_tests::TestCase; -use forge_runner::package_tests::with_config_resolved::TestCaseWithResolvedConfig; +use forge_runner::package_tests::{TestCase, TestCaseDeprecated}; use forge_runner::{TestCaseFilter, TestCaseIsIgnored}; #[derive(Debug, PartialEq)] @@ -78,10 +77,7 @@ impl TestsFilter { } } - pub(crate) fn filter_tests( - &self, - test_cases: &mut Vec, - ) -> Result<()> { + pub(crate) fn filter_tests(&self, test_cases: &mut Vec) -> Result<()> { match &self.name_filter { NameFilter::All => {} NameFilter::Match(filter) => { @@ -119,7 +115,7 @@ impl TestsFilter { } impl TestCaseFilter for TestsFilter { - fn should_be_run(&self, test_case: &TestCase) -> bool + fn should_be_run(&self, test_case: &TestCaseDeprecated) -> bool where T: TestCaseIsIgnored, { @@ -131,6 +127,14 @@ impl TestCaseFilter for TestsFilter { IgnoredFilter::NotIgnored => !ignored, } } + + fn should_run(&self, is_test_case_ignored: bool) -> bool { + match self.ignored_filter { + IgnoredFilter::All => true, + IgnoredFilter::Ignored => is_test_case_ignored, + IgnoredFilter::NotIgnored => !is_test_case_ignored, + } + } } #[cfg(test)] @@ -140,9 +144,9 @@ mod tests { use cairo_lang_sierra::program::Program; use cairo_lang_sierra::program::ProgramArtifact; use forge_runner::expected_result::ExpectedTestResult; - use forge_runner::package_tests::with_config_resolved::{ - TestCaseResolvedConfig, TestCaseWithResolvedConfig, TestTargetWithResolvedConfig, - }; + use forge_runner::package_tests::TestCase; + use forge_runner::package_tests::TestTarget; + use forge_runner::package_tests::with_config_resolved::TestCaseResolvedConfig; use forge_runner::package_tests::{TestDetails, TestTargetLocation}; use std::sync::Arc; use universal_sierra_compiler_api::compile_raw_sierra; @@ -190,15 +194,15 @@ mod tests { #[test] #[expect(clippy::too_many_lines)] fn filtering_tests() { - let mocked_tests = TestTargetWithResolvedConfig { + let mocked_tests = TestTarget { sierra_program: program_for_testing(), sierra_program_path: Arc::default(), - casm_program: Arc::new( + casm_program: Some(Arc::new( compile_raw_sierra(&serde_json::to_value(&program_for_testing().program).unwrap()) .unwrap(), - ), + )), test_cases: vec![ - TestCaseWithResolvedConfig { + TestCase { name: "crate1::do_thing".to_string(), test_details: TestDetails::default(), @@ -211,7 +215,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "crate2::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -224,7 +228,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "outer::crate2::execute_next_thing".to_string(), test_details: TestDetails::default(), @@ -237,7 +241,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "thing".to_string(), test_details: TestDetails::default(), @@ -270,7 +274,7 @@ mod tests { assert_eq!( filtered.test_cases, - vec![TestCaseWithResolvedConfig { + vec![TestCase { name: "crate1::do_thing".to_string(), test_details: TestDetails::default(), @@ -300,7 +304,7 @@ mod tests { assert_eq!( filtered.test_cases, - vec![TestCaseWithResolvedConfig { + vec![TestCase { name: "crate2::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -331,7 +335,7 @@ mod tests { assert_eq!( filtered.test_cases, vec![ - TestCaseWithResolvedConfig { + TestCase { name: "crate1::do_thing".to_string(), test_details: TestDetails::default(), @@ -344,7 +348,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "crate2::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -357,7 +361,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "outer::crate2::execute_next_thing".to_string(), test_details: TestDetails::default(), @@ -370,7 +374,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "thing".to_string(), test_details: TestDetails::default(), @@ -417,7 +421,7 @@ mod tests { assert_eq!( filtered.test_cases, vec![ - TestCaseWithResolvedConfig { + TestCase { name: "crate1::do_thing".to_string(), test_details: TestDetails::default(), @@ -430,7 +434,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "crate2::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -443,7 +447,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "outer::crate2::execute_next_thing".to_string(), test_details: TestDetails::default(), @@ -456,7 +460,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "thing".to_string(), test_details: TestDetails::default(), @@ -475,13 +479,13 @@ mod tests { #[test] fn filtering_with_no_tests() { - let mocked_tests = TestTargetWithResolvedConfig { + let mocked_tests = TestTarget { sierra_program: program_for_testing(), sierra_program_path: Arc::default(), - casm_program: Arc::new( + casm_program: Some(Arc::new( compile_raw_sierra(&serde_json::to_value(&program_for_testing().program).unwrap()) .unwrap(), - ), + )), test_cases: vec![], tests_location: TestTargetLocation::Lib, }; @@ -520,15 +524,15 @@ mod tests { #[test] #[expect(clippy::too_many_lines)] fn filtering_with_exact_match() { - let mocked_tests = TestTargetWithResolvedConfig { + let mocked_tests = TestTarget { sierra_program: program_for_testing(), sierra_program_path: Arc::default(), - casm_program: Arc::new( + casm_program: Some(Arc::new( compile_raw_sierra(&serde_json::to_value(&program_for_testing().program).unwrap()) .unwrap(), - ), + )), test_cases: vec![ - TestCaseWithResolvedConfig { + TestCase { name: "crate1::do_thing".to_string(), test_details: TestDetails::default(), @@ -541,7 +545,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "crate2::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -554,7 +558,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "outer::crate3::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -567,7 +571,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "do_thing".to_string(), test_details: TestDetails::default(), @@ -629,7 +633,7 @@ mod tests { assert_eq!( filtered.test_cases, - vec![TestCaseWithResolvedConfig { + vec![TestCase { name: "do_thing".to_string(), test_details: TestDetails::default(), @@ -659,7 +663,7 @@ mod tests { assert_eq!( filtered.test_cases, - vec![TestCaseWithResolvedConfig { + vec![TestCase { name: "crate1::do_thing".to_string(), test_details: TestDetails::default(), @@ -704,7 +708,7 @@ mod tests { assert_eq!( filtered.test_cases, - vec![TestCaseWithResolvedConfig { + vec![TestCase { name: "outer::crate3::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -722,15 +726,15 @@ mod tests { #[test] fn filtering_with_only_ignored() { - let mocked_tests = TestTargetWithResolvedConfig { + let mocked_tests = TestTarget { sierra_program: program_for_testing(), sierra_program_path: Arc::default(), - casm_program: Arc::new( + casm_program: Some(Arc::new( compile_raw_sierra(&serde_json::to_value(&program_for_testing().program).unwrap()) .unwrap(), - ), + )), test_cases: vec![ - TestCaseWithResolvedConfig { + TestCase { name: "crate1::do_thing".to_string(), test_details: TestDetails::default(), @@ -743,7 +747,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "crate2::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -756,7 +760,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "outer::crate3::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -769,7 +773,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "do_thing".to_string(), test_details: TestDetails::default(), @@ -801,7 +805,7 @@ mod tests { assert_eq!( filtered.test_cases, vec![ - TestCaseWithResolvedConfig { + TestCase { name: "crate2::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -814,7 +818,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "outer::crate3::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -834,15 +838,15 @@ mod tests { #[test] #[expect(clippy::too_many_lines)] fn filtering_with_include_ignored() { - let mocked_tests = TestTargetWithResolvedConfig { + let mocked_tests = TestTarget { sierra_program: program_for_testing(), sierra_program_path: Arc::default(), - casm_program: Arc::new( + casm_program: Some(Arc::new( compile_raw_sierra(&serde_json::to_value(&program_for_testing().program).unwrap()) .unwrap(), - ), + )), test_cases: vec![ - TestCaseWithResolvedConfig { + TestCase { name: "crate1::do_thing".to_string(), test_details: TestDetails::default(), @@ -855,7 +859,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "crate2::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -868,7 +872,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "outer::crate3::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -881,7 +885,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "do_thing".to_string(), test_details: TestDetails::default(), @@ -913,7 +917,7 @@ mod tests { assert_eq!( filtered.test_cases, vec![ - TestCaseWithResolvedConfig { + TestCase { name: "crate1::do_thing".to_string(), test_details: TestDetails::default(), @@ -926,7 +930,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "crate2::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -939,7 +943,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "outer::crate3::run_other_thing".to_string(), test_details: TestDetails::default(), @@ -952,7 +956,7 @@ mod tests { disable_predeployed_contracts: false, }, }, - TestCaseWithResolvedConfig { + TestCase { name: "do_thing".to_string(), test_details: TestDetails::default(), diff --git a/crates/forge/src/warn.rs b/crates/forge/src/warn.rs index 3c06464121..250a513195 100644 --- a/crates/forge/src/warn.rs +++ b/crates/forge/src/warn.rs @@ -1,7 +1,7 @@ use crate::{MINIMAL_SNFORGE_STD_DEPRECATED_VERSION, MINIMAL_SNFORGE_STD_VERSION}; use anyhow::{Result, anyhow}; use forge_runner::backtrace::is_backtrace_enabled; -use forge_runner::package_tests::with_config_resolved::TestTargetWithResolvedConfig; +use forge_runner::package_tests::{TestCase, TestTarget}; use foundry_ui::UI; use foundry_ui::components::warning::WarningMessage; use indoc::formatdoc; @@ -16,7 +16,7 @@ use std::sync::Arc; use url::Url; pub(crate) async fn warn_if_incompatible_rpc_version( - test_targets: &[TestTargetWithResolvedConfig], + test_targets: &[TestTarget], ui: Arc, ) -> Result<()> { let mut urls = HashSet::::new(); diff --git a/crates/forge/tests/integration/setup_fork.rs b/crates/forge/tests/integration/setup_fork.rs index 43d628415b..c98fedb438 100644 --- a/crates/forge/tests/integration/setup_fork.rs +++ b/crates/forge/tests/integration/setup_fork.rs @@ -1,15 +1,16 @@ +use anyhow::Result; +use camino::Utf8PathBuf; use cheatnet::runtime_extensions::forge_config_extension::config::BlockId; +use forge::block_number_map::BlockNumberMap; +use forge::run_tests::package::run_for_package; +use forge::scarb::config::ForkTarget; +use forge::test_filter::TestsFilter; +use forge_runner::package_tests::TestTarget; use foundry_ui::UI; use indoc::{formatdoc, indoc}; use std::num::NonZeroU32; use std::path::Path; use std::sync::Arc; - -use camino::Utf8PathBuf; -use forge::block_number_map::BlockNumberMap; -use forge::run_tests::package::run_for_package; -use forge::scarb::config::ForkTarget; -use forge::test_filter::TestsFilter; use tempfile::tempdir; use tokio::runtime::Runtime; @@ -127,12 +128,17 @@ fn fork_aliased_decorator() { let raw_test_targets = load_test_artifacts(&test.path().unwrap().join("target/dev"), package).unwrap(); + let test_targets = raw_test_targets + .into_iter() + .map(TestTarget::from_raw) + .collect::>>() + .unwrap(); let ui = Arc::new(UI::default()); let result = rt .block_on(run_for_package( RunForPackageArgs { - test_targets: raw_test_targets, + test_targets, package_name: "test_package".to_string(), tests_filter: TestsFilter::from_flags( None, @@ -218,12 +224,17 @@ fn fork_aliased_decorator_overrding() { let raw_test_targets = load_test_artifacts(&test.path().unwrap().join("target/dev"), package).unwrap(); + let test_targets = raw_test_targets + .into_iter() + .map(TestTarget::from_raw) + .collect::>>() + .unwrap(); let ui = Arc::new(UI::default()); let result = rt .block_on(run_for_package( RunForPackageArgs { - test_targets: raw_test_targets, + test_targets, package_name: "test_package".to_string(), tests_filter: TestsFilter::from_flags( None, diff --git a/crates/forge/tests/utils/running_tests.rs b/crates/forge/tests/utils/running_tests.rs index 107e0fe021..b6ee1f20a1 100644 --- a/crates/forge/tests/utils/running_tests.rs +++ b/crates/forge/tests/utils/running_tests.rs @@ -1,4 +1,5 @@ use crate::utils::runner::TestCase; +use anyhow::Result; use camino::Utf8PathBuf; use cheatnet::runtime_extensions::forge_runtime_extension::contracts_data::ContractsData; use forge::shared_cache::FailedTestsCache; @@ -13,6 +14,7 @@ use forge_runner::debugging::TraceArgs; use forge_runner::forge_config::{ ExecutionDataToSave, ForgeConfig, ForgeTrackedResource, OutputConfig, TestRunnerConfig, }; +use forge_runner::package_tests::{TestCandidate, TestTarget}; use forge_runner::test_target_summary::TestTargetSummary; use foundry_ui::UI; use scarb_api::ScarbCommand; @@ -45,11 +47,16 @@ pub fn run_test_case( let rt = Runtime::new().expect("Could not instantiate Runtime"); let raw_test_targets = load_test_artifacts(&test.path().unwrap().join("target/dev"), package).unwrap(); + let test_targets = raw_test_targets + .into_iter() + .map(TestTarget::from_raw) + .collect::>>>() + .unwrap(); let ui = Arc::new(UI::default()); rt.block_on(run_for_package( RunForPackageArgs { - test_targets: raw_test_targets, + test_targets, package_name: "test_package".to_string(), tests_filter: TestsFilter::from_flags( None,