extern crate alternate_future; use std::thread; use std::cell::Cell; use alternate_future::{promise_future, spawn_future, Future}; #[test] fn present () { let f = Future::present(5); let i = f.await().unwrap(); assert_eq!(i, 5); } #[test] fn fulfill () { let (p, f) = promise_future(); thread::spawn(move|| { thread::sleep_ms(100); p.fulfill(5); }); let i : i32 = f.await().unwrap(); assert_eq!(i, 5); } #[test] fn broken () { let (p, f) = promise_future::(); thread::spawn(move|| { thread::sleep_ms(100); drop(p); }); assert!(f.await().is_err()); } #[test] fn early () { let (p, f) = promise_future(); thread::spawn(move|| { p.fulfill(5); }); thread::sleep_ms(100); let i : i32 = f.await().unwrap(); assert_eq!(i, 5); } thread_local!{ static KEY : Cell = Cell::new(0) } #[test] fn chain () { let (p, f) = promise_future(); thread::spawn(move|| { KEY.with(|k| k.set(1)); thread::sleep_ms(100); p.fulfill(5); }); let i : i32 = f.then(|i| { KEY.with(|k| assert_eq!(k.get(), 0)); i * 2 }).await().unwrap(); assert_eq!(i, 10); } #[test] fn spawn () { assert_eq!( spawn_future(|| { thread::sleep_ms(100); 12 }).await().unwrap(), 12 ); }