From 9a09b4da9656e6316c7515783c27e69677da665f Mon Sep 17 00:00:00 2001 From: 2ndbeam <2ndbeam@disroot.org> Date: Thu, 12 Mar 2026 11:45:01 +0300 Subject: [PATCH] feat: Implemented Inventory.can_rotate - Added tests for rotating items in place --- src/inventory/mod.rs | 21 ++++++++++++++++++++ src/tests.rs | 46 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/src/inventory/mod.rs b/src/inventory/mod.rs index 54a7b9a..c931720 100644 --- a/src/inventory/mod.rs +++ b/src/inventory/mod.rs @@ -59,6 +59,27 @@ impl Inventory { self.can_fit(item_query, children.as_slice(), *size, queried_position) } + pub fn can_rotate( + &self, + item_query: Query<&item::Item>, + contained_items: &[Entity], + queried_item: Entity, + ) -> bool { + let Ok(item) = item_query.get(queried_item) else { + error!("Could not query item"); + return false; + }; + let Some(position) = &item.position else { + warn!("Trying to query rotated item without position"); + return false; + }; + let children = contained_items.iter() + .filter_map(|e| if e.ne(&&queried_item) { Some(*e) } else { None }) + .collect::>(); + let rotated_item = item.clone_rotated(); + self.can_fit(item_query, children.as_slice(), rotated_item.size, *position) + } + fn find_free_space_inner( &self, item_query: Query<&item::Item>, diff --git a/src/tests.rs b/src/tests.rs index 7222408..5030b2f 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -125,6 +125,9 @@ mod inventory { #[derive(Component, Resource)] struct MovableItem(UVec2, bool); + #[derive(Component)] + struct RotatingMarker(bool); + fn insert_item( mut commands: Commands, mut items: ResMut, @@ -175,6 +178,20 @@ mod inventory { } } + fn rotate_in_place( + item_query: Query<&Item>, + rotated_item: Query<(Entity, &RotatingMarker)>, + inventory_query: Query<(&Inventory, &Children)>, + ) { + let (inventory, children) = inventory_query.single().unwrap(); + let (rotatable_id, RotatingMarker(assertion)) = rotated_item.single().unwrap(); + if *assertion { + assert!(inventory.can_rotate(item_query, children, rotatable_id)); + } else { + assert!(!inventory.can_rotate(item_query, children, rotatable_id)); + } + } + #[test] fn everything_fits() { let mut world = World::new(); @@ -300,4 +317,33 @@ mod inventory { world.run_system(system).expect("Error on running system"); } + + #[test] + fn rotate_item_in_place() { + let mut world = World::new(); + + let system = world.register_system(rotate_in_place); + + world.spawn(inventory()) + .with_child((item_a(), RotatingMarker(true))) + .with_child(item_b()) + .with_child(item_d()); + + world.run_system(system).expect("Error on running system"); + } + + #[test] + fn failed_rotate_item_in_place() { + let mut world = World::new(); + + let system = world.register_system(rotate_in_place); + + world.spawn(inventory()) + .with_child((item_a(), RotatingMarker(false))) + .with_child(item_b()) + .with_child(item_c()) + .with_child(item_d()); + + world.run_system(system).expect("Error on running system"); + } }