Merge pull request #4845 from lambdageek/dev-coop-delegates
[mono.git] / mono / tests / pinvoke11.cs
index af1fccf00a8c54a861cd6c2d5e4c5fe59638719d..252700fe3442a38b7af62472c35d1df83de2491c 100644 (file)
@@ -22,20 +22,73 @@ public struct cs
        public su u1;
 }
 
+/* various small structs for testing struct-by-value where they are handled specially 
+   on some platforms.
+*/
+[StructLayout(LayoutKind.Sequential)]
+public struct sc1
+{
+       public byte c0;
+}
+
+[StructLayout(LayoutKind.Sequential)]
+public struct sc3
+{
+       public byte c0;
+       public byte c1;
+       public byte c2;
+}
+
+[StructLayout(LayoutKind.Sequential)]
+public struct sc5
+{
+       public byte c0;
+       public byte c1;
+       public byte c2;
+       public byte c3;
+       public byte c4;
+}
+
+public struct FI {
+       public float f1;
+       public float f2;
+       public float f3;
+}
+
+public struct NestedFloat {
+       public FI fi;
+       public float f4;
+}
+
 public class Test
 {
-       [DllImport ("libtest.so")]
+       [DllImport ("libtest")]
        public static extern int mono_union_test_1 (cs a);
 
-       [DllImport ("libtest.so")]
+       [DllImport ("libtest")]
        public static extern int mono_return_int (int a);
 
-       [DllImport ("libtest.so", EntryPoint="mono_return_int")]
+       [DllImport ("libtest", EntryPoint="mono_return_int_ss")]
        public static extern int mono_return_int_ss (ss a);
 
-       [DllImport ("libtest.so", EntryPoint="mono_return_int")]
+       [DllImport ("libtest", EntryPoint="mono_return_ss")]
+       public static extern ss mono_return_ss (ss a);
+
+       [DllImport ("libtest", EntryPoint="mono_return_sc1")]
+       public static extern sc1 mono_return_sc1 (sc1 a);
+
+       [DllImport ("libtest", EntryPoint="mono_return_sc3")]
+       public static extern sc3 mono_return_sc3 (sc3 a);
+
+       [DllImport ("libtest", EntryPoint="mono_return_sc5")]
+       public static extern sc5 mono_return_sc5 (sc5 a);
+
+       [DllImport ("libtest", EntryPoint="mono_return_int_su")]
        public static extern int mono_return_int_su (su a);
 
+       [DllImport ("libtest", EntryPoint="mono_return_nested_float")]
+       public static extern NestedFloat mono_return_nested_float ();
+
         static int Main()
         {
                if (mono_return_int (5) != 5)
@@ -45,16 +98,20 @@ public class Test
                s1.i1 = 4;
                if (mono_return_int_ss (s1) != 4)
                        return 2;
+
+               s1 = mono_return_ss (s1);
+               if (s1.i1 != 5)
+                       return 3;
                
                su s2;
                s2.i1 = 2;
                s2.i2 = 3;
                if (mono_return_int_su (s2) != 3)
-                       return 3;
+                       return 4;
                
                s2.i1 = 2;
                if (mono_return_int_su (s2) != 2)
-                       return 4;
+                       return 5;
 
 
                cs s3;
@@ -64,16 +121,44 @@ public class Test
                s3.u1.i2 = 1;
                
                if (mono_union_test_1 (s3) != 13)
-                       return 5;
+                       return 6;
 
                s3.u1.i1 = 2;
                if (mono_union_test_1 (s3) != 14)
-                       return 6;
+                       return 7;
 
                s3.b1 = true;
                if (mono_union_test_1 (s3) != 15)
-                       return 7;
-               
+                       return 8;
+
+               sc1 s4;
+               s4.c0 = 3;
+               s4 = mono_return_sc1(s4);
+               if (s4.c0 != 4)
+                       return 9;
+
+               sc3 s5;
+               s5.c0 = 4;
+               s5.c1 = 5;
+               s5.c2 = 6;
+               s5 = mono_return_sc3(s5);
+               if (s5.c0 != 5 || s5.c1 != 7 || s5.c2 != 9)
+                       return 10;
+
+               sc5 s6;
+               s6.c0 = 4;
+               s6.c1 = 5;
+               s6.c2 = 6;
+               s6.c3 = 7;
+               s6.c4 = 8;
+               s6 = mono_return_sc5(s6);
+               if (s6.c0 != 5 || s6.c1 != 7 || s6.c2 != 9 || s6.c3 != 11 || s6.c4 != 13)
+                       return 11;
+
+               var f = mono_return_nested_float ();
+               if (f.fi.f1 != 1.0)
+                       return 12;
+
                return 0;
         }
 }