use super::{Data, Empty, Inconsistent, Queue}; use crate::sync::mpsc::channel; use crate::sync::Arc; use crate::thread; #[test] fn test_full() { let q: Queue> = Queue::new(); q.push(Box::new(1)); q.push(Box::new(2)); } #[test] fn test() { let nthreads = 8; let nmsgs = 1000; let q = Queue::new(); match q.pop() { Empty => {} Inconsistent | Data(..) => panic!(), } let (tx, rx) = channel(); let q = Arc::new(q); for _ in 0..nthreads { let tx = tx.clone(); let q = q.clone(); thread::spawn(move || { for i in 0..nmsgs { q.push(i); } tx.send(()).unwrap(); }); } let mut i = 0; while i < nthreads * nmsgs { match q.pop() { Empty | Inconsistent => {} Data(_) => i += 1, } } drop(tx); for _ in 0..nthreads { rx.recv().unwrap(); } }