//! Tests for iteration over receivers. use crossbeam_channel::unbounded; use crossbeam_utils::thread::scope; #[test] fn nested_recv_iter() { let (s, r) = unbounded::(); let (total_s, total_r) = unbounded::(); scope(|scope| { scope.spawn(move |_| { let mut acc = 0; for x in r.iter() { acc += x; } total_s.send(acc).unwrap(); }); s.send(3).unwrap(); s.send(1).unwrap(); s.send(2).unwrap(); drop(s); assert_eq!(total_r.recv().unwrap(), 6); }) .unwrap(); } #[test] fn recv_iter_break() { let (s, r) = unbounded::(); let (count_s, count_r) = unbounded(); scope(|scope| { scope.spawn(move |_| { let mut count = 0; for x in r.iter() { if count >= 3 { break; } else { count += x; } } count_s.send(count).unwrap(); }); s.send(2).unwrap(); s.send(2).unwrap(); s.send(2).unwrap(); let _ = s.send(2); drop(s); assert_eq!(count_r.recv().unwrap(), 4); }) .unwrap(); } #[test] fn recv_try_iter() { let (request_s, request_r) = unbounded(); let (response_s, response_r) = unbounded(); scope(|scope| { scope.spawn(move |_| { let mut count = 0; loop { for x in response_r.try_iter() { count += x; if count == 6 { return; } } request_s.send(()).unwrap(); } }); for _ in request_r.iter() { if response_s.send(2).is_err() { break; } } }) .unwrap(); } #[test] fn recv_into_iter_owned() { let mut iter = { let (s, r) = unbounded::(); s.send(1).unwrap(); s.send(2).unwrap(); r.into_iter() }; assert_eq!(iter.next().unwrap(), 1); assert_eq!(iter.next().unwrap(), 2); assert!(iter.next().is_none()); } #[test] fn recv_into_iter_borrowed() { let (s, r) = unbounded::(); s.send(1).unwrap(); s.send(2).unwrap(); drop(s); let mut iter = (&r).into_iter(); assert_eq!(iter.next().unwrap(), 1); assert_eq!(iter.next().unwrap(), 2); assert!(iter.next().is_none()); }