From a9b0bc54fb6942f563efb859c92a568698eaf738 Mon Sep 17 00:00:00 2001 From: glihm Date: Wed, 14 Aug 2024 15:44:48 -0400 Subject: [PATCH] fix(dojo-lang): add all crates to test database for Cairo test runner (#2296) * fix: ensure all the crates are inserted into the database but not all tested * chore: remote unused dep * chore: remove unused deps --- bin/sozo/src/commands/test.rs | 9 +++++---- crates/dojo-core/src/tests/base.cairo | 2 +- crates/dojo-core/src/tests/helpers.cairo | 2 +- crates/dojo-core/src/tests/world/resources.cairo | 6 +++--- crates/dojo-core/src/tests/world/world.cairo | 8 ++++---- crates/dojo-core/src/utils/test.cairo | 7 +++++-- examples/spawn-and-move/src/actions.cairo | 9 +++++++-- 7 files changed, 26 insertions(+), 17 deletions(-) diff --git a/bin/sozo/src/commands/test.rs b/bin/sozo/src/commands/test.rs index ef74c3be11..00a6c2beec 100644 --- a/bin/sozo/src/commands/test.rs +++ b/bin/sozo/src/commands/test.rs @@ -13,7 +13,7 @@ use dojo_lang::compiler::{collect_core_crate_ids, collect_external_crate_ids, Pr use dojo_lang::plugin::dojo_plugin_suite; use dojo_lang::scarb_internal::{cfg_set_from_component, crates_config_for_compilation_unit}; use dojo_world::metadata::dojo_metadata_from_package; -use scarb::compiler::helpers::collect_main_crate_ids; +use scarb::compiler::helpers::{collect_all_crate_ids, collect_main_crate_ids}; use scarb::compiler::{CairoCompilationUnit, CompilationUnit, CompilationUnitAttributes}; use scarb::core::{Config, Package, TargetKind}; use scarb::ops::{self, CompileOpts}; @@ -152,8 +152,8 @@ impl TestArgs { bail!("failed to compile"); } - let mut main_crate_ids = collect_main_crate_ids(&unit, &db); - let test_crate_ids = main_crate_ids.clone(); + let mut main_crate_ids = collect_all_crate_ids(&unit, &db); + let test_crate_ids = collect_main_crate_ids(&unit, &db); if unit.main_package_id.name.to_string() != "dojo" { let core_crate_ids = collect_core_crate_ids(&db); @@ -176,7 +176,8 @@ impl TestArgs { let compiler = TestCompiler { db: db.snapshot(), main_crate_ids, test_crate_ids, starknet: true }; - let runner = CompiledTestRunner { compiled: compiler.build()?, config }; + let compiled = compiler.build()?; + let runner = CompiledTestRunner { compiled, config }; // Database is required here for the profiler to work. runner.run(Some(&db))?; diff --git a/crates/dojo-core/src/tests/base.cairo b/crates/dojo-core/src/tests/base.cairo index 9e6683d94b..680691b4be 100644 --- a/crates/dojo-core/src/tests/base.cairo +++ b/crates/dojo-core/src/tests/base.cairo @@ -49,7 +49,7 @@ use contract_upgrade::{IQuantumLeapDispatcher, IQuantumLeapDispatcherTrait}; // Utils fn deploy_world() -> IWorldDispatcher { - spawn_test_world("dojo", array![]) + spawn_test_world(["dojo"].span(), [].span()) } // A test contract needs to be used instead of previously used base contract since. diff --git a/crates/dojo-core/src/tests/helpers.cairo b/crates/dojo-core/src/tests/helpers.cairo index ca932177c6..2554198245 100644 --- a/crates/dojo-core/src/tests/helpers.cairo +++ b/crates/dojo-core/src/tests/helpers.cairo @@ -172,7 +172,7 @@ pub mod bar { } pub fn deploy_world() -> IWorldDispatcher { - spawn_test_world("dojo", array![]) + spawn_test_world(["dojo"].span(), [].span()) } pub fn deploy_world_and_bar() -> (IWorldDispatcher, IbarDispatcher) { diff --git a/crates/dojo-core/src/tests/world/resources.cairo b/crates/dojo-core/src/tests/world/resources.cairo index 2ab90af96e..91f76cc455 100644 --- a/crates/dojo-core/src/tests/world/resources.cairo +++ b/crates/dojo-core/src/tests/world/resources.cairo @@ -29,7 +29,7 @@ fn test_set_metadata_world() { #[test] fn test_set_metadata_resource_owner() { - let world = spawn_test_world("dojo", array![foo::TEST_CLASS_HASH],); + let world = spawn_test_world(["dojo"].span(), [foo::TEST_CLASS_HASH].span(),); let bob = starknet::contract_address_const::<0xb0b>(); @@ -63,7 +63,7 @@ fn test_set_metadata_resource_owner() { ) )] fn test_set_metadata_not_possible_for_resource_writer() { - let world = spawn_test_world("dojo", array![foo::TEST_CLASS_HASH],); + let world = spawn_test_world(["dojo"].span(), [foo::TEST_CLASS_HASH].span(),); let bob = starknet::contract_address_const::<0xb0b>(); @@ -102,7 +102,7 @@ fn test_set_metadata_not_possible_for_random_account() { #[test] #[should_panic(expected: ("Caller `57005` is not an account", 'ENTRYPOINT_FAILED',))] fn test_set_metadata_through_malicious_contract() { - let world = spawn_test_world("dojo", array![foo::TEST_CLASS_HASH],); + let world = spawn_test_world(["dojo"].span(), [foo::TEST_CLASS_HASH].span(),); let bob = starknet::contract_address_const::<0xb0b>(); let malicious_contract = starknet::contract_address_const::<0xdead>(); diff --git a/crates/dojo-core/src/tests/world/world.cairo b/crates/dojo-core/src/tests/world/world.cairo index 7f3d2b1647..6dcc8f3a8a 100644 --- a/crates/dojo-core/src/tests/world/world.cairo +++ b/crates/dojo-core/src/tests/world/world.cairo @@ -146,13 +146,13 @@ fn test_emit() { // Utils fn deploy_world() -> IWorldDispatcher { - spawn_test_world("dojo", array![]) + spawn_test_world(["dojo"].span(), [].span()) } #[test] fn test_execute_multiple_worlds() { // Deploy world contract - let world1 = spawn_test_world("dojo", array![foo::TEST_CLASS_HASH],); + let world1 = spawn_test_world(["dojo"].span(), [foo::TEST_CLASS_HASH].span(),); let contract_address = deploy_with_world_address(bar::TEST_CLASS_HASH, world1); world1.grant_writer(Model::::selector(), contract_address); @@ -160,7 +160,7 @@ fn test_execute_multiple_worlds() { let bar1_contract = IbarDispatcher { contract_address }; // Deploy another world contract - let world2 = spawn_test_world("dojo", array![foo::TEST_CLASS_HASH],); + let world2 = spawn_test_world(["dojo"].span(), [foo::TEST_CLASS_HASH].span(),); let contract_address = deploy_with_world_address(bar::TEST_CLASS_HASH, world2); world2.grant_writer(Model::::selector(), contract_address); @@ -202,7 +202,7 @@ fn bench_execute() { #[test] fn bench_execute_complex() { - let world = spawn_test_world("dojo", array![character::TEST_CLASS_HASH],); + let world = spawn_test_world(["dojo"].span(), [character::TEST_CLASS_HASH].span(),); let contract_address = deploy_with_world_address(bar::TEST_CLASS_HASH, world); let bar_contract = IbarDispatcher { contract_address }; diff --git a/crates/dojo-core/src/utils/test.cairo b/crates/dojo-core/src/utils/test.cairo index db3975d89d..7dcdf0ba41 100644 --- a/crates/dojo-core/src/utils/test.cairo +++ b/crates/dojo-core/src/utils/test.cairo @@ -40,7 +40,7 @@ pub fn deploy_with_world_address(class_hash: felt252, world: IWorldDispatcher) - deploy_contract(class_hash, array![world.contract_address.into()].span()) } -pub fn spawn_test_world(namespace: ByteArray, models: Array) -> IWorldDispatcher { +pub fn spawn_test_world(namespaces: Span, models: Span) -> IWorldDispatcher { let salt = core::testing::get_available_gas(); // deploy world @@ -55,7 +55,10 @@ pub fn spawn_test_world(namespace: ByteArray, models: Array) -> IWorldD let world = IWorldDispatcher { contract_address: world_address }; // register namespace - world.register_namespace(namespace); + let mut namespaces = namespaces; + while let Option::Some(namespace) = namespaces.pop_front() { + world.register_namespace(namespace.clone()); + }; // register models let mut index = 0; diff --git a/examples/spawn-and-move/src/actions.cairo b/examples/spawn-and-move/src/actions.cairo index d28adc1cea..ec90359f39 100644 --- a/examples/spawn-and-move/src/actions.cairo +++ b/examples/spawn-and-move/src/actions.cairo @@ -192,6 +192,7 @@ mod tests { use dojo::utils::test::{spawn_test_world, deploy_contract}; use super::{actions, IActionsDispatcher, IActionsDispatcherTrait}; + use armory::flatbow; use dojo_examples::models::{Position, position, Moves, moves, Direction, Vec2}; #[test] @@ -200,9 +201,13 @@ mod tests { let caller = starknet::contract_address_const::<0x0>(); // models - let mut models = array![position::TEST_CLASS_HASH, moves::TEST_CLASS_HASH,]; + let mut models = array![ + position::TEST_CLASS_HASH, moves::TEST_CLASS_HASH, flatbow::TEST_CLASS_HASH + ]; // deploy world with models - let world = spawn_test_world("dojo_examples", models); + let world = spawn_test_world( + ["dojo_examples", "dojo_examples_weapons"].span(), models.span() + ); // deploy systems contract let contract_address = world