extern crate stream_vbyte;
extern crate rand;
use std::cmp;
use self::rand::Rng;
use stream_vbyte::*;
#[path = "../src/random_varint.rs"]
mod random_varint;
use random_varint::*;
const MIN_DECODE_BUFFER_LEN: usize = 4;
#[test]
fn decode_cursor_random_decode_len_scalar() {
do_decode_cursor_random_decode_len::<Scalar>();
}
#[cfg(feature = "x86_ssse3")]
#[test]
fn decode_cursor_random_decode_len_ssse3() {
do_decode_cursor_random_decode_len::<x86::Ssse3>();
}
#[test]
fn decode_cursor_every_decode_len_scalar() {
do_decode_cursor_every_decode_len::<Scalar>()
}
#[cfg(feature = "x86_ssse3")]
#[test]
fn decode_cursor_every_decode_len_ssse3() {
do_decode_cursor_every_decode_len::<x86::Ssse3>()
}
#[test]
fn decode_cursor_skip_from_start_scalar() {
do_decode_cursor_skip_every_allowable_len_from_start::<Scalar>();
}
#[cfg(feature = "x86_ssse3")]
#[test]
fn decode_cursor_skip_from_start_ssse3() {
do_decode_cursor_skip_every_allowable_len_from_start::<x86::Ssse3>();
}
#[test]
fn decode_cursor_skip_every_allowable_len_between_decodes_scalar() {
do_decode_cursor_skip_every_allowable_len_between_decodes::<Scalar>();
}
#[cfg(feature = "x86_ssse3")]
#[test]
fn decode_cursor_skip_every_allowable_len_between_decodes_ssse3() {
do_decode_cursor_skip_every_allowable_len_between_decodes::<x86::Ssse3>();
}
fn do_decode_cursor_every_decode_len<D: Decoder>() {
let mut nums: Vec<u32> = Vec::new();
let mut encoded = Vec::new();
let mut decoded = Vec::new();
let mut decoded_accum = Vec::new();
let mut rng = rand::weak_rng();
for count in 0..100 {
nums.clear();
encoded.clear();
decoded.clear();
for i in RandomVarintEncodedLengthIter::new(rand::weak_rng()).take(count) {
nums.push(i);
}
encoded.resize(count * 5, 0);
let encoded_len = encode::<Scalar>(&nums, &mut encoded);
let extra_slots = 100;
for decode_len in MIN_DECODE_BUFFER_LEN..cmp::max(MIN_DECODE_BUFFER_LEN + 1, count + 1) {
decoded_accum.clear();
let mut cursor = DecodeCursor::new(&encoded[0..encoded_len], count);
while cursor.has_more() {
let garbage = rng.gen();
decoded.clear();
decoded.resize(count + extra_slots, garbage);
let nums_decoded = cursor.decode::<D>(&mut decoded[0..decode_len]);
if cursor.has_more() {
assert!(decode_len - nums_decoded <= 3, "{} - {} = {}",
decode_len, nums_decoded, decode_len - nums_decoded);
}
assert_eq!(&nums[decoded_accum.len()..(decoded_accum.len() + nums_decoded)],
&decoded[0..nums_decoded]);
for (i, &n) in decoded[nums_decoded..(count + extra_slots)].iter().enumerate() {
assert_eq!(garbage, n, "index {}", i);
}
for &n in &decoded[0..nums_decoded] {
decoded_accum.push(n);
}
}
assert_eq!(encoded_len, cursor.input_consumed());
assert_eq!(count, decoded_accum.len());
assert_eq!(&nums, &decoded_accum);
}
}
}
fn do_decode_cursor_random_decode_len<D: Decoder>() {
let mut nums: Vec<u32> = Vec::new();
let mut encoded = Vec::new();
let mut decoded = Vec::new();
let mut decoded_accum = Vec::new();
let mut rng = rand::weak_rng();
for _ in 0..10_000 {
nums.clear();
encoded.clear();
decoded.clear();
decoded_accum.clear();
let count = rng.gen_range(0, 500);
for i in RandomVarintEncodedLengthIter::new(rand::weak_rng()).take(count) {
nums.push(i);
}
encoded.resize(count * 5, 0);
let encoded_len = encode::<Scalar>(&nums, &mut encoded);
let extra_slots = 100;
let mut cursor = DecodeCursor::new(&encoded[0..encoded_len], count);
while cursor.has_more() {
let garbage = rng.gen();
decoded.clear();
decoded.resize(count + extra_slots, garbage);
let decode_len: usize = rng.gen_range(MIN_DECODE_BUFFER_LEN,
cmp::max(MIN_DECODE_BUFFER_LEN + 1, count + 1));
let nums_decoded = cursor.decode::<D>(&mut decoded[0..decode_len]);
assert_eq!(&nums[decoded_accum.len()..(decoded_accum.len() + nums_decoded)],
&decoded[0..nums_decoded]);
for (i, &n) in decoded[nums_decoded..(count + extra_slots)].iter().enumerate() {
assert_eq!(garbage as u32, n, "index {}", i);
}
for &n in &decoded[0..nums_decoded] {
decoded_accum.push(n);
}
}
assert_eq!(encoded_len, cursor.input_consumed());
assert_eq!(count, decoded_accum.len());
assert_eq!(&nums[..], &decoded_accum[0..count]);
}
}
fn do_decode_cursor_skip_every_allowable_len_from_start<D: Decoder>() {
let mut nums: Vec<u32> = Vec::new();
let mut encoded = Vec::new();
let mut decoded = Vec::new();
let mut rng = rand::weak_rng();
for count in 0..100_usize {
nums.clear();
encoded.clear();
decoded.clear();
for i in 0..count {
nums.push(i as u32);
}
encoded.resize(count * 5, 0);
let encoded_len = encode::<Scalar>(&nums, &mut encoded);
let extra_slots = 100;
for skip_len in (0..(count / 4 + 1)).map(|i| i * 4) {
let mut cursor = DecodeCursor::new(&encoded[0..encoded_len], count);
cursor.skip(skip_len);
let garbage = rng.gen();
decoded.clear();
decoded.resize(count + extra_slots, garbage);
let nums_decoded = cursor.decode::<D>(&mut decoded);
assert!(!cursor.has_more());
assert_eq!(count - skip_len, nums_decoded);
assert_eq!(&nums[skip_len..], &decoded[0..nums_decoded]);
for (i, &n) in decoded[nums_decoded..(count + extra_slots)].iter().enumerate() {
assert_eq!(garbage as u32, n, "index {}", i);
}
assert_eq!(encoded_len, cursor.input_consumed());
}
}
}
fn do_decode_cursor_skip_every_allowable_len_between_decodes<D: Decoder>() {
let mut nums: Vec<u32> = Vec::new();
let mut encoded = Vec::new();
let mut decoded = Vec::new();
let mut rng = rand::weak_rng();
for count in 0..50_usize {
nums.clear();
encoded.clear();
decoded.clear();
for i in 0..count {
nums.push(i as u32);
}
encoded.resize(count * 5, 0);
let encoded_len = encode::<Scalar>(&nums, &mut encoded);
'dec1: for initial_decode_len in 4..(count + 1) {
'skip: for skip_len in (0..count / 4).map(|i| i * 4) {
'dec2: for final_decode_len in 4..count {
decoded.clear();
let garbage = rng.gen();
let extra_slots = 100;
decoded.resize(count + extra_slots, garbage);
let mut cursor = DecodeCursor::new(&encoded[0..encoded_len], count);
let initial_decoded_nums = cursor.decode::<D>(&mut decoded[0..initial_decode_len]);
assert_eq!(&nums[0..initial_decoded_nums], &decoded[0..initial_decoded_nums]);
for (i, &n) in decoded[initial_decoded_nums..].iter().enumerate() {
assert_eq!(garbage, n, "index {}", i);
}
if initial_decoded_nums + skip_len > count {
break 'skip;
}
cursor.skip(skip_len);
let nums_after_skip = count - initial_decoded_nums - skip_len;
if final_decode_len > nums_after_skip {
break 'dec2;
}
let garbage = rng.gen();
decoded.clear();
decoded.resize(count + extra_slots, garbage);
let final_decoded_nums = cursor.decode::<D>(&mut decoded[0..final_decode_len]);
assert_eq!(&nums[(initial_decoded_nums + skip_len)..(initial_decoded_nums + skip_len + final_decoded_nums)],
&decoded[0..final_decoded_nums]);
for (i, &n) in decoded[final_decoded_nums..(count + extra_slots)].iter().enumerate() {
assert_eq!(garbage as u32, n, "index {}", i);
}
}
}
}
}
}