From 2113d297c544b0873c1460e56d16f31b66481ddc Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Mon, 7 Oct 2024 18:54:54 +0200 Subject: [PATCH 01/26] Run `features` tests with scarb 2.8.3 on CI --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eac15b268..0b24a5d65 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -119,6 +119,7 @@ jobs: - uses: software-mansion/setup-universal-sierra-compiler@v1 - run: | cargo test --package forge --features scarb_2_8_3 e2e::contract_artifacts + cargo test --package forge --features scarb_2_8_3 e2e::features cargo test --package scarb-api --features scarb_2_8_3 get_starknet_artifacts_path test-forge-runner: From 2ddc2b7dd333b0593a37010edf41e355e38b386a Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Tue, 8 Oct 2024 17:08:47 +0200 Subject: [PATCH 02/26] Get features from all targets --- crates/scarb-api/src/lib.rs | 139 ++++++++++++++++++++++++++++-------- 1 file changed, 109 insertions(+), 30 deletions(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 2082356ad..f15ad94f1 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -75,23 +75,21 @@ fn artifacts_for_package(path: &Utf8Path) -> Result { Ok(starknet_artifacts) } +#[derive(PartialEq, Debug)] +struct ContractArtifactData { + path: Utf8PathBuf, + test_type: Option, +} + /// Try getting the path to `starknet_artifacts.json` file that is generated by `scarb build` or `scarb build --test` commands. /// If contract artifacts are produced as part of the test target and exist in both `unittest` and `integrationtest`, then the path to `integrationtest` will be returned. /// If the file is not present, `None` is returned. -fn get_starknet_artifacts_path( +fn get_starknet_artifacts_paths( target_dir: &Utf8Path, target_name: &str, current_profile: &str, use_test_target_contracts: bool, -) -> Option { - let starknet_artifacts_file_name = |test_type: Option<&str>| -> String { - if let Some(test_type) = test_type { - format!("{target_name}_{test_type}test.test.starknet_artifacts.json") - } else { - format!("{target_name}.starknet_artifacts.json") - } - }; - +) -> Option> { let check_path = |file_name: &str| -> Option { let path = target_dir.join(current_profile).join(file_name); @@ -102,12 +100,33 @@ fn get_starknet_artifacts_path( } }; + let starknet_artifacts_file_name = |test_type: Option<&str>| -> Option { + if let Some(test_type) = test_type { + let path = format!("{target_name}_{test_type}test.test.starknet_artifacts.json"); + let path = check_path(&path); + path.map(|path| ContractArtifactData { + path, + test_type: Some(test_type.to_string()), + }) + } else { + let path = format!("{target_name}.starknet_artifacts.json"); + let path = check_path(&path); + path.map(|path| ContractArtifactData { + path, + test_type: None, + }) + } + }; + if use_test_target_contracts { - ["integration", "unit"] - .iter() - .find_map(|test_type| check_path(&starknet_artifacts_file_name(Some(test_type)))) + Some( + ["integration", "unit"] + .iter() + .filter_map(|test_type| starknet_artifacts_file_name(Some(test_type))) + .collect(), + ) } else { - check_path(&starknet_artifacts_file_name(None)) + Some(vec![starknet_artifacts_file_name(None)?]) } } @@ -120,7 +139,7 @@ pub fn get_contracts_artifacts_and_source_sierra_paths( ) -> Result> { let target_name = target_name_for_package(metadata, package)?; let target_dir = target_dir_for_workspace(metadata); - let maybe_contracts_path = get_starknet_artifacts_path( + let maybe_contracts_path = get_starknet_artifacts_paths( &target_dir, &target_name, profile.unwrap_or(metadata.current_profile.as_str()), @@ -128,13 +147,48 @@ pub fn get_contracts_artifacts_and_source_sierra_paths( ); let map = match maybe_contracts_path { - Some(contracts_path) => load_contracts_artifacts_and_source_sierra_paths(&contracts_path)?, + Some(contracts_path) => load_contracts_artifacts(&contracts_path)?, None => HashMap::default(), }; Ok(map) } +fn load_contracts_artifacts( + contracts_paths: &[ContractArtifactData], +) -> Result> { + if contracts_paths.is_empty() { + return Ok(HashMap::new()); + } + + // TODO use const + let base_artifacts = contracts_paths + .iter() + .find(|paths| paths.test_type == Some("integration".to_string())) + .unwrap_or( + contracts_paths + .first() + .expect("Must have at least one value because of the assert above"), + ); + + let other_artifacts: Vec<&ContractArtifactData> = contracts_paths + .iter() + .filter(|path| path != &base_artifacts) + .collect(); + + let mut base_artifacts = + load_contracts_artifacts_and_source_sierra_paths(&base_artifacts.path)?; + + for artifact in other_artifacts { + let artifact = load_contracts_artifacts_and_source_sierra_paths(&artifact.path)?; + for (key, value) in artifact { + base_artifacts.entry(key).or_insert(value); + } + } + + Ok(base_artifacts) +} + fn load_contracts_artifacts_and_source_sierra_paths( contracts_path: &Utf8PathBuf, ) -> Result> { @@ -287,7 +341,7 @@ mod tests { .run() .unwrap(); - let path = get_starknet_artifacts_path( + let path = get_starknet_artifacts_paths( &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), "basic_package", "dev", @@ -297,8 +351,14 @@ mod tests { assert_eq!( path, - temp.path() - .join("target/dev/basic_package.starknet_artifacts.json") + vec![ContractArtifactData { + path: Utf8PathBuf::from_path_buf( + temp.path() + .join("target/dev/basic_package.starknet_artifacts.json") + ) + .unwrap(), + test_type: None + }] ); } @@ -314,8 +374,8 @@ mod tests { .run() .unwrap(); - let path = get_starknet_artifacts_path( - &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), + let path = get_starknet_artifacts_paths( + &Utf8PathBuf::from_path_buf(temp.join("target")).unwrap(), "basic_package", "dev", true, @@ -324,8 +384,14 @@ mod tests { assert_eq!( path, - temp.path() - .join("target/dev/basic_package_unittest.test.starknet_artifacts.json") + vec![ContractArtifactData { + path: Utf8PathBuf::from_path_buf( + temp.path() + .join("target/dev/basic_package_unittest.test.starknet_artifacts.json") + ) + .unwrap(), + test_type: None + }] ); } @@ -354,7 +420,7 @@ mod tests { .run() .unwrap(); - let path = get_starknet_artifacts_path( + let path = get_starknet_artifacts_paths( &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), "basic_package", "dev", @@ -364,8 +430,15 @@ mod tests { assert_eq!( path, - temp.path() - .join("target/dev/basic_package_integrationtest.test.starknet_artifacts.json") + vec![ContractArtifactData { + path: Utf8PathBuf::from_path_buf( + temp.path().join( + "target/dev/basic_package_integrationtest.test.starknet_artifacts.json" + ) + ) + .unwrap(), + test_type: None + }] ); } @@ -455,7 +528,7 @@ mod tests { .run() .unwrap(); - let path = get_starknet_artifacts_path( + let path = get_starknet_artifacts_paths( &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), "essa", "dev", @@ -465,7 +538,13 @@ mod tests { assert_eq!( path, - temp.path().join("target/dev/essa.starknet_artifacts.json") + vec![ContractArtifactData { + path: Utf8PathBuf::from_path_buf( + temp.path().join("target/dev/essa.starknet_artifacts.json") + ) + .unwrap(), + test_type: None + }] ); } @@ -490,7 +569,7 @@ mod tests { .run() .unwrap(); - let path = get_starknet_artifacts_path( + let path = get_starknet_artifacts_paths( &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), "empty_lib", "dev", @@ -503,7 +582,7 @@ mod tests { fn get_starknet_artifacts_path_for_project_without_scarb_build() { let temp = setup_package("basic_package"); - let path = get_starknet_artifacts_path( + let path = get_starknet_artifacts_paths( &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), "basic_package", "dev", From 9c70b1960622d72f063dba34f8af5ccc6a3360b8 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 9 Oct 2024 10:59:28 +0200 Subject: [PATCH 03/26] Update tests --- crates/scarb-api/src/lib.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index f15ad94f1..e1db147dd 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -390,7 +390,7 @@ mod tests { .join("target/dev/basic_package_unittest.test.starknet_artifacts.json") ) .unwrap(), - test_type: None + test_type: Some("unit".to_string()) }] ); } @@ -430,15 +430,23 @@ mod tests { assert_eq!( path, - vec![ContractArtifactData { - path: Utf8PathBuf::from_path_buf( - temp.path().join( + vec![ + ContractArtifactData { + path: Utf8PathBuf::from_path_buf(temp.path().join( "target/dev/basic_package_integrationtest.test.starknet_artifacts.json" + )) + .unwrap(), + test_type: Some("integration".to_string()) + }, + ContractArtifactData { + path: Utf8PathBuf::from_path_buf( + temp.path() + .join("target/dev/basic_package_unittest.test.starknet_artifacts.json") ) - ) - .unwrap(), - test_type: None - }] + .unwrap(), + test_type: Some("unit".to_string()) + }, + ] ); } From 8b201d74de261d70356f1f505ba51b607f740144 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 9 Oct 2024 12:23:09 +0200 Subject: [PATCH 04/26] Move `test_targets_by_name` to scarb-api --- crates/forge/src/scarb.rs | 26 ++------------------------ crates/scarb-api/src/lib.rs | 23 ++++++++++++++++++++++- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/crates/forge/src/scarb.rs b/crates/forge/src/scarb.rs index 0215cb2e4..57fcbcac2 100644 --- a/crates/forge/src/scarb.rs +++ b/crates/forge/src/scarb.rs @@ -5,11 +5,10 @@ use camino::Utf8Path; use configuration::PackageConfig; use forge_runner::package_tests::raw::TestTargetRaw; use forge_runner::package_tests::TestTargetLocation; -use scarb_api::ScarbCommand; -use scarb_metadata::{PackageMetadata, TargetMetadata}; +use scarb_api::{test_targets_by_name, ScarbCommand}; +use scarb_metadata::PackageMetadata; use scarb_ui::args::{FeaturesSpec, PackagesFilter}; use semver::Version; -use std::collections::HashMap; use std::fs::read_to_string; use std::io::ErrorKind; @@ -76,27 +75,6 @@ fn build_test_artifacts_with_scarb(filter: PackagesFilter, features: FeaturesSpe Ok(()) } -/// collecting by name allow us to dedup targets -/// we do it because they use same sierra and we display them without distinction anyway -fn test_targets_by_name(package: &PackageMetadata) -> HashMap { - fn test_target_name(target: &TargetMetadata) -> String { - // this is logic copied from scarb: https://github.com/software-mansion/scarb/blob/90ab01cb6deee48210affc2ec1dc94d540ab4aea/extensions/scarb-cairo-test/src/main.rs#L115 - target - .params - .get("group-id") // by unit tests grouping - .and_then(|v| v.as_str()) - .map(ToString::to_string) - .unwrap_or(target.name.clone()) // else by integration test name - } - - package - .targets - .iter() - .filter(|target| target.kind == "test") - .map(|target| (test_target_name(target), target)) - .collect() -} - pub fn load_test_artifacts( target_dir: &Utf8Path, package: &PackageMetadata, diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index e1db147dd..28761f395 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -267,6 +267,27 @@ pub fn package_matches_version_requirement( } } +/// collecting by name allow us to dedup targets +/// we do it because they use same sierra and we display them without distinction anyway +pub fn test_targets_by_name(package: &PackageMetadata) -> HashMap { + fn test_target_name(target: &TargetMetadata) -> String { + // this is logic copied from scarb: https://github.com/software-mansion/scarb/blob/90ab01cb6deee48210affc2ec1dc94d540ab4aea/extensions/scarb-cairo-test/src/main.rs#L115 + target + .params + .get("group-id") // by unit tests grouping + .and_then(|v| v.as_str()) + .map(ToString::to_string) + .unwrap_or(target.name.clone()) // else by integration test name + } + + package + .targets + .iter() + .filter(|target| target.kind == "test") + .map(|target| (test_target_name(target), target)) + .collect() +} + #[cfg(test)] mod tests { use super::*; @@ -704,4 +725,4 @@ mod tests { assert_eq!(target_name, "basic_package"); } -} +} \ No newline at end of file From c9ddf28337733ccd7ee4757a7aba0a01078fb080 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 9 Oct 2024 16:26:51 +0200 Subject: [PATCH 05/26] Update package loading logic --- crates/cheatnet/tests/common/mod.rs | 15 +- crates/forge/src/run_tests/package.rs | 4 +- crates/forge/test_utils/src/runner.rs | 9 +- crates/scarb-api/src/lib.rs | 211 +++++++++++++---------- crates/sncast/src/helpers/scarb_utils.rs | 28 +-- 5 files changed, 150 insertions(+), 117 deletions(-) diff --git a/crates/cheatnet/tests/common/mod.rs b/crates/cheatnet/tests/common/mod.rs index 33f8ce2a5..0ea41269a 100644 --- a/crates/cheatnet/tests/common/mod.rs +++ b/crates/cheatnet/tests/common/mod.rs @@ -26,7 +26,9 @@ use conversions::string::TryFromHexStr; use conversions::IntoConv; use runtime::starknet::context::build_context; use scarb_api::metadata::MetadataCommandExt; -use scarb_api::{get_contracts_artifacts_and_source_sierra_paths, ScarbCommand}; +use scarb_api::{ + get_contracts_artifacts_and_source_sierra_paths, target_dir_for_workspace, ScarbCommand, +}; use starknet::core::utils::get_selector_from_name; use starknet_api::core::{ClassHash, ContractAddress, EntryPointSelector}; use starknet_api::deprecated_contract_class::EntryPointType; @@ -72,12 +74,17 @@ pub fn get_contracts() -> ContractsData { .manifest_path("tests/contracts/Scarb.toml") .run() .unwrap(); + let target_dir = target_dir_for_workspace(&scarb_metadata).join("dev"); let package = scarb_metadata.packages.first().unwrap(); - let contracts = - get_contracts_artifacts_and_source_sierra_paths(&scarb_metadata, &package.id, None, false) - .unwrap(); + let contracts = get_contracts_artifacts_and_source_sierra_paths( + &scarb_metadata, + &target_dir, + package, + false, + ) + .unwrap(); ContractsData::try_from(contracts).unwrap() } diff --git a/crates/forge/src/run_tests/package.rs b/crates/forge/src/run_tests/package.rs index 389df1035..1cba1d051 100644 --- a/crates/forge/src/run_tests/package.rs +++ b/crates/forge/src/run_tests/package.rs @@ -54,8 +54,8 @@ impl RunForPackageArgs { let contracts = get_contracts_artifacts_and_source_sierra_paths( scarb_metadata, - &package.id, - None, + snforge_target_dir_path, + &package, !should_compile_starknet_contract_target( &scarb_metadata.app_version_info.version, args.no_optimization, diff --git a/crates/forge/test_utils/src/runner.rs b/crates/forge/test_utils/src/runner.rs index 9f0e45c42..be82a815d 100644 --- a/crates/forge/test_utils/src/runner.rs +++ b/crates/forge/test_utils/src/runner.rs @@ -13,8 +13,8 @@ use forge_runner::{ }; use indoc::formatdoc; use scarb_api::{ - get_contracts_artifacts_and_source_sierra_paths, metadata::MetadataCommandExt, ScarbCommand, - StarknetContractArtifacts, + get_contracts_artifacts_and_source_sierra_paths, metadata::MetadataCommandExt, + target_dir_for_workspace, ScarbCommand, StarknetContractArtifacts, }; use shared::command::CommandExt; use std::{ @@ -96,11 +96,12 @@ impl Contract { .iter() .find(|package| package.name == "contract") .unwrap(); + let target_dir = target_dir_for_workspace(&scarb_metadata).join("dev"); let contract = get_contracts_artifacts_and_source_sierra_paths( &scarb_metadata, - &package.id, - None, + &target_dir, + package, false, ) .unwrap() diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 28761f395..65176bdcd 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -1,10 +1,13 @@ use anyhow::{anyhow, Context, Result}; use camino::{Utf8Path, Utf8PathBuf}; -use scarb_metadata::{CompilationUnitMetadata, Metadata, PackageId}; +use scarb_metadata::{ + CompilationUnitMetadata, Metadata, PackageId, PackageMetadata, TargetMetadata, +}; use semver::VersionReq; use serde::Deserialize; use std::collections::HashMap; use std::fs; +use std::str::FromStr; use universal_sierra_compiler_api::{compile_sierra_at_path, SierraType}; pub use command::*; @@ -81,77 +84,80 @@ struct ContractArtifactData { test_type: Option, } -/// Try getting the path to `starknet_artifacts.json` file that is generated by `scarb build` or `scarb build --test` commands. -/// If contract artifacts are produced as part of the test target and exist in both `unittest` and `integrationtest`, then the path to `integrationtest` will be returned. -/// If the file is not present, `None` is returned. -fn get_starknet_artifacts_paths( +fn build_target_path(target_dir: &Utf8Path, file_name: &str) -> Option { + let path = target_dir.join(file_name); + + if path.exists() { + Some(path) + } else { + None + } +} + +fn get_starknet_artifacts_paths_from_test_targets( target_dir: &Utf8Path, - target_name: &str, - current_profile: &str, - use_test_target_contracts: bool, -) -> Option> { - let check_path = |file_name: &str| -> Option { - let path = target_dir.join(current_profile).join(file_name); - - if path.exists() { - Some(path) - } else { - None - } - }; + test_targets: &HashMap, +) -> Vec { + let starknet_artifacts_file_name = + |name: &str, metadata: &TargetMetadata| -> Option { + let path = format!("{name}.test.starknet_artifacts.json"); + let path = build_target_path(target_dir, &path); + let test_type = metadata + .params + // TODO get rid of hardcoding + .get("test-type") + .and_then(|value| value.as_str()) + .unwrap(); - let starknet_artifacts_file_name = |test_type: Option<&str>| -> Option { - if let Some(test_type) = test_type { - let path = format!("{target_name}_{test_type}test.test.starknet_artifacts.json"); - let path = check_path(&path); path.map(|path| ContractArtifactData { - path, + path: Utf8PathBuf::from_str(path.as_str()).unwrap(), test_type: Some(test_type.to_string()), }) - } else { - let path = format!("{target_name}.starknet_artifacts.json"); - let path = check_path(&path); - path.map(|path| ContractArtifactData { - path, - test_type: None, - }) - } - }; + }; - if use_test_target_contracts { - Some( - ["integration", "unit"] - .iter() - .filter_map(|test_type| starknet_artifacts_file_name(Some(test_type))) - .collect(), - ) - } else { - Some(vec![starknet_artifacts_file_name(None)?]) - } + test_targets + .iter() + .filter_map(|(target_name, metadata)| starknet_artifacts_file_name(target_name, metadata)) + .collect() +} + +/// Try getting the path to `starknet_artifacts.json` file that is generated by `scarb build` or `scarb build --test` commands. +/// If contract artifacts are produced as part of the test target and exist in both `unittest` and `integrationtest`, then the path to `integrationtest` will be returned. +/// If the file is not present, `None` is returned. +fn get_starknet_artifacts_path( + target_dir: &Utf8Path, + target_name: &str, +) -> Option { + let path = format!("{target_name}.starknet_artifacts.json"); + let path = build_target_path(target_dir, &path); + path.map(|path| ContractArtifactData { + path, + test_type: None, + }) } /// Get the map with `StarknetContractArtifacts` for the given package pub fn get_contracts_artifacts_and_source_sierra_paths( metadata: &Metadata, - package: &PackageId, - profile: Option<&str>, + target_dir: &Utf8Path, + package: &PackageMetadata, use_test_target_contracts: bool, ) -> Result> { - let target_name = target_name_for_package(metadata, package)?; - let target_dir = target_dir_for_workspace(metadata); - let maybe_contracts_path = get_starknet_artifacts_paths( - &target_dir, - &target_name, - profile.unwrap_or(metadata.current_profile.as_str()), - use_test_target_contracts, - ); - - let map = match maybe_contracts_path { - Some(contracts_path) => load_contracts_artifacts(&contracts_path)?, - None => HashMap::default(), + let contracts_paths = if use_test_target_contracts { + let test_targets = test_targets_by_name(package); + get_starknet_artifacts_paths_from_test_targets(target_dir, &test_targets) + } else { + let target_name = target_name_for_package(metadata, &package.id)?; + get_starknet_artifacts_path(target_dir, &target_name) + .into_iter() + .collect() }; - Ok(map) + if contracts_paths.is_empty() { + Ok(HashMap::default()) + } else { + load_contracts_artifacts(&contracts_paths) + } } fn load_contracts_artifacts( @@ -269,6 +275,7 @@ pub fn package_matches_version_requirement( /// collecting by name allow us to dedup targets /// we do it because they use same sierra and we display them without distinction anyway +#[must_use] pub fn test_targets_by_name(package: &PackageMetadata) -> HashMap { fn test_target_name(target: &TargetMetadata) -> String { // this is logic copied from scarb: https://github.com/software-mansion/scarb/blob/90ab01cb6deee48210affc2ec1dc94d540ab4aea/extensions/scarb-cairo-test/src/main.rs#L115 @@ -362,24 +369,22 @@ mod tests { .run() .unwrap(); - let path = get_starknet_artifacts_paths( - &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), + let path = get_starknet_artifacts_path( + &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target").join("dev")).unwrap(), "basic_package", - "dev", - false, ) .unwrap(); assert_eq!( path, - vec![ContractArtifactData { + ContractArtifactData { path: Utf8PathBuf::from_path_buf( temp.path() .join("target/dev/basic_package.starknet_artifacts.json") ) .unwrap(), test_type: None - }] + } ); } @@ -395,13 +400,21 @@ mod tests { .run() .unwrap(); - let path = get_starknet_artifacts_paths( - &Utf8PathBuf::from_path_buf(temp.join("target")).unwrap(), - "basic_package", - "dev", - true, - ) - .unwrap(); + let metadata = ScarbCommand::metadata() + .current_dir(temp.path()) + .run() + .unwrap(); + + let package = metadata + .packages + .iter() + .find(|p| p.name == "basic_package") + .unwrap(); + + let path = get_starknet_artifacts_paths_from_test_targets( + &Utf8PathBuf::from_path_buf(temp.join("target").join("dev")).unwrap(), + &test_targets_by_name(package), + ); assert_eq!( path, @@ -441,13 +454,21 @@ mod tests { .run() .unwrap(); - let path = get_starknet_artifacts_paths( - &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), - "basic_package", - "dev", - true, - ) - .unwrap(); + let metadata = ScarbCommand::metadata() + .current_dir(temp.path()) + .run() + .unwrap(); + + let package = metadata + .packages + .iter() + .find(|p| p.name == "basic_package") + .unwrap(); + + let path = get_starknet_artifacts_paths_from_test_targets( + &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target").join("dev")).unwrap(), + &test_targets_by_name(package), + ); assert_eq!( path, @@ -557,23 +578,21 @@ mod tests { .run() .unwrap(); - let path = get_starknet_artifacts_paths( - &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), + let path = get_starknet_artifacts_path( + &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target").join("dev")).unwrap(), "essa", - "dev", - false, ) .unwrap(); assert_eq!( path, - vec![ContractArtifactData { + ContractArtifactData { path: Utf8PathBuf::from_path_buf( temp.path().join("target/dev/essa.starknet_artifacts.json") ) .unwrap(), test_type: None - }] + } ); } @@ -598,11 +617,9 @@ mod tests { .run() .unwrap(); - let path = get_starknet_artifacts_paths( - &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), + let path = get_starknet_artifacts_path( + &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target").join("dev")).unwrap(), "empty_lib", - "dev", - false, ); assert!(path.is_none()); } @@ -611,11 +628,9 @@ mod tests { fn get_starknet_artifacts_path_for_project_without_scarb_build() { let temp = setup_package("basic_package"); - let path = get_starknet_artifacts_paths( - &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target")).unwrap(), + let path = get_starknet_artifacts_path( + &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target").join("dev")).unwrap(), "basic_package", - "dev", - false, ); assert!(path.is_none()); } @@ -671,10 +686,16 @@ mod tests { .run() .unwrap(); + let target_dir = target_dir_for_workspace(&metadata).join("dev"); let package = metadata.packages.first().unwrap(); - let contracts = - get_contracts_artifacts_and_source_sierra_paths(&metadata, &package.id, None, false) - .unwrap(); + + let contracts = get_contracts_artifacts_and_source_sierra_paths( + &metadata, + target_dir.as_path(), + package, + false, + ) + .unwrap(); assert!(contracts.contains_key("ERC20")); assert!(contracts.contains_key("HelloStarknet")); @@ -725,4 +746,4 @@ mod tests { assert_eq!(target_name, "basic_package"); } -} \ No newline at end of file +} diff --git a/crates/sncast/src/helpers/scarb_utils.rs b/crates/sncast/src/helpers/scarb_utils.rs index 52d69eb57..0cce5b32e 100644 --- a/crates/sncast/src/helpers/scarb_utils.rs +++ b/crates/sncast/src/helpers/scarb_utils.rs @@ -3,7 +3,7 @@ use camino::{Utf8Path, Utf8PathBuf}; use scarb_api::{ get_contracts_artifacts_and_source_sierra_paths, metadata::{Metadata, MetadataCommand, PackageMetadata}, - ScarbCommand, ScarbCommandError, StarknetContractArtifacts, + target_dir_for_workspace, ScarbCommand, ScarbCommandError, StarknetContractArtifacts, }; use scarb_ui::args::PackagesFilter; use shared::{command::CommandExt, print::print_as_warning}; @@ -161,11 +161,13 @@ pub fn build_and_load_artifacts( .map_err(|e| anyhow!(format!("Failed to build using scarb; {e}")))?; let metadata = get_scarb_metadata_with_deps(&config.scarb_toml_path)?; + let target_dir = target_dir_for_workspace(&metadata); + if metadata.profiles.contains(&config.profile) { Ok(get_contracts_artifacts_and_source_sierra_paths( &metadata, - &package.id, - Some(&config.profile), + &target_dir.join(&config.profile), + package, false, )? .into_iter() @@ -176,15 +178,17 @@ pub fn build_and_load_artifacts( print_as_warning(&anyhow!( "Profile {profile} does not exist in scarb, using '{default_profile}' profile." )); - Ok(get_contracts_artifacts_and_source_sierra_paths( - &metadata, - &package.id, - Some(default_profile), - false, - )? - .into_iter() - .map(|(name, (artifacts, _))| (name, artifacts)) - .collect()) + Ok( + get_contracts_artifacts_and_source_sierra_paths( + &metadata, + &target_dir, + package, + false, + )? + .into_iter() + .map(|(name, (artifacts, _))| (name, artifacts)) + .collect(), + ) } } From 08a59352b04b74824a45399713eafa241ae52d44 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 9 Oct 2024 17:29:06 +0200 Subject: [PATCH 06/26] Fix dependencies in workspace test --- .../tests/data/hello_workspaces/crates/addition/Scarb.toml | 2 -- .../tests/data/hello_workspaces/crates/fibonacci/Scarb.toml | 2 -- 2 files changed, 4 deletions(-) diff --git a/crates/forge/tests/data/hello_workspaces/crates/addition/Scarb.toml b/crates/forge/tests/data/hello_workspaces/crates/addition/Scarb.toml index 12d4333e6..9a2dea2d7 100644 --- a/crates/forge/tests/data/hello_workspaces/crates/addition/Scarb.toml +++ b/crates/forge/tests/data/hello_workspaces/crates/addition/Scarb.toml @@ -4,8 +4,6 @@ version.workspace = true [dependencies] starknet.workspace = true - -[dev-dependencies] snforge_std.workspace = true [[target.starknet-contract]] diff --git a/crates/forge/tests/data/hello_workspaces/crates/fibonacci/Scarb.toml b/crates/forge/tests/data/hello_workspaces/crates/fibonacci/Scarb.toml index 837c4647e..fc4c133c4 100644 --- a/crates/forge/tests/data/hello_workspaces/crates/fibonacci/Scarb.toml +++ b/crates/forge/tests/data/hello_workspaces/crates/fibonacci/Scarb.toml @@ -11,8 +11,6 @@ snforge.workspace = true [dependencies] addition = { path = "../addition" } starknet.workspace = true - -[dev-dependencies] snforge_std.workspace = true [[target.starknet-contract]] From f62fd3d2f903b838038061e98d40c2c49ef5ad92 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Fri, 11 Oct 2024 14:13:16 +0200 Subject: [PATCH 07/26] Fix dependencies in workspace test --- crates/forge/tests/data/hello_workspaces/Scarb.toml | 3 +++ .../tests/data/hello_workspaces/crates/addition/Scarb.toml | 2 ++ .../tests/data/hello_workspaces/crates/fibonacci/Scarb.toml | 2 ++ 3 files changed, 7 insertions(+) diff --git a/crates/forge/tests/data/hello_workspaces/Scarb.toml b/crates/forge/tests/data/hello_workspaces/Scarb.toml index bb1688e7c..b3642ca18 100644 --- a/crates/forge/tests/data/hello_workspaces/Scarb.toml +++ b/crates/forge/tests/data/hello_workspaces/Scarb.toml @@ -30,5 +30,8 @@ starknet.workspace = true fibonacci = { path = "crates/fibonacci" } addition = { path = "crates/addition" } +[dev-dependencies] +snforge_std.workspace = true + [[target.starknet-contract]] sierra = true diff --git a/crates/forge/tests/data/hello_workspaces/crates/addition/Scarb.toml b/crates/forge/tests/data/hello_workspaces/crates/addition/Scarb.toml index 9a2dea2d7..12d4333e6 100644 --- a/crates/forge/tests/data/hello_workspaces/crates/addition/Scarb.toml +++ b/crates/forge/tests/data/hello_workspaces/crates/addition/Scarb.toml @@ -4,6 +4,8 @@ version.workspace = true [dependencies] starknet.workspace = true + +[dev-dependencies] snforge_std.workspace = true [[target.starknet-contract]] diff --git a/crates/forge/tests/data/hello_workspaces/crates/fibonacci/Scarb.toml b/crates/forge/tests/data/hello_workspaces/crates/fibonacci/Scarb.toml index fc4c133c4..837c4647e 100644 --- a/crates/forge/tests/data/hello_workspaces/crates/fibonacci/Scarb.toml +++ b/crates/forge/tests/data/hello_workspaces/crates/fibonacci/Scarb.toml @@ -11,6 +11,8 @@ snforge.workspace = true [dependencies] addition = { path = "../addition" } starknet.workspace = true + +[dev-dependencies] snforge_std.workspace = true [[target.starknet-contract]] From 06c5ee69d6657b1baa9fa526dd5c6b44d6c4da14 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Fri, 11 Oct 2024 14:13:31 +0200 Subject: [PATCH 08/26] Extend tests --- .../data/targets/custom_target/Scarb.toml | 25 + .../data/targets/custom_target/src/lib.cairo | 55 ++ .../targets/custom_target/tests/tests.cairo | 28 + .../custom_target_custom_names/Scarb.toml | 25 + .../custom_target_custom_names/metadata.json | 527 ++++++++++++++++++ .../custom_target_custom_names/src/lib.cairo | 55 ++ .../tests/tests.cairo | 28 + .../custom_target_only_integration/Scarb.toml | 21 + .../src/lib.cairo | 55 ++ .../tests/tests.cairo | 28 + .../data/targets/only_integration/Scarb.toml | 14 + .../targets/only_integration/src/lib.cairo | 43 ++ .../only_integration/tests/tests.cairo | 28 + .../targets/only_lib_integration/Scarb.toml | 14 + .../only_lib_integration/src/lib.cairo | 43 ++ .../only_lib_integration/tests/lib.cairo | 1 + .../only_lib_integration/tests/tests.cairo | 28 + .../tests/data/targets/only_unit/Scarb.toml | 14 + .../data/targets/only_unit/src/lib.cairo | 55 ++ .../targets/unit_and_integration/Scarb.toml | 14 + .../unit_and_integration/src/lib.cairo | 55 ++ .../unit_and_integration/tests/tests.cairo | 28 + .../unit_and_lib_integration/Scarb.toml | 14 + .../unit_and_lib_integration/src/lib.cairo | 55 ++ .../unit_and_lib_integration/tests/lib.cairo | 1 + .../tests/tests.cairo | 28 + .../data/targets/with_features/Scarb.toml | 17 + .../data/targets/with_features/src/lib.cairo | 58 ++ .../targets/with_features/tests/tests.cairo | 28 + crates/forge/tests/e2e/contract_artifacts.rs | 277 ++++++++- 30 files changed, 1661 insertions(+), 1 deletion(-) create mode 100644 crates/forge/tests/data/targets/custom_target/Scarb.toml create mode 100644 crates/forge/tests/data/targets/custom_target/src/lib.cairo create mode 100644 crates/forge/tests/data/targets/custom_target/tests/tests.cairo create mode 100644 crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml create mode 100644 crates/forge/tests/data/targets/custom_target_custom_names/metadata.json create mode 100644 crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo create mode 100644 crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo create mode 100644 crates/forge/tests/data/targets/custom_target_only_integration/Scarb.toml create mode 100644 crates/forge/tests/data/targets/custom_target_only_integration/src/lib.cairo create mode 100644 crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo create mode 100644 crates/forge/tests/data/targets/only_integration/Scarb.toml create mode 100644 crates/forge/tests/data/targets/only_integration/src/lib.cairo create mode 100644 crates/forge/tests/data/targets/only_integration/tests/tests.cairo create mode 100644 crates/forge/tests/data/targets/only_lib_integration/Scarb.toml create mode 100644 crates/forge/tests/data/targets/only_lib_integration/src/lib.cairo create mode 100644 crates/forge/tests/data/targets/only_lib_integration/tests/lib.cairo create mode 100644 crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo create mode 100644 crates/forge/tests/data/targets/only_unit/Scarb.toml create mode 100644 crates/forge/tests/data/targets/only_unit/src/lib.cairo create mode 100644 crates/forge/tests/data/targets/unit_and_integration/Scarb.toml create mode 100644 crates/forge/tests/data/targets/unit_and_integration/src/lib.cairo create mode 100644 crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo create mode 100644 crates/forge/tests/data/targets/unit_and_lib_integration/Scarb.toml create mode 100644 crates/forge/tests/data/targets/unit_and_lib_integration/src/lib.cairo create mode 100644 crates/forge/tests/data/targets/unit_and_lib_integration/tests/lib.cairo create mode 100644 crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo create mode 100644 crates/forge/tests/data/targets/with_features/Scarb.toml create mode 100644 crates/forge/tests/data/targets/with_features/src/lib.cairo create mode 100644 crates/forge/tests/data/targets/with_features/tests/tests.cairo diff --git a/crates/forge/tests/data/targets/custom_target/Scarb.toml b/crates/forge/tests/data/targets/custom_target/Scarb.toml new file mode 100644 index 000000000..0e14be7d4 --- /dev/null +++ b/crates/forge/tests/data/targets/custom_target/Scarb.toml @@ -0,0 +1,25 @@ +[package] +name = "targets" +version = "0.1.0" + +[dependencies] +starknet = "2.7.0" + +[dev-dependencies] +snforge_std = { path = "../../../../../../snforge_std" } + +[[target.starknet-contract]] + +[[test]] +name = "targets_integrationtest" +kind = "test" +source-path = "./tests/tests.cairo" +test-type = "integration" + +[[test]] +name = "targets_unittest" +kind = "test" +test-type = "unit" + +[tool.snforge] +exit_first = false diff --git a/crates/forge/tests/data/targets/custom_target/src/lib.cairo b/crates/forge/tests/data/targets/custom_target/src/lib.cairo new file mode 100644 index 000000000..f710a865a --- /dev/null +++ b/crates/forge/tests/data/targets/custom_target/src/lib.cairo @@ -0,0 +1,55 @@ +#[starknet::interface] +trait IHelloStarknet { + fn increase_balance(ref self: TContractState, amount: felt252); + fn get_balance(self: @TContractState) -> felt252; + fn do_a_panic(self: @TContractState); + fn do_a_panic_with(self: @TContractState, panic_data: Array); +} + +#[starknet::contract] +mod HelloStarknet { + use array::ArrayTrait; + + #[storage] + struct Storage { + balance: felt252, + } + + #[abi(embed_v0)] + impl IHelloStarknetImpl of super::IHelloStarknet { + // Increases the balance by the given amount. + fn increase_balance(ref self: ContractState, amount: felt252) { + self.balance.write(self.balance.read() + amount); + } + + // Returns the current balance. + fn get_balance(self: @ContractState) -> felt252 { + self.balance.read() + } + + // Panics + fn do_a_panic(self: @ContractState) { + let mut arr = ArrayTrait::new(); + arr.append('PANIC'); + arr.append('DAYTAH'); + panic(arr); + } + + // Panics with given array data + fn do_a_panic_with(self: @ContractState, panic_data: Array) { + panic(panic_data); + } + } +} + +#[cfg(test)] +mod tests { + use snforge_std::{declare, ContractClassTrait}; + use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + + #[test] + fn declare_contract_from_lib() { + let _ = declare("HelloStarknet").unwrap().contract_class(); + assert(2 == 2, 'Should declare'); + } +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/custom_target/tests/tests.cairo b/crates/forge/tests/data/targets/custom_target/tests/tests.cairo new file mode 100644 index 000000000..a9b3f6590 --- /dev/null +++ b/crates/forge/tests/data/targets/custom_target/tests/tests.cairo @@ -0,0 +1,28 @@ +use array::ArrayTrait; +use result::ResultTrait; +use option::OptionTrait; +use traits::TryInto; +use starknet::ContractAddress; +use starknet::Felt252TryIntoContractAddress; + +use snforge_std::{declare, ContractClassTrait}; +use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + +use targets::IHelloStarknetDispatcher; +use targets::IHelloStarknetDispatcherTrait; + +#[test] +fn declare_and_call_contract_from_lib() { + let contract = declare("HelloStarknet").unwrap().contract_class(); + let constructor_calldata = @ArrayTrait::new(); + let (contract_address, _) = contract.deploy(constructor_calldata).unwrap(); + let dispatcher = IHelloStarknetDispatcher { contract_address }; + + let balance = dispatcher.get_balance(); + assert(balance == 0, 'balance == 0'); + + dispatcher.increase_balance(100); + + let balance = dispatcher.get_balance(); + assert(balance == 100, 'balance == 100'); +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml b/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml new file mode 100644 index 000000000..f8cafee55 --- /dev/null +++ b/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml @@ -0,0 +1,25 @@ +[package] +name = "targets" +version = "0.1.0" + +[dependencies] +starknet = "2.7.0" + +[dev-dependencies] +snforge_std = { path = "../../../../../../snforge_std" } + + +[[test]] +name = "custom_first" +kind = "test" +source-path = "./tests/tests.cairo" +test-type = "integration" +build-external-contracts = ["targets::*"] + +[[test]] +name = "custom_second" +kind = "test" +test-type = "unit" + +[tool.snforge] +exit_first = false diff --git a/crates/forge/tests/data/targets/custom_target_custom_names/metadata.json b/crates/forge/tests/data/targets/custom_target_custom_names/metadata.json new file mode 100644 index 000000000..2d0bbb7bc --- /dev/null +++ b/crates/forge/tests/data/targets/custom_target_custom_names/metadata.json @@ -0,0 +1,527 @@ +{ + "version": 1, + "app_exe": "/Users/arturmichalek/.asdf/installs/scarb/2.8.3/bin/scarb", + "app_version_info": { + "version": "2.8.3", + "commit_info": { + "short_commit_hash": "54938ce3b", + "commit_hash": "54938ce3b01f81959e6e0114b080cc5e1a73935b", + "commit_date": "2024-09-26" + }, + "cairo": { + "version": "2.8.2", + "commit_info": null + } + }, + "target_dir": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/target", + "runtime_manifest": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml", + "workspace": { + "manifest_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml", + "root": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names", + "members": [ + "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)" + ] + }, + "packages": [ + { + "id": "core 2.8.2 (std)", + "name": "core", + "version": "2.8.2", + "edition": "2024_07", + "source": "std", + "manifest_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/Scarb.toml", + "root": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core", + "dependencies": [ + { + "name": "cairo_test", + "version_req": "^2.8.2", + "source": "registry+https://scarbs.xyz/", + "kind": "dev" + } + ], + "targets": [ + { + "kind": "lib", + "name": "core", + "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/src/lib.cairo", + "params": {} + }, + { + "kind": "test", + "name": "core_unittest", + "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/src/lib.cairo", + "params": { + "build-external-contracts": [], + "test-type": "unit" + } + } + ], + "authors": null, + "description": null, + "documentation": null, + "homepage": null, + "keywords": null, + "license": null, + "license_file": null, + "readme": null, + "repository": null, + "urls": null, + "tool": null, + "experimental_features": [ + "coupons", + "negative_impls" + ] + }, + { + "id": "snforge_scarb_plugin 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml)", + "name": "snforge_scarb_plugin", + "version": "0.31.0", + "edition": "2023_01", + "source": "path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml", + "manifest_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml", + "root": "/Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin", + "dependencies": [ + { + "name": "core", + "version_req": "=2.8.2", + "source": "registry+https://scarbs.xyz/", + "kind": null + } + ], + "targets": [ + { + "kind": "cairo-plugin", + "name": "snforge_scarb_plugin", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/src/lib.cairo", + "params": {} + } + ], + "authors": null, + "description": null, + "documentation": null, + "homepage": null, + "keywords": null, + "license": null, + "license_file": null, + "readme": null, + "repository": null, + "urls": null, + "tool": null, + "experimental_features": [] + }, + { + "id": "snforge_std 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml)", + "name": "snforge_std", + "version": "0.31.0", + "edition": "2023_10", + "source": "path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml", + "manifest_path": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml", + "root": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std", + "dependencies": [ + { + "name": "core", + "version_req": "=2.8.2", + "source": "registry+https://scarbs.xyz/", + "kind": null + }, + { + "name": "snforge_scarb_plugin", + "version_req": "*", + "source": "path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml", + "kind": null + } + ], + "targets": [ + { + "kind": "lib", + "name": "snforge_std", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std/src/lib.cairo", + "params": {} + }, + { + "kind": "test", + "name": "snforge_std_unittest", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std/src/lib.cairo", + "params": { + "build-external-contracts": [], + "test-type": "unit" + } + } + ], + "authors": null, + "description": null, + "documentation": null, + "homepage": null, + "keywords": null, + "license": null, + "license_file": null, + "readme": null, + "repository": null, + "urls": null, + "tool": null, + "experimental_features": [] + }, + { + "id": "starknet 2.8.2 (std)", + "name": "starknet", + "version": "2.8.2", + "edition": "2023_01", + "source": "std", + "manifest_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/starknet/Scarb.toml", + "root": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/starknet", + "dependencies": [ + { + "name": "core", + "version_req": "=2.8.2", + "source": "registry+https://scarbs.xyz/", + "kind": null + } + ], + "targets": [ + { + "kind": "cairo-plugin", + "name": "starknet", + "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/starknet/src/lib.cairo", + "params": { + "builtin": true + } + } + ], + "authors": null, + "description": null, + "documentation": null, + "homepage": null, + "keywords": null, + "license": null, + "license_file": null, + "readme": null, + "repository": null, + "urls": null, + "tool": null, + "experimental_features": [] + }, + { + "id": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", + "name": "targets", + "version": "0.1.0", + "edition": "2023_01", + "source": "path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml", + "manifest_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml", + "root": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names", + "dependencies": [ + { + "name": "core", + "version_req": "=2.8.2", + "source": "registry+https://scarbs.xyz/", + "kind": null + }, + { + "name": "snforge_std", + "version_req": "*", + "source": "path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml", + "kind": "dev" + }, + { + "name": "starknet", + "version_req": "^2.7.0", + "source": "registry+https://scarbs.xyz/", + "kind": null + } + ], + "targets": [ + { + "kind": "lib", + "name": "targets", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", + "params": {} + }, + { + "kind": "test", + "name": "custom_first", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo", + "params": { + "build-external-contracts": [ + "targets::*" + ], + "kind": "test", + "test-type": "integration" + } + }, + { + "kind": "test", + "name": "custom_second", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", + "params": { + "kind": "test", + "test-type": "unit" + } + } + ], + "authors": null, + "description": null, + "documentation": null, + "homepage": null, + "keywords": null, + "license": null, + "license_file": null, + "readme": null, + "repository": null, + "urls": null, + "tool": { + "snforge": { + "exit_first": false + } + }, + "experimental_features": [] + } + ], + "compilation_units": [ + { + "id": "custom_first-dm6vp9cbo1sd2", + "package": "custom_first 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", + "target": { + "kind": "test", + "name": "custom_first", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo", + "params": { + "build-external-contracts": [ + "targets::*" + ], + "kind": "test", + "test-type": "integration" + } + }, + "compiler_config": { + "allow_warnings": true, + "enable_gas": true, + "inlining_strategy": "default", + "sierra_replace_ids": true, + "unstable_add_statements_code_locations_debug_info": false, + "unstable_add_statements_functions_debug_info": false + }, + "components_data": [ + { + "package": "core 2.8.2 (std)", + "name": "core", + "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/src/lib.cairo", + "cfg": [ + [ + "target", + "test" + ] + ] + }, + { + "package": "custom_first 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", + "name": "custom_first", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo", + "cfg": [ + [ + "target", + "test" + ], + "test" + ] + }, + { + "package": "snforge_std 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml)", + "name": "snforge_std", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std/src/lib.cairo", + "cfg": [ + [ + "target", + "test" + ] + ] + }, + { + "package": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", + "name": "targets", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", + "cfg": [ + [ + "target", + "test" + ] + ] + } + ], + "cairo_plugins": [ + { + "package": "snforge_scarb_plugin 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml)" + }, + { + "package": "starknet 2.8.2 (std)" + } + ], + "cfg": [ + [ + "target", + "test" + ], + "test" + ], + "components": [ + "core 2.8.2 (std)", + "custom_first 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", + "snforge_std 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml)", + "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)" + ] + }, + { + "id": "snforge_scarb_plugin-9f1qbmldisnii", + "package": "snforge_scarb_plugin 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml)", + "target": { + "kind": "cairo-plugin", + "name": "snforge_scarb_plugin", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/src/lib.cairo", + "params": {} + }, + "compiler_config": null, + "components_data": [ + { + "package": "snforge_scarb_plugin 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml)", + "name": "snforge_scarb_plugin", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/src/lib.cairo", + "cfg": null + } + ], + "cairo_plugins": [], + "cfg": [] + }, + { + "id": "targets-3nil7dgpqucis", + "package": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", + "target": { + "kind": "lib", + "name": "targets", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", + "params": {} + }, + "compiler_config": { + "allow_warnings": true, + "enable_gas": true, + "inlining_strategy": "default", + "sierra_replace_ids": true, + "unstable_add_statements_code_locations_debug_info": false, + "unstable_add_statements_functions_debug_info": false + }, + "components_data": [ + { + "package": "core 2.8.2 (std)", + "name": "core", + "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/src/lib.cairo", + "cfg": null + }, + { + "package": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", + "name": "targets", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", + "cfg": [ + [ + "target", + "lib" + ] + ] + } + ], + "cairo_plugins": [ + { + "package": "starknet 2.8.2 (std)" + } + ], + "cfg": [ + [ + "target", + "lib" + ] + ], + "components": [ + "core 2.8.2 (std)", + "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)" + ] + }, + { + "id": "targets-s7j5pakf7ncfa", + "package": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", + "target": { + "kind": "test", + "name": "custom_second", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", + "params": { + "kind": "test", + "test-type": "unit" + } + }, + "compiler_config": { + "allow_warnings": true, + "enable_gas": true, + "inlining_strategy": "default", + "sierra_replace_ids": true, + "unstable_add_statements_code_locations_debug_info": false, + "unstable_add_statements_functions_debug_info": false + }, + "components_data": [ + { + "package": "core 2.8.2 (std)", + "name": "core", + "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/src/lib.cairo", + "cfg": [ + [ + "target", + "test" + ] + ] + }, + { + "package": "snforge_std 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml)", + "name": "snforge_std", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std/src/lib.cairo", + "cfg": [ + [ + "target", + "test" + ] + ] + }, + { + "package": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", + "name": "targets", + "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", + "cfg": [ + [ + "target", + "test" + ], + "test" + ] + } + ], + "cairo_plugins": [ + { + "package": "snforge_scarb_plugin 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml)" + }, + { + "package": "starknet 2.8.2 (std)" + } + ], + "cfg": [ + [ + "target", + "test" + ], + "test" + ], + "components": [ + "core 2.8.2 (std)", + "snforge_std 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml)", + "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)" + ] + } + ], + "current_profile": "dev", + "profiles": [ + "dev", + "release" + ] +} diff --git a/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo b/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo new file mode 100644 index 000000000..f710a865a --- /dev/null +++ b/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo @@ -0,0 +1,55 @@ +#[starknet::interface] +trait IHelloStarknet { + fn increase_balance(ref self: TContractState, amount: felt252); + fn get_balance(self: @TContractState) -> felt252; + fn do_a_panic(self: @TContractState); + fn do_a_panic_with(self: @TContractState, panic_data: Array); +} + +#[starknet::contract] +mod HelloStarknet { + use array::ArrayTrait; + + #[storage] + struct Storage { + balance: felt252, + } + + #[abi(embed_v0)] + impl IHelloStarknetImpl of super::IHelloStarknet { + // Increases the balance by the given amount. + fn increase_balance(ref self: ContractState, amount: felt252) { + self.balance.write(self.balance.read() + amount); + } + + // Returns the current balance. + fn get_balance(self: @ContractState) -> felt252 { + self.balance.read() + } + + // Panics + fn do_a_panic(self: @ContractState) { + let mut arr = ArrayTrait::new(); + arr.append('PANIC'); + arr.append('DAYTAH'); + panic(arr); + } + + // Panics with given array data + fn do_a_panic_with(self: @ContractState, panic_data: Array) { + panic(panic_data); + } + } +} + +#[cfg(test)] +mod tests { + use snforge_std::{declare, ContractClassTrait}; + use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + + #[test] + fn declare_contract_from_lib() { + let _ = declare("HelloStarknet").unwrap().contract_class(); + assert(2 == 2, 'Should declare'); + } +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo b/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo new file mode 100644 index 000000000..a9b3f6590 --- /dev/null +++ b/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo @@ -0,0 +1,28 @@ +use array::ArrayTrait; +use result::ResultTrait; +use option::OptionTrait; +use traits::TryInto; +use starknet::ContractAddress; +use starknet::Felt252TryIntoContractAddress; + +use snforge_std::{declare, ContractClassTrait}; +use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + +use targets::IHelloStarknetDispatcher; +use targets::IHelloStarknetDispatcherTrait; + +#[test] +fn declare_and_call_contract_from_lib() { + let contract = declare("HelloStarknet").unwrap().contract_class(); + let constructor_calldata = @ArrayTrait::new(); + let (contract_address, _) = contract.deploy(constructor_calldata).unwrap(); + let dispatcher = IHelloStarknetDispatcher { contract_address }; + + let balance = dispatcher.get_balance(); + assert(balance == 0, 'balance == 0'); + + dispatcher.increase_balance(100); + + let balance = dispatcher.get_balance(); + assert(balance == 100, 'balance == 100'); +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/custom_target_only_integration/Scarb.toml b/crates/forge/tests/data/targets/custom_target_only_integration/Scarb.toml new file mode 100644 index 000000000..305b17ac0 --- /dev/null +++ b/crates/forge/tests/data/targets/custom_target_only_integration/Scarb.toml @@ -0,0 +1,21 @@ +[package] +name = "targets" +version = "0.1.0" + +[dependencies] +starknet = "2.7.0" + +[dev-dependencies] +snforge_std = { path = "../../../../../../snforge_std" } + +[[target.starknet-contract]] + +[[test]] +name = "custom_first" +kind = "test" +source-path = "./tests/tests.cairo" +test-type = "integration" +build-external-contracts = ["targets::*"] + +[tool.snforge] +exit_first = false diff --git a/crates/forge/tests/data/targets/custom_target_only_integration/src/lib.cairo b/crates/forge/tests/data/targets/custom_target_only_integration/src/lib.cairo new file mode 100644 index 000000000..f710a865a --- /dev/null +++ b/crates/forge/tests/data/targets/custom_target_only_integration/src/lib.cairo @@ -0,0 +1,55 @@ +#[starknet::interface] +trait IHelloStarknet { + fn increase_balance(ref self: TContractState, amount: felt252); + fn get_balance(self: @TContractState) -> felt252; + fn do_a_panic(self: @TContractState); + fn do_a_panic_with(self: @TContractState, panic_data: Array); +} + +#[starknet::contract] +mod HelloStarknet { + use array::ArrayTrait; + + #[storage] + struct Storage { + balance: felt252, + } + + #[abi(embed_v0)] + impl IHelloStarknetImpl of super::IHelloStarknet { + // Increases the balance by the given amount. + fn increase_balance(ref self: ContractState, amount: felt252) { + self.balance.write(self.balance.read() + amount); + } + + // Returns the current balance. + fn get_balance(self: @ContractState) -> felt252 { + self.balance.read() + } + + // Panics + fn do_a_panic(self: @ContractState) { + let mut arr = ArrayTrait::new(); + arr.append('PANIC'); + arr.append('DAYTAH'); + panic(arr); + } + + // Panics with given array data + fn do_a_panic_with(self: @ContractState, panic_data: Array) { + panic(panic_data); + } + } +} + +#[cfg(test)] +mod tests { + use snforge_std::{declare, ContractClassTrait}; + use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + + #[test] + fn declare_contract_from_lib() { + let _ = declare("HelloStarknet").unwrap().contract_class(); + assert(2 == 2, 'Should declare'); + } +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo b/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo new file mode 100644 index 000000000..a9b3f6590 --- /dev/null +++ b/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo @@ -0,0 +1,28 @@ +use array::ArrayTrait; +use result::ResultTrait; +use option::OptionTrait; +use traits::TryInto; +use starknet::ContractAddress; +use starknet::Felt252TryIntoContractAddress; + +use snforge_std::{declare, ContractClassTrait}; +use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + +use targets::IHelloStarknetDispatcher; +use targets::IHelloStarknetDispatcherTrait; + +#[test] +fn declare_and_call_contract_from_lib() { + let contract = declare("HelloStarknet").unwrap().contract_class(); + let constructor_calldata = @ArrayTrait::new(); + let (contract_address, _) = contract.deploy(constructor_calldata).unwrap(); + let dispatcher = IHelloStarknetDispatcher { contract_address }; + + let balance = dispatcher.get_balance(); + assert(balance == 0, 'balance == 0'); + + dispatcher.increase_balance(100); + + let balance = dispatcher.get_balance(); + assert(balance == 100, 'balance == 100'); +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/only_integration/Scarb.toml b/crates/forge/tests/data/targets/only_integration/Scarb.toml new file mode 100644 index 000000000..3d718fc9d --- /dev/null +++ b/crates/forge/tests/data/targets/only_integration/Scarb.toml @@ -0,0 +1,14 @@ +[package] +name = "targets" +version = "0.1.0" + +[dependencies] +starknet = "2.7.0" + +[dev-dependencies] +snforge_std = { path = "../../../../../../snforge_std" } + +[[target.starknet-contract]] + +[tool.snforge] +exit_first = false diff --git a/crates/forge/tests/data/targets/only_integration/src/lib.cairo b/crates/forge/tests/data/targets/only_integration/src/lib.cairo new file mode 100644 index 000000000..89e4430bb --- /dev/null +++ b/crates/forge/tests/data/targets/only_integration/src/lib.cairo @@ -0,0 +1,43 @@ +#[starknet::interface] +trait IHelloStarknet { + fn increase_balance(ref self: TContractState, amount: felt252); + fn get_balance(self: @TContractState) -> felt252; + fn do_a_panic(self: @TContractState); + fn do_a_panic_with(self: @TContractState, panic_data: Array); +} + +#[starknet::contract] +mod HelloStarknet { + use array::ArrayTrait; + + #[storage] + struct Storage { + balance: felt252, + } + + #[abi(embed_v0)] + impl IHelloStarknetImpl of super::IHelloStarknet { + // Increases the balance by the given amount. + fn increase_balance(ref self: ContractState, amount: felt252) { + self.balance.write(self.balance.read() + amount); + } + + // Returns the current balance. + fn get_balance(self: @ContractState) -> felt252 { + self.balance.read() + } + + // Panics + fn do_a_panic(self: @ContractState) { + let mut arr = ArrayTrait::new(); + arr.append('PANIC'); + arr.append('DAYTAH'); + panic(arr); + } + + // Panics with given array data + fn do_a_panic_with(self: @ContractState, panic_data: Array) { + panic(panic_data); + } + } +} diff --git a/crates/forge/tests/data/targets/only_integration/tests/tests.cairo b/crates/forge/tests/data/targets/only_integration/tests/tests.cairo new file mode 100644 index 000000000..a9b3f6590 --- /dev/null +++ b/crates/forge/tests/data/targets/only_integration/tests/tests.cairo @@ -0,0 +1,28 @@ +use array::ArrayTrait; +use result::ResultTrait; +use option::OptionTrait; +use traits::TryInto; +use starknet::ContractAddress; +use starknet::Felt252TryIntoContractAddress; + +use snforge_std::{declare, ContractClassTrait}; +use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + +use targets::IHelloStarknetDispatcher; +use targets::IHelloStarknetDispatcherTrait; + +#[test] +fn declare_and_call_contract_from_lib() { + let contract = declare("HelloStarknet").unwrap().contract_class(); + let constructor_calldata = @ArrayTrait::new(); + let (contract_address, _) = contract.deploy(constructor_calldata).unwrap(); + let dispatcher = IHelloStarknetDispatcher { contract_address }; + + let balance = dispatcher.get_balance(); + assert(balance == 0, 'balance == 0'); + + dispatcher.increase_balance(100); + + let balance = dispatcher.get_balance(); + assert(balance == 100, 'balance == 100'); +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/only_lib_integration/Scarb.toml b/crates/forge/tests/data/targets/only_lib_integration/Scarb.toml new file mode 100644 index 000000000..3d718fc9d --- /dev/null +++ b/crates/forge/tests/data/targets/only_lib_integration/Scarb.toml @@ -0,0 +1,14 @@ +[package] +name = "targets" +version = "0.1.0" + +[dependencies] +starknet = "2.7.0" + +[dev-dependencies] +snforge_std = { path = "../../../../../../snforge_std" } + +[[target.starknet-contract]] + +[tool.snforge] +exit_first = false diff --git a/crates/forge/tests/data/targets/only_lib_integration/src/lib.cairo b/crates/forge/tests/data/targets/only_lib_integration/src/lib.cairo new file mode 100644 index 000000000..89e4430bb --- /dev/null +++ b/crates/forge/tests/data/targets/only_lib_integration/src/lib.cairo @@ -0,0 +1,43 @@ +#[starknet::interface] +trait IHelloStarknet { + fn increase_balance(ref self: TContractState, amount: felt252); + fn get_balance(self: @TContractState) -> felt252; + fn do_a_panic(self: @TContractState); + fn do_a_panic_with(self: @TContractState, panic_data: Array); +} + +#[starknet::contract] +mod HelloStarknet { + use array::ArrayTrait; + + #[storage] + struct Storage { + balance: felt252, + } + + #[abi(embed_v0)] + impl IHelloStarknetImpl of super::IHelloStarknet { + // Increases the balance by the given amount. + fn increase_balance(ref self: ContractState, amount: felt252) { + self.balance.write(self.balance.read() + amount); + } + + // Returns the current balance. + fn get_balance(self: @ContractState) -> felt252 { + self.balance.read() + } + + // Panics + fn do_a_panic(self: @ContractState) { + let mut arr = ArrayTrait::new(); + arr.append('PANIC'); + arr.append('DAYTAH'); + panic(arr); + } + + // Panics with given array data + fn do_a_panic_with(self: @ContractState, panic_data: Array) { + panic(panic_data); + } + } +} diff --git a/crates/forge/tests/data/targets/only_lib_integration/tests/lib.cairo b/crates/forge/tests/data/targets/only_lib_integration/tests/lib.cairo new file mode 100644 index 000000000..b90ccf403 --- /dev/null +++ b/crates/forge/tests/data/targets/only_lib_integration/tests/lib.cairo @@ -0,0 +1 @@ +mod tests; \ No newline at end of file diff --git a/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo b/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo new file mode 100644 index 000000000..a9b3f6590 --- /dev/null +++ b/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo @@ -0,0 +1,28 @@ +use array::ArrayTrait; +use result::ResultTrait; +use option::OptionTrait; +use traits::TryInto; +use starknet::ContractAddress; +use starknet::Felt252TryIntoContractAddress; + +use snforge_std::{declare, ContractClassTrait}; +use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + +use targets::IHelloStarknetDispatcher; +use targets::IHelloStarknetDispatcherTrait; + +#[test] +fn declare_and_call_contract_from_lib() { + let contract = declare("HelloStarknet").unwrap().contract_class(); + let constructor_calldata = @ArrayTrait::new(); + let (contract_address, _) = contract.deploy(constructor_calldata).unwrap(); + let dispatcher = IHelloStarknetDispatcher { contract_address }; + + let balance = dispatcher.get_balance(); + assert(balance == 0, 'balance == 0'); + + dispatcher.increase_balance(100); + + let balance = dispatcher.get_balance(); + assert(balance == 100, 'balance == 100'); +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/only_unit/Scarb.toml b/crates/forge/tests/data/targets/only_unit/Scarb.toml new file mode 100644 index 000000000..3d718fc9d --- /dev/null +++ b/crates/forge/tests/data/targets/only_unit/Scarb.toml @@ -0,0 +1,14 @@ +[package] +name = "targets" +version = "0.1.0" + +[dependencies] +starknet = "2.7.0" + +[dev-dependencies] +snforge_std = { path = "../../../../../../snforge_std" } + +[[target.starknet-contract]] + +[tool.snforge] +exit_first = false diff --git a/crates/forge/tests/data/targets/only_unit/src/lib.cairo b/crates/forge/tests/data/targets/only_unit/src/lib.cairo new file mode 100644 index 000000000..f710a865a --- /dev/null +++ b/crates/forge/tests/data/targets/only_unit/src/lib.cairo @@ -0,0 +1,55 @@ +#[starknet::interface] +trait IHelloStarknet { + fn increase_balance(ref self: TContractState, amount: felt252); + fn get_balance(self: @TContractState) -> felt252; + fn do_a_panic(self: @TContractState); + fn do_a_panic_with(self: @TContractState, panic_data: Array); +} + +#[starknet::contract] +mod HelloStarknet { + use array::ArrayTrait; + + #[storage] + struct Storage { + balance: felt252, + } + + #[abi(embed_v0)] + impl IHelloStarknetImpl of super::IHelloStarknet { + // Increases the balance by the given amount. + fn increase_balance(ref self: ContractState, amount: felt252) { + self.balance.write(self.balance.read() + amount); + } + + // Returns the current balance. + fn get_balance(self: @ContractState) -> felt252 { + self.balance.read() + } + + // Panics + fn do_a_panic(self: @ContractState) { + let mut arr = ArrayTrait::new(); + arr.append('PANIC'); + arr.append('DAYTAH'); + panic(arr); + } + + // Panics with given array data + fn do_a_panic_with(self: @ContractState, panic_data: Array) { + panic(panic_data); + } + } +} + +#[cfg(test)] +mod tests { + use snforge_std::{declare, ContractClassTrait}; + use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + + #[test] + fn declare_contract_from_lib() { + let _ = declare("HelloStarknet").unwrap().contract_class(); + assert(2 == 2, 'Should declare'); + } +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/unit_and_integration/Scarb.toml b/crates/forge/tests/data/targets/unit_and_integration/Scarb.toml new file mode 100644 index 000000000..3d718fc9d --- /dev/null +++ b/crates/forge/tests/data/targets/unit_and_integration/Scarb.toml @@ -0,0 +1,14 @@ +[package] +name = "targets" +version = "0.1.0" + +[dependencies] +starknet = "2.7.0" + +[dev-dependencies] +snforge_std = { path = "../../../../../../snforge_std" } + +[[target.starknet-contract]] + +[tool.snforge] +exit_first = false diff --git a/crates/forge/tests/data/targets/unit_and_integration/src/lib.cairo b/crates/forge/tests/data/targets/unit_and_integration/src/lib.cairo new file mode 100644 index 000000000..f710a865a --- /dev/null +++ b/crates/forge/tests/data/targets/unit_and_integration/src/lib.cairo @@ -0,0 +1,55 @@ +#[starknet::interface] +trait IHelloStarknet { + fn increase_balance(ref self: TContractState, amount: felt252); + fn get_balance(self: @TContractState) -> felt252; + fn do_a_panic(self: @TContractState); + fn do_a_panic_with(self: @TContractState, panic_data: Array); +} + +#[starknet::contract] +mod HelloStarknet { + use array::ArrayTrait; + + #[storage] + struct Storage { + balance: felt252, + } + + #[abi(embed_v0)] + impl IHelloStarknetImpl of super::IHelloStarknet { + // Increases the balance by the given amount. + fn increase_balance(ref self: ContractState, amount: felt252) { + self.balance.write(self.balance.read() + amount); + } + + // Returns the current balance. + fn get_balance(self: @ContractState) -> felt252 { + self.balance.read() + } + + // Panics + fn do_a_panic(self: @ContractState) { + let mut arr = ArrayTrait::new(); + arr.append('PANIC'); + arr.append('DAYTAH'); + panic(arr); + } + + // Panics with given array data + fn do_a_panic_with(self: @ContractState, panic_data: Array) { + panic(panic_data); + } + } +} + +#[cfg(test)] +mod tests { + use snforge_std::{declare, ContractClassTrait}; + use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + + #[test] + fn declare_contract_from_lib() { + let _ = declare("HelloStarknet").unwrap().contract_class(); + assert(2 == 2, 'Should declare'); + } +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo b/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo new file mode 100644 index 000000000..a9b3f6590 --- /dev/null +++ b/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo @@ -0,0 +1,28 @@ +use array::ArrayTrait; +use result::ResultTrait; +use option::OptionTrait; +use traits::TryInto; +use starknet::ContractAddress; +use starknet::Felt252TryIntoContractAddress; + +use snforge_std::{declare, ContractClassTrait}; +use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + +use targets::IHelloStarknetDispatcher; +use targets::IHelloStarknetDispatcherTrait; + +#[test] +fn declare_and_call_contract_from_lib() { + let contract = declare("HelloStarknet").unwrap().contract_class(); + let constructor_calldata = @ArrayTrait::new(); + let (contract_address, _) = contract.deploy(constructor_calldata).unwrap(); + let dispatcher = IHelloStarknetDispatcher { contract_address }; + + let balance = dispatcher.get_balance(); + assert(balance == 0, 'balance == 0'); + + dispatcher.increase_balance(100); + + let balance = dispatcher.get_balance(); + assert(balance == 100, 'balance == 100'); +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/unit_and_lib_integration/Scarb.toml b/crates/forge/tests/data/targets/unit_and_lib_integration/Scarb.toml new file mode 100644 index 000000000..3d718fc9d --- /dev/null +++ b/crates/forge/tests/data/targets/unit_and_lib_integration/Scarb.toml @@ -0,0 +1,14 @@ +[package] +name = "targets" +version = "0.1.0" + +[dependencies] +starknet = "2.7.0" + +[dev-dependencies] +snforge_std = { path = "../../../../../../snforge_std" } + +[[target.starknet-contract]] + +[tool.snforge] +exit_first = false diff --git a/crates/forge/tests/data/targets/unit_and_lib_integration/src/lib.cairo b/crates/forge/tests/data/targets/unit_and_lib_integration/src/lib.cairo new file mode 100644 index 000000000..f710a865a --- /dev/null +++ b/crates/forge/tests/data/targets/unit_and_lib_integration/src/lib.cairo @@ -0,0 +1,55 @@ +#[starknet::interface] +trait IHelloStarknet { + fn increase_balance(ref self: TContractState, amount: felt252); + fn get_balance(self: @TContractState) -> felt252; + fn do_a_panic(self: @TContractState); + fn do_a_panic_with(self: @TContractState, panic_data: Array); +} + +#[starknet::contract] +mod HelloStarknet { + use array::ArrayTrait; + + #[storage] + struct Storage { + balance: felt252, + } + + #[abi(embed_v0)] + impl IHelloStarknetImpl of super::IHelloStarknet { + // Increases the balance by the given amount. + fn increase_balance(ref self: ContractState, amount: felt252) { + self.balance.write(self.balance.read() + amount); + } + + // Returns the current balance. + fn get_balance(self: @ContractState) -> felt252 { + self.balance.read() + } + + // Panics + fn do_a_panic(self: @ContractState) { + let mut arr = ArrayTrait::new(); + arr.append('PANIC'); + arr.append('DAYTAH'); + panic(arr); + } + + // Panics with given array data + fn do_a_panic_with(self: @ContractState, panic_data: Array) { + panic(panic_data); + } + } +} + +#[cfg(test)] +mod tests { + use snforge_std::{declare, ContractClassTrait}; + use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + + #[test] + fn declare_contract_from_lib() { + let _ = declare("HelloStarknet").unwrap().contract_class(); + assert(2 == 2, 'Should declare'); + } +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/unit_and_lib_integration/tests/lib.cairo b/crates/forge/tests/data/targets/unit_and_lib_integration/tests/lib.cairo new file mode 100644 index 000000000..b90ccf403 --- /dev/null +++ b/crates/forge/tests/data/targets/unit_and_lib_integration/tests/lib.cairo @@ -0,0 +1 @@ +mod tests; \ No newline at end of file diff --git a/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo b/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo new file mode 100644 index 000000000..a9b3f6590 --- /dev/null +++ b/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo @@ -0,0 +1,28 @@ +use array::ArrayTrait; +use result::ResultTrait; +use option::OptionTrait; +use traits::TryInto; +use starknet::ContractAddress; +use starknet::Felt252TryIntoContractAddress; + +use snforge_std::{declare, ContractClassTrait}; +use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + +use targets::IHelloStarknetDispatcher; +use targets::IHelloStarknetDispatcherTrait; + +#[test] +fn declare_and_call_contract_from_lib() { + let contract = declare("HelloStarknet").unwrap().contract_class(); + let constructor_calldata = @ArrayTrait::new(); + let (contract_address, _) = contract.deploy(constructor_calldata).unwrap(); + let dispatcher = IHelloStarknetDispatcher { contract_address }; + + let balance = dispatcher.get_balance(); + assert(balance == 0, 'balance == 0'); + + dispatcher.increase_balance(100); + + let balance = dispatcher.get_balance(); + assert(balance == 100, 'balance == 100'); +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/with_features/Scarb.toml b/crates/forge/tests/data/targets/with_features/Scarb.toml new file mode 100644 index 000000000..1770ef5ab --- /dev/null +++ b/crates/forge/tests/data/targets/with_features/Scarb.toml @@ -0,0 +1,17 @@ +[package] +name = "targets" +version = "0.1.0" + +[dependencies] +starknet = "2.7.0" + +[dev-dependencies] +snforge_std = { path = "../../../../../../snforge_std" } + +[[target.starknet-contract]] + +[tool.snforge] +exit_first = false + +[features] +enable_for_tests = [] diff --git a/crates/forge/tests/data/targets/with_features/src/lib.cairo b/crates/forge/tests/data/targets/with_features/src/lib.cairo new file mode 100644 index 000000000..47c0b9303 --- /dev/null +++ b/crates/forge/tests/data/targets/with_features/src/lib.cairo @@ -0,0 +1,58 @@ +#[starknet::interface] + trait IHelloStarknet { + fn increase_balance(ref self: TContractState, amount: felt252); + fn get_balance(self: @TContractState) -> felt252; + fn do_a_panic(self: @TContractState); + fn do_a_panic_with(self: @TContractState, panic_data: Array); + } + +#[cfg(feature: 'enable_for_tests')] +mod dummy { + #[starknet::contract] + mod HelloStarknet { + use array::ArrayTrait; + + #[storage] + struct Storage { + balance: felt252, + } + + #[abi(embed_v0)] + impl IHelloStarknetImpl of targets::IHelloStarknet { + // Increases the balance by the given amount. + fn increase_balance(ref self: ContractState, amount: felt252) { + self.balance.write(self.balance.read() + amount); + } + + // Returns the current balance. + fn get_balance(self: @ContractState) -> felt252 { + self.balance.read() + } + + // Panics + fn do_a_panic(self: @ContractState) { + let mut arr = ArrayTrait::new(); + arr.append('PANIC'); + arr.append('DAYTAH'); + panic(arr); + } + + // Panics with given array data + fn do_a_panic_with(self: @ContractState, panic_data: Array) { + panic(panic_data); + } + } + } +} + +#[cfg(test)] +mod tests { + use snforge_std::{declare, ContractClassTrait}; + use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + + #[test] + fn declare_contract_from_lib() { + let _ = declare("HelloStarknet").unwrap().contract_class(); + assert(2 == 2, 'Should declare'); + } +} \ No newline at end of file diff --git a/crates/forge/tests/data/targets/with_features/tests/tests.cairo b/crates/forge/tests/data/targets/with_features/tests/tests.cairo new file mode 100644 index 000000000..a9b3f6590 --- /dev/null +++ b/crates/forge/tests/data/targets/with_features/tests/tests.cairo @@ -0,0 +1,28 @@ +use array::ArrayTrait; +use result::ResultTrait; +use option::OptionTrait; +use traits::TryInto; +use starknet::ContractAddress; +use starknet::Felt252TryIntoContractAddress; + +use snforge_std::{declare, ContractClassTrait}; +use snforge_std::cheatcodes::contract_class::DeclareResultTrait; + +use targets::IHelloStarknetDispatcher; +use targets::IHelloStarknetDispatcherTrait; + +#[test] +fn declare_and_call_contract_from_lib() { + let contract = declare("HelloStarknet").unwrap().contract_class(); + let constructor_calldata = @ArrayTrait::new(); + let (contract_address, _) = contract.deploy(constructor_calldata).unwrap(); + let dispatcher = IHelloStarknetDispatcher { contract_address }; + + let balance = dispatcher.get_balance(); + assert(balance == 0, 'balance == 0'); + + dispatcher.increase_balance(100); + + let balance = dispatcher.get_balance(); + assert(balance == 100, 'balance == 100'); +} \ No newline at end of file diff --git a/crates/forge/tests/e2e/contract_artifacts.rs b/crates/forge/tests/e2e/contract_artifacts.rs index 31ab461de..13d26d427 100644 --- a/crates/forge/tests/e2e/contract_artifacts.rs +++ b/crates/forge/tests/e2e/contract_artifacts.rs @@ -3,7 +3,282 @@ use assert_fs::fixture::{FileWriteStr, PathChild}; use indoc::indoc; use shared::test_utils::output_assert::assert_stdout_contains; use std::fs; -use toml_edit::DocumentMut; +use toml_edit::{value, DocumentMut, Item, Value}; + +#[test] +fn unit_and_integration() { + let temp = setup_package("targets/unit_and_integration"); + let output = test_runner(&temp).assert().code(0); + + assert_stdout_contains( + output, + indoc! {r" + [..]Compiling[..] + [..]Finished[..] + + + Collected 2 test(s) from targets package + Running 1 test(s) from tests/ + [PASS] targets_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) + Running 1 test(s) from src/ + [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + Tests: 2 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out + "}, + ); +} + +#[test] +fn unit_and_lib_integration() { + let temp = setup_package("targets/unit_and_lib_integration"); + let output = test_runner(&temp).assert().code(0); + + assert_stdout_contains( + output, + indoc! {r" + [..]Compiling[..] + [..]Finished[..] + + + Collected 2 test(s) from targets package + Running 1 test(s) from tests/ + [PASS] targets_tests::tests::declare_and_call_contract_from_lib (gas: ~172) + Running 1 test(s) from src/ + [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + Tests: 2 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out + "}, + ); +} + +#[test] +fn only_integration() { + let temp = setup_package("targets/only_integration"); + let output = test_runner(&temp).assert().code(0); + + assert_stdout_contains( + output, + indoc! {r" + [..]Compiling[..] + [..]Finished[..] + + + Collected 1 test(s) from targets package + Running 1 test(s) from tests/ + [PASS] targets_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) + Running 0 test(s) from src/ + Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out + "}, + ); +} + +#[test] +fn only_unit() { + let temp = setup_package("targets/only_unit"); + let output = test_runner(&temp).assert().code(0); + + assert_stdout_contains( + output, + indoc! {r" + [..]Compiling[..] + [..]Finished[..] + + + Collected 1 test(s) from targets package + Running 1 test(s) from src/ + [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out + "}, + ); +} + +#[test] +fn only_lib_integration() { + let temp = setup_package("targets/only_lib_integration"); + let output = test_runner(&temp).assert().code(0); + + assert_stdout_contains( + output, + indoc! {r" + [..]Compiling[..] + [..]Finished[..] + + + Collected 1 test(s) from targets package + Running 1 test(s) from tests/ + [PASS] targets_tests::tests::declare_and_call_contract_from_lib (gas: ~172) + Running 0 test(s) from src/ + Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out + "}, + ); +} + +#[test] +fn with_features() { + let temp = setup_package("targets/with_features"); + let output = test_runner(&temp) + .arg("--features") + .arg("enable_for_tests") + .assert() + .code(0); + + assert_stdout_contains( + output, + indoc! {r" + [..]Compiling[..] + [..]Finished[..] + + + Collected 2 test(s) from targets package + Running 1 test(s) from tests/ + [PASS] targets_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) + Running 1 test(s) from src/ + [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + Tests: 2 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out + "}, + ); +} + +#[test] +fn with_features_fails_without_flag() { + let temp = setup_package("targets/with_features"); + let output = test_runner(&temp).assert().code(1); + + assert_stdout_contains( + output, + indoc! {" + [..]Compiling[..] + [..]Finished[..] + + + Collected 2 test(s) from targets package + Running 1 test(s) from tests/ + [FAIL] targets_integrationtest::tests::declare_and_call_contract_from_lib + + Failure data: + \"Failed to get contract artifact for name = HelloStarknet.\" + + Running 1 test(s) from src/ + [FAIL] targets::tests::declare_contract_from_lib + + Failure data: + \"Failed to get contract artifact for name = HelloStarknet.\" + + Tests: 0 passed, 2 failed, 0 skipped, 0 ignored, 0 filtered out + + Failures: + targets_integrationtest::tests::declare_and_call_contract_from_lib + targets::tests::declare_contract_from_lib + "}, + ); +} + +#[test] +// Case: We define custom test target for both unit and integration test types +// We do not define `build-external-contracts = ["targets::*"]` for `integration` target +// The test still passes because contracts are collected from `unit` target which includes +// the contracts from package by the default +fn custom_target() { + let temp = setup_package("targets/custom_target"); + let output = test_runner(&temp).assert().code(0); + + assert_stdout_contains( + output, + indoc! {r" + [..]Compiling[..] + [..]Finished[..] + + + Collected 2 test(s) from targets package + Running 1 test(s) from tests/ + [PASS] targets_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) + Running 1 test(s) from src/ + [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + Tests: 2 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out + "}, + ); +} + +#[test] +// Case: We define custom test target for both unit and integration test types +// We do not define `build-external-contracts = ["targets::*"]` for `integration` target +// The test still passes because contracts are collected from `unit` target which includes +// the contracts from package by the default +fn custom_target_custom_names() { + let temp = setup_package("targets/custom_target_custom_names"); + let output = test_runner(&temp).assert().code(0); + + // Scarb will use the name of the package for unit tests even if custom + // name for the unit test target is defined + assert_stdout_contains( + output, + indoc! {r" + [..]Compiling[..] + [..]Finished[..] + + + Collected 2 test(s) from targets package + Running 1 test(s) from tests/ + [PASS] custom_first::tests::declare_and_call_contract_from_lib (gas: ~172) + Running 1 test(s) from src/ + [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + Tests: 2 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out + "}, + ); +} + +#[test] +// Case: We define custom test target for both unit and integration test types +// We must `build-external-contracts = ["targets::*"]` for `integration` target otherwise +// they will not be built and included for declaring. +fn custom_target_only_integration() { + let temp = setup_package("targets/custom_target_only_integration"); + let output = test_runner(&temp).assert().code(0); + + assert_stdout_contains( + output, + indoc! {r" + [..]Compiling[..] + [..]Finished[..] + + + Collected 1 test(s) from targets package + Running 1 test(s) from tests/ + [PASS] custom_first::tests::declare_and_call_contract_from_lib (gas: ~172) + Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out + "}, + ); +} + +#[test] +// Case: We define custom test target for both unit and integration test types +// We di `build-external-contracts = ["targets::*"]` for `integration` so the test fails +fn custom_target_only_integration_without_external() { + let temp = setup_package("targets/custom_target_only_integration"); + + // Remove `build-external-contracts` from `[[test]]` target + let manifest_path = temp.child("Scarb.toml"); + let mut scarb_toml = fs::read_to_string(&manifest_path) + .unwrap() + .parse::() + .unwrap(); + + let output = test_runner(&temp).assert().code(1); + + assert!(2 == 3); + + assert_stdout_contains( + output, + indoc! {r" + [..]Compiling[..] + [..]Finished[..] + + + Collected 1 test(s) from targets package + Running 1 test(s) from tests/ + [PASS] custom_first::tests::declare_and_call_contract_from_lib (gas: ~172) + Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out + "}, + ); +} #[test] #[cfg_attr(not(feature = "scarb_2_8_3"), ignore)] From a7af04617d9c5612b57d1fe4c3d04d233c7d41e1 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Mon, 14 Oct 2024 16:11:44 +0200 Subject: [PATCH 09/26] Fix test --- .../custom_target_custom_names/Scarb.toml | 4 +-- crates/forge/tests/e2e/contract_artifacts.rs | 31 ++++++++++++------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml b/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml index f8cafee55..a0443cc6f 100644 --- a/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml +++ b/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml @@ -11,14 +11,14 @@ snforge_std = { path = "../../../../../../snforge_std" } [[test]] name = "custom_first" -kind = "test" +kind = "my_kind" source-path = "./tests/tests.cairo" test-type = "integration" build-external-contracts = ["targets::*"] [[test]] name = "custom_second" -kind = "test" +kind = "my_other_kind" test-type = "unit" [tool.snforge] diff --git a/crates/forge/tests/e2e/contract_artifacts.rs b/crates/forge/tests/e2e/contract_artifacts.rs index 13d26d427..877b035b8 100644 --- a/crates/forge/tests/e2e/contract_artifacts.rs +++ b/crates/forge/tests/e2e/contract_artifacts.rs @@ -144,7 +144,7 @@ fn with_features_fails_without_flag() { assert_stdout_contains( output, - indoc! {" + indoc! {r#" [..]Compiling[..] [..]Finished[..] @@ -154,20 +154,20 @@ fn with_features_fails_without_flag() { [FAIL] targets_integrationtest::tests::declare_and_call_contract_from_lib Failure data: - \"Failed to get contract artifact for name = HelloStarknet.\" + "Failed to get contract artifact for name = HelloStarknet." Running 1 test(s) from src/ [FAIL] targets::tests::declare_contract_from_lib Failure data: - \"Failed to get contract artifact for name = HelloStarknet.\" + "Failed to get contract artifact for name = HelloStarknet." Tests: 0 passed, 2 failed, 0 skipped, 0 ignored, 0 filtered out Failures: targets_integrationtest::tests::declare_and_call_contract_from_lib targets::tests::declare_contract_from_lib - "}, + "#}, ); } @@ -249,8 +249,8 @@ fn custom_target_only_integration() { } #[test] -// Case: We define custom test target for both unit and integration test types -// We di `build-external-contracts = ["targets::*"]` for `integration` so the test fails +// Case: We define custom test target for integration test type +// We delete `build-external-contracts = ["targets::*"]` for `integration` so the test fails fn custom_target_only_integration_without_external() { let temp = setup_package("targets/custom_target_only_integration"); @@ -260,23 +260,30 @@ fn custom_target_only_integration_without_external() { .unwrap() .parse::() .unwrap(); + let test_target = scarb_toml["test"].as_array_of_tables_mut().unwrap(); + assert_eq!(test_target.len(), 1); + let test_target = test_target.get_mut(0).unwrap(); + test_target.remove("build-external-contracts").unwrap(); + manifest_path.write_str(&scarb_toml.to_string()).unwrap(); let output = test_runner(&temp).assert().code(1); - assert!(2 == 3); - assert_stdout_contains( output, - indoc! {r" + indoc! {r#" [..]Compiling[..] [..]Finished[..] Collected 1 test(s) from targets package Running 1 test(s) from tests/ - [PASS] custom_first::tests::declare_and_call_contract_from_lib (gas: ~172) - Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out - "}, + [FAIL] custom_first::tests::declare_and_call_contract_from_lib + + Failure data: + "Failed to get contract artifact for name = HelloStarknet." + + Tests: 0 passed, 1 failed, 0 skipped, 0 ignored, 0 filtered out + "#}, ); } From bb7ad81847211feff57301ba8a1f21e57dc7a2a2 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 12:33:29 +0200 Subject: [PATCH 10/26] Inline `build_target_path` --- crates/scarb-api/src/lib.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 65176bdcd..778cbe8e5 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -84,16 +84,6 @@ struct ContractArtifactData { test_type: Option, } -fn build_target_path(target_dir: &Utf8Path, file_name: &str) -> Option { - let path = target_dir.join(file_name); - - if path.exists() { - Some(path) - } else { - None - } -} - fn get_starknet_artifacts_paths_from_test_targets( target_dir: &Utf8Path, test_targets: &HashMap, @@ -101,7 +91,9 @@ fn get_starknet_artifacts_paths_from_test_targets( let starknet_artifacts_file_name = |name: &str, metadata: &TargetMetadata| -> Option { let path = format!("{name}.test.starknet_artifacts.json"); - let path = build_target_path(target_dir, &path); + let path = target_dir.join(&path); + let path = if path.exists() { Some(path) } else { None }; + let test_type = metadata .params // TODO get rid of hardcoding @@ -129,7 +121,9 @@ fn get_starknet_artifacts_path( target_name: &str, ) -> Option { let path = format!("{target_name}.starknet_artifacts.json"); - let path = build_target_path(target_dir, &path); + let path = target_dir.join(&path); + let path = if path.exists() { Some(path) } else { None }; + path.map(|path| ContractArtifactData { path, test_type: None, From cb8fd4d1a28d8729a180d54fd93cba642569b776 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 12:34:00 +0200 Subject: [PATCH 11/26] Remove TODO --- crates/scarb-api/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 778cbe8e5..27a5868fb 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -96,7 +96,6 @@ fn get_starknet_artifacts_paths_from_test_targets( let test_type = metadata .params - // TODO get rid of hardcoding .get("test-type") .and_then(|value| value.as_str()) .unwrap(); From 1af16b7d50dfe63ea36f7e833beebe69e708d51a Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 12:35:07 +0200 Subject: [PATCH 12/26] Remove duplicated validation --- crates/scarb-api/src/lib.rs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 27a5868fb..6acd02452 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -156,10 +156,6 @@ pub fn get_contracts_artifacts_and_source_sierra_paths( fn load_contracts_artifacts( contracts_paths: &[ContractArtifactData], ) -> Result> { - if contracts_paths.is_empty() { - return Ok(HashMap::new()); - } - // TODO use const let base_artifacts = contracts_paths .iter() From 5652e24ae25be4827f6f9204b900fe89a6818441 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 12:36:42 +0200 Subject: [PATCH 13/26] Use const for integration `test_type` --- crates/scarb-api/src/lib.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 6acd02452..5d6ccda97 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -16,6 +16,8 @@ mod command; pub mod metadata; pub mod version; +const INTEGRATION_TEST_TYPE: &str = "integration"; + #[derive(Deserialize, Debug, PartialEq, Clone)] struct StarknetArtifacts { version: u32, @@ -156,10 +158,9 @@ pub fn get_contracts_artifacts_and_source_sierra_paths( fn load_contracts_artifacts( contracts_paths: &[ContractArtifactData], ) -> Result> { - // TODO use const let base_artifacts = contracts_paths .iter() - .find(|paths| paths.test_type == Some("integration".to_string())) + .find(|paths| paths.test_type == Some(INTEGRATION_TEST_TYPE.to_string())) .unwrap_or( contracts_paths .first() @@ -467,7 +468,7 @@ mod tests { "target/dev/basic_package_integrationtest.test.starknet_artifacts.json" )) .unwrap(), - test_type: Some("integration".to_string()) + test_type: Some(INTEGRATION_TEST_TYPE.to_string()) }, ContractArtifactData { path: Utf8PathBuf::from_path_buf( From bc8049dbd195ea56ee5709f7fbcaea6b6388109f Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 12:41:46 +0200 Subject: [PATCH 14/26] Add doc comment --- crates/scarb-api/src/lib.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 5d6ccda97..0f49522ea 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -155,6 +155,14 @@ pub fn get_contracts_artifacts_and_source_sierra_paths( } } +/// Load contract artifacts from paths represented by `ContractArtifactData` +/// +/// If artifacts with `test_type` of `INTEGRATION_TEST_TYPE` are present, we load them first +/// and later extend with contracts from other artifacts. +/// If `INTEGRATION_TEST_TYPE` is not present, we take first artifacts found in `contracts_paths`. +/// +/// # Panics +/// If `contracts_paths` is empty fn load_contracts_artifacts( contracts_paths: &[ContractArtifactData], ) -> Result> { From c28c5437c3063fedc59d40d192964bd265418a15 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 12:53:45 +0200 Subject: [PATCH 15/26] Update comment --- crates/scarb-api/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 0f49522ea..c19ab514d 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -114,8 +114,7 @@ fn get_starknet_artifacts_paths_from_test_targets( .collect() } -/// Try getting the path to `starknet_artifacts.json` file that is generated by `scarb build` or `scarb build --test` commands. -/// If contract artifacts are produced as part of the test target and exist in both `unittest` and `integrationtest`, then the path to `integrationtest` will be returned. +/// Try getting the path to `starknet_artifacts.json` file that is generated by `scarb build` command /// If the file is not present, `None` is returned. fn get_starknet_artifacts_path( target_dir: &Utf8Path, From 9b54c0a3edb97f5919179394f4528bbefa11dea6 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 14:07:24 +0200 Subject: [PATCH 16/26] Print warnings on missing artifacts, simply logic for building path in legacy compilation --- crates/cheatnet/tests/common/mod.rs | 9 +- crates/forge/src/run_tests/package.rs | 1 - crates/forge/test_utils/src/runner.rs | 15 ++-- crates/forge/tests/e2e/contract_artifacts.rs | 2 +- crates/scarb-api/src/lib.rs | 89 ++++++++------------ crates/sncast/src/helpers/scarb_utils.rs | 14 +-- 6 files changed, 47 insertions(+), 83 deletions(-) diff --git a/crates/cheatnet/tests/common/mod.rs b/crates/cheatnet/tests/common/mod.rs index 0ea41269a..b1e2dd840 100644 --- a/crates/cheatnet/tests/common/mod.rs +++ b/crates/cheatnet/tests/common/mod.rs @@ -78,13 +78,8 @@ pub fn get_contracts() -> ContractsData { let package = scarb_metadata.packages.first().unwrap(); - let contracts = get_contracts_artifacts_and_source_sierra_paths( - &scarb_metadata, - &target_dir, - package, - false, - ) - .unwrap(); + let contracts = + get_contracts_artifacts_and_source_sierra_paths(&target_dir, package, false).unwrap(); ContractsData::try_from(contracts).unwrap() } diff --git a/crates/forge/src/run_tests/package.rs b/crates/forge/src/run_tests/package.rs index 1cba1d051..e6fff1189 100644 --- a/crates/forge/src/run_tests/package.rs +++ b/crates/forge/src/run_tests/package.rs @@ -53,7 +53,6 @@ impl RunForPackageArgs { let raw_test_targets = load_test_artifacts(snforge_target_dir_path, &package)?; let contracts = get_contracts_artifacts_and_source_sierra_paths( - scarb_metadata, snforge_target_dir_path, &package, !should_compile_starknet_contract_target( diff --git a/crates/forge/test_utils/src/runner.rs b/crates/forge/test_utils/src/runner.rs index be82a815d..5501f4afa 100644 --- a/crates/forge/test_utils/src/runner.rs +++ b/crates/forge/test_utils/src/runner.rs @@ -98,16 +98,11 @@ impl Contract { .unwrap(); let target_dir = target_dir_for_workspace(&scarb_metadata).join("dev"); - let contract = get_contracts_artifacts_and_source_sierra_paths( - &scarb_metadata, - &target_dir, - package, - false, - ) - .unwrap() - .remove(&self.name) - .ok_or(anyhow!("there is no contract with name {}", self.name))? - .0; + let contract = get_contracts_artifacts_and_source_sierra_paths(&target_dir, package, false) + .unwrap() + .remove(&self.name) + .ok_or(anyhow!("there is no contract with name {}", self.name))? + .0; Ok((contract.sierra, contract.casm)) } diff --git a/crates/forge/tests/e2e/contract_artifacts.rs b/crates/forge/tests/e2e/contract_artifacts.rs index 877b035b8..0c2d7991f 100644 --- a/crates/forge/tests/e2e/contract_artifacts.rs +++ b/crates/forge/tests/e2e/contract_artifacts.rs @@ -3,7 +3,7 @@ use assert_fs::fixture::{FileWriteStr, PathChild}; use indoc::indoc; use shared::test_utils::output_assert::assert_stdout_contains; use std::fs; -use toml_edit::{value, DocumentMut, Item, Value}; +use toml_edit::DocumentMut; #[test] fn unit_and_integration() { diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index c19ab514d..883383750 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -1,8 +1,6 @@ use anyhow::{anyhow, Context, Result}; use camino::{Utf8Path, Utf8PathBuf}; -use scarb_metadata::{ - CompilationUnitMetadata, Metadata, PackageId, PackageMetadata, TargetMetadata, -}; +use scarb_metadata::{Metadata, PackageId, PackageMetadata, TargetMetadata}; use semver::VersionReq; use serde::Deserialize; use std::collections::HashMap; @@ -11,6 +9,7 @@ use std::str::FromStr; use universal_sierra_compiler_api::{compile_sierra_at_path, SierraType}; pub use command::*; +use shared::print::print_as_warning; mod command; pub mod metadata; @@ -94,7 +93,14 @@ fn get_starknet_artifacts_paths_from_test_targets( |name: &str, metadata: &TargetMetadata| -> Option { let path = format!("{name}.test.starknet_artifacts.json"); let path = target_dir.join(&path); - let path = if path.exists() { Some(path) } else { None }; + let path = if path.exists() { + Some(path) + } else { + print_as_warning(&anyhow!( + "File = {path} missing when it should be existing, perhaps due to Scarb problem." + )); + None + }; let test_type = metadata .params @@ -122,7 +128,16 @@ fn get_starknet_artifacts_path( ) -> Option { let path = format!("{target_name}.starknet_artifacts.json"); let path = target_dir.join(&path); - let path = if path.exists() { Some(path) } else { None }; + let path = if path.exists() { + Some(path) + } else { + print_as_warning(&anyhow!( + "File = {path} missing.\ + This is most likely caused by `[[target.starknet-contract]]` being undefined in Scarb.toml\ + No contracts will be available for deployment" + )); + None + }; path.map(|path| ContractArtifactData { path, @@ -132,7 +147,6 @@ fn get_starknet_artifacts_path( /// Get the map with `StarknetContractArtifacts` for the given package pub fn get_contracts_artifacts_and_source_sierra_paths( - metadata: &Metadata, target_dir: &Utf8Path, package: &PackageMetadata, use_test_target_contracts: bool, @@ -141,10 +155,18 @@ pub fn get_contracts_artifacts_and_source_sierra_paths( let test_targets = test_targets_by_name(package); get_starknet_artifacts_paths_from_test_targets(target_dir, &test_targets) } else { - let target_name = target_name_for_package(metadata, &package.id)?; - get_starknet_artifacts_path(target_dir, &target_name) - .into_iter() - .collect() + let starknet_target_name = package + .targets + .iter() + .find(|target| target.kind == "starknet-contract") + .map(|target| target.name.clone()); + starknet_target_name + .map(|starknet_target_name| { + get_starknet_artifacts_path(target_dir, starknet_target_name.as_str()) + .into_iter() + .collect::>() + }) + .unwrap_or_default() }; if contracts_paths.is_empty() { @@ -213,28 +235,6 @@ fn load_contracts_artifacts_and_source_sierra_paths( Ok(map) } -fn compilation_unit_for_package<'a>( - metadata: &'a Metadata, - package: &PackageId, -) -> Result<&'a CompilationUnitMetadata> { - metadata - .compilation_units - .iter() - .filter(|unit| unit.package == *package) - .min_by_key(|unit| match unit.target.kind.as_str() { - name @ "starknet-contract" => (0, name), - name @ "lib" => (1, name), - name => (2, name), - }) - .ok_or_else(|| anyhow!("Failed to find metadata for package = {package}")) -} - -/// Get the target name for the given package -pub fn target_name_for_package(metadata: &Metadata, package: &PackageId) -> Result { - let compilation_unit = compilation_unit_for_package(metadata, package)?; - Ok(compilation_unit.target.name.clone()) -} - #[must_use] pub fn target_dir_for_workspace(metadata: &Metadata) -> Utf8PathBuf { metadata @@ -686,13 +686,9 @@ mod tests { let target_dir = target_dir_for_workspace(&metadata).join("dev"); let package = metadata.packages.first().unwrap(); - let contracts = get_contracts_artifacts_and_source_sierra_paths( - &metadata, - target_dir.as_path(), - package, - false, - ) - .unwrap(); + let contracts = + get_contracts_artifacts_and_source_sierra_paths(target_dir.as_path(), package, false) + .unwrap(); assert!(contracts.contains_key("ERC20")); assert!(contracts.contains_key("HelloStarknet")); @@ -728,19 +724,4 @@ mod tests { assert_eq!(&package_name, "basic_package"); } - - #[test] - fn get_target_name_for_package() { - let temp = setup_package("basic_package"); - let scarb_metadata = ScarbCommand::metadata() - .inherit_stderr() - .current_dir(temp.path()) - .run() - .unwrap(); - - let target_name = - target_name_for_package(&scarb_metadata, &scarb_metadata.workspace.members[0]).unwrap(); - - assert_eq!(target_name, "basic_package"); - } } diff --git a/crates/sncast/src/helpers/scarb_utils.rs b/crates/sncast/src/helpers/scarb_utils.rs index 0cce5b32e..60a5a5cf2 100644 --- a/crates/sncast/src/helpers/scarb_utils.rs +++ b/crates/sncast/src/helpers/scarb_utils.rs @@ -165,7 +165,6 @@ pub fn build_and_load_artifacts( if metadata.profiles.contains(&config.profile) { Ok(get_contracts_artifacts_and_source_sierra_paths( - &metadata, &target_dir.join(&config.profile), package, false, @@ -179,15 +178,10 @@ pub fn build_and_load_artifacts( "Profile {profile} does not exist in scarb, using '{default_profile}' profile." )); Ok( - get_contracts_artifacts_and_source_sierra_paths( - &metadata, - &target_dir, - package, - false, - )? - .into_iter() - .map(|(name, (artifacts, _))| (name, artifacts)) - .collect(), + get_contracts_artifacts_and_source_sierra_paths(&target_dir, package, false)? + .into_iter() + .map(|(name, (artifacts, _))| (name, artifacts)) + .collect(), ) } } From 1da9367c13cfdc0f0a1ccbe5e53191c96bba9347 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 14:09:01 +0200 Subject: [PATCH 17/26] Remove unwrap --- crates/scarb-api/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 883383750..8b12b1cc5 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -106,11 +106,11 @@ fn get_starknet_artifacts_paths_from_test_targets( .params .get("test-type") .and_then(|value| value.as_str()) - .unwrap(); + .map(ToString::to_string); path.map(|path| ContractArtifactData { path: Utf8PathBuf::from_str(path.as_str()).unwrap(), - test_type: Some(test_type.to_string()), + test_type, }) }; From 14d302c38547d000d02064c4fff705fb651d4bb6 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 14:36:33 +0200 Subject: [PATCH 18/26] Remove metadata.json --- .../custom_target_custom_names/metadata.json | 527 ------------------ 1 file changed, 527 deletions(-) delete mode 100644 crates/forge/tests/data/targets/custom_target_custom_names/metadata.json diff --git a/crates/forge/tests/data/targets/custom_target_custom_names/metadata.json b/crates/forge/tests/data/targets/custom_target_custom_names/metadata.json deleted file mode 100644 index 2d0bbb7bc..000000000 --- a/crates/forge/tests/data/targets/custom_target_custom_names/metadata.json +++ /dev/null @@ -1,527 +0,0 @@ -{ - "version": 1, - "app_exe": "/Users/arturmichalek/.asdf/installs/scarb/2.8.3/bin/scarb", - "app_version_info": { - "version": "2.8.3", - "commit_info": { - "short_commit_hash": "54938ce3b", - "commit_hash": "54938ce3b01f81959e6e0114b080cc5e1a73935b", - "commit_date": "2024-09-26" - }, - "cairo": { - "version": "2.8.2", - "commit_info": null - } - }, - "target_dir": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/target", - "runtime_manifest": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml", - "workspace": { - "manifest_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml", - "root": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names", - "members": [ - "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)" - ] - }, - "packages": [ - { - "id": "core 2.8.2 (std)", - "name": "core", - "version": "2.8.2", - "edition": "2024_07", - "source": "std", - "manifest_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/Scarb.toml", - "root": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core", - "dependencies": [ - { - "name": "cairo_test", - "version_req": "^2.8.2", - "source": "registry+https://scarbs.xyz/", - "kind": "dev" - } - ], - "targets": [ - { - "kind": "lib", - "name": "core", - "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/src/lib.cairo", - "params": {} - }, - { - "kind": "test", - "name": "core_unittest", - "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/src/lib.cairo", - "params": { - "build-external-contracts": [], - "test-type": "unit" - } - } - ], - "authors": null, - "description": null, - "documentation": null, - "homepage": null, - "keywords": null, - "license": null, - "license_file": null, - "readme": null, - "repository": null, - "urls": null, - "tool": null, - "experimental_features": [ - "coupons", - "negative_impls" - ] - }, - { - "id": "snforge_scarb_plugin 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml)", - "name": "snforge_scarb_plugin", - "version": "0.31.0", - "edition": "2023_01", - "source": "path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml", - "manifest_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml", - "root": "/Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin", - "dependencies": [ - { - "name": "core", - "version_req": "=2.8.2", - "source": "registry+https://scarbs.xyz/", - "kind": null - } - ], - "targets": [ - { - "kind": "cairo-plugin", - "name": "snforge_scarb_plugin", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/src/lib.cairo", - "params": {} - } - ], - "authors": null, - "description": null, - "documentation": null, - "homepage": null, - "keywords": null, - "license": null, - "license_file": null, - "readme": null, - "repository": null, - "urls": null, - "tool": null, - "experimental_features": [] - }, - { - "id": "snforge_std 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml)", - "name": "snforge_std", - "version": "0.31.0", - "edition": "2023_10", - "source": "path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml", - "manifest_path": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml", - "root": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std", - "dependencies": [ - { - "name": "core", - "version_req": "=2.8.2", - "source": "registry+https://scarbs.xyz/", - "kind": null - }, - { - "name": "snforge_scarb_plugin", - "version_req": "*", - "source": "path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml", - "kind": null - } - ], - "targets": [ - { - "kind": "lib", - "name": "snforge_std", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std/src/lib.cairo", - "params": {} - }, - { - "kind": "test", - "name": "snforge_std_unittest", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std/src/lib.cairo", - "params": { - "build-external-contracts": [], - "test-type": "unit" - } - } - ], - "authors": null, - "description": null, - "documentation": null, - "homepage": null, - "keywords": null, - "license": null, - "license_file": null, - "readme": null, - "repository": null, - "urls": null, - "tool": null, - "experimental_features": [] - }, - { - "id": "starknet 2.8.2 (std)", - "name": "starknet", - "version": "2.8.2", - "edition": "2023_01", - "source": "std", - "manifest_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/starknet/Scarb.toml", - "root": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/starknet", - "dependencies": [ - { - "name": "core", - "version_req": "=2.8.2", - "source": "registry+https://scarbs.xyz/", - "kind": null - } - ], - "targets": [ - { - "kind": "cairo-plugin", - "name": "starknet", - "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/starknet/src/lib.cairo", - "params": { - "builtin": true - } - } - ], - "authors": null, - "description": null, - "documentation": null, - "homepage": null, - "keywords": null, - "license": null, - "license_file": null, - "readme": null, - "repository": null, - "urls": null, - "tool": null, - "experimental_features": [] - }, - { - "id": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", - "name": "targets", - "version": "0.1.0", - "edition": "2023_01", - "source": "path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml", - "manifest_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml", - "root": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names", - "dependencies": [ - { - "name": "core", - "version_req": "=2.8.2", - "source": "registry+https://scarbs.xyz/", - "kind": null - }, - { - "name": "snforge_std", - "version_req": "*", - "source": "path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml", - "kind": "dev" - }, - { - "name": "starknet", - "version_req": "^2.7.0", - "source": "registry+https://scarbs.xyz/", - "kind": null - } - ], - "targets": [ - { - "kind": "lib", - "name": "targets", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", - "params": {} - }, - { - "kind": "test", - "name": "custom_first", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo", - "params": { - "build-external-contracts": [ - "targets::*" - ], - "kind": "test", - "test-type": "integration" - } - }, - { - "kind": "test", - "name": "custom_second", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", - "params": { - "kind": "test", - "test-type": "unit" - } - } - ], - "authors": null, - "description": null, - "documentation": null, - "homepage": null, - "keywords": null, - "license": null, - "license_file": null, - "readme": null, - "repository": null, - "urls": null, - "tool": { - "snforge": { - "exit_first": false - } - }, - "experimental_features": [] - } - ], - "compilation_units": [ - { - "id": "custom_first-dm6vp9cbo1sd2", - "package": "custom_first 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", - "target": { - "kind": "test", - "name": "custom_first", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo", - "params": { - "build-external-contracts": [ - "targets::*" - ], - "kind": "test", - "test-type": "integration" - } - }, - "compiler_config": { - "allow_warnings": true, - "enable_gas": true, - "inlining_strategy": "default", - "sierra_replace_ids": true, - "unstable_add_statements_code_locations_debug_info": false, - "unstable_add_statements_functions_debug_info": false - }, - "components_data": [ - { - "package": "core 2.8.2 (std)", - "name": "core", - "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/src/lib.cairo", - "cfg": [ - [ - "target", - "test" - ] - ] - }, - { - "package": "custom_first 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", - "name": "custom_first", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo", - "cfg": [ - [ - "target", - "test" - ], - "test" - ] - }, - { - "package": "snforge_std 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml)", - "name": "snforge_std", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std/src/lib.cairo", - "cfg": [ - [ - "target", - "test" - ] - ] - }, - { - "package": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", - "name": "targets", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", - "cfg": [ - [ - "target", - "test" - ] - ] - } - ], - "cairo_plugins": [ - { - "package": "snforge_scarb_plugin 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml)" - }, - { - "package": "starknet 2.8.2 (std)" - } - ], - "cfg": [ - [ - "target", - "test" - ], - "test" - ], - "components": [ - "core 2.8.2 (std)", - "custom_first 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", - "snforge_std 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml)", - "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)" - ] - }, - { - "id": "snforge_scarb_plugin-9f1qbmldisnii", - "package": "snforge_scarb_plugin 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml)", - "target": { - "kind": "cairo-plugin", - "name": "snforge_scarb_plugin", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/src/lib.cairo", - "params": {} - }, - "compiler_config": null, - "components_data": [ - { - "package": "snforge_scarb_plugin 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml)", - "name": "snforge_scarb_plugin", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/src/lib.cairo", - "cfg": null - } - ], - "cairo_plugins": [], - "cfg": [] - }, - { - "id": "targets-3nil7dgpqucis", - "package": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", - "target": { - "kind": "lib", - "name": "targets", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", - "params": {} - }, - "compiler_config": { - "allow_warnings": true, - "enable_gas": true, - "inlining_strategy": "default", - "sierra_replace_ids": true, - "unstable_add_statements_code_locations_debug_info": false, - "unstable_add_statements_functions_debug_info": false - }, - "components_data": [ - { - "package": "core 2.8.2 (std)", - "name": "core", - "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/src/lib.cairo", - "cfg": null - }, - { - "package": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", - "name": "targets", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", - "cfg": [ - [ - "target", - "lib" - ] - ] - } - ], - "cairo_plugins": [ - { - "package": "starknet 2.8.2 (std)" - } - ], - "cfg": [ - [ - "target", - "lib" - ] - ], - "components": [ - "core 2.8.2 (std)", - "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)" - ] - }, - { - "id": "targets-s7j5pakf7ncfa", - "package": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", - "target": { - "kind": "test", - "name": "custom_second", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", - "params": { - "kind": "test", - "test-type": "unit" - } - }, - "compiler_config": { - "allow_warnings": true, - "enable_gas": true, - "inlining_strategy": "default", - "sierra_replace_ids": true, - "unstable_add_statements_code_locations_debug_info": false, - "unstable_add_statements_functions_debug_info": false - }, - "components_data": [ - { - "package": "core 2.8.2 (std)", - "name": "core", - "source_path": "/Users/arturmichalek/Library/Caches/com.swmansion.scarb/registry/std/v2.8.2/core/src/lib.cairo", - "cfg": [ - [ - "target", - "test" - ] - ] - }, - { - "package": "snforge_std 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml)", - "name": "snforge_std", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/snforge_std/src/lib.cairo", - "cfg": [ - [ - "target", - "test" - ] - ] - }, - { - "package": "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)", - "name": "targets", - "source_path": "/Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo", - "cfg": [ - [ - "target", - "test" - ], - "test" - ] - } - ], - "cairo_plugins": [ - { - "package": "snforge_scarb_plugin 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/snforge-scarb-plugin/Scarb.toml)" - }, - { - "package": "starknet 2.8.2 (std)" - } - ], - "cfg": [ - [ - "target", - "test" - ], - "test" - ], - "components": [ - "core 2.8.2 (std)", - "snforge_std 0.31.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/snforge_std/Scarb.toml)", - "targets 0.1.0 (path+file:///Users/arturmichalek/Coding/starknet-foundry/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml)" - ] - } - ], - "current_profile": "dev", - "profiles": [ - "dev", - "release" - ] -} From 88a1645bc05c1e9a4841e726c5f67d00a5fc85a5 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 15:07:43 +0200 Subject: [PATCH 19/26] Restructure code --- crates/scarb-api/src/lib.rs | 220 ++++++++++++++++++------------------ 1 file changed, 112 insertions(+), 108 deletions(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 8b12b1cc5..349c7e0d6 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -80,44 +80,92 @@ fn artifacts_for_package(path: &Utf8Path) -> Result { } #[derive(PartialEq, Debug)] -struct ContractArtifactData { - path: Utf8PathBuf, - test_type: Option, +struct StarknetArtifactsFiles { + base_file: Utf8PathBuf, + other_files: Vec, } +impl StarknetArtifactsFiles { + fn load_contracts_artifacts( + self, + ) -> Result> { + let mut base_artifacts = load_contracts_artifacts_and_source_sierra_paths(&self.base_file)?; + + for file_path in self.other_files { + let artifact = load_contracts_artifacts_and_source_sierra_paths(&file_path)?; + for (key, value) in artifact { + base_artifacts.entry(key).or_insert(value); + } + } + + Ok(base_artifacts) + } +} + +/// Constructs `StarknetArtifactsFiles` from contracts built using test target. +/// +/// If artifacts with `test_type` of `INTEGRATION_TEST_TYPE` are present, we use them base path +/// and extend with paths to other artifacts. +/// If `INTEGRATION_TEST_TYPE` is not present, we take first artifacts found. fn get_starknet_artifacts_paths_from_test_targets( target_dir: &Utf8Path, test_targets: &HashMap, -) -> Vec { - let starknet_artifacts_file_name = - |name: &str, metadata: &TargetMetadata| -> Option { - let path = format!("{name}.test.starknet_artifacts.json"); - let path = target_dir.join(&path); - let path = if path.exists() { - Some(path) - } else { - print_as_warning(&anyhow!( +) -> Option { + #[derive(PartialEq, Debug, Clone)] + struct ContractArtifactData { + path: Utf8PathBuf, + test_type: Option, + } + + let artifact = |name: &str, metadata: &TargetMetadata| -> Option { + let path = format!("{name}.test.starknet_artifacts.json"); + let path = target_dir.join(&path); + let path = if path.exists() { + Some(path) + } else { + print_as_warning(&anyhow!( "File = {path} missing when it should be existing, perhaps due to Scarb problem." )); - None - }; - - let test_type = metadata - .params - .get("test-type") - .and_then(|value| value.as_str()) - .map(ToString::to_string); - - path.map(|path| ContractArtifactData { - path: Utf8PathBuf::from_str(path.as_str()).unwrap(), - test_type, - }) + None }; - test_targets + let test_type = metadata + .params + .get("test-type") + .and_then(|value| value.as_str()) + .map(ToString::to_string); + + path.map(|path| ContractArtifactData { + path: Utf8PathBuf::from_str(path.as_str()).unwrap(), + test_type, + }) + }; + + let artifacts = test_targets .iter() - .filter_map(|(target_name, metadata)| starknet_artifacts_file_name(target_name, metadata)) - .collect() + .filter_map(|(target_name, metadata)| artifact(target_name, metadata)) + .collect::>(); + + let base_artifact = artifacts + .iter() + .find(|paths| paths.test_type == Some(INTEGRATION_TEST_TYPE.to_string())) + .cloned() + .or_else(|| artifacts.first().cloned()); + + if let Some(base_artifact) = base_artifact { + let other_artifacts = artifacts + .into_iter() + .filter(|artifact| artifact != &base_artifact) + .map(|artifact| artifact.path) + .collect(); + + Some(StarknetArtifactsFiles { + base_file: base_artifact.path.clone(), + other_files: other_artifacts, + }) + } else { + None + } } /// Try getting the path to `starknet_artifacts.json` file that is generated by `scarb build` command @@ -125,7 +173,7 @@ fn get_starknet_artifacts_paths_from_test_targets( fn get_starknet_artifacts_path( target_dir: &Utf8Path, target_name: &str, -) -> Option { +) -> Option { let path = format!("{target_name}.starknet_artifacts.json"); let path = target_dir.join(&path); let path = if path.exists() { @@ -139,9 +187,9 @@ fn get_starknet_artifacts_path( None }; - path.map(|path| ContractArtifactData { - path, - test_type: None, + path.map(|path| StarknetArtifactsFiles { + base_file: path, + other_files: vec![], }) } @@ -151,7 +199,7 @@ pub fn get_contracts_artifacts_and_source_sierra_paths( package: &PackageMetadata, use_test_target_contracts: bool, ) -> Result> { - let contracts_paths = if use_test_target_contracts { + let starknet_artifact_files = if use_test_target_contracts { let test_targets = test_targets_by_name(package); get_starknet_artifacts_paths_from_test_targets(target_dir, &test_targets) } else { @@ -160,58 +208,16 @@ pub fn get_contracts_artifacts_and_source_sierra_paths( .iter() .find(|target| target.kind == "starknet-contract") .map(|target| target.name.clone()); - starknet_target_name - .map(|starknet_target_name| { - get_starknet_artifacts_path(target_dir, starknet_target_name.as_str()) - .into_iter() - .collect::>() - }) - .unwrap_or_default() + starknet_target_name.and_then(|starknet_target_name| { + get_starknet_artifacts_path(target_dir, starknet_target_name.as_str()) + }) }; - if contracts_paths.is_empty() { - Ok(HashMap::default()) + if let Some(starknet_artifact_files) = starknet_artifact_files { + starknet_artifact_files.load_contracts_artifacts() } else { - load_contracts_artifacts(&contracts_paths) - } -} - -/// Load contract artifacts from paths represented by `ContractArtifactData` -/// -/// If artifacts with `test_type` of `INTEGRATION_TEST_TYPE` are present, we load them first -/// and later extend with contracts from other artifacts. -/// If `INTEGRATION_TEST_TYPE` is not present, we take first artifacts found in `contracts_paths`. -/// -/// # Panics -/// If `contracts_paths` is empty -fn load_contracts_artifacts( - contracts_paths: &[ContractArtifactData], -) -> Result> { - let base_artifacts = contracts_paths - .iter() - .find(|paths| paths.test_type == Some(INTEGRATION_TEST_TYPE.to_string())) - .unwrap_or( - contracts_paths - .first() - .expect("Must have at least one value because of the assert above"), - ); - - let other_artifacts: Vec<&ContractArtifactData> = contracts_paths - .iter() - .filter(|path| path != &base_artifacts) - .collect(); - - let mut base_artifacts = - load_contracts_artifacts_and_source_sierra_paths(&base_artifacts.path)?; - - for artifact in other_artifacts { - let artifact = load_contracts_artifacts_and_source_sierra_paths(&artifact.path)?; - for (key, value) in artifact { - base_artifacts.entry(key).or_insert(value); - } + Ok(HashMap::default()) } - - Ok(base_artifacts) } fn load_contracts_artifacts_and_source_sierra_paths( @@ -374,13 +380,13 @@ mod tests { assert_eq!( path, - ContractArtifactData { - path: Utf8PathBuf::from_path_buf( + StarknetArtifactsFiles { + base_file: Utf8PathBuf::from_path_buf( temp.path() .join("target/dev/basic_package.starknet_artifacts.json") ) .unwrap(), - test_type: None + other_files: vec![] } ); } @@ -411,18 +417,19 @@ mod tests { let path = get_starknet_artifacts_paths_from_test_targets( &Utf8PathBuf::from_path_buf(temp.join("target").join("dev")).unwrap(), &test_targets_by_name(package), - ); + ) + .unwrap(); assert_eq!( path, - vec![ContractArtifactData { - path: Utf8PathBuf::from_path_buf( + StarknetArtifactsFiles { + base_file: Utf8PathBuf::from_path_buf( temp.path() .join("target/dev/basic_package_unittest.test.starknet_artifacts.json") ) .unwrap(), - test_type: Some("unit".to_string()) - }] + other_files: vec![], + } ); } @@ -465,27 +472,24 @@ mod tests { let path = get_starknet_artifacts_paths_from_test_targets( &Utf8PathBuf::from_path_buf(temp.to_path_buf().join("target").join("dev")).unwrap(), &test_targets_by_name(package), - ); + ) + .unwrap(); assert_eq!( path, - vec![ - ContractArtifactData { - path: Utf8PathBuf::from_path_buf(temp.path().join( + StarknetArtifactsFiles { + base_file: Utf8PathBuf::from_path_buf( + temp.path().join( "target/dev/basic_package_integrationtest.test.starknet_artifacts.json" - )) - .unwrap(), - test_type: Some(INTEGRATION_TEST_TYPE.to_string()) - }, - ContractArtifactData { - path: Utf8PathBuf::from_path_buf( - temp.path() - .join("target/dev/basic_package_unittest.test.starknet_artifacts.json") ) - .unwrap(), - test_type: Some("unit".to_string()) - }, - ] + ) + .unwrap(), + other_files: vec![Utf8PathBuf::from_path_buf( + temp.path() + .join("target/dev/basic_package_unittest.test.starknet_artifacts.json") + ) + .unwrap(),] + }, ); } @@ -583,12 +587,12 @@ mod tests { assert_eq!( path, - ContractArtifactData { - path: Utf8PathBuf::from_path_buf( + StarknetArtifactsFiles { + base_file: Utf8PathBuf::from_path_buf( temp.path().join("target/dev/essa.starknet_artifacts.json") ) .unwrap(), - test_type: None + other_files: vec![] } ); } From 247909160594fc28f17a51de886fe0810eab1730 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 15:32:12 +0200 Subject: [PATCH 20/26] Use unique names for test packages --- .../data/targets/custom_target/Scarb.toml | 6 +-- .../targets/custom_target/tests/tests.cairo | 4 +- .../custom_target_custom_names/Scarb.toml | 4 +- .../tests/tests.cairo | 4 +- .../custom_target_only_integration/Scarb.toml | 4 +- .../tests/tests.cairo | 4 +- .../data/targets/only_integration/Scarb.toml | 2 +- .../only_integration/tests/tests.cairo | 4 +- .../targets/only_lib_integration/Scarb.toml | 2 +- .../only_lib_integration/tests/tests.cairo | 4 +- .../tests/data/targets/only_unit/Scarb.toml | 2 +- .../targets/unit_and_integration/Scarb.toml | 2 +- .../unit_and_integration/tests/tests.cairo | 4 +- .../unit_and_lib_integration/Scarb.toml | 2 +- .../tests/tests.cairo | 4 +- .../data/targets/with_features/Scarb.toml | 2 +- .../data/targets/with_features/src/lib.cairo | 2 +- .../targets/with_features/tests/tests.cairo | 4 +- crates/forge/tests/e2e/contract_artifacts.rs | 54 +++++++++---------- 19 files changed, 57 insertions(+), 57 deletions(-) diff --git a/crates/forge/tests/data/targets/custom_target/Scarb.toml b/crates/forge/tests/data/targets/custom_target/Scarb.toml index 0e14be7d4..d1a59bd3b 100644 --- a/crates/forge/tests/data/targets/custom_target/Scarb.toml +++ b/crates/forge/tests/data/targets/custom_target/Scarb.toml @@ -1,5 +1,5 @@ [package] -name = "targets" +name = "custom_target" version = "0.1.0" [dependencies] @@ -11,13 +11,13 @@ snforge_std = { path = "../../../../../../snforge_std" } [[target.starknet-contract]] [[test]] -name = "targets_integrationtest" +name = "custom_target_integrationtest" kind = "test" source-path = "./tests/tests.cairo" test-type = "integration" [[test]] -name = "targets_unittest" +name = "custom_target_unittest" kind = "test" test-type = "unit" diff --git a/crates/forge/tests/data/targets/custom_target/tests/tests.cairo b/crates/forge/tests/data/targets/custom_target/tests/tests.cairo index a9b3f6590..79d8a2570 100644 --- a/crates/forge/tests/data/targets/custom_target/tests/tests.cairo +++ b/crates/forge/tests/data/targets/custom_target/tests/tests.cairo @@ -8,8 +8,8 @@ use starknet::Felt252TryIntoContractAddress; use snforge_std::{declare, ContractClassTrait}; use snforge_std::cheatcodes::contract_class::DeclareResultTrait; -use targets::IHelloStarknetDispatcher; -use targets::IHelloStarknetDispatcherTrait; +use custom_target::IHelloStarknetDispatcher; +use custom_target::IHelloStarknetDispatcherTrait; #[test] fn declare_and_call_contract_from_lib() { diff --git a/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml b/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml index a0443cc6f..895a6f627 100644 --- a/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml +++ b/crates/forge/tests/data/targets/custom_target_custom_names/Scarb.toml @@ -1,5 +1,5 @@ [package] -name = "targets" +name = "custom_target_custom_names" version = "0.1.0" [dependencies] @@ -14,7 +14,7 @@ name = "custom_first" kind = "my_kind" source-path = "./tests/tests.cairo" test-type = "integration" -build-external-contracts = ["targets::*"] +build-external-contracts = ["custom_target_custom_names::*"] [[test]] name = "custom_second" diff --git a/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo b/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo index a9b3f6590..ea32dbd76 100644 --- a/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo +++ b/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo @@ -8,8 +8,8 @@ use starknet::Felt252TryIntoContractAddress; use snforge_std::{declare, ContractClassTrait}; use snforge_std::cheatcodes::contract_class::DeclareResultTrait; -use targets::IHelloStarknetDispatcher; -use targets::IHelloStarknetDispatcherTrait; +use custom_target_custom_names::IHelloStarknetDispatcher; +use custom_target_custom_names::IHelloStarknetDispatcherTrait; #[test] fn declare_and_call_contract_from_lib() { diff --git a/crates/forge/tests/data/targets/custom_target_only_integration/Scarb.toml b/crates/forge/tests/data/targets/custom_target_only_integration/Scarb.toml index 305b17ac0..f389ff840 100644 --- a/crates/forge/tests/data/targets/custom_target_only_integration/Scarb.toml +++ b/crates/forge/tests/data/targets/custom_target_only_integration/Scarb.toml @@ -1,5 +1,5 @@ [package] -name = "targets" +name = "custom_target_only_integration" version = "0.1.0" [dependencies] @@ -15,7 +15,7 @@ name = "custom_first" kind = "test" source-path = "./tests/tests.cairo" test-type = "integration" -build-external-contracts = ["targets::*"] +build-external-contracts = ["custom_target_only_integration::*"] [tool.snforge] exit_first = false diff --git a/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo b/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo index a9b3f6590..6b3f5e257 100644 --- a/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo +++ b/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo @@ -8,8 +8,8 @@ use starknet::Felt252TryIntoContractAddress; use snforge_std::{declare, ContractClassTrait}; use snforge_std::cheatcodes::contract_class::DeclareResultTrait; -use targets::IHelloStarknetDispatcher; -use targets::IHelloStarknetDispatcherTrait; +use custom_target_only_integration::IHelloStarknetDispatcher; +use custom_target_only_integration::IHelloStarknetDispatcherTrait; #[test] fn declare_and_call_contract_from_lib() { diff --git a/crates/forge/tests/data/targets/only_integration/Scarb.toml b/crates/forge/tests/data/targets/only_integration/Scarb.toml index 3d718fc9d..43acb099d 100644 --- a/crates/forge/tests/data/targets/only_integration/Scarb.toml +++ b/crates/forge/tests/data/targets/only_integration/Scarb.toml @@ -1,5 +1,5 @@ [package] -name = "targets" +name = "only_integration" version = "0.1.0" [dependencies] diff --git a/crates/forge/tests/data/targets/only_integration/tests/tests.cairo b/crates/forge/tests/data/targets/only_integration/tests/tests.cairo index a9b3f6590..e6be66367 100644 --- a/crates/forge/tests/data/targets/only_integration/tests/tests.cairo +++ b/crates/forge/tests/data/targets/only_integration/tests/tests.cairo @@ -8,8 +8,8 @@ use starknet::Felt252TryIntoContractAddress; use snforge_std::{declare, ContractClassTrait}; use snforge_std::cheatcodes::contract_class::DeclareResultTrait; -use targets::IHelloStarknetDispatcher; -use targets::IHelloStarknetDispatcherTrait; +use only_integration::IHelloStarknetDispatcher; +use only_integration::IHelloStarknetDispatcherTrait; #[test] fn declare_and_call_contract_from_lib() { diff --git a/crates/forge/tests/data/targets/only_lib_integration/Scarb.toml b/crates/forge/tests/data/targets/only_lib_integration/Scarb.toml index 3d718fc9d..2c6ec0dcc 100644 --- a/crates/forge/tests/data/targets/only_lib_integration/Scarb.toml +++ b/crates/forge/tests/data/targets/only_lib_integration/Scarb.toml @@ -1,5 +1,5 @@ [package] -name = "targets" +name = "only_lib_integration" version = "0.1.0" [dependencies] diff --git a/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo b/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo index a9b3f6590..759fb108f 100644 --- a/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo +++ b/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo @@ -8,8 +8,8 @@ use starknet::Felt252TryIntoContractAddress; use snforge_std::{declare, ContractClassTrait}; use snforge_std::cheatcodes::contract_class::DeclareResultTrait; -use targets::IHelloStarknetDispatcher; -use targets::IHelloStarknetDispatcherTrait; +use only_lib_integration::IHelloStarknetDispatcher; +use only_lib_integration::IHelloStarknetDispatcherTrait; #[test] fn declare_and_call_contract_from_lib() { diff --git a/crates/forge/tests/data/targets/only_unit/Scarb.toml b/crates/forge/tests/data/targets/only_unit/Scarb.toml index 3d718fc9d..05aa51c5f 100644 --- a/crates/forge/tests/data/targets/only_unit/Scarb.toml +++ b/crates/forge/tests/data/targets/only_unit/Scarb.toml @@ -1,5 +1,5 @@ [package] -name = "targets" +name = "only_unit" version = "0.1.0" [dependencies] diff --git a/crates/forge/tests/data/targets/unit_and_integration/Scarb.toml b/crates/forge/tests/data/targets/unit_and_integration/Scarb.toml index 3d718fc9d..b6b75d51f 100644 --- a/crates/forge/tests/data/targets/unit_and_integration/Scarb.toml +++ b/crates/forge/tests/data/targets/unit_and_integration/Scarb.toml @@ -1,5 +1,5 @@ [package] -name = "targets" +name = "unit_and_integration" version = "0.1.0" [dependencies] diff --git a/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo b/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo index a9b3f6590..a3ac81514 100644 --- a/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo +++ b/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo @@ -8,8 +8,8 @@ use starknet::Felt252TryIntoContractAddress; use snforge_std::{declare, ContractClassTrait}; use snforge_std::cheatcodes::contract_class::DeclareResultTrait; -use targets::IHelloStarknetDispatcher; -use targets::IHelloStarknetDispatcherTrait; +use unit_and_integration::IHelloStarknetDispatcher; +use unit_and_integration::IHelloStarknetDispatcherTrait; #[test] fn declare_and_call_contract_from_lib() { diff --git a/crates/forge/tests/data/targets/unit_and_lib_integration/Scarb.toml b/crates/forge/tests/data/targets/unit_and_lib_integration/Scarb.toml index 3d718fc9d..da25a6d04 100644 --- a/crates/forge/tests/data/targets/unit_and_lib_integration/Scarb.toml +++ b/crates/forge/tests/data/targets/unit_and_lib_integration/Scarb.toml @@ -1,5 +1,5 @@ [package] -name = "targets" +name = "unit_and_lib_integration" version = "0.1.0" [dependencies] diff --git a/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo b/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo index a9b3f6590..213656801 100644 --- a/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo +++ b/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo @@ -8,8 +8,8 @@ use starknet::Felt252TryIntoContractAddress; use snforge_std::{declare, ContractClassTrait}; use snforge_std::cheatcodes::contract_class::DeclareResultTrait; -use targets::IHelloStarknetDispatcher; -use targets::IHelloStarknetDispatcherTrait; +use unit_and_lib_integration::IHelloStarknetDispatcher; +use unit_and_lib_integration::IHelloStarknetDispatcherTrait; #[test] fn declare_and_call_contract_from_lib() { diff --git a/crates/forge/tests/data/targets/with_features/Scarb.toml b/crates/forge/tests/data/targets/with_features/Scarb.toml index 1770ef5ab..2a63cd115 100644 --- a/crates/forge/tests/data/targets/with_features/Scarb.toml +++ b/crates/forge/tests/data/targets/with_features/Scarb.toml @@ -1,5 +1,5 @@ [package] -name = "targets" +name = "with_features" version = "0.1.0" [dependencies] diff --git a/crates/forge/tests/data/targets/with_features/src/lib.cairo b/crates/forge/tests/data/targets/with_features/src/lib.cairo index 47c0b9303..27b29604c 100644 --- a/crates/forge/tests/data/targets/with_features/src/lib.cairo +++ b/crates/forge/tests/data/targets/with_features/src/lib.cairo @@ -18,7 +18,7 @@ mod dummy { } #[abi(embed_v0)] - impl IHelloStarknetImpl of targets::IHelloStarknet { + impl IHelloStarknetImpl of with_features::IHelloStarknet { // Increases the balance by the given amount. fn increase_balance(ref self: ContractState, amount: felt252) { self.balance.write(self.balance.read() + amount); diff --git a/crates/forge/tests/data/targets/with_features/tests/tests.cairo b/crates/forge/tests/data/targets/with_features/tests/tests.cairo index a9b3f6590..c0fc4cece 100644 --- a/crates/forge/tests/data/targets/with_features/tests/tests.cairo +++ b/crates/forge/tests/data/targets/with_features/tests/tests.cairo @@ -8,8 +8,8 @@ use starknet::Felt252TryIntoContractAddress; use snforge_std::{declare, ContractClassTrait}; use snforge_std::cheatcodes::contract_class::DeclareResultTrait; -use targets::IHelloStarknetDispatcher; -use targets::IHelloStarknetDispatcherTrait; +use with_features::IHelloStarknetDispatcher; +use with_features::IHelloStarknetDispatcherTrait; #[test] fn declare_and_call_contract_from_lib() { diff --git a/crates/forge/tests/e2e/contract_artifacts.rs b/crates/forge/tests/e2e/contract_artifacts.rs index 0c2d7991f..6a86d8390 100644 --- a/crates/forge/tests/e2e/contract_artifacts.rs +++ b/crates/forge/tests/e2e/contract_artifacts.rs @@ -17,11 +17,11 @@ fn unit_and_integration() { [..]Finished[..] - Collected 2 test(s) from targets package + Collected 2 test(s) from unit_and_integration package Running 1 test(s) from tests/ - [PASS] targets_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) + [PASS] unit_and_integration_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) Running 1 test(s) from src/ - [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + [PASS] unit_and_integration::tests::declare_contract_from_lib (gas: ~1) Tests: 2 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out "}, ); @@ -39,11 +39,11 @@ fn unit_and_lib_integration() { [..]Finished[..] - Collected 2 test(s) from targets package + Collected 2 test(s) from unit_and_lib_integration package Running 1 test(s) from tests/ - [PASS] targets_tests::tests::declare_and_call_contract_from_lib (gas: ~172) + [PASS] unit_and_lib_integration_tests::tests::declare_and_call_contract_from_lib (gas: ~172) Running 1 test(s) from src/ - [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + [PASS] unit_and_lib_integration::tests::declare_contract_from_lib (gas: ~1) Tests: 2 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out "}, ); @@ -61,9 +61,9 @@ fn only_integration() { [..]Finished[..] - Collected 1 test(s) from targets package + Collected 1 test(s) from only_integration package Running 1 test(s) from tests/ - [PASS] targets_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) + [PASS] only_integration_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) Running 0 test(s) from src/ Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out "}, @@ -82,9 +82,9 @@ fn only_unit() { [..]Finished[..] - Collected 1 test(s) from targets package + Collected 1 test(s) from only_unit package Running 1 test(s) from src/ - [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + [PASS] only_unit::tests::declare_contract_from_lib (gas: ~1) Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out "}, ); @@ -102,9 +102,9 @@ fn only_lib_integration() { [..]Finished[..] - Collected 1 test(s) from targets package + Collected 1 test(s) from only_lib_integration package Running 1 test(s) from tests/ - [PASS] targets_tests::tests::declare_and_call_contract_from_lib (gas: ~172) + [PASS] only_lib_integration_tests::tests::declare_and_call_contract_from_lib (gas: ~172) Running 0 test(s) from src/ Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out "}, @@ -127,11 +127,11 @@ fn with_features() { [..]Finished[..] - Collected 2 test(s) from targets package + Collected 2 test(s) from with_features package Running 1 test(s) from tests/ - [PASS] targets_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) + [PASS] with_features_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) Running 1 test(s) from src/ - [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + [PASS] with_features::tests::declare_contract_from_lib (gas: ~1) Tests: 2 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out "}, ); @@ -149,15 +149,15 @@ fn with_features_fails_without_flag() { [..]Finished[..] - Collected 2 test(s) from targets package + Collected 2 test(s) from with_features package Running 1 test(s) from tests/ - [FAIL] targets_integrationtest::tests::declare_and_call_contract_from_lib + [FAIL] with_features_integrationtest::tests::declare_and_call_contract_from_lib Failure data: "Failed to get contract artifact for name = HelloStarknet." Running 1 test(s) from src/ - [FAIL] targets::tests::declare_contract_from_lib + [FAIL] with_features::tests::declare_contract_from_lib Failure data: "Failed to get contract artifact for name = HelloStarknet." @@ -165,8 +165,8 @@ fn with_features_fails_without_flag() { Tests: 0 passed, 2 failed, 0 skipped, 0 ignored, 0 filtered out Failures: - targets_integrationtest::tests::declare_and_call_contract_from_lib - targets::tests::declare_contract_from_lib + with_features_integrationtest::tests::declare_and_call_contract_from_lib + with_features::tests::declare_contract_from_lib "#}, ); } @@ -187,11 +187,11 @@ fn custom_target() { [..]Finished[..] - Collected 2 test(s) from targets package + Collected 2 test(s) from custom_target package Running 1 test(s) from tests/ - [PASS] targets_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) + [PASS] custom_target_integrationtest::tests::declare_and_call_contract_from_lib (gas: ~172) Running 1 test(s) from src/ - [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + [PASS] custom_target::tests::declare_contract_from_lib (gas: ~1) Tests: 2 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out "}, ); @@ -215,11 +215,11 @@ fn custom_target_custom_names() { [..]Finished[..] - Collected 2 test(s) from targets package + Collected 2 test(s) from custom_target_custom_names package Running 1 test(s) from tests/ [PASS] custom_first::tests::declare_and_call_contract_from_lib (gas: ~172) Running 1 test(s) from src/ - [PASS] targets::tests::declare_contract_from_lib (gas: ~1) + [PASS] custom_target_custom_names::tests::declare_contract_from_lib (gas: ~1) Tests: 2 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out "}, ); @@ -240,7 +240,7 @@ fn custom_target_only_integration() { [..]Finished[..] - Collected 1 test(s) from targets package + Collected 1 test(s) from custom_target_only_integration package Running 1 test(s) from tests/ [PASS] custom_first::tests::declare_and_call_contract_from_lib (gas: ~172) Tests: 1 passed, 0 failed, 0 skipped, 0 ignored, 0 filtered out @@ -275,7 +275,7 @@ fn custom_target_only_integration_without_external() { [..]Finished[..] - Collected 1 test(s) from targets package + Collected 1 test(s) from custom_target_only_integration package Running 1 test(s) from tests/ [FAIL] custom_first::tests::declare_and_call_contract_from_lib From 5d1b195e81bcefc478c9a9a94495b5840ca2c86e Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 15:44:50 +0200 Subject: [PATCH 21/26] Compile contracts in parallel --- Cargo.lock | 1 + crates/scarb-api/Cargo.toml | 1 + crates/scarb-api/src/lib.rs | 10 ++++++++-- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a63feee4..e48d55124 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4230,6 +4230,7 @@ dependencies = [ "assert_fs", "camino", "indoc", + "rayon", "regex", "scarb-metadata", "scarb-ui", diff --git a/crates/scarb-api/Cargo.toml b/crates/scarb-api/Cargo.toml index 77ad12172..d0a1cdc89 100644 --- a/crates/scarb-api/Cargo.toml +++ b/crates/scarb-api/Cargo.toml @@ -18,6 +18,7 @@ thiserror.workspace = true which.workspace = true semver.workspace = true regex.workspace = true +rayon.workspace = true universal-sierra-compiler-api = { path = "../universal-sierra-compiler-api" } [dev-dependencies] diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index 349c7e0d6..c16f4514c 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -1,5 +1,6 @@ use anyhow::{anyhow, Context, Result}; use camino::{Utf8Path, Utf8PathBuf}; +use rayon::iter::{IntoParallelRefIterator, ParallelIterator}; use scarb_metadata::{Metadata, PackageId, PackageMetadata, TargetMetadata}; use semver::VersionReq; use serde::Deserialize; @@ -91,8 +92,13 @@ impl StarknetArtifactsFiles { ) -> Result> { let mut base_artifacts = load_contracts_artifacts_and_source_sierra_paths(&self.base_file)?; - for file_path in self.other_files { - let artifact = load_contracts_artifacts_and_source_sierra_paths(&file_path)?; + let compiled_artifacts = self + .other_files + .par_iter() + .map(load_contracts_artifacts_and_source_sierra_paths) + .collect::>>()?; + + for artifact in compiled_artifacts { for (key, value) in artifact { base_artifacts.entry(key).or_insert(value); } From 3a9bf30d78ccb4b6d71ae7cf59d4a4b95e8b7ecc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Artur=20Micha=C5=82ek?= <52135326+cptartur@users.noreply.github.com> Date: Wed, 16 Oct 2024 15:45:01 +0200 Subject: [PATCH 22/26] Update crates/scarb-api/src/lib.rs Co-authored-by: Piotr Magiera <56825108+piotmag769@users.noreply.github.com> --- crates/scarb-api/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index c16f4514c..bdc56e01f 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -174,7 +174,7 @@ fn get_starknet_artifacts_paths_from_test_targets( } } -/// Try getting the path to `starknet_artifacts.json` file that is generated by `scarb build` command +/// Try getting the path to `starknet_artifacts.json` related to `starknet-contract` target. This file that is generated by `scarb build` command. /// If the file is not present, `None` is returned. fn get_starknet_artifacts_path( target_dir: &Utf8Path, From 52765b97b24b31f2a523e9f7b29d1bdc59549b7c Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 16:12:54 +0200 Subject: [PATCH 23/26] Run some tests only on scarb 2.8.3 --- crates/forge/tests/e2e/contract_artifacts.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crates/forge/tests/e2e/contract_artifacts.rs b/crates/forge/tests/e2e/contract_artifacts.rs index 6a86d8390..202eae78a 100644 --- a/crates/forge/tests/e2e/contract_artifacts.rs +++ b/crates/forge/tests/e2e/contract_artifacts.rs @@ -91,6 +91,7 @@ fn only_unit() { } #[test] +#[cfg_attr(not(feature = "scarb_2_8_3"), ignore)] fn only_lib_integration() { let temp = setup_package("targets/only_lib_integration"); let output = test_runner(&temp).assert().code(0); @@ -202,6 +203,7 @@ fn custom_target() { // We do not define `build-external-contracts = ["targets::*"]` for `integration` target // The test still passes because contracts are collected from `unit` target which includes // the contracts from package by the default +#[cfg_attr(not(feature = "scarb_2_8_3"), ignore)] fn custom_target_custom_names() { let temp = setup_package("targets/custom_target_custom_names"); let output = test_runner(&temp).assert().code(0); @@ -251,6 +253,7 @@ fn custom_target_only_integration() { #[test] // Case: We define custom test target for integration test type // We delete `build-external-contracts = ["targets::*"]` for `integration` so the test fails +#[cfg_attr(not(feature = "scarb_2_8_3"), ignore)] fn custom_target_only_integration_without_external() { let temp = setup_package("targets/custom_target_only_integration"); From 45827202443cedbc02fc962f0f2fefda0872c64e Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Wed, 16 Oct 2024 16:15:43 +0200 Subject: [PATCH 24/26] `scarb fmt` --- .../tests/data/targets/custom_target/src/lib.cairo | 2 +- .../data/targets/custom_target/tests/tests.cairo | 2 +- .../custom_target_custom_names/src/lib.cairo | 2 +- .../custom_target_custom_names/tests/tests.cairo | 2 +- .../custom_target_only_integration/src/lib.cairo | 2 +- .../tests/tests.cairo | 2 +- .../targets/only_integration/tests/tests.cairo | 2 +- .../targets/only_lib_integration/tests/lib.cairo | 2 +- .../targets/only_lib_integration/tests/tests.cairo | 2 +- .../tests/data/targets/only_unit/src/lib.cairo | 2 +- .../targets/unit_and_integration/src/lib.cairo | 2 +- .../targets/unit_and_integration/tests/tests.cairo | 2 +- .../targets/unit_and_lib_integration/src/lib.cairo | 2 +- .../unit_and_lib_integration/tests/lib.cairo | 2 +- .../unit_and_lib_integration/tests/tests.cairo | 2 +- .../tests/data/targets/with_features/src/lib.cairo | 14 +++++++------- .../data/targets/with_features/tests/tests.cairo | 2 +- 17 files changed, 23 insertions(+), 23 deletions(-) diff --git a/crates/forge/tests/data/targets/custom_target/src/lib.cairo b/crates/forge/tests/data/targets/custom_target/src/lib.cairo index f710a865a..821c3e7e3 100644 --- a/crates/forge/tests/data/targets/custom_target/src/lib.cairo +++ b/crates/forge/tests/data/targets/custom_target/src/lib.cairo @@ -52,4 +52,4 @@ mod tests { let _ = declare("HelloStarknet").unwrap().contract_class(); assert(2 == 2, 'Should declare'); } -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/custom_target/tests/tests.cairo b/crates/forge/tests/data/targets/custom_target/tests/tests.cairo index 79d8a2570..62beed8c1 100644 --- a/crates/forge/tests/data/targets/custom_target/tests/tests.cairo +++ b/crates/forge/tests/data/targets/custom_target/tests/tests.cairo @@ -25,4 +25,4 @@ fn declare_and_call_contract_from_lib() { let balance = dispatcher.get_balance(); assert(balance == 100, 'balance == 100'); -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo b/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo index f710a865a..821c3e7e3 100644 --- a/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo +++ b/crates/forge/tests/data/targets/custom_target_custom_names/src/lib.cairo @@ -52,4 +52,4 @@ mod tests { let _ = declare("HelloStarknet").unwrap().contract_class(); assert(2 == 2, 'Should declare'); } -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo b/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo index ea32dbd76..863d7789b 100644 --- a/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo +++ b/crates/forge/tests/data/targets/custom_target_custom_names/tests/tests.cairo @@ -25,4 +25,4 @@ fn declare_and_call_contract_from_lib() { let balance = dispatcher.get_balance(); assert(balance == 100, 'balance == 100'); -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/custom_target_only_integration/src/lib.cairo b/crates/forge/tests/data/targets/custom_target_only_integration/src/lib.cairo index f710a865a..821c3e7e3 100644 --- a/crates/forge/tests/data/targets/custom_target_only_integration/src/lib.cairo +++ b/crates/forge/tests/data/targets/custom_target_only_integration/src/lib.cairo @@ -52,4 +52,4 @@ mod tests { let _ = declare("HelloStarknet").unwrap().contract_class(); assert(2 == 2, 'Should declare'); } -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo b/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo index 6b3f5e257..aef3e766c 100644 --- a/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo +++ b/crates/forge/tests/data/targets/custom_target_only_integration/tests/tests.cairo @@ -25,4 +25,4 @@ fn declare_and_call_contract_from_lib() { let balance = dispatcher.get_balance(); assert(balance == 100, 'balance == 100'); -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/only_integration/tests/tests.cairo b/crates/forge/tests/data/targets/only_integration/tests/tests.cairo index e6be66367..d7a702f3f 100644 --- a/crates/forge/tests/data/targets/only_integration/tests/tests.cairo +++ b/crates/forge/tests/data/targets/only_integration/tests/tests.cairo @@ -25,4 +25,4 @@ fn declare_and_call_contract_from_lib() { let balance = dispatcher.get_balance(); assert(balance == 100, 'balance == 100'); -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/only_lib_integration/tests/lib.cairo b/crates/forge/tests/data/targets/only_lib_integration/tests/lib.cairo index b90ccf403..14f00389d 100644 --- a/crates/forge/tests/data/targets/only_lib_integration/tests/lib.cairo +++ b/crates/forge/tests/data/targets/only_lib_integration/tests/lib.cairo @@ -1 +1 @@ -mod tests; \ No newline at end of file +mod tests; diff --git a/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo b/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo index 759fb108f..2d9100bf8 100644 --- a/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo +++ b/crates/forge/tests/data/targets/only_lib_integration/tests/tests.cairo @@ -25,4 +25,4 @@ fn declare_and_call_contract_from_lib() { let balance = dispatcher.get_balance(); assert(balance == 100, 'balance == 100'); -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/only_unit/src/lib.cairo b/crates/forge/tests/data/targets/only_unit/src/lib.cairo index f710a865a..821c3e7e3 100644 --- a/crates/forge/tests/data/targets/only_unit/src/lib.cairo +++ b/crates/forge/tests/data/targets/only_unit/src/lib.cairo @@ -52,4 +52,4 @@ mod tests { let _ = declare("HelloStarknet").unwrap().contract_class(); assert(2 == 2, 'Should declare'); } -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/unit_and_integration/src/lib.cairo b/crates/forge/tests/data/targets/unit_and_integration/src/lib.cairo index f710a865a..821c3e7e3 100644 --- a/crates/forge/tests/data/targets/unit_and_integration/src/lib.cairo +++ b/crates/forge/tests/data/targets/unit_and_integration/src/lib.cairo @@ -52,4 +52,4 @@ mod tests { let _ = declare("HelloStarknet").unwrap().contract_class(); assert(2 == 2, 'Should declare'); } -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo b/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo index a3ac81514..529ec6c7d 100644 --- a/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo +++ b/crates/forge/tests/data/targets/unit_and_integration/tests/tests.cairo @@ -25,4 +25,4 @@ fn declare_and_call_contract_from_lib() { let balance = dispatcher.get_balance(); assert(balance == 100, 'balance == 100'); -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/unit_and_lib_integration/src/lib.cairo b/crates/forge/tests/data/targets/unit_and_lib_integration/src/lib.cairo index f710a865a..821c3e7e3 100644 --- a/crates/forge/tests/data/targets/unit_and_lib_integration/src/lib.cairo +++ b/crates/forge/tests/data/targets/unit_and_lib_integration/src/lib.cairo @@ -52,4 +52,4 @@ mod tests { let _ = declare("HelloStarknet").unwrap().contract_class(); assert(2 == 2, 'Should declare'); } -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/unit_and_lib_integration/tests/lib.cairo b/crates/forge/tests/data/targets/unit_and_lib_integration/tests/lib.cairo index b90ccf403..14f00389d 100644 --- a/crates/forge/tests/data/targets/unit_and_lib_integration/tests/lib.cairo +++ b/crates/forge/tests/data/targets/unit_and_lib_integration/tests/lib.cairo @@ -1 +1 @@ -mod tests; \ No newline at end of file +mod tests; diff --git a/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo b/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo index 213656801..b49dbde56 100644 --- a/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo +++ b/crates/forge/tests/data/targets/unit_and_lib_integration/tests/tests.cairo @@ -25,4 +25,4 @@ fn declare_and_call_contract_from_lib() { let balance = dispatcher.get_balance(); assert(balance == 100, 'balance == 100'); -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/with_features/src/lib.cairo b/crates/forge/tests/data/targets/with_features/src/lib.cairo index 27b29604c..e083feb5c 100644 --- a/crates/forge/tests/data/targets/with_features/src/lib.cairo +++ b/crates/forge/tests/data/targets/with_features/src/lib.cairo @@ -1,10 +1,10 @@ #[starknet::interface] - trait IHelloStarknet { - fn increase_balance(ref self: TContractState, amount: felt252); - fn get_balance(self: @TContractState) -> felt252; - fn do_a_panic(self: @TContractState); - fn do_a_panic_with(self: @TContractState, panic_data: Array); - } +trait IHelloStarknet { + fn increase_balance(ref self: TContractState, amount: felt252); + fn get_balance(self: @TContractState) -> felt252; + fn do_a_panic(self: @TContractState); + fn do_a_panic_with(self: @TContractState, panic_data: Array); +} #[cfg(feature: 'enable_for_tests')] mod dummy { @@ -55,4 +55,4 @@ mod tests { let _ = declare("HelloStarknet").unwrap().contract_class(); assert(2 == 2, 'Should declare'); } -} \ No newline at end of file +} diff --git a/crates/forge/tests/data/targets/with_features/tests/tests.cairo b/crates/forge/tests/data/targets/with_features/tests/tests.cairo index c0fc4cece..eccb7f9a8 100644 --- a/crates/forge/tests/data/targets/with_features/tests/tests.cairo +++ b/crates/forge/tests/data/targets/with_features/tests/tests.cairo @@ -25,4 +25,4 @@ fn declare_and_call_contract_from_lib() { let balance = dispatcher.get_balance(); assert(balance == 100, 'balance == 100'); -} \ No newline at end of file +} From a6c4f6e983cc84c941a57c9a543d3f8476165e5e Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Thu, 17 Oct 2024 17:55:18 +0200 Subject: [PATCH 25/26] Remove inline struct --- crates/scarb-api/src/lib.rs | 57 ++++++++++++++++--------------------- 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index bdc56e01f..f969115be 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -117,57 +117,50 @@ fn get_starknet_artifacts_paths_from_test_targets( target_dir: &Utf8Path, test_targets: &HashMap, ) -> Option { - #[derive(PartialEq, Debug, Clone)] - struct ContractArtifactData { - path: Utf8PathBuf, - test_type: Option, - } - - let artifact = |name: &str, metadata: &TargetMetadata| -> Option { - let path = format!("{name}.test.starknet_artifacts.json"); - let path = target_dir.join(&path); - let path = if path.exists() { - Some(path) - } else { - print_as_warning(&anyhow!( + let artifact = + |name: &str, metadata: &TargetMetadata| -> Option<(Utf8PathBuf, Option)> { + let path = format!("{name}.test.starknet_artifacts.json"); + let path = target_dir.join(&path); + let path = if path.exists() { + Some(path) + } else { + print_as_warning(&anyhow!( "File = {path} missing when it should be existing, perhaps due to Scarb problem." )); - None - }; + None + }; - let test_type = metadata - .params - .get("test-type") - .and_then(|value| value.as_str()) - .map(ToString::to_string); + let test_type = metadata + .params + .get("test-type") + .and_then(|value| value.as_str()) + .map(ToString::to_string); - path.map(|path| ContractArtifactData { - path: Utf8PathBuf::from_str(path.as_str()).unwrap(), - test_type, - }) - }; + path.map(|path| (Utf8PathBuf::from_str(path.as_str()).unwrap(), test_type)) + }; let artifacts = test_targets .iter() .filter_map(|(target_name, metadata)| artifact(target_name, metadata)) .collect::>(); - let base_artifact = artifacts + let base_artifact_path = artifacts .iter() - .find(|paths| paths.test_type == Some(INTEGRATION_TEST_TYPE.to_string())) + .find(|(_, test_type)| *test_type == Some(INTEGRATION_TEST_TYPE.to_string())) .cloned() .or_else(|| artifacts.first().cloned()); - if let Some(base_artifact) = base_artifact { - let other_artifacts = artifacts + if let Some(base_artifact) = base_artifact_path { + let other_artifacts_paths = artifacts .into_iter() .filter(|artifact| artifact != &base_artifact) - .map(|artifact| artifact.path) + .map(|(path, _)| path) .collect(); + let (base_artifact_path, _) = base_artifact; Some(StarknetArtifactsFiles { - base_file: base_artifact.path.clone(), - other_files: other_artifacts, + base_file: base_artifact_path, + other_files: other_artifacts_paths, }) } else { None From 816154df05af508db86378e2dd316b70a865a506 Mon Sep 17 00:00:00 2001 From: Artur Michalek Date: Thu, 17 Oct 2024 18:00:20 +0200 Subject: [PATCH 26/26] Use `as_deref` instead of `to_string` --- crates/scarb-api/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/scarb-api/src/lib.rs b/crates/scarb-api/src/lib.rs index f969115be..b8b3b7923 100644 --- a/crates/scarb-api/src/lib.rs +++ b/crates/scarb-api/src/lib.rs @@ -146,7 +146,7 @@ fn get_starknet_artifacts_paths_from_test_targets( let base_artifact_path = artifacts .iter() - .find(|(_, test_type)| *test_type == Some(INTEGRATION_TEST_TYPE.to_string())) + .find(|(_, test_type)| test_type.as_deref() == Some(INTEGRATION_TEST_TYPE)) .cloned() .or_else(|| artifacts.first().cloned());