1 use futures::channel::oneshot;
2 use futures::future::{FutureExt, TryFutureExt};
3 use futures_test::future::FutureTestExt;
4 use std::sync::mpsc;
5 use std::thread;
6
7 #[test]
oneshot_send1()8 fn oneshot_send1() {
9 let (tx1, rx1) = oneshot::channel::<i32>();
10 let (tx2, rx2) = mpsc::channel();
11
12 let t = thread::spawn(|| tx1.send(1).unwrap());
13 rx1.map_ok(move |x| tx2.send(x)).run_in_background();
14 assert_eq!(1, rx2.recv().unwrap());
15 t.join().unwrap();
16 }
17
18 #[test]
oneshot_send2()19 fn oneshot_send2() {
20 let (tx1, rx1) = oneshot::channel::<i32>();
21 let (tx2, rx2) = mpsc::channel();
22
23 thread::spawn(|| tx1.send(1).unwrap()).join().unwrap();
24 rx1.map_ok(move |x| tx2.send(x).unwrap()).run_in_background();
25 assert_eq!(1, rx2.recv().unwrap());
26 }
27
28 #[test]
oneshot_send3()29 fn oneshot_send3() {
30 let (tx1, rx1) = oneshot::channel::<i32>();
31 let (tx2, rx2) = mpsc::channel();
32
33 rx1.map_ok(move |x| tx2.send(x).unwrap()).run_in_background();
34 thread::spawn(|| tx1.send(1).unwrap()).join().unwrap();
35 assert_eq!(1, rx2.recv().unwrap());
36 }
37
38 #[test]
oneshot_drop_tx1()39 fn oneshot_drop_tx1() {
40 let (tx1, rx1) = oneshot::channel::<i32>();
41 let (tx2, rx2) = mpsc::channel();
42
43 drop(tx1);
44 rx1.map(move |result| tx2.send(result).unwrap()).run_in_background();
45
46 assert_eq!(Err(oneshot::Canceled), rx2.recv().unwrap());
47 }
48
49 #[test]
oneshot_drop_tx2()50 fn oneshot_drop_tx2() {
51 let (tx1, rx1) = oneshot::channel::<i32>();
52 let (tx2, rx2) = mpsc::channel();
53
54 let t = thread::spawn(|| drop(tx1));
55 rx1.map(move |result| tx2.send(result).unwrap()).run_in_background();
56 t.join().unwrap();
57
58 assert_eq!(Err(oneshot::Canceled), rx2.recv().unwrap());
59 }
60
61 #[test]
oneshot_drop_rx()62 fn oneshot_drop_rx() {
63 let (tx, rx) = oneshot::channel::<i32>();
64 drop(rx);
65 assert_eq!(Err(2), tx.send(2));
66 }
67
68 #[test]
oneshot_debug()69 fn oneshot_debug() {
70 let (tx, rx) = oneshot::channel::<i32>();
71 assert_eq!(format!("{:?}", tx), "Sender { complete: false }");
72 assert_eq!(format!("{:?}", rx), "Receiver { complete: false }");
73 drop(rx);
74 assert_eq!(format!("{:?}", tx), "Sender { complete: true }");
75 let (tx, rx) = oneshot::channel::<i32>();
76 drop(tx);
77 assert_eq!(format!("{:?}", rx), "Receiver { complete: true }");
78 }
79