crates.io Documentation CI master

futures-test-sink

This crate provide a handy mock sink implementations that can be used test own Sink.

Examples

```rust use futurestestsink::fromiter; use asynctask::waker_fn; use futures::sink::Sink; use std::{ pin::Pin, task::{Poll, Context}, sync::{Arc, atomic} };

// create a Context let wakecnt = Arc::new(atomic::AtomicUsize::new(0)); let cnt = wakecnt.clone(); let waker = wakerfn(move || { wakecnt.fetchadd(1, atomic::Ordering::SeqCst); }); let mut cx = Context::fromwaker(&waker); // actual test let pollfallback = vec![ Poll::Ready(Ok(())), Poll::Ready(Ok(())), Poll::Pending, Poll::Ready(Err(12)), ] .intoiter(); let startsendfallback = vec![Ok::<_, u32>(())].intoiter().cycle(); // ours sink implementation let mut s = fromiter(pollfallback, startsend_fallback);

let r1 = Pin::new(&mut s).pollready(&mut cx); asserteq!(r1, Poll::Ready(Ok(()))); let s1 = Pin::new(&mut s).startsend(1); asserteq!(s1, Ok(()));

let r2 = Pin::new(&mut s).pollready(&mut cx); asserteq!(r2, Poll::Ready(Ok(()))); // start send don't panic because startsendfallback is cycle let s2 = Pin::new(&mut s).startsend(2); asserteq!(s2, Ok(()));

// ctx.wake() wasn't called. assert_eq!(0, cnt.load(atomic::Ordering::SeqCst));

let r3 = Pin::new(&mut s).pollready(&mut cx); asserteq!(r3, Poll::Pending); assert_eq!(1, cnt.load(atomic::Ordering::SeqCst));

let r4 = Pin::new(&mut s).pollready(&mut cx); asserteq!(r4, Poll::Ready(Err(12))); assert_eq!(1, cnt.load(atomic::Ordering::SeqCst)); ```

You can be interested in [FuseLast] container for Iterator. ```rust use futurestestsink::{fromiter, fuselast::IteratorExt}; use asynctask::wakerfn; use futures::sink::Sink; use std::{ pin::Pin, task::{Poll, Context}, sync::{Arc, atomic} };

// create a Context let wakecnt = Arc::new(atomic::AtomicUsize::new(0)); let cnt = wakecnt.clone(); let waker = wakerfn(move || { wakecnt.fetchadd(1, atomic::Ordering::SeqCst); }); let mut cx = Context::fromwaker(&waker); // actual test let pollfallback = vec![ Poll::Ready(Ok(())), Poll::Ready(Err(12)), Poll::Ready(Ok(())), ] .intoiter().fuselast(); let startsendfallback = vec![Ok::<_, u32>(())].intoiter().cycle(); // ours sink implementation let mut s = fromiter(pollfallback, startsendfallback);

let r1 = Pin::new(&mut s).pollready(&mut cx); asserteq!(r1, Poll::Ready(Ok(()))); let s1 = Pin::new(&mut s).startsend(1); asserteq!(s1, Ok(()));

let r2 = Pin::new(&mut s).pollready(&mut cx); asserteq!(r2, Poll::Ready(Err(12)));

let r3 = Pin::new(&mut s).pollready(&mut cx); asserteq!(r3, Poll::Ready(Ok(())));

// if not fuse_last this would panic! let r4 = Pin::new(&mut s).pollready(&mut cx); asserteq!(r3, Poll::Ready(Ok(())));

let r5 = Pin::new(&mut s).pollready(&mut cx); asserteq!(r3, Poll::Ready(Ok(()))); ```

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

This project try follow rules: * Keep a Changelog, * Semantic Versioning.

This README was generated with cargo-readme from template