orphanage 0.5.6

Random collection of stuff that is still searching for a home.
Documentation
use std::{ops::ControlFlow, path::PathBuf, sync::OnceLock};

use orphanage::{
  fs::{TestFileContents, make_test_file},
  iox::BlockReader
};

struct TestSetup {
  tmpdir: PathBuf
}

static SETUP: OnceLock<TestSetup> = OnceLock::new();

fn initialize_test_files() -> TestSetup {
  let tmpdir = env!("CARGO_TARGET_TMPDIR");
  let tmpdir = PathBuf::from(tmpdir);

  //let tfc = TestFileContents::Random;
  let tfc = TestFileContents::U8Count;

  let fname = tmpdir.join("8bytes.data");
  make_test_file(fname, &tfc, 8).unwrap();

  let fname = tmpdir.join("10bytes.data");
  make_test_file(fname, &tfc, 10).unwrap();

  let fname = tmpdir.join("12bytes.data");
  make_test_file(fname, &tfc, 12).unwrap();

  TestSetup { tmpdir }
}

fn setup() -> &'static TestSetup {
  SETUP.get_or_init(initialize_test_files)
}


#[test]
#[should_panic(expected = "block_size must be greater than zero")]
fn bad_blocksize() {
  let setup_data = setup();

  let fname = setup_data.tmpdir.join("8bytes.data");
  BlockReader::new(fname, 0);
}

#[test]
fn aligned() {
  let setup_data = setup();

  let mut idx = 0;
  let fname = setup_data.tmpdir.join("8bytes.data");
  BlockReader::new(fname, 4)
    .proc(|buf| {
      match idx {
        0 => assert_eq!(buf, [0, 1, 2, 3]),
        1 => assert_eq!(buf, [4, 5, 6, 7]),
        _ => {
          panic!("Unepxected block")
        }
      }
      idx += 1;

      ControlFlow::<std::io::Error>::Continue(())
    })
    .unwrap();
}

#[test]
fn unaligned() {
  let setup_data = setup();

  let mut idx = 0;
  let fname = setup_data.tmpdir.join("10bytes.data");
  BlockReader::new(fname, 4)
    .proc(|buf| {
      match idx {
        0 => assert_eq!(buf, [0, 1, 2, 3]),
        1 => assert_eq!(buf, [4, 5, 6, 7]),
        2 => assert_eq!(buf, [8, 9]),
        _ => {
          panic!("Unepxected block")
        }
      }
      idx += 1;

      ControlFlow::<std::io::Error>::Continue(())
    })
    .unwrap();
}


#[test]
fn thrd_aligned() {
  let setup_data = setup();

  let mut idx = 0;
  let fname = setup_data.tmpdir.join("8bytes.data");
  BlockReader::new(fname, 4)
    .proc_thrd(|buf| {
      match idx {
        0 => assert_eq!(buf, [0, 1, 2, 3]),
        1 => assert_eq!(buf, [4, 5, 6, 7]),
        _ => {
          panic!("Unepxected block")
        }
      }
      idx += 1;

      ControlFlow::<std::io::Error>::Continue(())
    })
    .unwrap();
}

#[test]
fn thrd_unaligned() {
  let setup_data = setup();

  let mut idx = 0;
  let fname = setup_data.tmpdir.join("10bytes.data");
  BlockReader::new(fname, 4)
    .proc_thrd(|buf| {
      match idx {
        0 => assert_eq!(buf, [0, 1, 2, 3]),
        1 => assert_eq!(buf, [4, 5, 6, 7]),
        2 => assert_eq!(buf, [8, 9]),
        _ => {
          panic!("Unepxected block")
        }
      }
      idx += 1;

      ControlFlow::<std::io::Error>::Continue(())
    })
    .unwrap();
}


#[test]
fn iter_aligned() {
  let setup_data = setup();

  let fname = setup_data.tmpdir.join("8bytes.data");
  let mut it = BlockReader::new(fname, 4).try_iter().unwrap();

  let Some(Ok(buf)) = it.next() else {
    panic!("Unexpectedly not Some(Ok())");
  };
  assert_eq!(buf, [0, 1, 2, 3]);

  let Some(Ok(buf)) = it.next() else {
    panic!("Unexpectedly not Some(Ok())");
  };
  assert_eq!(buf, [4, 5, 6, 7]);

  let None = it.next() else {
    panic!("Unexpectedly not None");
  };
}

#[test]
fn iter_unaligned() {
  let setup_data = setup();

  let fname = setup_data.tmpdir.join("10bytes.data");
  let mut it = BlockReader::new(fname, 4).try_iter().unwrap();

  let Some(Ok(buf)) = it.next() else {
    panic!("Unexpectedly not Some(Ok())");
  };
  assert_eq!(buf, [0, 1, 2, 3]);

  let Some(Ok(buf)) = it.next() else {
    panic!("Unexpectedly not Some(Ok())");
  };
  assert_eq!(buf, [4, 5, 6, 7]);

  let Some(Ok(buf)) = it.next() else {
    panic!("Unexpectedly not Some(Ok())");
  };
  assert_eq!(buf, [8, 9]);

  let None = it.next() else {
    panic!("Unexpectedly not None");
  };
}

// vim: set ft=rust et sw=2 ts=2 sts=2 cinoptions=2 tw=79 :