use futures::future::{self, FutureExt, TryFutureExt}; use futures_test::future::FutureTestExt; use std::sync::mpsc; #[test] fn basic_future_combinators() { let (tx1, rx) = mpsc::channel(); let tx2 = tx1.clone(); let tx3 = tx1.clone(); let fut = future::ready(1) .then(move |x| { tx1.send(x).unwrap(); // Send 1 tx1.send(2).unwrap(); // Send 2 future::ready(3) }) .map(move |x| { tx2.send(x).unwrap(); // Send 3 tx2.send(4).unwrap(); // Send 4 5 }) .map(move |x| { tx3.send(x).unwrap(); // Send 5 }); assert!(rx.try_recv().is_err()); // Not started yet fut.run_in_background(); // Start it for i in 1..=5 { assert_eq!(rx.recv(), Ok(i)); } // Check it assert!(rx.recv().is_err()); // Should be done } #[test] fn basic_try_future_combinators() { let (tx1, rx) = mpsc::channel(); let tx2 = tx1.clone(); let tx3 = tx1.clone(); let tx4 = tx1.clone(); let tx5 = tx1.clone(); let tx6 = tx1.clone(); let tx7 = tx1.clone(); let tx8 = tx1.clone(); let tx9 = tx1.clone(); let tx10 = tx1.clone(); let fut = future::ready(Ok(1)) .and_then(move |x: i32| { tx1.send(x).unwrap(); // Send 1 tx1.send(2).unwrap(); // Send 2 future::ready(Ok(3)) }) .or_else(move |x: i32| { tx2.send(x).unwrap(); // Should not run tx2.send(-1).unwrap(); future::ready(Ok(-1)) }) .map_ok(move |x: i32| { tx3.send(x).unwrap(); // Send 3 tx3.send(4).unwrap(); // Send 4 5 }) .map_err(move |x: i32| { tx4.send(x).unwrap(); // Should not run tx4.send(-1).unwrap(); -1 }) .map(move |x: Result| { tx5.send(x.unwrap()).unwrap(); // Send 5 tx5.send(6).unwrap(); // Send 6 Err(7) // Now return errors! }) .and_then(move |x: i32| { tx6.send(x).unwrap(); // Should not run tx6.send(-1).unwrap(); future::ready(Err(-1)) }) .or_else(move |x: i32| { tx7.send(x).unwrap(); // Send 7 tx7.send(8).unwrap(); // Send 8 future::ready(Err(9)) }) .map_ok(move |x: i32| { tx8.send(x).unwrap(); // Should not run tx8.send(-1).unwrap(); -1 }) .map_err(move |x: i32| { tx9.send(x).unwrap(); // Send 9 tx9.send(10).unwrap(); // Send 10 11 }) .map(move |x: Result| { tx10.send(x.err().unwrap()).unwrap(); // Send 11 tx10.send(12).unwrap(); // Send 12 }); assert!(rx.try_recv().is_err()); // Not started yet fut.run_in_background(); // Start it for i in 1..=12 { assert_eq!(rx.recv(), Ok(i)); } // Check it assert!(rx.recv().is_err()); // Should be done }