From bbc6105452daf664fe2f63f7a34519ddb504cea2 Mon Sep 17 00:00:00 2001 From: davidemazzocchi Date: Tue, 11 Nov 2025 15:23:31 +0100 Subject: [PATCH] test: add tests to catalog.for_each, set FnMut requirement for predicate --- .../heave/src/imp/catalog_for_each.rs | 9 +++-- .../heave/src/imp/catalog_for_each_mut.rs | 4 +- .../heave/src/tst/catalog_for_each.rs | 40 +++++++++++++++++++ 01.workspace/heave/src/tst/mod.rs | 1 + 4 files changed, 48 insertions(+), 6 deletions(-) create mode 100644 01.workspace/heave/src/tst/catalog_for_each.rs diff --git a/01.workspace/heave/src/imp/catalog_for_each.rs b/01.workspace/heave/src/imp/catalog_for_each.rs index 61eea5e..298b790 100644 --- a/01.workspace/heave/src/imp/catalog_for_each.rs +++ b/01.workspace/heave/src/imp/catalog_for_each.rs @@ -1,16 +1,17 @@ use crate::*; impl Catalog { - pub fn for_each(&self, predicate: F) -> Result<(), FailedTo> + pub fn for_each(&self, mut predicate: F) -> Result<(), FailedTo> where T: EAV, - F: Fn(&T) -> (), + F: FnMut(&T), { self.with_items(|items| { - Ok(items + items .values() .flat_map(|entity| T::try_from(entity.clone()).map_err(|_| FailedTo::ConvertEntity)) - .for_each(|item| predicate(&item))) + .for_each(|item| predicate(&item)); + Ok(()) }) } } diff --git a/01.workspace/heave/src/imp/catalog_for_each_mut.rs b/01.workspace/heave/src/imp/catalog_for_each_mut.rs index e0eb48c..de4820d 100644 --- a/01.workspace/heave/src/imp/catalog_for_each_mut.rs +++ b/01.workspace/heave/src/imp/catalog_for_each_mut.rs @@ -1,10 +1,10 @@ use crate::*; impl Catalog { - pub fn for_each_mut(&self, predicate: F) -> Result<(), FailedTo> + pub fn for_each_mut(&self, mut predicate: F) -> Result<(), FailedTo> where T: EAV, - F: Fn(&mut T) -> (), + F: FnMut(&mut T), { self.on_items(|items| { for entity in items.values_mut() { diff --git a/01.workspace/heave/src/tst/catalog_for_each.rs b/01.workspace/heave/src/tst/catalog_for_each.rs new file mode 100644 index 0000000..568449d --- /dev/null +++ b/01.workspace/heave/src/tst/catalog_for_each.rs @@ -0,0 +1,40 @@ +#[cfg(test)] +mod tests { + use crate::*; + use std::collections::HashMap; + #[test] + fn for_each_should_iterate_over_all_items() { + let catalog = Catalog::new("test.db"); + let item1 = Item { + id: "1".to_string(), + name: "Item 1".to_string(), + price: 10, + ..Default::default() + }; + let item2 = Item { + id: "2".to_string(), + name: "Item 2".to_string(), + price: 20, + ..Default::default() + }; + let item3 = Item { + id: "3".to_string(), + name: "Item 3".to_string(), + price: 30, + ..Default::default() + }; + let _ = catalog.upsert(item1.clone()); + let _ = catalog.upsert(item2.clone()); + let _ = catalog.upsert(item3.clone()); + let mut collected_items = HashMap::new(); + catalog + .for_each::(|item| { + collected_items.insert(item.id.clone(), item.clone()); + }) + .unwrap(); + assert_eq!(collected_items.len(), 3); + assert_eq!(collected_items.get("1").unwrap(), &item1); + assert_eq!(collected_items.get("2").unwrap(), &item2); + assert_eq!(collected_items.get("3").unwrap(), &item3); + } +} diff --git a/01.workspace/heave/src/tst/mod.rs b/01.workspace/heave/src/tst/mod.rs index 8f2e324..3e3923a 100644 --- a/01.workspace/heave/src/tst/mod.rs +++ b/01.workspace/heave/src/tst/mod.rs @@ -1,4 +1,5 @@ pub mod catalog_delete; +pub mod catalog_for_each; pub mod catalog_get; pub mod catalog_get_by; pub mod catalog_init;