chore(codecs): add proptest roundtrip to all main_codec (#803)

This commit is contained in:
joshieDo
2023-01-11 14:06:01 +08:00
committed by GitHub
parent 593a94e426
commit aabbe4923b
13 changed files with 90 additions and 21 deletions

View File

@ -18,7 +18,16 @@ bytes = "1.2.1"
codecs-derive = { version = "0.1.0", path = "./derive", default-features = false }
revm-interpreter = { git = "https://github.com/bluealloy/revm", rev = "a05fb262d87c78ee52d400e6c0f4708d4c527f32", features = ["serde"] }
# arbitrary utils
arbitrary = { version = "1.1.7", features = ["derive"], optional = true }
proptest = { version = "1.0", optional = true }
proptest-derive = { version = "0.3", optional = true }
[dev-dependencies]
serde = "1.0"
modular-bitfield = "0.11.2"
test-fuzz = "3.0.4"
test-fuzz = "3.0.4"
arbitrary = { version = "1.1.7", features = ["derive"] }
proptest = { version = "1.0" }
proptest-derive = "0.3"

View File

@ -1,5 +1,5 @@
use proc_macro::{self, TokenStream};
use quote::quote;
use quote::{format_ident, quote};
use syn::{parse_macro_input, DeriveInput};
mod compact;
@ -73,9 +73,53 @@ pub fn use_postcard(_args: TokenStream, input: TokenStream) -> TokenStream {
pub fn use_compact(_args: TokenStream, input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
derive_compact_arbitrary(
_args,
quote! {
#[derive(Compact, serde::Serialize, serde::Deserialize)]
#ast
}
.into(),
)
}
#[proc_macro_attribute]
pub fn derive_compact_arbitrary(_args: TokenStream, input: TokenStream) -> TokenStream {
let ast = parse_macro_input!(input as DeriveInput);
// Avoid duplicate names
let prop_import = format_ident!("{}PropTestArbitratry", ast.ident);
let arb_import = format_ident!("{}Arbitratry", ast.ident);
let mod_tests = format_ident!("{}Tests", ast.ident);
let type_ident = ast.ident.clone();
quote! {
#[derive(Compact, serde::Serialize, serde::Deserialize)]
#[cfg(any(test, feature = "arbitrary"))]
use proptest_derive::Arbitrary as #prop_import;
#[cfg(any(test, feature = "arbitrary"))]
use arbitrary::Arbitrary as #arb_import;
#[cfg_attr(any(test, feature = "arbitrary"), derive(#prop_import, #arb_import))]
#ast
#[allow(non_snake_case)]
#[cfg(test)]
mod #mod_tests {
use super::Compact;
#[test]
fn proptest() {
proptest::proptest!(|(field: super::#type_ident)| {
let mut buf = vec![];
let len = field.clone().to_compact(&mut buf);
let (decoded, _) = super::#type_ident::from_compact(&buf, len);
assert!(field == decoded);
});
}
}
}
.into()
}