diff --git a/src/lib.rs b/src/lib.rs index 9c1df62..c665c6c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -29,6 +29,10 @@ pub use error::Error; pub use jpeg::get_exif_attr as get_exif_attr_from_jpeg; +#[cfg(test)] +#[macro_use] +mod tmacro; + mod error; mod jpeg; mod util; diff --git a/src/tmacro.rs b/src/tmacro.rs new file mode 100644 index 0000000..2c8474f --- /dev/null +++ b/src/tmacro.rs @@ -0,0 +1,47 @@ +// +// Copyright (c) 2016 KAMADA Ken'ichi. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions +// are met: +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE +// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +// OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +// SUCH DAMAGE. +// + +// Macros for testing. + +macro_rules! assert_ok { + ($expr:expr, $value:expr) => ( + match $expr { + Ok(v) => assert_eq!(v, $value), + r => panic!("assertion failed: unexpected {:?}", r), + } + ) +} + +// This macro is intended to be used with std::io::Error, but other +// types with kind() will also work. +macro_rules! assert_err_kind { + ($expr:expr, $kind:expr) => ( + match $expr { + Err(e) => assert_eq!(e.kind(), $kind), + r => panic!("assertion failed: unexpected {:?}", r), + } + ) +} diff --git a/src/util.rs b/src/util.rs index 7aa7772..a73b67e 100644 --- a/src/util.rs +++ b/src/util.rs @@ -36,3 +36,39 @@ pub fn read16(reader: &mut R) -> Result where R: io::Read { try!(reader.read_exact(&mut buf)); Ok(((buf[0] as u16) << 8) + buf[1] as u16) } + +#[cfg(test)] +mod tests { + use std::io::Cursor; + use std::io::ErrorKind; + use std::io::Read; + use super::*; + + #[test] + fn read8_len() { + let mut reader = Cursor::new([]); + assert_err_kind!(read8(&mut reader), ErrorKind::UnexpectedEof); + let mut reader = Cursor::new([0x01]); + assert_ok!(read8(&mut reader), 0x01); + let mut reader = Cursor::new([0x01, 0x02]); + let mut buf = Vec::new(); + assert_ok!(read8(&mut reader), 0x01); + assert_ok!(reader.read_to_end(&mut buf), 1); + assert_eq!(buf, [0x02]); + } + + #[test] + fn read16_len() { + let mut reader = Cursor::new([]); + assert_err_kind!(read16(&mut reader), ErrorKind::UnexpectedEof); + let mut reader = Cursor::new([0x01]); + assert_err_kind!(read16(&mut reader), ErrorKind::UnexpectedEof); + let mut reader = Cursor::new([0x01, 0x02]); + assert_ok!(read16(&mut reader), 0x0102); + let mut reader = Cursor::new([0x01, 0x02, 0x03]); + let mut buf = Vec::new(); + assert_ok!(read16(&mut reader), 0x0102); + assert_ok!(reader.read_to_end(&mut buf), 1); + assert_eq!(buf, [0x03]); + } +}