difftreelog
refac: tests for structures
in: master
1 file changed
crates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth1use evm_coder_procedural::AbiCoder;2use evm_coder::types::bytes;34#[test]5fn empty_struct() {6 let t = trybuild::TestCases::new();7 t.compile_fail("tests/build_failed/abi_derive_generation.rs");8}910#[derive(AbiCoder, PartialEq, Debug)]11struct TypeStruct1SimpleParam {12 _a: u8,13}1415#[derive(AbiCoder, PartialEq, Debug)]16struct TypeStruct1DynamicParam {17 _a: String,18}1920#[derive(AbiCoder, PartialEq, Debug)]21struct TypeStruct2SimpleParam {22 _a: u8,23 _b: u32,24}2526#[derive(AbiCoder, PartialEq, Debug)]27struct TypeStruct2DynamicParam {28 _a: String,29 _b: bytes,30}3132#[derive(AbiCoder, PartialEq, Debug)]33struct TypeStruct2MixedParam {34 _a: u8,35 _b: bytes,36}3738#[derive(AbiCoder, PartialEq, Debug)]39struct TypeStruct1DerivedSimpleParam {40 _a: TypeStruct1SimpleParam,41}4243#[derive(AbiCoder, PartialEq, Debug)]44struct TypeStruct2DerivedSimpleParam {45 _a: TypeStruct1SimpleParam,46 _b: TypeStruct2SimpleParam,47}4849#[derive(AbiCoder, PartialEq, Debug)]50struct TypeStruct1DerivedDynamicParam {51 _a: TypeStruct1DynamicParam,52}5354#[derive(AbiCoder, PartialEq, Debug)]55struct TypeStruct2DerivedDynamicParam {56 _a: TypeStruct1DynamicParam,57 _b: TypeStruct2DynamicParam,58}5960/// Some docs61/// At multi62/// line63#[derive(AbiCoder, PartialEq, Debug)]64struct TypeStruct3DerivedMixedParam {65 /// Docs for A66 /// multi67 /// line68 _a: TypeStruct1SimpleParam,69 /// Docs for B70 _b: TypeStruct2DynamicParam,71 /// Docs for C72 _c: TypeStruct2MixedParam,73}7475#[test]76#[cfg(feature = "stubgen")]77fn struct_collect_TypeStruct3DerivedMixedParam() {78 assert_eq!(79 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),80 "TypeStruct3DerivedMixedParam"81 );82 assert_eq!(83 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),84 r#"/// @dev Some docs85/// At multi86/// line87struct TypeStruct3DerivedMixedParam {88 /// @dev Docs for A89 /// multi90 /// line91 TypeStruct1SimpleParam _a;92 /// @dev Docs for B93 TypeStruct2DynamicParam _b;94 /// @dev Docs for C95 TypeStruct2MixedParam _c;96}97"#98 );99}100101#[test]102fn impl_abi_type_signature() {103 assert_eq!(104 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE105 .as_str()106 .unwrap(),107 "(uint8)"108 );109 assert_eq!(110 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE111 .as_str()112 .unwrap(),113 "(string)"114 );115 assert_eq!(116 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE117 .as_str()118 .unwrap(),119 "(uint8,uint32)"120 );121 assert_eq!(122 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE123 .as_str()124 .unwrap(),125 "(string,bytes)"126 );127 assert_eq!(128 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE129 .as_str()130 .unwrap(),131 "(uint8,bytes)"132 );133 assert_eq!(134 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE135 .as_str()136 .unwrap(),137 "((uint8))"138 );139 assert_eq!(140 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE141 .as_str()142 .unwrap(),143 "((uint8),(uint8,uint32))"144 );145 assert_eq!(146 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE147 .as_str()148 .unwrap(),149 "((string))"150 );151 assert_eq!(152 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE153 .as_str()154 .unwrap(),155 "((string),(string,bytes))"156 );157 assert_eq!(158 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE159 .as_str()160 .unwrap(),161 "((uint8),(string,bytes),(uint8,bytes))"162 );163}164165#[test]166fn impl_abi_type_is_dynamic() {167 assert_eq!(168 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),169 false170 );171 assert_eq!(172 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),173 true174 );175 assert_eq!(176 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),177 false178 );179 assert_eq!(180 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),181 true182 );183 assert_eq!(184 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),185 true186 );187 assert_eq!(188 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),189 false190 );191 assert_eq!(192 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),193 false194 );195 assert_eq!(196 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),197 true198 );199 assert_eq!(200 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),201 true202 );203 assert_eq!(204 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),205 true206 );207}208209#[test]210fn impl_abi_type_size() {211 const ABI_ALIGNMENT: usize = 32;212 assert_eq!(213 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),214 ABI_ALIGNMENT215 );216 assert_eq!(217 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),218 ABI_ALIGNMENT219 );220 assert_eq!(221 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),222 ABI_ALIGNMENT * 2223 );224 assert_eq!(225 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),226 ABI_ALIGNMENT * 2227 );228 assert_eq!(229 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),230 ABI_ALIGNMENT * 2231 );232 assert_eq!(233 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),234 ABI_ALIGNMENT235 );236 assert_eq!(237 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),238 ABI_ALIGNMENT * 3239 );240 assert_eq!(241 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),242 ABI_ALIGNMENT243 );244 assert_eq!(245 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),246 ABI_ALIGNMENT * 3247 );248 assert_eq!(249 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),250 ABI_ALIGNMENT * 5251 );252}253254#[derive(AbiCoder, PartialEq, Debug)]255struct TupleStruct1SimpleParam(u8);256257#[derive(AbiCoder, PartialEq, Debug)]258struct TupleStruct1DynamicParam(String);259260#[derive(AbiCoder, PartialEq, Debug)]261struct TupleStruct2SimpleParam(u8, u32);262263#[derive(AbiCoder, PartialEq, Debug)]264struct TupleStruct2DynamicParam(String, bytes);265266#[derive(AbiCoder, PartialEq, Debug)]267struct TupleStruct2MixedParam(u8, bytes);268269#[derive(AbiCoder, PartialEq, Debug)]270struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);271272#[derive(AbiCoder, PartialEq, Debug)]273struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);274275#[derive(AbiCoder, PartialEq, Debug)]276struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);277278#[derive(AbiCoder, PartialEq, Debug)]279struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);280281#[derive(AbiCoder, PartialEq, Debug)]282struct TupleStruct3DerivedMixedParam(283 TupleStruct1SimpleParam,284 TupleStruct2DynamicParam,285 TupleStruct2MixedParam,286);287288#[test]289fn impl_abi_type_signature_same_for_structs() {290 assert_eq!(291 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE292 .as_str()293 .unwrap(),294 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE295 .as_str()296 .unwrap()297 );298 assert_eq!(299 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE300 .as_str()301 .unwrap(),302 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE303 .as_str()304 .unwrap()305 );306 assert_eq!(307 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE308 .as_str()309 .unwrap(),310 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE311 .as_str()312 .unwrap()313 );314 assert_eq!(315 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE316 .as_str()317 .unwrap(),318 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE319 .as_str()320 .unwrap()321 );322 assert_eq!(323 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE324 .as_str()325 .unwrap(),326 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE327 .as_str()328 .unwrap(),329 );330 assert_eq!(331 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE332 .as_str()333 .unwrap(),334 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE335 .as_str()336 .unwrap(),337 );338 assert_eq!(339 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE340 .as_str()341 .unwrap(),342 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE343 .as_str()344 .unwrap(),345 );346 assert_eq!(347 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE348 .as_str()349 .unwrap(),350 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE351 .as_str()352 .unwrap(),353 );354 assert_eq!(355 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE356 .as_str()357 .unwrap(),358 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE359 .as_str()360 .unwrap(),361 );362 assert_eq!(363 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE364 .as_str()365 .unwrap(),366 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE367 .as_str()368 .unwrap(),369 );370}371372#[test]373fn impl_abi_type_is_dynamic_same_for_structs() {374 assert_eq!(375 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),376 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic()377 );378 assert_eq!(379 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),380 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic()381 );382 assert_eq!(383 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),384 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic()385 );386 assert_eq!(387 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),388 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic()389 );390 assert_eq!(391 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),392 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic()393 );394 assert_eq!(395 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),396 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()397 );398 assert_eq!(399 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),400 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()401 );402 assert_eq!(403 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),404 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()405 );406 assert_eq!(407 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),408 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()409 );410 assert_eq!(411 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),412 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic()413 );414}415416#[test]417fn impl_abi_type_size_same_for_structs() {418 assert_eq!(419 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),420 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::size()421 );422 assert_eq!(423 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),424 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::size()425 );426 assert_eq!(427 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),428 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::size()429 );430 assert_eq!(431 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),432 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::size()433 );434 assert_eq!(435 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),436 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::size()437 );438 assert_eq!(439 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),440 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size()441 );442 assert_eq!(443 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),444 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size()445 );446 assert_eq!(447 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),448 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size()449 );450 assert_eq!(451 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),452 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size()453 );454 assert_eq!(455 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),456 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size()457 );458}459460const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;461462fn test_impl<Tuple, TupleStruct, TypeStruct>(463 tuple_data: Tuple,464 tuple_struct_data: TupleStruct,465 type_struct_data: TypeStruct,466) where467 TypeStruct:468 evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,469 TupleStruct:470 evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,471 Tuple:472 evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,473{474 let encoded_type_struct = test_abi_write_impl(&type_struct_data);475 let encoded_tuple_struct = test_abi_write_impl(&tuple_struct_data);476 let encoded_tuple = test_abi_write_impl(&tuple_data);477478 similar_asserts::assert_eq!(encoded_tuple, encoded_type_struct);479 similar_asserts::assert_eq!(encoded_tuple, encoded_tuple_struct);480481 {482 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();483 let restored_struct_data = <TypeStruct>::abi_read(&mut decoder).unwrap();484 assert_eq!(restored_struct_data, type_struct_data);485 }486 {487 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();488 let restored_struct_data = <TupleStruct>::abi_read(&mut decoder).unwrap();489 assert_eq!(restored_struct_data, tuple_struct_data);490 }491492 {493 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_type_struct).unwrap();494 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();495 assert_eq!(restored_tuple_data, tuple_data);496 }497 {498 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple_struct).unwrap();499 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();500 assert_eq!(restored_tuple_data, tuple_data);501 }502}503504fn test_abi_write_impl<A>(data: &A) -> Vec<u8>505where506 A: evm_coder::abi::AbiWrite + evm_coder::abi::AbiRead + std::cmp::PartialEq + std::fmt::Debug,507{508 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);509 data.abi_write(&mut writer);510 let encoded_tuple = writer.finish();511 encoded_tuple512}513514#[test]515fn codec_struct_1_simple() {516 let _a = 0xff;517 test_impl::<(u8,), TupleStruct1SimpleParam, TypeStruct1SimpleParam>(518 (_a,),519 TupleStruct1SimpleParam(_a),520 TypeStruct1SimpleParam { _a },521 );522}523524#[test]525fn codec_struct_1_dynamic() {526 let _a: String = "some string".into();527 test_impl::<(String,), TupleStruct1DynamicParam, TypeStruct1DynamicParam>(528 (_a.clone(),),529 TupleStruct1DynamicParam(_a.clone()),530 TypeStruct1DynamicParam { _a },531 );532}533534#[test]535fn codec_struct_1_derived_simple() {536 let _a: u8 = 0xff;537 test_impl::<((u8,),), TupleStruct1DerivedSimpleParam, TypeStruct1DerivedSimpleParam>(538 ((_a,),),539 TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam(_a)),540 TypeStruct1DerivedSimpleParam {541 _a: TypeStruct1SimpleParam { _a },542 },543 );544}545546#[test]547fn codec_struct_1_derived_dynamic() {548 let _a: String = "some string".into();549 test_impl::<((String,),), TupleStruct1DerivedDynamicParam, TypeStruct1DerivedDynamicParam>(550 ((_a.clone(),),),551 TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam(_a.clone())),552 TypeStruct1DerivedDynamicParam {553 _a: TypeStruct1DynamicParam { _a },554 },555 );556}557558#[test]559fn codec_struct_2_simple() {560 let _a = 0xff;561 let _b = 0xbeefbaba;562 test_impl::<(u8, u32), TupleStruct2SimpleParam, TypeStruct2SimpleParam>(563 (_a, _b),564 TupleStruct2SimpleParam(_a, _b),565 TypeStruct2SimpleParam { _a, _b },566 );567}568569#[test]570fn codec_struct_2_dynamic() {571 let _a: String = "some string".into();572 let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);573 test_impl::<(String, bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(574 (_a.clone(), _b.clone()),575 TupleStruct2DynamicParam(_a.clone(), _b.clone()),576 TypeStruct2DynamicParam { _a, _b },577 );578}579580#[test]581fn codec_struct_2_mixed() {582 let _a: u8 = 0xff;583 let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);584 test_impl::<(u8, bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(585 (_a.clone(), _b.clone()),586 TupleStruct2MixedParam(_a.clone(), _b.clone()),587 TypeStruct2MixedParam { _a, _b },588 );589}590591#[test]592fn codec_struct_2_derived_simple() {593 let _a = 0xff;594 let _b = 0xbeefbaba;595 test_impl::<((u8,), (u8, u32)), TupleStruct2DerivedSimpleParam, TypeStruct2DerivedSimpleParam>(596 ((_a,), (_a, _b)),597 TupleStruct2DerivedSimpleParam(598 TupleStruct1SimpleParam(_a),599 TupleStruct2SimpleParam(_a, _b),600 ),601 TypeStruct2DerivedSimpleParam {602 _a: TypeStruct1SimpleParam { _a },603 _b: TypeStruct2SimpleParam { _a, _b },604 },605 );606}607608#[test]609fn codec_struct_2_derived_dynamic() {610 let _a = "some string".to_string();611 let _b = bytes(vec![0x11, 0x22, 0x33]);612 test_impl::<613 ((String,), (String, bytes)),614 TupleStruct2DerivedDynamicParam,615 TypeStruct2DerivedDynamicParam,616 >(617 ((_a.clone(),), (_a.clone(), _b.clone())),618 TupleStruct2DerivedDynamicParam(619 TupleStruct1DynamicParam(_a.clone()),620 TupleStruct2DynamicParam(_a.clone(), _b.clone()),621 ),622 TypeStruct2DerivedDynamicParam {623 _a: TypeStruct1DynamicParam { _a: _a.clone() },624 _b: TypeStruct2DynamicParam { _a, _b },625 },626 );627}628629#[test]630fn codec_struct_3_derived_mixed() {631 let int = 0xff;632 let by = bytes(vec![0x11, 0x22, 0x33]);633 let string = "some string".to_string();634 test_impl::<635 ((u8,), (String, bytes), (u8, bytes)),636 TupleStruct3DerivedMixedParam,637 TypeStruct3DerivedMixedParam,638 >(639 ((int,), (string.clone(), by.clone()), (int, by.clone())),640 TupleStruct3DerivedMixedParam(641 TupleStruct1SimpleParam(int),642 TupleStruct2DynamicParam(string.clone(), by.clone()),643 TupleStruct2MixedParam(int, by.clone()),644 ),645 TypeStruct3DerivedMixedParam {646 _a: TypeStruct1SimpleParam { _a: int },647 _b: TypeStruct2DynamicParam {648 _a: string.clone(),649 _b: by.clone(),650 },651 _c: TypeStruct2MixedParam { _a: int, _b: by },652 },653 );654}655656#[derive(AbiCoder, PartialEq, Debug)]657struct TypeStruct2SimpleStruct1Simple {658 _a: TypeStruct2SimpleParam,659 _b: TypeStruct2SimpleParam,660 _c: u8,661}662#[derive(AbiCoder, PartialEq, Debug)]663struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);664665#[test]666fn codec_struct_2_struct_simple_1_simple() {667 let _a = 0xff;668 let _b = 0xbeefbaba;669 test_impl::<670 ((u8, u32), (u8, u32), u8),671 TupleStruct2SimpleStruct1Simple,672 TypeStruct2SimpleStruct1Simple,673 >(674 ((_a, _b), (_a, _b), _a),675 TupleStruct2SimpleStruct1Simple(676 TupleStruct2SimpleParam(_a, _b),677 TupleStruct2SimpleParam(_a, _b),678 _a,679 ),680 TypeStruct2SimpleStruct1Simple {681 _a: TypeStruct2SimpleParam { _a, _b },682 _b: TypeStruct2SimpleParam { _a, _b },683 _c: _a,684 },685 );686}1mod test_struct {2 use evm_coder_procedural::AbiCoder;3 use evm_coder::types::bytes;45 #[test]6 fn empty_struct() {7 let t = trybuild::TestCases::new();8 t.compile_fail("tests/build_failed/abi_derive_generation.rs");9 }1011 #[derive(AbiCoder, PartialEq, Debug)]12 struct TypeStruct1SimpleParam {13 _a: u8,14 }1516 #[derive(AbiCoder, PartialEq, Debug)]17 struct TypeStruct1DynamicParam {18 _a: String,19 }2021 #[derive(AbiCoder, PartialEq, Debug)]22 struct TypeStruct2SimpleParam {23 _a: u8,24 _b: u32,25 }2627 #[derive(AbiCoder, PartialEq, Debug)]28 struct TypeStruct2DynamicParam {29 _a: String,30 _b: bytes,31 }3233 #[derive(AbiCoder, PartialEq, Debug)]34 struct TypeStruct2MixedParam {35 _a: u8,36 _b: bytes,37 }3839 #[derive(AbiCoder, PartialEq, Debug)]40 struct TypeStruct1DerivedSimpleParam {41 _a: TypeStruct1SimpleParam,42 }4344 #[derive(AbiCoder, PartialEq, Debug)]45 struct TypeStruct2DerivedSimpleParam {46 _a: TypeStruct1SimpleParam,47 _b: TypeStruct2SimpleParam,48 }4950 #[derive(AbiCoder, PartialEq, Debug)]51 struct TypeStruct1DerivedDynamicParam {52 _a: TypeStruct1DynamicParam,53 }5455 #[derive(AbiCoder, PartialEq, Debug)]56 struct TypeStruct2DerivedDynamicParam {57 _a: TypeStruct1DynamicParam,58 _b: TypeStruct2DynamicParam,59 }6061 /// Some docs62 /// At multi63 /// line64 #[derive(AbiCoder, PartialEq, Debug)]65 struct TypeStruct3DerivedMixedParam {66 /// Docs for A67 /// multi68 /// line69 _a: TypeStruct1SimpleParam,70 /// Docs for B71 _b: TypeStruct2DynamicParam,72 /// Docs for C73 _c: TypeStruct2MixedParam,74 }7576 #[test]77 #[cfg(feature = "stubgen")]78 fn struct_collect_TypeStruct3DerivedMixedParam() {79 assert_eq!(80 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),81 "TypeStruct3DerivedMixedParam"82 );83 assert_eq!(84 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),85 r#"/// @dev Some docs86/// At multi87/// line88struct TypeStruct3DerivedMixedParam {89 /// @dev Docs for A90 /// multi91 /// line92 TypeStruct1SimpleParam _a;93 /// @dev Docs for B94 TypeStruct2DynamicParam _b;95 /// @dev Docs for C96 TypeStruct2MixedParam _c;97}98"#99 );100 }101102 #[test]103 fn impl_abi_type_signature() {104 assert_eq!(105 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE106 .as_str()107 .unwrap(),108 "(uint8)"109 );110 assert_eq!(111 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE112 .as_str()113 .unwrap(),114 "(string)"115 );116 assert_eq!(117 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE118 .as_str()119 .unwrap(),120 "(uint8,uint32)"121 );122 assert_eq!(123 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE124 .as_str()125 .unwrap(),126 "(string,bytes)"127 );128 assert_eq!(129 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE130 .as_str()131 .unwrap(),132 "(uint8,bytes)"133 );134 assert_eq!(135 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE136 .as_str()137 .unwrap(),138 "((uint8))"139 );140 assert_eq!(141 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE142 .as_str()143 .unwrap(),144 "((uint8),(uint8,uint32))"145 );146 assert_eq!(147 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE148 .as_str()149 .unwrap(),150 "((string))"151 );152 assert_eq!(153 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE154 .as_str()155 .unwrap(),156 "((string),(string,bytes))"157 );158 assert_eq!(159 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE160 .as_str()161 .unwrap(),162 "((uint8),(string,bytes),(uint8,bytes))"163 );164 }165166 #[test]167 fn impl_abi_type_is_dynamic() {168 assert_eq!(169 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),170 false171 );172 assert_eq!(173 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),174 true175 );176 assert_eq!(177 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),178 false179 );180 assert_eq!(181 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),182 true183 );184 assert_eq!(185 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),186 true187 );188 assert_eq!(189 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),190 false191 );192 assert_eq!(193 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),194 false195 );196 assert_eq!(197 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),198 true199 );200 assert_eq!(201 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),202 true203 );204 assert_eq!(205 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),206 true207 );208 }209210 #[test]211 fn impl_abi_type_size() {212 const ABI_ALIGNMENT: usize = 32;213 assert_eq!(214 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),215 ABI_ALIGNMENT216 );217 assert_eq!(218 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),219 ABI_ALIGNMENT220 );221 assert_eq!(222 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),223 ABI_ALIGNMENT * 2224 );225 assert_eq!(226 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),227 ABI_ALIGNMENT * 2228 );229 assert_eq!(230 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),231 ABI_ALIGNMENT * 2232 );233 assert_eq!(234 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),235 ABI_ALIGNMENT236 );237 assert_eq!(238 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),239 ABI_ALIGNMENT * 3240 );241 assert_eq!(242 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),243 ABI_ALIGNMENT244 );245 assert_eq!(246 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),247 ABI_ALIGNMENT * 3248 );249 assert_eq!(250 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),251 ABI_ALIGNMENT * 5252 );253 }254255 #[derive(AbiCoder, PartialEq, Debug)]256 struct TupleStruct1SimpleParam(u8);257258 #[derive(AbiCoder, PartialEq, Debug)]259 struct TupleStruct1DynamicParam(String);260261 #[derive(AbiCoder, PartialEq, Debug)]262 struct TupleStruct2SimpleParam(u8, u32);263264 #[derive(AbiCoder, PartialEq, Debug)]265 struct TupleStruct2DynamicParam(String, bytes);266267 #[derive(AbiCoder, PartialEq, Debug)]268 struct TupleStruct2MixedParam(u8, bytes);269270 #[derive(AbiCoder, PartialEq, Debug)]271 struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);272273 #[derive(AbiCoder, PartialEq, Debug)]274 struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);275276 #[derive(AbiCoder, PartialEq, Debug)]277 struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);278279 #[derive(AbiCoder, PartialEq, Debug)]280 struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);281282 /// Some docs283 /// At multi284 /// line285 #[derive(AbiCoder, PartialEq, Debug)]286 struct TupleStruct3DerivedMixedParam(287 /// Docs for A288 /// multi289 /// line290 TupleStruct1SimpleParam,291 /// Docs for B292 TupleStruct2DynamicParam,293 /// Docs for C294 TupleStruct2MixedParam,295 );296297 #[test]298 #[cfg(feature = "stubgen")]299 fn struct_collect_TupleStruct3DerivedMixedParam() {300 assert_eq!(301 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),302 "TupleStruct3DerivedMixedParam"303 );304 assert_eq!(305 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),306 r#"/// @dev Some docs307/// At multi308/// line309struct TupleStruct3DerivedMixedParam {310 /// @dev Docs for A311 /// multi312 /// line313 TupleStruct1SimpleParam field0;314 /// @dev Docs for B315 TupleStruct2DynamicParam field1;316 /// @dev Docs for C317 TupleStruct2MixedParam field2;318}319"#320 );321 }322323 #[test]324 fn impl_abi_type_signature_same_for_structs() {325 assert_eq!(326 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE327 .as_str()328 .unwrap(),329 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE330 .as_str()331 .unwrap()332 );333 assert_eq!(334 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE335 .as_str()336 .unwrap(),337 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE338 .as_str()339 .unwrap()340 );341 assert_eq!(342 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE343 .as_str()344 .unwrap(),345 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE346 .as_str()347 .unwrap()348 );349 assert_eq!(350 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE351 .as_str()352 .unwrap(),353 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE354 .as_str()355 .unwrap()356 );357 assert_eq!(358 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE359 .as_str()360 .unwrap(),361 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE362 .as_str()363 .unwrap(),364 );365 assert_eq!(366 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE367 .as_str()368 .unwrap(),369 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE370 .as_str()371 .unwrap(),372 );373 assert_eq!(374 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE375 .as_str()376 .unwrap(),377 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE378 .as_str()379 .unwrap(),380 );381 assert_eq!(382 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE383 .as_str()384 .unwrap(),385 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE386 .as_str()387 .unwrap(),388 );389 assert_eq!(390 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE391 .as_str()392 .unwrap(),393 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE394 .as_str()395 .unwrap(),396 );397 assert_eq!(398 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE399 .as_str()400 .unwrap(),401 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE402 .as_str()403 .unwrap(),404 );405 }406407 #[test]408 fn impl_abi_type_is_dynamic_same_for_structs() {409 assert_eq!(410 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),411 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic()412 );413 assert_eq!(414 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),415 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic()416 );417 assert_eq!(418 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),419 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic()420 );421 assert_eq!(422 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),423 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic()424 );425 assert_eq!(426 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),427 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic()428 );429 assert_eq!(430 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),431 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()432 );433 assert_eq!(434 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),435 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()436 );437 assert_eq!(438 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),439 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()440 );441 assert_eq!(442 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),443 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()444 );445 assert_eq!(446 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),447 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic()448 );449 }450451 #[test]452 fn impl_abi_type_size_same_for_structs() {453 assert_eq!(454 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),455 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::size()456 );457 assert_eq!(458 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),459 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::size()460 );461 assert_eq!(462 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),463 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::size()464 );465 assert_eq!(466 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),467 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::size()468 );469 assert_eq!(470 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),471 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::size()472 );473 assert_eq!(474 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),475 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size()476 );477 assert_eq!(478 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),479 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size()480 );481 assert_eq!(482 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),483 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size()484 );485 assert_eq!(486 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),487 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size()488 );489 assert_eq!(490 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),491 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size()492 );493 }494495 const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;496497 fn test_impl<Tuple, TupleStruct, TypeStruct>(498 tuple_data: Tuple,499 tuple_struct_data: TupleStruct,500 type_struct_data: TypeStruct,501 ) where502 TypeStruct: evm_coder::abi::AbiWrite503 + evm_coder::abi::AbiRead504 + std::cmp::PartialEq505 + std::fmt::Debug,506 TupleStruct: evm_coder::abi::AbiWrite507 + evm_coder::abi::AbiRead508 + std::cmp::PartialEq509 + std::fmt::Debug,510 Tuple: evm_coder::abi::AbiWrite511 + evm_coder::abi::AbiRead512 + std::cmp::PartialEq513 + std::fmt::Debug,514 {515 let encoded_type_struct = test_abi_write_impl(&type_struct_data);516 let encoded_tuple_struct = test_abi_write_impl(&tuple_struct_data);517 let encoded_tuple = test_abi_write_impl(&tuple_data);518519 similar_asserts::assert_eq!(encoded_tuple, encoded_type_struct);520 similar_asserts::assert_eq!(encoded_tuple, encoded_tuple_struct);521522 {523 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();524 let restored_struct_data = <TypeStruct>::abi_read(&mut decoder).unwrap();525 assert_eq!(restored_struct_data, type_struct_data);526 }527 {528 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();529 let restored_struct_data = <TupleStruct>::abi_read(&mut decoder).unwrap();530 assert_eq!(restored_struct_data, tuple_struct_data);531 }532533 {534 let (_, mut decoder) =535 evm_coder::abi::AbiReader::new_call(&encoded_type_struct).unwrap();536 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();537 assert_eq!(restored_tuple_data, tuple_data);538 }539 {540 let (_, mut decoder) =541 evm_coder::abi::AbiReader::new_call(&encoded_tuple_struct).unwrap();542 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();543 assert_eq!(restored_tuple_data, tuple_data);544 }545 }546547 fn test_abi_write_impl<A>(data: &A) -> Vec<u8>548 where549 A: evm_coder::abi::AbiWrite550 + evm_coder::abi::AbiRead551 + std::cmp::PartialEq552 + std::fmt::Debug,553 {554 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);555 data.abi_write(&mut writer);556 let encoded_tuple = writer.finish();557 encoded_tuple558 }559560 #[test]561 fn codec_struct_1_simple() {562 let _a = 0xff;563 test_impl::<(u8,), TupleStruct1SimpleParam, TypeStruct1SimpleParam>(564 (_a,),565 TupleStruct1SimpleParam(_a),566 TypeStruct1SimpleParam { _a },567 );568 }569570 #[test]571 fn codec_struct_1_dynamic() {572 let _a: String = "some string".into();573 test_impl::<(String,), TupleStruct1DynamicParam, TypeStruct1DynamicParam>(574 (_a.clone(),),575 TupleStruct1DynamicParam(_a.clone()),576 TypeStruct1DynamicParam { _a },577 );578 }579580 #[test]581 fn codec_struct_1_derived_simple() {582 let _a: u8 = 0xff;583 test_impl::<((u8,),), TupleStruct1DerivedSimpleParam, TypeStruct1DerivedSimpleParam>(584 ((_a,),),585 TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam(_a)),586 TypeStruct1DerivedSimpleParam {587 _a: TypeStruct1SimpleParam { _a },588 },589 );590 }591592 #[test]593 fn codec_struct_1_derived_dynamic() {594 let _a: String = "some string".into();595 test_impl::<((String,),), TupleStruct1DerivedDynamicParam, TypeStruct1DerivedDynamicParam>(596 ((_a.clone(),),),597 TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam(_a.clone())),598 TypeStruct1DerivedDynamicParam {599 _a: TypeStruct1DynamicParam { _a },600 },601 );602 }603604 #[test]605 fn codec_struct_2_simple() {606 let _a = 0xff;607 let _b = 0xbeefbaba;608 test_impl::<(u8, u32), TupleStruct2SimpleParam, TypeStruct2SimpleParam>(609 (_a, _b),610 TupleStruct2SimpleParam(_a, _b),611 TypeStruct2SimpleParam { _a, _b },612 );613 }614615 #[test]616 fn codec_struct_2_dynamic() {617 let _a: String = "some string".into();618 let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);619 test_impl::<(String, bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(620 (_a.clone(), _b.clone()),621 TupleStruct2DynamicParam(_a.clone(), _b.clone()),622 TypeStruct2DynamicParam { _a, _b },623 );624 }625626 #[test]627 fn codec_struct_2_mixed() {628 let _a: u8 = 0xff;629 let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);630 test_impl::<(u8, bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(631 (_a.clone(), _b.clone()),632 TupleStruct2MixedParam(_a.clone(), _b.clone()),633 TypeStruct2MixedParam { _a, _b },634 );635 }636637 #[test]638 fn codec_struct_2_derived_simple() {639 let _a = 0xff;640 let _b = 0xbeefbaba;641 test_impl::<642 ((u8,), (u8, u32)),643 TupleStruct2DerivedSimpleParam,644 TypeStruct2DerivedSimpleParam,645 >(646 ((_a,), (_a, _b)),647 TupleStruct2DerivedSimpleParam(648 TupleStruct1SimpleParam(_a),649 TupleStruct2SimpleParam(_a, _b),650 ),651 TypeStruct2DerivedSimpleParam {652 _a: TypeStruct1SimpleParam { _a },653 _b: TypeStruct2SimpleParam { _a, _b },654 },655 );656 }657658 #[test]659 fn codec_struct_2_derived_dynamic() {660 let _a = "some string".to_string();661 let _b = bytes(vec![0x11, 0x22, 0x33]);662 test_impl::<663 ((String,), (String, bytes)),664 TupleStruct2DerivedDynamicParam,665 TypeStruct2DerivedDynamicParam,666 >(667 ((_a.clone(),), (_a.clone(), _b.clone())),668 TupleStruct2DerivedDynamicParam(669 TupleStruct1DynamicParam(_a.clone()),670 TupleStruct2DynamicParam(_a.clone(), _b.clone()),671 ),672 TypeStruct2DerivedDynamicParam {673 _a: TypeStruct1DynamicParam { _a: _a.clone() },674 _b: TypeStruct2DynamicParam { _a, _b },675 },676 );677 }678679 #[test]680 fn codec_struct_3_derived_mixed() {681 let int = 0xff;682 let by = bytes(vec![0x11, 0x22, 0x33]);683 let string = "some string".to_string();684 test_impl::<685 ((u8,), (String, bytes), (u8, bytes)),686 TupleStruct3DerivedMixedParam,687 TypeStruct3DerivedMixedParam,688 >(689 ((int,), (string.clone(), by.clone()), (int, by.clone())),690 TupleStruct3DerivedMixedParam(691 TupleStruct1SimpleParam(int),692 TupleStruct2DynamicParam(string.clone(), by.clone()),693 TupleStruct2MixedParam(int, by.clone()),694 ),695 TypeStruct3DerivedMixedParam {696 _a: TypeStruct1SimpleParam { _a: int },697 _b: TypeStruct2DynamicParam {698 _a: string.clone(),699 _b: by.clone(),700 },701 _c: TypeStruct2MixedParam { _a: int, _b: by },702 },703 );704 }705706 #[derive(AbiCoder, PartialEq, Debug)]707 struct TypeStruct2SimpleStruct1Simple {708 _a: TypeStruct2SimpleParam,709 _b: TypeStruct2SimpleParam,710 _c: u8,711 }712 #[derive(AbiCoder, PartialEq, Debug)]713 struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);714715 #[test]716 fn codec_struct_2_struct_simple_1_simple() {717 let _a = 0xff;718 let _b = 0xbeefbaba;719 test_impl::<720 ((u8, u32), (u8, u32), u8),721 TupleStruct2SimpleStruct1Simple,722 TypeStruct2SimpleStruct1Simple,723 >(724 ((_a, _b), (_a, _b), _a),725 TupleStruct2SimpleStruct1Simple(726 TupleStruct2SimpleParam(_a, _b),727 TupleStruct2SimpleParam(_a, _b),728 _a,729 ),730 TypeStruct2SimpleStruct1Simple {731 _a: TypeStruct2SimpleParam { _a, _b },732 _b: TypeStruct2SimpleParam { _a, _b },733 _c: _a,734 },735 );736 }737}