2006-07-28 Jonathan Chambers <joncham@gmail.com>
[mono.git] / mono / tests / cominterop.cs
blob329f88d3a988fc0d67a6ad9578af078d757dc24b
1 //
2 // cominterop.cs:
3 //
4 // Tests for COM Interop related features
5 //
7 using System;
8 using System.Runtime.CompilerServices;
9 using System.Runtime.InteropServices;
11 public class Tests
14 [DllImport("libtest")]
15 public static extern int mono_test_marshal_bstr_in([MarshalAs(UnmanagedType.BStr)]string str);
17 [DllImport("libtest")]
18 public static extern int mono_test_marshal_bstr_out([MarshalAs(UnmanagedType.BStr)] out string str);
20 [DllImport("libtest")]
21 public static extern int mono_test_marshal_variant_in_sbyte([MarshalAs(UnmanagedType.Struct)]object obj);
23 [DllImport("libtest")]
24 public static extern int mono_test_marshal_variant_in_byte([MarshalAs(UnmanagedType.Struct)]object obj);
26 [DllImport("libtest")]
27 public static extern int mono_test_marshal_variant_in_short([MarshalAs(UnmanagedType.Struct)]object obj);
29 [DllImport("libtest")]
30 public static extern int mono_test_marshal_variant_in_ushort([MarshalAs(UnmanagedType.Struct)]object obj);
32 [DllImport("libtest")]
33 public static extern int mono_test_marshal_variant_in_int([MarshalAs(UnmanagedType.Struct)]object obj);
35 [DllImport("libtest")]
36 public static extern int mono_test_marshal_variant_in_uint([MarshalAs(UnmanagedType.Struct)]object obj);
38 [DllImport("libtest")]
39 public static extern int mono_test_marshal_variant_in_long([MarshalAs(UnmanagedType.Struct)]object obj);
41 [DllImport("libtest")]
42 public static extern int mono_test_marshal_variant_in_ulong([MarshalAs(UnmanagedType.Struct)]object obj);
44 [DllImport("libtest")]
45 public static extern int mono_test_marshal_variant_in_float([MarshalAs(UnmanagedType.Struct)]object obj);
47 [DllImport("libtest")]
48 public static extern int mono_test_marshal_variant_in_double([MarshalAs(UnmanagedType.Struct)]object obj);
50 [DllImport("libtest")]
51 public static extern int mono_test_marshal_variant_in_bstr([MarshalAs(UnmanagedType.Struct)]object obj);
53 [DllImport("libtest")]
54 public static extern int mono_test_marshal_variant_out_sbyte([MarshalAs(UnmanagedType.Struct)]out object obj);
56 [DllImport("libtest")]
57 public static extern int mono_test_marshal_variant_out_byte([MarshalAs(UnmanagedType.Struct)]out object obj);
59 [DllImport("libtest")]
60 public static extern int mono_test_marshal_variant_out_short([MarshalAs(UnmanagedType.Struct)]out object obj);
62 [DllImport("libtest")]
63 public static extern int mono_test_marshal_variant_out_ushort([MarshalAs(UnmanagedType.Struct)]out object obj);
65 [DllImport("libtest")]
66 public static extern int mono_test_marshal_variant_out_int([MarshalAs(UnmanagedType.Struct)]out object obj);
68 [DllImport("libtest")]
69 public static extern int mono_test_marshal_variant_out_uint([MarshalAs(UnmanagedType.Struct)]out object obj);
71 [DllImport("libtest")]
72 public static extern int mono_test_marshal_variant_out_long([MarshalAs(UnmanagedType.Struct)]out object obj);
74 [DllImport("libtest")]
75 public static extern int mono_test_marshal_variant_out_ulong([MarshalAs(UnmanagedType.Struct)]out object obj);
77 [DllImport("libtest")]
78 public static extern int mono_test_marshal_variant_out_float([MarshalAs(UnmanagedType.Struct)]out object obj);
80 [DllImport("libtest")]
81 public static extern int mono_test_marshal_variant_out_double([MarshalAs(UnmanagedType.Struct)]out object obj);
83 [DllImport("libtest")]
84 public static extern int mono_test_marshal_variant_out_bstr([MarshalAs(UnmanagedType.Struct)]out object obj);
86 [DllImport ("libtest")]
87 public static extern int mono_test_marshal_com_object_create (out IntPtr pUnk);
89 [DllImport ("libtest")]
90 public static extern int mono_test_marshal_com_object_destroy (IntPtr pUnk);
92 [DllImport ("libtest")]
93 public static extern int mono_test_marshal_com_object_ref_count (IntPtr pUnk);
95 public static int Main ()
97 int i = Main2 ();
98 Console.WriteLine (i);
99 return i;
101 public static int Main2() {
103 bool isWindows = !(((int)Environment.OSVersion.Platform == 4) ||
104 ((int)Environment.OSVersion.Platform == 128));
105 if (isWindows) {
106 #region BSTR Tests
108 string str;
109 if (mono_test_marshal_bstr_in ("mono_test_marshal_bstr_in") != 0)
110 return 1;
111 if (mono_test_marshal_bstr_out (out str) != 0 || str != "mono_test_marshal_bstr_out")
112 return 2;
114 #endregion // BSTR Tests
116 #region VARIANT Tests
118 object obj;
119 if (mono_test_marshal_variant_in_sbyte ((sbyte)100) != 0)
120 return 3;
121 if (mono_test_marshal_variant_in_byte ((byte)100) != 0)
122 return 4;
123 if (mono_test_marshal_variant_in_short ((short)314) != 0)
124 return 5;
125 if (mono_test_marshal_variant_in_ushort ((ushort)314) != 0)
126 return 6;
127 if (mono_test_marshal_variant_in_int ((int)314) != 0)
128 return 7;
129 if (mono_test_marshal_variant_in_uint ((uint)314) != 0)
130 return 8;
131 if (mono_test_marshal_variant_in_long ((long)314) != 0)
132 return 9;
133 if (mono_test_marshal_variant_in_ulong ((ulong)314) != 0)
134 return 10;
135 if (mono_test_marshal_variant_in_float ((float)3.14) != 0)
136 return 11;
137 if (mono_test_marshal_variant_in_double ((double)3.14) != 0)
138 return 12;
139 if (mono_test_marshal_variant_in_bstr ("PI") != 0)
140 return 13;
141 if (mono_test_marshal_variant_out_sbyte (out obj) != 0 || (sbyte)obj != 100)
142 return 14;
143 if (mono_test_marshal_variant_out_byte (out obj) != 0 || (byte)obj != 100)
144 return 15;
145 if (mono_test_marshal_variant_out_short (out obj) != 0 || (short)obj != 314)
146 return 16;
147 if (mono_test_marshal_variant_out_ushort (out obj) != 0 || (ushort)obj != 314)
148 return 17;
149 if (mono_test_marshal_variant_out_int (out obj) != 0 || (int)obj != 314)
150 return 18;
151 if (mono_test_marshal_variant_out_uint (out obj) != 0 || (uint)obj != 314)
152 return 19;
153 if (mono_test_marshal_variant_out_long (out obj) != 0 || (long)obj != 314)
154 return 20;
155 if (mono_test_marshal_variant_out_ulong (out obj) != 0 || (ulong)obj != 314)
156 return 21;
157 if (mono_test_marshal_variant_out_float (out obj) != 0 || ((float)obj - 3.14) / 3.14 > .001)
158 return 22;
159 if (mono_test_marshal_variant_out_double (out obj) != 0 || ((double)obj - 3.14) / 3.14 > .001)
160 return 23;
161 if (mono_test_marshal_variant_out_bstr (out obj) != 0 || (string)obj != "PI")
162 return 24;
164 #endregion // VARIANT Tests
166 #region Marshal COM Interop Tests
168 IntPtr pUnk;
169 if (mono_test_marshal_com_object_create (out pUnk) != 0)
170 return 25;
172 if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
173 return 26;
175 if (Marshal.AddRef (pUnk) != 2)
176 return 27;
178 if (mono_test_marshal_com_object_ref_count (pUnk) != 2)
179 return 28;
181 if (Marshal.Release (pUnk) != 1)
182 return 29;
184 if (mono_test_marshal_com_object_ref_count (pUnk) != 1)
185 return 30;
187 object com_obj = Marshal.GetObjectForIUnknown (pUnk);
189 if (com_obj == null)
190 return 31;
192 IMath imath = com_obj as IMath;
194 if (imath == null)
195 return 32;
197 if (imath.Add (20, 10) != 30)
198 return 33;
200 if (imath.Subtract (20, 10) != 10)
201 return 34;
203 IMath same1, same2;
204 imath.Same (out same1);
205 imath.Same (out same2);
206 if (same1 != same2)
207 return 35;
209 if (!same1.Equals (same2))
210 return 36;
212 IMath diff1, diff2;
213 imath.Different (out diff1);
214 imath.Different (out diff2);
215 if (diff1 == diff2)
216 return 37;
218 if (diff1.Equals (diff2))
219 return 38;
221 // same1 & same2 share a RCW
222 if (Marshal.ReleaseComObject (same1) != 1)
223 return 39;
225 if (Marshal.ReleaseComObject (same2) != 0)
226 return 40;
229 if (Marshal.ReleaseComObject (diff1) != 0 ||
230 Marshal.ReleaseComObject (diff2) != 0)
231 return 41;
234 //if (mono_test_marshal_com_object_destroy (pUnk) != 0)
235 // return 31;
236 #endregion // Marshal COM Interop Tests
239 return 0;
242 [ComImport()]
243 [Guid ("00000000-0000-0000-0000-000000000000")]
244 [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
245 public interface IMath
247 [MethodImplAttribute (MethodImplOptions.InternalCall,MethodCodeType=MethodCodeType.Runtime)]
248 int Add (int a, int b);
249 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
250 int Subtract (int a, int b);
251 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
252 int Same ([MarshalAs(UnmanagedType.Interface)] out IMath imath);
253 [MethodImplAttribute (MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
254 int Different ([MarshalAs (UnmanagedType.Interface)] out IMath imath);