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_struct_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 62 63 64 #[derive(AbiCoder, PartialEq, Debug)]65 struct TypeStruct3DerivedMixedParam {66 67 68 69 _a: TypeStruct1SimpleParam,70 71 _b: TypeStruct2DynamicParam,72 73 _c: TypeStruct2MixedParam,74 }7576 #[test]77 #[cfg(feature = "stubgen")]78 fn struct_collect_type_struct3_derived_mixed_param() {79 assert_eq!(80 <TypeStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),81 "TypeStruct3DerivedMixedParam"82 );83 similar_asserts::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 #[cfg(feature = "stubgen")]104 fn struct_collect_vec() {105 assert_eq!(106 <Vec<u8> as ::evm_coder::solidity::StructCollect>::name(),107 "uint8[]"108 );109 }110111 #[test]112 fn impl_abi_type_signature() {113 assert_eq!(114 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE115 .as_str()116 .unwrap(),117 "(uint8)"118 );119 assert_eq!(120 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE121 .as_str()122 .unwrap(),123 "(string)"124 );125 assert_eq!(126 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE127 .as_str()128 .unwrap(),129 "(uint8,uint32)"130 );131 assert_eq!(132 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE133 .as_str()134 .unwrap(),135 "(string,bytes)"136 );137 assert_eq!(138 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE139 .as_str()140 .unwrap(),141 "(uint8,bytes)"142 );143 assert_eq!(144 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE145 .as_str()146 .unwrap(),147 "((uint8))"148 );149 assert_eq!(150 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE151 .as_str()152 .unwrap(),153 "((uint8),(uint8,uint32))"154 );155 assert_eq!(156 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE157 .as_str()158 .unwrap(),159 "((string))"160 );161 assert_eq!(162 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE163 .as_str()164 .unwrap(),165 "((string),(string,bytes))"166 );167 assert_eq!(168 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE169 .as_str()170 .unwrap(),171 "((uint8),(string,bytes),(uint8,bytes))"172 );173 }174175 #[test]176 fn impl_abi_type_is_dynamic() {177 assert_eq!(178 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),179 false180 );181 assert_eq!(182 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),183 true184 );185 assert_eq!(186 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),187 false188 );189 assert_eq!(190 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),191 true192 );193 assert_eq!(194 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),195 true196 );197 assert_eq!(198 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),199 false200 );201 assert_eq!(202 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),203 false204 );205 assert_eq!(206 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),207 true208 );209 assert_eq!(210 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),211 true212 );213 assert_eq!(214 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),215 true216 );217 }218219 #[test]220 fn impl_abi_type_size() {221 const ABI_ALIGNMENT: usize = 32;222 assert_eq!(223 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),224 ABI_ALIGNMENT225 );226 assert_eq!(227 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),228 ABI_ALIGNMENT229 );230 assert_eq!(231 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),232 ABI_ALIGNMENT * 2233 );234 assert_eq!(235 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),236 ABI_ALIGNMENT * 2237 );238 assert_eq!(239 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),240 ABI_ALIGNMENT * 2241 );242 assert_eq!(243 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),244 ABI_ALIGNMENT245 );246 assert_eq!(247 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),248 ABI_ALIGNMENT * 3249 );250 assert_eq!(251 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),252 ABI_ALIGNMENT253 );254 assert_eq!(255 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),256 ABI_ALIGNMENT * 3257 );258 assert_eq!(259 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),260 ABI_ALIGNMENT * 5261 );262 }263264 #[derive(AbiCoder, PartialEq, Debug)]265 struct TupleStruct1SimpleParam(u8);266267 #[derive(AbiCoder, PartialEq, Debug)]268 struct TupleStruct1DynamicParam(String);269270 #[derive(AbiCoder, PartialEq, Debug)]271 struct TupleStruct2SimpleParam(u8, u32);272273 #[derive(AbiCoder, PartialEq, Debug)]274 struct TupleStruct2DynamicParam(String, bytes);275276 #[derive(AbiCoder, PartialEq, Debug)]277 struct TupleStruct2MixedParam(u8, bytes);278279 #[derive(AbiCoder, PartialEq, Debug)]280 struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);281282 #[derive(AbiCoder, PartialEq, Debug)]283 struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);284285 #[derive(AbiCoder, PartialEq, Debug)]286 struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);287288 #[derive(AbiCoder, PartialEq, Debug)]289 struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);290291 292 293 294 #[derive(AbiCoder, PartialEq, Debug)]295 struct TupleStruct3DerivedMixedParam(296 297 298 299 TupleStruct1SimpleParam,300 TupleStruct2DynamicParam,301 302 TupleStruct2MixedParam,303 );304305 #[test]306 #[cfg(feature = "stubgen")]307 fn struct_collect_tuple_struct3_derived_mixed_param() {308 assert_eq!(309 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::name(),310 "TupleStruct3DerivedMixedParam"311 );312 similar_asserts::assert_eq!(313 <TupleStruct3DerivedMixedParam as ::evm_coder::solidity::StructCollect>::declaration(),314 r#"/// @dev Some docs315/// At multi316/// line317struct TupleStruct3DerivedMixedParam {318 /// @dev Docs for A319 /// multi320 /// line321 TupleStruct1SimpleParam field0;322 TupleStruct2DynamicParam field1;323 /// @dev Docs for C324 TupleStruct2MixedParam field2;325}326"#327 );328 }329330 #[test]331 fn impl_abi_type_signature_same_for_structs() {332 assert_eq!(333 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE334 .as_str()335 .unwrap(),336 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE337 .as_str()338 .unwrap()339 );340 assert_eq!(341 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE342 .as_str()343 .unwrap(),344 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE345 .as_str()346 .unwrap()347 );348 assert_eq!(349 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE350 .as_str()351 .unwrap(),352 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE353 .as_str()354 .unwrap()355 );356 assert_eq!(357 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE358 .as_str()359 .unwrap(),360 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE361 .as_str()362 .unwrap()363 );364 assert_eq!(365 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE366 .as_str()367 .unwrap(),368 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE369 .as_str()370 .unwrap(),371 );372 assert_eq!(373 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE374 .as_str()375 .unwrap(),376 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE377 .as_str()378 .unwrap(),379 );380 assert_eq!(381 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE382 .as_str()383 .unwrap(),384 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE385 .as_str()386 .unwrap(),387 );388 assert_eq!(389 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE390 .as_str()391 .unwrap(),392 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE393 .as_str()394 .unwrap(),395 );396 assert_eq!(397 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE398 .as_str()399 .unwrap(),400 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE401 .as_str()402 .unwrap(),403 );404 assert_eq!(405 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE406 .as_str()407 .unwrap(),408 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE409 .as_str()410 .unwrap(),411 );412 }413414 #[test]415 fn impl_abi_type_is_dynamic_same_for_structs() {416 assert_eq!(417 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),418 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic()419 );420 assert_eq!(421 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),422 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic()423 );424 assert_eq!(425 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),426 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic()427 );428 assert_eq!(429 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),430 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic()431 );432 assert_eq!(433 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),434 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic()435 );436 assert_eq!(437 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),438 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()439 );440 assert_eq!(441 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),442 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()443 );444 assert_eq!(445 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),446 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()447 );448 assert_eq!(449 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),450 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()451 );452 assert_eq!(453 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),454 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic()455 );456 }457458 #[test]459 fn impl_abi_type_size_same_for_structs() {460 assert_eq!(461 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),462 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::size()463 );464 assert_eq!(465 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),466 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::size()467 );468 assert_eq!(469 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),470 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::size()471 );472 assert_eq!(473 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),474 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::size()475 );476 assert_eq!(477 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),478 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::size()479 );480 assert_eq!(481 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),482 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size()483 );484 assert_eq!(485 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),486 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size()487 );488 assert_eq!(489 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),490 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size()491 );492 assert_eq!(493 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),494 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size()495 );496 assert_eq!(497 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),498 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size()499 );500 }501502 const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;503504 fn test_impl<Tuple, TupleStruct, TypeStruct>(505 tuple_data: Tuple,506 tuple_struct_data: TupleStruct,507 type_struct_data: TypeStruct,508 ) where509 TypeStruct: evm_coder::abi::AbiWrite510 + evm_coder::abi::AbiRead511 + std::cmp::PartialEq512 + std::fmt::Debug,513 TupleStruct: evm_coder::abi::AbiWrite514 + evm_coder::abi::AbiRead515 + std::cmp::PartialEq516 + std::fmt::Debug,517 Tuple: evm_coder::abi::AbiWrite518 + evm_coder::abi::AbiRead519 + std::cmp::PartialEq520 + std::fmt::Debug,521 {522 let encoded_type_struct = test_abi_write_impl(&type_struct_data);523 let encoded_tuple_struct = test_abi_write_impl(&tuple_struct_data);524 let encoded_tuple = test_abi_write_impl(&tuple_data);525526 similar_asserts::assert_eq!(encoded_tuple, encoded_type_struct);527 similar_asserts::assert_eq!(encoded_tuple, encoded_tuple_struct);528529 {530 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();531 let restored_struct_data = <TypeStruct>::abi_read(&mut decoder).unwrap();532 assert_eq!(restored_struct_data, type_struct_data);533 }534 {535 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();536 let restored_struct_data = <TupleStruct>::abi_read(&mut decoder).unwrap();537 assert_eq!(restored_struct_data, tuple_struct_data);538 }539540 {541 let (_, mut decoder) =542 evm_coder::abi::AbiReader::new_call(&encoded_type_struct).unwrap();543 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();544 assert_eq!(restored_tuple_data, tuple_data);545 }546 {547 let (_, mut decoder) =548 evm_coder::abi::AbiReader::new_call(&encoded_tuple_struct).unwrap();549 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();550 assert_eq!(restored_tuple_data, tuple_data);551 }552 }553554 fn test_abi_write_impl<A>(data: &A) -> Vec<u8>555 where556 A: evm_coder::abi::AbiWrite557 + evm_coder::abi::AbiRead558 + std::cmp::PartialEq559 + std::fmt::Debug,560 {561 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);562 data.abi_write(&mut writer);563 let encoded_tuple = writer.finish();564 encoded_tuple565 }566567 #[test]568 fn codec_struct_1_simple() {569 let _a = 0xff;570 test_impl::<(u8,), TupleStruct1SimpleParam, TypeStruct1SimpleParam>(571 (_a,),572 TupleStruct1SimpleParam(_a),573 TypeStruct1SimpleParam { _a },574 );575 }576577 #[test]578 fn codec_struct_1_dynamic() {579 let _a: String = "some string".into();580 test_impl::<(String,), TupleStruct1DynamicParam, TypeStruct1DynamicParam>(581 (_a.clone(),),582 TupleStruct1DynamicParam(_a.clone()),583 TypeStruct1DynamicParam { _a },584 );585 }586587 #[test]588 fn codec_struct_1_derived_simple() {589 let _a: u8 = 0xff;590 test_impl::<((u8,),), TupleStruct1DerivedSimpleParam, TypeStruct1DerivedSimpleParam>(591 ((_a,),),592 TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam(_a)),593 TypeStruct1DerivedSimpleParam {594 _a: TypeStruct1SimpleParam { _a },595 },596 );597 }598599 #[test]600 fn codec_struct_1_derived_dynamic() {601 let _a: String = "some string".into();602 test_impl::<((String,),), TupleStruct1DerivedDynamicParam, TypeStruct1DerivedDynamicParam>(603 ((_a.clone(),),),604 TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam(_a.clone())),605 TypeStruct1DerivedDynamicParam {606 _a: TypeStruct1DynamicParam { _a },607 },608 );609 }610611 #[test]612 fn codec_struct_2_simple() {613 let _a = 0xff;614 let _b = 0xbeefbaba;615 test_impl::<(u8, u32), TupleStruct2SimpleParam, TypeStruct2SimpleParam>(616 (_a, _b),617 TupleStruct2SimpleParam(_a, _b),618 TypeStruct2SimpleParam { _a, _b },619 );620 }621622 #[test]623 fn codec_struct_2_dynamic() {624 let _a: String = "some string".into();625 let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);626 test_impl::<(String, bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(627 (_a.clone(), _b.clone()),628 TupleStruct2DynamicParam(_a.clone(), _b.clone()),629 TypeStruct2DynamicParam { _a, _b },630 );631 }632633 #[test]634 fn codec_struct_2_mixed() {635 let _a: u8 = 0xff;636 let _b: bytes = bytes(vec![0x11, 0x22, 0x33]);637 test_impl::<(u8, bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(638 (_a.clone(), _b.clone()),639 TupleStruct2MixedParam(_a.clone(), _b.clone()),640 TypeStruct2MixedParam { _a, _b },641 );642 }643644 #[test]645 fn codec_struct_2_derived_simple() {646 let _a = 0xff;647 let _b = 0xbeefbaba;648 test_impl::<649 ((u8,), (u8, u32)),650 TupleStruct2DerivedSimpleParam,651 TypeStruct2DerivedSimpleParam,652 >(653 ((_a,), (_a, _b)),654 TupleStruct2DerivedSimpleParam(655 TupleStruct1SimpleParam(_a),656 TupleStruct2SimpleParam(_a, _b),657 ),658 TypeStruct2DerivedSimpleParam {659 _a: TypeStruct1SimpleParam { _a },660 _b: TypeStruct2SimpleParam { _a, _b },661 },662 );663 }664665 #[test]666 fn codec_struct_2_derived_dynamic() {667 let _a = "some string".to_string();668 let _b = bytes(vec![0x11, 0x22, 0x33]);669 test_impl::<670 ((String,), (String, bytes)),671 TupleStruct2DerivedDynamicParam,672 TypeStruct2DerivedDynamicParam,673 >(674 ((_a.clone(),), (_a.clone(), _b.clone())),675 TupleStruct2DerivedDynamicParam(676 TupleStruct1DynamicParam(_a.clone()),677 TupleStruct2DynamicParam(_a.clone(), _b.clone()),678 ),679 TypeStruct2DerivedDynamicParam {680 _a: TypeStruct1DynamicParam { _a: _a.clone() },681 _b: TypeStruct2DynamicParam { _a, _b },682 },683 );684 }685686 #[test]687 fn codec_struct_3_derived_mixed() {688 let int = 0xff;689 let by = bytes(vec![0x11, 0x22, 0x33]);690 let string = "some string".to_string();691 test_impl::<692 ((u8,), (String, bytes), (u8, bytes)),693 TupleStruct3DerivedMixedParam,694 TypeStruct3DerivedMixedParam,695 >(696 ((int,), (string.clone(), by.clone()), (int, by.clone())),697 TupleStruct3DerivedMixedParam(698 TupleStruct1SimpleParam(int),699 TupleStruct2DynamicParam(string.clone(), by.clone()),700 TupleStruct2MixedParam(int, by.clone()),701 ),702 TypeStruct3DerivedMixedParam {703 _a: TypeStruct1SimpleParam { _a: int },704 _b: TypeStruct2DynamicParam {705 _a: string.clone(),706 _b: by.clone(),707 },708 _c: TypeStruct2MixedParam { _a: int, _b: by },709 },710 );711 }712713 #[derive(AbiCoder, PartialEq, Debug)]714 struct TypeStruct2SimpleStruct1Simple {715 _a: TypeStruct2SimpleParam,716 _b: TypeStruct2SimpleParam,717 _c: u8,718 }719 #[derive(AbiCoder, PartialEq, Debug)]720 struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);721722 #[test]723 fn codec_struct_2_struct_simple_1_simple() {724 let _a = 0xff;725 let _b = 0xbeefbaba;726 test_impl::<727 ((u8, u32), (u8, u32), u8),728 TupleStruct2SimpleStruct1Simple,729 TypeStruct2SimpleStruct1Simple,730 >(731 ((_a, _b), (_a, _b), _a),732 TupleStruct2SimpleStruct1Simple(733 TupleStruct2SimpleParam(_a, _b),734 TupleStruct2SimpleParam(_a, _b),735 _a,736 ),737 TypeStruct2SimpleStruct1Simple {738 _a: TypeStruct2SimpleParam { _a, _b },739 _b: TypeStruct2SimpleParam { _a, _b },740 _c: _a,741 },742 );743 }744}745746mod test_enum {747 use evm_coder::AbiCoder;748749 750 751 752 #[derive(AbiCoder, Debug, PartialEq, Default, Clone, Copy)]753 #[repr(u8)]754 enum Color {755 756 757 758 Red,759 Green,760 761 #[default]762 Blue,763 }764765 #[test]766 fn empty() {}767768 #[test]769 fn bad_enums() {770 let t = trybuild::TestCases::new();771 t.compile_fail("tests/build_failed/abi_derive_enum_generation.rs");772 }773774 #[test]775 fn impl_abi_type_signature_same_for_structs() {776 assert_eq!(777 <Color as evm_coder::abi::AbiType>::SIGNATURE778 .as_str()779 .unwrap(),780 <u8 as evm_coder::abi::AbiType>::SIGNATURE.as_str().unwrap()781 );782 }783784 #[test]785 fn impl_abi_type_is_dynamic_same_for_structs() {786 assert_eq!(787 <Color as evm_coder::abi::AbiType>::is_dynamic(),788 <u8 as evm_coder::abi::AbiType>::is_dynamic()789 );790 }791792 #[test]793 fn impl_abi_type_size_same_for_structs() {794 assert_eq!(795 <Color as evm_coder::abi::AbiType>::size(),796 <u8 as evm_coder::abi::AbiType>::size()797 );798 }799800 #[test]801 fn test_coder() {802 const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;803804 let encoded_enum = {805 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);806 <Color as evm_coder::abi::AbiWrite>::abi_write(&Color::Green, &mut writer);807 writer.finish()808 };809810 let encoded_u8 = {811 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);812 <u8 as evm_coder::abi::AbiWrite>::abi_write(&(Color::Green as u8), &mut writer);813 writer.finish()814 };815816 similar_asserts::assert_eq!(encoded_enum, encoded_u8);817818 {819 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_enum).unwrap();820 let restored_enum_data =821 <Color as evm_coder::abi::AbiRead>::abi_read(&mut decoder).unwrap();822 assert_eq!(restored_enum_data, Color::Green);823 }824 }825826 #[test]827 #[cfg(feature = "stubgen")]828 fn struct_collect_enum() {829 assert_eq!(830 <Color as ::evm_coder::solidity::StructCollect>::name(),831 "Color"832 );833 similar_asserts::assert_eq!(834 <Color as ::evm_coder::solidity::StructCollect>::declaration(),835 r#"/// @dev Some docs836/// At multi837/// line838enum Color {839 /// @dev Docs for Red840 /// multi841 /// line842 Red,843 Green,844 /// @dev Docs for Blue845 Blue846}847"#848 );849 }850}