use crate::{
producer::Producer,
traits::{Consumer, Observer, Split},
HeapRb,
};
#[test]
fn basic() {
let (mut prod, mut cons) = HeapRb::<()>::new(2).split();
let obs = prod.observe();
assert_eq!(obs.capacity().get(), 2);
assert_eq!(obs.occupied_len(), 0);
assert_eq!(obs.vacant_len(), 2);
assert!(obs.is_empty());
assert!(cons.try_pop().is_none());
prod.try_push(()).unwrap();
assert_eq!(obs.occupied_len(), 1);
assert_eq!(obs.vacant_len(), 1);
prod.try_push(()).unwrap();
assert_eq!(obs.occupied_len(), 2);
assert_eq!(obs.vacant_len(), 0);
assert!(obs.is_full());
assert!(prod.try_push(()).is_err());
cons.try_pop().unwrap();
assert_eq!(obs.occupied_len(), 1);
assert_eq!(obs.vacant_len(), 1);
prod.try_push(()).unwrap();
assert_eq!(obs.occupied_len(), 2);
assert_eq!(obs.vacant_len(), 0);
assert!(obs.is_full());
cons.try_pop().unwrap();
assert_eq!(obs.occupied_len(), 1);
assert_eq!(obs.vacant_len(), 1);
cons.try_pop().unwrap();
assert_eq!(obs.occupied_len(), 0);
assert_eq!(obs.vacant_len(), 2);
assert!(obs.is_empty());
assert!(cons.try_pop().is_none());
}