From 3ba279f61d82c7f2221f743afdd2c32d72f982ed Mon Sep 17 00:00:00 2001 From: Eddio0141 Date: Sat, 16 Nov 2024 15:56:04 +0000 Subject: [PATCH] test MethodDelegate ValueType arg 0 via ref, and unboxing args repeat mutation to see effect fixed bind error restore missing test --- HarmonyTests/Tools/TestAccessTools.cs | 44 +++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/HarmonyTests/Tools/TestAccessTools.cs b/HarmonyTests/Tools/TestAccessTools.cs index 5437e72e..e8a95c46 100644 --- a/HarmonyTests/Tools/TestAccessTools.cs +++ b/HarmonyTests/Tools/TestAccessTools.cs @@ -500,6 +500,48 @@ public void Test_AccessTools_MethodDelegate_OpenInstanceDelegates_InterfaceMetho _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false)(structInstance, 456, ref f)); } + [Test] + public void Test_AccessTools_MethodDelegate_OpenInstanceDelegates_Arg0ByRef() + { + // only applies to struct, since you want to mutate structs via ref + var f = 789f; + + var structInstance = new Struct(); + // repeat for mutation + Assert.AreEqual("struct result 456 790 1", AccessTools.MethodDelegate>(structTest, virtualCall: false, delegateArgs: [typeof(Struct).MakeByRefType(), typeof(int), typeof(float).MakeByRefType()])(ref structInstance, 456, ref f)); + Assert.AreEqual("struct result 456 791 2", AccessTools.MethodDelegate>(structTest, virtualCall: false, delegateArgs: [typeof(Struct).MakeByRefType(), typeof(int), typeof(float).MakeByRefType()])(ref structInstance, 456, ref f)); + Assert.AreEqual("struct result 456 792 3", AccessTools.MethodDelegate>(structTest, virtualCall: false, delegateArgs: [typeof(Struct).MakeByRefType(), typeof(int), typeof(float).MakeByRefType()])(ref structInstance, 456, ref f)); + } + + [Test] + public void Test_AccessTools_MethodDelegate_OpenInstanceDelegates_BoxedArgs() + { + var f = 789f; + var baseInstance = new Base(); + var derivedInstance = new Derived(); + var structInstance = new Struct(); + var delegateArgs_IInterface = new Type[] { typeof(IInterface), typeof(object), typeof(float).MakeByRefType() }; + var delegateArgs_Base = new Type[] { typeof(Base), typeof(object), typeof(float).MakeByRefType() }; + var delegateArgs_Derived = new Type[] { typeof(Derived), typeof(object), typeof(float).MakeByRefType() }; + var delegateArgs_Struct = new Type[] { typeof(Struct), typeof(object), typeof(float).MakeByRefType() }; + // Assert.AreEqual("base test 456 790 1", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true, delegateArgs: delegateArgs_IInterface)(baseInstance, 456, ref f)); + _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false, delegateArgs: delegateArgs_IInterface)(baseInstance, 456, ref f)); + // Assert.AreEqual("derived test 456 791 1", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true, delegateArgs: delegateArgs_IInterface)(derivedInstance, 456, ref f)); + // _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false, delegateArgs: delegateArgs_IInterface)(derivedInstance, 456, ref f)); + // Assert.AreEqual("struct result 456 792 1", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true, delegateArgs: delegateArgs_IInterface)(structInstance, 456, ref f)); + _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false, delegateArgs: delegateArgs_IInterface)(structInstance, 456, ref f)); + // Assert.AreEqual("base test 456 793 2", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true, delegateArgs: delegateArgs_Base)(baseInstance, 456, ref f)); + _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false, delegateArgs: delegateArgs_Base)(baseInstance, 456, ref f)); + // Assert.AreEqual("derived test 456 794 2", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true, delegateArgs: delegateArgs_Base)(derivedInstance, 456, ref f)); + _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false, delegateArgs: delegateArgs_Base)(derivedInstance, 456, ref f)); + // AccessTools.MethodDelegate>(interfaceTest, virtualCall: true)(baseInstance, 456, ref f)); // expected compile error + // AccessTools.MethodDelegate>(interfaceTest, virtualCall: false)(baseInstance, 456, ref f)); // expected compile error + // Assert.AreEqual("derived test 456 795 3", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true, delegateArgs: delegateArgs_Derived)(derivedInstance, 456, ref f)); + _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false, delegateArgs: delegateArgs_Derived)(derivedInstance, 456, ref f)); + // Assert.AreEqual("struct result 456 796 1", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true, delegateArgs: delegateArgs_Struct)(structInstance, 456, ref f)); + _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false, delegateArgs: delegateArgs_Struct)(structInstance, 456, ref f)); + } + [Test] public void Test_AccessTools_MethodDelegate_StaticDelegates_InterfaceMethod() { @@ -520,6 +562,8 @@ public void Test_AccessTools_MethodDelegate_InvalidDelegates() delegate string MethodDel(int n, ref float f); delegate string OpenMethodDel(T instance, int n, ref float f); + delegate string OpenMethodDelRefInstance(ref T instance, int n, ref float f); + delegate string OpenMethodDelBoxedArg(T instance, object n, ref float f); [Test] public void Test_AccessTools_HarmonyDelegate()