use std::cmp::Ordering;
use armdb::{Dir, PageSpec, StopReason, merge_sorted, page_chunks};
#[derive(Debug, Eq, PartialEq)]
struct Row {
key: u8,
payload: u8,
}
impl Ord for Row {
fn cmp(&self, other: &Self) -> Ordering {
self.key.cmp(&other.key)
}
}
impl PartialOrd for Row {
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
Some(self.cmp(other))
}
}
#[test]
fn crate_root_merge_is_stable_and_coalesces_equal_keys() {
let rows = merge_sorted(
Dir::Asc,
vec![
vec![Row { key: 1, payload: 1 }, Row { key: 3, payload: 3 }].into_iter(),
vec![Row { key: 1, payload: 2 }, Row { key: 2, payload: 2 }].into_iter(),
],
)
.coalesce_equal(|acc, next| acc.payload = acc.payload * 10 + next.payload)
.collect::<Vec<_>>();
assert_eq!(
rows,
vec![
Row {
key: 1,
payload: 12
},
Row { key: 2, payload: 2 },
Row { key: 3, payload: 3 },
],
);
}
#[test]
fn crate_root_page_chunks_returns_filled_page_and_cursor() {
let page = page_chunks(
1_u8..=4,
PageSpec {
limit: 2,
chunk: 3,
max_examined: None,
},
|row| *row,
|_| Ok(()),
|row, &()| Ok(Some(row)),
)
.expect("infallible test closures");
assert_eq!(page.items, vec![1, 2]);
assert_eq!(page.next, Some(2));
assert_eq!(page.stop, StopReason::Filled);
}