extern crate futures; use std::sync::mpsc::channel; use futures::prelude::*; use futures::sync::oneshot; use futures::future::{err, ok}; mod support; use support::*; #[test] fn map() { // Whatever runs after a `map` should have dropped the closure by that // point. let (tx, rx) = channel::<()>(); let (tx2, rx2) = channel(); err::(1).map(move |a| { drop(tx); a }).map_err(move |_| { assert!(rx.recv().is_err()); tx2.send(()).unwrap() }).forget(); rx2.recv().unwrap(); } #[test] fn map_err() { // Whatever runs after a `map_err` should have dropped the closure by that // point. let (tx, rx) = channel::<()>(); let (tx2, rx2) = channel(); ok::(1).map_err(move |a| { drop(tx); a }).map(move |_| { assert!(rx.recv().is_err()); tx2.send(()).unwrap() }).forget(); rx2.recv().unwrap(); } struct FutureData { _data: T, future: F, } impl Future for FutureData { type Item = F::Item; type Error = F::Error; fn poll(&mut self) -> Poll { self.future.poll() } } #[test] fn and_then_drops_eagerly() { let (c, p) = oneshot::channel::<()>(); let (tx, rx) = channel::<()>(); let (tx2, rx2) = channel(); FutureData { _data: tx, future: p }.and_then(move |_| { assert!(rx.recv().is_err()); tx2.send(()).unwrap(); ok(1) }).forget(); assert!(rx2.try_recv().is_err()); c.send(()).unwrap(); rx2.recv().unwrap(); } // #[test] // fn or_else_drops_eagerly() { // let (p1, c1) = oneshot::<(), ()>(); // let (p2, c2) = oneshot::<(), ()>(); // let (tx, rx) = channel::<()>(); // let (tx2, rx2) = channel(); // p1.map(move |a| { drop(tx); a }).or_else(move |_| { // assert!(rx.recv().is_err()); // p2 // }).map(move |_| tx2.send(()).unwrap()).forget(); // assert!(rx2.try_recv().is_err()); // c1.fail(()); // assert!(rx2.try_recv().is_err()); // c2.finish(()); // rx2.recv().unwrap(); // }