2009-11-20 Gonzalo Paniagua Javier <gonzalo@novell.com>
[mono.git] / mono / tests / pinvoke3.cs
index ebe6da6da452950efaa50da72f04799a3a19af35..ec2250839d3c9bae8a6175b020bd2b24010d5bd3 100644 (file)
@@ -5,6 +5,7 @@
 //
 
 using System;
+using System.Text;
 using System.Runtime.InteropServices;
 
 public class Tests {
@@ -119,6 +120,14 @@ public class Tests {
                return s == "ABC" ? 0 : 1;
        }
 
+       public static int delegate_test_string_builder_marshalling (StringBuilder s)
+       {
+               if (s == null)
+                       return 2;
+               else
+                       return s.ToString () == "ABC" ? 0 : 1;
+       }
+
        [DllImport ("libtest", EntryPoint="mono_test_ref_vtype")]
        public static extern int mono_test_ref_vtype (int a, ref SimpleStruct ss, int b, TestDelegate d);
 
@@ -151,6 +160,9 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_delegate10")]
        public static extern int mono_test_marshal_delegate10 (SimpleDelegate9 d);
 
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_delegate8")]
+       public static extern int mono_test_marshal_delegate11 (SimpleDelegate11 d, string s);
+
        [DllImport ("libtest", EntryPoint="mono_test_marshal_primitive_byref_delegate")]
        public static extern int mono_test_marshal_primitive_byref_delegate (PrimitiveByrefDelegate d);
 
@@ -173,6 +185,8 @@ public class Tests {
 
        public delegate int SimpleDelegate9 (return_int_delegate del);
 
+       public delegate int SimpleDelegate11 (StringBuilder s1);
+
        public delegate int PrimitiveByrefDelegate (ref int i);
 
        public delegate return_int_delegate ReturnDelegateDelegate ();
@@ -182,14 +196,14 @@ public class Tests {
        }
 
        /* Test structures as arguments and return values of delegates */
-       static int test_0_marshal_struct_delegate () {
+       public static int test_0_marshal_struct_delegate () {
                SimpleDelegate2 d = new SimpleDelegate2 (delegate_test_struct);
 
                return mono_test_marshal_delegate2 (d);
        }
 
        /* Test structures as byref arguments of delegates */
-       static int test_0_marshal_byref_struct_delegate () {
+       public static int test_0_marshal_byref_struct_delegate () {
                SimpleStruct ss = new SimpleStruct ();
                TestDelegate d = new TestDelegate (delegate_test_struct_byref);
                
@@ -206,7 +220,7 @@ public class Tests {
        }
 
        /* Test structures as out arguments of delegates */
-       static int test_0_marshal_out_struct_delegate () {
+       public static int test_0_marshal_out_struct_delegate () {
                SimpleStruct ss = new SimpleStruct ();
                OutStructDelegate d = new OutStructDelegate (delegate_test_struct_out);
 
@@ -214,35 +228,45 @@ public class Tests {
        }
 
        /* Test classes as arguments and return values of delegates */
-       static int test_0_marshal_class_delegate () {
+       public static int test_0_marshal_class_delegate () {
                SimpleDelegate4 d = new SimpleDelegate4 (delegate_test_class);
 
                return mono_test_marshal_delegate4 (d);
        }
 
        /* Test classes as byref arguments of delegates */
-       static int test_0_marshal_byref_class_delegate () {
+       public static int test_0_marshal_byref_class_delegate () {
                SimpleDelegate5 d = new SimpleDelegate5 (delegate_test_class_byref);
 
                return mono_test_marshal_delegate5 (d);
        }
 
        /* Test classes as out arguments of delegates */
-       static int test_0_marshal_out_class_delegate () {
+       public static int test_0_marshal_out_class_delegate () {
                SimpleDelegate7 d = new SimpleDelegate7 (delegate_test_class_out);
 
                return mono_test_marshal_delegate7 (d);
        }
 
        /* Test string marshalling with delegates */
-       static int test_0_marshal_string_delegate () {
+       public static int test_0_marshal_string_delegate () {
                SimpleDelegate8 d = new SimpleDelegate8 (delegate_test_string_marshalling);
 
                return mono_test_marshal_delegate8 (d, "ABC");
        }
 
+       /* Test string builder marshalling with delegates */
+       public static int test_0_marshal_string_builder_delegate () {
+               SimpleDelegate11 d = new SimpleDelegate11 (delegate_test_string_builder_marshalling);
+
+               if (mono_test_marshal_delegate11 (d, null) != 2)
+                       return 2;
+
+               return mono_test_marshal_delegate11 (d, "ABC");
+       }
+
        /* Test that the delegate wrapper correctly catches null byref arguments */
-       static int test_0_marshal_byref_class_delegate_null () {
+       public static int test_0_marshal_byref_class_delegate_null () {
                SimpleDelegate5 d = new SimpleDelegate5 (delegate_test_class_byref);
                
                try {
@@ -262,13 +286,13 @@ public class Tests {
                return d (55);
        }
 
-       static int test_55_marshal_delegate_delegate () {
+       public static int test_55_marshal_delegate_delegate () {
                SimpleDelegate9 d = new SimpleDelegate9 (call_int_delegate);
 
                return mono_test_marshal_delegate9 (d, new return_int_delegate (return_self));
        }
 
-       static int test_0_marshal_primitive_byref_delegate () {
+       public static int test_0_marshal_primitive_byref_delegate () {
                PrimitiveByrefDelegate d = new PrimitiveByrefDelegate (delegate_test_primitive_byref);
 
                return mono_test_marshal_primitive_byref_delegate (d);
@@ -278,7 +302,7 @@ public class Tests {
                return new return_int_delegate (return_self);
        }
 
-       static int test_55_marshal_return_delegate_delegate () {
+       public static int test_55_marshal_return_delegate_delegate () {
                return mono_test_marshal_return_delegate_delegate (new ReturnDelegateDelegate (return_delegate));
        }
 
@@ -296,7 +320,7 @@ public class Tests {
                        return "12345";
        }
 
-       static int test_0_marshal_return_string_delegate () {
+       public static int test_0_marshal_return_string_delegate () {
                ReturnStringDelegate d = new ReturnStringDelegate (managed_return_string);
                String s = mono_test_marshal_return_string_delegate (d);
 
@@ -320,7 +344,7 @@ public class Tests {
                return (FooEnum)((int)e + 1);
        }
 
-       static int test_0_marshal_return_enum_delegate () {
+       public static int test_0_marshal_return_enum_delegate () {
                ReturnEnumDelegate d = new ReturnEnumDelegate (managed_return_enum);
                FooEnum e = (FooEnum)mono_test_marshal_return_enum_delegate (d);
 
@@ -352,7 +376,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_blittable_struct_delegate")]
        public static extern int mono_test_marshal_blittable_struct_delegate (SimpleDelegate10 d);
 
-       static int test_0_marshal_blittable_struct_delegate () {
+       public static int test_0_marshal_blittable_struct_delegate () {
                return mono_test_marshal_blittable_struct_delegate (new SimpleDelegate10 (delegate_test_blittable_struct));
        }
 
@@ -380,7 +404,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate1")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate1 d);
 
-       static int test_0_marshal_small_struct_delegate1 () {
+       public static int test_0_marshal_small_struct_delegate1 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate1 (delegate_test_struct));
        }
 
@@ -405,7 +429,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate2")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate2 d);
 
-       static int test_0_marshal_small_struct_delegate2 () {
+       public static int test_0_marshal_small_struct_delegate2 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate2 (delegate_test_struct));
        }
 
@@ -431,7 +455,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate3")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate3 d);
 
-       static int test_0_marshal_small_struct_delegate3 () {
+       public static int test_0_marshal_small_struct_delegate3 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate3 (delegate_test_struct));
        }
 
@@ -455,7 +479,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate4")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate4 d);
 
-       static int test_0_marshal_small_struct_delegate4 () {
+       public static int test_0_marshal_small_struct_delegate4 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate4 (delegate_test_struct));
        }
 
@@ -479,7 +503,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate5")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate5 d);
 
-       static int test_0_marshal_small_struct_delegate5 () {
+       public static int test_0_marshal_small_struct_delegate5 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate5 (delegate_test_struct));
        }
 
@@ -504,7 +528,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate6")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate6 d);
 
-       static int test_0_marshal_small_struct_delegate6 () {
+       public static int test_0_marshal_small_struct_delegate6 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate6 (delegate_test_struct));
        }
 
@@ -530,7 +554,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate7")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate7 d);
 
-       static int test_0_marshal_small_struct_delegate7 () {
+       public static int test_0_marshal_small_struct_delegate7 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate7 (delegate_test_struct));
        }
 
@@ -554,7 +578,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate8")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate8 d);
 
-       static int test_0_marshal_small_struct_delegate8 () {
+       public static int test_0_marshal_small_struct_delegate8 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate8 (delegate_test_struct));
        }
 
@@ -578,7 +602,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate9")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate9 d);
 
-       static int test_0_marshal_small_struct_delegate9 () {
+       public static int test_0_marshal_small_struct_delegate9 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate9 (delegate_test_struct));
        }
 
@@ -604,7 +628,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate10")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate10 d);
 
-       static int test_0_marshal_small_struct_delegate10 () {
+       public static int test_0_marshal_small_struct_delegate10 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate10 (delegate_test_struct));
        }
 
@@ -630,7 +654,7 @@ public class Tests {
        [DllImport ("libtest", EntryPoint="mono_test_marshal_small_struct_delegate11")]
        public static extern int mono_test_marshal_small_struct_delegate (SmallStructDelegate11 d);
 
-       static int test_0_marshal_small_struct_delegate11 () {
+       public static int test_0_marshal_small_struct_delegate11 () {
                return mono_test_marshal_small_struct_delegate (new SmallStructDelegate11 (delegate_test_struct));
        }
 
@@ -653,7 +677,7 @@ public class Tests {
                return 0;
        }
 
-       static int test_0_marshal_array_delegate_string () {    
+       public static int test_0_marshal_array_delegate_string () {     
                string[] arr = new string [] { "ABC", "DEF" };
                return mono_test_marshal_array_delegate1 (arr, arr.Length, new ArrayDelegate1 (array_delegate1));
        }
@@ -662,7 +686,7 @@ public class Tests {
                return (arr == null) ? 0 : 1;
        }
 
-       static int test_0_marshal_array_delegate_null () {      
+       public static int test_0_marshal_array_delegate_null () {       
                return mono_test_marshal_array_delegate1 (null, 0, new ArrayDelegate1 (array_delegate2));
        }
 
@@ -678,7 +702,7 @@ public class Tests {
                return (arr == null) ? 0 : 1;
        }
 
-       static int test_0_marshal_array_delegate_bad_paramindex () {
+       public static int test_0_marshal_array_delegate_bad_paramindex () {
                try {
                        mono_test_marshal_array_delegate3 (null, 0, new ArrayDelegate3 (array_delegate3));
                        return 1;
@@ -700,7 +724,7 @@ public class Tests {
                return (arr == null) ? 0 : 1;
        }
 
-       static int test_0_marshal_array_delegate_bad_paramtype () {
+       public static int test_0_marshal_array_delegate_bad_paramtype () {
                try {
                        mono_test_marshal_array_delegate4 (null, 0, new ArrayDelegate4 (array_delegate4));
                        return 1;
@@ -710,6 +734,49 @@ public class Tests {
                }
        }
 
+       public delegate int ArrayDelegate4_2 (int i, 
+                                                                               string j, 
+                                                                                 string[] arr);
+
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_array_delegate")]
+       public static extern int mono_test_marshal_array_delegate4_2 (string[] arr, int len, ArrayDelegate4_2 d);
+
+       public static int array_delegate4_2 (int i, string j, string[] arr) {
+               return (arr == null) ? 0 : 1;
+       }
+
+       public static int test_0_marshal_array_delegate_no_marshal_directive () {
+               try {
+                       mono_test_marshal_array_delegate4_2 (null, 0, new ArrayDelegate4_2 (array_delegate4_2));
+                       return 1;
+               }
+               catch (MarshalDirectiveException) {
+                       return 0;
+               }
+       }
+
+       public delegate int ArrayDelegate4_3 (int i, 
+                                                                               string j, 
+                                                                                 string[] arr);
+
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_array_delegate")]
+       public static extern int mono_test_marshal_array_delegate4_3 (string[] arr, int len, ArrayDelegate4_3 d);
+
+       public int array_delegate4_3 (int i, string j, string[] arr) {
+               return (arr == null) ? 0 : 1;
+       }
+
+       public static int test_0_marshal_array_delegate_no_marshal_directive_instance () {
+               try {
+                       Tests t = new Tests ();
+                       mono_test_marshal_array_delegate4_3 (null, 0, new ArrayDelegate4_3 (t.array_delegate4_3));
+                       return 1;
+               }
+               catch (MarshalDirectiveException) {
+                       return 0;
+               }
+       }
+
        public delegate int ArrayDelegate5 (int i, 
                                                                                string j, 
                                                                                [In, MarshalAs(UnmanagedType.LPArray, 
@@ -726,7 +793,7 @@ public class Tests {
                return 0;
        }
 
-       static int test_0_marshal_array_delegate_unicode_string () {    
+       public static int test_0_marshal_array_delegate_unicode_string () {     
                string[] arr = new string [] { "ABC", "DEF" };
                return mono_test_marshal_array_delegate5 (arr, arr.Length, new ArrayDelegate5 (array_delegate5));
        }
@@ -747,7 +814,7 @@ public class Tests {
                return 0;
        }
 
-       static int test_0_marshal_array_delegate_sizeconst () { 
+       public static int test_0_marshal_array_delegate_sizeconst () {  
                string[] arr = new string [] { "ABC", "DEF" };
                return mono_test_marshal_array_delegate6 (arr, 1024, new ArrayDelegate6 (array_delegate6));
        }
@@ -768,7 +835,7 @@ public class Tests {
                return 0;
        }
 
-       static int test_0_marshal_array_delegate_sizeconst_paramindex () {      
+       public static int test_0_marshal_array_delegate_sizeconst_paramindex () {       
                string[] arr = new string [] { "ABC", "DEF" };
                return mono_test_marshal_array_delegate7 (arr, 1, new ArrayDelegate7 (array_delegate7));
        }
@@ -789,9 +856,178 @@ public class Tests {
                return 0;
        }
 
-       static int test_0_marshal_array_delegate_blittable () { 
+       public static int test_0_marshal_array_delegate_blittable () {  
                int[] arr = new int [] { 42, 43 };
                return mono_test_marshal_array_delegate8 (arr, 2, new ArrayDelegate8 (array_delegate8));
        }
 
+       /* Array with size param of type long */
+
+       public delegate int ArrayDelegate8_2 (long i, 
+                                                                               string j, 
+                                                                               [In, MarshalAs(UnmanagedType.LPArray, 
+                                                                                                          ArraySubType=UnmanagedType.LPStr, SizeParamIndex=0)] string[] arr);
+
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_array_delegate_long")]
+       public static extern int mono_test_marshal_array_delegate8_2 (string[] arr, long len, ArrayDelegate8_2 d);
+
+       public static int array_delegate8_2 (long i, string j, string[] arr) {
+               if (arr.Length != 2)
+                       return 1;
+               if ((arr [0] != "ABC") || (arr [1] != "DEF"))
+                       return 2;
+               return 0;
+       }
+
+       public static int test_0_marshal_array_delegate_long_param () { 
+               string[] arr = new string [] { "ABC", "DEF" };
+               return mono_test_marshal_array_delegate8_2 (arr, arr.Length, new ArrayDelegate8_2 (array_delegate8_2));
+       }
+
+
+       /*
+        * [Out] blittable arrays
+        */
+
+       public delegate int ArrayDelegate9 (int i, string j,
+                                                                               [Out, MarshalAs(UnmanagedType.LPArray, 
+                                                                               SizeParamIndex=0)] 
+                                                                               int[] arr);
+
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_out_array_delegate")]
+       public static extern int mono_test_marshal_out_array_delegate (int[] arr, int len, ArrayDelegate9 d);
+
+       public static int array_delegate9 (int i, string j, int[] arr) {
+               if (arr.Length != 2)
+                       return 1;
+
+               arr [0] = 1;
+               arr [1] = 2;
+
+               return 0;
+       }
+
+       public static int test_0_marshal_out_array_delegate () {        
+               int[] arr = new int [] { 42, 43 };
+               return mono_test_marshal_out_array_delegate (arr, 2, new ArrayDelegate9 (array_delegate9));
+       }
+
+       /*
+        * [Out] string arrays
+        */
+
+       public delegate int ArrayDelegate10 (int i, 
+                                                                                string j, 
+                                                                                [Out, MarshalAs(UnmanagedType.LPArray, 
+                                                                                                                ArraySubType=UnmanagedType.LPStr, SizeConst=2)] string[] arr);
+
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_out_string_array_delegate")]
+       public static extern int mono_test_marshal_out_string_array_delegate (string[] arr, int len, ArrayDelegate10 d);
+
+       public static int array_delegate10 (int i, string j, string[] arr) {
+               if (arr.Length != 2)
+                       return 1;
+
+               arr [0] = "ABC";
+               arr [1] = "DEF";
+
+               return 0;
+       }
+
+       public static int test_0_marshal_out_string_array_delegate () { 
+               string[] arr = new string [] { "", "" };
+               return mono_test_marshal_out_string_array_delegate (arr, 2, new ArrayDelegate10 (array_delegate10));
+       }
+
+       /*
+        * [In, Out] classes
+        */
+
+       public delegate int InOutByvalClassDelegate ([In, Out] SimpleClass ss);
+
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_inout_byval_class_delegate")]
+       public static extern int mono_test_marshal_inout_byval_class_delegate (InOutByvalClassDelegate d);
+
+       public static int delegate_test_byval_class_inout (SimpleClass ss) {
+               if ((ss.a != false) || (ss.b != true) || (ss.c != false) || (ss.d != "FOO"))
+                       return 1;
+
+               ss.a = true;
+               ss.b = false;
+               ss.c = true;
+               ss.d = "RES";
+
+               return 0;
+       }
+
+       public static int test_0_marshal_inout_byval_class_delegate () {
+               return mono_test_marshal_inout_byval_class_delegate (new InOutByvalClassDelegate (delegate_test_byval_class_inout));
+       }
+
+       /*
+        * Returning unicode strings
+        */
+       [return: MarshalAs(UnmanagedType.LPWStr)]
+       public delegate string ReturnUnicodeStringDelegate([MarshalAs(UnmanagedType.LPWStr)] string message);
+
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_return_unicode_string_delegate")]
+       public static extern int mono_test_marshal_return_unicode_string_delegate (ReturnUnicodeStringDelegate d);
+
+       public static String return_unicode_string_delegate (string message) {
+               return message;
+       }
+
+       public static int test_0_marshal_return_unicode_string_delegate () {    
+               return mono_test_marshal_return_unicode_string_delegate (new ReturnUnicodeStringDelegate (return_unicode_string_delegate));
+       }
+
+       /*
+        * Returning string arrays
+        */
+       public delegate string[] ReturnArrayDelegate (int i);
+
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_return_string_array_delegate")]
+       public static extern int mono_test_marshal_return_string_array_delegate (ReturnArrayDelegate d);
+
+       public static String[] return_array_delegate (int i) {
+               String[] arr = new String [2];
+
+               arr [0] = "ABC";
+               arr [1] = "DEF";
+
+               return arr;
+       }
+
+       public static String[] return_array_delegate_null (int i) {
+               return null;
+       }
+
+       public static int test_0_marshal_return_string_array_delegate () {      
+               return mono_test_marshal_return_string_array_delegate (new ReturnArrayDelegate (return_array_delegate));
+       }
+
+       public static int test_3_marshal_return_string_array_delegate_null () { 
+               return mono_test_marshal_return_string_array_delegate (new ReturnArrayDelegate (return_array_delegate_null));
+       }
+
+       /*
+        * Byref string marshalling
+        */
+       public delegate int ByrefStringDelegate (ref string s);
+
+       [DllImport ("libtest", EntryPoint="mono_test_marshal_byref_string_delegate")]
+       public static extern int mono_test_marshal_byref_string_delegate (ByrefStringDelegate d);
+
+       public static int byref_string_delegate (ref string s) {
+               if (s != "ABC")
+                       return 1;
+
+               s = "DEF";
+
+               return 0;
+       }
+
+       public static int test_0_marshal_byref_string_delegate () {     
+               return mono_test_marshal_byref_string_delegate (new ByrefStringDelegate (byref_string_delegate));
+       }
 }