use fastsend::ID; use fastsend::{Serial, Serialer, TimeSerialer}; use futures::future; use std::collections::HashSet; use std::error::Error; use std::result::Result as StdResult; type Result = StdResult>; const TOP: usize = 10999; macro_rules! into_hashset { (@it $iter:expr) => {{ IntoIterator::into_iter($iter).collect::>() }}; (@ok $iter:expr) => {{ IntoIterator::into_iter($iter) .collect::, _>>()? .into_iter() .collect::>() }}; } #[tokio::test] async fn test_unique_id() { let set = into_hashset!(@it future::join_all((0..TOP).map(|_| async { fastsend::next_token().await.id() })).await ); assert_eq!(set.len(), TOP); } #[tokio::test(flavor = "multi_thread", worker_threads = 10)] async fn test_unique_id_concurrently() -> Result<()> { let set = into_hashset!(@ok future::join_all( (0..TOP).map(|_| { tokio::spawn(async move { fastsend::next_token().await.id() }) }) ) .await ); assert_eq!(set.len(), TOP); Ok(()) } macro_rules! serial { ($expr:expr => $serialer:ty) => {{ let mut serialer = <$serialer>::default(); $expr.serial(&mut serialer); serialer.build().await }}; } #[tokio::test(flavor = "multi_thread", worker_threads = 10)] async fn test_unique_serial_concurrently() -> Result<()> { let set = into_hashset!(@ok future::join_all( (0..TOP).map(|_| { tokio::spawn(async move { serial!(fastsend::next_token().await => TimeSerialer) }) }) ) .await ); assert_eq!(set.len(), TOP); Ok(()) }