diff --git a/src/sync/crossbeam.rs b/src/sync/crossbeam.rs index 4e72624..cb8e6a9 100644 --- a/src/sync/crossbeam.rs +++ b/src/sync/crossbeam.rs @@ -132,6 +132,38 @@ mod tests { producer_handle.join().unwrap(); } + #[test] + fn test_mut_closure_value() { + let (sucker, sourcer) = CrossbeamSuck::::pair(); + + // Start producer + let producer_handle = std::thread::spawn(move || { + let mut count = 0; + sourcer + .set_mut(move || { + count += 1; + count + }) + .unwrap(); + sourcer.run().unwrap(); + }); + + // Ensure consumer gets incrementing values from the mutable closure + let value1 = sucker.get().unwrap(); + assert_eq!(value1, 1); + + let value2 = sucker.get().unwrap(); + assert_eq!(value2, 2); + + let value3 = sucker.get().unwrap(); + assert_eq!(value3, 3); + + // Close consumer + sucker.close().unwrap(); + + producer_handle.join().unwrap(); + } + #[test] fn test_no_source_error() { let (sucker, sourcer) = CrossbeamSuck::::pair(); diff --git a/src/sync/flume.rs b/src/sync/flume.rs index 78ec2a5..e201d91 100644 --- a/src/sync/flume.rs +++ b/src/sync/flume.rs @@ -133,6 +133,38 @@ mod tests { producer_handle.join().unwrap(); } + #[test] + fn test_mut_closure_value() { + let (sucker, sourcer) = FlumeSuck::::pair(); + + // Start producer + let producer_handle = std::thread::spawn(move || { + let mut count = 0; + sourcer + .set_mut(move || { + count += 1; + count + }) + .unwrap(); + sourcer.run().unwrap(); + }); + + // Ensure consumer gets incrementing values from the mutable closure + let value1 = sucker.get().unwrap(); + assert_eq!(value1, 1); + + let value2 = sucker.get().unwrap(); + assert_eq!(value2, 2); + + let value3 = sucker.get().unwrap(); + assert_eq!(value3, 3); + + // Close consumer + sucker.close().unwrap(); + + producer_handle.join().unwrap(); + } + #[test] fn test_no_source_error() { let (sucker, sourcer) = FlumeSuck::::pair(); diff --git a/src/sync/std.rs b/src/sync/std.rs index 8184a2b..8568b98 100644 --- a/src/sync/std.rs +++ b/src/sync/std.rs @@ -131,6 +131,38 @@ mod tests { producer_handle.join().unwrap(); } + #[test] + fn test_mut_closure_value() { + let (sucker, sourcer) = StdSuck::::pair(); + + // Start producer + let producer_handle = std::thread::spawn(move || { + let mut count = 0; + sourcer + .set_mut(move || { + count += 1; + count + }) + .unwrap(); + sourcer.run().unwrap(); + }); + + // Ensure consumer gets incrementing values from the mutable closure + let value1 = sucker.get().unwrap(); + assert_eq!(value1, 1); + + let value2 = sucker.get().unwrap(); + assert_eq!(value2, 2); + + let value3 = sucker.get().unwrap(); + assert_eq!(value3, 3); + + // Close consumer + sucker.close().unwrap(); + + producer_handle.join().unwrap(); + } + #[test] fn test_no_source_error() { let (sucker, sourcer) = StdSuck::::pair();