diff --git a/scarb/scarblib/cairo_test_asserts/Scarb.toml b/scarb/scarblib/cairo_test_asserts/Scarb.toml new file mode 100644 index 000000000..769d0e08c --- /dev/null +++ b/scarb/scarblib/cairo_test_asserts/Scarb.toml @@ -0,0 +1,8 @@ +[package] +name = "assert_macros" +version = "0.1.0" + +no-core = true + +[cairo-plugin] +builtin = true diff --git a/scarb/src/compiler/plugin/builtin.rs b/scarb/src/compiler/plugin/builtin.rs index 9963d8264..e6a74c0fc 100644 --- a/scarb/src/compiler/plugin/builtin.rs +++ b/scarb/src/compiler/plugin/builtin.rs @@ -4,7 +4,7 @@ use cairo_lang_semantic::plugin::PluginSuite; use cairo_lang_starknet::starknet_plugin_suite; use cairo_lang_syntax::node::ast::ModuleItem; use cairo_lang_syntax::node::db::SyntaxGroup; -use cairo_lang_test_plugin::test_plugin_suite; +use cairo_lang_test_plugin::{test_assert_suite, test_plugin_suite}; use crate::compiler::plugin::{CairoPlugin, CairoPluginInstance}; use crate::core::{PackageId, PackageName, SourceId}; @@ -105,3 +105,27 @@ impl MacroPlugin for CairoRunPlugin { self.declared_attributes() } } + +pub struct BuiltinTestAssertsPlugin; + +impl CairoPlugin for BuiltinTestAssertsPlugin { + fn id(&self) -> PackageId { + PackageId::new( + PackageName::TEST_ASSERTS_PLUGIN, + semver::Version::new(0, 1, 0), + SourceId::for_std(), + ) + } + + fn instantiate(&self) -> Result> { + Ok(Box::new(BuiltinTestAssertsPluginInstance)) + } +} + +struct BuiltinTestAssertsPluginInstance; + +impl CairoPluginInstance for BuiltinTestAssertsPluginInstance { + fn plugin_suite(&self) -> PluginSuite { + test_assert_suite() + } +} diff --git a/scarb/src/compiler/plugin/mod.rs b/scarb/src/compiler/plugin/mod.rs index 6aa9d7137..54c0681c6 100644 --- a/scarb/src/compiler/plugin/mod.rs +++ b/scarb/src/compiler/plugin/mod.rs @@ -2,6 +2,7 @@ use std::collections::hash_map::Entry; use std::collections::HashMap; use std::fmt; +use crate::compiler::plugin::builtin::BuiltinTestAssertsPlugin; use anyhow::{anyhow, bail, Result}; use cairo_lang_semantic::plugin::PluginSuite; use itertools::Itertools; @@ -64,6 +65,7 @@ impl CairoPluginRepository { repo.add(Box::new(BuiltinStarkNetPlugin)).unwrap(); repo.add(Box::new(BuiltinTestPlugin)).unwrap(); repo.add(Box::new(BuiltinCairoRunPlugin)).unwrap(); + repo.add(Box::new(BuiltinTestAssertsPlugin)).unwrap(); repo } diff --git a/scarb/src/core/package/name.rs b/scarb/src/core/package/name.rs index 8e6a90c9d..c84ae2c83 100644 --- a/scarb/src/core/package/name.rs +++ b/scarb/src/core/package/name.rs @@ -8,11 +8,14 @@ use serde::{Deserialize, Serialize}; use smol_str::SmolStr; use crate::internal::restricted_names; -use crate::{CAIRO_RUN_PLUGIN_NAME, STARKNET_PLUGIN_NAME, TEST_PLUGIN_NAME}; #[cfg(doc)] use crate::core::Package; +use crate::{ + CAIRO_RUN_PLUGIN_NAME, STARKNET_PLUGIN_NAME, TEST_ASSERTS_PLUGIN_NAME, TEST_PLUGIN_NAME, +}; + /// A [`String`]-like type representing [`Package`] name. /// /// * Instances of this type are validated upon construction to comply with the @@ -32,6 +35,8 @@ impl PackageName { pub const STARKNET: Self = PackageName(SmolStr::new_inline(STARKNET_PLUGIN_NAME)); pub const TEST_PLUGIN: Self = PackageName(SmolStr::new_inline(TEST_PLUGIN_NAME)); pub const CAIRO_RUN_PLUGIN: Self = PackageName(SmolStr::new_inline(CAIRO_RUN_PLUGIN_NAME)); + pub const TEST_ASSERTS_PLUGIN: Self = + PackageName(SmolStr::new_inline(TEST_ASSERTS_PLUGIN_NAME)); /// Constructs and validates new [`PackageName`]. /// diff --git a/scarb/src/lib.rs b/scarb/src/lib.rs index 7dc61eed6..47225fcbd 100644 --- a/scarb/src/lib.rs +++ b/scarb/src/lib.rs @@ -38,4 +38,5 @@ pub const DEFAULT_README_FILE_NAME: &str = "README.md"; pub const DEFAULT_LICENSE_FILE_NAME: &str = "LICENSE"; pub const STARKNET_PLUGIN_NAME: &str = "starknet"; pub const TEST_PLUGIN_NAME: &str = "cairo_test"; +pub const TEST_ASSERTS_PLUGIN_NAME: &str = "assert_macros"; pub const CAIRO_RUN_PLUGIN_NAME: &str = "cairo_run"; diff --git a/scarb/src/ops/resolve.rs b/scarb/src/ops/resolve.rs index 8dfeaedf5..2edfc044f 100644 --- a/scarb/src/ops/resolve.rs +++ b/scarb/src/ops/resolve.rs @@ -99,6 +99,12 @@ pub fn resolve_workspace_with_opts( .version_req(version_req.clone()) .source_id(SourceId::for_std()) .build(), + ManifestDependency::builder() + .kind(DepKind::Target(TargetKind::TEST)) + .name(PackageName::TEST_ASSERTS_PLUGIN) + .version_req(DependencyVersionReq::exact(&semver::Version::new(0, 1, 0))) + .source_id(SourceId::for_std()) + .build(), ], ); if let Some(custom_source_patches) = ws.config().custom_source_patches() {