#[cfg(test)]
extern crate bytes;
extern crate rand;
extern crate tars_stream;
extern crate uuid;
use bytes::Bytes;
use rand::random;
use std::collections::BTreeMap;
use tars_stream::prelude::*;
use uuid::Uuid;
#[derive(Clone, Debug, PartialEq)]
struct TestStruct {
a: i8, b: u16, v1: Vec<u8>, c: Option<String>, v2: Vec<i8>,
v3: Vec<bool>,
}
impl TestStruct {
pub fn new() -> Self {
TestStruct {
a: 0,
b: 0,
v1: vec![],
c: None,
v2: vec![],
v3: vec![],
}
}
pub fn random_for_test() -> Self {
let vec_len: u8 = random();
let mut v1 = vec![];
for _ in 0..vec_len {
v1.push(random());
}
let vec_len: u8 = random();
let mut v2 = vec![];
for _ in 0..vec_len {
v2.push(random());
}
let vec_len: u8 = random();
let mut v3 = vec![];
for _ in 0..vec_len {
v3.push(random());
}
TestStruct {
a: random(),
b: random(),
v1: v1,
c: Some(Uuid::new_v4().to_string()),
v2: v2,
v3: v3,
}
}
}
impl DecodeFromTars for TestStruct {
fn decode_from(b: &Bytes) -> Result<Self, DecodeErr> {
let mut de = TarsDecoder::new(&b);
let a = de.get(0)?;
let b = de.get(1)?;
let v1 = de.get(2)?;
let c = de.get(3)?;
let v2 = de.get(4)?;
let v3 = de.get(5)?;
Ok(TestStruct {
a,
b,
v1,
c,
v2,
v3,
})
}
}
impl EncodeIntoTars for TestStruct {
fn encode_into(&self, encoder: &mut TarsEncoder) -> Result<(), EncodeErr> {
encoder.put(0, &self.a)?;
encoder.put(1, &self.b)?;
encoder.put(2, &self.v1)?;
encoder.put(3, &self.c)?;
encoder.put(4, &self.v2)?;
encoder.put(5, &self.v3)?;
Ok(())
}
}
unsafe impl Sync for TestStruct {}
unsafe impl Send for TestStruct {}
#[test]
fn test_encode_decode_struct() {
let mut encoder = TarsEncoder::new();
let ts = TestStruct::new();
ts.encode_into(&mut encoder).unwrap();
let de_ts = TestStruct::decode_from(&encoder.to_bytes()).unwrap();
assert_eq!(de_ts, ts);
let mut encoder = TarsEncoder::new();
let ts = TestStruct::random_for_test();
ts.encode_into(&mut encoder).unwrap();
let de_ts = TestStruct::decode_from(&encoder.to_bytes()).unwrap();
assert_eq!(de_ts, ts);
}
#[derive(Clone, Debug, PartialEq)]
struct TestStruct2 {
f1: f32, f2: f64,
i1: i8, i2: i16, i3: i32, i4: i64,
u1: u8, u2: u16, u3: u32, u4: u64,
b: bool,
s: TestStruct, v: Vec<TestStruct>, m: BTreeMap<String, String>, y: Option<u8>, z: Option<TestStruct>, }
impl TestStruct2 {
pub fn new() -> Self {
TestStruct2 {
f1: 0.0,
f2: 0.0,
i1: 0, i2: 0, i3: 0, i4: 0,
u1: 0, u2: 0, u3: 0, u4: 0,
b: false,
s: TestStruct::new(),
v: vec![],
m: BTreeMap::new(),
y: None,
z: None,
}
}
}
impl DecodeFromTars for TestStruct2 {
fn decode_from(b: &Bytes) -> Result<Self, DecodeErr> {
let mut de = TarsDecoder::new(&b);
let f1 = de.get(0)?;
let f2 = de.get(1)?;
let i1 = de.get(2)?;
let i2 = de.get(3)?;
let i3 = de.get(4)?;
let i4 = de.get(5)?;
let u1 = de.get(6)?;
let u2 = de.get(7)?;
let u3 = de.get(8)?;
let u4 = de.get(9)?;
let b = de.get(10)?;
let s = de.get(11)?;
let v = de.get(12)?;
let m = de.get(13)?;
let y = de.get(14)?;
let z = de.get(15)?;
Ok(TestStruct2 {
f1,
f2,
i1,
i2,
i3,
i4,
u1,
u2,
u3,
u4,
b,
s,
v,
m,
y,
z,
})
}
}
impl EncodeIntoTars for TestStruct2 {
fn encode_into(&self, encoder: &mut TarsEncoder) -> Result<(), EncodeErr> {
encoder.put(0, &self.f1)?;
encoder.put(1, &self.f2)?;
encoder.put(2, &self.i1)?;
encoder.put(3, &self.i2)?;
encoder.put(4, &self.i3)?;
encoder.put(5, &self.i4)?;
encoder.put(6, &self.u1)?;
encoder.put(7, &self.u2)?;
encoder.put(8, &self.u3)?;
encoder.put(9, &self.u4)?;
encoder.put(10, &self.b)?;
encoder.put(11, &self.s)?;
encoder.put(12, &self.v)?;
encoder.put(13, &self.m)?;
encoder.put(14, &self.y)?;
encoder.put(15, &self.z)?;
Ok(())
}
}
unsafe impl Sync for TestStruct2 {}
unsafe impl Send for TestStruct2 {}
#[test]
fn test_encode_decode_struct2() {
let mut encoder = TarsEncoder::new();
let mut ts = TestStruct2::new();
ts.encode_into(&mut encoder).unwrap();
let de_ts = TestStruct2::decode_from(&encoder.to_bytes()).unwrap();
assert_eq!(de_ts, ts);
ts.f1 = random();
ts.f2 = random();
ts.i1 = random();
ts.i2 = random();
ts.i3 = random();
ts.i4 = random();
ts.u1 = random();
ts.u2 = random();
ts.u3 = random();
ts.u4 = random();
ts.b = random();
ts.s = TestStruct::random_for_test();
let v_len: u8 = random();
for _ in 0..v_len {
ts.v.push(TestStruct::random_for_test());
}
let m_len: u8 = random();
for _ in 0..m_len {
ts.m
.insert(Uuid::new_v4().to_string(), Uuid::new_v4().to_string());
}
ts.y = Some(random());
ts.z = Some(TestStruct::random_for_test());
let mut encoder = TarsEncoder::new();
ts.encode_into(&mut encoder).unwrap();
let de_ts = TestStruct2::decode_from(&encoder.to_bytes()).unwrap();
assert_eq!(de_ts, ts);
ts.y = None;
let mut encoder = TarsEncoder::new();
ts.encode_into(&mut encoder).unwrap();
let de_ts = TestStruct2::decode_from(&encoder.to_bytes()).unwrap();
assert_eq!(de_ts, ts);
}