use super::take_versions;
use crate::{InternalValue, ValueType};
fn version(seqno: u64, value_type: ValueType) -> InternalValue {
InternalValue::from_components(b"k" as &[u8], b"v" as &[u8], seqno, value_type)
}
#[test]
fn take_versions_stops_at_the_first_base() -> crate::Result<()> {
let mut entries = Vec::new();
let read = core::cell::Cell::new(0);
take_versions(
[
version(9, ValueType::MergeOperand),
version(8, ValueType::MergeOperand),
version(7, ValueType::Tombstone),
version(6, ValueType::Value),
]
.into_iter()
.inspect(|_| read.set(read.get() + 1))
.map(Ok),
4,
&mut entries,
)?;
let seqnos: Vec<u64> = entries.iter().map(|(_, e)| e.key.seqno).collect();
assert_eq!(seqnos, [9, 8, 7]);
assert!(
entries.iter().all(|&(rank, _)| rank == 4),
"each version keeps its source's rank"
);
assert_eq!(read.get(), 3, "the version below the base is not read");
Ok(())
}
#[test]
fn take_versions_takes_every_operand_without_a_base() -> crate::Result<()> {
let mut entries = Vec::new();
take_versions(
[
version(3, ValueType::MergeOperand),
version(2, ValueType::MergeOperand),
]
.into_iter()
.map(Ok),
0,
&mut entries,
)?;
assert_eq!(entries.len(), 2);
Ok(())
}
#[test]
fn take_versions_returns_the_error_of_a_failed_read() {
let mut entries = Vec::new();
let result = take_versions(
[
Ok(version(5, ValueType::MergeOperand)),
Err(crate::Error::Unrecoverable),
Ok(version(3, ValueType::Value)),
]
.into_iter(),
0,
&mut entries,
);
assert!(matches!(result, Err(crate::Error::Unrecoverable)));
assert_eq!(entries.len(), 1);
}