use super::Rb; use crate::{storage::Array, traits::*}; fn indices(this: impl Observer) -> (usize, usize) { (this.read_index(), this.write_index()) } #[test] fn capacity() { const CAP: usize = 13; let rb = Rb::>::default(); assert_eq!(rb.capacity().get(), CAP); } #[test] fn split_capacity() { const CAP: usize = 13; let mut rb = Rb::>::default(); let (prod, cons) = rb.split_ref(); assert_eq!(prod.capacity().get(), CAP); assert_eq!(cons.capacity().get(), CAP); } #[test] fn try_push() { let mut rb = Rb::>::default(); let (mut prod, _) = rb.split_ref(); assert_eq!(indices(prod.observe()), (0, 0)); assert_eq!(prod.try_push(123), Ok(())); assert_eq!(indices(prod.observe()), (0, 1)); assert_eq!(prod.try_push(234), Ok(())); assert_eq!(indices(prod.observe()), (0, 2)); assert_eq!(prod.try_push(345), Err(345)); assert_eq!(indices(prod.observe()), (0, 2)); } #[test] fn pop_empty() { let mut rb = Rb::>::default(); let (_, mut cons) = rb.split_ref(); assert_eq!(indices(cons.observe()), (0, 0)); assert_eq!(cons.try_pop(), None); assert_eq!(indices(cons.observe()), (0, 0)); } #[test] fn push_pop_one() { const CAP: usize = 2; let mut rb = Rb::>::default(); let (mut prod, mut cons) = rb.split_ref(); const MOD: usize = 2 * CAP; let values = [12, 34, 56, 78, 90]; assert_eq!(indices(cons.observe()), (0, 0)); for (i, v) in values.iter().enumerate() { assert_eq!(prod.try_push(*v), Ok(())); assert_eq!(indices(cons.observe()), (i % MOD, (i + 1) % MOD)); assert_eq!(cons.try_pop().unwrap(), *v); assert_eq!(indices(cons.observe()), ((i + 1) % MOD, (i + 1) % MOD)); assert_eq!(cons.try_pop(), None); assert_eq!(indices(cons.observe()), ((i + 1) % MOD, (i + 1) % MOD)); } } #[test] fn push_pop_all() { const CAP: usize = 2; let mut rb = Rb::>::default(); let (mut prod, mut cons) = rb.split_ref(); const MOD: usize = 2 * CAP; let values = [(12, 34, 13), (56, 78, 57), (90, 10, 91)]; assert_eq!(indices(cons.observe()), (0, 0)); for (i, v) in values.iter().enumerate() { assert_eq!(prod.try_push(v.0), Ok(())); assert_eq!(indices(cons.observe()), (CAP * i % MOD, (CAP * i + 1) % MOD)); assert_eq!(prod.try_push(v.1), Ok(())); assert_eq!(indices(cons.observe()), (CAP * i % MOD, (CAP * i + 2) % MOD)); assert_eq!(prod.try_push(v.2).unwrap_err(), v.2); assert_eq!(indices(cons.observe()), (CAP * i % MOD, (CAP * i + 2) % MOD)); assert_eq!(cons.try_pop().unwrap(), v.0); assert_eq!(indices(cons.observe()), ((CAP * i + 1) % MOD, (CAP * i + 2) % MOD)); assert_eq!(cons.try_pop().unwrap(), v.1); assert_eq!(indices(cons.observe()), ((CAP * i + 2) % MOD, (CAP * i + 2) % MOD)); assert_eq!(cons.try_pop(), None); assert_eq!(indices(cons.observe()), ((CAP * i + 2) % MOD, (CAP * i + 2) % MOD)); } } #[test] fn empty_full() { let mut rb = Rb::>::default(); let (mut prod, cons) = rb.split_ref(); assert!(prod.is_empty()); assert!(cons.is_empty()); assert!(!prod.is_full()); assert!(!cons.is_full()); assert_eq!(prod.try_push(123), Ok(())); assert!(!prod.is_empty()); assert!(!cons.is_empty()); assert!(prod.is_full()); assert!(cons.is_full()); } #[test] fn len_remaining() { let mut rb = Rb::>::default(); let (mut prod, mut cons) = rb.split_ref(); assert_eq!(prod.occupied_len(), 0); assert_eq!(cons.occupied_len(), 0); assert_eq!(prod.vacant_len(), 2); assert_eq!(cons.vacant_len(), 2); assert_eq!(prod.try_push(123), Ok(())); assert_eq!(prod.occupied_len(), 1); assert_eq!(cons.occupied_len(), 1); assert_eq!(prod.vacant_len(), 1); assert_eq!(cons.vacant_len(), 1); assert_eq!(prod.try_push(456), Ok(())); assert_eq!(prod.occupied_len(), 2); assert_eq!(cons.occupied_len(), 2); assert_eq!(prod.vacant_len(), 0); assert_eq!(cons.vacant_len(), 0); assert_eq!(cons.try_pop(), Some(123)); assert_eq!(prod.occupied_len(), 1); assert_eq!(cons.occupied_len(), 1); assert_eq!(prod.vacant_len(), 1); assert_eq!(cons.vacant_len(), 1); assert_eq!(cons.try_pop(), Some(456)); assert_eq!(prod.occupied_len(), 0); assert_eq!(cons.occupied_len(), 0); assert_eq!(prod.vacant_len(), 2); assert_eq!(cons.vacant_len(), 2); assert_eq!(prod.try_push(789), Ok(())); assert_eq!(prod.occupied_len(), 1); assert_eq!(cons.occupied_len(), 1); assert_eq!(prod.vacant_len(), 1); assert_eq!(cons.vacant_len(), 1); }