use msgpack;
use msgpack::Value;
use std::io;
#[test]
fn read_bool() {
let mut reader = io::Cursor::new(&[0xc3, 0xc2]);
assert_eq!(msgpack::unpack_bool(&mut reader).unwrap(), true);
assert_eq!(msgpack::unpack_bool(&mut reader).unwrap(), false);
}
#[test]
fn read_nil() {
let mut reader = io::Cursor::new(&[0xc0]);
assert_eq!(
msgpack::unpack_nil(&mut reader).unwrap(),
None as Option<u8>
);
}
#[test]
fn unpack_u8() {
let mut reader = io::Cursor::new(&[
0xcc, 0x01, 0xcc, 0x7f, 0xcc, 0x80, 0xcc, 0xff, ]);
assert_eq!(msgpack::unpack_u8(&mut reader).unwrap(), 1);
assert_eq!(msgpack::unpack_u8(&mut reader).unwrap(), 127);
assert_eq!(msgpack::unpack_u8(&mut reader).unwrap(), 128);
assert_eq!(msgpack::unpack_u8(&mut reader).unwrap(), 255);
}
#[test]
fn unpack_u16() {
let mut reader = io::Cursor::new(&[
0xcd, 0x01, 0x00, 0xcd, 0xff, 0xff, ]);
assert_eq!(msgpack::unpack_u16(&mut reader).unwrap(), 256);
assert_eq!(msgpack::unpack_u16(&mut reader).unwrap(), 65535);
}
#[test]
fn unpack_u32() {
let mut reader = io::Cursor::new(&[
0xce, 0x00, 0x01, 0x00, 0x00, 0xce, 0xff, 0xff, 0xff, 0xff, ]);
assert_eq!(msgpack::unpack_u32(&mut reader).unwrap(), 65536);
assert_eq!(msgpack::unpack_u32(&mut reader).unwrap(), 4294967295);
}
#[test]
fn unpack_u64() {
let mut reader = io::Cursor::new(&[
0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ]);
assert_eq!(msgpack::unpack_u64(&mut reader).unwrap(), 4294967296);
assert_eq!(
msgpack::unpack_u64(&mut reader).unwrap(),
18446744073709551615
);
}
#[test]
fn unpack_i8() {
let mut reader = io::Cursor::new(&[
0xff, 0xe0, 0xd0, 0xdf, 0xd0, 0x80, ]);
assert_eq!(msgpack::unpack_i8(&mut reader).unwrap(), -1);
assert_eq!(msgpack::unpack_i8(&mut reader).unwrap(), -32);
assert_eq!(msgpack::unpack_i8(&mut reader).unwrap(), -33);
assert_eq!(msgpack::unpack_i8(&mut reader).unwrap(), -128);
}
#[test]
fn unpack_i16() {
let mut reader = io::Cursor::new(&[
0xd1, 0xff, 0x7f, 0xd1, 0x80, 0x00, ]);
assert_eq!(msgpack::unpack_i16(&mut reader).unwrap(), -129);
assert_eq!(msgpack::unpack_i16(&mut reader).unwrap(), -32768);
}
#[test]
fn unpack_i32() {
let mut reader = io::Cursor::new(&[
0xd2, 0xff, 0xff, 0x7f, 0xff, 0xd2, 0x80, 0x00, 0x00, 0x00, ]);
assert_eq!(msgpack::unpack_i32(&mut reader).unwrap(), -32769);
assert_eq!(msgpack::unpack_i32(&mut reader).unwrap(), -2147483648);
}
#[test]
fn unpack_i64() {
let mut reader = io::Cursor::new(&[
0xd3, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xd3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ]);
assert_eq!(msgpack::unpack_i64(&mut reader).unwrap(), -2147483649);
assert_eq!(
msgpack::unpack_i64(&mut reader).unwrap(),
-9223372036854775808
);
}
#[test]
fn unpack_bin() {
let mut reader = io::Cursor::new(&[0xc4, 0x03, 0x61, 0x61, 0x61]);
let len = msgpack::unpack_bin_header(&mut reader).unwrap();
assert_eq!(len, 3);
assert_eq!(
msgpack::unpack_bin_data(&mut reader, len).unwrap(),
&[0x61, 0x61, 0x61]
);
}
#[test]
fn unpack_str() {
let mut reader = io::Cursor::new(&[0xa5, 0x68, 0x65, 0x6c, 0x6c, 0x6f]);
assert_eq!(
msgpack::unpack_str(&mut reader).unwrap(),
"hello".to_string()
);
let mut reader = io::Cursor::new(&[0xd9, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f]);
assert_eq!(
msgpack::unpack_str(&mut reader).unwrap(),
"hello".to_string()
);
let mut reader = io::Cursor::new(&[0xda, 0x00, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f]);
assert_eq!(
msgpack::unpack_str(&mut reader).unwrap(),
"hello".to_string()
);
let mut reader = io::Cursor::new(&[0xdb, 0x00, 0x00, 0x00, 0x05, 0x68, 0x65, 0x6c, 0x6c, 0x6f]);
assert_eq!(
msgpack::unpack_str(&mut reader).unwrap(),
"hello".to_string()
);
}
#[test]
fn unpack_fixary() {
let mut reader = io::Cursor::new(&[0x92, 0x01, 0x02]);
assert_eq!(msgpack::unpack_ary_header(&mut reader).unwrap(), 2);
assert_eq!(msgpack::unpack_u8(&mut reader).unwrap(), 1);
assert_eq!(msgpack::unpack_u8(&mut reader).unwrap(), 2);
}
#[test]
fn unpack_fixmap() {
let mut reader = io::Cursor::new(&[0x81, 0x01, 0x02]);
assert_eq!(msgpack::unpack_map_header(&mut reader).unwrap(), 1);
assert_eq!(msgpack::unpack_u8(&mut reader).unwrap(), 1);
assert_eq!(msgpack::unpack_u8(&mut reader).unwrap(), 2);
}
#[test]
fn unpack_ext() {
let mut reader = io::Cursor::new(&[0xd4, 0x01, 0x02]);
assert_eq!(msgpack::unpack_ext_header(&mut reader).unwrap(), (1, 1));
assert_eq!(msgpack::unpack_u8(&mut reader).unwrap(), 2);
}
#[test]
fn unpack_fixext1() {
let mut reader = io::Cursor::new(&[0xd4, 0x01, 0x02]);
assert_eq!(msgpack::unpack_fixext1(&mut reader).unwrap(), (1, 2));
}
#[test]
fn unpack_fixext2() {
let mut reader = io::Cursor::new(&[0xd5, 0x02, 0x02, 0x02]);
assert_eq!(
msgpack::unpack_fixext2(&mut reader).unwrap(),
(2, [0x02, 0x02])
);
}
#[test]
fn unpack_fixext4() {
let mut reader = io::Cursor::new(&[0xd6, 0x04, 0x02, 0x02, 0x02, 0x02, 0x01]);
assert_eq!(
msgpack::unpack_fixext4(&mut reader).unwrap(),
(4, [0x02, 0x02, 0x02, 0x02])
);
assert_eq!(msgpack::unpack_u8(&mut reader).unwrap(), 0x01);
}
#[test]
fn unpack_value() {
let mut reader = io::Cursor::new([0xc3, 0xc2, 0xcc, 0x01, 0xc0, 0x92, 0x01, 0x02]);
assert_eq!(
msgpack::unpack_value(&mut reader).unwrap(),
Value::Boolean(true)
);
assert_eq!(
msgpack::unpack_value(&mut reader).unwrap(),
Value::Boolean(false)
);
assert_eq!(
msgpack::unpack_value(&mut reader).unwrap(),
Value::from(1 as u8)
);
assert_eq!(msgpack::unpack_value(&mut reader).unwrap(), Value::Nil);
assert_eq!(
msgpack::unpack_value(&mut reader).unwrap(),
Value::Array(vec![Value::from(1 as u8), Value::from(2 as u8)])
);
}
#[test]
fn unpack_invalid_str_value() {
let v: Vec<u8> = vec![
219, 0, 0, 0, 52, 146, 215, 0, 93, 24, 122, 26, 4, 114, 82, 40, 129, 167, 109, 101, 115,
115, 97, 103, 101, 165, 100, 117, 109, 109, 121, 146, 215, 0, 93, 24, 122, 27, 5, 181, 62,
32, 129, 167, 109, 101, 115, 115, 97, 103, 101, 165, 100, 117, 109, 109, 121,
];
let mut reader = io::Cursor::new(&v);
let mut writer = vec![];
let val = msgpack::unpack_value(&mut reader).unwrap();
if let Value::String(ref s) = &val {
assert!(s.is_err());
msgpack::pack_value(&mut writer, val).unwrap();
assert_eq!(writer[1..(writer.len())], v[4..(v.len())]);
} else {
panic!("must be string");
};
}