Expand testing
This commit is contained in:
1 parent
a2996ab34e
commit
8a1b65fe68
1 file changed
+49
-4
+49
-4
@@ -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(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user