[wip] unit tests for file module

- finalize `Chunk` coverage
This commit is contained in:
Jörn-Michael Miehe 2025-07-10 02:48:11 +00:00
parent b2c032d846
commit 7bbb2bbc19

View file

@ -1,4 +1,4 @@
use std::fmt; use std::{any, fmt};
use crate::sharry; use crate::sharry;
@ -23,6 +23,22 @@ impl fmt::Debug for Chunk<'_> {
} }
} }
/// convert usize into other type
///
/// # Panics
///
/// - if the given value does not fit into the target type
fn from_usize_or_panic<I>(value: usize) -> I
where
I: TryFrom<usize>,
I::Error: std::error::Error,
{
value.try_into().unwrap_or_else(|e| {
let target_type = any::type_name::<I>();
panic!("usize={value:?} did not fit into {target_type:?}: {e}")
})
}
impl<'t> Chunk<'t> { impl<'t> Chunk<'t> {
pub(super) fn new_direct(file_id: sharry::FileID, offset: u64, data: &'t [u8]) -> Self { pub(super) fn new_direct(file_id: sharry::FileID, offset: u64, data: &'t [u8]) -> Self {
Self { Self {
@ -49,12 +65,10 @@ impl<'t> Chunk<'t> {
/// get the chunk's length /// get the chunk's length
pub fn get_length(&self) -> u64 { pub fn get_length(&self) -> u64 {
let len = self.data.len(); // BOOKMARK this might **panic** on (hypothetical) platforms where `usize` has more than 64 bit.
// BOOKMARK this might **panic** on platforms where `usize` has more than 64 bit.
// Also, you've allocated more than 2 EiB ... in ONE chunk. // Also, you've allocated more than 2 EiB ... in ONE chunk.
// Whoa! Maybe just chill? // Whoa! Maybe just chill?
u64::try_from(len).unwrap_or_else(|e| panic!("usize={len} did not fit into u64: {e}")) from_usize_or_panic(self.data.len())
} }
} }
@ -90,4 +104,17 @@ mod tests {
assert_eq!(chunk.get_length(), len); assert_eq!(chunk.get_length(), len);
} }
} }
#[test]
#[should_panic(expected = "did not fit into \"u32\"")]
fn test_usize_overflow_panics() {
// works
assert_eq!(from_usize_or_panic::<u64>(usize::MAX), u64::MAX);
assert_eq!(from_usize_or_panic::<u32>(u32::MAX as usize), u32::MAX);
assert_eq!(from_usize_or_panic::<u16>(u16::MAX as usize), u16::MAX);
assert_eq!(from_usize_or_panic::<u8>(u8::MAX as usize), u8::MAX);
// panics
from_usize_or_panic::<u32>(usize::MAX);
}
} }