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();
tx1.send(2).unwrap();
future::ready(3)
})
.map(move |x| {
tx2.send(x).unwrap();
tx2.send(4).unwrap();
5
})
.map(move |x| {
tx3.send(x).unwrap();
});
assert!(rx.try_recv().is_err());
fut.run_in_background();
for i in 1..=5 {
assert_eq!(rx.recv(), Ok(i));
}
assert!(rx.recv().is_err());
}
#[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();
tx1.send(2).unwrap();
future::ready(Ok(3))
})
.or_else(move |x: i32| {
tx2.send(x).unwrap();
tx2.send(-1).unwrap();
future::ready(Ok(-1))
})
.map_ok(move |x: i32| {
tx3.send(x).unwrap();
tx3.send(4).unwrap();
5
})
.map_err(move |x: i32| {
tx4.send(x).unwrap();
tx4.send(-1).unwrap();
-1
})
.map(move |x: Result<i32, i32>| {
tx5.send(x.unwrap()).unwrap();
tx5.send(6).unwrap();
Err(7)
})
.and_then(move |x: i32| {
tx6.send(x).unwrap();
tx6.send(-1).unwrap();
future::ready(Err(-1))
})
.or_else(move |x: i32| {
tx7.send(x).unwrap();
tx7.send(8).unwrap();
future::ready(Err(9))
})
.map_ok(move |x: i32| {
tx8.send(x).unwrap();
tx8.send(-1).unwrap();
-1
})
.map_err(move |x: i32| {
tx9.send(x).unwrap();
tx9.send(10).unwrap();
11
})
.map(move |x: Result<i32, i32>| {
tx10.send(x.err().unwrap()).unwrap();
tx10.send(12).unwrap();
});
assert!(rx.try_recv().is_err());
fut.run_in_background();
for i in 1..=12 {
assert_eq!(rx.recv(), Ok(i));
}
assert!(rx.recv().is_err());
}