Reverse the order for deleting the items in resetcontent to correctly
[wine] / dlls / ole32 / tests / propvariant.c
1 /*
2  * PropVariant Tests
3  *
4  * Copyright 2004 Robert Shearman
5  *
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.
10  *
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.
15  *
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
19  */
20
21 #include "windows.h"
22
23 #include "wine/test.h"
24
25 #ifdef NONAMELESSUNION
26 # define U(x) (x).u
27 #else
28 # define U(x) (x)
29 #endif
30
31 struct valid_mapping
32 {
33     BOOL simple;
34     BOOL with_array;
35     BOOL with_vector;
36     BOOL byref;
37 } valid_types[] =
38 {
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 */
111 };
112
113 static const char* wine_vtypes[VT_CLSID+1] =
114 {
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"
124 };
125
126 static void test_validtypes()
127 {
128     PROPVARIANT propvar;
129     HRESULT hr;
130     unsigned int i;
131
132     memset(&propvar, 0, sizeof(propvar));
133
134     for (i = 0; i < sizeof(valid_types)/sizeof(valid_types[0]); i++)
135     {
136         propvar.vt = 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",
140             wine_vtypes[i],
141             valid_types[i].simple ? S_OK : STG_E_INVALIDPARAMETER, hr);
142
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",
147             wine_vtypes[i],
148             valid_types[i].with_array ? S_OK : STG_E_INVALIDPARAMETER, hr);
149
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",
154             wine_vtypes[i],
155             valid_types[i].with_vector ? S_OK : STG_E_INVALIDPARAMETER, hr);
156
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",
161             wine_vtypes[i],
162             valid_types[i].byref ? S_OK : STG_E_INVALIDPARAMETER, hr);
163     }
164 }
165
166 static void test_copy()
167 {
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;
172     HRESULT hr;
173
174     propvarSrc.vt = VT_BSTR;
175     U(propvarSrc).bstrVal = SysAllocString(wszTestString);
176
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");
184
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));
193
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));
202 }
203
204 START_TEST(propvariant)
205 {
206     test_validtypes();
207     test_copy();
208 }