use std::convert::Infallible;
use std::sync::Arc;
use fastpool::ManageObject;
use fastpool::ObjectStatus;
use fastpool::bounded::Pool;
use fastpool::bounded::PoolConfig;
#[tokio::test]
async fn test_replenish() {
#[derive(Default)]
struct Manager;
impl ManageObject for Manager {
type Object = ();
type Error = Infallible;
async fn create(&self) -> Result<Self::Object, Self::Error> {
Ok(())
}
async fn is_recyclable(
&self,
_o: &mut Self::Object,
_status: &ObjectStatus,
) -> Result<(), Self::Error> {
Ok(())
}
}
const MAX_SIZE: usize = 2;
fn make_default() -> Arc<Pool<Manager>> {
Pool::new(PoolConfig::new(MAX_SIZE), Manager)
}
for i in 0..5 {
let pool = make_default();
let n = pool.replenish(i).await;
assert_eq!(n, i.min(MAX_SIZE));
}
{
let pool = make_default();
pool.get().await.unwrap();
let n = pool.replenish(2).await;
assert_eq!(n, 1);
}
{
let pool = make_default();
let o1 = pool.get().await.unwrap();
let o2 = pool.get().await.unwrap();
drop((o1, o2));
let n = pool.replenish(2).await;
assert_eq!(n, 0);
}
}