memory-pager 0.9.0

Access memory using small fixed size buffers
Documentation
use failure::Error;
use memory_pager::Pager;
use std::fs;

#[test]
fn can_create_default() {
  let pager = Pager::default();
  assert_eq!(pager.len(), 0);
}

#[test]
fn can_create_with_size() {
  let pager = Pager::new(1024);
  assert_eq!(pager.len(), 0);
}

#[test]
fn can_get() {
  let mut pager = Pager::default();
  {
    let page = pager.get_mut_or_alloc(0);
    assert_eq!(page.len(), 1024);
  }

  {
    let page = pager.get_mut_or_alloc(3);
    assert_eq!(page.len(), 1024);
  }
  assert_eq!(pager.len(), 4);
}

#[test]
fn can_alloc() {
  let mut pager = Pager::default();
  {
    let page = pager.get_mut_or_alloc(16);
    assert_eq!(page.len(), 1024);
  }

  {
    let page = pager.get_mut_or_alloc(32);
    assert_eq!(page.len(), 1024);
  }
}

#[test]
fn can_write() {
  let mut pager = Pager::default();
  let page = pager.get_mut_or_alloc(0);
  page[0] = 1;

  assert_eq!(1, page[0]);
  assert_eq!(0, page[1]);
}

#[test]
fn can_check_offset() {
  let mut pager = Pager::default();
  let page = pager.get_mut_or_alloc(1);

  assert_eq!(1024, page.offset());
}

#[test]
fn can_access_nodes() {
  let pager = &mut Pager::default();
  assert!(pager.get(0).is_none());
  pager.get_mut_or_alloc(0);
  assert!(pager.get(0).is_some());
}

#[test]
fn can_get_31() {
  let pager = &mut Pager::default();
  pager.get_mut_or_alloc(31);
  assert!(pager.get(31).is_some());
}

#[test]
fn set_122() {
  let pager = &mut Pager::default();
  pager.get_mut_or_alloc(122);
}

#[test]
fn can_iterate_over_pager() {
  let mut pager = Pager::default();
  pager.get_mut_or_alloc(0);
  pager.get_mut_or_alloc(2);

  for (i, page) in pager.iter().enumerate() {
    match i {
      0 => assert!(page.is_some(), "0 is some"),
      1 => assert!(page.is_none(), "1 is none"),
      2 => assert!(page.is_some(), "2 is some"),
      i => panic!("Index {} out of bounds", i),
    }
  }
}

#[test]
fn can_iterate_over_pages() {
  let mut pager = Pager::default();
  pager.get_mut_or_alloc(0);

  for page in pager.iter() {
    match page {
      None => panic!("Index 0 should contain a page"),
      Some(page) => {
        for num in page.iter() {
          assert_eq!(*num, 0);
        }
      }
    }
  }
}

#[test]
fn length() {
  let mut pager = Pager::new(1024);
  assert_eq!(pager.len(), 0);

  pager.get_mut_or_alloc(0);
  assert_eq!(pager.len(), 1);

  pager.get_mut_or_alloc(10);
  assert_eq!(pager.len(), 11);

  pager.get_mut_or_alloc(1536);
  assert_eq!(pager.len(), 1537);

  pager.get_mut_or_alloc(1537);
  assert_eq!(pager.len(), 1538);

  pager.get_mut_or_alloc(1536512);
  assert_eq!(pager.len(), 1536513);
}

#[test]
fn can_recreate_from_file() -> Result<(), Error> {
  let page_size = 10;

  let mut file = fs::File::open("./tests/fixtures/40_empty.bin")?;
  let pager = Pager::from_file(&mut file, page_size, None)?;
  for (index, page) in pager.iter().enumerate() {
    assert!(page.is_none(), "page {:?} failed, was {:?}", index, page);
  }

  let mut file = fs::File::open("./tests/fixtures/40_first_block.bin")?;
  let pager = Pager::from_file(&mut file, page_size, None)?;
  assert!(pager.get(0).is_some());
  assert!(pager.get(1).is_none());
  assert!(pager.get(3).is_none());
  assert!(pager.get(8).is_none());

  let mut file = fs::File::open("./tests/fixtures/40_last_block.bin")?;
  let pager = Pager::from_file(&mut file, page_size, None)?;
  assert!(pager.get(0).is_none());
  assert!(pager.get(1).is_none());
  assert!(pager.get(3).is_some());
  assert!(pager.get(8).is_none());

  let mut file = fs::File::open("./tests/fixtures/40_normal.txt")?;
  let pager = Pager::from_file(&mut file, page_size, None)?;
  assert!(pager.get(0).is_some());
  assert!(pager.get(1).is_some());
  assert!(pager.get(2).is_some());
  assert!(pager.get(3).is_some());

  Ok(())
}