1use 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}5960616263#[derive(AbiCoder, PartialEq, Debug)]64struct TypeStruct3DerivedMixedParam {65 66 67 68 _a: TypeStruct1SimpleParam,69 70 _b: TypeStruct2DynamicParam,71 72 _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}