use super::*;
use fake::Fake;
use fake::faker::name::raw::*;
use fake::locales::*;
use tempfile::NamedTempFile;
#[test]
fn range() {
let mut table: DiskMap<u8, bool> = DiskMap::new(
None,
EvictionStrategy::MaximumItems(3),
DEFAULT_BLOCK_CACHE_CAPACITY,
BtreeConfig::default().fixed_key_size(1).fixed_value_size(2),
)
.unwrap();
table.insert(0, true).unwrap();
table.insert(1, true).unwrap();
table.insert(2, true).unwrap();
table.insert(3, true).unwrap();
table.insert(4, true).unwrap();
table.insert(5, true).unwrap();
let result: Result<Vec<(u8, bool)>> = table.range(0..6).collect();
assert_eq!(
vec![
(0, true),
(1, true),
(2, true),
(3, true),
(4, true),
(5, true)
],
result.unwrap()
);
let result: Result<Vec<(u8, bool)>> = table.range(3..5).collect();
assert_eq!(vec![(3, true), (4, true)], result.unwrap());
let result: Result<Vec<(u8, bool)>> = table.range(3..=5).collect();
assert_eq!(vec![(3, true), (4, true), (5, true)], result.unwrap());
let result: Result<Vec<(u8, bool)>> = table
.range((Bound::Excluded(0), Bound::Excluded(6)))
.collect();
assert_eq!(
vec![(1, true), (2, true), (3, true), (4, true), (5, true)],
result.unwrap()
);
let result: Result<Vec<(u8, bool)>> = table
.range((Bound::Excluded(4), Bound::Excluded(6)))
.collect();
assert_eq!(vec![(5, true)], result.unwrap());
let result: Result<Vec<(u8, bool)>> = table.range(3..).collect();
assert_eq!(vec![(3, true), (4, true), (5, true)], result.unwrap());
table.compact().unwrap();
let result: Result<Vec<(u8, bool)>> = table.range(0..6).collect();
assert_eq!(
vec![
(0, true),
(1, true),
(2, true),
(3, true),
(4, true),
(5, true)
],
result.unwrap()
);
let result: Result<Vec<(u8, bool)>> = table.range(3..5).collect();
assert_eq!(vec![(3, true), (4, true)], result.unwrap());
let result: Result<Vec<(u8, bool)>> = table.range(3..=5).collect();
assert_eq!(vec![(3, true), (4, true), (5, true)], result.unwrap());
let result: Result<Vec<(u8, bool)>> = table
.range((Bound::Excluded(0), Bound::Excluded(6)))
.collect();
assert_eq!(
vec![(1, true), (2, true), (3, true), (4, true), (5, true)],
result.unwrap()
);
let result: Result<Vec<(u8, bool)>> = table
.range((Bound::Excluded(4), Bound::Excluded(6)))
.collect();
assert_eq!(vec![(5, true)], result.unwrap());
let result: Result<Vec<(u8, bool)>> = table.range(3..).collect();
assert_eq!(vec![(3, true), (4, true), (5, true)], result.unwrap());
}
#[test]
fn single_table_iter() {
let mut table: DiskMap<u8, bool> = DiskMap::new(
None,
EvictionStrategy::MaximumItems(3),
DEFAULT_BLOCK_CACHE_CAPACITY,
BtreeConfig::default().fixed_key_size(1).fixed_value_size(2),
)
.unwrap();
table.insert(0, true).unwrap();
table.insert(1, true).unwrap();
table.insert(2, true).unwrap();
table.insert(3, true).unwrap();
table.insert(4, true).unwrap();
table.insert(5, true).unwrap();
let tmp_path = NamedTempFile::new().unwrap();
table.write_to(tmp_path.path()).unwrap();
let loaded_table: DiskMap<u8, bool> = DiskMap::new(
Some(tmp_path.path()),
EvictionStrategy::MaximumItems(5),
DEFAULT_BLOCK_CACHE_CAPACITY,
BtreeConfig::default().fixed_key_size(1).fixed_value_size(2),
)
.unwrap();
let items: Result<Vec<_>> = loaded_table.iter().unwrap().collect();
let items = items.unwrap();
assert_eq!(
vec![
(0, true),
(1, true),
(2, true),
(3, true),
(4, true),
(5, true)
],
items
);
}
#[test]
fn known_key() {
let test_key = "DsfbaAGn".to_string();
let mut table = DiskMap::new(
None,
EvictionStrategy::MaximumItems(5),
DEFAULT_BLOCK_CACHE_CAPACITY,
BtreeConfig::default(),
)
.unwrap();
table.insert(test_key.clone(), "Test".to_string()).unwrap();
for _ in 0..100 {
let last_name: String = LastName(EN).fake();
let first_name: String = FirstName(EN).fake();
if test_key != last_name {
table.insert(last_name, first_name).unwrap();
}
}
assert_eq!(
"Test",
table.get(&test_key).unwrap().unwrap_or_default().as_str()
);
assert_eq!(true, table.contains_key(&test_key).unwrap());
table.compact().unwrap();
assert_eq!(
"Test",
table.get(&test_key).unwrap().unwrap_or_default().as_str()
);
assert_eq!(true, table.contains_key(&test_key).unwrap());
}
#[test]
fn unknown_key() {
let test_key = "DsfbaAGn".to_string();
let mut table = DiskMap::new(
None,
EvictionStrategy::MaximumItems(5),
DEFAULT_BLOCK_CACHE_CAPACITY,
BtreeConfig::default(),
)
.unwrap();
for _ in 0..100 {
let last_name: String = LastName(EN).fake();
let first_name: String = FirstName(EN).fake();
if test_key != last_name {
table.insert(last_name, first_name).unwrap();
}
}
assert_eq!(None, table.get(&test_key).unwrap());
assert_eq!(
true,
table
.range(test_key.clone()..=test_key.clone())
.next()
.is_none()
);
assert_eq!(false, table.contains_key(&test_key).unwrap());
table.compact().unwrap();
assert_eq!(None, table.get(&test_key).unwrap());
assert_eq!(
true,
table
.range(test_key.clone()..=test_key.clone())
.next()
.is_none()
);
assert_eq!(false, table.contains_key(&test_key).unwrap());
}