Expand testing

This commit is contained in:
A. Molzer committed 2026-03-31 14:01:39 +02:00
1 parent a2996ab34e
commit 8a1b65fe68
1 file changed
+49 -4
+49 -4
View File
@@ -66,7 +66,7 @@ impl<'lt, R> EntryBytesReader<'lt, R> {
IfdPointer(u64::from_ne_bytes(offset)) IfdPointer(u64::from_ne_bytes(offset))
} else { } else {
let mut offset = *offset[..4].as_array::<4>().unwrap(); let mut offset = *offset.first_chunk::<4>().unwrap();
inner inner
.reader .reader
@@ -95,7 +95,7 @@ impl<R: Read> Read for EntryBytesReader<'_, R> {
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> { fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
match &mut self.variant { match &mut self.variant {
Variant::Immediate { data, .. } => { Variant::Immediate { data, .. } => {
return data.read(buf); data.read(buf)
} }
Variant::InFile { remainder, .. } => { Variant::InFile { remainder, .. } => {
let bound = usize::try_from(*remainder).unwrap_or(usize::MAX); let bound = usize::try_from(*remainder).unwrap_or(usize::MAX);
@@ -113,7 +113,7 @@ impl<R: Read> Read for EntryBytesReader<'_, R> {
fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> { fn read_exact(&mut self, buf: &mut [u8]) -> io::Result<()> {
match &mut self.variant { match &mut self.variant {
Variant::Immediate { data, .. } => { Variant::Immediate { data, .. } => {
return data.read_exact(buf); data.read_exact(buf)
} }
Variant::InFile { remainder, .. } => { Variant::InFile { remainder, .. } => {
let bound = usize::try_from(*remainder).unwrap_or(usize::MAX); let bound = usize::try_from(*remainder).unwrap_or(usize::MAX);
@@ -197,7 +197,7 @@ impl<R: Read + Seek> Seek for EntryBytesReader<'_, R> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::{decoder::Decoder, tags::Tag}; use crate::{decoder::Decoder, encoder, tags::Tag};
use std::io::{Read as _, Seek as _, SeekFrom}; use std::io::{Read as _, Seek as _, SeekFrom};
#[test] #[test]
@@ -237,4 +237,49 @@ mod tests {
Ok(()) Ok(())
} }
#[test]
fn seek_from_end() -> Result<(), crate::error::TiffError> {
const ARTIST: &str = "99 little bugs in the code";
let data = {
let mut data = std::io::Cursor::new(vec![]);
let mut encoder = encoder::TiffEncoder::new(&mut data)?;
let mut dir = encoder.image_directory()?;
dir.write_tag(Tag::Artist, ARTIST)?;
dir.finish()?;
data.into_inner()
};
let file = std::io::Cursor::new(data);
let mut decoder = Decoder::open(file).unwrap();
decoder.next_directory().unwrap();
let artist = decoder
.current_ifd()
.find_entry(Tag::Artist)
.expect("some artist is present");
let mut reader = decoder.read_entry(artist)?;
let mut value = vec![];
reader.read_to_end(&mut value)?;
let (&nul, value) = value.split_last().unwrap();
assert_eq!(value, ARTIST.as_bytes());
assert_eq!(nul, b'\0');
assert_eq!(reader.seek(SeekFrom::End(0))?, ARTIST.len() as u64 + 1);
assert!(reader.seek(SeekFrom::End(1)).is_err());
reader.seek(SeekFrom::End(-5))?;
let mut is_code = [0u8; 4];
reader.read_exact(&mut is_code)?;
assert_eq!(is_code, *value.last_chunk::<4>().unwrap());
Ok(())
}
} }