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 fn impl_abi_type_signature() {78 assert_eq!(79 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE80 .as_str()81 .unwrap(),82 "(uint8)"83 );84 assert_eq!(85 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE86 .as_str()87 .unwrap(),88 "(string)"89 );90 assert_eq!(91 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE92 .as_str()93 .unwrap(),94 "(uint8,uint32)"95 );96 assert_eq!(97 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE98 .as_str()99 .unwrap(),100 "(string,bytes)"101 );102 assert_eq!(103 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE104 .as_str()105 .unwrap(),106 "(uint8,bytes)"107 );108 assert_eq!(109 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE110 .as_str()111 .unwrap(),112 "((uint8))"113 );114 assert_eq!(115 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE116 .as_str()117 .unwrap(),118 "((uint8),(uint8,uint32))"119 );120 assert_eq!(121 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE122 .as_str()123 .unwrap(),124 "((string))"125 );126 assert_eq!(127 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE128 .as_str()129 .unwrap(),130 "((string),(string,bytes))"131 );132 assert_eq!(133 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE134 .as_str()135 .unwrap(),136 "((uint8),(string,bytes),(uint8,bytes))"137 );138 }139140 #[test]141 fn impl_abi_type_is_dynamic() {142 assert_eq!(143 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),144 false145 );146 assert_eq!(147 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),148 true149 );150 assert_eq!(151 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),152 false153 );154 assert_eq!(155 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),156 true157 );158 assert_eq!(159 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),160 true161 );162 assert_eq!(163 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),164 false165 );166 assert_eq!(167 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),168 false169 );170 assert_eq!(171 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),172 true173 );174 assert_eq!(175 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),176 true177 );178 assert_eq!(179 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),180 true181 );182 }183184 #[test]185 fn impl_abi_type_size() {186 const ABI_ALIGNMENT: usize = 32;187 assert_eq!(188 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),189 ABI_ALIGNMENT190 );191 assert_eq!(192 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),193 ABI_ALIGNMENT194 );195 assert_eq!(196 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),197 ABI_ALIGNMENT * 2198 );199 assert_eq!(200 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),201 ABI_ALIGNMENT * 2202 );203 assert_eq!(204 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),205 ABI_ALIGNMENT * 2206 );207 assert_eq!(208 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),209 ABI_ALIGNMENT210 );211 assert_eq!(212 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),213 ABI_ALIGNMENT * 3214 );215 assert_eq!(216 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),217 ABI_ALIGNMENT218 );219 assert_eq!(220 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),221 ABI_ALIGNMENT * 3222 );223 assert_eq!(224 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),225 ABI_ALIGNMENT * 5226 );227 }228229 #[derive(AbiCoder, PartialEq, Debug)]230 struct TupleStruct1SimpleParam(u8);231232 #[derive(AbiCoder, PartialEq, Debug)]233 struct TupleStruct1DynamicParam(String);234235 #[derive(AbiCoder, PartialEq, Debug)]236 struct TupleStruct2SimpleParam(u8, u32);237238 #[derive(AbiCoder, PartialEq, Debug)]239 struct TupleStruct2DynamicParam(String, Bytes);240241 #[derive(AbiCoder, PartialEq, Debug)]242 struct TupleStruct2MixedParam(u8, Bytes);243244 #[derive(AbiCoder, PartialEq, Debug)]245 struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);246247 #[derive(AbiCoder, PartialEq, Debug)]248 struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);249250 #[derive(AbiCoder, PartialEq, Debug)]251 struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);252253 #[derive(AbiCoder, PartialEq, Debug)]254 struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);255256 257 258 259 #[derive(AbiCoder, PartialEq, Debug)]260 struct TupleStruct3DerivedMixedParam(261 262 263 264 TupleStruct1SimpleParam,265 TupleStruct2DynamicParam,266 267 TupleStruct2MixedParam,268 );269270 #[test]271 fn impl_abi_type_signature_same_for_structs() {272 assert_eq!(273 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE274 .as_str()275 .unwrap(),276 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::SIGNATURE277 .as_str()278 .unwrap()279 );280 assert_eq!(281 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE282 .as_str()283 .unwrap(),284 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::SIGNATURE285 .as_str()286 .unwrap()287 );288 assert_eq!(289 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE290 .as_str()291 .unwrap(),292 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::SIGNATURE293 .as_str()294 .unwrap()295 );296 assert_eq!(297 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE298 .as_str()299 .unwrap(),300 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::SIGNATURE301 .as_str()302 .unwrap()303 );304 assert_eq!(305 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE306 .as_str()307 .unwrap(),308 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::SIGNATURE309 .as_str()310 .unwrap(),311 );312 assert_eq!(313 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE314 .as_str()315 .unwrap(),316 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE317 .as_str()318 .unwrap(),319 );320 assert_eq!(321 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE322 .as_str()323 .unwrap(),324 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::SIGNATURE325 .as_str()326 .unwrap(),327 );328 assert_eq!(329 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE330 .as_str()331 .unwrap(),332 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE333 .as_str()334 .unwrap(),335 );336 assert_eq!(337 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE338 .as_str()339 .unwrap(),340 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::SIGNATURE341 .as_str()342 .unwrap(),343 );344 assert_eq!(345 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE346 .as_str()347 .unwrap(),348 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::SIGNATURE349 .as_str()350 .unwrap(),351 );352 }353354 #[test]355 fn impl_abi_type_is_dynamic_same_for_structs() {356 assert_eq!(357 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),358 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::is_dynamic()359 );360 assert_eq!(361 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),362 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::is_dynamic()363 );364 assert_eq!(365 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic(),366 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::is_dynamic()367 );368 assert_eq!(369 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic(),370 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::is_dynamic()371 );372 assert_eq!(373 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic(),374 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::is_dynamic()375 );376 assert_eq!(377 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),378 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()379 );380 assert_eq!(381 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic(),382 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::is_dynamic()383 );384 assert_eq!(385 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),386 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()387 );388 assert_eq!(389 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic(),390 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::is_dynamic()391 );392 assert_eq!(393 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic(),394 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::is_dynamic()395 );396 }397398 #[test]399 fn impl_abi_type_size_same_for_structs() {400 assert_eq!(401 <TypeStruct1SimpleParam as evm_coder::abi::AbiType>::size(),402 <TupleStruct1SimpleParam as evm_coder::abi::AbiType>::size()403 );404 assert_eq!(405 <TypeStruct1DynamicParam as evm_coder::abi::AbiType>::size(),406 <TupleStruct1DynamicParam as evm_coder::abi::AbiType>::size()407 );408 assert_eq!(409 <TypeStruct2SimpleParam as evm_coder::abi::AbiType>::size(),410 <TupleStruct2SimpleParam as evm_coder::abi::AbiType>::size()411 );412 assert_eq!(413 <TypeStruct2DynamicParam as evm_coder::abi::AbiType>::size(),414 <TupleStruct2DynamicParam as evm_coder::abi::AbiType>::size()415 );416 assert_eq!(417 <TypeStruct2MixedParam as evm_coder::abi::AbiType>::size(),418 <TupleStruct2MixedParam as evm_coder::abi::AbiType>::size()419 );420 assert_eq!(421 <TypeStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size(),422 <TupleStruct1DerivedSimpleParam as evm_coder::abi::AbiType>::size()423 );424 assert_eq!(425 <TypeStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size(),426 <TupleStruct2DerivedSimpleParam as evm_coder::abi::AbiType>::size()427 );428 assert_eq!(429 <TypeStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size(),430 <TupleStruct1DerivedDynamicParam as evm_coder::abi::AbiType>::size()431 );432 assert_eq!(433 <TypeStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size(),434 <TupleStruct2DerivedDynamicParam as evm_coder::abi::AbiType>::size()435 );436 assert_eq!(437 <TypeStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size(),438 <TupleStruct3DerivedMixedParam as evm_coder::abi::AbiType>::size()439 );440 }441442 const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;443444 fn test_impl<Tuple, TupleStruct, TypeStruct>(445 tuple_data: Tuple,446 tuple_struct_data: TupleStruct,447 type_struct_data: TypeStruct,448 ) where449 TypeStruct: evm_coder::abi::AbiWrite450 + evm_coder::abi::AbiRead451 + std::cmp::PartialEq452 + std::fmt::Debug,453 TupleStruct: evm_coder::abi::AbiWrite454 + evm_coder::abi::AbiRead455 + std::cmp::PartialEq456 + std::fmt::Debug,457 Tuple: evm_coder::abi::AbiWrite458 + evm_coder::abi::AbiRead459 + std::cmp::PartialEq460 + std::fmt::Debug,461 {462 let encoded_type_struct = test_abi_write_impl(&type_struct_data);463 let encoded_tuple_struct = test_abi_write_impl(&tuple_struct_data);464 let encoded_tuple = test_abi_write_impl(&tuple_data);465466 similar_asserts::assert_eq!(encoded_tuple, encoded_type_struct);467 similar_asserts::assert_eq!(encoded_tuple, encoded_tuple_struct);468469 {470 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();471 let restored_struct_data = <TypeStruct>::abi_read(&mut decoder).unwrap();472 assert_eq!(restored_struct_data, type_struct_data);473 }474 {475 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_tuple).unwrap();476 let restored_struct_data = <TupleStruct>::abi_read(&mut decoder).unwrap();477 assert_eq!(restored_struct_data, tuple_struct_data);478 }479480 {481 let (_, mut decoder) =482 evm_coder::abi::AbiReader::new_call(&encoded_type_struct).unwrap();483 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();484 assert_eq!(restored_tuple_data, tuple_data);485 }486 {487 let (_, mut decoder) =488 evm_coder::abi::AbiReader::new_call(&encoded_tuple_struct).unwrap();489 let restored_tuple_data = <Tuple>::abi_read(&mut decoder).unwrap();490 assert_eq!(restored_tuple_data, tuple_data);491 }492 }493494 fn test_abi_write_impl<A>(data: &A) -> Vec<u8>495 where496 A: evm_coder::abi::AbiWrite497 + evm_coder::abi::AbiRead498 + std::cmp::PartialEq499 + std::fmt::Debug,500 {501 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);502 data.abi_write(&mut writer);503 let encoded_tuple = writer.finish();504 encoded_tuple505 }506507 #[test]508 fn codec_struct_1_simple() {509 let _a = 0xff;510 test_impl::<(u8,), TupleStruct1SimpleParam, TypeStruct1SimpleParam>(511 (_a,),512 TupleStruct1SimpleParam(_a),513 TypeStruct1SimpleParam { _a },514 );515 }516517 #[test]518 fn codec_struct_1_dynamic() {519 let _a: String = "some string".into();520 test_impl::<(String,), TupleStruct1DynamicParam, TypeStruct1DynamicParam>(521 (_a.clone(),),522 TupleStruct1DynamicParam(_a.clone()),523 TypeStruct1DynamicParam { _a },524 );525 }526527 #[test]528 fn codec_struct_1_derived_simple() {529 let _a: u8 = 0xff;530 test_impl::<((u8,),), TupleStruct1DerivedSimpleParam, TypeStruct1DerivedSimpleParam>(531 ((_a,),),532 TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam(_a)),533 TypeStruct1DerivedSimpleParam {534 _a: TypeStruct1SimpleParam { _a },535 },536 );537 }538539 #[test]540 fn codec_struct_1_derived_dynamic() {541 let _a: String = "some string".into();542 test_impl::<((String,),), TupleStruct1DerivedDynamicParam, TypeStruct1DerivedDynamicParam>(543 ((_a.clone(),),),544 TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam(_a.clone())),545 TypeStruct1DerivedDynamicParam {546 _a: TypeStruct1DynamicParam { _a },547 },548 );549 }550551 #[test]552 fn codec_struct_2_simple() {553 let _a = 0xff;554 let _b = 0xbeefbaba;555 test_impl::<(u8, u32), TupleStruct2SimpleParam, TypeStruct2SimpleParam>(556 (_a, _b),557 TupleStruct2SimpleParam(_a, _b),558 TypeStruct2SimpleParam { _a, _b },559 );560 }561562 #[test]563 fn codec_struct_2_dynamic() {564 let _a: String = "some string".into();565 let _b: Bytes = Bytes(vec![0x11, 0x22, 0x33]);566 test_impl::<(String, Bytes), TupleStruct2DynamicParam, TypeStruct2DynamicParam>(567 (_a.clone(), _b.clone()),568 TupleStruct2DynamicParam(_a.clone(), _b.clone()),569 TypeStruct2DynamicParam { _a, _b },570 );571 }572573 #[test]574 fn codec_struct_2_mixed() {575 let _a: u8 = 0xff;576 let _b: Bytes = Bytes(vec![0x11, 0x22, 0x33]);577 test_impl::<(u8, Bytes), TupleStruct2MixedParam, TypeStruct2MixedParam>(578 (_a.clone(), _b.clone()),579 TupleStruct2MixedParam(_a.clone(), _b.clone()),580 TypeStruct2MixedParam { _a, _b },581 );582 }583584 #[test]585 fn codec_struct_2_derived_simple() {586 let _a = 0xff;587 let _b = 0xbeefbaba;588 test_impl::<589 ((u8,), (u8, u32)),590 TupleStruct2DerivedSimpleParam,591 TypeStruct2DerivedSimpleParam,592 >(593 ((_a,), (_a, _b)),594 TupleStruct2DerivedSimpleParam(595 TupleStruct1SimpleParam(_a),596 TupleStruct2SimpleParam(_a, _b),597 ),598 TypeStruct2DerivedSimpleParam {599 _a: TypeStruct1SimpleParam { _a },600 _b: TypeStruct2SimpleParam { _a, _b },601 },602 );603 }604605 #[test]606 fn codec_struct_2_derived_dynamic() {607 let _a = "some string".to_string();608 let _b = Bytes(vec![0x11, 0x22, 0x33]);609 test_impl::<610 ((String,), (String, Bytes)),611 TupleStruct2DerivedDynamicParam,612 TypeStruct2DerivedDynamicParam,613 >(614 ((_a.clone(),), (_a.clone(), _b.clone())),615 TupleStruct2DerivedDynamicParam(616 TupleStruct1DynamicParam(_a.clone()),617 TupleStruct2DynamicParam(_a.clone(), _b.clone()),618 ),619 TypeStruct2DerivedDynamicParam {620 _a: TypeStruct1DynamicParam { _a: _a.clone() },621 _b: TypeStruct2DynamicParam { _a, _b },622 },623 );624 }625626 #[test]627 fn codec_struct_3_derived_mixed() {628 let int = 0xff;629 let by = Bytes(vec![0x11, 0x22, 0x33]);630 let string = "some string".to_string();631 test_impl::<632 ((u8,), (String, Bytes), (u8, Bytes)),633 TupleStruct3DerivedMixedParam,634 TypeStruct3DerivedMixedParam,635 >(636 ((int,), (string.clone(), by.clone()), (int, by.clone())),637 TupleStruct3DerivedMixedParam(638 TupleStruct1SimpleParam(int),639 TupleStruct2DynamicParam(string.clone(), by.clone()),640 TupleStruct2MixedParam(int, by.clone()),641 ),642 TypeStruct3DerivedMixedParam {643 _a: TypeStruct1SimpleParam { _a: int },644 _b: TypeStruct2DynamicParam {645 _a: string.clone(),646 _b: by.clone(),647 },648 _c: TypeStruct2MixedParam { _a: int, _b: by },649 },650 );651 }652653 #[derive(AbiCoder, PartialEq, Debug)]654 struct TypeStruct2SimpleStruct1Simple {655 _a: TypeStruct2SimpleParam,656 _b: TypeStruct2SimpleParam,657 _c: u8,658 }659 #[derive(AbiCoder, PartialEq, Debug)]660 struct TupleStruct2SimpleStruct1Simple(TupleStruct2SimpleParam, TupleStruct2SimpleParam, u8);661662 #[test]663 fn codec_struct_2_struct_simple_1_simple() {664 let _a = 0xff;665 let _b = 0xbeefbaba;666 test_impl::<667 ((u8, u32), (u8, u32), u8),668 TupleStruct2SimpleStruct1Simple,669 TypeStruct2SimpleStruct1Simple,670 >(671 ((_a, _b), (_a, _b), _a),672 TupleStruct2SimpleStruct1Simple(673 TupleStruct2SimpleParam(_a, _b),674 TupleStruct2SimpleParam(_a, _b),675 _a,676 ),677 TypeStruct2SimpleStruct1Simple {678 _a: TypeStruct2SimpleParam { _a, _b },679 _b: TypeStruct2SimpleParam { _a, _b },680 _c: _a,681 },682 );683 }684}685686mod test_enum {687 use evm_coder::AbiCoder;688689 690 691 692 #[derive(AbiCoder, Debug, PartialEq, Default, Clone, Copy)]693 #[repr(u8)]694 enum Color {695 696 697 698 Red,699 Green,700 701 #[default]702 Blue,703 }704705 #[test]706 fn empty() {}707708 #[test]709 fn bad_enums() {710 let t = trybuild::TestCases::new();711 t.compile_fail("tests/build_failed/abi_derive_enum_generation.rs");712 }713714 #[test]715 fn impl_abi_type_signature_same_for_structs() {716 assert_eq!(717 <Color as evm_coder::abi::AbiType>::SIGNATURE718 .as_str()719 .unwrap(),720 <u8 as evm_coder::abi::AbiType>::SIGNATURE.as_str().unwrap()721 );722 }723724 #[test]725 fn impl_abi_type_is_dynamic_same_for_structs() {726 assert_eq!(727 <Color as evm_coder::abi::AbiType>::is_dynamic(),728 <u8 as evm_coder::abi::AbiType>::is_dynamic()729 );730 }731732 #[test]733 fn impl_abi_type_size_same_for_structs() {734 assert_eq!(735 <Color as evm_coder::abi::AbiType>::size(),736 <u8 as evm_coder::abi::AbiType>::size()737 );738 }739740 #[test]741 fn test_coder() {742 const FUNCTION_IDENTIFIER: u32 = 0xdeadbeef;743744 let encoded_enum = {745 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);746 <Color as evm_coder::abi::AbiWrite>::abi_write(&Color::Green, &mut writer);747 writer.finish()748 };749750 let encoded_u8 = {751 let mut writer = evm_coder::abi::AbiWriter::new_call(FUNCTION_IDENTIFIER);752 <u8 as evm_coder::abi::AbiWrite>::abi_write(&(Color::Green as u8), &mut writer);753 writer.finish()754 };755756 similar_asserts::assert_eq!(encoded_enum, encoded_u8);757758 {759 let (_, mut decoder) = evm_coder::abi::AbiReader::new_call(&encoded_enum).unwrap();760 let restored_enum_data =761 <Color as evm_coder::abi::AbiRead>::abi_read(&mut decoder).unwrap();762 assert_eq!(restored_enum_data, Color::Green);763 }764 }765}