temporenc 0.0.3

Library for the Temporenc time/date format.
Documentation
extern crate temporenc;

use temporenc::*;

use std::iter::once;
use std::io::Cursor;

#[test]
fn deser_d_all_missing() {
    let bytes: Vec<u8> = vec!(0x9F, 0xFF, 0xFF);
    let d = DateOnly::deserialize(&mut Cursor::new(bytes.as_slice())).unwrap();
    assert_eq!(None, d.year());
    assert_eq!(None, d.month());
    assert_eq!(None, d.day());

    let mut serialized = Vec::new();
    assert_eq!(d.serialized_size(), d.serialize(&mut serialized).unwrap());
    assert_eq!(d.serialized_size(), serialized.len());
    assert_eq!(bytes, serialized);
}

#[test]
fn deser_d_none_missing() {
    let bytes = vec!(0x8F, 0x7E, 0x0E);
    let d = DateOnly::deserialize(&mut Cursor::new(bytes.as_slice())).unwrap();
    assert_eq!(Some(1983), d.year());
    assert_eq!(Some(1), d.month());
    assert_eq!(Some(15), d.day());

    let mut serialized = Vec::new();
    assert_eq!(d.serialized_size(), d.serialize(&mut serialized).unwrap());
    assert_eq!(d.serialized_size(), serialized.len());
    assert_eq!(bytes, serialized);
}

#[test]
fn deser_d_wrong_tag() {
    let bytes = vec!(0xAF, 0xFF, 0xFF);
    assert_eq!(DeserializationError::IncorrectTypeTag,
               DateOnly::deserialize(&mut Cursor::new(bytes.as_slice())).unwrap_err());
}

#[test]
fn deser_d_too_short() {
    let bytes = vec!(0x8F, 0x7E);
    assert_eq!(DeserializationError::IoError,
               DateOnly::deserialize(&mut Cursor::new(bytes.as_slice())).unwrap_err());
}

#[test]
fn date_roundtrip_struct() {
    let mut vec = Vec::new();

    for year in once(None).chain((YEAR_MIN..(YEAR_MAX + 1)).map(|y| Some(y))) {
        for month in once(None).chain((MONTH_MIN..(MONTH_MAX + 1)).map(|m| Some(m))) {
            for day in once(None).chain((DAY_MIN..(DAY_MAX + 1)).map(|d| Some(d))) {
                vec.clear();
                let new_date = DateOnly::new(year, month, day).unwrap();
                let bytes_written = new_date.serialize(&mut vec).unwrap();
                assert_eq!(3, bytes_written);
                assert_eq!(bytes_written, vec.len());
                assert_eq!(new_date.serialized_size(), vec.len());
                let deser = DateOnly::deserialize(&mut Cursor::new(vec.as_slice())).unwrap();

                assert_eq!(year, deser.year());
                assert_eq!(month, deser.month());
                assert_eq!(day, deser.day());

                assert_eq!(new_date, deser);
            };
        };
    }
}