41 lines
1.5 KiB
Rust
41 lines
1.5 KiB
Rust
//! Property-based tests for basic serialization primitives.
|
|
|
|
use super::*;
|
|
use proptest::prelude::*;
|
|
|
|
use std::io::Cursor;
|
|
|
|
proptest! {
|
|
// The tests below are cheap so we can run them a lot.
|
|
#![proptest_config(ProptestConfig::with_cases(100_000))]
|
|
|
|
#[test]
|
|
fn compactsize_write_then_read_round_trip(s in 0u64..0x2_0000u64) {
|
|
zebra_test::init();
|
|
|
|
// Maximum encoding size of a compactsize is 9 bytes.
|
|
let mut buf = [0u8; 8+1];
|
|
Cursor::new(&mut buf[..]).write_compactsize(s).unwrap();
|
|
let expect_s = Cursor::new(&buf[..]).read_compactsize().unwrap();
|
|
prop_assert_eq!(s, expect_s);
|
|
}
|
|
|
|
#[test]
|
|
fn compactsize_read_then_write_round_trip(bytes in prop::array::uniform9(0u8..)) {
|
|
zebra_test::init();
|
|
|
|
// Only do the test if the bytes were valid.
|
|
if let Ok(s) = Cursor::new(&bytes[..]).read_compactsize() {
|
|
// The compactsize encoding is variable-length, so we may not even
|
|
// read all of the input bytes, and therefore we can't expect that
|
|
// the encoding will reproduce bytes that were never read. Instead,
|
|
// copy the input bytes, and overwrite them with the encoding of s,
|
|
// so that if the encoding is different, we'll catch it on the part
|
|
// that's written.
|
|
let mut expect_bytes = bytes;
|
|
Cursor::new(&mut expect_bytes[..]).write_compactsize(s).unwrap();
|
|
prop_assert_eq!(bytes, expect_bytes);
|
|
}
|
|
}
|
|
}
|