From b2639c4a4aedd8bd8435b8f2f4e851f236dc7031 Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Mon, 3 Nov 2025 19:07:23 +0100 Subject: [PATCH 1/7] Add `test` function --- crates/forge/src/lib.rs | 4 +- crates/forge/src/run_tests/workspace.rs | 47 +++----------------- crates/forge/src/test.rs | 58 +++++++++++++++++++++++++ 3 files changed, 67 insertions(+), 42 deletions(-) create mode 100644 crates/forge/src/test.rs diff --git a/crates/forge/src/lib.rs b/crates/forge/src/lib.rs index 6c4db485e9..00751c34ae 100644 --- a/crates/forge/src/lib.rs +++ b/crates/forge/src/lib.rs @@ -8,7 +8,6 @@ use forge_runner::debugging::TraceArgs; use forge_runner::forge_config::ForgeTrackedResource; use foundry_ui::components::warning::WarningMessage; use foundry_ui::{Message, UI}; -use run_tests::workspace::run_for_workspace; use scarb_api::ScarbCommand; use scarb_api::metadata::metadata; use scarb_ui::args::{FeaturesSpec, PackagesFilter, ProfileSpec}; @@ -29,6 +28,7 @@ mod profile_validation; pub mod run_tests; pub mod scarb; pub mod shared_cache; +pub mod test; pub mod test_filter; mod warn; @@ -327,7 +327,7 @@ pub fn main_execution(ui: Arc) -> Result { .enable_all() .build()?; - rt.block_on(run_for_workspace(args, ui)) + rt.block_on(test::test(args, ui)) } ForgeSubcommand::CheckRequirements => { check_requirements(true, &ui)?; diff --git a/crates/forge/src/run_tests/workspace.rs b/crates/forge/src/run_tests/workspace.rs index 6fe1843e58..c67fb27d96 100644 --- a/crates/forge/src/run_tests/workspace.rs +++ b/crates/forge/src/run_tests/workspace.rs @@ -1,26 +1,16 @@ use super::package::RunForPackageArgs; -use crate::profile_validation::check_profile_compatibility; use crate::run_tests::messages::latest_blocks_numbers::LatestBlocksNumbersMessage; use crate::run_tests::messages::overall_summary::OverallSummaryMessage; use crate::run_tests::messages::tests_failure_summary::TestsFailureSummaryMessage; -use crate::warn::{ - error_if_snforge_std_deprecated_missing, error_if_snforge_std_deprecated_not_compatible, - error_if_snforge_std_not_compatible, warn_if_backtrace_without_panic_hint, - warn_if_snforge_std_deprecated_does_not_match_package_version, -}; use crate::{ - ColorOption, ExitStatus, MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT, TestArgs, - block_number_map::BlockNumberMap, run_tests::package::run_for_package, + ExitStatus, TestArgs, block_number_map::BlockNumberMap, run_tests::package::run_for_package, scarb::build_artifacts_with_scarb, shared_cache::FailedTestsCache, - warn::warn_if_snforge_std_does_not_match_package_version, }; use anyhow::{Context, Result}; use forge_runner::test_case_summary::AnyTestCaseSummary; use forge_runner::{CACHE_DIR, test_target_summary::TestTargetSummary}; use foundry_ui::UI; -use scarb_api::metadata::{MetadataOpts, metadata_with_opts}; use scarb_api::{ - ScarbCommand, metadata::{Metadata, PackageMetadata}, target_dir_for_workspace, }; @@ -30,41 +20,18 @@ use std::env; use std::sync::Arc; #[tracing::instrument(skip_all, level = "debug")] -pub async fn run_for_workspace(args: TestArgs, ui: Arc) -> Result { - match args.color { - // SAFETY: This runs in a single-threaded environment. - ColorOption::Always => unsafe { env::set_var("CLICOLOR_FORCE", "1") }, - // SAFETY: This runs in a single-threaded environment. - ColorOption::Never => unsafe { env::set_var("CLICOLOR", "0") }, - ColorOption::Auto => (), - } - - let scarb_metadata = metadata_with_opts(MetadataOpts { - profile: args.scarb_args.profile.specified(), - ..MetadataOpts::default() - })?; - - check_profile_compatibility(&args, &scarb_metadata)?; - - let scarb_version = ScarbCommand::version().run()?.scarb; - if scarb_version >= MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT { - error_if_snforge_std_not_compatible(&scarb_metadata)?; - warn_if_snforge_std_does_not_match_package_version(&scarb_metadata, &ui)?; - } else { - error_if_snforge_std_deprecated_missing(&scarb_metadata)?; - error_if_snforge_std_deprecated_not_compatible(&scarb_metadata)?; - warn_if_snforge_std_deprecated_does_not_match_package_version(&scarb_metadata, &ui)?; - } - - warn_if_backtrace_without_panic_hint(&scarb_metadata, &ui); - +pub async fn run_for_workspace( + scarb_metadata: &Metadata, + args: TestArgs, + ui: Arc, +) -> Result { let artifacts_dir_path = target_dir_for_workspace(&scarb_metadata).join(&scarb_metadata.current_profile); let packages: Vec = args .scarb_args .packages_filter - .match_many(&scarb_metadata) + .match_many(scarb_metadata) .context("Failed to find any packages matching the specified filter")?; let filter = PackagesFilter::generate_for::(packages.iter()); diff --git a/crates/forge/src/test.rs b/crates/forge/src/test.rs new file mode 100644 index 0000000000..32d4b4568b --- /dev/null +++ b/crates/forge/src/test.rs @@ -0,0 +1,58 @@ +use std::{env, sync::Arc}; + +use crate::profile_validation::check_profile_compatibility; +use crate::run_tests::workspace::run_for_workspace; +use crate::warn::warn_if_snforge_std_does_not_match_package_version; +use crate::warn::{ + error_if_snforge_std_deprecated_missing, error_if_snforge_std_deprecated_not_compatible, + error_if_snforge_std_not_compatible, warn_if_backtrace_without_panic_hint, + warn_if_snforge_std_deprecated_does_not_match_package_version, +}; +use crate::{ColorOption, ExitStatus, MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT, TestArgs}; +use anyhow::Result; +use foundry_ui::UI; +use scarb_api::metadata::metadata_with_opts; +use scarb_api::{ScarbCommand, metadata::MetadataOpts}; +use scarb_metadata::Metadata; + +#[tracing::instrument(skip_all, level = "debug")] +pub async fn test(args: TestArgs, ui: Arc) -> Result { + set_color_envs(&args.color); + + let scarb_metadata = metadata_with_opts(MetadataOpts { + profile: args.scarb_args.profile.specified(), + ..MetadataOpts::default() + })?; + + check_profile_compatibility(&args, &scarb_metadata)?; + + warn_if_scarb_version_not_compatible(&scarb_metadata, &ui)?; + warn_if_backtrace_without_panic_hint(&scarb_metadata, &ui); + + run_for_workspace(&scarb_metadata, args, ui).await +} + +fn set_color_envs(color: &ColorOption) { + match color { + // SAFETY: This runs in a single-threaded environment. + ColorOption::Always => unsafe { env::set_var("CLICOLOR_FORCE", "1") }, + // SAFETY: This runs in a single-threaded environment. + ColorOption::Never => unsafe { env::set_var("CLICOLOR", "0") }, + ColorOption::Auto => (), + } +} + +fn warn_if_scarb_version_not_compatible(scarb_metadata: &Metadata, ui: &Arc) -> Result<()> { + let scarb_version = ScarbCommand::version().run()?.scarb; + + if scarb_version >= MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT { + error_if_snforge_std_not_compatible(&scarb_metadata)?; + warn_if_snforge_std_does_not_match_package_version(&scarb_metadata, &ui)?; + } else { + error_if_snforge_std_deprecated_missing(&scarb_metadata)?; + error_if_snforge_std_deprecated_not_compatible(&scarb_metadata)?; + warn_if_snforge_std_deprecated_does_not_match_package_version(&scarb_metadata, &ui)?; + } + + Ok(()) +} From bd51ff3f26cae11812f781b5da388f899558e98a Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Wed, 5 Nov 2025 18:41:09 +0100 Subject: [PATCH 2/7] Fixes --- crates/forge/src/lib.rs | 2 - crates/forge/src/test.rs | 28 +-------- crates/forge/src/warn.rs | 119 +-------------------------------------- 3 files changed, 4 insertions(+), 145 deletions(-) diff --git a/crates/forge/src/lib.rs b/crates/forge/src/lib.rs index 6cc955e2ae..067819a6f0 100644 --- a/crates/forge/src/lib.rs +++ b/crates/forge/src/lib.rs @@ -37,8 +37,6 @@ pub const CAIRO_EDITION: &str = "2024_07"; const MINIMAL_SCARB_VERSION: Version = Version::new(2, 10, 0); const MINIMAL_RECOMMENDED_SCARB_VERSION: Version = Version::new(2, 11, 4); const MINIMAL_USC_VERSION: Version = Version::new(2, 0, 0); -const MINIMAL_SNFORGE_STD_VERSION: Version = Version::new(0, 50, 0); -const MINIMAL_SNFORGE_STD_DEPRECATED_VERSION: Version = Version::new(0, 50, 0); pub const MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT: Version = Version::new(2, 12, 0); #[derive(Parser, Debug)] diff --git a/crates/forge/src/test.rs b/crates/forge/src/test.rs index 32d4b4568b..b8d75cce0e 100644 --- a/crates/forge/src/test.rs +++ b/crates/forge/src/test.rs @@ -2,18 +2,12 @@ use std::{env, sync::Arc}; use crate::profile_validation::check_profile_compatibility; use crate::run_tests::workspace::run_for_workspace; -use crate::warn::warn_if_snforge_std_does_not_match_package_version; -use crate::warn::{ - error_if_snforge_std_deprecated_missing, error_if_snforge_std_deprecated_not_compatible, - error_if_snforge_std_not_compatible, warn_if_backtrace_without_panic_hint, - warn_if_snforge_std_deprecated_does_not_match_package_version, -}; -use crate::{ColorOption, ExitStatus, MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT, TestArgs}; +use crate::warn::warn_if_backtrace_without_panic_hint; +use crate::{ColorOption, ExitStatus, TestArgs}; use anyhow::Result; use foundry_ui::UI; +use scarb_api::metadata::MetadataOpts; use scarb_api::metadata::metadata_with_opts; -use scarb_api::{ScarbCommand, metadata::MetadataOpts}; -use scarb_metadata::Metadata; #[tracing::instrument(skip_all, level = "debug")] pub async fn test(args: TestArgs, ui: Arc) -> Result { @@ -26,7 +20,6 @@ pub async fn test(args: TestArgs, ui: Arc) -> Result { check_profile_compatibility(&args, &scarb_metadata)?; - warn_if_scarb_version_not_compatible(&scarb_metadata, &ui)?; warn_if_backtrace_without_panic_hint(&scarb_metadata, &ui); run_for_workspace(&scarb_metadata, args, ui).await @@ -41,18 +34,3 @@ fn set_color_envs(color: &ColorOption) { ColorOption::Auto => (), } } - -fn warn_if_scarb_version_not_compatible(scarb_metadata: &Metadata, ui: &Arc) -> Result<()> { - let scarb_version = ScarbCommand::version().run()?.scarb; - - if scarb_version >= MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT { - error_if_snforge_std_not_compatible(&scarb_metadata)?; - warn_if_snforge_std_does_not_match_package_version(&scarb_metadata, &ui)?; - } else { - error_if_snforge_std_deprecated_missing(&scarb_metadata)?; - error_if_snforge_std_deprecated_not_compatible(&scarb_metadata)?; - warn_if_snforge_std_deprecated_does_not_match_package_version(&scarb_metadata, &ui)?; - } - - Ok(()) -} diff --git a/crates/forge/src/warn.rs b/crates/forge/src/warn.rs index 3c06464121..79c4b41cb2 100644 --- a/crates/forge/src/warn.rs +++ b/crates/forge/src/warn.rs @@ -1,17 +1,13 @@ -use crate::{MINIMAL_SNFORGE_STD_DEPRECATED_VERSION, MINIMAL_SNFORGE_STD_VERSION}; -use anyhow::{Result, anyhow}; +use anyhow::Result; use forge_runner::backtrace::is_backtrace_enabled; use forge_runner::package_tests::with_config_resolved::TestTargetWithResolvedConfig; use foundry_ui::UI; use foundry_ui::components::warning::WarningMessage; use indoc::formatdoc; -use scarb_api::package_matches_version_requirement; use scarb_metadata::Metadata; -use semver::{Comparator, Op, Version, VersionReq}; use shared::rpc::create_rpc_client; use shared::verify_and_warn_if_incompatible_rpc_version; use std::collections::HashSet; -use std::env; use std::sync::Arc; use url::Url; @@ -50,119 +46,6 @@ pub(crate) async fn warn_if_incompatible_rpc_version( Ok(()) } -fn snforge_std_recommended_version() -> VersionReq { - let version = Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); - let comparator = Comparator { - op: Op::Caret, - major: version.major, - minor: Some(version.minor), - patch: Some(version.patch), - pre: version.pre, - }; - VersionReq { - comparators: vec![comparator], - } -} - -fn snforge_std_deprecated_recommended_version() -> VersionReq { - snforge_std_recommended_version() -} - -pub fn error_if_snforge_std_deprecated_missing(scarb_metadata: &Metadata) -> Result<()> { - if !scarb_metadata - .packages - .iter() - .any(|p| p.name == "snforge_std_deprecated") - { - return Err(anyhow!( - "On Scarb versions < 2.12.0, the `snforge_std` package must be replaced with `snforge_std_deprecated`. Please update it in Scarb.toml" - )); - } - Ok(()) -} - -pub fn error_if_snforge_std_deprecated_not_compatible(scarb_metadata: &Metadata) -> Result<()> { - let snforge_std_deprecated_version_requirement_comparator = Comparator { - op: Op::GreaterEq, - major: MINIMAL_SNFORGE_STD_DEPRECATED_VERSION.major, - minor: Some(MINIMAL_SNFORGE_STD_DEPRECATED_VERSION.minor), - patch: Some(MINIMAL_SNFORGE_STD_DEPRECATED_VERSION.patch), - pre: MINIMAL_SNFORGE_STD_DEPRECATED_VERSION.pre, - }; - let snforge_std_deprecated_version_requirement = VersionReq { - comparators: vec![snforge_std_deprecated_version_requirement_comparator], - }; - - if !package_matches_version_requirement( - scarb_metadata, - "snforge_std_deprecated", - &snforge_std_deprecated_version_requirement, - )? { - return Err(anyhow!( - "Package `snforge_std_deprecated` version does not meet the minimum required version {snforge_std_deprecated_version_requirement}. Please upgrade `snforge_std_deprecated` in Scarb.toml" - )); - } - Ok(()) -} - -pub fn warn_if_snforge_std_deprecated_does_not_match_package_version( - scarb_metadata: &Metadata, - ui: &UI, -) -> Result<()> { - let snforge_std_deprecated_version_requirement = snforge_std_deprecated_recommended_version(); - if !package_matches_version_requirement( - scarb_metadata, - "snforge_std_deprecated", - &snforge_std_deprecated_version_requirement, - )? { - ui.println(&WarningMessage::new(&format!( - "Package `snforge_std_deprecated` version does not meet the recommended version requirement {snforge_std_deprecated_version_requirement}, it might result in unexpected behaviour" - ))); - } - Ok(()) -} - -pub fn error_if_snforge_std_not_compatible(scarb_metadata: &Metadata) -> Result<()> { - let snforge_std_version_requirement_comparator = Comparator { - op: Op::GreaterEq, - major: MINIMAL_SNFORGE_STD_VERSION.major, - minor: Some(MINIMAL_SNFORGE_STD_VERSION.minor), - patch: Some(MINIMAL_SNFORGE_STD_VERSION.patch), - pre: MINIMAL_SNFORGE_STD_VERSION.pre, - }; - let snforge_std_version_requirement = VersionReq { - comparators: vec![snforge_std_version_requirement_comparator], - }; - - if !package_matches_version_requirement( - scarb_metadata, - "snforge_std", - &snforge_std_version_requirement, - )? { - return Err(anyhow!( - "Package snforge_std version does not meet the minimum required version {snforge_std_version_requirement}. Please upgrade snforge_std in Scarb.toml" - )); - } - Ok(()) -} - -pub fn warn_if_snforge_std_does_not_match_package_version( - scarb_metadata: &Metadata, - ui: &UI, -) -> Result<()> { - let snforge_std_version_requirement = snforge_std_recommended_version(); - if !package_matches_version_requirement( - scarb_metadata, - "snforge_std", - &snforge_std_version_requirement, - )? { - ui.println(&WarningMessage::new(&format!( - "Package snforge_std version does not meet the recommended version requirement {snforge_std_version_requirement}, it might result in unexpected behaviour" - ))); - } - Ok(()) -} - // TODO(#3679): Remove this function when we decide to bump minimal scarb version to 2.12. pub(crate) fn warn_if_backtrace_without_panic_hint(scarb_metadata: &Metadata, ui: &UI) { if is_backtrace_enabled() { From bf72b84ee061fc1a96ccf1f5837436d850aef7fe Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Wed, 5 Nov 2025 18:42:58 +0100 Subject: [PATCH 3/7] Revert "Fixes" This reverts commit bd51ff3f26cae11812f781b5da388f899558e98a. --- crates/forge/src/lib.rs | 2 + crates/forge/src/test.rs | 28 ++++++++- crates/forge/src/warn.rs | 119 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 145 insertions(+), 4 deletions(-) diff --git a/crates/forge/src/lib.rs b/crates/forge/src/lib.rs index 067819a6f0..6cc955e2ae 100644 --- a/crates/forge/src/lib.rs +++ b/crates/forge/src/lib.rs @@ -37,6 +37,8 @@ pub const CAIRO_EDITION: &str = "2024_07"; const MINIMAL_SCARB_VERSION: Version = Version::new(2, 10, 0); const MINIMAL_RECOMMENDED_SCARB_VERSION: Version = Version::new(2, 11, 4); const MINIMAL_USC_VERSION: Version = Version::new(2, 0, 0); +const MINIMAL_SNFORGE_STD_VERSION: Version = Version::new(0, 50, 0); +const MINIMAL_SNFORGE_STD_DEPRECATED_VERSION: Version = Version::new(0, 50, 0); pub const MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT: Version = Version::new(2, 12, 0); #[derive(Parser, Debug)] diff --git a/crates/forge/src/test.rs b/crates/forge/src/test.rs index b8d75cce0e..32d4b4568b 100644 --- a/crates/forge/src/test.rs +++ b/crates/forge/src/test.rs @@ -2,12 +2,18 @@ use std::{env, sync::Arc}; use crate::profile_validation::check_profile_compatibility; use crate::run_tests::workspace::run_for_workspace; -use crate::warn::warn_if_backtrace_without_panic_hint; -use crate::{ColorOption, ExitStatus, TestArgs}; +use crate::warn::warn_if_snforge_std_does_not_match_package_version; +use crate::warn::{ + error_if_snforge_std_deprecated_missing, error_if_snforge_std_deprecated_not_compatible, + error_if_snforge_std_not_compatible, warn_if_backtrace_without_panic_hint, + warn_if_snforge_std_deprecated_does_not_match_package_version, +}; +use crate::{ColorOption, ExitStatus, MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT, TestArgs}; use anyhow::Result; use foundry_ui::UI; -use scarb_api::metadata::MetadataOpts; use scarb_api::metadata::metadata_with_opts; +use scarb_api::{ScarbCommand, metadata::MetadataOpts}; +use scarb_metadata::Metadata; #[tracing::instrument(skip_all, level = "debug")] pub async fn test(args: TestArgs, ui: Arc) -> Result { @@ -20,6 +26,7 @@ pub async fn test(args: TestArgs, ui: Arc) -> Result { check_profile_compatibility(&args, &scarb_metadata)?; + warn_if_scarb_version_not_compatible(&scarb_metadata, &ui)?; warn_if_backtrace_without_panic_hint(&scarb_metadata, &ui); run_for_workspace(&scarb_metadata, args, ui).await @@ -34,3 +41,18 @@ fn set_color_envs(color: &ColorOption) { ColorOption::Auto => (), } } + +fn warn_if_scarb_version_not_compatible(scarb_metadata: &Metadata, ui: &Arc) -> Result<()> { + let scarb_version = ScarbCommand::version().run()?.scarb; + + if scarb_version >= MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT { + error_if_snforge_std_not_compatible(&scarb_metadata)?; + warn_if_snforge_std_does_not_match_package_version(&scarb_metadata, &ui)?; + } else { + error_if_snforge_std_deprecated_missing(&scarb_metadata)?; + error_if_snforge_std_deprecated_not_compatible(&scarb_metadata)?; + warn_if_snforge_std_deprecated_does_not_match_package_version(&scarb_metadata, &ui)?; + } + + Ok(()) +} diff --git a/crates/forge/src/warn.rs b/crates/forge/src/warn.rs index 79c4b41cb2..3c06464121 100644 --- a/crates/forge/src/warn.rs +++ b/crates/forge/src/warn.rs @@ -1,13 +1,17 @@ -use anyhow::Result; +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 foundry_ui::UI; use foundry_ui::components::warning::WarningMessage; use indoc::formatdoc; +use scarb_api::package_matches_version_requirement; use scarb_metadata::Metadata; +use semver::{Comparator, Op, Version, VersionReq}; use shared::rpc::create_rpc_client; use shared::verify_and_warn_if_incompatible_rpc_version; use std::collections::HashSet; +use std::env; use std::sync::Arc; use url::Url; @@ -46,6 +50,119 @@ pub(crate) async fn warn_if_incompatible_rpc_version( Ok(()) } +fn snforge_std_recommended_version() -> VersionReq { + let version = Version::parse(env!("CARGO_PKG_VERSION")).unwrap(); + let comparator = Comparator { + op: Op::Caret, + major: version.major, + minor: Some(version.minor), + patch: Some(version.patch), + pre: version.pre, + }; + VersionReq { + comparators: vec![comparator], + } +} + +fn snforge_std_deprecated_recommended_version() -> VersionReq { + snforge_std_recommended_version() +} + +pub fn error_if_snforge_std_deprecated_missing(scarb_metadata: &Metadata) -> Result<()> { + if !scarb_metadata + .packages + .iter() + .any(|p| p.name == "snforge_std_deprecated") + { + return Err(anyhow!( + "On Scarb versions < 2.12.0, the `snforge_std` package must be replaced with `snforge_std_deprecated`. Please update it in Scarb.toml" + )); + } + Ok(()) +} + +pub fn error_if_snforge_std_deprecated_not_compatible(scarb_metadata: &Metadata) -> Result<()> { + let snforge_std_deprecated_version_requirement_comparator = Comparator { + op: Op::GreaterEq, + major: MINIMAL_SNFORGE_STD_DEPRECATED_VERSION.major, + minor: Some(MINIMAL_SNFORGE_STD_DEPRECATED_VERSION.minor), + patch: Some(MINIMAL_SNFORGE_STD_DEPRECATED_VERSION.patch), + pre: MINIMAL_SNFORGE_STD_DEPRECATED_VERSION.pre, + }; + let snforge_std_deprecated_version_requirement = VersionReq { + comparators: vec![snforge_std_deprecated_version_requirement_comparator], + }; + + if !package_matches_version_requirement( + scarb_metadata, + "snforge_std_deprecated", + &snforge_std_deprecated_version_requirement, + )? { + return Err(anyhow!( + "Package `snforge_std_deprecated` version does not meet the minimum required version {snforge_std_deprecated_version_requirement}. Please upgrade `snforge_std_deprecated` in Scarb.toml" + )); + } + Ok(()) +} + +pub fn warn_if_snforge_std_deprecated_does_not_match_package_version( + scarb_metadata: &Metadata, + ui: &UI, +) -> Result<()> { + let snforge_std_deprecated_version_requirement = snforge_std_deprecated_recommended_version(); + if !package_matches_version_requirement( + scarb_metadata, + "snforge_std_deprecated", + &snforge_std_deprecated_version_requirement, + )? { + ui.println(&WarningMessage::new(&format!( + "Package `snforge_std_deprecated` version does not meet the recommended version requirement {snforge_std_deprecated_version_requirement}, it might result in unexpected behaviour" + ))); + } + Ok(()) +} + +pub fn error_if_snforge_std_not_compatible(scarb_metadata: &Metadata) -> Result<()> { + let snforge_std_version_requirement_comparator = Comparator { + op: Op::GreaterEq, + major: MINIMAL_SNFORGE_STD_VERSION.major, + minor: Some(MINIMAL_SNFORGE_STD_VERSION.minor), + patch: Some(MINIMAL_SNFORGE_STD_VERSION.patch), + pre: MINIMAL_SNFORGE_STD_VERSION.pre, + }; + let snforge_std_version_requirement = VersionReq { + comparators: vec![snforge_std_version_requirement_comparator], + }; + + if !package_matches_version_requirement( + scarb_metadata, + "snforge_std", + &snforge_std_version_requirement, + )? { + return Err(anyhow!( + "Package snforge_std version does not meet the minimum required version {snforge_std_version_requirement}. Please upgrade snforge_std in Scarb.toml" + )); + } + Ok(()) +} + +pub fn warn_if_snforge_std_does_not_match_package_version( + scarb_metadata: &Metadata, + ui: &UI, +) -> Result<()> { + let snforge_std_version_requirement = snforge_std_recommended_version(); + if !package_matches_version_requirement( + scarb_metadata, + "snforge_std", + &snforge_std_version_requirement, + )? { + ui.println(&WarningMessage::new(&format!( + "Package snforge_std version does not meet the recommended version requirement {snforge_std_version_requirement}, it might result in unexpected behaviour" + ))); + } + Ok(()) +} + // TODO(#3679): Remove this function when we decide to bump minimal scarb version to 2.12. pub(crate) fn warn_if_backtrace_without_panic_hint(scarb_metadata: &Metadata, ui: &UI) { if is_backtrace_enabled() { From 8954f159611a4428445ee43c03fc7349ebbc4ead Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Wed, 5 Nov 2025 18:49:21 +0100 Subject: [PATCH 4/7] Fixes --- crates/forge/src/test.rs | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/crates/forge/src/test.rs b/crates/forge/src/test.rs index 32d4b4568b..7303508b42 100644 --- a/crates/forge/src/test.rs +++ b/crates/forge/src/test.rs @@ -11,9 +11,9 @@ use crate::warn::{ use crate::{ColorOption, ExitStatus, MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT, TestArgs}; use anyhow::Result; use foundry_ui::UI; +use scarb_api::metadata::MetadataOpts; use scarb_api::metadata::metadata_with_opts; -use scarb_api::{ScarbCommand, metadata::MetadataOpts}; -use scarb_metadata::Metadata; +use scarb_api::version::scarb_version; #[tracing::instrument(skip_all, level = "debug")] pub async fn test(args: TestArgs, ui: Arc) -> Result { @@ -26,7 +26,17 @@ pub async fn test(args: TestArgs, ui: Arc) -> Result { check_profile_compatibility(&args, &scarb_metadata)?; - warn_if_scarb_version_not_compatible(&scarb_metadata, &ui)?; + let scarb_version = scarb_version()?.scarb; + + if scarb_version >= MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT { + error_if_snforge_std_not_compatible(&scarb_metadata)?; + warn_if_snforge_std_does_not_match_package_version(&scarb_metadata, &ui)?; + } else { + error_if_snforge_std_deprecated_missing(&scarb_metadata)?; + error_if_snforge_std_deprecated_not_compatible(&scarb_metadata)?; + warn_if_snforge_std_deprecated_does_not_match_package_version(&scarb_metadata, &ui)?; + } + warn_if_backtrace_without_panic_hint(&scarb_metadata, &ui); run_for_workspace(&scarb_metadata, args, ui).await @@ -41,18 +51,3 @@ fn set_color_envs(color: &ColorOption) { ColorOption::Auto => (), } } - -fn warn_if_scarb_version_not_compatible(scarb_metadata: &Metadata, ui: &Arc) -> Result<()> { - let scarb_version = ScarbCommand::version().run()?.scarb; - - if scarb_version >= MINIMAL_SCARB_VERSION_FOR_V2_MACROS_REQUIREMENT { - error_if_snforge_std_not_compatible(&scarb_metadata)?; - warn_if_snforge_std_does_not_match_package_version(&scarb_metadata, &ui)?; - } else { - error_if_snforge_std_deprecated_missing(&scarb_metadata)?; - error_if_snforge_std_deprecated_not_compatible(&scarb_metadata)?; - warn_if_snforge_std_deprecated_does_not_match_package_version(&scarb_metadata, &ui)?; - } - - Ok(()) -} From 3f3cb4d41160c35f3f0a82e5c8ce3c8772c6bf27 Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Wed, 5 Nov 2025 18:50:36 +0100 Subject: [PATCH 5/7] Formatting --- crates/forge/src/test.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/forge/src/test.rs b/crates/forge/src/test.rs index 7303508b42..56e2a33545 100644 --- a/crates/forge/src/test.rs +++ b/crates/forge/src/test.rs @@ -1,5 +1,3 @@ -use std::{env, sync::Arc}; - use crate::profile_validation::check_profile_compatibility; use crate::run_tests::workspace::run_for_workspace; use crate::warn::warn_if_snforge_std_does_not_match_package_version; @@ -14,6 +12,7 @@ use foundry_ui::UI; use scarb_api::metadata::MetadataOpts; use scarb_api::metadata::metadata_with_opts; use scarb_api::version::scarb_version; +use std::{env, sync::Arc}; #[tracing::instrument(skip_all, level = "debug")] pub async fn test(args: TestArgs, ui: Arc) -> Result { From 0fa273b83c956029f1d194fff17d34f43868d7aa Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Thu, 6 Nov 2025 08:33:42 +0100 Subject: [PATCH 6/7] Fix linting --- crates/forge/src/run_tests/workspace.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/forge/src/run_tests/workspace.rs b/crates/forge/src/run_tests/workspace.rs index 85e1e9b846..82b522fcdd 100644 --- a/crates/forge/src/run_tests/workspace.rs +++ b/crates/forge/src/run_tests/workspace.rs @@ -26,7 +26,7 @@ pub async fn run_for_workspace( ui: Arc, ) -> Result { let artifacts_dir_path = - target_dir_for_workspace(&scarb_metadata).join(&scarb_metadata.current_profile); + target_dir_for_workspace(scarb_metadata).join(&scarb_metadata.current_profile); let packages: Vec = args .scarb_args From 6ca8fc06fd101f7acff391965e31380271e670d0 Mon Sep 17 00:00:00 2001 From: Fiiranek Date: Thu, 6 Nov 2025 09:03:40 +0100 Subject: [PATCH 7/7] Fix linting --- crates/forge/src/run_tests/workspace.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/forge/src/run_tests/workspace.rs b/crates/forge/src/run_tests/workspace.rs index 82b522fcdd..858c48c5df 100644 --- a/crates/forge/src/run_tests/workspace.rs +++ b/crates/forge/src/run_tests/workspace.rs @@ -65,7 +65,7 @@ pub async fn run_for_workspace( let args = RunForPackageArgs::build( package, - &scarb_metadata, + scarb_metadata, &args, &cache_dir, &artifacts_dir_path,