From 23a4fdabe44a266f05b0e92491e6617d7d35cecc Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Fri, 6 Sep 2019 17:06:11 +1000 Subject: [PATCH] Enable remaining SSZ generic tests --- tests/ef_tests/src/cases/ssz_generic.rs | 36 +++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/tests/ef_tests/src/cases/ssz_generic.rs b/tests/ef_tests/src/cases/ssz_generic.rs index ce43f3c50..420f59679 100644 --- a/tests/ef_tests/src/cases/ssz_generic.rs +++ b/tests/ef_tests/src/cases/ssz_generic.rs @@ -4,6 +4,7 @@ use super::*; use crate::cases::common::{SszStaticType, TestU128, TestU256}; use crate::cases::ssz_static::{check_serialization, check_tree_hash}; use crate::decode::yaml_decode_file; +use serde::{de::Error as SerdeError, Deserialize, Deserializer}; use serde_derive::Deserialize; use ssz_derive::{Decode, Encode}; use std::fs; @@ -103,9 +104,8 @@ macro_rules! type_dispatch { "SmallTestStruct" => type_dispatch!($function, ($($arg),*), $base_ty, <$($param_ty,)* SmallTestStruct>, $($rest)*), "FixedTestStruct" => type_dispatch!($function, ($($arg),*), $base_ty, <$($param_ty,)* FixedTestStruct>, $($rest)*), "VarTestStruct" => type_dispatch!($function, ($($arg),*), $base_ty, <$($param_ty,)* VarTestStruct>, $($rest)*), + "ComplexTestStruct" => type_dispatch!($function, ($($arg),*), $base_ty, <$($param_ty,)* ComplexTestStruct>, $($rest)*), "BitsStruct" => type_dispatch!($function, ($($arg),*), $base_ty, <$($param_ty,)* BitsStruct>, $($rest)*), - // TODO: enable ComplexTestStruct - "ComplexTestStruct" => Err(Error::SkippedKnownFailure), _ => Err(Error::FailedToParseTest(format!("unsupported: {}", $value))), } }; @@ -260,6 +260,18 @@ struct VarTestStruct { C: u8, } +#[derive(Debug, Clone, Default, PartialEq, Decode, Encode, TreeHash, Deserialize)] +struct ComplexTestStruct { + A: u16, + B: VariableList, + C: u8, + #[serde(deserialize_with = "byte_list_from_hex_str")] + D: VariableList, + E: VarTestStruct, + F: FixedVector, + G: FixedVector, +} + #[derive(Debug, Clone, PartialEq, Decode, Encode, TreeHash, Deserialize)] struct BitsStruct { A: BitList, @@ -268,3 +280,23 @@ struct BitsStruct { D: BitList, E: BitVector, } + +fn byte_list_from_hex_str<'de, D, N: Unsigned>( + deserializer: D, +) -> Result, D::Error> +where + D: Deserializer<'de>, +{ + let s: String = Deserialize::deserialize(deserializer)?; + let decoded: Vec = hex::decode(&s.as_str()[2..]).map_err(D::Error::custom)?; + + if decoded.len() > N::to_usize() { + return Err(D::Error::custom(format!( + "Too many values for list, got: {}, limit: {}", + decoded.len(), + N::to_usize() + ))); + } else { + Ok(decoded.into()) + } +}