nut 0.1.4

Bolt DB Port in Rust
Documentation
use super::{leaf_page_element::LeafPageElement, OwnedPage, Page, PageData};
use crate::consts::{Flags, PGID};

#[test]
fn new() {
    let mut buf = vec![0u8; 256];
    let page = Page::from_buf_mut(&mut buf);
    assert_eq!(page.overflow, 0);
    assert_eq!(page.count, 0);
    assert_eq!(page.id, 0);

    page.id = 25;
    assert_eq!(page.id, 25);

    page.flags = Flags::META;
    assert_eq!(page.flags, Flags::META);
}

#[test]
fn copy_data_from() {
    let mut page = OwnedPage::new(1024);
    page.flags = Flags::FREELIST;
    let ids: &[PGID] = &[23, 50];
    page.copy_data_from(PageData::Freelist(ids));

    assert_eq!(page.count, 2);
    match page.data() {
        PageData::Freelist(l) => {
            assert_eq!(&[23, 50], l);
        }
        _ => panic!("wrong page type"),
    }
}

#[test]
fn read_leaf_nodes() {
    let mut page = OwnedPage::new(4096);
    page.flags = Flags::LEAVES;
    page.count = 2;
    let nodes = unsafe {
        std::slice::from_raw_parts_mut(page.get_data_mut_ptr() as *mut LeafPageElement, 3)
    };
    nodes[0] = LeafPageElement {
        flags: 0,
        pos: 32,
        ksize: 3,
        vsize: 4,
    };
    nodes[1] = LeafPageElement {
        flags: 0,
        pos: 23,
        ksize: 10,
        vsize: 3,
    };

    let data = unsafe {
        std::slice::from_raw_parts_mut(&mut nodes[2] as *mut LeafPageElement as *mut u8, 4096)
    };
    data[..7].copy_from_slice("barfooz".as_bytes());
    data[7..7 + 13].copy_from_slice("helloworldbye".as_bytes());

    let el = page.leaf_page_element(0);
    assert_eq!(el.ksize, 3);
    assert_eq!(el.vsize, 4);
    assert_eq!(el.pos, 32);

    let el = page.leaf_page_element(1);
    assert_eq!(el.ksize, 10);
    assert_eq!(el.vsize, 3);
    assert_eq!(el.pos, 23);
}

#[test]
fn to_owned() {
    let mut buf = vec![0u8; 1024];
    let page = Page::from_buf_mut(&mut buf);
    page.flags = Flags::LEAVES;
    page.count = 2;
    let nodes = unsafe {
        std::slice::from_raw_parts_mut(page.get_data_mut_ptr() as *mut LeafPageElement, 3)
    };
    nodes[0] = LeafPageElement {
        flags: 0,
        pos: 32,
        ksize: 3,
        vsize: 4,
    };
    nodes[1] = LeafPageElement {
        flags: 0,
        pos: 23,
        ksize: 10,
        vsize: 3,
    };

    let data = unsafe {
        std::slice::from_raw_parts_mut(&mut nodes[2] as *mut LeafPageElement as *mut u8, 4096)
    };
    data[..7].copy_from_slice("barfooz".as_bytes());
    data[7..7 + 13].copy_from_slice("helloworldbye".as_bytes());

    let owned = page.to_owned();
    assert_eq!(
        owned.page.len(),
        Page::header_size() + LeafPageElement::SIZE + 23 + 10 + 3
    );
}