4 * Copyright 2004 Robert Shearman
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "wine/test.h"
25 #ifdef NONAMELESSUNION
39 { TRUE , FALSE, FALSE, FALSE }, /* VT_EMPTY */
40 { TRUE , FALSE, FALSE, FALSE }, /* VT_NULL */
41 { TRUE , FALSE, TRUE , FALSE }, /* VT_I2 */
42 { TRUE , FALSE, TRUE , FALSE }, /* VT_I4 */
43 { TRUE , FALSE, TRUE , FALSE }, /* VT_R4 */
44 { TRUE , FALSE, TRUE , FALSE }, /* VT_R8 */
45 { TRUE , FALSE, TRUE , FALSE }, /* VT_CY */
46 { TRUE , FALSE, TRUE , FALSE }, /* VT_DATE */
47 { TRUE , FALSE, TRUE , FALSE }, /* VT_BSTR */
48 { FALSE, FALSE, FALSE, FALSE }, /* VT_DISPATCH */
49 { TRUE , FALSE, TRUE , FALSE }, /* VT_ERROR */
50 { TRUE , FALSE, TRUE , FALSE }, /* VT_BOOL */
51 { FALSE, FALSE, TRUE , FALSE }, /* VT_VARIANT */
52 { FALSE, FALSE, FALSE, FALSE }, /* VT_UNKNOWN */
53 { FALSE, FALSE, FALSE, FALSE }, /* VT_DECIMAL */
54 { FALSE, FALSE, FALSE, FALSE }, /* 15 */
55 { FALSE, FALSE, FALSE, FALSE }, /* VT_I1 */
56 { TRUE , FALSE, TRUE , FALSE }, /* VT_UI1 */
57 { TRUE , FALSE, TRUE , FALSE }, /* VT_UI2 */
58 { TRUE , FALSE, TRUE , FALSE }, /* VT_UI4 */
59 { TRUE , FALSE, TRUE , FALSE }, /* VT_I8 */
60 { TRUE , FALSE, TRUE , FALSE }, /* VT_UI8 */
61 { FALSE, FALSE, FALSE, FALSE }, /* VT_INT */
62 { FALSE, FALSE, FALSE, FALSE }, /* VT_UINT */
63 { FALSE, FALSE, FALSE, FALSE }, /* VT_VOID */
64 { FALSE, FALSE, FALSE, FALSE }, /* VT_HRESULT */
65 { FALSE, FALSE, FALSE, FALSE }, /* VT_PTR */
66 { FALSE, FALSE, FALSE, FALSE }, /* VT_SAFEARRAY */
67 { FALSE, FALSE, FALSE, FALSE }, /* VT_CARRAY */
68 { FALSE, FALSE, FALSE, FALSE }, /* VT_USERDEFINED */
69 { TRUE , FALSE, TRUE , FALSE }, /* VT_LPSTR */
70 { TRUE , FALSE, TRUE , FALSE }, /* VT_LPWSTR */
71 { FALSE, FALSE, FALSE, FALSE }, /* 32 */
72 { FALSE, FALSE, FALSE, FALSE }, /* 33 */
73 { FALSE, FALSE, FALSE, FALSE }, /* 34 */
74 { FALSE, FALSE, FALSE, FALSE }, /* 35 */
75 { FALSE, FALSE, FALSE, FALSE }, /* VT_RECORD */
76 { FALSE, FALSE, FALSE, FALSE }, /* VT_INT_PTR */
77 { FALSE, FALSE, FALSE, FALSE }, /* VT_UINT_PTR */
78 { FALSE, FALSE, FALSE, FALSE }, /* 39 */
79 { FALSE, FALSE, FALSE, FALSE }, /* 40 */
80 { FALSE, FALSE, FALSE, FALSE }, /* 41 */
81 { FALSE, FALSE, FALSE, FALSE }, /* 42 */
82 { FALSE, FALSE, FALSE, FALSE }, /* 43 */
83 { FALSE, FALSE, FALSE, FALSE }, /* 44 */
84 { FALSE, FALSE, FALSE, FALSE }, /* 45 */
85 { FALSE, FALSE, FALSE, FALSE }, /* 46 */
86 { FALSE, FALSE, FALSE, FALSE }, /* 47 */
87 { FALSE, FALSE, FALSE, FALSE }, /* 48 */
88 { FALSE, FALSE, FALSE, FALSE }, /* 49 */
89 { FALSE, FALSE, FALSE, FALSE }, /* 50 */
90 { FALSE, FALSE, FALSE, FALSE }, /* 51 */
91 { FALSE, FALSE, FALSE, FALSE }, /* 52 */
92 { FALSE, FALSE, FALSE, FALSE }, /* 53 */
93 { FALSE, FALSE, FALSE, FALSE }, /* 54 */
94 { FALSE, FALSE, FALSE, FALSE }, /* 55 */
95 { FALSE, FALSE, FALSE, FALSE }, /* 56 */
96 { FALSE, FALSE, FALSE, FALSE }, /* 57 */
97 { FALSE, FALSE, FALSE, FALSE }, /* 58 */
98 { FALSE, FALSE, FALSE, FALSE }, /* 59 */
99 { FALSE, FALSE, FALSE, FALSE }, /* 60 */
100 { FALSE, FALSE, FALSE, FALSE }, /* 61 */
101 { FALSE, FALSE, FALSE, FALSE }, /* 62 */
102 { FALSE, FALSE, FALSE, FALSE }, /* 63 */
103 { TRUE , FALSE, TRUE , FALSE }, /* VT_FILETIME */
104 { TRUE , FALSE, FALSE, FALSE }, /* VT_BLOB */
105 { TRUE , FALSE, FALSE, FALSE }, /* VT_STREAM */
106 { TRUE , FALSE, FALSE, FALSE }, /* VT_STORAGE */
107 { TRUE , FALSE, FALSE, FALSE }, /* VT_STREAMED_OBJECT */
108 { TRUE , FALSE, FALSE, FALSE }, /* VT_STORED_OBJECT */
109 { TRUE , FALSE, FALSE, FALSE }, /* VT_BLOB_OBJECT */
110 { TRUE , FALSE, TRUE , FALSE } /* VT_CF */
113 static const char* wine_vtypes[VT_CLSID+1] =
115 "VT_EMPTY","VT_NULL","VT_I2","VT_I4","VT_R4","VT_R8","VT_CY","VT_DATE",
116 "VT_BSTR","VT_DISPATCH","VT_ERROR","VT_BOOL","VT_VARIANT","VT_UNKNOWN",
117 "VT_DECIMAL","15","VT_I1","VT_UI1","VT_UI2","VT_UI4","VT_I8","VT_UI8",
118 "VT_INT","VT_UINT","VT_VOID","VT_HRESULT","VT_PTR","VT_SAFEARRAY",
119 "VT_CARRAY","VT_USERDEFINED","VT_LPSTR","VT_LPWSTR","32","33","34","35",
120 "VT_RECORD","VT_INT_PTR","VT_UINT_PTR","39","40","41","42","43","44","45",
121 "46","47","48","49","50","51","52","53","54","55","56","57","58","59","60",
122 "61","62","63","VT_FILETIME","VT_BLOB","VT_STREAM","VT_STORAGE",
123 "VT_STREAMED_OBJECT","VT_STORED_OBJECT","VT_BLOB_OBJECT","VT_CF","VT_CLSID"
126 static void test_validtypes()
132 memset(&propvar, 0, sizeof(propvar));
134 for (i = 0; i < sizeof(valid_types)/sizeof(valid_types[0]); i++)
137 hr = PropVariantClear(&propvar);
138 ok(valid_types[i].simple == !(hr == STG_E_INVALIDPARAMETER),
139 "PropVariantClear(%s) should have returned 0x%08lx, but returned 0x%08lx\n",
141 valid_types[i].simple ? S_OK : STG_E_INVALIDPARAMETER, hr);
143 propvar.vt = i | VT_ARRAY;
144 hr = PropVariantClear(&propvar);
145 ok(valid_types[i].with_array == !(hr == STG_E_INVALIDPARAMETER),
146 "PropVariantClear(%s|VT_ARRAY) should have returned 0x%08lx, but returned 0x%08lx\n",
148 valid_types[i].with_array ? S_OK : STG_E_INVALIDPARAMETER, hr);
150 propvar.vt = i | VT_VECTOR;
151 hr = PropVariantClear(&propvar);
152 ok(valid_types[i].with_vector == !(hr == STG_E_INVALIDPARAMETER),
153 "PropVariantClear(%s|VT_VECTOR) should have returned 0x%08lx, but returned 0x%08lx\n",
155 valid_types[i].with_vector ? S_OK : STG_E_INVALIDPARAMETER, hr);
157 propvar.vt = i | VT_BYREF;
158 hr = PropVariantClear(&propvar);
159 ok(valid_types[i].byref == !(hr == STG_E_INVALIDPARAMETER),
160 "PropVariantClear(%s|VT_BYREF) should have returned 0x%08lx, but returned 0x%08lx\n",
162 valid_types[i].byref ? S_OK : STG_E_INVALIDPARAMETER, hr);
166 static void test_copy()
168 static const char szTestString[] = "Test String";
169 static const WCHAR wszTestString[] = {'T','e','s','t',' ','S','t','r','i','n','g',0};
170 PROPVARIANT propvarSrc;
171 PROPVARIANT propvarDst;
174 propvarSrc.vt = VT_BSTR;
175 U(propvarSrc).bstrVal = SysAllocString(wszTestString);
177 hr = PropVariantCopy(&propvarDst, &propvarSrc);
178 ok(hr == S_OK, "PropVariantCopy(...VT_BSTR...) failed\n");
179 ok(!lstrcmpW(U(propvarSrc).bstrVal, U(propvarDst).bstrVal), "BSTR not copied properly\n");
180 hr = PropVariantClear(&propvarSrc);
181 ok(hr == S_OK, "PropVariantClear(...VT_BSTR...) failed\n");
182 hr = PropVariantClear(&propvarDst);
183 ok(hr == S_OK, "PropVariantClear(...VT_BSTR...) failed\n");
185 propvarSrc.vt = VT_LPWSTR;
186 U(propvarSrc).pwszVal = (LPWSTR)wszTestString;
187 hr = PropVariantCopy(&propvarDst, &propvarSrc);
188 ok(hr == S_OK, "PropVariantCopy(...VT_LPWSTR...) failed\n");
189 ok(!lstrcmpW(U(propvarSrc).pwszVal, U(propvarDst).pwszVal), "Wide string not copied properly\n");
190 hr = PropVariantClear(&propvarDst);
191 ok(hr == S_OK, "PropVariantClear(...VT_LPWSTR...) failed\n");
192 memset(&propvarSrc, 0, sizeof(propvarSrc));
194 propvarSrc.vt = VT_LPSTR;
195 U(propvarSrc).pszVal = (LPSTR)szTestString;
196 hr = PropVariantCopy(&propvarDst, &propvarSrc);
197 ok(hr == S_OK, "PropVariantCopy(...VT_LPSTR...) failed\n");
198 ok(!strcmp(U(propvarSrc).pszVal, U(propvarDst).pszVal), "String not copied properly\n");
199 hr = PropVariantClear(&propvarDst);
200 ok(hr == S_OK, "PropVariantClear(...VT_LPSTR...) failed\n");
201 memset(&propvarSrc, 0, sizeof(propvarSrc));
204 START_TEST(propvariant)