use std::collections::{BTreeMap, BTreeSet}; use std::ops::Bound; use concread::bptree::BptreeMap; proptest::proptest! { #[test] fn bptree_range_iter_consistent(values: BTreeSet, left in 0..u8::MAX - 1, len in 1..u8::MAX, bounds: (Bound<()>, Bound<()>)) { let range = (bounds.0.map(|()| left), bounds.1.map(|()| left.saturating_add(len))); let btree_map = BTreeMap::from_iter(values.iter().cloned().map(|v| (v, ()))); let bptree_map = BptreeMap::from_iter(values.iter().cloned().map(|v| (v, ()))); let bptree_map_read_tx = bptree_map.read(); let btree_iter = btree_map.range(range); let bptree_iter = bptree_map_read_tx.range(range); assert!( btree_iter.eq(bptree_iter) ) } #[test] fn bptree_get_consistent(values: BTreeSet, key: u8) { let btree_map = BTreeMap::from_iter(values.iter().cloned().map(|v| (v, v))); let bptree_map = BptreeMap::from_iter(values.iter().cloned().map(|v| (v, v))); let bptree_map_read_tx = bptree_map.read(); let btree_value = btree_map.get(&key); let bptree_value = bptree_map_read_tx.get(&key); assert_eq!(btree_value, bptree_value); } #[test] fn bptree_remove_consistent(values in proptest::collection::btree_set(proptest::arbitrary::any::(), 1..256), indices: Vec ) { let mut btree_map = BTreeMap::from_iter(values.iter().cloned().map(|v| (v.to_string(), v.to_string()))); let bptree_map = BptreeMap::from_iter(values.iter().cloned().map(|v| (v.to_string(), v.to_string()))); let mut bptree_map_write_tx = bptree_map.write(); for index in indices { let index = index.index(values.len()); let key = values.iter().nth(index).unwrap().to_string(); assert_eq!( btree_map.remove(&key), bptree_map_write_tx.remove(&key) ); let btree_value = btree_map.get(&key); assert_eq!(btree_value, None); let bptree_value = bptree_map_write_tx.get(&key); assert_eq!(bptree_value, None); assert!( btree_map.iter().eq(bptree_map_write_tx.iter()) ); } } } #[test] fn bptree_remove_1() { let values = [ 4u8, 9, 12, 27, 34, 40, 59, 81, 89, 100, 142, 183, 189, 196, 218, 241, ]; let to_remove = [9u8, 27, 40, 4].map(|v| v.to_string()); let bptree_map = BptreeMap::from_iter( values .iter() .cloned() .map(|v| (v.to_string(), v.to_string())), ); let mut bptree_map_write_tx = bptree_map.write(); for key in to_remove { assert!(bptree_map_write_tx.remove(&key).is_some()); } }