use std::cell::Cell; use std::iter; use std::pin::Pin; use std::rc::Rc; use std::sync::Arc; use std::task::Context;
use futures::channel::mpsc; use futures::executor::block_on; use futures::future::{self, Future}; use futures::lock::Mutex; use futures::sink::SinkExt; use futures::stream::{self, StreamExt}; use futures::task::Poll; use futures::{ready, FutureExt}; use futures_core::Stream; use futures_executor::ThreadPool; use futures_test::task::noop_context;
#[test] fn select() { fn select_and_compare(a: Vec<u32>, b: Vec<u32>, expected: Vec<u32>) { let a = stream::iter(a); let b = stream::iter(b); let vec = block_on(stream::select(a, b).collect::<Vec<_>>());
assert_eq!(vec, expected);
}
#[test] fn flatten_unordered() { use futures::executor::block_on; use futures::stream::*; use futures::task::*; use std::convert::identity; use std::pin::Pin; use std::sync::atomic::{AtomicBool, Ordering}; use std::thread; use std::time::Duration;
// nested `flatten_unordered` let te = ThreadPool::new().unwrap(); let base_handle = te
.spawn_with_handle(asyncmove { let fu = build_nested_fu(stream::iter(1..=10));
assert_eq!(fu.count().await, 10);
})
.unwrap();
block_on(base_handle);
let empty_state_move_handle = te
.spawn_with_handle(asyncmove { letmut fu = build_nested_fu(stream::iter(1..10));
{ letmut cx = noop_context(); let _ = fu.poll_next_unpin(&mut cx); let _ = fu.poll_next_unpin(&mut cx);
}
assert_eq!(fu.count().await, 9);
})
.unwrap();
block_on(empty_state_move_handle);
}
#[test] fn take_until() { fn make_stop_fut(stop_on: u32) -> impl Future<Output = ()> { letmut i = 0;
future::poll_fn(move |_cx| {
i += 1; if i <= stop_on {
Poll::Pending
} else {
Poll::Ready(())
}
})
}
block_on(async { // Verify stopping works: let stream = stream::iter(1u32..=10); let stop_fut = make_stop_fut(5);
let stream = stream.take_until(stop_fut); let last = stream.fold(0, |_, i| asyncmove { i }).await;
assert_eq!(last, 5);
// Verify take_future() works: let stream = stream::iter(1..=10); let stop_fut = make_stop_fut(5);
let last = stream.fold(0, |_, i| asyncmove { i }).await;
assert_eq!(last, 10);
// Verify take_future() returns None if stream is stopped: let stream = stream::iter(1u32..=10); let stop_fut = make_stop_fut(1); letmut stream = stream.take_until(stop_fut);
assert_eq!(stream.next().await, Some(1));
assert_eq!(stream.next().await, None);
assert!(stream.take_future().is_none());
// Verify TakeUntil is fused: letmut i = 0; let stream = stream::poll_fn(move |_cx| {
i += 1; match i { 1 => Poll::Ready(Some(1)), 2 => Poll::Ready(None),
_ => panic!("TakeUntil not fused"),
}
});
#[test] fn select_with_strategy_doesnt_terminate_early() { for side in [stream::PollNext::Left, stream::PollNext::Right] { let times_should_poll = 10; let count = Rc::new(Cell::new(0)); let b = stream::iter([10, 20]);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.