use msgpack;
use std::io;

#[test]
fn packer_unpacker() {
    let mut buf = vec![];
    let mut packer = msgpack::Packer::new(&mut buf);

    packer.pack_nil().unwrap();
    packer.pack_bool(false).unwrap();
    packer.pack_uint(1).unwrap();
    packer.pack_int(-1).unwrap();

    packer.pack_ary_header(2).unwrap();
    packer.pack_uint(1).unwrap();
    packer.pack_uint(2).unwrap();

    packer.pack_map_header(1).unwrap();
    packer.pack_uint(1).unwrap();
    packer.pack_str("s").unwrap();

    let mut reader = io::Cursor::new(buf);
    let mut unpacker = msgpack::Unpacker::from_reader(&mut reader);

    assert_eq!(unpacker.unpack_nil().unwrap(), None as Option<usize>);
    assert_eq!(unpacker.unpack_bool().unwrap(), false);
    assert_eq!(unpacker.unpack_u8().unwrap(), 1);
    assert_eq!(unpacker.unpack_i8().unwrap(), -1);

    let len = unpacker.unpack_ary_header().unwrap();
    assert_eq!(len, 2);
    assert_eq!(unpacker.unpack_u8().unwrap(), 1);
    assert_eq!(unpacker.unpack_u8().unwrap(), 2);

    let len = unpacker.unpack_map_header().unwrap();
    assert_eq!(len, 1);
    assert_eq!(unpacker.unpack_u8().unwrap(), 1);
    assert_eq!(unpacker.unpack_string().unwrap(), "s".to_owned());
}
