Merge pull request #2200 from xmcclure/image-audit-oops
[mono.git] / mono / tests / pinvoke3.cs
index c5e7fa6ad6704ef86cd73389f52c926f271c7bd3..4b9a4b7f49a300186eb95ef72be806e21d897bfe 100644 (file)
@@ -66,6 +66,19 @@ public class Tests {
                return 0;
        }
 
+       public static int delegate_test_struct_in (int a, [In] ref SimpleStruct ss, int b)
+       {
+               if (a == 1 && b == 2 && ss.a && !ss.b && ss.c && ss.d == "TEST2") {
+                       ss.a = true;
+                       ss.b = true;
+                       ss.c = true;
+                       ss.d = "TEST3";
+                       return 0;
+               }
+
+               return 1;
+       }
+
        public static SimpleClass delegate_test_class (SimpleClass ss)
        {
                if (ss == null)
@@ -134,8 +147,13 @@ public class Tests {
 
        public delegate int OutStructDelegate (int a, out SimpleStruct ss, int b);
 
+       public delegate int InStructDelegate (int a, [In] ref SimpleStruct ss, int b);
+
        [DllImport ("libtest", EntryPoint="mono_test_marshal_out_struct")]
        public static extern int mono_test_marshal_out_struct (int a, out SimpleStruct ss, int b, OutStructDelegate d);
+
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_in_struct")]
+       public static extern int mono_test_marshal_in_struct (int a, ref SimpleStruct ss, int b, InStructDelegate d);
        
        [DllImport ("libtest", EntryPoint="mono_test_marshal_delegate2")]
        public static extern int mono_test_marshal_delegate2 (SimpleDelegate2 d);
@@ -170,6 +188,9 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_return_delegate_delegate")]
        public static extern int mono_test_marshal_return_delegate_delegate (ReturnDelegateDelegate d);
 
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_delegate_ref_delegate")]
+       public static extern int mono_test_marshal_delegate_ref_delegate (DelegateByrefDelegate del);
+
        public delegate int TestDelegate (int a, ref SimpleStruct ss, int b);
 
        public delegate SimpleStruct SimpleDelegate2 (SimpleStruct ss);
@@ -192,6 +213,8 @@ public class Tests {
 
        public delegate return_int_delegate ReturnDelegateDelegate ();
 
+       public delegate int DelegateByrefDelegate (ref return_int_delegate del);
+
        public static int Main () {
                return TestDriver.RunTests (typeof (Tests));
        }
@@ -228,6 +251,14 @@ public class Tests {
                return mono_test_marshal_out_struct (1, out ss, 2, d);
        }
 
+       /* Test structures as in arguments of delegates */
+       public static int test_0_marshal_in_struct_delegate () {
+               SimpleStruct ss = new SimpleStruct () { a = true, b = false, c = true, d = "TEST2" };
+               InStructDelegate d = new InStructDelegate (delegate_test_struct_in);
+
+               return mono_test_marshal_in_struct (1, ref ss, 2, d);
+       }
+
        /* Test classes as arguments and return values of delegates */
        public static int test_0_marshal_class_delegate () {
                SimpleDelegate4 d = new SimpleDelegate4 (delegate_test_class);
@@ -307,6 +338,20 @@ public class Tests {
                return mono_test_marshal_return_delegate_delegate (new ReturnDelegateDelegate (return_delegate));
        }
 
+       public static int return_plus_1 (int i) {
+               return i + 1;
+       }
+
+       public static int ref_delegate_delegate (ref return_int_delegate del) {
+               del = return_plus_1;
+               return 0;
+       }
+
+       public static int test_55_marshal_delegate_ref_delegate () {
+               var del = new DelegateByrefDelegate (ref_delegate_delegate);
+               return mono_test_marshal_delegate_ref_delegate (del);
+       }
+
        /* Passing and returning strings */
 
        public delegate String ReturnStringDelegate (String s);
@@ -1061,29 +1106,32 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_call_callback")]
        public static extern int mono_test_marshal_call_callback ();
 
-       public static int test_0_appdomain_swich () {
-        callback = delegate () { return 42; };
-        mono_test_marshal_set_callback (callback);
-
+       public static int test_0_appdomain_switch () {
                // FIXME: The appdomain unload hangs
-               return 0;
-               /*
+               //return 0;
         AppDomain ad = AppDomain.CreateDomain ("foo");
                var c = (CallbackClass)ad.CreateInstanceAndUnwrap (
                                typeof (CallbackClass).Assembly.FullName, "Tests/CallbackClass");
-               int res = c.OtherDomainTest ();
+               c.SetCallback ();
+               int domain_id = AppDomain.CurrentDomain.Id;
+               int new_id = mono_test_marshal_call_callback ();
+               int res = 0;
+               if (new_id == domain_id)
+                       res = 1;
+               if (AppDomain.CurrentDomain.Id != domain_id)
+                       res = 2;
                AppDomain.Unload (ad);
                return res;
-               */
     }
 
+       static int domain_callback () {
+               return AppDomain.CurrentDomain.Id;
+       }
+
        class CallbackClass : MarshalByRefObject {
-               public int OtherDomainTest () {
-                       int appDomainId = AppDomain.CurrentDomain.Id;
-                       int res = mono_test_marshal_call_callback ();
-                       if (res != 42)
-                               return 2;
-                       return appDomainId == AppDomain.CurrentDomain.Id ? 0 : 1;
+               public int SetCallback () {
+                       mono_test_marshal_set_callback (domain_callback);
+                       return 0;
                }
     }
 }