1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         LGPLv2.1+ - See COPYING.LIB in the top level directory
4  * PURPOSE:         Test for CComVariant
5  * PROGRAMMER:      Mark Jansen
6  */
7 
8 /* In case we are building against the MS headers, we need to disable assertions. */
9 #define ATLASSERT(x)
10 #define _ATL_NO_VARIANT_THROW
11 
12 #include <apitest.h>
13 #include <atlbase.h>
14 
15 void expect_bool_imp(const CComVariant& ccv, bool value)
16 {
17     winetest_ok(V_VT(&ccv) == VT_BOOL, "Expected .vt to be BOOL, was %u\n", V_VT(&ccv));
18     VARIANT_BOOL expected = (value ? VARIANT_TRUE : VARIANT_FALSE);
19     winetest_ok(V_BOOL(&ccv) == expected, "Expected value to be %u, was: %u\n", expected, V_BOOL(&ccv));
20 }
21 
22 void expect_int_imp(const CComVariant& ccv, int value, unsigned short type)
23 {
24     winetest_ok(V_VT(&ccv) == type, "Expected .vt to be %u, was %u\n", type, V_VT(&ccv));
25     winetest_ok(V_I4(&ccv) == value, "Expected value to be %d, was: %ld\n", value, V_I4(&ccv));
26 }
27 
28 void expect_uint_imp(const CComVariant& ccv, unsigned int value, unsigned short type)
29 {
30     winetest_ok(V_VT(&ccv) == type, "Expected .vt to be %u, was %u\n", type, V_VT(&ccv));
31     winetest_ok(V_UI4(&ccv) == value, "Expected value to be %u, was: %lu\n", value, V_UI4(&ccv));
32 }
33 
34 void expect_double_imp(const CComVariant& ccv, double value, unsigned short type)
35 {
36     winetest_ok(V_VT(&ccv) == type, "Expected .vt to be %u, was %u\n", type, V_VT(&ccv));
37     winetest_ok(V_R8(&ccv) == value, "Expected value to be %f, was: %f\n", value, V_R8(&ccv));
38 }
39 
40 void expect_error_imp(const CComVariant& ccv, SCODE value)
41 {
42     winetest_ok(V_VT(&ccv) == VT_ERROR, "Expected .vt to be VT_ERROR, was %u\n", V_VT(&ccv));
43     winetest_ok(V_ERROR(&ccv) == value, "Expected value to be %lx, was: %lx\n", value, V_ERROR(&ccv));
44 }
45 
46 void expect_empty_imp(const CComVariant& ccv)
47 {
48     winetest_ok(V_VT(&ccv) == VT_EMPTY, "Expected .vt to be VT_EMPTY, was %u\n", V_VT(&ccv));
49     winetest_ok(V_I8(&ccv) == 0ll, "Expected value to be 0, was: %I64d\n", V_I8(&ccv));
50 }
51 
52 #define expect_bool         (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_bool_imp
53 #define expect_int          (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_int_imp
54 #define expect_uint         (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_uint_imp
55 #define expect_double       (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_double_imp
56 #define expect_error        (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_error_imp
57 #define expect_empty        (winetest_set_location(__FILE__, __LINE__), 0) ? (void)0 : expect_empty_imp
58 
59 
60 static void test_construction()
61 {
62     {
63         CComVariant empty;
64         expect_empty(empty);
65     }
66     {
67         CComBSTR bstr(L"TESTW");
68         CComVariant olestr((LPCOLESTR)bstr), comstr(bstr);
69         ok(V_VT(&olestr) == VT_BSTR, "Expected .vt to be VT_LPWSTR, was %u\n", V_VT(&olestr));
70         ok(!wcscmp(V_BSTR(&olestr), L"TESTW"), "Expected value to be L\"TESTW\", was: %s\n", wine_dbgstr_w(V_BSTR(&olestr)));
71         ok(V_VT(&comstr) == VT_BSTR, "Expected .vt to be VT_LPWSTR, was %u\n", V_VT(&comstr));
72         ok(!wcscmp(V_BSTR(&comstr), L"TESTW"), "Expected value to be L\"TESTW\", was: %s\n", wine_dbgstr_w(V_BSTR(&comstr)));
73     }
74     {
75         CComVariant cstr((LPCSTR)"TESTA");
76         ok(V_VT(&cstr) == VT_BSTR, "Expected .vt to be VT_LPWSTR, was %u\n", V_VT(&cstr));
77         ok(!wcscmp(V_BSTR(&cstr), L"TESTA"), "Expected value to be L\"TESTW\", was: %s\n", wine_dbgstr_w(V_BSTR(&cstr)));
78     }
79     {
80         CComVariant trueVal(true), falseVal(false);
81         ok(V_VT(&trueVal) == VT_BOOL, "Expected .vt to be BOOL, was %u\n", V_VT(&trueVal));
82         ok(V_BOOL(&trueVal) == VARIANT_TRUE, "Expected value to be VARIANT_TRUE, was: %u\n", V_BOOL(&trueVal));
83         ok(V_VT(&falseVal) == VT_BOOL, "Expected .vt to be BOOL, was %u\n", V_VT(&falseVal));
84         ok(V_BOOL(&falseVal) == VARIANT_FALSE, "Expected value to be VARIANT_TRUE, was: %u\n", V_BOOL(&falseVal));
85     }
86     {
87         CComVariant b1((BYTE)33);
88         ok(V_VT(&b1) == VT_UI1, "Expected .vt to be VT_UI1, was %u\n", V_VT(&b1));
89         ok(V_UI1(&b1) == (BYTE)33, "Expected value to be 33, was: %u\n", V_UI1(&b1));
90     }
91     {
92         CComVariant c1((char)33);
93         ok(V_VT(&c1) == VT_I1, "Expected .vt to be VT_I1, was %u\n", V_VT(&c1));
94         ok(V_I1(&c1) == (char)33, "Expected value to be 33, was: %d\n", V_I1(&c1));
95     }
96     {
97         CComVariant s1((short)12345);
98         ok(V_VT(&s1) == VT_I2, "Expected .vt to be VT_I2, was %u\n", V_VT(&s1));
99         ok(V_I2(&s1) == (short)12345, "Expected value to be 12345, was: %d\n", V_I1(&s1));
100     }
101     {
102         CComVariant us1((unsigned short)12345);
103         ok(V_VT(&us1) == VT_UI2, "Expected .vt to be VT_UI2, was %u\n", V_VT(&us1));
104         ok(V_UI2(&us1) == (unsigned short)12345, "Expected value to be 12345, was: %u\n", V_UI2(&us1));
105     }
106     {
107         CComVariant i1((int)4, VT_I4), i2((int)3, VT_INT), i3((int)2, VT_I2), i4((int)1);
108         expect_int(i1, 4, VT_I4);
109         expect_int(i2, 3, VT_INT);
110         expect_error(i3, E_INVALIDARG);
111         expect_int(i4, 1, VT_I4);
112     }
113     {
114         CComVariant ui1((unsigned int)4, VT_UI4), ui2((unsigned int)3, VT_UINT), ui3((unsigned int)2, VT_UI2), ui4((unsigned int)1);
115         expect_uint(ui1, 4, VT_UI4);
116         expect_uint(ui2, 3, VT_UINT);
117         expect_error(ui3, E_INVALIDARG);
118         expect_uint(ui4, 1, VT_UI4);
119     }
120     {
121         CComVariant l1((long)4, VT_I4), l2((long)3, VT_INT), l3((long)2, VT_ERROR), l4((long)1);
122         expect_int(l1, 4, VT_I4);
123         expect_error(l2, E_INVALIDARG);
124         expect_error(l3, 2);
125         expect_int(l4, 1, VT_I4);
126     }
127     {
128         CComVariant ul1((unsigned long)33);
129         expect_uint(ul1, 33, VT_UI4);
130     }
131     {
132         CComVariant f1(3.4f);
133         ok(V_VT(&f1) == VT_R4, "Expected .vt to be VT_R4, was %u\n", V_VT(&f1));
134         ok(V_R4(&f1) == 3.4f, "Expected value to be 3.4f, was: %f\n", V_R4(&f1));
135     }
136     {
137         CComVariant d1(3.4, VT_R8), d2(3.4, VT_DATE), d3(8.8, VT_I1), d4(1.9);
138         expect_double(d1, 3.4, VT_R8);
139         expect_double(d2, 3.4, VT_DATE);
140         expect_error(d3, E_INVALIDARG);
141         expect_double(d4, 1.9, VT_R8);
142     }
143     {
144         LONGLONG lv = 12030912309123ll;
145         CComVariant l1(lv);
146         ok(V_VT(&l1) == VT_I8, "Expected .vt to be VT_I8, was %u\n", V_VT(&l1));
147         ok(V_I8(&l1) == lv, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(lv), wine_dbgstr_longlong(V_I8(&l1)));
148     }
149     {
150         ULONGLONG lv = 12030912309123ull;
151         CComVariant l1(lv);
152         ok(V_VT(&l1) == VT_UI8, "Expected .vt to be VT_UI8, was %u\n", V_VT(&l1));
153         ok(V_UI8(&l1) == lv, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(lv), wine_dbgstr_longlong(V_UI8(&l1)));
154     }
155     {
156         CY cy;
157         cy.int64 = 12030912309123ll;
158         CComVariant c1(cy);
159         ok(V_VT(&c1) == VT_CY, "Expected .vt to be VT_CY, was %u\n", V_VT(&c1));
160         ok(V_CY(&c1).int64 == cy.int64, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(cy.int64), wine_dbgstr_longlong(V_CY(&c1).int64));
161     }
162     // IDispatch
163     // IUnknown
164 }
165 
166 
167 static void test_copyconstructor()
168 {
169     {
170         CComVariant empty;
171         CComVariant empty2(empty);
172         expect_empty(empty2);
173     }
174     {
175         CComBSTR bstr(L"TESTW");
176         CComVariant olestr((LPCOLESTR)bstr);
177         CComVariant olestr2(olestr);
178         ok(V_VT(&olestr2) == VT_BSTR, "Expected .vt to be VT_LPWSTR, was %u\n", V_VT(&olestr2));
179         ok(!wcscmp(V_BSTR(&olestr2), L"TESTW"), "Expected value to be L\"TESTW\", was: %s\n", wine_dbgstr_w(V_BSTR(&olestr2)));
180     }
181     {
182         CComVariant trueVal(true);
183         CComVariant trueVal2(trueVal);
184         ok(V_VT(&trueVal2) == VT_BOOL, "Expected .vt to be BOOL, was %u\n", V_VT(&trueVal2));
185         ok(V_BOOL(&trueVal2) == VARIANT_TRUE, "Expected value to be VARIANT_TRUE, was: %u\n", V_BOOL(&trueVal2));
186     }
187     {
188         CComVariant b1((BYTE)33);
189         CComVariant b2(b1);
190         ok(V_VT(&b2) == VT_UI1, "Expected .vt to be VT_UI1, was %u\n", V_VT(&b2));
191         ok(V_UI1(&b2) == (BYTE)33, "Expected value to be 33, was: %u\n", V_UI1(&b2));
192     }
193     {
194         CComVariant c1((char)33);
195         CComVariant c2(c1);
196         ok(V_VT(&c2) == VT_I1, "Expected .vt to be VT_I1, was %u\n", V_VT(&c2));
197         ok(V_I1(&c2) == (char)33, "Expected value to be 33, was: %d\n", V_I1(&c2));
198     }
199     {
200         CComVariant s1((short)12345);
201         CComVariant s2(s1);
202         ok(V_VT(&s2) == VT_I2, "Expected .vt to be VT_I2, was %u\n", V_VT(&s2));
203         ok(V_I2(&s2) == (short)12345, "Expected value to be 12345, was: %d\n", V_I1(&s2));
204     }
205     {
206         CComVariant us1((unsigned short)12345);
207         CComVariant us2(us1);
208         ok(V_VT(&us2) == VT_UI2, "Expected .vt to be VT_UI2, was %u\n", V_VT(&us2));
209         ok(V_UI2(&us2) == (unsigned short)12345, "Expected value to be 12345, was: %u\n", V_UI2(&us2));
210     }
211     {
212         CComVariant i1((int)4, VT_I4);
213         CComVariant i2(i1);
214         expect_int(i2, 4, VT_I4);
215     }
216     {
217         CComVariant ui1((unsigned int)4, VT_UI4);
218         CComVariant ui2(ui1);
219         expect_uint(ui2, 4, VT_UI4);
220     }
221     {
222         CComVariant l1((long)4, VT_I4);
223         CComVariant l2(l1);
224         expect_uint(l2, 4, VT_I4);
225     }
226     {
227         CComVariant ul1((unsigned long)33);
228         CComVariant ul2(ul1);
229         expect_uint(ul2, 33, VT_UI4);
230     }
231     {
232         CComVariant f1(3.4f);
233         CComVariant f2(f1);
234         ok(V_VT(&f2) == VT_R4, "Expected .vt to be VT_R4, was %u\n", V_VT(&f2));
235         ok(V_R4(&f2) == 3.4f, "Expected value to be 3.4f, was: %f\n", V_R4(&f2));
236     }
237     {
238         CComVariant d1(3.4, VT_R8);
239         CComVariant d2(d1);
240         expect_double(d2, 3.4, VT_R8);
241     }
242     {
243         LONGLONG lv = 12030912309123ll;
244         CComVariant l1(lv);
245         CComVariant l2(l1);
246         ok(V_VT(&l2) == VT_I8, "Expected .vt to be VT_I8, was %u\n", V_VT(&l2));
247         ok(V_I8(&l2) == lv, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(lv), wine_dbgstr_longlong(V_I8(&l2)));
248     }
249     {
250         ULONGLONG lv = 12030912309123ull;
251         CComVariant l1(lv);
252         CComVariant l2(l1);
253         ok(V_VT(&l2) == VT_UI8, "Expected .vt to be VT_UI8, was %u\n", V_VT(&l2));
254         ok(V_UI8(&l2) == lv, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(lv), wine_dbgstr_longlong(V_UI8(&l2)));
255     }
256     {
257         CY cy;
258         cy.int64 = 12030912309123ll;
259         CComVariant c1(cy);
260         CComVariant c2(c1);
261         ok(V_VT(&c2) == VT_CY, "Expected .vt to be VT_I8, was %u\n", V_VT(&c2));
262         ok(V_CY(&c2).int64 == cy.int64, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(cy.int64), wine_dbgstr_longlong(V_CY(&c2).int64));
263     }
264     // IDispatch
265     // IUnknown
266 }
267 
268 static void test_assign()
269 {
270     {
271         CComVariant empty;
272         CComVariant empty2 = empty;
273         expect_empty(empty2);
274     }
275     {
276         CComBSTR bstr(L"TESTW");
277         CComVariant olestr = (LPCOLESTR)bstr;
278         ok(V_VT(&olestr) == VT_BSTR, "Expected .vt to be VT_LPWSTR, was %u\n", V_VT(&olestr));
279         ok(!wcscmp(V_BSTR(&olestr), L"TESTW"), "Expected value to be L\"TESTW\", was: %s\n", wine_dbgstr_w(V_BSTR(&olestr)));
280         CComVariant olestr2 = olestr;
281         ok(V_VT(&olestr2) == VT_BSTR, "Expected .vt to be VT_LPWSTR, was %u\n", V_VT(&olestr2));
282         ok(!wcscmp(V_BSTR(&olestr2), L"TESTW"), "Expected value to be L\"TESTW\", was: %s\n", wine_dbgstr_w(V_BSTR(&olestr2)));
283     }
284     {
285         CComVariant trueVal = true;
286         ok(V_VT(&trueVal) == VT_BOOL, "Expected .vt to be BOOL, was %u\n", V_VT(&trueVal));
287         ok(V_BOOL(&trueVal) == VARIANT_TRUE, "Expected value to be VARIANT_TRUE, was: %u\n", V_BOOL(&trueVal));
288         CComVariant trueVal2 = trueVal;
289         ok(V_VT(&trueVal2) == VT_BOOL, "Expected .vt to be BOOL, was %u\n", V_VT(&trueVal2));
290         ok(V_BOOL(&trueVal2) == VARIANT_TRUE, "Expected value to be VARIANT_TRUE, was: %u\n", V_BOOL(&trueVal2));
291     }
292     {
293         CComVariant b1 = (BYTE)33;
294         ok(V_VT(&b1) == VT_UI1, "Expected .vt to be VT_UI1, was %u\n", V_VT(&b1));
295         ok(V_UI1(&b1) == (BYTE)33, "Expected value to be 33, was: %u\n", V_UI1(&b1));
296         CComVariant b2 = b1;
297         ok(V_VT(&b2) == VT_UI1, "Expected .vt to be VT_UI1, was %u\n", V_VT(&b2));
298         ok(V_UI1(&b2) == (BYTE)33, "Expected value to be 33, was: %u\n", V_UI1(&b2));
299     }
300     {
301         CComVariant c1 = (char)33;
302         ok(V_VT(&c1) == VT_I1, "Expected .vt to be VT_I1, was %u\n", V_VT(&c1));
303         ok(V_I1(&c1) == (char)33, "Expected value to be 33, was: %d\n", V_I1(&c1));
304         CComVariant c2 = c1;
305         ok(V_VT(&c2) == VT_I1, "Expected .vt to be VT_I1, was %u\n", V_VT(&c2));
306         ok(V_I1(&c2) == (char)33, "Expected value to be 33, was: %d\n", V_I1(&c2));
307     }
308     {
309         CComVariant s1 = (short)12345;
310         ok(V_VT(&s1) == VT_I2, "Expected .vt to be VT_I2, was %u\n", V_VT(&s1));
311         ok(V_I2(&s1) == (short)12345, "Expected value to be 12345, was: %d\n", V_I1(&s1));
312         CComVariant s2 = s1;
313         ok(V_VT(&s2) == VT_I2, "Expected .vt to be VT_I2, was %u\n", V_VT(&s2));
314         ok(V_I2(&s2) == (short)12345, "Expected value to be 12345, was: %d\n", V_I1(&s2));
315     }
316     {
317         CComVariant us1 = (unsigned short)12345;
318         ok(V_VT(&us1) == VT_UI2, "Expected .vt to be VT_UI2, was %u\n", V_VT(&us1));
319         ok(V_UI2(&us1) == (unsigned short)12345, "Expected value to be 12345, was: %u\n", V_UI2(&us1));
320         CComVariant us2 = us1;
321         ok(V_VT(&us2) == VT_UI2, "Expected .vt to be VT_UI2, was %u\n", V_VT(&us2));
322         ok(V_UI2(&us2) == (unsigned short)12345, "Expected value to be 12345, was: %u\n", V_UI2(&us2));
323     }
324     {
325         CComVariant i1 = (int)4;
326         expect_int(i1, 4, VT_I4);
327         CComVariant i2 = i1;
328         expect_int(i2, 4, VT_I4);
329     }
330     {
331         CComVariant ui1 = (unsigned int)4;
332         expect_uint(ui1, 4, VT_UI4);
333         CComVariant ui2 = ui1;
334         expect_uint(ui2, 4, VT_UI4);
335     }
336     {
337         CComVariant l1 = (long)4;
338         expect_uint(l1, 4, VT_I4);
339         CComVariant l2 = l1;
340         expect_uint(l2, 4, VT_I4);
341     }
342     {
343         CComVariant ul1 = (unsigned long)33;
344         expect_uint(ul1, 33, VT_UI4);
345         CComVariant ul2 = ul1;
346         expect_uint(ul2, 33, VT_UI4);
347     }
348     {
349         CComVariant f1 = 3.4f;
350         ok(V_VT(&f1) == VT_R4, "Expected .vt to be VT_R4, was %u\n", V_VT(&f1));
351         ok(V_R4(&f1) == 3.4f, "Expected value to be 3.4f, was: %f\n", V_R4(&f1));
352         CComVariant f2 = f1;
353         ok(V_VT(&f2) == VT_R4, "Expected .vt to be VT_R4, was %u\n", V_VT(&f2));
354         ok(V_R4(&f2) == 3.4f, "Expected value to be 3.4f, was: %f\n", V_R4(&f2));
355     }
356     {
357         CComVariant d1 = 3.4;
358         expect_double(d1, 3.4, VT_R8);
359         CComVariant d2 = d1;
360         expect_double(d2, 3.4, VT_R8);
361     }
362     {
363         LONGLONG lv = 12030912309123ll;
364         CComVariant l1 = lv;
365         ok(V_VT(&l1) == VT_I8, "Expected .vt to be VT_I8, was %u\n", V_VT(&l1));
366         ok(V_I8(&l1) == lv, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(lv), wine_dbgstr_longlong(V_I8(&l1)));
367         CComVariant l2 = l1;
368         ok(V_VT(&l2) == VT_I8, "Expected .vt to be VT_I8, was %u\n", V_VT(&l2));
369         ok(V_I8(&l2) == lv, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(lv), wine_dbgstr_longlong(V_I8(&l2)));
370     }
371     {
372         ULONGLONG lv = 12030912309123ull;
373         CComVariant l1 = lv;
374         ok(V_VT(&l1) == VT_UI8, "Expected .vt to be VT_UI8, was %u\n", V_VT(&l1));
375         ok(V_UI8(&l1) == lv, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(lv), wine_dbgstr_longlong(V_UI8(&l1)));
376         CComVariant l2 = l1;
377         ok(V_VT(&l2) == VT_UI8, "Expected .vt to be VT_UI8, was %u\n", V_VT(&l2));
378         ok(V_UI8(&l2) == lv, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(lv), wine_dbgstr_longlong(V_UI8(&l2)));
379     }
380     {
381         CY cy;
382         cy.int64 = 12030912309123ll;
383         CComVariant c1 = cy;
384         ok(V_VT(&c1) == VT_CY, "Expected .vt to be VT_I8, was %u\n", V_VT(&c1));
385         ok(V_CY(&c1).int64 == cy.int64, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(cy.int64), wine_dbgstr_longlong(V_CY(&c1).int64));
386         CComVariant c2 = c1;
387         ok(V_VT(&c2) == VT_CY, "Expected .vt to be VT_I8, was %u\n", V_VT(&c2));
388         ok(V_CY(&c2).int64 == cy.int64, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(cy.int64), wine_dbgstr_longlong(V_CY(&c2).int64));
389     }
390     // IDispatch
391     // IUnknown
392 }
393 
394 static void test_misc()
395 {
396     HRESULT hr;
397     {
398         CComVariant empty;
399         hr = empty.Clear();
400         ok(SUCCEEDED(hr), "Expected .Clear() to succeed, but it failed: 0x%lx\n", hr);
401         expect_empty(empty);
402     }
403 
404     {
405         CComBSTR bstr(L"TESTW");
406         CComVariant olestr((LPCOLESTR)bstr), empty;
407 
408         hr = empty.Copy(&olestr);   // VARIANT*
409         ok(SUCCEEDED(hr), "Expected .Copy() to succeed, but it failed: 0x%lx\n", hr);
410         ok(V_VT(&empty) == VT_BSTR, "Expected .vt to be VT_LPWSTR, was %u\n", V_VT(&empty));
411         ok(!wcscmp(V_BSTR(&empty), L"TESTW"), "Expected value to be L\"TESTW\", was: %s\n", wine_dbgstr_w(V_BSTR(&empty)));
412 
413         /* Clear does not null out the rest, it just sets .vt! */
414         hr = olestr.Clear();
415         ok(SUCCEEDED(hr), "Expected .Clear() to succeed, but it failed: 0x%lx\n", hr);
416         ok(V_VT(&olestr) == VT_EMPTY, "Expected .vt to be VT_EMPTY, was %u\n", V_VT(&olestr));
417     }
418 
419     {
420         CComVariant d1(3.4, VT_R8), empty;
421         hr = empty.Copy(&d1);
422         ok(SUCCEEDED(hr), "Expected .Copy() to succeed, but it failed: 0x%lx\n", hr);
423         expect_double(empty, 3.4, VT_R8);
424     }
425 
426     {
427         LONGLONG lv = 12030912309123ll;
428         CComVariant l1(lv);
429         CComVariant empty;
430         hr = empty.Copy(&l1);
431         ok(SUCCEEDED(hr), "Expected .Copy() to succeed, but it failed: 0x%lx\n", hr);
432         ok(V_VT(&empty) == VT_I8, "Expected .vt to be VT_I8, was %u\n", V_VT(&empty));
433         ok(V_I8(&empty) == lv, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(lv), wine_dbgstr_longlong(V_I8(&empty)));
434     }
435 
436     {
437         CY cy;
438         cy.int64 = 12030912309123ll;
439         CComVariant c1(cy);
440         CComVariant empty;
441         hr = empty.Copy(&c1);
442         ok(SUCCEEDED(hr), "Expected .Copy() to succeed, but it failed: 0x%lx\n", hr);
443         ok(V_VT(&empty) == VT_CY, "Expected .vt to be VT_I8, was %u\n", V_VT(&empty));
444         ok(V_CY(&empty).int64 == cy.int64, "Expected value to be %s, was: %s\n", wine_dbgstr_longlong(cy.int64), wine_dbgstr_longlong(V_CY(&empty).int64));
445     }
446     {
447         CComVariant var = (int)333;
448         CComVariant var2;
449         // var2 = var changed to bstr
450         HRESULT hr = var2.ChangeType(VT_BSTR, &var);
451         ok(SUCCEEDED(hr), "Expected .ChangeType() to succeed, but it failed: 0x%lx\n", hr);
452         expect_int(var, 333, VT_I4);
453         ok(V_VT(&var2) == VT_BSTR, "Expected .vt to be VT_LPWSTR, was %u\n", V_VT(&var2));
454         ok(!wcscmp(V_BSTR(&var2), L"333"), "Expected value to be L\"TESTW\", was: %s\n", wine_dbgstr_w(V_BSTR(&var2)));
455 
456         // change in place
457         hr = var.ChangeType(VT_BSTR);
458         ok(SUCCEEDED(hr), "Expected .ChangeType() to succeed, but it failed: 0x%lx\n", hr);
459         ok(V_VT(&var) == VT_BSTR, "Expected .vt to be VT_LPWSTR, was %u\n", V_VT(&var));
460         ok(!wcscmp(V_BSTR(&var), L"333"), "Expected value to be L\"TESTW\", was: %s\n", wine_dbgstr_w(V_BSTR(&var)));
461     }
462 }
463 
464 
465 START_TEST(CComVariant)
466 {
467     test_construction();
468     test_copyconstructor();
469     test_assign();
470     test_misc();
471 }
472