git.delta.rocks / unique-network / refs/commits / eb77a467ce9c

difftreelog

source

crates/evm-coder/tests/abi_derive_generation.rs20.0 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	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	/// Some docs257	/// At multi258	/// line259	#[derive(AbiCoder, PartialEq, Debug)]260	struct TupleStruct3DerivedMixedParam(261		/// Docs for A262		/// multi263		/// line264		TupleStruct1SimpleParam,265		TupleStruct2DynamicParam,266		/// Docs for C267		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	/// Some docs690	/// At multi691	/// line692	#[derive(AbiCoder, Debug, PartialEq, Default, Clone, Copy)]693	#[repr(u8)]694	enum Color {695		/// Docs for Red696		/// multi697		/// line698		Red,699		Green,700		/// Docs for Blue701		#[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}