Merge pull request #637 from LogosBible/enetdown
[mono.git] / mono / tests / cominterop.cs
1 //
2 // cominterop.cs:
3 //
4 //  Tests for COM Interop related features
5 //
6
7 using System;
8 using System.Runtime.CompilerServices;
9 using System.Runtime.InteropServices;
10
11
12 public class Tests
13 {
14
15         [DllImport("libtest")]
16         public static extern int mono_test_marshal_bstr_in([MarshalAs(UnmanagedType.BStr)]string str);
17
18         [DllImport("libtest")]
19     public static extern int mono_test_marshal_bstr_out([MarshalAs(UnmanagedType.BStr)] out string str);
20
21     [DllImport("libtest")]
22     public static extern int mono_test_marshal_bstr_in_null([MarshalAs(UnmanagedType.BStr)]string str);
23
24     [DllImport("libtest")]
25     public static extern int mono_test_marshal_bstr_out_null([MarshalAs(UnmanagedType.BStr)] out string str);
26
27         [DllImport("libtest")]
28         public static extern int mono_test_marshal_variant_in_sbyte([MarshalAs(UnmanagedType.Struct)]object obj);
29
30         [DllImport("libtest")]
31         public static extern int mono_test_marshal_variant_in_byte([MarshalAs(UnmanagedType.Struct)]object obj);
32
33         [DllImport("libtest")]
34         public static extern int mono_test_marshal_variant_in_short([MarshalAs(UnmanagedType.Struct)]object obj);
35
36         [DllImport("libtest")]
37         public static extern int mono_test_marshal_variant_in_ushort([MarshalAs(UnmanagedType.Struct)]object obj);
38
39         [DllImport("libtest")]
40         public static extern int mono_test_marshal_variant_in_int([MarshalAs(UnmanagedType.Struct)]object obj);
41
42         [DllImport("libtest")]
43         public static extern int mono_test_marshal_variant_in_uint([MarshalAs(UnmanagedType.Struct)]object obj);
44
45         [DllImport("libtest")]
46         public static extern int mono_test_marshal_variant_in_long([MarshalAs(UnmanagedType.Struct)]object obj);
47
48         [DllImport("libtest")]
49         public static extern int mono_test_marshal_variant_in_ulong([MarshalAs(UnmanagedType.Struct)]object obj);
50
51         [DllImport("libtest")]
52         public static extern int mono_test_marshal_variant_in_float([MarshalAs(UnmanagedType.Struct)]object obj);
53
54         [DllImport("libtest")]
55         public static extern int mono_test_marshal_variant_in_double([MarshalAs(UnmanagedType.Struct)]object obj);
56
57         [DllImport("libtest")]
58         public static extern int mono_test_marshal_variant_in_bstr ([MarshalAs (UnmanagedType.Struct)]object obj);
59
60         [DllImport ("libtest")]
61         public static extern int mono_test_marshal_variant_in_bool_true ([MarshalAs (UnmanagedType.Struct)]object obj);
62
63         [DllImport ("libtest")]
64         public static extern int mono_test_marshal_variant_in_bool_false ([MarshalAs (UnmanagedType.Struct)]object obj);
65
66         [DllImport("libtest")]
67         public static extern int mono_test_marshal_variant_out_sbyte([MarshalAs(UnmanagedType.Struct)]out object obj);
68
69         [DllImport("libtest")]
70         public static extern int mono_test_marshal_variant_out_sbyte_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
71
72         [DllImport("libtest")]
73         public static extern int mono_test_marshal_variant_out_byte([MarshalAs(UnmanagedType.Struct)]out object obj);
74
75         [DllImport("libtest")]
76         public static extern int mono_test_marshal_variant_out_byte_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
77
78         [DllImport("libtest")]
79         public static extern int mono_test_marshal_variant_out_short([MarshalAs(UnmanagedType.Struct)]out object obj);
80
81         [DllImport("libtest")]
82         public static extern int mono_test_marshal_variant_out_short_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
83
84         [DllImport("libtest")]
85         public static extern int mono_test_marshal_variant_out_ushort([MarshalAs(UnmanagedType.Struct)]out object obj);
86
87         [DllImport("libtest")]
88         public static extern int mono_test_marshal_variant_out_ushort_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
89
90         [DllImport("libtest")]
91         public static extern int mono_test_marshal_variant_out_int([MarshalAs(UnmanagedType.Struct)]out object obj);
92
93         [DllImport("libtest")]
94         public static extern int mono_test_marshal_variant_out_int_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
95
96         [DllImport("libtest")]
97         public static extern int mono_test_marshal_variant_out_uint([MarshalAs(UnmanagedType.Struct)]out object obj);
98
99         [DllImport("libtest")]
100         public static extern int mono_test_marshal_variant_out_uint_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
101
102         [DllImport("libtest")]
103         public static extern int mono_test_marshal_variant_out_long([MarshalAs(UnmanagedType.Struct)]out object obj);
104
105         [DllImport("libtest")]
106         public static extern int mono_test_marshal_variant_out_long_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
107
108         [DllImport("libtest")]
109         public static extern int mono_test_marshal_variant_out_ulong([MarshalAs(UnmanagedType.Struct)]out object obj);
110
111         [DllImport("libtest")]
112         public static extern int mono_test_marshal_variant_out_ulong_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
113
114         [DllImport("libtest")]
115         public static extern int mono_test_marshal_variant_out_float([MarshalAs(UnmanagedType.Struct)]out object obj);
116
117         [DllImport("libtest")]
118         public static extern int mono_test_marshal_variant_out_float_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
119
120         [DllImport("libtest")]
121         public static extern int mono_test_marshal_variant_out_double([MarshalAs(UnmanagedType.Struct)]out object obj);
122
123         [DllImport("libtest")]
124         public static extern int mono_test_marshal_variant_out_double_byref([MarshalAs(UnmanagedType.Struct)]out object obj);
125
126         [DllImport("libtest")]
127         public static extern int mono_test_marshal_variant_out_bstr ([MarshalAs (UnmanagedType.Struct)]out object obj);
128
129         [DllImport("libtest")]
130         public static extern int mono_test_marshal_variant_out_bstr_byref ([MarshalAs (UnmanagedType.Struct)]out object obj);
131
132         [DllImport("libtest")]
133         public static extern int mono_test_marshal_variant_out_bool_true ([MarshalAs (UnmanagedType.Struct)]out object obj);
134
135         [DllImport("libtest")]
136         public static extern int mono_test_marshal_variant_out_bool_true_byref ([MarshalAs (UnmanagedType.Struct)]out object obj);
137
138         [DllImport ("libtest")]
139         public static extern int mono_test_marshal_variant_out_bool_false ([MarshalAs (UnmanagedType.Struct)]out object obj);
140
141         [DllImport ("libtest")]
142         public static extern int mono_test_marshal_variant_out_bool_false_byref ([MarshalAs (UnmanagedType.Struct)]out object obj);
143
144
145         public delegate int VarFunc (VarEnum vt, [MarshalAs (UnmanagedType.Struct)] object obj);
146
147         public delegate int VarRefFunc (VarEnum vt, [MarshalAs (UnmanagedType.Struct)] ref object obj);
148
149         [DllImport ("libtest")]
150         public static extern int mono_test_marshal_variant_in_sbyte_unmanaged (VarFunc func);
151
152         [DllImport ("libtest")]
153         public static extern int mono_test_marshal_variant_in_byte_unmanaged (VarFunc func);
154
155         [DllImport ("libtest")]
156         public static extern int mono_test_marshal_variant_in_short_unmanaged (VarFunc func);
157
158         [DllImport ("libtest")]
159         public static extern int mono_test_marshal_variant_in_ushort_unmanaged (VarFunc func);
160
161         [DllImport ("libtest")]
162         public static extern int mono_test_marshal_variant_in_int_unmanaged (VarFunc func);
163
164         [DllImport ("libtest")]
165         public static extern int mono_test_marshal_variant_in_uint_unmanaged (VarFunc func);
166
167         [DllImport ("libtest")]
168         public static extern int mono_test_marshal_variant_in_long_unmanaged (VarFunc func);
169
170         [DllImport ("libtest")]
171         public static extern int mono_test_marshal_variant_in_ulong_unmanaged (VarFunc func);
172
173         [DllImport ("libtest")]
174         public static extern int mono_test_marshal_variant_in_float_unmanaged (VarFunc func);
175
176         [DllImport ("libtest")]
177         public static extern int mono_test_marshal_variant_in_double_unmanaged (VarFunc func);
178
179         [DllImport ("libtest")]
180         public static extern int mono_test_marshal_variant_in_bstr_unmanaged (VarFunc func);
181
182         [DllImport ("libtest")]
183         public static extern int mono_test_marshal_variant_in_bool_true_unmanaged (VarFunc func);
184
185         [DllImport ("libtest")]
186         public static extern int mono_test_marshal_variant_in_bool_false_unmanaged (VarFunc func);
187
188         [DllImport ("libtest")]
189         public static extern int mono_test_marshal_variant_out_sbyte_unmanaged (VarRefFunc func);
190
191         [DllImport ("libtest")]
192         public static extern int mono_test_marshal_variant_out_byte_unmanaged (VarRefFunc func);
193
194         [DllImport ("libtest")]
195         public static extern int mono_test_marshal_variant_out_short_unmanaged (VarRefFunc func);
196
197         [DllImport ("libtest")]
198         public static extern int mono_test_marshal_variant_out_ushort_unmanaged (VarRefFunc func);
199
200         [DllImport ("libtest")]
201         public static extern int mono_test_marshal_variant_out_int_unmanaged (VarRefFunc func);
202
203         [DllImport ("libtest")]
204         public static extern int mono_test_marshal_variant_out_uint_unmanaged (VarRefFunc func);
205
206         [DllImport ("libtest")]
207         public static extern int mono_test_marshal_variant_out_long_unmanaged (VarRefFunc func);
208
209         [DllImport ("libtest")]
210         public static extern int mono_test_marshal_variant_out_ulong_unmanaged (VarRefFunc func);
211
212         [DllImport ("libtest")]
213         public static extern int mono_test_marshal_variant_out_float_unmanaged (VarRefFunc func);
214
215         [DllImport ("libtest")]
216         public static extern int mono_test_marshal_variant_out_double_unmanaged (VarRefFunc func);
217
218         [DllImport ("libtest")]
219         public static extern int mono_test_marshal_variant_out_bstr_unmanaged (VarRefFunc func);
220
221         [DllImport ("libtest")]
222         public static extern int mono_test_marshal_variant_out_bool_true_unmanaged (VarRefFunc func);
223
224         [DllImport ("libtest")]
225         public static extern int mono_test_marshal_variant_out_bool_false_unmanaged (VarRefFunc func);
226
227     [DllImport ("libtest")]
228         public static extern int mono_test_marshal_com_object_create (out IntPtr pUnk);
229
230         [DllImport ("libtest")]
231         public static extern int mono_test_marshal_com_object_same (out IntPtr pUnk);
232
233     [DllImport ("libtest")]
234     public static extern int mono_test_marshal_com_object_destroy (IntPtr pUnk);
235
236         [DllImport ("libtest")]
237         public static extern int mono_test_marshal_com_object_ref_count (IntPtr pUnk);
238
239         [DllImport ("libtest")]
240         public static extern int mono_test_marshal_ccw_identity ([MarshalAs (UnmanagedType.Interface)]ITest itest);
241
242         [DllImport ("libtest")]
243         public static extern int mono_test_marshal_ccw_reflexive ([MarshalAs (UnmanagedType.Interface)]ITest itest);
244
245         [DllImport ("libtest")]
246         public static extern int mono_test_marshal_ccw_transitive ([MarshalAs (UnmanagedType.Interface)]ITest itest);
247
248         [DllImport ("libtest")]
249         public static extern int mono_test_marshal_ccw_itest ([MarshalAs (UnmanagedType.Interface)]ITest itest);
250
251         [DllImport ("libtest")]
252         public static extern int mono_test_marshal_ccw_itest ([MarshalAs (UnmanagedType.Interface)]ITestPresSig itest);
253
254         [DllImport("libtest")]
255         public static extern int mono_test_marshal_safearray_out_1dim_vt_bstr_empty ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
256
257         [DllImport("libtest")]
258         public static extern int mono_test_marshal_safearray_out_1dim_vt_bstr ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
259
260         [DllImport("libtest")]
261         public static extern int mono_test_marshal_safearray_out_2dim_vt_i4 ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
262
263         [DllImport("libtest")]
264         public static extern int mono_test_marshal_safearray_out_4dim_vt_i4 ([MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)]out Array array);
265
266         [DllImport("libtest")]
267         public static extern int mono_test_marshal_safearray_in_byval_1dim_empty ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
268
269         [DllImport("libtest")]
270         public static extern int mono_test_marshal_safearray_in_byval_1dim_vt_i4 ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
271
272         [DllImport("libtest")]
273         public static extern int mono_test_marshal_safearray_in_byval_1dim_vt_mixed ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
274
275         [DllImport("libtest")]
276         public static extern int mono_test_marshal_safearray_in_byval_2dim_vt_i4 ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
277
278         [DllImport("libtest")]
279         public static extern int mono_test_marshal_safearray_in_byval_3dim_vt_bstr ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
280
281         [DllImport("libtest")]
282         public static extern int mono_test_marshal_safearray_in_byref_3dim_vt_bstr ([In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array);
283
284         [DllImport("libtest")]
285         public static extern int mono_test_marshal_safearray_in_out_byref_1dim_empty ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array);
286
287         [DllImport("libtest")]
288         public static extern int mono_test_marshal_safearray_in_out_byref_3dim_vt_bstr ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array);
289
290         [DllImport("libtest")]
291         public static extern int mono_test_marshal_safearray_in_out_byref_1dim_vt_i4 ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array);
292
293         [DllImport("libtest")]
294         public static extern int mono_test_marshal_safearray_in_out_byval_1dim_vt_i4 ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
295
296         [DllImport("libtest")]
297         public static extern int mono_test_marshal_safearray_in_out_byval_3dim_vt_bstr ([In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array);
298
299         [DllImport("libtest")]
300         public static extern int mono_test_marshal_safearray_mixed (
301                 [In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array1,
302                 [MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] out Array array2,
303                 [In, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] Array array3,
304                 [In, Out, MarshalAs (UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_VARIANT)] ref Array array4);
305
306         [DllImport("libtest")]
307         public static extern bool mono_cominterop_is_supported ();
308
309         public static int Main ()
310         {
311
312                 bool isWindows = !(((int)Environment.OSVersion.Platform == 4) ||
313                         ((int)Environment.OSVersion.Platform == 128));
314
315                 if (mono_cominterop_is_supported () || isWindows)
316                 {
317                         #region BSTR Tests
318
319                         string str;
320                         if (mono_test_marshal_bstr_in ("mono_test_marshal_bstr_in") != 0)
321                                 return 1;
322                         if (mono_test_marshal_bstr_out (out str) != 0 || str != "mono_test_marshal_bstr_out")
323                                 return 2;
324                         if (mono_test_marshal_bstr_in_null (null) != 0)
325                                 return 1;
326                         if (mono_test_marshal_bstr_out_null (out str) != 0 || str != null)
327                                 return 2;
328
329                         #endregion // BSTR Tests
330
331                         #region VARIANT Tests
332
333                         object obj;
334                         if (mono_test_marshal_variant_in_sbyte ((sbyte)100) != 0)
335                                 return 13;
336                         if (mono_test_marshal_variant_in_byte ((byte)100) != 0)
337                                 return 14;
338                         if (mono_test_marshal_variant_in_short ((short)314) != 0)
339                                 return 15;
340                         if (mono_test_marshal_variant_in_ushort ((ushort)314) != 0)
341                                 return 16;
342                         if (mono_test_marshal_variant_in_int ((int)314) != 0)
343                                 return 17;
344                         if (mono_test_marshal_variant_in_uint ((uint)314) != 0)
345                                 return 18;
346                         if (mono_test_marshal_variant_in_long ((long)314) != 0)
347                                 return 19;
348                         if (mono_test_marshal_variant_in_ulong ((ulong)314) != 0)
349                                 return 20;
350                         if (mono_test_marshal_variant_in_float ((float)3.14) != 0)
351                                 return 21;
352                         if (mono_test_marshal_variant_in_double ((double)3.14) != 0)
353                                 return 22;
354                         if (mono_test_marshal_variant_in_bstr ("PI") != 0)
355                                 return 23;
356                         if (mono_test_marshal_variant_out_sbyte (out obj) != 0 || (sbyte)obj != 100)
357                                 return 24;
358                         if (mono_test_marshal_variant_out_byte (out obj) != 0 || (byte)obj != 100)
359                                 return 25;
360                         if (mono_test_marshal_variant_out_short (out obj) != 0 || (short)obj != 314)
361                                 return 26;
362                         if (mono_test_marshal_variant_out_ushort (out obj) != 0 || (ushort)obj != 314)
363                                 return 27;
364                         if (mono_test_marshal_variant_out_int (out obj) != 0 || (int)obj != 314)
365                                 return 28;
366                         if (mono_test_marshal_variant_out_uint (out obj) != 0 || (uint)obj != 314)
367                                 return 29;
368                         if (mono_test_marshal_variant_out_long (out obj) != 0 || (long)obj != 314)
369                                 return 30;
370                         if (mono_test_marshal_variant_out_ulong (out obj) != 0 || (ulong)obj != 314)
371                                 return 31;
372                         if (mono_test_marshal_variant_out_float (out obj) != 0 || ((float)obj - 3.14) / 3.14 > .001)
373                                 return 32;
374                         if (mono_test_marshal_variant_out_double (out obj) != 0 || ((double)obj - 3.14) / 3.14 > .001)
375                                 return 33;
376                         if (mono_test_marshal_variant_out_bstr (out obj) != 0 || (string)obj != "PI")
377                                 return 34;
378
379                         VarFunc func = new VarFunc (mono_test_marshal_variant_in_callback);
380                         if (mono_test_marshal_variant_in_sbyte_unmanaged (func) != 0)
381                                 return 35;
382                         if (mono_test_marshal_variant_in_byte_unmanaged (func) != 0)
383                                 return 36;
384                         if (mono_test_marshal_variant_in_short_unmanaged (func) != 0)
385                                 return 37;
386                         if (mono_test_marshal_variant_in_ushort_unmanaged (func) != 0)
387                                 return 38;
388                         if (mono_test_marshal_variant_in_int_unmanaged (func) != 0)
389                                 return 39;
390                         if (mono_test_marshal_variant_in_uint_unmanaged (func) != 0)
391                                 return 40;
392                         if (mono_test_marshal_variant_in_long_unmanaged (func) != 0)
393                                 return 41;
394                         if (mono_test_marshal_variant_in_ulong_unmanaged (func) != 0)
395                                 return 42;
396                         if (mono_test_marshal_variant_in_float_unmanaged (func) != 0)
397                                 return 43;
398                         if (mono_test_marshal_variant_in_double_unmanaged (func) != 0)
399                                 return 44;
400                         if (mono_test_marshal_variant_in_bstr_unmanaged (func) != 0)
401                                 return 45;
402                         if (mono_test_marshal_variant_in_bool_true_unmanaged (func) != 0)
403                                 return 46;
404
405                         VarRefFunc reffunc = new VarRefFunc (mono_test_marshal_variant_out_callback);
406                         if (mono_test_marshal_variant_out_sbyte_unmanaged (reffunc) != 0)
407                                 return 50;
408                         if (mono_test_marshal_variant_out_byte_unmanaged (reffunc) != 0)
409                                 return 51;
410                         if (mono_test_marshal_variant_out_short_unmanaged (reffunc) != 0)
411                                 return 52;
412                         if (mono_test_marshal_variant_out_ushort_unmanaged (reffunc) != 0)
413                                 return 53;
414                         if (mono_test_marshal_variant_out_int_unmanaged (reffunc) != 0)
415                                 return 54;
416                         if (mono_test_marshal_variant_out_uint_unmanaged (reffunc) != 0)
417                                 return 55;
418                         if (mono_test_marshal_variant_out_long_unmanaged (reffunc) != 0)
419                                 return 56;
420                         if (mono_test_marshal_variant_out_ulong_unmanaged (reffunc) != 0)
421                                 return 57;
422                         if (mono_test_marshal_variant_out_float_unmanaged (reffunc) != 0)
423                                 return 58;
424                         if (mono_test_marshal_variant_out_double_unmanaged (reffunc) != 0)
425                                 return 59;
426                         if (mono_test_marshal_variant_out_bstr_unmanaged (reffunc) != 0)
427                                 return 60;
428                         if (mono_test_marshal_variant_out_bool_true_unmanaged (reffunc) != 0)
429                                 return 61;
430
431                         if (mono_test_marshal_variant_out_sbyte_byref (out obj) != 0 || (sbyte)obj != 100)
432                                 return 97;
433                         if (mono_test_marshal_variant_out_byte_byref (out obj) != 0 || (byte)obj != 100)
434                                 return 98;
435                         if (mono_test_marshal_variant_out_short_byref (out obj) != 0 || (short)obj != 314)
436                                 return 99;
437                         if (mono_test_marshal_variant_out_ushort_byref (out obj) != 0 || (ushort)obj != 314)
438                                 return 100;
439                         if (mono_test_marshal_variant_out_int_byref (out obj) != 0 || (int)obj != 314)
440                                 return 101;
441                         if (mono_test_marshal_variant_out_uint_byref (out obj) != 0 || (uint)obj != 314)
442                                 return 102;
443                         if (mono_test_marshal_variant_out_long_byref (out obj) != 0 || (long)obj != 314)
444                                 return 103;
445                         if (mono_test_marshal_variant_out_ulong_byref (out obj) != 0 || (ulong)obj != 314)
446                                 return 104;
447                         if (mono_test_marshal_variant_out_float_byref (out obj) != 0 || ((float)obj - 3.14) / 3.14 > .001)
448                                 return 105;
449                         if (mono_test_marshal_variant_out_double_byref (out obj) != 0 || ((double)obj - 3.14) / 3.14 > .001)
450                                 return 106;
451                         if (mono_test_marshal_variant_out_bstr_byref (out obj) != 0 || (string)obj != "PI")
452                                 return 107;
453
454                         #endregion // VARIANT Tests
455
456                         #region Runtime Callable Wrapper Tests
457
458                         IntPtr pUnk;
459                         if (mono_test_marshal_com_object_create (out pUnk) != 0)
460                                 return 145;
461
462                         if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
463                                 return 146;
464
465                         if (Marshal.AddRef (pUnk) != 2)
466                                 return 147;
467
468                         if (mono_test_marshal_com_object_ref_count (pUnk) != 2)
469                                 return 148;
470
471                         if (Marshal.Release (pUnk) != 1)
472                                 return 149;
473
474                         if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
475                                 return 150;
476
477                         object com_obj = Marshal.GetObjectForIUnknown (pUnk);
478
479                         if (com_obj == null)
480                                 return 151;
481
482                         ITest itest = com_obj as ITest;
483
484                         if (itest == null)
485                                 return 152;
486
487                         IntPtr pUnk2;
488                         if (mono_test_marshal_com_object_same (out pUnk2) != 0)
489                                 return 153;
490
491                         object com_obj2 = Marshal.GetObjectForIUnknown (pUnk2);
492                         
493                         if (com_obj != com_obj2)
494                                 return 154;
495
496                         if (!com_obj.Equals (com_obj2))
497                                 return 155;
498
499                         IntPtr pUnk3;
500                         if (mono_test_marshal_com_object_create (out pUnk3) != 0)
501                                 return 156;
502
503                         object com_obj3 = Marshal.GetObjectForIUnknown (pUnk3);
504                         if (com_obj == com_obj3)
505                                 return 157;
506
507                         if (com_obj.Equals (com_obj3))
508                                 return 158;
509
510                         // com_obj & com_obj2 share a RCW
511                         if (Marshal.ReleaseComObject (com_obj2) != 1)
512                                 return 159;
513
514                         // com_obj3 should only have one RCW
515                         if (Marshal.ReleaseComObject (com_obj3) != 0)
516                                 return 160;
517
518                         IntPtr iunknown = Marshal.GetIUnknownForObject (com_obj);
519                         if (iunknown == IntPtr.Zero)
520                                 return 170;
521
522                         if (pUnk != iunknown)
523                                 return 171;
524
525                         if (TestITest (itest) != 0)
526                                 return 172;
527
528                         if (TestITestPresSig (itest as ITestPresSig) != 0)
529                                 return 173;
530
531                         if (TestITestDelegate (itest) != 0)
532                                 return 174;
533
534                         itest = new TestClass ();
535
536                         if (TestITest (itest) != 0)
537                                 return 175;
538
539                         itest = (ITest)System.Activator.CreateInstance (typeof(TestActivatorClass));
540
541                         if (TestITest (itest) != 0)
542                                 return 176;
543
544                         #endregion // Runtime Callable Wrapper Tests
545
546                         #region COM Callable Wrapper Tests
547
548                         ManagedTest test = new ManagedTest ();
549
550                         mono_test_marshal_ccw_itest (test);
551
552                         if (test.Status != 0)
553                                 return 200;
554
555                         ManagedTestPresSig test_pres_sig = new ManagedTestPresSig ();
556
557                         mono_test_marshal_ccw_itest (test_pres_sig);
558
559                         #endregion // COM Callable Wrapper Tests
560
561                         #region SAFEARRAY tests
562                         
563                         if (isWindows) {
564
565                                 /* out */
566
567                                 Array array;
568                                 if ((mono_test_marshal_safearray_out_1dim_vt_bstr_empty (out array) != 0) || (array.Rank != 1) || (array.Length != 0))
569                                         return 62;
570
571                                 if ((mono_test_marshal_safearray_out_1dim_vt_bstr (out array) != 0) || (array.Rank != 1) || (array.Length != 10))
572                                         return 63;
573                                 for (int i = 0; i < 10; ++i) {
574                                         if (i != Convert.ToInt32 (array.GetValue (i)))
575                                                 return 64;
576                                 }
577
578                                 if ((mono_test_marshal_safearray_out_2dim_vt_i4 (out array) != 0) || (array.Rank != 2))
579                                         return 65;
580                                 if (   (array.GetLowerBound (0) != 0) || (array.GetUpperBound (0) != 3)
581                                         || (array.GetLowerBound (1) != 0) || (array.GetUpperBound (1) != 2))
582                                         return 66;
583                                 for (int i = array.GetLowerBound (0); i <= array.GetUpperBound (0); ++i)
584                                 {
585                                         for (int j = array.GetLowerBound (1); j <= array.GetUpperBound (1); ++j) {
586                                                 if ((i + 1) * 10 + (j + 1) != (int)array.GetValue (new long[] { i, j }))
587                                                         return 67;
588                                         }
589                                 }
590
591                                 if ((mono_test_marshal_safearray_out_4dim_vt_i4 (out array) != 0) || (array.Rank != 4))
592                                         return 68;
593                                 if (   (array.GetLowerBound (0) != 15) || (array.GetUpperBound (0) != 24)
594                                         || (array.GetLowerBound (1) != 20) || (array.GetUpperBound (1) != 22)
595                                         || (array.GetLowerBound (2) !=  5) || (array.GetUpperBound (2) != 10)
596                                         || (array.GetLowerBound (3) != 12) || (array.GetUpperBound (3) != 18) )
597                                         return 69;
598
599                                 int index = 0;
600                                 for (int i = array.GetLowerBound (3); i <= array.GetUpperBound (3); ++i) {
601                                         for (int j = array.GetLowerBound (2); j <= array.GetUpperBound (2); ++j) {
602                                                 for (int k = array.GetLowerBound (1); k <= array.GetUpperBound (1); ++k) {
603                                                         for (int l = array.GetLowerBound (0); l <= array.GetUpperBound (0); ++l) {
604                                                                 if (index != (int)array.GetValue (new long[] { l, k, j, i }))
605                                                                         return 70;
606                                                                 ++index;
607                                                         }
608                                                 }
609                                         }
610                                 }
611
612                                 /* in */
613
614                                 array = new object[] { };
615                                 if (mono_test_marshal_safearray_in_byval_1dim_empty (array) != 0)
616                                         return 71;
617
618                                 array = new object[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
619                                 if (mono_test_marshal_safearray_in_byval_1dim_vt_i4 (array) != 0)
620                                         return 72;
621
622                                 array = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
623                                 if (mono_test_marshal_safearray_in_byval_1dim_vt_mixed (array) != 0)
624                                         return 73;
625                                 if ((int)array.GetValue (0) != 0)
626                                         return 74;
627
628                                 array = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
629                                 if (mono_test_marshal_safearray_in_byval_2dim_vt_i4 (array) != 0)
630                                         return 75;
631                                 if ((int)array.GetValue (new int[] { 0, 0 }) != 11)
632                                         return 76;
633
634                                 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
635                                 if (mono_test_marshal_safearray_in_byval_3dim_vt_bstr (array) != 0)
636                                         return 77;
637                                 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
638                                         return 78;
639
640                                 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
641                                 if ((mono_test_marshal_safearray_in_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 3) || (array.Length != 12))
642                                         return 79;
643                                 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
644                                         return 80;
645
646                                 /* in, out, byref */
647
648                                 array = new object[] { };
649                                 if ((mono_test_marshal_safearray_in_out_byref_1dim_empty (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
650                                         return 81;
651                                 for (int i = 0; i < 8; ++i)
652                                 {
653                                         if (i != Convert.ToInt32 (array.GetValue (i)))
654                                                 return 82;
655                                 }
656
657                                 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
658                                 if ((mono_test_marshal_safearray_in_out_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
659                                         return 83;
660                                 for (int i = 0; i < 8; ++i)
661                                 {
662                                         if (i != Convert.ToInt32 (array.GetValue (i)))
663                                                 return 84;
664                                 }
665
666                                 array = new object[] { 1 };
667                                 if ((mono_test_marshal_safearray_in_out_byref_1dim_vt_i4 (ref array) != 0) || (array.Rank != 1) || (array.Length != 1))
668                                 {
669                                     return 85;
670                                 }
671                                 if (Convert.ToInt32 (array.GetValue (0)) != -1)
672                                     return 86;
673
674                                 /* in, out, byval */
675
676                                 array = new object[] { 1 };
677                                 if ((mono_test_marshal_safearray_in_out_byval_1dim_vt_i4 (array) != 0) || (array.Rank != 1) || (array.Length != 1))
678                                 {
679                                         return 87;
680                                 }
681                                 if (Convert.ToInt32 (array.GetValue (0)) != 12345)
682                                         return 88;
683
684                                 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
685                                 if ((mono_test_marshal_safearray_in_out_byval_3dim_vt_bstr (array) != 0) || (array.Rank != 3) || (array.Length != 12))
686                                 {
687                                     return 89;
688                                 }
689                                 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 1 })) != 111)
690                                         return 90;
691                                 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 2 })) != 333)
692                                         return 91;
693                                 if (Convert.ToString(array.GetValue (new int[] { 0, 1, 0 })) != "ABCDEFG")
694                                         return 92;
695
696                                 /* Multiple safearray parameters with various types and options */
697
698                                 Array array1 = new object[] { 1 };
699                                 Array array2 = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
700                                 Array array3 = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
701                                 Array array4 = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
702                                 if (    (mono_test_marshal_safearray_mixed (array1, out array2, array3, ref array4) != 0)
703                                          || (array1.Rank != 1) || (array1.Length != 1) || (Convert.ToInt32 (array1.GetValue (0)) != 12345)
704                                          || (array2.Rank != 1) || (array2.Length != 10)
705                                          || (array4.Rank != 1) || (array4.Length != 8)
706                                         )
707                                 {
708                                         return 93;
709                                 }
710                                 for (int i = 0; i < 10; ++i)
711                                 {
712                                         if (i != Convert.ToInt32 (array2.GetValue (i)))
713                                                 return 94;
714                                 }
715                                 if ((int)array3.GetValue (0) != 0)
716                                         return 95;
717                                 for (int i = 0; i < 8; ++i)
718                                 {
719                                         if (i != Convert.ToInt32 (array4.GetValue (i)))
720                                                 return 96;
721                                 }
722                         }
723                         #endregion // SafeArray Tests
724
725                         #region COM Visible Test
726                         TestVisible test_vis = new TestVisible();
727                         IntPtr pDisp = Marshal.GetIDispatchForObject(test_vis);
728                         if (pDisp == IntPtr.Zero)
729                                 return 200;
730                         #endregion 
731                 }
732
733         return 0;
734         }
735
736
737         [ComImport ()]
738         [Guid ("00000000-0000-0000-0000-000000000001")]
739         [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
740         public interface ITest
741         {
742                 // properties need to go first since mcs puts them there
743                 ITest Test
744                 {
745                         [return: MarshalAs (UnmanagedType.Interface)]
746                         [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
747                         get;
748                 }
749
750                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
751                 void SByteIn (sbyte val);
752                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
753                 void ByteIn (byte val);
754                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
755                 void ShortIn (short val);
756                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
757                 void UShortIn (ushort val);
758                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
759                 void IntIn (int val);
760                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
761                 void UIntIn (uint val);
762                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
763                 void LongIn (long val);
764                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
765                 void ULongIn (ulong val);
766                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
767                 void FloatIn (float val);
768                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
769                 void DoubleIn (double val);
770                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
771                 void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
772                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
773                 void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
774         }
775
776         [ComImport ()]
777         [Guid ("00000000-0000-0000-0000-000000000001")]
778         [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
779         public interface ITestPresSig
780         {
781                 // properties need to go first since mcs puts them there
782                 ITestPresSig Test
783                 {
784                         [return: MarshalAs (UnmanagedType.Interface)]
785                         [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
786                         get;
787                 }
788
789                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
790                 [PreserveSig ()]
791                 int SByteIn (sbyte val);
792                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
793                 [PreserveSig ()]
794                 int ByteIn (byte val);
795                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
796                 [PreserveSig ()]
797                 int ShortIn (short val);
798                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
799                 [PreserveSig ()]
800                 int UShortIn (ushort val);
801                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
802                 [PreserveSig ()]
803                 int IntIn (int val);
804                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
805                 [PreserveSig ()]
806                 int UIntIn (uint val);
807                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
808                 [PreserveSig ()]
809                 int LongIn (long val);
810                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
811                 [PreserveSig ()]
812                 int ULongIn (ulong val);
813                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
814                 [PreserveSig ()]
815                 int FloatIn (float val);
816                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
817                 [PreserveSig ()]
818                 int DoubleIn (double val);
819                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
820                 [PreserveSig ()]
821                 int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val);
822                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
823                 [PreserveSig ()]
824                 int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val);
825         }
826
827         [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
828         [System.Runtime.InteropServices.ComImportAttribute ()]
829         [System.Runtime.InteropServices.ClassInterfaceAttribute (ClassInterfaceType.None)]
830         public class _TestClass : ITest
831         {
832                 // properties need to go first since mcs puts them there
833                 public virtual extern ITest Test
834                 {
835                         [return: MarshalAs (UnmanagedType.Interface)]
836                         [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
837                         get;
838                 }
839
840                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
841                 public virtual extern void SByteIn (sbyte val);
842                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
843                 public virtual extern void ByteIn (byte val);
844                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
845                 public virtual extern void ShortIn (short val);
846                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
847                 public virtual extern void UShortIn (ushort val);
848                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
849                 public virtual extern void IntIn (int val);
850                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
851                 public virtual extern void UIntIn (uint val);
852                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
853                 public virtual extern void LongIn (long val);
854                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
855                 public virtual extern void ULongIn (ulong val);
856                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
857                 public virtual extern void FloatIn (float val);
858                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
859                 public virtual extern void DoubleIn (double val);
860                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
861                 public virtual extern void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
862                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
863                 public virtual extern void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
864         }
865
866         [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
867         public class TestClass : _TestClass
868         {
869                 static TestClass ()
870                 {
871                         ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
872                 }
873                 private static System.IntPtr CreateObject (System.IntPtr aggr)
874                 {
875                         IntPtr pUnk3;
876                         mono_test_marshal_com_object_create (out pUnk3);
877                         return pUnk3;
878                 }
879         }
880
881         [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000003")]
882         public class TestActivatorClass : _TestClass
883         {
884                 static TestActivatorClass ()
885                 {
886                         ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
887                 }
888                 private static System.IntPtr CreateObject (System.IntPtr aggr)
889                 {
890                         IntPtr pUnk3;
891                         mono_test_marshal_com_object_create (out pUnk3);
892                         return pUnk3;
893                 }
894         }
895
896         delegate void SByteInDelegate (sbyte val);
897         delegate void ByteInDelegate (byte val);
898         delegate void ShortInDelegate (short val);
899         delegate void UShortInDelegate (ushort val);
900         delegate void IntInDelegate (int val);
901         delegate void UIntInDelegate (uint val);
902         delegate void LongInDelegate (long val);
903         delegate void ULongInDelegate (ulong val);
904         delegate void FloatInDelegate (float val);
905         delegate void DoubleInDelegate (double val);
906         delegate void ITestInDelegate (ITest val);
907         delegate void ITestOutDelegate (out ITest val);
908
909         public class ManagedTestPresSig : ITestPresSig
910         {               // properties need to go first since mcs puts them there
911                 public ITestPresSig Test
912                 {
913                         get
914                         {
915                                 return new ManagedTestPresSig ();
916                         }
917                 }
918
919                 public int SByteIn (sbyte val)
920                 {
921                         if (val != -100)
922                                 return 1;
923                         return 0;
924                 }
925
926                 public int ByteIn (byte val)
927                 {
928                         if (val != 100)
929                                 return 2;
930                         return 0;
931                 }
932
933                 public int ShortIn (short val)
934                 {
935                         if (val != -100)
936                                 return 3;
937                         return 0;
938                 }
939
940                 public int UShortIn (ushort val)
941                 {
942                         if (val != 100)
943                                 return 4;
944                         return 0;
945                 }
946
947                 public int IntIn (int val)
948                 {
949                         if (val != -100)
950                                 return 5;
951                         return 0;
952                 }
953
954                 public int UIntIn (uint val)
955                 {
956                         if (val != 100)
957                                 return 6;
958                         return 0;
959                 }
960
961                 public int LongIn (long val)
962                 {
963                         if (val != -100)
964                                 return 7;
965                         return 0;
966                 }
967
968                 public int ULongIn (ulong val)
969                 {
970                         if (val != 100)
971                                 return 8;
972                         return 0;
973                 }
974
975                 public int FloatIn (float val)
976                 {
977                         if (Math.Abs (val - 3.14f) > .000001)
978                                 return 9;
979                         return 0;
980                 }
981
982                 public int DoubleIn (double val)
983                 {
984                         if (Math.Abs (val - 3.14f) > .000001)
985                                 return 10;
986                         return 0;
987                 }
988
989                 public int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val)
990                 {
991                         if (val == null)
992                                 return 11;
993                         if (null == val as ManagedTestPresSig)
994                                 return 12;
995                         return 0;
996                 }
997
998                 public int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val)
999                 {
1000                         val = new ManagedTestPresSig ();
1001                         return 0;
1002                 }
1003         }
1004
1005         public class ManagedTest : ITest
1006         {
1007                 private int status = 0;
1008                 public int Status
1009                 {
1010                         get { return status; }
1011                 }
1012                 public void SByteIn (sbyte val)
1013                 {
1014                         if (val != -100)
1015                                 status = 1;
1016                 }
1017
1018                 public void ByteIn (byte val)
1019                 {
1020                         if (val != 100)
1021                                 status = 2;
1022                 }
1023
1024                 public void ShortIn (short val)
1025                 {
1026                         if (val != -100)
1027                                 status = 3;
1028                 }
1029
1030                 public void UShortIn (ushort val)
1031                 {
1032                         if (val != 100)
1033                                 status = 4;
1034                 }
1035
1036                 public void IntIn (int val)
1037                 {
1038                         if (val != -100)
1039                                 status = 5;
1040                 }
1041
1042                 public void UIntIn (uint val)
1043                 {
1044                         if (val != 100)
1045                                 status = 6;
1046                 }
1047
1048                 public void LongIn (long val)
1049                 {
1050                         if (val != -100)
1051                                 status = 7;
1052                 }
1053
1054                 public void ULongIn (ulong val)
1055                 {
1056                         if (val != 100)
1057                                 status = 8;
1058                 }
1059
1060                 public void FloatIn (float val)
1061                 {
1062                         if (Math.Abs (val - 3.14f) > .000001)
1063                                 status = 9;
1064                 }
1065
1066                 public void DoubleIn (double val)
1067                 {
1068                         if (Math.Abs (val - 3.14) > .000001)
1069                                 status = 10;
1070                 }
1071
1072                 public void ITestIn (ITest val)
1073                 {
1074                         if (val == null)
1075                                 status = 11;
1076                         if (null == val as ManagedTest)
1077                                 status = 12;
1078                 }
1079
1080                 public void ITestOut (out ITest val)
1081                 {
1082                         val = new ManagedTest ();
1083                 }
1084
1085                 public ITest Test
1086                 {
1087                         get
1088                         {
1089                                 return new ManagedTest ();
1090                         }
1091                 }
1092         }
1093
1094         public static int mono_test_marshal_variant_in_callback (VarEnum vt, object obj)
1095         {
1096                 switch (vt)
1097                 {
1098                 case VarEnum.VT_I1:
1099                         if (obj.GetType () != typeof (sbyte))
1100                                 return 1;
1101                         if ((sbyte)obj != -100)
1102                                 return 2;
1103                         break;
1104                 case VarEnum.VT_UI1:
1105                         if (obj.GetType () != typeof (byte))
1106                                 return 1;
1107                         if ((byte)obj != 100)
1108                                 return 2;
1109                         break;
1110                 case VarEnum.VT_I2:
1111                         if (obj.GetType () != typeof (short))
1112                                 return 1;
1113                         if ((short)obj != -100)
1114                                 return 2;
1115                         break;
1116                 case VarEnum.VT_UI2:
1117                         if (obj.GetType () != typeof (ushort))
1118                                 return 1;
1119                         if ((ushort)obj != 100)
1120                                 return 2;
1121                         break;
1122                 case VarEnum.VT_I4:
1123                         if (obj.GetType () != typeof (int))
1124                                 return 1;
1125                         if ((int)obj != -100)
1126                                 return 2;
1127                         break;
1128                 case VarEnum.VT_UI4:
1129                         if (obj.GetType () != typeof (uint))
1130                                 return 1;
1131                         if ((uint)obj != 100)
1132                                 return 2;
1133                         break;
1134                 case VarEnum.VT_I8:
1135                         if (obj.GetType () != typeof (long))
1136                                 return 1;
1137                         if ((long)obj != -100)
1138                                 return 2;
1139                         break;
1140                 case VarEnum.VT_UI8:
1141                         if (obj.GetType () != typeof (ulong))
1142                                 return 1;
1143                         if ((ulong)obj != 100)
1144                                 return 2;
1145                         break;
1146                 case VarEnum.VT_R4:
1147                         if (obj.GetType () != typeof (float))
1148                                 return 1;
1149                         if (Math.Abs ((float)obj - 3.14f) > 1e-10)
1150                                 return 2;
1151                         break;
1152                 case VarEnum.VT_R8:
1153                         if (obj.GetType () != typeof (double))
1154                                 return 1;
1155                         if (Math.Abs ((double)obj - 3.14) > 1e-10)
1156                                 return 2;
1157                         break;
1158                 case VarEnum.VT_BSTR:
1159                         if (obj.GetType () != typeof (string))
1160                                 return 1;
1161                         if ((string)obj != "PI")
1162                                 return 2;
1163                         break;
1164                 case VarEnum.VT_BOOL:
1165                         if (obj.GetType () != typeof (bool))
1166                                 return 1;
1167                         if ((bool)obj != true)
1168                                 return 2;
1169                         break;
1170                 }
1171                 return 0;
1172         }
1173
1174         public static int mono_test_marshal_variant_out_callback (VarEnum vt, ref object obj)
1175         {
1176                 switch (vt) {
1177                 case VarEnum.VT_I1:
1178                         obj = (sbyte)-100;
1179                         break;
1180                 case VarEnum.VT_UI1:
1181                         obj = (byte)100;
1182                         break;
1183                 case VarEnum.VT_I2:
1184                         obj = (short)-100;
1185                         break;
1186                 case VarEnum.VT_UI2:
1187                         obj = (ushort)100;
1188                         break;
1189                 case VarEnum.VT_I4:
1190                         obj = (int)-100;
1191                         break;
1192                 case VarEnum.VT_UI4:
1193                         obj = (uint)100;
1194                         break;
1195                 case VarEnum.VT_I8:
1196                         obj = (long)-100;
1197                         break;
1198                 case VarEnum.VT_UI8:
1199                         obj = (ulong)100;
1200                         break;
1201                 case VarEnum.VT_R4:
1202                         obj = (float)3.14f;
1203                         break;
1204                 case VarEnum.VT_R8:
1205                         obj = (double)3.14;
1206                         break;
1207                 case VarEnum.VT_BSTR:
1208                         obj = "PI";
1209                         break;
1210                 case VarEnum.VT_BOOL:
1211                         obj = true;
1212                         break;
1213                 }
1214                 return 0;
1215         }
1216
1217         public static int TestITest (ITest itest)
1218         {
1219                 try {
1220                         ITest itest2;
1221                         itest.SByteIn (-100);
1222                         itest.ByteIn (100);
1223                         itest.ShortIn (-100);
1224                         itest.UShortIn (100);
1225                         itest.IntIn (-100);
1226                         itest.UIntIn (100);
1227                         itest.LongIn (-100);
1228                         itest.ULongIn (100);
1229                         itest.FloatIn (3.14f);
1230                         itest.DoubleIn (3.14);
1231                         itest.ITestIn (itest);
1232                         itest.ITestOut (out itest2);
1233                 }
1234                 catch (Exception ex) {
1235                         return 1;
1236                 }
1237                 return 0;
1238         }
1239
1240         public static int TestITestPresSig (ITestPresSig itest)
1241         {
1242                 ITestPresSig itest2;
1243                 if (itest.SByteIn (-100) != 0)
1244                         return 1000;
1245                 if (itest.ByteIn (100) != 0)
1246                         return 1001;
1247                 if (itest.ShortIn (-100) != 0)
1248                         return 1002;
1249                 if (itest.UShortIn (100) != 0)
1250                         return 1003;
1251                 if (itest.IntIn (-100) != 0)
1252                         return 1004;
1253                 if (itest.UIntIn (100) != 0)
1254                         return 1005;
1255                 if (itest.LongIn (-100) != 0)
1256                         return 1006;
1257                 if (itest.ULongIn (100) != 0)
1258                         return 1007;
1259                 if (itest.FloatIn (3.14f) != 0)
1260                         return 1008;
1261                 if (itest.DoubleIn (3.14) != 0)
1262                         return 1009;
1263                 if (itest.ITestIn (itest) != 0)
1264                         return 1010;
1265                 if (itest.ITestOut (out itest2) != 0)
1266                         return 1011;
1267                 return 0;
1268         }
1269
1270         public static int TestITestDelegate (ITest itest)
1271         {
1272                 try {
1273                         ITest itest2;
1274
1275                         SByteInDelegate SByteInFcn= itest.SByteIn;
1276                         ByteInDelegate ByteInFcn = itest.ByteIn;
1277                         UShortInDelegate UShortInFcn = itest.UShortIn;
1278                         IntInDelegate IntInFcn = itest.IntIn;
1279                         UIntInDelegate UIntInFcn = itest.UIntIn;
1280                         LongInDelegate LongInFcn = itest.LongIn;
1281
1282                         ULongInDelegate ULongInFcn = itest.ULongIn;
1283                         FloatInDelegate FloatInFcn = itest.FloatIn;
1284                         DoubleInDelegate DoubleInFcn = itest.DoubleIn;
1285                         ITestInDelegate ITestInFcn = itest.ITestIn;
1286                         ITestOutDelegate ITestOutFcn = itest.ITestOut;
1287
1288                         SByteInFcn (-100);
1289                         ByteInFcn (100);
1290                         UShortInFcn (100);
1291                         IntInFcn (-100);
1292                         UIntInFcn (100);
1293                         LongInFcn (-100);
1294                         ULongInFcn (100);
1295                         FloatInFcn (3.14f);
1296                         DoubleInFcn (3.14);
1297                         ITestInFcn (itest);
1298                         ITestOutFcn (out itest2);
1299                 }
1300                 catch (Exception) {
1301                         return 1;
1302                 }
1303                 return 0;
1304         }
1305 }
1306
1307 public class TestVisible
1308 {
1309 }