git.delta.rocks / unique-network / refs/commits / 6bfcb427114a

difftreelog

source

crates/evm-coder/tests/abi_derive_generation.rs21.7 KiBsourcehistory
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	/// 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_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	/// Some docs292	/// At multi293	/// line294	#[derive(AbiCoder, PartialEq, Debug)]295	struct TupleStruct3DerivedMixedParam(296		/// Docs for A297		/// multi298		/// line299		TupleStruct1SimpleParam,300		TupleStruct2DynamicParam,301		/// Docs for C302		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	/// Some docs750	/// At multi751	/// line752	#[derive(AbiCoder, Debug, PartialEq, Default, Clone, Copy)]753	#[repr(u8)]754	enum Color {755		/// Docs for Red756		/// multi757		/// line758		Red,759		Green,760		/// Docs for Blue761		#[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}