[interp] disable some tests that fail on CI only
[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 #if !MOBILE
459
460                         IntPtr pUnk;
461                         if (mono_test_marshal_com_object_create (out pUnk) != 0)
462                                 return 145;
463
464                         if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
465                                 return 146;
466
467                         if (Marshal.AddRef (pUnk) != 2)
468                                 return 147;
469
470                         if (mono_test_marshal_com_object_ref_count (pUnk) != 2)
471                                 return 148;
472
473                         if (Marshal.Release (pUnk) != 1)
474                                 return 149;
475
476                         if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
477                                 return 150;
478
479                         object com_obj = Marshal.GetObjectForIUnknown (pUnk);
480
481                         if (com_obj == null)
482                                 return 151;
483
484                         ITest itest = com_obj as ITest;
485
486                         if (itest == null)
487                                 return 152;
488
489                         IntPtr pUnk2;
490                         if (mono_test_marshal_com_object_same (out pUnk2) != 0)
491                                 return 153;
492
493                         object com_obj2 = Marshal.GetObjectForIUnknown (pUnk2);
494                         
495                         if (com_obj != com_obj2)
496                                 return 154;
497
498                         if (!com_obj.Equals (com_obj2))
499                                 return 155;
500
501                         IntPtr pUnk3;
502                         if (mono_test_marshal_com_object_create (out pUnk3) != 0)
503                                 return 156;
504
505                         object com_obj3 = Marshal.GetObjectForIUnknown (pUnk3);
506                         if (com_obj == com_obj3)
507                                 return 157;
508
509                         if (com_obj.Equals (com_obj3))
510                                 return 158;
511
512                         // com_obj & com_obj2 share a RCW
513                         if (Marshal.ReleaseComObject (com_obj2) != 1)
514                                 return 159;
515
516                         // com_obj3 should only have one RCW
517                         if (Marshal.ReleaseComObject (com_obj3) != 0)
518                                 return 160;
519
520                         IntPtr iunknown = Marshal.GetIUnknownForObject (com_obj);
521                         if (iunknown == IntPtr.Zero)
522                                 return 170;
523
524                         if (pUnk != iunknown)
525                                 return 171;
526
527                         if (TestITest (itest) != 0)
528                                 return 172;
529
530                         if (TestITestPresSig (itest as ITestPresSig) != 0)
531                                 return 173;
532
533                         if (TestITestDelegate (itest) != 0)
534                                 return 174;
535
536                         itest = new TestClass ();
537
538                         if (TestITest (itest) != 0)
539                                 return 175;
540
541                         itest = (ITest)System.Activator.CreateInstance (typeof(TestActivatorClass));
542
543                         if (TestITest (itest) != 0)
544                                 return 176;
545
546 #endif
547
548                         #endregion // Runtime Callable Wrapper Tests
549
550                         #region COM Callable Wrapper Tests
551
552                         ManagedTest test = new ManagedTest ();
553
554                         mono_test_marshal_ccw_itest (test);
555
556                         if (test.Status != 0)
557                                 return 200;
558
559                         ManagedTestPresSig test_pres_sig = new ManagedTestPresSig ();
560
561                         mono_test_marshal_ccw_itest (test_pres_sig);
562
563                         #endregion // COM Callable Wrapper Tests
564
565                         #region SAFEARRAY tests
566                         
567                         if (isWindows) {
568
569                                 /* out */
570
571                                 Array array;
572                                 if ((mono_test_marshal_safearray_out_1dim_vt_bstr_empty (out array) != 0) || (array.Rank != 1) || (array.Length != 0))
573                                         return 62;
574
575                                 if ((mono_test_marshal_safearray_out_1dim_vt_bstr (out array) != 0) || (array.Rank != 1) || (array.Length != 10))
576                                         return 63;
577                                 for (int i = 0; i < 10; ++i) {
578                                         if (i != Convert.ToInt32 (array.GetValue (i)))
579                                                 return 64;
580                                 }
581
582                                 if ((mono_test_marshal_safearray_out_2dim_vt_i4 (out array) != 0) || (array.Rank != 2))
583                                         return 65;
584                                 if (   (array.GetLowerBound (0) != 0) || (array.GetUpperBound (0) != 3)
585                                         || (array.GetLowerBound (1) != 0) || (array.GetUpperBound (1) != 2))
586                                         return 66;
587                                 for (int i = array.GetLowerBound (0); i <= array.GetUpperBound (0); ++i)
588                                 {
589                                         for (int j = array.GetLowerBound (1); j <= array.GetUpperBound (1); ++j) {
590                                                 if ((i + 1) * 10 + (j + 1) != (int)array.GetValue (new long[] { i, j }))
591                                                         return 67;
592                                         }
593                                 }
594
595                                 if ((mono_test_marshal_safearray_out_4dim_vt_i4 (out array) != 0) || (array.Rank != 4))
596                                         return 68;
597                                 if (   (array.GetLowerBound (0) != 15) || (array.GetUpperBound (0) != 24)
598                                         || (array.GetLowerBound (1) != 20) || (array.GetUpperBound (1) != 22)
599                                         || (array.GetLowerBound (2) !=  5) || (array.GetUpperBound (2) != 10)
600                                         || (array.GetLowerBound (3) != 12) || (array.GetUpperBound (3) != 18) )
601                                         return 69;
602
603                                 int index = 0;
604                                 for (int i = array.GetLowerBound (3); i <= array.GetUpperBound (3); ++i) {
605                                         for (int j = array.GetLowerBound (2); j <= array.GetUpperBound (2); ++j) {
606                                                 for (int k = array.GetLowerBound (1); k <= array.GetUpperBound (1); ++k) {
607                                                         for (int l = array.GetLowerBound (0); l <= array.GetUpperBound (0); ++l) {
608                                                                 if (index != (int)array.GetValue (new long[] { l, k, j, i }))
609                                                                         return 70;
610                                                                 ++index;
611                                                         }
612                                                 }
613                                         }
614                                 }
615
616                                 /* in */
617
618                                 array = new object[] { };
619                                 if (mono_test_marshal_safearray_in_byval_1dim_empty (array) != 0)
620                                         return 71;
621
622                                 array = new object[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
623                                 if (mono_test_marshal_safearray_in_byval_1dim_vt_i4 (array) != 0)
624                                         return 72;
625
626                                 array = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
627                                 if (mono_test_marshal_safearray_in_byval_1dim_vt_mixed (array) != 0)
628                                         return 73;
629                                 if ((int)array.GetValue (0) != 0)
630                                         return 74;
631
632                                 array = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
633                                 if (mono_test_marshal_safearray_in_byval_2dim_vt_i4 (array) != 0)
634                                         return 75;
635                                 if ((int)array.GetValue (new int[] { 0, 0 }) != 11)
636                                         return 76;
637
638                                 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
639                                 if (mono_test_marshal_safearray_in_byval_3dim_vt_bstr (array) != 0)
640                                         return 77;
641                                 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
642                                         return 78;
643
644                                 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
645                                 if ((mono_test_marshal_safearray_in_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 3) || (array.Length != 12))
646                                         return 79;
647                                 if ((string)array.GetValue (new int[] { 0, 0, 0 }) != "111")
648                                         return 80;
649
650                                 /* in, out, byref */
651
652                                 array = new object[] { };
653                                 if ((mono_test_marshal_safearray_in_out_byref_1dim_empty (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
654                                         return 81;
655                                 for (int i = 0; i < 8; ++i)
656                                 {
657                                         if (i != Convert.ToInt32 (array.GetValue (i)))
658                                                 return 82;
659                                 }
660
661                                 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
662                                 if ((mono_test_marshal_safearray_in_out_byref_3dim_vt_bstr (ref array) != 0) || (array.Rank != 1) || (array.Length != 8))
663                                         return 83;
664                                 for (int i = 0; i < 8; ++i)
665                                 {
666                                         if (i != Convert.ToInt32 (array.GetValue (i)))
667                                                 return 84;
668                                 }
669
670                                 array = new object[] { 1 };
671                                 if ((mono_test_marshal_safearray_in_out_byref_1dim_vt_i4 (ref array) != 0) || (array.Rank != 1) || (array.Length != 1))
672                                 {
673                                     return 85;
674                                 }
675                                 if (Convert.ToInt32 (array.GetValue (0)) != -1)
676                                     return 86;
677
678                                 /* in, out, byval */
679
680                                 array = new object[] { 1 };
681                                 if ((mono_test_marshal_safearray_in_out_byval_1dim_vt_i4 (array) != 0) || (array.Rank != 1) || (array.Length != 1))
682                                 {
683                                         return 87;
684                                 }
685                                 if (Convert.ToInt32 (array.GetValue (0)) != 12345)
686                                         return 88;
687
688                                 array = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
689                                 if ((mono_test_marshal_safearray_in_out_byval_3dim_vt_bstr (array) != 0) || (array.Rank != 3) || (array.Length != 12))
690                                 {
691                                     return 89;
692                                 }
693                                 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 1 })) != 111)
694                                         return 90;
695                                 if (Convert.ToInt32 (array.GetValue (new int[] { 1, 1, 2 })) != 333)
696                                         return 91;
697                                 if (Convert.ToString(array.GetValue (new int[] { 0, 1, 0 })) != "ABCDEFG")
698                                         return 92;
699
700                                 /* Multiple safearray parameters with various types and options */
701
702                                 Array array1 = new object[] { 1 };
703                                 Array array2 = new object[,] { { 11, 12, 13, 14 }, { 21, 22, 23, 24 } };
704                                 Array array3 = new object[] { 0, "1", 2, "3", 4, "5", 6, "7", 8, "9", 10, "11", 12 };
705                                 Array array4 = new object[,,] { { { "111", "112", "113" }, { "121", "122", "123" } }, { { "211", "212", "213" }, { "221", "222", "223" } } };
706                                 if (    (mono_test_marshal_safearray_mixed (array1, out array2, array3, ref array4) != 0)
707                                          || (array1.Rank != 1) || (array1.Length != 1) || (Convert.ToInt32 (array1.GetValue (0)) != 12345)
708                                          || (array2.Rank != 1) || (array2.Length != 10)
709                                          || (array4.Rank != 1) || (array4.Length != 8)
710                                         )
711                                 {
712                                         return 93;
713                                 }
714                                 for (int i = 0; i < 10; ++i)
715                                 {
716                                         if (i != Convert.ToInt32 (array2.GetValue (i)))
717                                                 return 94;
718                                 }
719                                 if ((int)array3.GetValue (0) != 0)
720                                         return 95;
721                                 for (int i = 0; i < 8; ++i)
722                                 {
723                                         if (i != Convert.ToInt32 (array4.GetValue (i)))
724                                                 return 96;
725                                 }
726                         }
727                         #endregion // SafeArray Tests
728
729                         #region COM Visible Test
730                         TestVisible test_vis = new TestVisible();
731                         IntPtr pDisp = Marshal.GetIDispatchForObject(test_vis);
732                         if (pDisp == IntPtr.Zero)
733                                 return 200;
734                         #endregion 
735                 }
736
737         return 0;
738         }
739
740
741         [ComImport ()]
742         [Guid ("00000000-0000-0000-0000-000000000001")]
743         [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
744         public interface ITest
745         {
746                 // properties need to go first since mcs puts them there
747                 ITest Test
748                 {
749                         [return: MarshalAs (UnmanagedType.Interface)]
750                         [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
751                         get;
752                 }
753
754                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
755                 void SByteIn (sbyte val);
756                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
757                 void ByteIn (byte val);
758                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
759                 void ShortIn (short val);
760                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
761                 void UShortIn (ushort val);
762                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
763                 void IntIn (int val);
764                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
765                 void UIntIn (uint val);
766                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
767                 void LongIn (long val);
768                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
769                 void ULongIn (ulong val);
770                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
771                 void FloatIn (float val);
772                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
773                 void DoubleIn (double val);
774                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
775                 void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
776                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
777                 void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
778         }
779
780         [ComImport ()]
781         [Guid ("00000000-0000-0000-0000-000000000001")]
782         [InterfaceType (ComInterfaceType.InterfaceIsIUnknown)]
783         public interface ITestPresSig
784         {
785                 // properties need to go first since mcs puts them there
786                 ITestPresSig Test
787                 {
788                         [return: MarshalAs (UnmanagedType.Interface)]
789                         [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
790                         get;
791                 }
792
793                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
794                 [PreserveSig ()]
795                 int SByteIn (sbyte val);
796                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
797                 [PreserveSig ()]
798                 int ByteIn (byte val);
799                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
800                 [PreserveSig ()]
801                 int ShortIn (short val);
802                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
803                 [PreserveSig ()]
804                 int UShortIn (ushort val);
805                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
806                 [PreserveSig ()]
807                 int IntIn (int val);
808                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
809                 [PreserveSig ()]
810                 int UIntIn (uint val);
811                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
812                 [PreserveSig ()]
813                 int LongIn (long val);
814                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
815                 [PreserveSig ()]
816                 int ULongIn (ulong val);
817                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
818                 [PreserveSig ()]
819                 int FloatIn (float val);
820                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
821                 [PreserveSig ()]
822                 int DoubleIn (double val);
823                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
824                 [PreserveSig ()]
825                 int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val);
826                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
827                 [PreserveSig ()]
828                 int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val);
829         }
830
831         [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
832         [System.Runtime.InteropServices.ComImportAttribute ()]
833         [System.Runtime.InteropServices.ClassInterfaceAttribute (ClassInterfaceType.None)]
834         public class _TestClass : ITest
835         {
836                 // properties need to go first since mcs puts them there
837                 public virtual extern ITest Test
838                 {
839                         [return: MarshalAs (UnmanagedType.Interface)]
840                         [MethodImpl (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime), DispId (5242884)]
841                         get;
842                 }
843
844                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
845                 public virtual extern void SByteIn (sbyte val);
846                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
847                 public virtual extern void ByteIn (byte val);
848                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
849                 public virtual extern void ShortIn (short val);
850                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
851                 public virtual extern void UShortIn (ushort val);
852                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
853                 public virtual extern void IntIn (int val);
854                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
855                 public virtual extern void UIntIn (uint val);
856                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
857                 public virtual extern void LongIn (long val);
858                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
859                 public virtual extern void ULongIn (ulong val);
860                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
861                 public virtual extern void FloatIn (float val);
862                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
863                 public virtual extern void DoubleIn (double val);
864                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
865                 public virtual extern void ITestIn ([MarshalAs (UnmanagedType.Interface)]ITest val);
866                 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
867                 public virtual extern void ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITest val);
868         }
869
870         [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000002")]
871         public class TestClass : _TestClass
872         {
873                 static TestClass ()
874                 {
875                         ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
876                 }
877                 private static System.IntPtr CreateObject (System.IntPtr aggr)
878                 {
879                         IntPtr pUnk3;
880                         mono_test_marshal_com_object_create (out pUnk3);
881                         return pUnk3;
882                 }
883         }
884
885         [System.Runtime.InteropServices.GuidAttribute ("00000000-0000-0000-0000-000000000003")]
886         public class TestActivatorClass : _TestClass
887         {
888                 static TestActivatorClass ()
889                 {
890                         ExtensibleClassFactory.RegisterObjectCreationCallback (new ObjectCreationDelegate (CreateObject)); ;
891                 }
892                 private static System.IntPtr CreateObject (System.IntPtr aggr)
893                 {
894                         IntPtr pUnk3;
895                         mono_test_marshal_com_object_create (out pUnk3);
896                         return pUnk3;
897                 }
898         }
899
900         delegate void SByteInDelegate (sbyte val);
901         delegate void ByteInDelegate (byte val);
902         delegate void ShortInDelegate (short val);
903         delegate void UShortInDelegate (ushort val);
904         delegate void IntInDelegate (int val);
905         delegate void UIntInDelegate (uint val);
906         delegate void LongInDelegate (long val);
907         delegate void ULongInDelegate (ulong val);
908         delegate void FloatInDelegate (float val);
909         delegate void DoubleInDelegate (double val);
910         delegate void ITestInDelegate (ITest val);
911         delegate void ITestOutDelegate (out ITest val);
912
913         public class ManagedTestPresSig : ITestPresSig
914         {               // properties need to go first since mcs puts them there
915                 public ITestPresSig Test
916                 {
917                         get
918                         {
919                                 return new ManagedTestPresSig ();
920                         }
921                 }
922
923                 public int SByteIn (sbyte val)
924                 {
925                         if (val != -100)
926                                 return 1;
927                         return 0;
928                 }
929
930                 public int ByteIn (byte val)
931                 {
932                         if (val != 100)
933                                 return 2;
934                         return 0;
935                 }
936
937                 public int ShortIn (short val)
938                 {
939                         if (val != -100)
940                                 return 3;
941                         return 0;
942                 }
943
944                 public int UShortIn (ushort val)
945                 {
946                         if (val != 100)
947                                 return 4;
948                         return 0;
949                 }
950
951                 public int IntIn (int val)
952                 {
953                         if (val != -100)
954                                 return 5;
955                         return 0;
956                 }
957
958                 public int UIntIn (uint val)
959                 {
960                         if (val != 100)
961                                 return 6;
962                         return 0;
963                 }
964
965                 public int LongIn (long val)
966                 {
967                         if (val != -100)
968                                 return 7;
969                         return 0;
970                 }
971
972                 public int ULongIn (ulong val)
973                 {
974                         if (val != 100)
975                                 return 8;
976                         return 0;
977                 }
978
979                 public int FloatIn (float val)
980                 {
981                         if (Math.Abs (val - 3.14f) > .000001)
982                                 return 9;
983                         return 0;
984                 }
985
986                 public int DoubleIn (double val)
987                 {
988                         if (Math.Abs (val - 3.14f) > .000001)
989                                 return 10;
990                         return 0;
991                 }
992
993                 public int ITestIn ([MarshalAs (UnmanagedType.Interface)]ITestPresSig val)
994                 {
995                         if (val == null)
996                                 return 11;
997                         if (null == val as ManagedTestPresSig)
998                                 return 12;
999                         return 0;
1000                 }
1001
1002                 public int ITestOut ([MarshalAs (UnmanagedType.Interface)]out ITestPresSig val)
1003                 {
1004                         val = new ManagedTestPresSig ();
1005                         return 0;
1006                 }
1007         }
1008
1009         public class ManagedTest : ITest
1010         {
1011                 private int status = 0;
1012                 public int Status
1013                 {
1014                         get { return status; }
1015                 }
1016                 public void SByteIn (sbyte val)
1017                 {
1018                         if (val != -100)
1019                                 status = 1;
1020                 }
1021
1022                 public void ByteIn (byte val)
1023                 {
1024                         if (val != 100)
1025                                 status = 2;
1026                 }
1027
1028                 public void ShortIn (short val)
1029                 {
1030                         if (val != -100)
1031                                 status = 3;
1032                 }
1033
1034                 public void UShortIn (ushort val)
1035                 {
1036                         if (val != 100)
1037                                 status = 4;
1038                 }
1039
1040                 public void IntIn (int val)
1041                 {
1042                         if (val != -100)
1043                                 status = 5;
1044                 }
1045
1046                 public void UIntIn (uint val)
1047                 {
1048                         if (val != 100)
1049                                 status = 6;
1050                 }
1051
1052                 public void LongIn (long val)
1053                 {
1054                         if (val != -100)
1055                                 status = 7;
1056                 }
1057
1058                 public void ULongIn (ulong val)
1059                 {
1060                         if (val != 100)
1061                                 status = 8;
1062                 }
1063
1064                 public void FloatIn (float val)
1065                 {
1066                         if (Math.Abs (val - 3.14f) > .000001)
1067                                 status = 9;
1068                 }
1069
1070                 public void DoubleIn (double val)
1071                 {
1072                         if (Math.Abs (val - 3.14) > .000001)
1073                                 status = 10;
1074                 }
1075
1076                 public void ITestIn (ITest val)
1077                 {
1078                         if (val == null)
1079                                 status = 11;
1080                         if (null == val as ManagedTest)
1081                                 status = 12;
1082                 }
1083
1084                 public void ITestOut (out ITest val)
1085                 {
1086                         val = new ManagedTest ();
1087                 }
1088
1089                 public ITest Test
1090                 {
1091                         get
1092                         {
1093                                 return new ManagedTest ();
1094                         }
1095                 }
1096         }
1097
1098         public static int mono_test_marshal_variant_in_callback (VarEnum vt, object obj)
1099         {
1100                 switch (vt)
1101                 {
1102                 case VarEnum.VT_I1:
1103                         if (obj.GetType () != typeof (sbyte))
1104                                 return 1;
1105                         if ((sbyte)obj != -100)
1106                                 return 2;
1107                         break;
1108                 case VarEnum.VT_UI1:
1109                         if (obj.GetType () != typeof (byte))
1110                                 return 1;
1111                         if ((byte)obj != 100)
1112                                 return 2;
1113                         break;
1114                 case VarEnum.VT_I2:
1115                         if (obj.GetType () != typeof (short))
1116                                 return 1;
1117                         if ((short)obj != -100)
1118                                 return 2;
1119                         break;
1120                 case VarEnum.VT_UI2:
1121                         if (obj.GetType () != typeof (ushort))
1122                                 return 1;
1123                         if ((ushort)obj != 100)
1124                                 return 2;
1125                         break;
1126                 case VarEnum.VT_I4:
1127                         if (obj.GetType () != typeof (int))
1128                                 return 1;
1129                         if ((int)obj != -100)
1130                                 return 2;
1131                         break;
1132                 case VarEnum.VT_UI4:
1133                         if (obj.GetType () != typeof (uint))
1134                                 return 1;
1135                         if ((uint)obj != 100)
1136                                 return 2;
1137                         break;
1138                 case VarEnum.VT_I8:
1139                         if (obj.GetType () != typeof (long))
1140                                 return 1;
1141                         if ((long)obj != -100)
1142                                 return 2;
1143                         break;
1144                 case VarEnum.VT_UI8:
1145                         if (obj.GetType () != typeof (ulong))
1146                                 return 1;
1147                         if ((ulong)obj != 100)
1148                                 return 2;
1149                         break;
1150                 case VarEnum.VT_R4:
1151                         if (obj.GetType () != typeof (float))
1152                                 return 1;
1153                         if (Math.Abs ((float)obj - 3.14f) > 1e-10)
1154                                 return 2;
1155                         break;
1156                 case VarEnum.VT_R8:
1157                         if (obj.GetType () != typeof (double))
1158                                 return 1;
1159                         if (Math.Abs ((double)obj - 3.14) > 1e-10)
1160                                 return 2;
1161                         break;
1162                 case VarEnum.VT_BSTR:
1163                         if (obj.GetType () != typeof (string))
1164                                 return 1;
1165                         if ((string)obj != "PI")
1166                                 return 2;
1167                         break;
1168                 case VarEnum.VT_BOOL:
1169                         if (obj.GetType () != typeof (bool))
1170                                 return 1;
1171                         if ((bool)obj != true)
1172                                 return 2;
1173                         break;
1174                 }
1175                 return 0;
1176         }
1177
1178         public static int mono_test_marshal_variant_out_callback (VarEnum vt, ref object obj)
1179         {
1180                 switch (vt) {
1181                 case VarEnum.VT_I1:
1182                         obj = (sbyte)-100;
1183                         break;
1184                 case VarEnum.VT_UI1:
1185                         obj = (byte)100;
1186                         break;
1187                 case VarEnum.VT_I2:
1188                         obj = (short)-100;
1189                         break;
1190                 case VarEnum.VT_UI2:
1191                         obj = (ushort)100;
1192                         break;
1193                 case VarEnum.VT_I4:
1194                         obj = (int)-100;
1195                         break;
1196                 case VarEnum.VT_UI4:
1197                         obj = (uint)100;
1198                         break;
1199                 case VarEnum.VT_I8:
1200                         obj = (long)-100;
1201                         break;
1202                 case VarEnum.VT_UI8:
1203                         obj = (ulong)100;
1204                         break;
1205                 case VarEnum.VT_R4:
1206                         obj = (float)3.14f;
1207                         break;
1208                 case VarEnum.VT_R8:
1209                         obj = (double)3.14;
1210                         break;
1211                 case VarEnum.VT_BSTR:
1212                         obj = "PI";
1213                         break;
1214                 case VarEnum.VT_BOOL:
1215                         obj = true;
1216                         break;
1217                 }
1218                 return 0;
1219         }
1220
1221         public static int TestITest (ITest itest)
1222         {
1223                 try {
1224                         ITest itest2;
1225                         itest.SByteIn (-100);
1226                         itest.ByteIn (100);
1227                         itest.ShortIn (-100);
1228                         itest.UShortIn (100);
1229                         itest.IntIn (-100);
1230                         itest.UIntIn (100);
1231                         itest.LongIn (-100);
1232                         itest.ULongIn (100);
1233                         itest.FloatIn (3.14f);
1234                         itest.DoubleIn (3.14);
1235                         itest.ITestIn (itest);
1236                         itest.ITestOut (out itest2);
1237                 }
1238                 catch (Exception ex) {
1239                         return 1;
1240                 }
1241                 return 0;
1242         }
1243
1244         public static int TestITestPresSig (ITestPresSig itest)
1245         {
1246                 ITestPresSig itest2;
1247                 if (itest.SByteIn (-100) != 0)
1248                         return 1000;
1249                 if (itest.ByteIn (100) != 0)
1250                         return 1001;
1251                 if (itest.ShortIn (-100) != 0)
1252                         return 1002;
1253                 if (itest.UShortIn (100) != 0)
1254                         return 1003;
1255                 if (itest.IntIn (-100) != 0)
1256                         return 1004;
1257                 if (itest.UIntIn (100) != 0)
1258                         return 1005;
1259                 if (itest.LongIn (-100) != 0)
1260                         return 1006;
1261                 if (itest.ULongIn (100) != 0)
1262                         return 1007;
1263                 if (itest.FloatIn (3.14f) != 0)
1264                         return 1008;
1265                 if (itest.DoubleIn (3.14) != 0)
1266                         return 1009;
1267                 if (itest.ITestIn (itest) != 0)
1268                         return 1010;
1269                 if (itest.ITestOut (out itest2) != 0)
1270                         return 1011;
1271                 return 0;
1272         }
1273
1274         public static int TestITestDelegate (ITest itest)
1275         {
1276                 try {
1277                         ITest itest2;
1278
1279                         SByteInDelegate SByteInFcn= itest.SByteIn;
1280                         ByteInDelegate ByteInFcn = itest.ByteIn;
1281                         UShortInDelegate UShortInFcn = itest.UShortIn;
1282                         IntInDelegate IntInFcn = itest.IntIn;
1283                         UIntInDelegate UIntInFcn = itest.UIntIn;
1284                         LongInDelegate LongInFcn = itest.LongIn;
1285
1286                         ULongInDelegate ULongInFcn = itest.ULongIn;
1287                         FloatInDelegate FloatInFcn = itest.FloatIn;
1288                         DoubleInDelegate DoubleInFcn = itest.DoubleIn;
1289                         ITestInDelegate ITestInFcn = itest.ITestIn;
1290                         ITestOutDelegate ITestOutFcn = itest.ITestOut;
1291
1292                         SByteInFcn (-100);
1293                         ByteInFcn (100);
1294                         UShortInFcn (100);
1295                         IntInFcn (-100);
1296                         UIntInFcn (100);
1297                         LongInFcn (-100);
1298                         ULongInFcn (100);
1299                         FloatInFcn (3.14f);
1300                         DoubleInFcn (3.14);
1301                         ITestInFcn (itest);
1302                         ITestOutFcn (out itest2);
1303                 }
1304                 catch (Exception) {
1305                         return 1;
1306                 }
1307                 return 0;
1308         }
1309 }
1310
1311 public class TestVisible
1312 {
1313 }