diff --git a/HarmonyTests/Tools/TestAccessTools.cs b/HarmonyTests/Tools/TestAccessTools.cs index 5437e72e..af3d0ffc 100644 --- a/HarmonyTests/Tools/TestAccessTools.cs +++ b/HarmonyTests/Tools/TestAccessTools.cs @@ -500,6 +500,44 @@ 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(); + // Assert.AreEqual("base test 456 790 1", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true)(baseInstance, 456, ref f)); + // _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false)(baseInstance, 456, ref f)); + // Assert.AreEqual("derived test 456 791 1", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true)(derivedInstance, 456, ref f)); + // _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false)(derivedInstance, 456, ref f)); + // Assert.AreEqual("struct result 456 792 1", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true)(structInstance, 456, ref f)); + // _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false)(structInstance, 456, ref f)); + // Assert.AreEqual("base test 456 793 2", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true)(baseInstance, 456, ref f)); + // _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false)(baseInstance, 456, ref f)); + // Assert.AreEqual("derived test 456 794 2", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true)(derivedInstance, 456, ref f)); + // _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false)(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)(derivedInstance, 456, ref f)); + // _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false)(derivedInstance, 456, ref f)); + // Assert.AreEqual("struct result 456 796 1", AccessTools.MethodDelegate>(interfaceTest, virtualCall: true)(structInstance, 456, ref f)); + // _ = Assert.Throws(typeof(ArgumentException), () => AccessTools.MethodDelegate>(interfaceTest, virtualCall: false)(structInstance, 456, ref f)); + } + [Test] public void Test_AccessTools_MethodDelegate_StaticDelegates_InterfaceMethod() { @@ -520,6 +558,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()