Merge pull request #5714 from alexischr/update_bockbuild
[mono.git] / mono / tests / pinvoke11.cs
1 using System;
2 using System.Runtime.InteropServices;
3
4 [StructLayout(LayoutKind.Sequential)]
5 public struct ss
6 {
7         public int i1;
8 }
9
10 [StructLayout(LayoutKind.Explicit)]
11 public struct su
12 {
13         [FieldOffset(0)] public int i1;
14         [FieldOffset(0)] public int i2;
15 }
16
17 [StructLayout(LayoutKind.Sequential)]
18 public struct cs
19 {
20         public bool b1;
21         public int i1;
22         public su u1;
23 }
24
25 /* various small structs for testing struct-by-value where they are handled specially 
26    on some platforms.
27 */
28 [StructLayout(LayoutKind.Sequential)]
29 public struct sc1
30 {
31         public byte c0;
32 }
33
34 [StructLayout(LayoutKind.Sequential)]
35 public struct sc3
36 {
37         public byte c0;
38         public byte c1;
39         public byte c2;
40 }
41
42 [StructLayout(LayoutKind.Sequential)]
43 public struct sc5
44 {
45         public byte c0;
46         public byte c1;
47         public byte c2;
48         public byte c3;
49         public byte c4;
50 }
51
52 public struct FI {
53         public float f1;
54         public float f2;
55         public float f3;
56 }
57
58 public struct NestedFloat {
59         public FI fi;
60         public float f4;
61 }
62
63 public class Test
64 {
65         [DllImport ("libtest")]
66         public static extern int mono_union_test_1 (cs a);
67
68         [DllImport ("libtest")]
69         public static extern int mono_return_int (int a);
70
71         [DllImport ("libtest", EntryPoint="mono_return_int_ss")]
72         public static extern int mono_return_int_ss (ss a);
73
74         [DllImport ("libtest", EntryPoint="mono_return_ss")]
75         public static extern ss mono_return_ss (ss a);
76
77         [DllImport ("libtest", EntryPoint="mono_return_sc1")]
78         public static extern sc1 mono_return_sc1 (sc1 a);
79
80         [DllImport ("libtest", EntryPoint="mono_return_sc3")]
81         public static extern sc3 mono_return_sc3 (sc3 a);
82
83         [DllImport ("libtest", EntryPoint="mono_return_sc5")]
84         public static extern sc5 mono_return_sc5 (sc5 a);
85
86         [DllImport ("libtest", EntryPoint="mono_return_int_su")]
87         public static extern int mono_return_int_su (su a);
88
89         [DllImport ("libtest", EntryPoint="mono_return_nested_float")]
90         public static extern NestedFloat mono_return_nested_float ();
91
92         static int Main()
93         {
94                 if (mono_return_int (5) != 5)
95                         return 1;
96
97                 ss s1;
98                 s1.i1 = 4;
99                 if (mono_return_int_ss (s1) != 4)
100                         return 2;
101
102                 s1 = mono_return_ss (s1);
103                 if (s1.i1 != 5)
104                         return 3;
105                 
106                 su s2;
107                 s2.i1 = 2;
108                 s2.i2 = 3;
109                 if (mono_return_int_su (s2) != 3)
110                         return 4;
111                 
112                 s2.i1 = 2;
113                 if (mono_return_int_su (s2) != 2)
114                         return 5;
115
116
117                 cs s3;
118                 s3.b1 = false;
119                 s3.i1 = 12;
120                 s3.u1.i1 = 2;
121                 s3.u1.i2 = 1;
122                 
123                 if (mono_union_test_1 (s3) != 13)
124                         return 6;
125
126                 s3.u1.i1 = 2;
127                 if (mono_union_test_1 (s3) != 14)
128                         return 7;
129
130                 s3.b1 = true;
131                 if (mono_union_test_1 (s3) != 15)
132                         return 8;
133
134                 sc1 s4;
135                 s4.c0 = 3;
136                 s4 = mono_return_sc1(s4);
137                 if (s4.c0 != 4)
138                         return 9;
139
140                 sc3 s5;
141                 s5.c0 = 4;
142                 s5.c1 = 5;
143                 s5.c2 = 6;
144                 s5 = mono_return_sc3(s5);
145                 if (s5.c0 != 5 || s5.c1 != 7 || s5.c2 != 9)
146                         return 10;
147
148                 sc5 s6;
149                 s6.c0 = 4;
150                 s6.c1 = 5;
151                 s6.c2 = 6;
152                 s6.c3 = 7;
153                 s6.c4 = 8;
154                 s6 = mono_return_sc5(s6);
155                 if (s6.c0 != 5 || s6.c1 != 7 || s6.c2 != 9 || s6.c3 != 11 || s6.c4 != 13)
156                         return 11;
157
158                 var f = mono_return_nested_float ();
159                 if (f.fi.f1 != 1.0)
160                         return 12;
161
162                 return 0;
163         }
164 }
165