#![allow(unused)]
use crate::io::{Read, Slice, SliceMut, VecStream};
use crate::{BinSettings, BitWidth, Context, Decode, Encode, Encoder, EncodingResult, Endianness, NumEncoding, NumRepr, SizeRepr, StrEncoding, StrLen, StringRepr, VariantRepr};
use std::hash::{DefaultHasher, Hasher};
const SETTINGS: BinSettings = BinSettings {
num_repr: NumRepr {
endianness: Endianness::LittleEndian,
num_encoding: NumEncoding::Fixed,
},
size_repr: SizeRepr {
endianness: Endianness::LittleEndian,
num_encoding: NumEncoding::Fixed,
width: BitWidth::Bit64,
max_size: isize::MAX as usize,
},
variant_repr: VariantRepr {
endianness: Endianness::LittleEndian,
num_encoding: NumEncoding::Fixed,
width: BitWidth::Bit32,
},
string_repr: StringRepr {
encoding: StrEncoding::Utf8,
endianness: Endianness::LittleEndian,
len: StrLen::LengthPrefixed,
},
};
macro_rules! test_num_encoding {
($fn_name:ident, $encoding_name:ident) => {
#[test]
pub fn $fn_name() {
#[derive(PartialEq, Eq, Debug, Encode, Decode)]
#[ender(variant: bit8)]
enum MaybeSigned {
Signed(i64),
Unsigned(u64),
}
let mut settings = SETTINGS;
settings.num_repr.num_encoding = NumEncoding::$encoding_name;
settings.size_repr.num_encoding = NumEncoding::$encoding_name;
settings.variant_repr.num_encoding = NumEncoding::$encoding_name;
let mut data = vec![0u8; 1000000];
let mut encoder =
Encoder::new(SliceMut::new(&mut data), Context::with_settings(settings));
let mut orig = Vec::new();
let mut hash = DefaultHasher::new();
for x in 0..4196 {
hash.write_i32(x);
let val = hash.finish();
let val = if (val % 2) == 0 {
MaybeSigned::Unsigned(val)
} else {
MaybeSigned::Signed(-(val as i64))
};
orig.push(val);
}
orig.push(MaybeSigned::Unsigned(u64::MAX));
orig.push(MaybeSigned::Signed(i64::MAX));
orig.push(MaybeSigned::Signed(i64::MIN));
orig.encode(&mut encoder).unwrap();
let mut decoder = Encoder::new(Slice::new(&data), Context::with_settings(settings));
let other: Vec<MaybeSigned> = Vec::decode(&mut decoder).unwrap();
assert_eq!(orig, other);
}
};
}
test_num_encoding!(fixed_encoding, Fixed);
test_num_encoding!(leb128, Leb128);
test_num_encoding!(protobuf_wasteful, ProtobufWasteful);
test_num_encoding!(protobuf_zz, ProtobufZigzag);
macro_rules! test_str_encoding {
(fn $fn_name:ident($settings:ident, max: $lit:literal) { $($tt:tt)* }) => {
#[test]
pub fn $fn_name() {
fn internal_test(mut settings: BinSettings) {
fn super_internal_test($settings: BinSettings) {
$($tt)*
}
settings.string_repr.len = StrLen::LengthPrefixed;
super_internal_test(settings);
settings.string_repr.len = StrLen::NullTerminated;
super_internal_test(settings);
settings.string_repr.len = StrLen::NullTerminatedFixed($lit);
super_internal_test(settings);
}
let mut settings = SETTINGS;
settings.string_repr.encoding = StrEncoding::Utf8;
internal_test(settings);
settings.string_repr.encoding = StrEncoding::Utf16;
internal_test(settings);
settings.string_repr.encoding = StrEncoding::Utf32;
internal_test(settings);
}
};
}
test_str_encoding! {
fn simple(settings, max: 200) {
let mut data = vec![0u8; 1000000];
let mut encoder = Encoder::new(SliceMut::new(&mut data), Context::with_settings(settings));
const STRING: &str = "Hello, world!";
encoder.write_str(STRING.chars()).unwrap();
let mut decoder = Encoder::new(Slice::new(&data), Context::with_settings(settings));
let string: String = decoder.read_str().unwrap();
assert_eq!(&string as &str, STRING);
}
}
#[test]
pub fn test() {
}
fn decode_owned<T: for<'de> Decode<Slice<'de>>>(bytes: &[u8]) -> T {
let mut encoder = Encoder::new(Slice::new(bytes), Context::default());
T::decode(&mut encoder).unwrap()
}
#[derive(Decode)]
struct IImplDecodeOwned {
pub a: i32,
pub b: u64,
pub c: String,
}
#[derive(Decode)]
struct IImplDecode<'a> {
#[ender(borrow)]
pub a: &'a [u8]
}
#[test]
fn impls_test() {
}
use crate::facade::fake::*;
#[derive(Encode, Decode)]
struct Friends {
#[ender(serde)]
uuid: (),
#[ender(with(in_place): person_encoder)]
friend1: person_encoder::Person,
#[ender(en; with: person_encoder::encode)]
#[ender(de; with: person_encoder::decode)]
friend2: person_encoder::Person,
private_key: Vec<u8>,
public_key: Vec<u8>,
#[ender(with: rsa(public_key, private_key))]
even_more_secret_data: Vec<u8>,
}
mod person_encoder {
use crate::{Encoder, EncodingResult, Encode, Decode};
use crate::io::{Read, Write};
pub struct Person {
name: String,
surname: String,
age: u32,
}
pub fn encode<T: Write>(person: &Person, encoder: &mut Encoder<T>) -> EncodingResult<()> {
person.name.encode(encoder)?;
person.surname.encode(encoder)?;
person.age.encode(encoder)?;
Ok(())
}
pub fn decode<T: Read>(encoder: &mut Encoder<T>) -> EncodingResult<Person> {
Ok(Person {
name: encoder.decode_value()?,
surname: encoder.decode_value()?,
age: encoder.decode_value()?,
})
}
pub fn decode_in_place<T: Read>(person: &mut Person, encoder: &mut Encoder<T>) -> EncodingResult<()> {
person.name.decode_in_place(encoder)?;
person.surname.decode_in_place(encoder)?;
person.age.decode_in_place(encoder)?;
Ok(())
}
}