You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
3.0 KiB
99 lines
3.0 KiB
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<i32, i32>| {
|
|
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<i32, i32>| {
|
|
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
|
|
}
|