rabuf 0.3.0

randome access buffer for io
Documentation
#[macro_use]
mod helper;

#[cfg(test)]
mod test7 {
    use function_name::named;
    use rabuf::{BufFile, FileSetLen};
    use std::io::{Read, Seek, SeekFrom, Write};

    #[named]
    #[test]
    fn test_set_len_truncate_1() {
        let f = open_test_file!(function_name!());
        let mut bf = BufFile::new("test_set_len_truncate", f).unwrap();

        let initial_data = b"1234567890";
        bf.write_all(initial_data).unwrap();
        assert_eq!(bf.seek(SeekFrom::End(0)).unwrap(), 10);

        // Truncate the file
        bf.set_len(5).unwrap();
        assert_eq!(bf.seek(SeekFrom::End(0)).unwrap(), 5);

        // Check content
        bf.rewind().unwrap();
        let mut content = Vec::new();
        bf.read_to_end(&mut content).unwrap();
        assert_eq!(content, b"12345");
    }

    #[named]
    #[test]
    fn test_set_len_truncate_2() {
        let bw = b"ABCEDFG\nhijklmn\n";
        let f = open_test_file!(function_name!());
        let mut bf = BufFile::new("tes", f).unwrap();
        bf.write_all(bw).unwrap();

        // Truncate the file
        let new_len = 5;
        bf.set_len(new_len).unwrap();

        bf.rewind().unwrap();

        let mut br = Vec::new();
        bf.read_to_end(&mut br).unwrap();
        assert_eq!(br.len() as u64, new_len);
        assert_eq!(&br, &bw[..new_len as usize]);
    }

    #[named]
    #[test]
    fn test_set_len_extend_1() {
        let f = open_test_file!(function_name!());
        let mut bf = BufFile::new("test_set_len_extend", f).unwrap();

        let initial_data = b"12345";
        bf.write_all(initial_data).unwrap();
        assert_eq!(bf.seek(SeekFrom::End(0)).unwrap(), 5);

        // Extend the file
        bf.set_len(10).unwrap();
        assert_eq!(bf.seek(SeekFrom::End(0)).unwrap(), 10);

        // Check content
        bf.rewind().unwrap();
        let mut content = Vec::new();
        bf.read_to_end(&mut content).unwrap();
        let mut expected_content = initial_data.to_vec();
        expected_content.resize(10, 0);
        assert_eq!(content, expected_content);

        // Write to the extended part
        bf.seek(SeekFrom::Start(7)).unwrap();
        bf.write_all(b"abc").unwrap();

        bf.rewind().unwrap();
        let mut content = Vec::new();
        bf.read_to_end(&mut content).unwrap();
        assert_eq!(content, b"12345abc");
    }

    #[named]
    #[test]
    fn test_set_len_extend_2() {
        let f = open_test_file!(function_name!());
        let mut bf = BufFile::new("tes", f).unwrap();

        let initial_size = 10;
        let extended_size = 20;
        bf.write_all(&vec![1u8; initial_size]).unwrap();
        bf.set_len(extended_size).unwrap();

        bf.rewind().unwrap();

        let mut br = Vec::new();
        bf.read_to_end(&mut br).unwrap();

        let mut expected_data = vec![1u8; initial_size];
        expected_data.extend_from_slice(&vec![0u8; extended_size as usize - initial_size]);

        assert_eq!(br, expected_data);
    }

    #[named]
    #[test]
    fn test_set_len_smaller_and_write() {
        let f = open_test_file!(function_name!());
        let mut bf = BufFile::new("tes", f).unwrap();

        let initial_data = b"0123456789abcdef";
        bf.write_all(initial_data).unwrap();

        let new_len = 8;
        bf.set_len(new_len).unwrap();

        let new_data = b"ghij";
        bf.seek(std::io::SeekFrom::Start(new_len)).unwrap();
        bf.write_all(new_data).unwrap();

        bf.rewind().unwrap();

        let mut br = Vec::new();
        bf.read_to_end(&mut br).unwrap();

        let mut expected_data = initial_data[..new_len as usize].to_vec();
        expected_data.extend_from_slice(new_data);

        assert_eq!(br, expected_data);
    }
}