This crate provide a handy mock sink implementations that can be used test own Sink.
```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(()))); ```
Licensed under either of
at your option.
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