Crate waypoints[−][src]
Expand description
Summary
This is a helper crate for writing unit tests and debugging. It allows specifying a sequence at which points of execution may be passed in multi-threaded code. Execution will not pass a waypoint until its designated number is reached.
When writing unit tests (where brevity and simplicity wins over style) it can be helpful to
enforce an execution order on points in different threads to assess whether a particular
condition is handled appropriately. This crate is a way to do that. While waypoints
could
be used outside unit tests or debugging, there are likely more robust solutions.
The repository can be found on GitHub.
Example
The example below uses two threads to push numbers 0-5 onto a vector; waypoints
are set to
enforce the order in which the numbers are pushed.
use waypoints::Waypoints; use std::sync::{Arc, Mutex}; // A vector of observations let obs = Arc::new(Mutex::new(Vec::new())); // A thread-safe series of waypoints let w = Waypoints::new_arc(); let mut threads = Vec::new(); threads.push({ let obs = obs.clone(); let w = w.clone(); std::thread::spawn(move || { obs.lock().unwrap().push(0); obs.lock().unwrap().push(1); // the other thread may not proceed past waypoint 1 // until waypoint 0 is passed w.point(0, None).unwrap(); // this thread has to wait on waypoint 2 to be // passed in the other thread before proceeding w.point(3, None).unwrap(); obs.lock().unwrap().push(4); obs.lock().unwrap().push(5); }) }); threads.push({ let obs = obs.clone(); let w = w.clone(); std::thread::spawn(move || { w.point(1, None).unwrap(); obs.lock().unwrap().push(2); obs.lock().unwrap().push(3); w.point(2, None).unwrap(); }) }); threads.into_iter().for_each(|t| { t.join().ok(); }); let obs = Arc::try_unwrap(obs).unwrap().into_inner().unwrap(); println!("obs: {:?}", &obs); // obs: [0, 1, 2, 3, 4, 5] assert_eq!(obs, (0..6).into_iter().collect::<Vec<_>>());
Structs
Represents a series of waypoints.