oledb32: Support converting DBTYPE_VARIANT to DBTYPE_GUID.
[wine.git] / dlls / oledb32 / tests / convert.c
blobaea2e40473c2d93dee55970b658ba01073bfca12
1 /* OLE DB Conversion library tests
3 * Copyright 2009 Huw Davies
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #include <stdarg.h>
22 #define COBJMACROS
23 #define NONAMELESSUNION
24 #define NONAMELESSSTRUCT
26 #include "windef.h"
27 #include "winbase.h"
28 #include "ole2.h"
29 #include "msdadc.h"
31 #include "oledberr.h"
33 #include "initguid.h"
34 #include "msdaguid.h"
36 #include "wine/test.h"
38 static IDataConvert *convert;
40 static void test_dcinfo(void)
42 IDCInfo *info;
43 HRESULT hr;
44 DCINFOTYPE types[2];
45 DCINFO *inf;
47 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDCInfo, (void**)&info);
48 if(FAILED(hr))
50 win_skip("Unable to load oledb conversion library\n");
51 return;
54 types[0] = DCINFOTYPE_VERSION;
55 hr = IDCInfo_GetInfo(info, 1, types, &inf);
56 ok(hr == S_OK, "got %08lx\n", hr);
58 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08lx\n", inf->eInfoType);
59 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
60 ok(V_UI4(&inf->vData) == 0x110, "got %08lx\n", V_UI4(&inf->vData));
62 V_UI4(&inf->vData) = 0x200;
63 hr = IDCInfo_SetInfo(info, 1, inf);
64 ok(hr == S_OK, "got %08lx\n", hr);
65 CoTaskMemFree(inf);
67 hr = IDCInfo_GetInfo(info, 1, types, &inf);
68 ok(hr == S_OK, "got %08lx\n", hr);
69 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08lx\n", inf->eInfoType);
70 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
71 ok(V_UI4(&inf->vData) == 0x200, "got %08lx\n", V_UI4(&inf->vData));
73 V_UI4(&inf->vData) = 0x100;
74 hr = IDCInfo_SetInfo(info, 1, inf);
75 ok(hr == S_OK, "got %08lx\n", hr);
76 CoTaskMemFree(inf);
78 hr = IDCInfo_GetInfo(info, 1, types, &inf);
79 ok(hr == S_OK, "got %08lx\n", hr);
80 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08lx\n", inf->eInfoType);
81 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
82 ok(V_UI4(&inf->vData) == 0x100, "got %08lx\n", V_UI4(&inf->vData));
84 V_UI4(&inf->vData) = 0x500;
85 hr = IDCInfo_SetInfo(info, 1, inf);
86 ok(hr == S_OK, "got %08lx\n", hr);
87 CoTaskMemFree(inf);
89 hr = IDCInfo_GetInfo(info, 1, types, &inf);
90 ok(hr == S_OK, "got %08lx\n", hr);
91 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08lx\n", inf->eInfoType);
92 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
93 ok(V_UI4(&inf->vData) == 0x500, "got %08lx\n", V_UI4(&inf->vData));
95 V_UI4(&inf->vData) = 0xffff;
96 hr = IDCInfo_SetInfo(info, 1, inf);
97 ok(hr == S_OK, "got %08lx\n", hr);
98 CoTaskMemFree(inf);
100 hr = IDCInfo_GetInfo(info, 1, types, &inf);
101 ok(hr == S_OK, "got %08lx\n", hr);
102 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08lx\n", inf->eInfoType);
103 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
104 ok(V_UI4(&inf->vData) == 0xffff, "got %08lx\n", V_UI4(&inf->vData));
106 V_UI4(&inf->vData) = 0x12345678;
107 hr = IDCInfo_SetInfo(info, 1, inf);
108 ok(hr == S_OK, "got %08lx\n", hr);
109 CoTaskMemFree(inf);
111 hr = IDCInfo_GetInfo(info, 1, types, &inf);
112 ok(hr == S_OK, "got %08lx\n", hr);
113 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08lx\n", inf->eInfoType);
114 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
115 ok(V_UI4(&inf->vData) == 0x12345678, "got %08lx\n", V_UI4(&inf->vData));
117 /* Try setting a version variant of something other than VT_UI4 */
118 V_VT(&inf->vData) = VT_I4;
119 V_I4(&inf->vData) = 0x200;
120 hr = IDCInfo_SetInfo(info, 1, inf);
121 ok(hr == DB_S_ERRORSOCCURRED, "got %08lx\n", hr);
122 CoTaskMemFree(inf);
124 hr = IDCInfo_GetInfo(info, 1, types, &inf);
125 ok(hr == S_OK, "got %08lx\n", hr);
126 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08lx\n", inf->eInfoType);
127 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
128 ok(V_UI4(&inf->vData) == 0x12345678, "got %08lx\n", V_UI4(&inf->vData));
129 CoTaskMemFree(inf);
131 /* More than one type */
132 types[1] = 2;
133 hr = IDCInfo_GetInfo(info, 2, types, &inf);
134 ok(hr == S_OK, "got %08lx\n", hr);
135 ok(inf[0].eInfoType == DCINFOTYPE_VERSION, "got %08lx\n", inf[0].eInfoType);
136 ok(V_VT(&inf[0].vData) == VT_UI4, "got %08x\n", V_VT(&inf[0].vData));
137 ok(V_UI4(&inf[0].vData) == 0x12345678, "got %08lx\n", V_UI4(&inf[0].vData));
138 ok(inf[1].eInfoType == 2, "got %08lx\n", inf[1].eInfoType);
139 ok(V_VT(&inf[1].vData) == VT_EMPTY, "got %08x\n", V_VT(&inf[1].vData));
141 hr = IDCInfo_SetInfo(info, 2, inf);
142 ok(hr == S_OK, "got %08lx\n", hr);
143 CoTaskMemFree(inf);
146 IDCInfo_Release(info);
149 static const struct can_convert
151 DBTYPE type;
152 DWORD can_convert_to;
153 } simple_convert[] =
155 {DBTYPE_EMPTY, 0x63bfd9ff},
156 {DBTYPE_NULL, 0x40001002},
157 {DBTYPE_I2, 0x3b9fd9ff},
158 {DBTYPE_I4, 0x3bdfd9ff},
160 {DBTYPE_R4, 0x3b9fd9ff},
161 {DBTYPE_R8, 0x3b9fd9ff},
162 {DBTYPE_CY, 0x039fd97f},
163 {DBTYPE_DATE, 0x799f99bf},
165 {DBTYPE_BSTR, 0x7bffd9ff},
166 {DBTYPE_IDISPATCH, 0x7bffffff},
167 {DBTYPE_ERROR, 0x01001500},
168 {DBTYPE_BOOL, 0x039fd9ff},
170 {DBTYPE_VARIANT, 0x7bffffff},
171 {DBTYPE_IUNKNOWN, 0x00003203},
172 {DBTYPE_DECIMAL, 0x3b9fd97f},
173 {DBTYPE_I1, 0x3b9fd9ff},
175 {DBTYPE_UI1, 0x3b9fd9ff},
176 {DBTYPE_UI2, 0x3b9fd9ff},
177 {DBTYPE_UI4, 0x3bdfd9ff},
178 {DBTYPE_I8, 0x43dfd97f},
180 {DBTYPE_UI8, 0x43dfd97f},
181 {DBTYPE_GUID, 0x01e01103},
182 {DBTYPE_BYTES, 0x01fc110b},
183 {DBTYPE_STR, 0x7bffd9ff},
185 {DBTYPE_WSTR, 0x7bffd9ff},
186 {DBTYPE_NUMERIC, 0x039fd97f},
187 {DBTYPE_UDT, 0x00000000},
188 {DBTYPE_DBDATE, 0x79801183},
190 {DBTYPE_DBTIME, 0x79801183},
191 {DBTYPE_DBTIMESTAMP, 0x79801183},
192 {DBTYPE_FILETIME, 0x79981183}
196 static inline BOOL array_type(DBTYPE type)
198 return (type >= DBTYPE_I2 && type <= DBTYPE_UI4);
201 static void test_canconvert(void)
203 HRESULT hr;
204 int src_idx, dst_idx;
206 /* Some older versions of the library don't support several conversions, we'll skip
207 if we have such a library */
208 hr = IDataConvert_CanConvert(convert, DBTYPE_EMPTY, DBTYPE_DBTIMESTAMP);
209 if(hr == S_FALSE)
211 win_skip("Doesn't handle DBTYPE_EMPTY -> DBTYPE_DBTIMESTAMP conversion so skipping\n");
212 return;
215 /* Some older versions of the library don't support several conversions, we'll skip
216 if we have such a library */
217 hr = IDataConvert_CanConvert(convert, DBTYPE_EMPTY, DBTYPE_DBTIMESTAMP);
218 if(hr == S_FALSE)
220 win_skip("Doesn't handle DBTYPE_EMPTY -> DBTYPE_DBTIMESTAMP conversion so skipping\n");
221 return;
224 for(src_idx = 0; src_idx < ARRAY_SIZE(simple_convert); src_idx++)
225 for(dst_idx = 0; dst_idx < ARRAY_SIZE(simple_convert); dst_idx++)
227 BOOL expect, simple_expect;
228 simple_expect = (simple_convert[src_idx].can_convert_to >> dst_idx) & 1;
230 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type, simple_convert[dst_idx].type);
231 expect = simple_expect;
232 ok((hr == S_OK && expect == TRUE) ||
233 (hr == S_FALSE && expect == FALSE),
234 "%04x -> %04x: got %08lx expect conversion to be %spossible\n", simple_convert[src_idx].type,
235 simple_convert[dst_idx].type, hr, expect ? "" : "not ");
237 /* src DBTYPE_BYREF */
238 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_BYREF, simple_convert[dst_idx].type);
239 expect = simple_expect;
240 ok((hr == S_OK && expect == TRUE) ||
241 (hr == S_FALSE && expect == FALSE),
242 "%04x -> %04x: got %08lx expect conversion to be %spossible\n", simple_convert[src_idx].type | DBTYPE_BYREF,
243 simple_convert[dst_idx].type, hr, expect ? "" : "not ");
245 /* dst DBTYPE_BYREF */
246 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type, simple_convert[dst_idx].type | DBTYPE_BYREF);
247 expect = FALSE;
248 if(simple_expect &&
249 (simple_convert[dst_idx].type == DBTYPE_BYTES ||
250 simple_convert[dst_idx].type == DBTYPE_STR ||
251 simple_convert[dst_idx].type == DBTYPE_WSTR))
252 expect = TRUE;
253 ok((hr == S_OK && expect == TRUE) ||
254 (hr == S_FALSE && expect == FALSE),
255 "%04x -> %04x: got %08lx expect conversion to be %spossible\n", simple_convert[src_idx].type,
256 simple_convert[dst_idx].type | DBTYPE_BYREF, hr, expect ? "" : "not ");
258 /* src & dst DBTYPE_BYREF */
259 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_BYREF, simple_convert[dst_idx].type | DBTYPE_BYREF);
260 expect = FALSE;
261 if(simple_expect &&
262 (simple_convert[dst_idx].type == DBTYPE_BYTES ||
263 simple_convert[dst_idx].type == DBTYPE_STR ||
264 simple_convert[dst_idx].type == DBTYPE_WSTR))
265 expect = TRUE;
266 ok((hr == S_OK && expect == TRUE) ||
267 (hr == S_FALSE && expect == FALSE),
268 "%04x -> %04x: got %08lx expect conversion to be %spossible\n", simple_convert[src_idx].type | DBTYPE_BYREF,
269 simple_convert[dst_idx].type | DBTYPE_BYREF, hr, expect ? "" : "not ");
271 /* src DBTYPE_ARRAY */
272 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_ARRAY, simple_convert[dst_idx].type);
273 expect = FALSE;
274 if(array_type(simple_convert[src_idx].type) && simple_convert[dst_idx].type == DBTYPE_VARIANT)
275 expect = TRUE;
276 ok((hr == S_OK && expect == TRUE) ||
277 (hr == S_FALSE && expect == FALSE),
278 "%04x -> %04x: got %08lx expect conversion to be %spossible\n", simple_convert[src_idx].type | DBTYPE_ARRAY,
279 simple_convert[dst_idx].type, hr, expect ? "" : "not ");
281 /* dst DBTYPE_ARRAY */
282 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type, simple_convert[dst_idx].type | DBTYPE_ARRAY);
283 expect = FALSE;
284 if(array_type(simple_convert[dst_idx].type) &&
285 (simple_convert[src_idx].type == DBTYPE_IDISPATCH ||
286 simple_convert[src_idx].type == DBTYPE_VARIANT))
287 expect = TRUE;
288 ok((hr == S_OK && expect == TRUE) ||
289 (hr == S_FALSE && expect == FALSE),
290 "%04x -> %04x: got %08lx expect conversion to be %spossible\n", simple_convert[src_idx].type,
291 simple_convert[dst_idx].type | DBTYPE_ARRAY, hr, expect ? "" : "not ");
293 /* src & dst DBTYPE_ARRAY */
294 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_ARRAY, simple_convert[dst_idx].type | DBTYPE_ARRAY);
295 expect = FALSE;
296 if(array_type(simple_convert[src_idx].type) &&
297 simple_convert[src_idx].type == simple_convert[dst_idx].type)
298 expect = TRUE;
299 ok((hr == S_OK && expect == TRUE) ||
300 (hr == S_FALSE && expect == FALSE),
301 "%04x -> %04x: got %08lx expect conversion to be %spossible\n", simple_convert[src_idx].type | DBTYPE_ARRAY,
302 simple_convert[dst_idx].type | DBTYPE_ARRAY, hr, expect ? "" : "not ");
304 /* src DBTYPE_VECTOR */
305 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_VECTOR, simple_convert[dst_idx].type);
306 ok(hr == S_FALSE,
307 "%04x -> %04x: got %08lx expect conversion to not be possible\n", simple_convert[src_idx].type | DBTYPE_VECTOR,
308 simple_convert[dst_idx].type, hr);
310 /* dst DBTYPE_VECTOR */
311 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type, simple_convert[dst_idx].type | DBTYPE_VECTOR);
312 ok(hr == S_FALSE,
313 "%04x -> %04x: got %08lx expect conversion to not be possible\n", simple_convert[src_idx].type,
314 simple_convert[dst_idx].type | DBTYPE_VECTOR, hr);
316 /* src & dst DBTYPE_VECTOR */
317 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_VECTOR, simple_convert[dst_idx].type | DBTYPE_VECTOR);
318 ok(hr == S_FALSE,
319 "%04x -> %04x: got %08lx expect conversion to not be possible\n", simple_convert[src_idx].type | DBTYPE_VECTOR,
320 simple_convert[dst_idx].type | DBTYPE_VECTOR, hr);
326 static void test_converttoi1(void)
328 HRESULT hr;
329 signed char dst;
330 BYTE src[sizeof(VARIANT)]; /* assuming that VARIANT is larger than all the types used in src */
331 DBSTATUS dst_status;
332 DBLENGTH dst_len;
333 static const WCHAR ten[] = {'1','0',0};
334 BSTR b;
336 dst_len = dst = 0x12;
337 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
338 ok(hr == S_OK, "got %08lx\n", hr);
339 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
340 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
341 ok(dst == 0, "got %08x\n", dst);
343 dst_len = dst = 0x12;
344 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
345 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
346 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
347 ok(dst_len == 0x12, "got %Id\n", dst_len);
348 ok(dst == 0x12, "got %08x\n", dst);
350 dst_len = dst = 0x12;
351 *(short *)src = 0x43;
352 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
353 ok(hr == S_OK, "got %08lx\n", hr);
354 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
355 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
356 ok(dst == 0x43, "got %08x\n", dst);
358 dst_len = dst = 0x12;
359 *(int *)src = 0x4321cafe;
360 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
361 todo_wine
362 ok(hr == DB_E_DATAOVERFLOW, "got %08lx\n", hr);
363 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
364 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
365 ok(dst == 0x12, "got %08x\n", dst);
367 dst_len = dst = 0x12;
368 *(int *)src = 0x43;
369 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
370 ok(hr == S_OK, "got %08lx\n", hr);
371 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
372 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
373 ok(dst == 0x43, "got %08x\n", dst);
375 dst_len = dst = 0x12;
376 *(FLOAT *)src = 10.75;
377 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
378 ok(hr == S_OK, "got %08lx\n", hr);
379 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
380 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
381 ok(dst == 11, "got %08x\n", dst);
383 dst_len = dst = 0x12;
384 *(FLOAT *)src = -10.75;
385 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
386 ok(hr == S_OK, "got %08lx\n", hr);
387 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
388 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
389 ok(dst == -11, "got %08x\n", dst);
391 dst_len = dst = 0x12;
392 *(double *)src = 10.75;
393 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
394 ok(hr == S_OK, "got %08lx\n", hr);
395 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
396 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
397 ok(dst == 11, "got %08x\n", dst);
399 dst_len = dst = 0x12;
400 ((LARGE_INTEGER *)src)->QuadPart = 107500;
401 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
402 ok(hr == S_OK, "got %08lx\n", hr);
403 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
404 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
405 ok(dst == 11, "got %08x\n", dst);
407 dst_len = dst = 0x12;
408 *(DATE *)src = 10.7500;
409 hr = IDataConvert_DataConvert(convert, DBTYPE_DATE, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
410 ok(hr == S_OK, "got %08lx\n", hr);
411 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
412 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
413 ok(dst == 11, "got %08x\n", dst);
415 dst_len = dst = 0x12;
416 b = SysAllocString(ten);
417 *(BSTR *)src = b;
418 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
419 ok(hr == S_OK, "got %08lx\n", hr);
420 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
421 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
422 ok(dst == 10, "got %08x\n", dst);
423 SysFreeString(b);
425 dst_len = dst = 0x12;
426 *(SCODE *)src = 0x4321cafe;
427 hr = IDataConvert_DataConvert(convert, DBTYPE_ERROR, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
428 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
429 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
430 ok(dst_len == 0x12, "got %Id\n", dst_len);
431 ok(dst == 0x12, "got %08x\n", dst);
433 dst_len = dst = 0x12;
434 *(VARIANT_BOOL *)src = VARIANT_TRUE;
435 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
436 ok(hr == S_OK, "got %08lx\n", hr);
437 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
438 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
439 ok(dst == -1, "got %08x\n", dst);
441 dst_len = dst = 0x12;
442 *(VARIANT_BOOL *)src = VARIANT_FALSE;
443 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
444 ok(hr == S_OK, "got %08lx\n", hr);
445 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
446 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
447 ok(dst == 0, "got %08x\n", dst);
449 dst_len = dst = 0x12;
450 V_VT((VARIANT*)src) = VT_I2;
451 V_I2((VARIANT*)src) = 0x43;
452 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
453 ok(hr == S_OK, "got %08lx\n", hr);
454 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
455 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
456 ok(dst == 0x43, "got %08x\n", dst);
458 V_VT((VARIANT*)src) = VT_NULL;
459 dst_len = 0x12;
460 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
461 ok(hr == S_OK, "got %08lx\n", hr);
462 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
463 ok(dst_len == 0x12, "got %Id\n", dst_len);
465 dst_len = dst = 0x12;
466 memset(src, 0, sizeof(DECIMAL));
467 ((DECIMAL*)src)->u1.Lo64 = 0x43;
468 hr = IDataConvert_DataConvert(convert, DBTYPE_DECIMAL, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
469 ok(hr == S_OK, "got %08lx\n", hr);
470 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
471 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
472 ok(dst == 0x43, "got %08x\n", dst);
474 dst_len = dst = 0x12;
475 *(signed char*)src = 0x70;
476 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
477 ok(hr == S_OK, "got %08lx\n", hr);
478 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
479 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
480 ok(dst == 0x70, "got %08x\n", dst);
482 dst_len = dst = 0x12;
483 *(BYTE*)src = 0x70;
484 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
485 ok(hr == S_OK, "got %08lx\n", hr);
486 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
487 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
488 ok(dst == 0x70, "got %08x\n", dst);
490 dst_len = dst = 0x12;
491 *(WORD*)src = 0xC8;
492 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
493 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
494 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
495 todo_wine
496 ok(broken(dst_len == sizeof(dst)) || dst_len == 0x12 /* W2K+ */, "got %Id\n", dst_len);
497 ok(dst == 0x12, "got %08x\n", dst);
499 dst_len = dst = 0x12;
500 *(WORD*)src = 0x43;
501 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
502 ok(hr == S_OK, "got %08lx\n", hr);
503 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
504 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
505 ok(dst == 0x43, "got %08x\n", dst);
507 dst_len = dst = 0x12;
508 *(DWORD*)src = 0xabcd1234;
509 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
510 todo_wine
511 ok(hr == DB_E_DATAOVERFLOW, "got %08lx\n", hr);
512 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
513 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
514 ok(dst == 0x12, "got %08x\n", dst);
516 dst_len = dst = 0x12;
517 *(DWORD*)src = 0x12abcd;
518 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
519 todo_wine
520 ok(hr == DB_E_DATAOVERFLOW, "got %08lx\n", hr);
521 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
522 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
523 ok(dst == 0x12, "got %08x\n", dst);
525 dst_len = dst = 0x12;
526 *(DWORD*)src = 0x43;
527 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
528 ok(hr == S_OK, "got %08lx\n", hr);
529 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
530 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
531 ok(dst == 0x43, "got %08x\n", dst);
533 dst_len = dst = 0x12;
534 ((LARGE_INTEGER*)src)->QuadPart = 0x12abcd;
535 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
536 ok(hr == DB_E_ERRORSOCCURRED ||
537 broken(hr == DB_E_UNSUPPORTEDCONVERSION), /* win98 */
538 "got %08lx\n", hr);
539 if(hr != DB_E_UNSUPPORTEDCONVERSION) /* win98 doesn't support I8/UI8 */
541 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
542 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
543 ok(dst == 0x12, "got %08x\n", dst);
545 dst_len = dst = 0x12;
546 ((LARGE_INTEGER*)src)->QuadPart = 0x43;
547 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
548 ok(hr == S_OK, "got %08lx\n", hr);
549 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
550 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
551 ok(dst == 0x43, "got %08x\n", dst);
553 dst_len = dst = 0x12;
554 ((ULARGE_INTEGER*)src)->QuadPart = 0x43;
555 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
556 ok(hr == S_OK, "got %08lx\n", hr);
557 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
558 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
559 ok(dst == 0x43, "got %08x\n", dst);
562 dst_len = dst = 0x12;
563 strcpy((char *)src, "10");
564 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I1, 2, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
565 ok(hr == S_OK, "got %08lx\n", hr);
566 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
567 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
568 ok(dst == 10, "got %08x\n", dst);
570 dst_len = dst = 0x12;
571 strcpy((char *)src, "10");
572 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
573 ok(hr == S_OK, "got %08lx\n", hr);
574 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
575 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
576 ok(dst == 10, "got %08x\n", dst);
578 dst_len = dst = 0x12;
579 memcpy(src, ten, sizeof(ten));
580 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I1, 4, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
581 ok(hr == S_OK, "got %08lx\n", hr);
582 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
583 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
584 ok(dst == 10, "got %08x\n", dst);
586 dst_len = dst = 0x12;
587 memcpy(src, ten, sizeof(ten));
588 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
589 ok(hr == S_OK, "got %08lx\n", hr);
590 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
591 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
592 ok(dst == 10, "got %08x\n", dst);
594 dst_len = dst = 0x12;
595 *(WORD*)src = 0x43;
596 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
597 ok(hr == S_OK, "got %08lx\n", hr);
598 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
599 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
600 ok(dst == 0x43, "got %08x\n", dst);
602 dst_len = dst = 0x12;
603 *(DWORD*)src = 0xabcd1234;
604 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
605 todo_wine
606 ok(hr == DB_E_DATAOVERFLOW, "got %08lx\n", hr);
607 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
608 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
609 ok(dst == 0x12, "got %08x\n", dst);
611 dst_len = dst = 0x12;
612 *(DWORD*)src = 0x12abcd;
613 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
614 todo_wine
615 ok(hr == DB_E_DATAOVERFLOW, "got %08lx\n", hr);
616 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
617 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
618 ok(dst == 0x12, "got %08x\n", dst);
620 dst_len = dst = 0x12;
621 *(DWORD*)src = 0x43;
622 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
623 ok(hr == S_OK, "got %08lx\n", hr);
624 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
625 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
626 ok(dst == 0x43, "got %08x\n", dst);
628 dst_len = dst = 0x12;
629 memcpy(src, ten, sizeof(ten));
630 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
631 ok(hr == S_OK, "got %08lx\n", hr);
632 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
633 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
634 ok(dst == 10, "got %08x\n", dst);
637 static void test_converttoi2(void)
639 HRESULT hr;
640 signed short dst;
641 BYTE src[sizeof(VARIANT)]; /* assuming that VARIANT is larger than all the types used in src */
642 DBSTATUS dst_status;
643 DBLENGTH dst_len;
644 static const WCHAR ten[] = {'1','0',0};
645 BSTR b;
647 dst_len = dst = 0x1234;
648 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
649 ok(hr == S_OK, "got %08lx\n", hr);
650 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
651 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
652 ok(dst == 0, "got %08x\n", dst);
654 dst_len = dst = 0x1234;
655 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
656 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
657 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
658 ok(dst_len == 0x1234, "got %Id\n", dst_len);
659 ok(dst == 0x1234, "got %08x\n", dst);
661 dst_len = dst = 0x1234;
662 *(short *)src = 0x4321;
663 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
664 ok(hr == S_OK, "got %08lx\n", hr);
665 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
666 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
667 ok(dst == 0x4321, "got %08x\n", dst);
669 dst_len = dst = 0x1234;
670 *(int *)src = 0x4321cafe;
671 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
672 todo_wine
673 ok(hr == DB_E_DATAOVERFLOW, "got %08lx\n", hr);
674 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
675 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
676 ok(dst == 0x1234, "got %08x\n", dst);
678 dst_len = dst = 0x1234;
679 *(int *)src = 0x4321;
680 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
681 ok(hr == S_OK, "got %08lx\n", hr);
682 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
683 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
684 ok(dst == 0x4321, "got %08x\n", dst);
686 dst_len = dst = 0x1234;
687 *(FLOAT *)src = 10.75;
688 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
689 ok(hr == S_OK, "got %08lx\n", hr);
690 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
691 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
692 ok(dst == 11, "got %08x\n", dst);
694 dst_len = dst = 0x1234;
695 *(FLOAT *)src = -10.75;
696 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
697 ok(hr == S_OK, "got %08lx\n", hr);
698 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
699 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
700 ok(dst == -11, "got %08x\n", dst);
702 dst_len = dst = 0x1234;
703 *(double *)src = 10.75;
704 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
705 ok(hr == S_OK, "got %08lx\n", hr);
706 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
707 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
708 ok(dst == 11, "got %08x\n", dst);
710 dst_len = dst = 0x1234;
711 ((LARGE_INTEGER *)src)->QuadPart = 107500;
712 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
713 ok(hr == S_OK, "got %08lx\n", hr);
714 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
715 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
716 ok(dst == 11, "got %08x\n", dst);
718 dst_len = dst = 0x1234;
719 *(DATE *)src = 10.7500;
720 hr = IDataConvert_DataConvert(convert, DBTYPE_DATE, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
721 ok(hr == S_OK, "got %08lx\n", hr);
722 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
723 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
724 ok(dst == 11, "got %08x\n", dst);
726 dst_len = dst = 0x1234;
727 b = SysAllocString(ten);
728 *(BSTR *)src = b;
729 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
730 ok(hr == S_OK, "got %08lx\n", hr);
731 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
732 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
733 ok(dst == 10, "got %08x\n", dst);
734 SysFreeString(b);
736 dst_len = dst = 0x1234;
737 *(SCODE *)src = 0x4321cafe;
738 hr = IDataConvert_DataConvert(convert, DBTYPE_ERROR, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
739 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
740 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
741 ok(dst_len == 0x1234, "got %Id\n", dst_len);
742 ok(dst == 0x1234, "got %08x\n", dst);
744 dst_len = dst = 0x1234;
745 *(VARIANT_BOOL *)src = VARIANT_TRUE;
746 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
747 ok(hr == S_OK, "got %08lx\n", hr);
748 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
749 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
750 ok(dst == -1, "got %08x\n", dst);
752 dst_len = dst = 0x1234;
753 *(VARIANT_BOOL *)src = VARIANT_FALSE;
754 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
755 ok(hr == S_OK, "got %08lx\n", hr);
756 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
757 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
758 ok(dst == 0, "got %08x\n", dst);
760 dst_len = dst = 0x1234;
761 V_VT((VARIANT*)src) = VT_I2;
762 V_I2((VARIANT*)src) = 0x4321;
763 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
764 ok(hr == S_OK, "got %08lx\n", hr);
765 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
766 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
767 ok(dst == 0x4321, "got %08x\n", dst);
769 V_VT((VARIANT*)src) = VT_NULL;
770 dst_len = 0x1234;
771 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
772 ok(hr == S_OK, "got %08lx\n", hr);
773 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
774 ok(dst_len == 0x1234, "got %Id\n", dst_len);
776 dst_len = dst = 0x1234;
777 memset(src, 0, sizeof(DECIMAL));
778 ((DECIMAL*)src)->u1.Lo64 = 0x4321;
779 hr = IDataConvert_DataConvert(convert, DBTYPE_DECIMAL, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
780 ok(hr == S_OK, "got %08lx\n", hr);
781 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
782 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
783 ok(dst == 0x4321, "got %08x\n", dst);
785 dst_len = dst = 0x1234;
786 *(signed char*)src = 0xab;
787 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
788 ok(hr == S_OK, "got %08lx\n", hr);
789 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
790 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
791 ok(dst == (signed short)0xffab, "got %08x\n", dst);
793 dst_len = dst = 0x1234;
794 *(BYTE*)src = 0xab;
795 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
796 ok(hr == S_OK, "got %08lx\n", hr);
797 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
798 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
799 ok(dst == 0xab, "got %08x\n", dst);
801 dst_len = dst = 0x1234;
802 *(WORD*)src = 0x4321;
803 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
804 ok(hr == S_OK, "got %08lx\n", hr);
805 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
806 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
807 ok(dst == 0x4321, "got %08x\n", dst);
809 dst_len = dst = 0x1234;
810 *(WORD*)src = 0xabcd;
811 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
812 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
813 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
814 todo_wine
815 ok(broken(dst_len == sizeof(dst)) || dst_len == 0x1234 /* W2K+ */, "got %Id\n", dst_len);
816 ok(dst == 0x1234, "got %08x\n", dst);
818 dst_len = dst = 0x1234;
819 *(DWORD*)src = 0xabcd1234;
820 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
821 todo_wine
822 ok(hr == DB_E_DATAOVERFLOW, "got %08lx\n", hr);
823 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
824 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
825 ok(dst == 0x1234, "got %08x\n", dst);
827 dst_len = dst = 0x1234;
828 *(DWORD*)src = 0x1234abcd;
829 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
830 todo_wine
831 ok(hr == DB_E_DATAOVERFLOW, "got %08lx\n", hr);
832 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
833 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
834 ok(dst == 0x1234, "got %08x\n", dst);
836 dst_len = dst = 0x1234;
837 *(DWORD*)src = 0x4321;
838 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
839 ok(hr == S_OK, "got %08lx\n", hr);
840 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
841 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
842 ok(dst == 0x4321, "got %08x\n", dst);
844 dst_len = dst = 0x1234;
845 ((LARGE_INTEGER*)src)->QuadPart = 0x1234abcd;
846 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
847 ok(hr == DB_E_ERRORSOCCURRED ||
848 broken(hr == DB_E_UNSUPPORTEDCONVERSION), /* win98 */
849 "got %08lx\n", hr);
850 if(hr != DB_E_UNSUPPORTEDCONVERSION) /* win98 doesn't support I8/UI8 */
852 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
853 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
854 ok(dst == 0x1234, "got %08x\n", dst);
856 dst_len = dst = 0x1234;
857 ((LARGE_INTEGER*)src)->QuadPart = 0x4321;
858 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
859 ok(hr == S_OK, "got %08lx\n", hr);
860 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
861 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
862 ok(dst == 0x4321, "got %08x\n", dst);
864 dst_len = dst = 0x1234;
865 ((ULARGE_INTEGER*)src)->QuadPart = 0x4321;
866 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
867 ok(hr == S_OK, "got %08lx\n", hr);
868 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
869 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
870 ok(dst == 0x4321, "got %08x\n", dst);
873 dst_len = dst = 0x1234;
874 strcpy((char *)src, "10");
875 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I2, 2, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
876 ok(hr == S_OK, "got %08lx\n", hr);
877 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
878 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
879 ok(dst == 10, "got %08x\n", dst);
881 dst_len = dst = 0x1234;
882 strcpy((char *)src, "10");
883 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
884 ok(hr == S_OK, "got %08lx\n", hr);
885 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
886 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
887 ok(dst == 10, "got %08x\n", dst);
889 dst_len = dst = 0x1234;
890 memcpy(src, ten, sizeof(ten));
891 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I2, 4, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
892 ok(hr == S_OK, "got %08lx\n", hr);
893 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
894 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
895 ok(dst == 10, "got %08x\n", dst);
897 dst_len = dst = 0x1234;
898 memcpy(src, ten, sizeof(ten));
899 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
900 ok(hr == S_OK, "got %08lx\n", hr);
901 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
902 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
903 ok(dst == 10, "got %08x\n", dst);
905 /* */
906 dst_len = dst = 0x1234;
907 *(WORD*)src = 0x4321;
908 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_UI2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
909 ok(hr == S_OK, "got %08lx\n", hr);
910 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
911 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
912 ok(dst == 0x4321, "got %08x\n", dst);
914 dst_len = dst = 0x1234;
915 *(DWORD*)src = 0xabcd1234;
916 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
917 todo_wine
918 ok(hr == DB_E_DATAOVERFLOW, "got %08lx\n", hr);
919 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
920 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
921 ok(dst == 0x1234, "got %08x\n", dst);
923 dst_len = dst = 0x1234;
924 *(DWORD*)src = 0x1234abcd;
925 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
926 todo_wine
927 ok(hr == DB_E_DATAOVERFLOW, "got %08lx\n", hr);
928 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
929 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
930 ok(dst == 0x1234, "got %08x\n", dst);
932 dst_len = dst = 0x1234;
933 *(DWORD*)src = 0x4321;
934 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
935 ok(hr == S_OK, "got %08lx\n", hr);
936 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
937 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
938 ok(dst == 0x4321, "got %08x\n", dst);
940 dst_len = dst = 0x1234;
941 memcpy(src, ten, sizeof(ten));
942 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_UI2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
943 ok(hr == S_OK, "got %08lx\n", hr);
944 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
945 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
946 ok(dst == 10, "got %08x\n", dst);
949 static void test_converttoi4(void)
951 HRESULT hr;
952 INT i4;
953 BYTE src[sizeof(VARIANT)]; /* assuming that VARIANT is larger than all the types used in src */
954 DBSTATUS dst_status;
955 DBLENGTH dst_len;
956 static const WCHAR ten[] = {'1','0',0};
957 BSTR b;
959 i4 = 0x12345678;
960 dst_len = 0x1234;
961 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
962 ok(hr == S_OK, "got %08lx\n", hr);
963 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
964 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
965 ok(i4 == 0, "got %08x\n", i4);
967 i4 = 0x12345678;
968 dst_len = 0x1234;
969 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
970 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
971 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
972 ok(dst_len == 0x1234, "got %Id\n", dst_len);
973 ok(i4 == 0x12345678, "got %08x\n", i4);
975 i4 = 0x12345678;
976 *(short *)src = 0x4321;
977 dst_len = 0x1234;
978 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
979 ok(hr == S_OK, "got %08lx\n", hr);
980 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
981 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
982 ok(i4 == 0x4321, "got %08x\n", i4);
984 i4 = 0x12345678;
985 *(int *)src = 0x4321cafe;
986 dst_len = 0x1234;
987 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
988 ok(hr == S_OK, "got %08lx\n", hr);
989 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
990 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
991 ok(i4 == 0x4321cafe, "got %08x\n", i4);
993 i4 = 0x12345678;
994 *(FLOAT *)src = 10.75;
995 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
996 ok(hr == S_OK, "got %08lx\n", hr);
997 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
998 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
999 ok(i4 == 11, "got %08x\n", i4);
1001 i4 = 0x12345678;
1002 *(FLOAT *)src = -10.75;
1003 dst_len = 0x1234;
1004 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1005 ok(hr == S_OK, "got %08lx\n", hr);
1006 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1007 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1008 ok(i4 == -11, "got %08x\n", i4);
1010 i4 = 0x12345678;
1011 *(double *)src = 10.75;
1012 dst_len = 0x1234;
1013 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1014 ok(hr == S_OK, "got %08lx\n", hr);
1015 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1016 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1017 ok(i4 == 11, "got %08x\n", i4);
1019 i4 = 0x12345678;
1020 ((LARGE_INTEGER *)src)->QuadPart = 107500;
1021 dst_len = 0x1234;
1022 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1023 ok(hr == S_OK, "got %08lx\n", hr);
1024 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1025 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1026 ok(i4 == 11, "got %08x\n", i4);
1028 i4 = 0x12345678;
1029 *(DATE *)src = 10.7500;
1030 dst_len = 0x1234;
1031 hr = IDataConvert_DataConvert(convert, DBTYPE_DATE, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1032 ok(hr == S_OK, "got %08lx\n", hr);
1033 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1034 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1035 ok(i4 == 11, "got %08x\n", i4);
1037 i4 = 0x12345678;
1038 b = SysAllocString(ten);
1039 *(BSTR *)src = b;
1040 dst_len = 0x1234;
1041 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1042 ok(hr == S_OK, "got %08lx\n", hr);
1043 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1044 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1045 ok(i4 == 10, "got %08x\n", i4);
1046 SysFreeString(b);
1048 i4 = 0x12345678;
1049 *(SCODE *)src = 0x4321cafe;
1050 dst_len = 0x1234;
1051 hr = IDataConvert_DataConvert(convert, DBTYPE_ERROR, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1052 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
1053 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
1054 ok(dst_len == 0x1234, "got %Id\n", dst_len);
1055 ok(i4 == 0x12345678, "got %08x\n", i4);
1057 i4 = 0x12345678;
1058 *(VARIANT_BOOL *)src = VARIANT_TRUE;
1059 dst_len = 0x1234;
1060 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1061 ok(hr == S_OK, "got %08lx\n", hr);
1062 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1063 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1064 ok(i4 == 0xffffffff, "got %08x\n", i4);
1066 i4 = 0x12345678;
1067 *(VARIANT_BOOL *)src = VARIANT_FALSE;
1068 dst_len = 0x1234;
1069 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1070 ok(hr == S_OK, "got %08lx\n", hr);
1071 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1072 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1073 ok(i4 == 0, "got %08x\n", i4);
1075 i4 = 0x12345678;
1076 V_VT((VARIANT*)src) = VT_I2;
1077 V_I2((VARIANT*)src) = 0x1234;
1078 dst_len = 0x1234;
1079 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1080 ok(hr == S_OK, "got %08lx\n", hr);
1081 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1082 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1083 ok(i4 == 0x1234, "got %08x\n", i4);
1085 V_VT((VARIANT*)src) = VT_NULL;
1086 dst_len = 0x1234;
1087 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1088 ok(hr == S_OK, "got %08lx\n", hr);
1089 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
1090 ok(dst_len == 0x1234, "got %Id\n", dst_len);
1092 i4 = 0x12345678;
1093 memset(src, 0, sizeof(DECIMAL));
1094 ((DECIMAL*)src)->u1.Lo64 = 0x1234;
1095 dst_len = 0x1234;
1096 hr = IDataConvert_DataConvert(convert, DBTYPE_DECIMAL, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1097 ok(hr == S_OK, "got %08lx\n", hr);
1098 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1099 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1100 ok(i4 == 0x1234, "got %08x\n", i4);
1102 i4 = 0x12345678;
1103 *(signed char*)src = 0xab;
1104 dst_len = 0x1234;
1105 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1106 ok(hr == S_OK, "got %08lx\n", hr);
1107 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1108 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1109 ok(i4 == 0xffffffab, "got %08x\n", i4);
1111 i4 = 0x12345678;
1112 *(BYTE*)src = 0xab;
1113 dst_len = 0x1234;
1114 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1115 ok(hr == S_OK, "got %08lx\n", hr);
1116 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1117 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1118 ok(i4 == 0xab, "got %08x\n", i4);
1120 i4 = 0x12345678;
1121 *(WORD*)src = 0xabcd;
1122 dst_len = 0x1234;
1123 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1124 ok(hr == S_OK, "got %08lx\n", hr);
1125 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1126 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1127 ok(i4 == 0xabcd, "got %08x\n", i4);
1129 i4 = 0x12345678;
1130 *(DWORD*)src = 0xabcd1234;
1131 dst_len = 0x1234;
1132 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1133 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
1134 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
1135 todo_wine
1136 ok(broken(dst_len == sizeof(i4)) || dst_len == 0x1234 /* W2K+ */, "got %Id\n", dst_len);
1137 ok(i4 == 0x12345678, "got %08x\n", i4);
1139 i4 = 0x12345678;
1140 *(DWORD*)src = 0x1234abcd;
1141 dst_len = 0x1234;
1142 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1143 ok(hr == S_OK, "got %08lx\n", hr);
1144 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1145 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1146 ok(i4 == 0x1234abcd, "got %08x\n", i4);
1148 i4 = 0x12345678;
1149 ((LARGE_INTEGER*)src)->QuadPart = 0x1234abcd;
1150 dst_len = 0x1234;
1151 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1152 ok(hr == S_OK ||
1153 broken(hr == DB_E_UNSUPPORTEDCONVERSION), /* win98 */
1154 "got %08lx\n", hr);
1155 if(hr != DB_E_UNSUPPORTEDCONVERSION) /* win98 doesn't support I8/UI8 */
1157 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1158 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1159 ok(i4 == 0x1234abcd, "got %08x\n", i4);
1161 i4 = 0x12345678;
1162 ((ULARGE_INTEGER*)src)->QuadPart = 0x1234abcd;
1163 dst_len = 0x1234;
1164 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1165 ok(hr == S_OK, "got %08lx\n", hr);
1166 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1167 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1168 ok(i4 == 0x1234abcd, "got %08x\n", i4);
1171 i4 = 0x12345678;
1172 strcpy((char *)src, "10");
1173 dst_len = 0x1234;
1174 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I4, 2, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1175 ok(hr == S_OK, "got %08lx\n", hr);
1176 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1177 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1178 ok(i4 == 10, "got %08x\n", i4);
1180 i4 = 0x12345678;
1181 strcpy((char *)src, "10");
1182 dst_len = 0x1234;
1183 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1184 ok(hr == S_OK, "got %08lx\n", hr);
1185 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1186 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1187 ok(i4 == 10, "got %08x\n", i4);
1189 i4 = 0x12345678;
1190 memcpy(src, ten, sizeof(ten));
1191 dst_len = 0x1234;
1192 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I4, 4, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
1193 ok(hr == S_OK, "got %08lx\n", hr);
1194 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1195 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1196 ok(i4 == 10, "got %08x\n", i4);
1198 i4 = 0x12345678;
1199 memcpy(src, ten, sizeof(ten));
1200 dst_len = 0x1234;
1201 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1202 ok(hr == S_OK, "got %08lx\n", hr);
1203 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1204 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1205 ok(i4 == 10, "got %08x\n", i4);
1207 /* src_status = DBSTATUS_S_ISNULL */
1208 i4 = 0x12345678;
1209 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), DBSTATUS_S_ISNULL, &dst_status, 0, 0, 0);
1210 ok(hr == S_OK, "got %08lx\n", hr);
1211 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
1212 ok(dst_len == 0, "got %Id\n", dst_len);
1214 /* dst = NULL */
1215 *(int *)src = 0x4321cafe;
1216 dst_len = 0x1234;
1217 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_I4, 0, &dst_len, src, NULL, 0, 0, NULL, 0, 0, 0);
1218 ok(hr == S_OK, "got %08lx\n", hr);
1219 ok(dst_len == sizeof(i4), "got %Id\n", dst_len);
1223 static void test_converttoi8(void)
1225 HRESULT hr;
1226 LARGE_INTEGER dst;
1227 BYTE src[sizeof(VARIANT)]; /* assuming that VARIANT is larger than all the types used in src */
1228 DBSTATUS dst_status;
1229 DBLENGTH dst_len;
1230 static const WCHAR ten[] = {'1','0',0};
1231 BSTR b;
1233 dst.QuadPart = 0xcc;
1234 ((ULARGE_INTEGER*)src)->QuadPart = 1234;
1235 dst_len = 0x1234;
1236 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_I8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1237 ok(hr == S_OK, "got %08lx\n", hr);
1238 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1239 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
1240 ok(dst.QuadPart == 1234, "got %d\n", (int)dst.QuadPart);
1242 dst.QuadPart = 0xcc;
1243 ((ULARGE_INTEGER*)src)->QuadPart = 1234;
1244 b = SysAllocString(ten);
1245 *(BSTR *)src = b;
1246 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_I8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1247 ok(hr == S_OK, "got %08lx\n", hr);
1248 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1249 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
1250 ok(dst.QuadPart == 10, "got %d\n", (int)dst.QuadPart);
1251 SysFreeString(b);
1253 V_VT((VARIANT*)src) = VT_NULL;
1254 dst_len = 0x1234;
1255 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1256 ok(hr == S_OK, "got %08lx\n", hr);
1257 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
1258 ok(dst_len == 0x1234, "got %Id\n", dst_len);
1261 static void test_converttobstr(void)
1263 HRESULT hr;
1264 BSTR dst;
1265 BYTE src[20];
1266 DBSTATUS dst_status;
1267 DBLENGTH dst_len;
1268 static const WCHAR ten[] = {'1','0',0};
1269 static const WCHAR tsW[] = {'2','0','1','3','-','0','5','-','1','4',' ','0','2',':','0','4',':','1','2',0};
1270 static const WCHAR ts1W[] = {'2','0','1','3','-','0','5','-','1','4',' ','0','2',':','0','4',':','1','2','.','0','0','0','0','0','0','0','0','3',0};
1271 static const WCHAR ts2W[] = {'2','0','1','3','-','0','5','-','1','4',' ','0','2',':','0','4',':','1','2','.','0','0','0','0','0','0','2','0','0',0};
1272 DBTIMESTAMP ts = {2013, 5, 14, 2, 4, 12, 0};
1273 VARIANT v;
1274 BSTR b;
1276 dst_len = 0x1234;
1277 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1278 ok(hr == S_OK, "got %08lx\n", hr);
1279 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1280 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
1281 ok(dst != NULL, "got %p\n", dst);
1282 ok(SysStringLen(dst) == 0, "got %d\n", SysStringLen(dst));
1283 SysFreeString(dst);
1285 dst = (void*)0x1234;
1286 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1287 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
1288 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
1289 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
1290 ok(dst == (void*)0x1234, "got %p\n", dst);
1292 *(short *)src = 4321;
1293 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1294 ok(hr == S_OK, "got %08lx\n", hr);
1295 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1296 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
1297 ok(dst != NULL, "got %p\n", dst);
1298 ok(SysStringLen(dst) == 4, "got %d\n", SysStringLen(dst));
1299 SysFreeString(dst);
1301 b = SysAllocString(ten);
1302 *(BSTR *)src = b;
1303 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1304 ok(hr == S_OK, "got %08lx\n", hr);
1305 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1306 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
1307 ok(dst != NULL, "got %p\n", dst);
1308 ok(dst != b, "got %p src %p\n", dst, b);
1309 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
1310 SysFreeString(dst);
1311 SysFreeString(b);
1313 b = SysAllocString(ten);
1314 V_VT(&v) = VT_BSTR;
1315 V_BSTR(&v) = b;
1316 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BSTR, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1317 ok(hr == S_OK, "got %08lx\n", hr);
1318 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1319 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
1320 ok(dst != NULL, "got %p\n", dst);
1321 ok(dst != b, "got %p src %p\n", dst, b);
1322 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
1323 SysFreeString(dst);
1324 SysFreeString(b);
1326 V_VT(&v) = VT_NULL;
1327 dst = (void*)0x1234;
1328 dst_len = 33;
1329 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BSTR, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1330 ok(hr == S_OK, "got %08lx\n", hr);
1331 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
1332 ok(dst_len == 33, "got %Id\n", dst_len);
1333 ok(dst == (void*)0x1234, "got %p\n", dst);
1335 dst_len = 0x1234;
1336 hr = IDataConvert_DataConvert(convert, DBTYPE_DBTIMESTAMP, DBTYPE_BSTR, 0, &dst_len, &ts, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1337 ok(hr == S_OK, "got %08lx\n", hr);
1338 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1339 ok(dst_len == sizeof(BSTR), "got %Id\n", dst_len);
1340 ok(!lstrcmpW(tsW, dst), "got %s\n", wine_dbgstr_w(dst));
1341 SysFreeString(dst);
1343 dst_len = 0x1234;
1344 ts.fraction = 3;
1345 hr = IDataConvert_DataConvert(convert, DBTYPE_DBTIMESTAMP, DBTYPE_BSTR, 0, &dst_len, &ts, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1346 ok(hr == S_OK, "got %08lx\n", hr);
1347 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1348 ok(dst_len == sizeof(BSTR), "got %Id\n", dst_len);
1349 ok(!lstrcmpW(ts1W, dst), "got %s\n", wine_dbgstr_w(dst));
1350 SysFreeString(dst);
1352 dst_len = 0x1234;
1353 ts.fraction = 200;
1354 hr = IDataConvert_DataConvert(convert, DBTYPE_DBTIMESTAMP, DBTYPE_BSTR, 0, &dst_len, &ts, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1355 ok(hr == S_OK, "got %08lx\n", hr);
1356 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1357 ok(dst_len == sizeof(BSTR), "got %Id\n", dst_len);
1358 ok(!lstrcmpW(ts2W, dst), "got %s\n", wine_dbgstr_w(dst));
1359 SysFreeString(dst);
1362 static void test_converttowstr(void)
1364 HRESULT hr;
1365 WCHAR dst[100];
1366 BYTE src[20];
1367 DBSTATUS dst_status;
1368 DBLENGTH dst_len;
1369 static const WCHAR ten[] = {'1','0',0};
1370 static const WCHAR fourthreetwoone[] = {'4','3','2','1',0};
1371 static const WCHAR guid_str[] = {
1372 '{','0','C','7','3','3','A','8','D','-','2','A','1','C','-','1','1','C','E','-',
1373 'A','D','E','5','-','0','0','A','A','0','0','4','4','7','7','3','D','}',0};
1374 static const WCHAR hexunpacked_w[] = {'5','7','0','0','6','9','0','0','6','E','0','0','6','5','0','0','0','0','0','0', 0 };
1375 static const WCHAR hexpacked_w[] = {'W','i','n','e', 0 };
1376 static const WCHAR tsW[] = {'2','0','1','3','-','0','5','-','1','4',' ','0','2',':','0','4',':','1','2',0};
1377 static const WCHAR ts1W[] = {'2','0','1','3','-','0','5','-','1','4',' ','0','2',':','0','4',':','1','2','.','0','0','0','0','0','0','0','0','3',0};
1378 static const WCHAR ts2W[] = {'2','0','1','3','-','0','5','-','1','4',' ','0','2',':','0','4',':','1','2','.','0','0','0','0','0','0','2','0','0',0};
1379 DBTIMESTAMP ts = {2013, 5, 14, 2, 4, 12, 0};
1380 BSTR b;
1381 VARIANT v;
1383 VariantInit(&v);
1385 memset(dst, 0xcc, sizeof(dst));
1386 dst_len = 0x1234;
1387 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1388 ok(hr == S_OK, "got %08lx\n", hr);
1389 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1390 ok(dst_len == 0, "got %Id\n", dst_len);
1391 ok(dst[0] == 0, "got %02x\n", dst[0]);
1392 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1394 memset(dst, 0xcc, sizeof(dst));
1395 dst_len = 0x1234;
1396 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1397 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
1398 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
1399 ok(dst_len == 0x1234, "got %Id\n", dst_len);
1400 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1402 *(short *)src = 4321;
1403 dst_len = 0x1234;
1404 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1405 ok(hr == S_OK, "got %08lx\n", hr);
1406 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1407 ok(dst_len == 8, "got %Id\n", dst_len);
1408 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1410 *(short *)src = 4321;
1411 memset(dst, 0xcc, sizeof(dst));
1412 dst_len = 0x1234;
1413 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1414 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
1415 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
1416 ok(dst_len == 8, "got %Id\n", dst_len);
1417 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1419 *(short *)src = 4321;
1420 memset(dst, 0xcc, sizeof(dst));
1421 dst_len = 0x1234;
1422 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1423 ok(hr == S_OK, "got %08lx\n", hr);
1424 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1425 ok(dst_len == 8, "got %Id\n", dst_len);
1426 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1428 *(short *)src = 4321;
1429 memset(dst, 0xcc, sizeof(dst));
1430 dst_len = 0x1234;
1431 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1432 ok(hr == S_OK, "got %08lx\n", hr);
1433 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1434 ok(dst_len == 8, "got %Id\n", dst_len);
1435 ok(dst[0] == '4', "got %02x\n", dst[0]);
1436 ok(dst[1] == 0, "got %02x\n", dst[1]);
1437 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1439 *(short *)src = 4321;
1440 memset(dst, 0xcc, sizeof(dst));
1441 dst_len = 0x1234;
1442 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1443 ok(hr == S_OK, "got %08lx\n", hr);
1444 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1445 ok(dst_len == 8, "got %Id\n", dst_len);
1446 ok(dst[0] == 0, "got %02x\n", dst[0]);
1447 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1449 *(short *)src = 4321;
1450 memset(dst, 0xcc, sizeof(dst));
1451 dst_len = 0x1234;
1452 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1453 ok(hr == S_OK, "got %08lx\n", hr);
1454 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1455 ok(dst_len == 8, "got %Id\n", dst_len);
1456 ok(dst[0] == '4', "got %02x\n", dst[0]);
1457 ok(dst[1] == '3', "got %02x\n", dst[1]);
1458 ok(dst[2] == '2', "got %02x\n", dst[2]);
1459 ok(dst[3] == 0, "got %02x\n", dst[3]);
1460 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1464 *(int *)src = 4321;
1465 dst_len = 0x1234;
1466 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1467 ok(hr == S_OK, "got %08lx\n", hr);
1468 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1469 ok(dst_len == 8, "got %Id\n", dst_len);
1470 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1472 *(int *)src = 4321;
1473 memset(dst, 0xcc, sizeof(dst));
1474 dst_len = 0x1234;
1475 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1476 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
1477 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
1478 ok(dst_len == 8, "got %Id\n", dst_len);
1479 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1481 *(int *)src = 4321;
1482 memset(dst, 0xcc, sizeof(dst));
1483 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1484 ok(hr == S_OK, "got %08lx\n", hr);
1485 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1486 ok(dst_len == 8, "got %Id\n", dst_len);
1487 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1489 *(int *)src = 4321;
1490 memset(dst, 0xcc, sizeof(dst));
1491 dst_len = 0x1234;
1492 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1493 ok(hr == S_OK, "got %08lx\n", hr);
1494 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1495 ok(dst_len == 8, "got %Id\n", dst_len);
1496 ok(dst[0] == '4', "got %02x\n", dst[0]);
1497 ok(dst[1] == 0, "got %02x\n", dst[1]);
1498 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1500 *(int *)src = 4321;
1501 memset(dst, 0xcc, sizeof(dst));
1502 dst_len = 0x1234;
1503 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1504 ok(hr == S_OK, "got %08lx\n", hr);
1505 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1506 ok(dst_len == 8, "got %Id\n", dst_len);
1507 ok(dst[0] == 0, "got %02x\n", dst[0]);
1508 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1510 *(int *)src = 4321;
1511 memset(dst, 0xcc, sizeof(dst));
1512 dst_len = 0x1234;
1513 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1514 ok(hr == S_OK, "got %08lx\n", hr);
1515 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1516 ok(dst_len == 8, "got %Id\n", dst_len);
1517 ok(dst[0] == '4', "got %02x\n", dst[0]);
1518 ok(dst[1] == '3', "got %02x\n", dst[1]);
1519 ok(dst[2] == '2', "got %02x\n", dst[2]);
1520 ok(dst[3] == 0, "got %02x\n", dst[3]);
1521 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1525 *(float *)src = 4321;
1526 dst_len = 0x1234;
1527 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1528 ok(hr == S_OK, "got %08lx\n", hr);
1529 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1530 ok(dst_len == 8, "got %Id\n", dst_len);
1531 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1533 *(float *)src = 4321;
1534 memset(dst, 0xcc, sizeof(dst));
1535 dst_len = 0x1234;
1536 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1537 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
1538 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
1539 ok(dst_len == 8, "got %Id\n", dst_len);
1540 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1542 *(float *)src = 4321;
1543 memset(dst, 0xcc, sizeof(dst));
1544 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1545 ok(hr == S_OK, "got %08lx\n", hr);
1546 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1547 ok(dst_len == 8, "got %Id\n", dst_len);
1548 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1550 *(float *)src = 4321;
1551 memset(dst, 0xcc, sizeof(dst));
1552 dst_len = 0x1234;
1553 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1554 ok(hr == S_OK, "got %08lx\n", hr);
1555 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1556 ok(dst_len == 8, "got %Id\n", dst_len);
1557 ok(dst[0] == '4', "got %02x\n", dst[0]);
1558 ok(dst[1] == 0, "got %02x\n", dst[1]);
1559 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1561 *(float *)src = 4321;
1562 memset(dst, 0xcc, sizeof(dst));
1563 dst_len = 0x1234;
1564 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1565 ok(hr == S_OK, "got %08lx\n", hr);
1566 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1567 ok(dst_len == 8, "got %Id\n", dst_len);
1568 ok(dst[0] == 0, "got %02x\n", dst[0]);
1569 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1571 *(float *)src = 4321;
1572 memset(dst, 0xcc, sizeof(dst));
1573 dst_len = 0x1234;
1574 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1575 ok(hr == S_OK, "got %08lx\n", hr);
1576 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1577 ok(dst_len == 8, "got %Id\n", dst_len);
1578 ok(dst[0] == '4', "got %02x\n", dst[0]);
1579 ok(dst[1] == '3', "got %02x\n", dst[1]);
1580 ok(dst[2] == '2', "got %02x\n", dst[2]);
1581 ok(dst[3] == 0, "got %02x\n", dst[3]);
1582 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1586 *(double *)src = 4321;
1587 dst_len = 0x1234;
1588 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1589 ok(hr == S_OK, "got %08lx\n", hr);
1590 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1591 ok(dst_len == 8, "got %Id\n", dst_len);
1592 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1594 *(double *)src = 4321;
1595 memset(dst, 0xcc, sizeof(dst));
1596 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1597 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
1598 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
1599 ok(dst_len == 8, "got %Id\n", dst_len);
1600 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1602 *(double *)src = 4321;
1603 memset(dst, 0xcc, sizeof(dst));
1604 dst_len = 0x1234;
1605 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1606 ok(hr == S_OK, "got %08lx\n", hr);
1607 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1608 ok(dst_len == 8, "got %Id\n", dst_len);
1609 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1611 *(double *)src = 4321;
1612 memset(dst, 0xcc, sizeof(dst));
1613 dst_len = 0x1234;
1614 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1615 ok(hr == S_OK, "got %08lx\n", hr);
1616 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1617 ok(dst_len == 8, "got %Id\n", dst_len);
1618 ok(dst[0] == '4', "got %02x\n", dst[0]);
1619 ok(dst[1] == 0, "got %02x\n", dst[1]);
1620 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1622 *(double *)src = 4321;
1623 memset(dst, 0xcc, sizeof(dst));
1624 dst_len = 0x1234;
1625 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1626 ok(hr == S_OK, "got %08lx\n", hr);
1627 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1628 ok(dst_len == 8, "got %Id\n", dst_len);
1629 ok(dst[0] == 0, "got %02x\n", dst[0]);
1630 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1632 *(double *)src = 4321;
1633 memset(dst, 0xcc, sizeof(dst));
1634 dst_len = 0x1234;
1635 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1636 ok(hr == S_OK, "got %08lx\n", hr);
1637 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1638 ok(dst_len == 8, "got %Id\n", dst_len);
1639 ok(dst[0] == '4', "got %02x\n", dst[0]);
1640 ok(dst[1] == '3', "got %02x\n", dst[1]);
1641 ok(dst[2] == '2', "got %02x\n", dst[2]);
1642 ok(dst[3] == 0, "got %02x\n", dst[3]);
1643 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1647 memset(src, 0, sizeof(src));
1648 ((CY*)src)->int64 = 43210000;
1649 memset(dst, 0xcc, sizeof(dst));
1650 dst_len = 0x1234;
1651 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1652 ok(hr == S_OK, "got %08lx\n", hr);
1653 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1654 ok(dst_len == 8, "got %Id\n", dst_len);
1655 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1659 memset(src, 0, sizeof(src));
1660 *(signed char *)src = 10;
1661 dst_len = 0x1234;
1662 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1663 ok(hr == S_OK, "got %08lx\n", hr);
1664 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1665 ok(dst_len == 4, "got %Id\n", dst_len);
1666 ok(!lstrcmpW(dst, ten), "got %s\n", wine_dbgstr_w(dst));
1668 memset(src, 0, sizeof(src));
1669 *(unsigned char *)src = 10;
1670 dst_len = 0x1234;
1671 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1672 ok(hr == S_OK, "got %08lx\n", hr);
1673 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1674 ok(dst_len == 4, "got %Id\n", dst_len);
1675 ok(!lstrcmpW(dst, ten), "got %s\n", wine_dbgstr_w(dst));
1677 memset(src, 0, sizeof(src));
1678 *(unsigned short *)src = 4321;
1679 dst_len = 0x1234;
1680 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1681 ok(hr == S_OK, "got %08lx\n", hr);
1682 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1683 ok(dst_len == 8, "got %Id\n", dst_len);
1684 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1686 memset(src, 0, sizeof(src));
1687 *(unsigned int *)src = 4321;
1688 dst_len = 0x1234;
1689 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1690 ok(hr == S_OK, "got %08lx\n", hr);
1691 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1692 ok(dst_len == 8, "got %Id\n", dst_len);
1693 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1695 memset(src, 0, sizeof(src));
1696 ((LARGE_INTEGER*)src)->QuadPart = 4321;
1697 dst_len = 0x1234;
1698 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1699 ok(broken(hr == DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08lx\n", hr);
1700 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08lx\n", dst_status);
1701 ok(broken(dst_len == 0x1234) || dst_len == 8 /* W2K+ */, "got %Id\n", dst_len);
1702 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1704 memset(src, 0, sizeof(src));
1705 ((ULARGE_INTEGER*)src)->QuadPart = 4321;
1706 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1707 ok(broken(hr == DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08lx\n", hr);
1708 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08lx\n", dst_status);
1709 ok(broken(dst_len == 0x1234) || dst_len == 8 /* W2K+ */, "got %Id\n", dst_len);
1710 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1714 memset(src, 0, sizeof(src));
1715 memcpy(src, &IID_IDataConvert, sizeof(GUID));
1716 memset(dst, 0xcc, sizeof(dst));
1717 dst_len = 0x1234;
1718 hr = IDataConvert_DataConvert(convert, DBTYPE_GUID, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1719 ok(hr == S_OK, "got %08lx\n", hr);
1720 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1721 ok(dst_len == 76, "got %Id\n", dst_len);
1722 ok(!lstrcmpW(dst, guid_str), "got %s\n", wine_dbgstr_w(dst));
1726 b = SysAllocString(ten);
1727 *(BSTR *)src = b;
1728 dst_len = 0x1234;
1729 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1730 ok(hr == S_OK, "got %08lx\n", hr);
1731 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1732 ok(dst_len == 4, "got %Id\n", dst_len);
1733 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
1734 SysFreeString(b);
1736 memcpy(src, ten, sizeof(ten));
1737 dst_len = 0x1234;
1738 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_WSTR, 2, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1739 ok(hr == S_OK, "got %08lx\n", hr);
1740 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1741 ok(dst_len == 2, "got %Id\n", dst_len);
1742 ok(dst[0] == '1', "got %02x\n", dst[0]);
1743 ok(dst[1] == 0, "got %02x\n", dst[1]);
1745 memcpy(src, ten, sizeof(ten));
1746 dst_len = 0x1234;
1747 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_WSTR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1748 ok(hr == S_OK, "got %08lx\n", hr);
1749 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1750 ok(dst_len == 4, "got %Id\n", dst_len);
1751 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
1753 memcpy(src, ten, sizeof(ten));
1754 dst_len = 0x1234;
1755 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1756 ok(hr == S_OK, "got %08lx\n", hr);
1757 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1758 ok(dst_len == 4, "got %Id\n", dst_len);
1759 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
1761 dst_len = 0x1234;
1762 hr = IDataConvert_DataConvert(convert, DBTYPE_DBTIMESTAMP, DBTYPE_WSTR, 0, &dst_len, &ts, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1763 ok(hr == S_OK, "got %08lx\n", hr);
1764 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1765 ok(dst_len == 38, "got %Id\n", dst_len);
1766 ok(!lstrcmpW(tsW, dst), "got %s\n", wine_dbgstr_w(dst));
1768 dst_len = 0x1234;
1769 ts.fraction = 3;
1770 hr = IDataConvert_DataConvert(convert, DBTYPE_DBTIMESTAMP, DBTYPE_WSTR, 0, &dst_len, &ts, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1771 ok(hr == S_OK, "got %08lx\n", hr);
1772 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1773 ok(dst_len == 58, "got %Id\n", dst_len);
1774 ok(!lstrcmpW(ts1W, dst), "got %s\n", wine_dbgstr_w(dst));
1776 dst_len = 0x1234;
1777 ts.fraction = 200;
1778 hr = IDataConvert_DataConvert(convert, DBTYPE_DBTIMESTAMP, DBTYPE_WSTR, 0, &dst_len, &ts, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1779 ok(hr == S_OK, "got %08lx\n", hr);
1780 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1781 ok(dst_len == 58, "got %Id\n", dst_len);
1782 ok(!lstrcmpW(ts2W, dst), "got %s\n", wine_dbgstr_w(dst));
1784 /* DBTYPE_BYTES to DBTYPE_*STR unpacks binary data into a hex string */
1785 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1786 memset(dst, 0xcc, sizeof(dst));
1787 dst_len = 0x1234;
1788 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, sizeof(hexpacked_w), &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1789 ok(hr == S_OK, "got %08lx\n", hr);
1790 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1791 ok(dst_len == sizeof(hexpacked_w) * 4, "got %Id\n", dst_len);
1792 ok(!lstrcmpW(hexunpacked_w, dst), "got %s\n", wine_dbgstr_w(dst));
1793 ok(dst[ARRAY_SIZE(hexpacked_w) * 4 + 1] == 0xcccc, "clobbered buffer\n");
1795 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1796 memset(dst, 0xcc, sizeof(dst));
1797 dst_len = 0x1234;
1798 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1799 ok(hr == S_OK, "got %08lx\n", hr);
1800 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1801 ok(dst_len == 0, "got %Id\n", dst_len);
1802 ok(dst[0] == 0, "not null terminated\n");
1803 ok(dst[1] == 0xcccc, "clobbered buffer\n");
1805 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1806 memset(dst, 0xcc, sizeof(dst));
1807 dst_len = 0x1234;
1808 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1809 ok(hr == S_OK, "got %08lx\n", hr);
1810 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1811 ok(dst_len == 2 * sizeof(WCHAR) * 4, "got %Id\n", dst_len);
1812 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 ), "got %s\n", wine_dbgstr_w(dst));
1813 ok(dst[2 * 4] == 0, "not null terminated\n");
1814 ok(dst[2 * 4 + 1] == 0xcccc, "clobbered buffer\n");
1816 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1817 memset(dst, 0xcc, sizeof(dst));
1818 dst_len = 0x1234;
1819 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, sizeof(hexpacked_w), &dst_len, src, dst, 2 * sizeof(WCHAR) * 4 + sizeof(WCHAR), 0, &dst_status, 0, 0, 0);
1820 ok(hr == S_OK, "got %08lx\n", hr);
1821 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1822 ok(dst_len == sizeof(hexpacked_w) * 4, "got %Id\n", dst_len);
1823 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 ), "got %s\n", wine_dbgstr_w(dst));
1824 ok(dst[2 * 4] == 0, "not null terminated\n");
1825 ok(dst[2 * 4 + 1] == 0xcccc, "clobbered buffer\n");
1827 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1828 memset(dst, 0xcc, sizeof(dst));
1829 dst_len = 0x1234;
1830 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, sizeof(hexpacked_w), &dst_len, src, dst, 2 * sizeof(WCHAR) * 4 +1, 0, &dst_status, 0, 0, 0);
1831 ok(hr == S_OK, "got %08lx\n", hr);
1832 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1833 ok(dst_len == sizeof(hexpacked_w) * 4, "got %Id\n", dst_len);
1834 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 - 2 ), "got %s\n", wine_dbgstr_w(dst));
1835 ok(dst[2 * 4 - 1] == 0, "not null terminated\n");
1836 ok(dst[2 * 4] == 0xcccc, "clobbered buffer\n");
1838 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1839 memset(dst, 0xcc, sizeof(dst));
1840 dst_len = 0x1234;
1841 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, sizeof(hexpacked_w), &dst_len, src, dst, 2 * sizeof(WCHAR) * 4, 0, &dst_status, 0, 0, 0);
1842 ok(hr == S_OK, "got %08lx\n", hr);
1843 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1844 ok(dst_len == sizeof(hexpacked_w) * 4, "got %Id\n", dst_len);
1845 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 - 2 ), "got %s\n", wine_dbgstr_w(dst));
1846 ok(dst[2 * 4 - 1] == 0, "not null terminated\n");
1847 ok(dst[2 * 4] == 0xcccc, "clobbered buffer\n");
1849 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1850 memset(dst, 0xcc, sizeof(dst));
1851 dst_len = 0x1234;
1852 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1853 ok(hr == S_OK, "got %08lx\n", hr);
1854 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1855 ok(dst_len == 0, "got %Id\n", dst_len);
1856 ok(dst[0] == 0, "not null terminated\n");
1857 ok(dst[1] == 0xcccc, "clobbered buffer\n");
1859 b = SysAllocStringLen(NULL, 0);
1860 V_VT(&v) = VT_BSTR;
1861 V_BSTR(&v) = b;
1862 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_WSTR, 0, &dst_len, &v, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1863 ok(hr == S_OK, "got %08lx\n", hr);
1864 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1865 ok(dst_len == 0, "got %Id\n", dst_len);
1866 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
1867 VariantClear(&v);
1869 dst_len = 44;
1870 V_VT(&v) = VT_NULL;
1871 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_WSTR, 0, &dst_len, &v, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1872 ok(hr == S_OK, "got %08lx\n", hr);
1873 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
1874 ok(dst_len == 44, "got %Id\n", dst_len);
1877 static void test_converttostr(void)
1879 HRESULT hr;
1880 char dst[100];
1881 BYTE src[64];
1882 DBSTATUS dst_status;
1883 DBLENGTH dst_len;
1884 static const WCHAR ten[] = {'1','0',0};
1885 static const WCHAR idW[] = {'0','C','7','3','3','A','8','D','-','2','A','1','C',0 };
1886 static const char idA[] = "0C733A8D";
1887 static const char withnull[] = "test\0ed";
1888 static const char ten_a[] = "10";
1889 static const char fourthreetwoone[] = "4321";
1890 static const char guid_str[] = "{0C733A8D-2A1C-11CE-ADE5-00AA0044773D}";
1891 static const char hexunpacked_a[] = "57696E6500";
1892 static const char hexpacked_a[] = "Wine";
1893 BSTR b;
1894 VARIANT v;
1896 memset(dst, 0xcc, sizeof(dst));
1897 dst_len = 0x1234;
1898 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1899 ok(hr == S_OK, "got %08lx\n", hr);
1900 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1901 ok(dst_len == 0, "got %Id\n", dst_len);
1902 ok(dst[0] == 0, "got %02x\n", dst[0]);
1903 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1905 memset(dst, 0xcc, sizeof(dst));
1906 dst_len = 0x1234;
1907 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1908 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
1909 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
1910 ok(dst_len == 0x1234, "got %Id\n", dst_len);
1911 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1913 *(short *)src = 4321;
1914 dst_len = 0x1234;
1915 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1916 ok(hr == S_OK, "got %08lx\n", hr);
1917 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1918 ok(dst_len == 4, "got %Id\n", dst_len);
1919 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1921 *(short *)src = 4321;
1922 memset(dst, 0xcc, sizeof(dst));
1923 dst_len = 0x1234;
1924 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1925 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
1926 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
1927 ok(dst_len == 4, "got %Id\n", dst_len);
1928 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1930 *(short *)src = 4321;
1931 memset(dst, 0xcc, sizeof(dst));
1932 dst_len = 0x1234;
1933 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1934 ok(hr == S_OK, "got %08lx\n", hr);
1935 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1936 ok(dst_len == 4, "got %Id\n", dst_len);
1937 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1939 *(short *)src = 4321;
1940 memset(dst, 0xcc, sizeof(dst));
1941 dst_len = 0x1234;
1942 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1943 ok(hr == S_OK, "got %08lx\n", hr);
1944 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1945 ok(dst_len == 4, "got %Id\n", dst_len);
1946 ok(dst[0] == '4', "got %02x\n", dst[0]);
1947 ok(dst[1] == 0, "got %02x\n", dst[1]);
1948 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
1950 *(short *)src = 4321;
1951 memset(dst, 0xcc, sizeof(dst));
1952 dst_len = 0x1234;
1953 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
1954 ok(hr == S_OK, "got %08lx\n", hr);
1955 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1956 ok(dst_len == 4, "got %Id\n", dst_len);
1957 ok(dst[0] == 0, "got %02x\n", dst[0]);
1958 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1960 *(short *)src = 4321;
1961 memset(dst, 0xcc, sizeof(dst));
1962 dst_len = 0x1234;
1963 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1964 ok(hr == S_OK, "got %08lx\n", hr);
1965 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
1966 ok(dst_len == 4, "got %Id\n", dst_len);
1967 ok(dst[0] == '4', "got %02x\n", dst[0]);
1968 ok(dst[1] == '3', "got %02x\n", dst[1]);
1969 ok(dst[2] == '2', "got %02x\n", dst[2]);
1970 ok(dst[3] == 0, "got %02x\n", dst[3]);
1971 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
1974 *(int *)src = 4321;
1975 dst_len = 0x1234;
1976 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1977 ok(hr == S_OK, "got %08lx\n", hr);
1978 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1979 ok(dst_len == 4, "got %Id\n", dst_len);
1980 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1982 *(int *)src = 4321;
1983 memset(dst, 0xcc, sizeof(dst));
1984 dst_len = 0x1234;
1985 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1986 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
1987 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
1988 ok(dst_len == 4, "got %Id\n", dst_len);
1989 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1991 *(int *)src = 4321;
1992 memset(dst, 0xcc, sizeof(dst));
1993 dst_len = 0x1234;
1994 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1995 ok(hr == S_OK, "got %08lx\n", hr);
1996 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
1997 ok(dst_len == 4, "got %Id\n", dst_len);
1998 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
2000 *(int *)src = 4321;
2001 memset(dst, 0xcc, sizeof(dst));
2002 dst_len = 0x1234;
2003 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
2004 ok(hr == S_OK, "got %08lx\n", hr);
2005 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2006 ok(dst_len == 4, "got %Id\n", dst_len);
2007 ok(dst[0] == '4', "got %02x\n", dst[0]);
2008 ok(dst[1] == 0, "got %02x\n", dst[1]);
2009 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
2011 *(int *)src = 4321;
2012 memset(dst, 0xcc, sizeof(dst));
2013 dst_len = 0x1234;
2014 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
2015 ok(hr == S_OK, "got %08lx\n", hr);
2016 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2017 ok(dst_len == 4, "got %Id\n", dst_len);
2018 ok(dst[0] == 0, "got %02x\n", dst[0]);
2019 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
2021 *(int *)src = 4321;
2022 memset(dst, 0xcc, sizeof(dst));
2023 dst_len = 0x1234;
2024 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
2025 ok(hr == S_OK, "got %08lx\n", hr);
2026 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2027 ok(dst_len == 4, "got %Id\n", dst_len);
2028 ok(dst[0] == '4', "got %02x\n", dst[0]);
2029 ok(dst[1] == '3', "got %02x\n", dst[1]);
2030 ok(dst[2] == '2', "got %02x\n", dst[2]);
2031 ok(dst[3] == 0, "got %02x\n", dst[3]);
2032 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
2035 *(float *)src = 4321;
2036 dst_len = 0x1234;
2037 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2038 ok(hr == S_OK, "got %08lx\n", hr);
2039 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2040 ok(dst_len == 4, "got %Id\n", dst_len);
2041 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
2043 *(float *)src = 4321;
2044 memset(dst, 0xcc, sizeof(dst));
2045 dst_len = 0x1234;
2046 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
2047 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
2048 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
2049 ok(dst_len == 4, "got %Id\n", dst_len);
2050 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
2052 *(float *)src = 4321;
2053 memset(dst, 0xcc, sizeof(dst));
2054 dst_len = 0x1234;
2055 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
2056 ok(hr == S_OK, "got %08lx\n", hr);
2057 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2058 ok(dst_len == 4, "got %Id\n", dst_len);
2059 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
2061 *(float *)src = 4321;
2062 memset(dst, 0xcc, sizeof(dst));
2063 dst_len = 0x1234;
2064 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
2065 ok(hr == S_OK, "got %08lx\n", hr);
2066 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2067 ok(dst_len == 4, "got %Id\n", dst_len);
2068 ok(dst[0] == '4', "got %02x\n", dst[0]);
2069 ok(dst[1] == 0, "got %02x\n", dst[1]);
2070 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
2072 *(float *)src = 4321;
2073 memset(dst, 0xcc, sizeof(dst));
2074 dst_len = 0x1234;
2075 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
2076 ok(hr == S_OK, "got %08lx\n", hr);
2077 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2078 ok(dst_len == 4, "got %Id\n", dst_len);
2079 ok(dst[0] == 0, "got %02x\n", dst[0]);
2080 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
2082 *(float *)src = 4321;
2083 memset(dst, 0xcc, sizeof(dst));
2084 dst_len = 0x1234;
2085 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
2086 ok(hr == S_OK, "got %08lx\n", hr);
2087 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2088 ok(dst_len == 4, "got %Id\n", dst_len);
2089 ok(dst[0] == '4', "got %02x\n", dst[0]);
2090 ok(dst[1] == '3', "got %02x\n", dst[1]);
2091 ok(dst[2] == '2', "got %02x\n", dst[2]);
2092 ok(dst[3] == 0, "got %02x\n", dst[3]);
2093 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
2096 *(double *)src = 4321;
2097 dst_len = 0x1234;
2098 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2099 ok(hr == S_OK, "got %08lx\n", hr);
2100 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2101 ok(dst_len == 4, "got %Id\n", dst_len);
2102 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
2104 *(double *)src = 4321;
2105 memset(dst, 0xcc, sizeof(dst));
2106 dst_len = 0x1234;
2107 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
2108 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
2109 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08lx\n", dst_status);
2110 ok(dst_len == 4, "got %Id\n", dst_len);
2111 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
2113 *(double *)src = 4321;
2114 memset(dst, 0xcc, sizeof(dst));
2115 dst_len = 0x1234;
2116 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
2117 ok(hr == S_OK, "got %08lx\n", hr);
2118 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2119 ok(dst_len == 4, "got %Id\n", dst_len);
2120 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
2122 *(double *)src = 4321;
2123 memset(dst, 0xcc, sizeof(dst));
2124 dst_len = 0x1234;
2125 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
2126 ok(hr == S_OK, "got %08lx\n", hr);
2127 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2128 ok(dst_len == 4, "got %Id\n", dst_len);
2129 ok(dst[0] == '4', "got %02x\n", dst[0]);
2130 ok(dst[1] == 0, "got %02x\n", dst[1]);
2131 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
2133 *(double *)src = 4321;
2134 memset(dst, 0xcc, sizeof(dst));
2135 dst_len = 0x1234;
2136 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
2137 ok(hr == S_OK, "got %08lx\n", hr);
2138 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2139 ok(dst_len == 4, "got %Id\n", dst_len);
2140 ok(dst[0] == 0, "got %02x\n", dst[0]);
2141 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
2143 *(double *)src = 4321;
2144 memset(dst, 0xcc, sizeof(dst));
2145 dst_len = 0x1234;
2146 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
2147 ok(hr == S_OK, "got %08lx\n", hr);
2148 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2149 ok(dst_len == 4, "got %Id\n", dst_len);
2150 ok(dst[0] == '4', "got %02x\n", dst[0]);
2151 ok(dst[1] == '3', "got %02x\n", dst[1]);
2152 ok(dst[2] == '2', "got %02x\n", dst[2]);
2153 ok(dst[3] == 0, "got %02x\n", dst[3]);
2154 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
2158 memset(src, 0, sizeof(src));
2159 ((CY*)src)->int64 = 43210000;
2160 memset(dst, 0xcc, sizeof(dst));
2161 dst_len = 0x1234;
2162 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2163 ok(hr == S_OK, "got %08lx\n", hr);
2164 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2165 ok(dst_len == 4, "got %Id\n", dst_len);
2166 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
2170 memset(src, 0, sizeof(src));
2171 *(signed char *)src = 10;
2172 dst_len = 0x1234;
2173 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2174 ok(hr == S_OK, "got %08lx\n", hr);
2175 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2176 ok(dst_len == 2, "got %Id\n", dst_len);
2177 ok(!lstrcmpA(dst, ten_a), "got %s\n", dst);
2179 memset(src, 0, sizeof(src));
2180 *(unsigned char *)src = 10;
2181 dst_len = 0x1234;
2182 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2183 ok(hr == S_OK, "got %08lx\n", hr);
2184 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2185 ok(dst_len == 2, "got %Id\n", dst_len);
2186 ok(!lstrcmpA(dst, ten_a), "got %s\n", dst);
2188 memset(src, 0, sizeof(src));
2189 *(unsigned short *)src = 4321;
2190 dst_len = 0x1234;
2191 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2192 ok(hr == S_OK, "got %08lx\n", hr);
2193 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2194 ok(dst_len == 4, "got %Id\n", dst_len);
2195 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
2197 memset(src, 0, sizeof(src));
2198 *(unsigned int *)src = 4321;
2199 dst_len = 0x1234;
2200 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2201 ok(hr == S_OK, "got %08lx\n", hr);
2202 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2203 ok(dst_len == 4, "got %Id\n", dst_len);
2204 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
2206 memset(src, 0, sizeof(src));
2207 ((LARGE_INTEGER*)src)->QuadPart = 4321;
2208 dst_len = 0x1234;
2209 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2210 ok(broken(hr == DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08lx\n", hr);
2211 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08lx\n", dst_status);
2212 ok(broken(dst_len == 0x1234) || dst_len == 4 /* W2K+ */, "got %Id\n", dst_len);
2213 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
2215 memset(src, 0, sizeof(src));
2216 ((ULARGE_INTEGER*)src)->QuadPart = 4321;
2217 dst_len = 0x1234;
2218 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2219 ok(broken(hr == DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08lx\n", hr);
2220 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08lx\n", dst_status);
2221 ok(broken(dst_len == 0x1234) || dst_len == 4 /* W2K+ */, "got %Id\n", dst_len);
2222 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
2226 memset(src, 0, sizeof(src));
2227 memcpy(src, &IID_IDataConvert, sizeof(GUID));
2228 memset(dst, 0xcc, sizeof(dst));
2229 dst_len = 0x1234;
2230 hr = IDataConvert_DataConvert(convert, DBTYPE_GUID, DBTYPE_STR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2231 ok(hr == S_OK, "got %08lx\n", hr);
2232 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2233 ok(dst_len == 38, "got %Id\n", dst_len);
2234 ok(!lstrcmpA(dst, guid_str), "got %s\n", dst);
2238 b = SysAllocString(ten);
2239 *(BSTR *)src = b;
2240 memset(dst, 0xcc, sizeof(dst));
2241 dst_len = 0x1234;
2242 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2243 ok(hr == S_OK, "got %08lx\n", hr);
2244 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2245 ok(dst_len == 2, "got %Id\n", dst_len);
2246 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
2247 SysFreeString(b);
2249 b = SysAllocString(idW);
2250 *(BSTR *)src = b;
2251 memset(dst, 0xcc, sizeof(dst));
2252 dst_len = 0x1234;
2253 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_STR, 0, &dst_len, src, dst, 9, 0, &dst_status, 0, 0, 0);
2254 ok(hr == S_OK, "got %08lx\n", hr);
2255 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2256 ok(dst_len == 13, "got %Id\n", dst_len);
2257 ok(!lstrcmpA(idA, dst), "got %s\n", dst);
2258 SysFreeString(b);
2260 memcpy(src, withnull, sizeof(withnull));
2261 memset(dst, 0xcc, sizeof(dst));
2262 dst_len = 0x1234;
2263 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, sizeof(withnull), &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2264 ok(hr == S_OK, "got %08lx\n", hr);
2265 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2266 ok(dst_len == 8, "got %Id\n", dst_len);
2267 ok(!memcmp(withnull, dst, 8), "got %s\n", dst);
2268 ok(dst[8] == 0, "got %02x\n", dst[8]);
2270 memcpy(src, withnull, sizeof(withnull));
2271 memset(dst, 0xcc, sizeof(dst));
2272 dst_len = 0x1234;
2273 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 7, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2274 ok(hr == S_OK, "got %08lx\n", hr);
2275 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2276 ok(dst_len == 7, "got %Id\n", dst_len);
2277 ok(!memcmp(withnull, dst, 7), "got %s\n", dst);
2278 ok(dst[7] == 0, "got %02x\n", dst[7]);
2280 memcpy(src, withnull, sizeof(withnull));
2281 memset(dst, 0xcc, sizeof(dst));
2282 dst_len = 0x1234;
2283 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 6, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2284 ok(hr == S_OK, "got %08lx\n", hr);
2285 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2286 ok(dst_len == 6, "got %Id\n", dst_len);
2287 ok(!memcmp(withnull, dst, 6), "got %s\n", dst);
2288 ok(dst[6] == 0, "got %02x\n", dst[6]);
2290 memcpy(src, ten, sizeof(ten));
2291 memset(dst, 0xcc, sizeof(dst));
2292 dst_len = 0x1234;
2293 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR, 2, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2294 ok(hr == S_OK, "got %08lx\n", hr);
2295 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2296 ok(dst_len == 1, "got %Id\n", dst_len);
2297 ok(dst[0] == '1', "got %02x\n", dst[0]);
2298 ok(dst[1] == 0, "got %02x\n", dst[1]);
2300 memcpy(src, ten, sizeof(ten));
2301 memset(dst, 0xcc, sizeof(dst));
2302 dst_len = 0x1234;
2303 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2304 ok(hr == S_OK, "got %08lx\n", hr);
2305 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2306 ok(dst_len == 2, "got %Id\n", dst_len);
2307 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
2309 memcpy(src, ten, sizeof(ten));
2310 memset(dst, 0xcc, sizeof(dst));
2311 dst_len = 0x1234;
2312 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
2313 ok(hr == S_OK, "got %08lx\n", hr);
2314 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2315 ok(dst_len == 2, "got %Id\n", dst_len);
2316 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
2318 memcpy(src, ten_a, sizeof(ten_a));
2319 memset(dst, 0xcc, sizeof(dst));
2320 dst_len = 0x1234;
2321 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 2, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2322 ok(hr == S_OK, "got %08lx\n", hr);
2323 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2324 ok(dst_len == 2, "got %Id\n", dst_len);
2325 ok(dst[0] == '1', "got %02x\n", dst[0]);
2326 ok(dst[1] == '0', "got %02x\n", dst[1]);
2327 ok(dst[2] == 0, "got %02x\n", dst[2]);
2328 ok(dst[3] == (char)0xcc, "got %02x\n", dst[3]);
2330 memcpy(src, ten_a, sizeof(ten_a));
2331 memset(dst, 0xcc, sizeof(dst));
2332 dst_len = 0x1234;
2333 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2334 ok(hr == S_OK, "got %08lx\n", hr);
2335 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2336 ok(dst_len == 4, "got %Id\n", dst_len);
2337 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
2339 memcpy(src, ten_a, sizeof(ten_a));
2340 memset(dst, 0xcc, sizeof(dst));
2341 dst_len = 0x1234;
2342 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
2343 ok(hr == S_OK, "got %08lx\n", hr);
2344 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2345 ok(dst_len == 2, "got %Id\n", dst_len);
2346 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
2350 /* DBTYPE_BYTES to DBTYPE_*STR unpacks binary data into a hex string */
2351 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
2352 memset(dst, 0xcc, sizeof(dst));
2353 dst_len = 0x1234;
2354 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, sizeof(hexpacked_a), &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2355 ok(hr == S_OK, "got %08lx\n", hr);
2356 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2357 ok(dst_len == sizeof(hexpacked_a) * 2, "got %Id\n", dst_len);
2358 ok(!lstrcmpA(hexunpacked_a, dst), "got %s\n", dst);
2359 ok(dst[ARRAY_SIZE(hexpacked_a) * 4 + 1] == (char)0xcc, "clobbered buffer\n");
2361 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
2362 memset(dst, 0xcc, sizeof(dst));
2363 dst_len = 0x1234;
2364 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2365 ok(hr == S_OK, "got %08lx\n", hr);
2366 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2367 ok(dst_len == 0, "got %Id\n", dst_len);
2368 ok(dst[0] == 0, "not null terminated\n");
2369 ok(dst[1] == (char)0xcc, "clobbered buffer\n");
2371 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
2372 memset(dst, 0xcc, sizeof(dst));
2373 dst_len = 0x1234;
2374 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2375 ok(hr == S_OK, "got %08lx\n", hr);
2376 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2377 ok(dst_len == 2 * sizeof(char) * 4, "got %Id\n", dst_len);
2378 ok(!memcmp(hexunpacked_a, dst, 2 * sizeof(char) * 4 ), "got %s\n", dst);
2379 ok(dst[2 * 4] == 0, "not null terminated\n");
2380 ok(dst[2 * 4 + 1] == (char)0xcc, "clobbered buffer\n");
2382 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
2383 memset(dst, 0xcc, sizeof(dst));
2384 dst_len = 0x1234;
2385 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, sizeof(hexpacked_a), &dst_len, src, dst, 2 * sizeof(char) * 4 + sizeof(char), 0, &dst_status, 0, 0, 0);
2386 ok(hr == S_OK, "got %08lx\n", hr);
2387 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2388 ok(dst_len == sizeof(hexpacked_a) * 2, "got %Id\n", dst_len);
2389 ok(!memcmp(hexunpacked_a, dst, 2 * sizeof(char) * 4 ), "got %s\n", dst);
2390 ok(dst[2 * 4] == 0, "not null terminated\n");
2391 ok(dst[2 * 4 + 1] == (char)0xcc, "clobbered buffer\n");
2393 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
2394 memset(dst, 0xcc, sizeof(dst));
2395 dst_len = 0x1234;
2396 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, sizeof(hexpacked_a), &dst_len, src, dst, 2 * sizeof(char) * 4, 0, &dst_status, 0, 0, 0);
2397 ok(hr == S_OK, "got %08lx\n", hr);
2398 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
2399 ok(dst_len == sizeof(hexpacked_a) * 2, "got %Id\n", dst_len);
2400 ok(!memcmp(hexunpacked_a, dst, 2 * sizeof(char) * 4 - 2 ), "got %s\n", dst);
2401 ok(dst[2 * 4 - 1] == 0, "not null terminated\n");
2402 ok(dst[2 * 4] == (char)0xcc, "clobbered buffer\n");
2404 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
2405 memset(dst, 0xcc, sizeof(dst));
2406 dst_len = 0x1234;
2407 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
2408 ok(hr == S_OK, "got %08lx\n", hr);
2409 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2410 ok(dst_len == 0, "got %Id\n", dst_len);
2411 ok(dst[0] == 0, "not null terminated\n");
2412 ok(dst[1] == (char)0xcc, "clobbered buffer\n");
2414 dst_len = 44;
2415 V_VT(&v) = VT_NULL;
2416 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_STR, 0, &dst_len, &v, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2417 ok(hr == S_OK, "got %08lx\n", hr);
2418 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
2419 ok(dst_len == 44, "got %Id\n", dst_len);
2422 static void test_converttobyrefwstr(void)
2424 HRESULT hr;
2425 WCHAR *dst;
2426 BYTE src[20];
2427 DBSTATUS dst_status;
2428 DBLENGTH dst_len;
2429 static const WCHAR ten[] = {'1','0',0};
2430 static const WCHAR fourthreetwoone[] = {'4','3','2','1',0};
2431 BSTR b;
2432 VARIANT v;
2434 VariantInit(&v);
2436 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2437 ok(hr == S_OK, "got %08lx\n", hr);
2438 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2439 ok(dst_len == 0, "got %Id\n", dst_len);
2440 ok(dst[0] == 0, "got %04x\n", dst[0]);
2441 CoTaskMemFree(dst);
2443 dst = (void*)0x12345678;
2444 dst_len = 0x1234;
2445 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2446 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
2447 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
2448 ok(dst_len == 0x1234, "got %Id\n", dst_len);
2449 ok(dst == (void*)0x12345678, "got %p\n", dst);
2451 *(short *)src = 4321;
2452 dst_len = 0x1234;
2453 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2454 ok(hr == S_OK, "got %08lx\n", hr);
2455 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2456 ok(dst_len == 8, "got %Id\n", dst_len);
2457 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
2458 CoTaskMemFree(dst);
2460 *(short *)src = 4321;
2461 dst_len = 0x1234;
2462 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, 0, 0, &dst_status, 0, 0, 0);
2463 ok(hr == S_OK, "got %08lx\n", hr);
2464 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2465 ok(dst_len == 8, "got %Id\n", dst_len);
2466 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
2467 CoTaskMemFree(dst);
2469 b = SysAllocString(ten);
2470 *(BSTR *)src = b;
2471 dst_len = 0x1234;
2472 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2473 ok(hr == S_OK, "got %08lx\n", hr);
2474 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2475 ok(dst_len == 4, "got %Id\n", dst_len);
2476 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
2477 CoTaskMemFree(dst);
2478 SysFreeString(b);
2480 memcpy(src, ten, sizeof(ten));
2481 dst_len = 0x1234;
2482 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_BYREF | DBTYPE_WSTR, 2, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2483 ok(hr == S_OK, "got %08lx\n", hr);
2484 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2485 ok(dst_len == 2, "got %Id\n", dst_len);
2486 ok(dst[0] == '1', "got %02x\n", dst[0]);
2487 ok(dst[1] == 0, "got %02x\n", dst[1]);
2488 CoTaskMemFree(dst);
2490 memcpy(src, ten, sizeof(ten));
2491 dst_len = 0x1234;
2492 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_BYREF | DBTYPE_WSTR, 4, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2493 ok(hr == S_OK, "got %08lx\n", hr);
2494 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2495 ok(dst_len == 4, "got %Id\n", dst_len);
2496 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
2497 CoTaskMemFree(dst);
2499 memcpy(src, ten, sizeof(ten));
2500 dst_len = 0x1234;
2501 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
2502 ok(hr == S_OK, "got %08lx\n", hr);
2503 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2504 ok(dst_len == 4, "got %Id\n", dst_len);
2505 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
2506 CoTaskMemFree(dst);
2508 dst_len = 44;
2509 V_VT(&v) = VT_NULL;
2510 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2511 ok(hr == S_OK, "got %08lx\n", hr);
2512 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
2513 ok(dst_len == 44, "got %Id\n", dst_len);
2516 static void test_converttobyrefstr(void)
2518 HRESULT hr;
2519 char *dst;
2520 BYTE src[20];
2521 DBSTATUS dst_status;
2522 DBLENGTH dst_len;
2523 static const WCHAR ten[] = {'1','0',0};
2524 static const char withnull[] = "test\0ed";
2525 BSTR b;
2526 VARIANT v;
2528 VariantInit(&v);
2530 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_STR | DBTYPE_BYREF, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2531 ok(hr == S_OK, "got %08lx\n", hr);
2532 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2533 ok(dst_len == 0, "got %Id\n", dst_len);
2534 ok(dst[0] == 0, "got %04x\n", dst[0]);
2535 CoTaskMemFree(dst);
2537 dst = (void*)0x12345678;
2538 dst_len = 0x1234;
2539 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_STR | DBTYPE_BYREF, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2540 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
2541 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
2542 ok(dst_len == 0x1234, "got %Id\n", dst_len);
2543 ok(dst == (void*)0x12345678, "got %p\n", dst);
2545 *(short *)src = 4321;
2546 dst_len = 0x1234;
2547 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR | DBTYPE_BYREF, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2548 ok(hr == S_OK, "got %08lx\n", hr);
2549 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2550 ok(dst_len == 4, "got %Id\n", dst_len);
2551 ok(!lstrcmpA(dst, "4321"), "got %s\n", dst);
2552 CoTaskMemFree(dst);
2554 *(short *)src = 4321;
2555 dst_len = 0x1234;
2556 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR | DBTYPE_BYREF, 0, &dst_len, src, &dst, 0, 0, &dst_status, 0, 0, 0);
2557 ok(hr == S_OK, "got %08lx\n", hr);
2558 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2559 ok(dst_len == 4, "got %Id\n", dst_len);
2560 ok(!lstrcmpA(dst, "4321"), "got %s\n", dst);
2561 CoTaskMemFree(dst);
2563 b = SysAllocString(ten);
2564 *(BSTR *)src = b;
2565 dst_len = 0x1234;
2566 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_STR | DBTYPE_BYREF, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2567 ok(hr == S_OK, "got %08lx\n", hr);
2568 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2569 ok(dst_len == 2, "got %Id\n", dst_len);
2570 ok(!lstrcmpA("10", dst), "got %s\n", dst);
2571 CoTaskMemFree(dst);
2572 SysFreeString(b);
2574 memcpy(src, ten, sizeof(ten));
2575 dst_len = 0x1234;
2576 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR | DBTYPE_BYREF, 2, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2577 ok(hr == S_OK, "got %08lx\n", hr);
2578 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2579 ok(dst_len == 1, "got %Id\n", dst_len);
2580 ok(dst[0] == '1', "got %02x\n", dst[0]);
2581 ok(dst[1] == 0, "got %02x\n", dst[1]);
2582 CoTaskMemFree(dst);
2584 memcpy(src, ten, sizeof(ten));
2585 dst_len = 0x1234;
2586 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR | DBTYPE_BYREF, 4, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2587 ok(hr == S_OK, "got %08lx\n", hr);
2588 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2589 ok(dst_len == 2, "got %Id\n", dst_len);
2590 ok(!lstrcmpA("10", dst), "got %s\n", dst);
2591 CoTaskMemFree(dst);
2593 memcpy(src, ten, sizeof(ten));
2594 dst_len = 0x1234;
2595 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR | DBTYPE_BYREF, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
2596 ok(hr == S_OK, "got %08lx\n", hr);
2597 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2598 ok(dst_len == 2, "got %Id\n", dst_len);
2599 ok(!lstrcmpA("10", dst), "got %s\n", dst);
2600 CoTaskMemFree(dst);
2602 memcpy(src, withnull, sizeof(withnull));
2603 dst_len = 0x1234;
2604 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR | DBTYPE_BYREF, sizeof(withnull), &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2605 ok(hr == S_OK, "got %08lx\n", hr);
2606 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2607 ok(dst_len == 8, "got %Id\n", dst_len);
2608 ok(!memcmp(withnull, dst, 8), "got %s\n", dst);
2609 ok(dst[8] == 0, "got %02x\n", dst[8]);
2610 CoTaskMemFree(dst);
2612 memcpy(src, withnull, sizeof(withnull));
2613 dst_len = 0x1234;
2614 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR | DBTYPE_BYREF, 7, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2615 ok(hr == S_OK, "got %08lx\n", hr);
2616 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2617 ok(dst_len == 7, "got %Id\n", dst_len);
2618 ok(!memcmp(withnull, dst, 7), "got %s\n", dst);
2619 ok(dst[7] == 0, "got %02x\n", dst[7]);
2620 CoTaskMemFree(dst);
2622 memcpy(src, withnull, sizeof(withnull));
2623 dst_len = 0x1234;
2624 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR | DBTYPE_BYREF, 6, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2625 ok(hr == S_OK, "got %08lx\n", hr);
2626 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2627 ok(dst_len == 6, "got %Id\n", dst_len);
2628 ok(!memcmp(withnull, dst, 6), "got %s\n", dst);
2629 ok(dst[6] == 0, "got %02x\n", dst[6]);
2630 CoTaskMemFree(dst);
2633 dst_len = 44;
2634 V_VT(&v) = VT_NULL;
2635 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_STR | DBTYPE_BYREF, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2636 ok(hr == S_OK, "got %08lx\n", hr);
2637 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
2638 ok(dst_len == 44, "got %Id\n", dst_len);
2641 static void test_converttoguid(void)
2643 HRESULT hr;
2644 GUID dst;
2645 BYTE src[20];
2646 DBSTATUS dst_status;
2647 DBLENGTH dst_len;
2648 VARIANT v;
2650 VariantInit(&v);
2652 dst = IID_IDCInfo;
2653 dst_len = 0x1234;
2654 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_GUID, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2655 ok(hr == S_OK, "got %08lx\n", hr);
2656 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2657 ok(dst_len == sizeof(GUID), "got %Id\n", dst_len);
2658 ok(IsEqualGUID(&dst, &GUID_NULL), "didn't get GUID_NULL\n");
2660 dst = IID_IDCInfo;
2661 dst_len = 0x1234;
2662 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_GUID, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2663 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
2664 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
2665 ok(dst_len == 0x1234, "got %Id\n", dst_len);
2666 ok(IsEqualGUID(&dst, &IID_IDCInfo), "dst has changed\n");
2668 dst = IID_IDCInfo;
2669 memcpy(src, &IID_IDataConvert, sizeof(GUID));
2670 dst_len = 0x1234;
2671 hr = IDataConvert_DataConvert(convert, DBTYPE_GUID, DBTYPE_GUID, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2672 ok(hr == S_OK, "got %08lx\n", hr);
2673 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2674 ok(dst_len == sizeof(GUID), "got %Id\n", dst_len);
2675 ok(IsEqualGUID(&dst, &IID_IDataConvert), "didn't get IID_IDataConvert\n");
2677 dst_len = 44;
2678 V_VT(&v) = VT_NULL;
2679 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_GUID, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2680 ok(hr == S_OK, "got %08lx\n", hr);
2681 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
2682 ok(dst_len == 44, "got %Id\n", dst_len);
2684 dst_len = 0x1234;
2685 dst = IID_IDCInfo;
2686 V_VT(&v) = VT_BSTR;
2687 V_BSTR(&v) = SysAllocStringLen(L"{0c733a8d-2a1c-11ce-ade5-00aa0044773d}", 38);
2688 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_GUID, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2689 ok(hr == S_OK, "got %08lx\n", hr);
2690 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2691 ok(dst_len == sizeof(GUID), "got %Id\n", dst_len);
2692 ok(IsEqualGUID(&dst, &IID_IDataConvert), "didn't get IID_IDataConvert\n");
2693 SysFreeString(V_BSTR(&v));
2695 dst_len = 0x1234;
2696 V_VT(&v) = VT_BSTR;
2697 V_BSTR(&v) = SysAllocStringLen(L"{invalid0-0000-0000-0000-000000000000}", 38);
2698 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_GUID, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2699 ok(hr == CO_E_CLASSSTRING, "got %08lx\n", hr);
2700 ok(dst_status == DBSTATUS_E_CANTCONVERTVALUE, "got %08lx\n", dst_status);
2701 ok(dst_len == sizeof(GUID), "got %Id\n", dst_len);
2702 SysFreeString(V_BSTR(&v));
2705 static void test_converttofiletime(void)
2707 HRESULT hr;
2708 FILETIME dst;
2709 BYTE src[20];
2710 DBSTATUS dst_status;
2711 DBLENGTH dst_len;
2712 VARIANT v;
2714 VariantInit(&v);
2716 memset(&dst, 0xcc, sizeof(dst));
2717 ((FILETIME *)src)->dwLowDateTime = 0x12345678;
2718 ((FILETIME *)src)->dwHighDateTime = 0x9abcdef0;
2719 dst_len = 0x1234;
2720 hr = IDataConvert_DataConvert(convert, DBTYPE_FILETIME, DBTYPE_FILETIME, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2721 ok(hr == S_OK ||
2722 broken(hr == DB_E_BADBINDINFO), /* win98 */
2723 "got %08lx\n", hr);
2724 if(SUCCEEDED(hr))
2726 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2727 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2728 ok(dst.dwLowDateTime == 0x12345678, "got %08lx\n", dst.dwLowDateTime);
2729 ok(dst.dwHighDateTime == 0x9abcdef0, "got %08lx\n", dst.dwHighDateTime);
2732 dst_len = 44;
2733 V_VT(&v) = VT_NULL;
2734 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_FILETIME, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2735 ok(hr == S_OK, "got %08lx\n", hr);
2736 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
2737 ok(dst_len == 44, "got %Id\n", dst_len);
2740 static void test_converttoui1(void)
2742 HRESULT hr;
2743 BYTE dst;
2744 BYTE src[20];
2745 DBSTATUS dst_status;
2746 DBLENGTH dst_len;
2747 VARIANT v;
2749 VariantInit(&v);
2751 dst = 0x12;
2752 dst_len = 0x1234;
2753 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2754 ok(hr == S_OK, "got %08lx\n", hr);
2755 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2756 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2757 ok(dst == 0, "got %08x\n", dst);
2759 dst = 0x12;
2760 dst_len = 0x1234;
2761 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2762 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
2763 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
2764 ok(dst_len == 0x1234, "got %Id\n", dst_len);
2765 ok(dst == 0x12, "got %08x\n", dst);
2767 dst = 0x12;
2768 src[0] = 0x43;
2769 dst_len = 0x1234;
2770 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2771 ok(hr == S_OK, "got %08lx\n", hr);
2772 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2773 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2774 ok(dst == 0x43, "got %08x\n", dst);
2776 dst = 0x12;
2777 src[0] = 0xfe;
2778 dst_len = 0x1234;
2779 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2780 ok(hr == S_OK, "got %08lx\n", hr);
2781 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2782 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2783 ok(dst == 0xfe, "got %08x\n", dst);
2785 dst_len = 44;
2786 V_VT(&v) = VT_NULL;
2787 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI1, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2788 ok(hr == S_OK, "got %08lx\n", hr);
2789 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
2790 ok(dst_len == 44, "got %Id\n", dst_len);
2793 static void test_converttoui4(void)
2795 HRESULT hr;
2796 DWORD dst;
2797 BYTE src[sizeof(VARIANT)];
2798 DBSTATUS dst_status;
2799 DBLENGTH dst_len;
2801 dst = 0x12345678;
2802 dst_len = 0x1234;
2803 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2804 ok(hr == S_OK, "got %08lx\n", hr);
2805 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2806 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2807 ok(dst == 0, "got %08lx\n", dst);
2809 dst = 0x12345678;
2810 dst_len = 0x1234;
2811 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2812 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
2813 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
2814 ok(dst_len == 0x1234, "got %Id\n", dst_len);
2815 ok(dst == 0x12345678, "got %08lx\n", dst);
2817 dst = 0x12345678;
2818 *(DWORD*)src = 0x87654321;
2819 dst_len = 0x1234;
2820 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2821 ok(hr == S_OK, "got %08lx\n", hr);
2822 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2823 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2824 ok(dst == 0x87654321, "got %08lx\n", dst);
2826 dst = 0x12345678;
2827 *(signed short *)src = 0x4321;
2828 dst_len = 0x1234;
2829 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2830 ok(hr == S_OK, "got %08lx\n", hr);
2831 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2832 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2833 ok(dst == 0x4321, "got %08lx\n", dst);
2835 dst = 0x12345678;
2836 *(signed short *)src = -1;
2837 dst_len = 0x1234;
2838 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2839 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
2840 todo_wine
2841 ok(dst_status == DBSTATUS_E_SIGNMISMATCH, "got %08lx\n", dst_status);
2842 todo_wine
2843 ok(broken(dst_len == sizeof(dst)) || dst_len == 0x1234 /* W2K+ */, "got %Id\n", dst_len);
2844 ok(dst == 0x12345678, "got %08lx\n", dst);
2846 dst_len = dst = 0x1234;
2847 V_VT((VARIANT*)src) = VT_I2;
2848 V_I2((VARIANT*)src) = 0x4321;
2849 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2850 ok(hr == S_OK, "got %08lx\n", hr);
2851 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2852 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2853 ok(dst == 0x4321, "got %08lx\n", dst);
2855 dst_len = 44;
2856 V_VT((VARIANT*)src) = VT_NULL;
2857 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2858 ok(hr == S_OK, "got %08lx\n", hr);
2859 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
2860 ok(dst_len == 44, "got %Id\n", dst_len);
2863 static void test_converttor4(void)
2865 HRESULT hr;
2866 FLOAT dst;
2867 BYTE src[20];
2868 DBSTATUS dst_status;
2869 DBLENGTH dst_len;
2870 VARIANT v;
2872 VariantInit(&v);
2874 dst = 1.0;
2875 dst_len = 0x1234;
2876 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2877 ok(hr == S_OK, "got %08lx\n", hr);
2878 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2879 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2880 ok(dst == 0.0, "got %f\n", dst);
2882 dst = 1.0;
2883 dst_len = 0x1234;
2884 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2885 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
2886 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
2887 ok(dst_len == 0x1234, "got %Id\n", dst_len);
2888 ok(dst == 1.0, "got %f\n", dst);
2890 dst = 1.0;
2891 *(signed int*)src = 12345678;
2892 dst_len = 0x1234;
2893 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2894 ok(hr == S_OK, "got %08lx\n", hr);
2895 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2896 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2897 ok(dst == 12345678.0, "got %f\n", dst);
2899 dst = 1.0;
2900 *(FLOAT *)src = 10.0;
2901 dst_len = 0x1234;
2902 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2903 ok(hr == S_OK, "got %08lx\n", hr);
2904 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2905 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2906 ok(dst == 10.0, "got %f\n", dst);
2908 dst_len = 44;
2909 V_VT(&v) = VT_NULL;
2910 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_R4, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2911 ok(hr == S_OK, "got %08lx\n", hr);
2912 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
2913 ok(dst_len == 44, "got %Id\n", dst_len);
2915 dst_len = dst = 0x1234;
2916 V_VT(&v) = VT_I2;
2917 V_I2(&v) = 0x4321;
2918 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_R4, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2919 ok(hr == S_OK, "got %08lx\n", hr);
2920 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2921 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2922 ok(dst == 0x4321, "got %f\n", dst);
2925 static void test_converttor8(void)
2927 HRESULT hr;
2928 DOUBLE dst;
2929 BYTE src[20];
2930 DBSTATUS dst_status;
2931 DBLENGTH dst_len;
2932 VARIANT var;
2934 dst = 1.0;
2935 dst_len = 0x1234;
2936 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_R8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2937 ok(hr == S_OK, "got %08lx\n", hr);
2938 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2939 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2940 ok(dst == 0.0, "got %f\n", dst);
2942 dst = 1.0;
2943 dst_len = 0x1234;
2944 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_R8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2945 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
2946 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
2947 ok(dst_len == 0x1234, "got %Id\n", dst_len);
2948 ok(dst == 1.0, "got %f\n", dst);
2950 dst = 1.0;
2951 *(signed int*)src = 12345678;
2952 dst_len = 0x1234;
2953 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_R8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2954 ok(hr == S_OK, "got %08lx\n", hr);
2955 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2956 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2957 ok(dst == 12345678.0, "got %f\n", dst);
2959 dst = 1.0;
2960 *(FLOAT *)src = 10.0;
2961 dst_len = 0x1234;
2962 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_R8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2963 ok(hr == S_OK, "got %08lx\n", hr);
2964 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2965 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2966 ok(dst == 10.0, "got %f\n", dst);
2968 dst_len = dst = 0x1234;
2969 V_VT(&var) = VT_I2;
2970 V_I2(&var) = 0x4321;
2971 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_R8, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2972 ok(hr == S_OK, "got %08lx\n", hr);
2973 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
2974 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
2975 ok(dst == 0x4321, "got %f\n", dst);
2977 dst_len = 44;
2978 V_VT(&var) = VT_NULL;
2979 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_R8, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2980 ok(hr == S_OK, "got %08lx\n", hr);
2981 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
2982 ok(dst_len == 44, "got %Id\n", dst_len);
2985 static void test_converttocy(void)
2987 HRESULT hr;
2988 CY dst;
2989 BYTE src[20];
2990 DBSTATUS dst_status;
2991 DBLENGTH dst_len;
2992 VARIANT v;
2994 VariantInit(&v);
2996 dst.int64 = 0xcc;
2997 dst_len = 0x1234;
2998 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2999 ok(hr == S_OK, "got %08lx\n", hr);
3000 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3001 ok(dst_len == sizeof(CY), "got %Id\n", dst_len);
3002 ok(dst.int64 == 0, "didn't get 0\n");
3004 dst.int64 = 0xcc;
3005 dst_len = 0x1234;
3006 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3007 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
3008 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
3009 ok(dst_len == 0x1234, "got %Id\n", dst_len);
3010 ok(dst.int64 == 0xcc, "dst changed\n");
3012 dst.int64 = 0xcc;
3013 *(int*)src = 1234;
3014 dst_len = 0x1234;
3015 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3016 ok(hr == S_OK, "got %08lx\n", hr);
3017 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3018 ok(dst_len == sizeof(CY), "got %Id\n", dst_len);
3019 ok(dst.int64 == 12340000, "got %ld\n", dst.s.Lo);
3021 dst.int64 = 0xcc;
3022 ((CY*)src)->int64 = 1234;
3023 dst_len = 0x1234;
3024 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3025 ok(hr == S_OK, "got %08lx\n", hr);
3026 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3027 ok(dst_len == sizeof(CY), "got %Id\n", dst_len);
3028 ok(dst.int64 == 1234, "got %ld\n", dst.s.Lo);
3030 dst_len = 44;
3031 V_VT(&v) = VT_NULL;
3032 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_CY, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3033 ok(hr == S_OK, "got %08lx\n", hr);
3034 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
3035 ok(dst_len == 44, "got %Id\n", dst_len);
3038 static void test_converttoui8(void)
3040 HRESULT hr;
3041 ULARGE_INTEGER dst;
3042 BYTE src[20];
3043 DBSTATUS dst_status;
3044 DBLENGTH dst_len;
3045 VARIANT v;
3047 VariantInit(&v);
3049 dst.QuadPart = 0xcc;
3050 dst_len = 0x1234;
3051 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3052 ok(hr == S_OK, "got %08lx\n", hr);
3053 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3054 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3055 ok(dst.QuadPart == 0, "got %d\n", (int)dst.QuadPart);
3057 dst.QuadPart = 0xcc;
3058 dst_len = 0x1234;
3059 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3060 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08lx\n", hr);
3061 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08lx\n", dst_status);
3062 ok(dst_len == 0x1234, "got %Id\n", dst_len);
3063 ok(dst.QuadPart == 0xcc, "dst changed\n");
3065 dst.QuadPart = 0xcc;
3066 *(int*)src = 1234;
3067 dst_len = 0x1234;
3068 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3069 ok(hr == S_OK, "got %08lx\n", hr);
3070 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3071 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3072 ok(dst.QuadPart == 1234, "got %d\n", (int)dst.QuadPart);
3074 dst.QuadPart = 0xcc;
3075 *(int*)src = -1234;
3076 dst_len = 0x1234;
3077 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3078 ok(hr == DB_E_ERRORSOCCURRED, "got %08lx\n", hr);
3079 todo_wine
3080 ok(dst_status == DBSTATUS_E_SIGNMISMATCH, "got %08lx\n", dst_status);
3081 todo_wine
3082 ok(dst_len == 0x1234, "got %Id\n", dst_len);
3083 ok(dst.QuadPart == 0xcc, "got %d\n", (int)dst.QuadPart);
3085 dst.QuadPart = 0xcc;
3086 ((ULARGE_INTEGER*)src)->QuadPart = 1234;
3087 dst_len = 0x1234;
3088 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3089 ok(hr == S_OK, "got %08lx\n", hr);
3090 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3091 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3092 ok(dst.QuadPart == 1234, "got %d\n", (int)dst.QuadPart);
3094 dst_len = 44;
3095 V_VT(&v) = VT_NULL;
3096 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI8, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3097 ok(hr == S_OK, "got %08lx\n", hr);
3098 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
3099 ok(dst_len == 44, "got %Id\n", dst_len);
3101 V_VT(&v) = VT_UI8;
3102 V_UI8(&v) = 4321;
3103 dst_len = 0x1234;
3104 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_UI8, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3105 ok(hr == S_OK, "got %08lx\n", hr);
3106 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3107 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3108 ok(dst.QuadPart == 4321, "got %d\n", (int)dst.QuadPart);
3111 static void test_getconversionsize(void)
3113 DBLENGTH dst_len;
3114 DBLENGTH src_len;
3115 HRESULT hr;
3116 BSTR str;
3117 static WCHAR strW[] = {'t','e','s','t',0};
3118 static char strTest[] = "test";
3119 VARIANT var;
3120 SAFEARRAY *psa = NULL;
3121 SAFEARRAYBOUND rgsabound[1];
3122 int i4 = 200;
3123 WORD i2 = 201;
3124 char i1 = (char)203;
3125 FLOAT f4 = 1.0;
3126 LONGLONG i8 = 202;
3127 DATE dbdate;
3128 DECIMAL dec;
3129 DBTIMESTAMP ts = {2013, 5, 14, 2, 4, 12, 0};
3130 DBTIME dbtime;
3131 DBDATE dbdate1;
3133 /* same way as CanConvert fails here */
3134 dst_len = 0;
3135 hr = IDataConvert_GetConversionSize(convert, DBTYPE_NULL, DBTYPE_BSTR, NULL, &dst_len, NULL);
3136 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got 0x%08lx\n", hr);
3138 dst_len = 0;
3139 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I2, DBTYPE_I4, NULL, &dst_len, NULL);
3140 ok(hr == S_OK, "got 0x%08lx\n", hr);
3141 ok(dst_len == 4, "got %Id\n", dst_len);
3143 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I2, DBTYPE_I4, NULL, NULL, NULL);
3144 ok(hr == E_INVALIDARG, "got 0x%08lx\n", hr);
3146 /* size doesn't include string size */
3147 str = SysAllocStringLen(NULL, 10);
3148 dst_len = 0;
3149 hr = IDataConvert_GetConversionSize(convert, DBTYPE_BSTR, DBTYPE_VARIANT, NULL, &dst_len, str);
3150 ok(hr == S_OK, "got 0x%08lx\n", hr);
3151 ok(dst_len == sizeof(VARIANT), "%Id\n", dst_len);
3152 SysFreeString(str);
3154 dst_len = 0;
3155 hr = IDataConvert_GetConversionSize(convert, DBTYPE_WSTR, DBTYPE_WSTR, NULL, &dst_len, strW);
3156 ok(hr == S_OK, "got 0x%08lx\n", hr);
3157 ok(dst_len == 10, "%Id\n", dst_len);
3159 dst_len = 0;
3160 src_len = 2;
3161 hr = IDataConvert_GetConversionSize(convert, DBTYPE_WSTR, DBTYPE_WSTR, &src_len, &dst_len, strW);
3162 ok(hr == S_OK, "got 0x%08lx\n", hr);
3163 ok(dst_len == 4, "%Id\n", dst_len);
3165 dst_len = 0;
3166 src_len = 20;
3167 hr = IDataConvert_GetConversionSize(convert, DBTYPE_WSTR, DBTYPE_WSTR, &src_len, &dst_len, strW);
3168 ok(hr == S_OK, "got 0x%08lx\n", hr);
3169 ok(dst_len == 22, "%Id\n", dst_len);
3171 dst_len = 0;
3172 hr = IDataConvert_GetConversionSize(convert, DBTYPE_STR, DBTYPE_WSTR, NULL, &dst_len, strTest);
3173 ok(hr == S_OK, "got 0x%08lx\n", hr);
3174 ok(dst_len == 10 || broken(dst_len == 12), "%Id\n", dst_len);
3176 dst_len = 0;
3177 src_len = 2;
3178 hr = IDataConvert_GetConversionSize(convert, DBTYPE_STR, DBTYPE_WSTR, &src_len, &dst_len, strTest);
3179 ok(hr == S_OK, "got 0x%08lx\n", hr);
3180 ok(dst_len == 6, "%Id\n", dst_len);
3182 dst_len = 0;
3183 src_len = 20;
3184 hr = IDataConvert_GetConversionSize(convert, DBTYPE_STR, DBTYPE_WSTR, &src_len, &dst_len, strTest);
3185 ok(hr == S_OK, "got 0x%08lx\n", hr);
3186 ok(dst_len == 42, "%Id\n", dst_len);
3188 dst_len = 0;
3189 V_VT(&var) = VT_BSTR;
3190 V_BSTR(&var) = SysAllocString(strW);
3191 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_WSTR, NULL, &dst_len, &var);
3192 ok(hr == S_OK, "got 0x%08lx\n", hr);
3193 ok(dst_len == 10, "%Id\n", dst_len);
3194 VariantClear(&var);
3196 dst_len = 0;
3197 src_len = 20;
3198 V_VT(&var) = VT_BSTR;
3199 V_BSTR(&var) = SysAllocString(strW);
3200 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_WSTR, &src_len, &dst_len, &var);
3201 ok(hr == S_OK, "got 0x%08lx\n", hr);
3202 ok(dst_len == 10, "%Id\n", dst_len);
3203 VariantClear(&var);
3205 dst_len = 0;
3206 src_len = 20;
3207 V_VT(&var) = VT_I4;
3208 V_I4(&var) = 4;
3209 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_WSTR, &src_len, &dst_len, &var);
3210 ok(hr == S_OK, "got 0x%08lx\n", hr);
3211 VariantClear(&var);
3213 dst_len = 0;
3214 src_len = 20;
3215 V_VT(&var) = VT_BSTR;
3216 V_BSTR(&var) = SysAllocString(strW);
3217 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_STR, &src_len, &dst_len, &var);
3218 ok(hr == S_OK, "got 0x%08lx\n", hr);
3219 ok(dst_len == 5, "%Id\n", dst_len);
3220 VariantClear(&var);
3222 src_len = 20;
3223 V_VT(&var) = VT_I4;
3224 V_I4(&var) = 4;
3225 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_STR, &src_len, &dst_len, &var);
3226 ok(hr == S_OK, "got 0x%08lx\n", hr);
3227 VariantClear(&var);
3229 dst_len = 0;
3230 src_len = 20;
3231 V_VT(&var) = VT_BSTR;
3232 V_BSTR(&var) = SysAllocString(strW);
3233 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_BYTES, &src_len, &dst_len, &var);
3234 ok(hr == S_OK, "got 0x%08lx\n", hr);
3235 ok(dst_len == 2, "%Id\n", dst_len);
3236 VariantClear(&var);
3238 dst_len = 0;
3239 src_len = 20;
3240 rgsabound[0].lLbound = 0;
3241 rgsabound[0].cElements = 1802;
3242 psa = SafeArrayCreate(VT_UI1,1,rgsabound);
3244 V_VT(&var) = VT_ARRAY|VT_UI1;
3245 V_ARRAY(&var) = psa;
3246 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_BYTES, &src_len, &dst_len, &var);
3247 ok(hr == S_OK, "got 0x%08lx\n", hr);
3248 ok(dst_len == 1802, "%Id\n", dst_len);
3249 VariantClear(&var);
3251 /* On Windows, NULL variants being convert to a non-fixed sized type will return a dst_len of
3252 * 110 but we aren't testing for this value.
3254 dst_len = 32;
3255 V_VT(&var) = VT_NULL;
3256 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_I4, NULL, &dst_len, &var);
3257 ok(dst_len == 4, "%Id\n", dst_len);
3258 ok(hr == S_OK, "got 0x%08lx\n", hr);
3260 V_VT(&var) = VT_NULL;
3261 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_STR, NULL, &dst_len, &var);
3262 ok(hr == S_OK, "got 0x%08lx\n", hr);
3263 ok(dst_len == 110, "%Id\n", dst_len);
3265 V_VT(&var) = VT_NULL;
3266 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_WSTR, NULL, &dst_len, &var);
3267 ok(hr == S_OK, "got 0x%08lx\n", hr);
3268 ok(dst_len == 110, "%Id\n", dst_len);
3270 src_len = 20;
3271 V_VT(&var) = VT_NULL;
3272 hr = IDataConvert_GetConversionSize(convert, DBTYPE_VARIANT, DBTYPE_BYTES, &src_len, &dst_len, &var);
3273 ok(hr == S_OK, "got 0x%08lx\n", hr);
3274 ok(dst_len == 110, "%Id\n", dst_len);
3275 VariantClear(&var);
3277 hr = IDataConvert_GetConversionSize(convert, DBTYPE_NUMERIC, DBTYPE_NUMERIC, NULL, &dst_len, NULL);
3278 ok(hr == S_OK, "got 0x%08lx\n", hr);
3279 ok(dst_len == sizeof(DB_NUMERIC), "%Id\n", dst_len);
3281 dst_len = 0;
3282 src_len = sizeof(i4);
3283 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I4, DBTYPE_WSTR, &src_len, &dst_len, &i4);
3284 ok(hr == S_OK, "got 0x%08lx\n", hr);
3285 ok(dst_len == 110, "%Id\n", dst_len);
3287 dst_len = 0;
3288 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I4, DBTYPE_WSTR, NULL, &dst_len, NULL);
3289 ok(hr == S_OK, "got 0x%08lx\n", hr);
3290 ok(dst_len == 110, "%Id\n", dst_len);
3292 dst_len = 0;
3293 src_len = sizeof(i4);
3294 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI4, DBTYPE_WSTR, &src_len, &dst_len, &i4);
3295 ok(hr == S_OK, "got 0x%08lx\n", hr);
3296 ok(dst_len == 110, "%Id\n", dst_len);
3298 dst_len = 0;
3299 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI4, DBTYPE_WSTR, NULL, &dst_len, NULL);
3300 ok(hr == S_OK, "got 0x%08lx\n", hr);
3301 ok(dst_len == 110, "%Id\n", dst_len);
3303 dst_len = 0;
3304 src_len = sizeof(i2);
3305 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I2, DBTYPE_WSTR, &src_len, &dst_len, &i2);
3306 ok(hr == S_OK, "got 0x%08lx\n", hr);
3307 ok(dst_len == 110, "%Id\n", dst_len);
3309 dst_len = 0;
3310 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I2, DBTYPE_WSTR, NULL, &dst_len, NULL);
3311 ok(hr == S_OK, "got 0x%08lx\n", hr);
3312 ok(dst_len == 110, "%Id\n", dst_len);
3314 dst_len = 0;
3315 src_len = sizeof(i2);
3316 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI2, DBTYPE_WSTR, &src_len, &dst_len, &i2);
3317 ok(hr == S_OK, "got 0x%08lx\n", hr);
3318 ok(dst_len == 110, "%Id\n", dst_len);
3320 dst_len = 0;
3321 src_len = sizeof(i1);
3322 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I1, DBTYPE_WSTR, &src_len, &dst_len, &i1);
3323 ok(hr == S_OK, "got 0x%08lx\n", hr);
3324 ok(dst_len == 110, "%Id\n", dst_len);
3326 dst_len = 0;
3327 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I1, DBTYPE_WSTR, NULL, &dst_len, NULL);
3328 ok(hr == S_OK, "got 0x%08lx\n", hr);
3329 ok(dst_len == 110, "%Id\n", dst_len);
3331 dst_len = 0;
3332 src_len = sizeof(i2);
3333 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI2, DBTYPE_WSTR, &src_len, &dst_len, &i2);
3334 ok(hr == S_OK, "got 0x%08lx\n", hr);
3335 ok(dst_len == 110, "%Id\n", dst_len);
3337 dst_len = 0;
3338 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI2, DBTYPE_WSTR, NULL, &dst_len, NULL);
3339 ok(hr == S_OK, "got 0x%08lx\n", hr);
3340 ok(dst_len == 110, "%Id\n", dst_len);
3342 dst_len = 0;
3343 src_len = sizeof(f4);
3344 hr = IDataConvert_GetConversionSize(convert, DBTYPE_R4, DBTYPE_WSTR, &src_len, &dst_len, &f4);
3345 ok(hr == S_OK, "got 0x%08lx\n", hr);
3346 ok(dst_len == 110, "%Id\n", dst_len);
3348 dst_len = 0;
3349 hr = IDataConvert_GetConversionSize(convert, DBTYPE_R4, DBTYPE_WSTR, NULL, &dst_len, NULL);
3350 ok(hr == S_OK, "got 0x%08lx\n", hr);
3351 ok(dst_len == 110, "%Id\n", dst_len);
3353 dst_len = 0;
3354 src_len = sizeof(i8);
3355 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI8, DBTYPE_WSTR, &src_len, &dst_len, &i8);
3356 ok(hr == S_OK, "got 0x%08lx\n", hr);
3357 ok(dst_len == 110, "%Id\n", dst_len);
3359 dst_len = 0;
3360 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI8, DBTYPE_WSTR, NULL, &dst_len, NULL);
3361 ok(hr == S_OK, "got 0x%08lx\n", hr);
3362 ok(dst_len == 110, "%Id\n", dst_len);
3364 dst_len = 0;
3365 src_len = sizeof(i8);
3366 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I8, DBTYPE_WSTR, &src_len, &dst_len, &i8);
3367 ok(hr == S_OK, "got 0x%08lx\n", hr);
3368 ok(dst_len == 110, "%Id\n", dst_len);
3370 dst_len = 0;
3371 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I8, DBTYPE_WSTR, NULL, &dst_len, NULL);
3372 ok(hr == S_OK, "got 0x%08lx\n", hr);
3373 ok(dst_len == 110, "%Id\n", dst_len);
3375 dst_len = 0;
3376 src_len = sizeof(dbdate);
3377 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DATE, DBTYPE_WSTR, &src_len, &dst_len, &dbdate);
3378 ok(hr == S_OK, "got 0x%08lx\n", hr);
3379 ok(dst_len == 110, "%Id\n", dst_len);
3381 dst_len = 0;
3382 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DATE, DBTYPE_WSTR, NULL, &dst_len, NULL);
3383 ok(hr == S_OK, "got 0x%08lx\n", hr);
3384 ok(dst_len == 110, "%Id\n", dst_len);
3386 dst_len = 0;
3387 src_len = sizeof(dec);
3388 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DECIMAL, DBTYPE_WSTR, &src_len, &dst_len, &dec);
3389 ok(hr == S_OK, "got 0x%08lx\n", hr);
3390 ok(dst_len == 110, "%Id\n", dst_len);
3392 dst_len = 0;
3393 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DECIMAL, DBTYPE_WSTR, NULL, &dst_len, NULL);
3394 ok(hr == S_OK, "got 0x%08lx\n", hr);
3395 ok(dst_len == 110, "%Id\n", dst_len);
3397 dst_len = 0;
3398 hr = IDataConvert_GetConversionSize(convert, DBTYPE_EMPTY, DBTYPE_WSTR, NULL, &dst_len, NULL);
3399 ok(hr == S_OK, "got 0x%08lx\n", hr);
3400 ok(dst_len == 110, "%Id\n", dst_len);
3402 dst_len = 0;
3403 src_len = sizeof(ts);
3404 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBTIMESTAMP, DBTYPE_WSTR, &src_len, &dst_len, &ts);
3405 ok(hr == S_OK, "got 0x%08lx\n", hr);
3406 ok(dst_len == 110, "%Id\n", dst_len);
3408 dst_len = 0;
3409 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBTIMESTAMP, DBTYPE_WSTR, NULL, &dst_len, NULL);
3410 ok(hr == S_OK, "got 0x%08lx\n", hr);
3411 ok(dst_len == 110, "%Id\n", dst_len);
3413 dst_len = 0;
3414 src_len = sizeof(dbtime);
3415 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBTIME, DBTYPE_WSTR, &src_len, &dst_len, &dbtime);
3416 ok(hr == S_OK, "got 0x%08lx\n", hr);
3417 ok(dst_len == 110, "%Id\n", dst_len);
3419 dst_len = 0;
3420 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBTIME, DBTYPE_WSTR, NULL, &dst_len, NULL);
3421 ok(hr == S_OK, "got 0x%08lx\n", hr);
3422 ok(dst_len == 110, "%Id\n", dst_len);
3424 dst_len = 0;
3425 src_len = sizeof(dbdate1);
3426 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBDATE, DBTYPE_WSTR, &src_len, &dst_len, &dbdate1);
3427 ok(hr == S_OK, "got 0x%08lx\n", hr);
3428 ok(dst_len == 110, "%Id\n", dst_len);
3430 dst_len = 0;
3431 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBDATE, DBTYPE_WSTR, NULL, &dst_len, NULL);
3432 ok(hr == S_OK, "got 0x%08lx\n", hr);
3433 ok(dst_len == 110, "%Id\n", dst_len);
3435 dst_len = 0;
3436 src_len = sizeof(i4);
3437 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I4, DBTYPE_STR, &src_len, &dst_len, &i4);
3438 ok(hr == S_OK, "got 0x%08lx\n", hr);
3439 ok(dst_len == 110, "%Id\n", dst_len);
3441 dst_len = 0;
3442 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I4, DBTYPE_STR, NULL, &dst_len, NULL);
3443 ok(hr == S_OK, "got 0x%08lx\n", hr);
3444 ok(dst_len == 110, "%Id\n", dst_len);
3446 dst_len = 0;
3447 src_len = sizeof(i4);
3448 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI4, DBTYPE_STR, &src_len, &dst_len, &i4);
3449 ok(hr == S_OK, "got 0x%08lx\n", hr);
3450 ok(dst_len == 110, "%Id\n", dst_len);
3452 dst_len = 0;
3453 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI4, DBTYPE_STR, NULL, &dst_len, NULL);
3454 ok(hr == S_OK, "got 0x%08lx\n", hr);
3455 ok(dst_len == 110, "%Id\n", dst_len);
3457 dst_len = 0;
3458 src_len = sizeof(i2);
3459 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I2, DBTYPE_STR, &src_len, &dst_len, &i2);
3460 ok(hr == S_OK, "got 0x%08lx\n", hr);
3461 ok(dst_len == 110, "%Id\n", dst_len);
3463 dst_len = 0;
3464 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I2, DBTYPE_STR, NULL, &dst_len, NULL);
3465 ok(hr == S_OK, "got 0x%08lx\n", hr);
3466 ok(dst_len == 110, "%Id\n", dst_len);
3468 dst_len = 0;
3469 src_len = sizeof(i2);
3470 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI2, DBTYPE_STR, &src_len, &dst_len, &i2);
3471 ok(hr == S_OK, "got 0x%08lx\n", hr);
3472 ok(dst_len == 110, "%Id\n", dst_len);
3474 dst_len = 0;
3475 src_len = sizeof(i1);
3476 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I1, DBTYPE_STR, &src_len, &dst_len, &i1);
3477 ok(hr == S_OK, "got 0x%08lx\n", hr);
3478 ok(dst_len == 110, "%Id\n", dst_len);
3480 dst_len = 0;
3481 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I1, DBTYPE_STR, NULL, &dst_len, NULL);
3482 ok(hr == S_OK, "got 0x%08lx\n", hr);
3483 ok(dst_len == 110, "%Id\n", dst_len);
3485 dst_len = 0;
3486 src_len = sizeof(i2);
3487 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI2, DBTYPE_STR, &src_len, &dst_len, &i2);
3488 ok(hr == S_OK, "got 0x%08lx\n", hr);
3489 ok(dst_len == 110, "%Id\n", dst_len);
3491 dst_len = 0;
3492 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI2, DBTYPE_STR, NULL, &dst_len, NULL);
3493 ok(hr == S_OK, "got 0x%08lx\n", hr);
3494 ok(dst_len == 110, "%Id\n", dst_len);
3496 dst_len = 0;
3497 src_len = sizeof(f4);
3498 hr = IDataConvert_GetConversionSize(convert, DBTYPE_R4, DBTYPE_STR, &src_len, &dst_len, &f4);
3499 ok(hr == S_OK, "got 0x%08lx\n", hr);
3500 ok(dst_len == 110, "%Id\n", dst_len);
3502 dst_len = 0;
3503 hr = IDataConvert_GetConversionSize(convert, DBTYPE_R4, DBTYPE_STR, NULL, &dst_len, NULL);
3504 ok(hr == S_OK, "got 0x%08lx\n", hr);
3505 ok(dst_len == 110, "%Id\n", dst_len);
3507 dst_len = 0;
3508 src_len = sizeof(i8);
3509 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI8, DBTYPE_STR, &src_len, &dst_len, &i8);
3510 ok(hr == S_OK, "got 0x%08lx\n", hr);
3511 ok(dst_len == 110, "%Id\n", dst_len);
3513 dst_len = 0;
3514 hr = IDataConvert_GetConversionSize(convert, DBTYPE_UI8, DBTYPE_STR, NULL, &dst_len, NULL);
3515 ok(hr == S_OK, "got 0x%08lx\n", hr);
3516 ok(dst_len == 110, "%Id\n", dst_len);
3518 dst_len = 0;
3519 src_len = sizeof(i8);
3520 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I8, DBTYPE_STR, &src_len, &dst_len, &i8);
3521 ok(hr == S_OK, "got 0x%08lx\n", hr);
3522 ok(dst_len == 110, "%Id\n", dst_len);
3524 dst_len = 0;
3525 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I8, DBTYPE_STR, NULL, &dst_len, NULL);
3526 ok(hr == S_OK, "got 0x%08lx\n", hr);
3527 ok(dst_len == 110, "%Id\n", dst_len);
3529 dst_len = 0;
3530 src_len = sizeof(dbdate);
3531 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DATE, DBTYPE_STR, &src_len, &dst_len, &dbdate);
3532 ok(hr == S_OK, "got 0x%08lx\n", hr);
3533 ok(dst_len == 110, "%Id\n", dst_len);
3535 dst_len = 0;
3536 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DATE, DBTYPE_STR, NULL, &dst_len, NULL);
3537 ok(hr == S_OK, "got 0x%08lx\n", hr);
3538 ok(dst_len == 110, "%Id\n", dst_len);
3540 dst_len = 0;
3541 src_len = sizeof(dec);
3542 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DECIMAL, DBTYPE_STR, &src_len, &dst_len, &dec);
3543 ok(hr == S_OK, "got 0x%08lx\n", hr);
3544 ok(dst_len == 110, "%Id\n", dst_len);
3546 dst_len = 0;
3547 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DECIMAL, DBTYPE_STR, NULL, &dst_len, NULL);
3548 ok(hr == S_OK, "got 0x%08lx\n", hr);
3549 ok(dst_len == 110, "%Id\n", dst_len);
3551 dst_len = 0;
3552 hr = IDataConvert_GetConversionSize(convert, DBTYPE_EMPTY, DBTYPE_STR, NULL, &dst_len, NULL);
3553 ok(hr == S_OK, "got 0x%08lx\n", hr);
3554 ok(dst_len == 110, "%Id\n", dst_len);
3556 dst_len = 0;
3557 src_len = sizeof(ts);
3558 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBTIMESTAMP, DBTYPE_STR, &src_len, &dst_len, &ts);
3559 ok(hr == S_OK, "got 0x%08lx\n", hr);
3560 ok(dst_len == 110, "%Id\n", dst_len);
3562 dst_len = 0;
3563 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBTIMESTAMP, DBTYPE_STR, NULL, &dst_len, NULL);
3564 ok(hr == S_OK, "got 0x%08lx\n", hr);
3565 ok(dst_len == 110, "%Id\n", dst_len);
3567 dst_len = 0;
3568 src_len = sizeof(dbtime);
3569 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBTIME, DBTYPE_STR, &src_len, &dst_len, &dbtime);
3570 ok(hr == S_OK, "got 0x%08lx\n", hr);
3571 ok(dst_len == 110, "%Id\n", dst_len);
3573 dst_len = 0;
3574 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBTIME, DBTYPE_STR, NULL, &dst_len, NULL);
3575 ok(hr == S_OK, "got 0x%08lx\n", hr);
3576 ok(dst_len == 110, "%Id\n", dst_len);
3578 dst_len = 0;
3579 src_len = sizeof(dbdate1);
3580 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBDATE, DBTYPE_STR, &src_len, &dst_len, &dbdate1);
3581 ok(hr == S_OK, "got 0x%08lx\n", hr);
3582 ok(dst_len == 110, "%Id\n", dst_len);
3584 dst_len = 0;
3585 hr = IDataConvert_GetConversionSize(convert, DBTYPE_DBDATE, DBTYPE_STR, NULL, &dst_len, NULL);
3586 ok(hr == S_OK, "got 0x%08lx\n", hr);
3587 ok(dst_len == 110, "%Id\n", dst_len);
3590 static void test_converttobytes(void)
3592 DBLENGTH dst_len;
3593 HRESULT hr;
3594 BYTE byte_src[] = {0, 1, 2, 4, 5};
3595 BYTE byte_dst[] = {0, 0, 0, 0, 0};
3596 BYTE dst[10] = {0};
3597 DBSTATUS dst_status;
3598 VARIANT v;
3599 SAFEARRAY *psa = NULL;
3600 SAFEARRAYBOUND rgsabound[1];
3602 dst_len = 0;
3603 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_BYTES, sizeof(byte_src), &dst_len, byte_src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3604 ok(hr == S_OK, "got %08lx\n", hr);
3605 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3606 ok(dst_len == sizeof(byte_src), "got %Id\n", dst_len);
3607 ok(!memcmp(byte_src, dst, dst_len ), "bytes differ\n");
3609 dst_len = 0;
3610 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_BYTES, sizeof(byte_src), &dst_len, byte_src, &dst, 2, 0, &dst_status, 0, 0, 0);
3611 ok(hr == S_OK, "got %08lx\n", hr);
3612 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08lx\n", dst_status);
3613 ok(dst_len == sizeof(byte_src), "got %Id\n", dst_len);
3614 ok(!memcmp(byte_src, dst, 2 ), "bytes differ\n");
3616 V_VT(&v) = VT_NULL;
3617 dst_len = 77;
3618 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYTES, sizeof(v), &dst_len, &v, &dst, 2, 0, &dst_status, 0, 0, 0);
3619 ok(hr == S_OK, "got %08lx\n", hr);
3620 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
3621 ok(dst_len == 77, "got %Id\n", dst_len);
3623 dst_len = 0;
3624 rgsabound[0].lLbound = 0;
3625 rgsabound[0].cElements = 4;
3626 psa = SafeArrayCreate(VT_UI1,1,rgsabound);
3628 V_VT(&v) = VT_ARRAY|VT_UI1;
3629 V_ARRAY(&v) = psa;
3630 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYTES, sizeof(v), &dst_len, &v, &dst, 10, 0, &dst_status, 0, 0, 0);
3631 ok(hr == S_OK, "got 0x%08lx\n", hr);
3632 ok(dst_len == 4, "%Id\n", dst_len);
3633 ok(!memcmp(byte_dst, dst, dst_len), "bytes differ\n");
3634 VariantClear(&v);
3636 dst_len = 44;
3637 V_VT(&v) = VT_NULL;
3638 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYTES, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3639 ok(hr == S_OK, "got %08lx\n", hr);
3640 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
3641 ok(dst_len == 44, "got %Id\n", dst_len);
3645 static void test_converttobytesbyref(void)
3647 DBLENGTH dst_len;
3648 HRESULT hr;
3649 BYTE byte_src[] = {0, 1, 2, 4, 5};
3650 BYTE *dst;
3651 DBSTATUS dst_status;
3652 VARIANT v;
3654 VariantInit(&v);
3656 dst_len = 0;
3657 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_BYTES | DBTYPE_BYREF, sizeof(byte_src), &dst_len, byte_src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3658 ok(hr == S_OK, "got %08lx\n", hr);
3659 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3660 ok(dst_len == sizeof(byte_src), "got %Id\n", dst_len);
3661 ok(!memcmp(byte_src, dst, dst_len ), "bytes differ\n");
3662 CoTaskMemFree(dst);
3664 dst_len = 44;
3665 V_VT(&v) = VT_NULL;
3666 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BYTES | DBTYPE_BYREF, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3667 ok(hr == S_OK, "got %08lx\n", hr);
3668 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
3669 ok(dst_len == 44, "got %Id\n", dst_len);
3672 static void test_converttodbdate(void)
3674 DBLENGTH dst_len;
3675 HRESULT hr;
3676 static const WCHAR strW[] = {'2','0','1','3','-','0','5','-','1','4',0};
3677 DBDATE ts = {2013, 5, 14};
3678 DBDATE dst;
3679 DBSTATUS dst_status;
3680 VARIANT var;
3681 BSTR bstr;
3683 dst_len = 0;
3684 hr = IDataConvert_DataConvert(convert, DBTYPE_DBDATE, DBTYPE_DBDATE, sizeof(ts), &dst_len, &ts, &dst, 2, 0, &dst_status, 0, 0, 0);
3685 ok(hr == S_OK, "got %08lx\n", hr);
3686 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3687 ok(dst_len == sizeof(DBDATE), "got %Id\n", dst_len);
3688 ok(!memcmp(&ts, &dst, sizeof(DBDATE) ), "bytes differ\n");
3690 VariantInit(&var);
3691 V_VT(&var) = VT_DATE;
3692 V_DATE(&var) = 41408.086250;
3693 dst_len = 0;
3694 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DBDATE, sizeof(var), &dst_len, &var, &dst, 2, 0, &dst_status, 0, 0, 0);
3695 ok(hr == S_OK, "got %08lx\n", hr);
3696 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3697 ok(dst_len == sizeof(DBDATE), "got %Id\n", dst_len);
3698 ok(!memcmp(&ts, &dst, sizeof(DBDATE) ), "bytes differ\n");
3700 V_VT(&var) = VT_R8;
3701 V_R8(&var) = 41408.086250;
3702 dst_len = 0;
3703 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DBDATE, sizeof(var), &dst_len, &var, &dst, 2, 0, &dst_status, 0, 0, 0);
3704 ok(hr == S_OK, "got %08lx\n", hr);
3705 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3706 ok(dst_len == sizeof(DBDATE), "got %Id\n", dst_len);
3707 ok(!memcmp(&ts, &dst, sizeof(DBDATE) ), "bytes differ\n");
3709 V_VT(&var) = VT_BSTR;
3710 V_BSTR(&var) = SysAllocString(strW);
3711 dst_len = 0;
3712 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DBDATE, sizeof(var), &dst_len, &var, &dst, 2, 0, &dst_status, 0, 0, 0);
3713 ok(hr == S_OK, "got %08lx\n", hr);
3714 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3715 ok(dst_len == sizeof(DBDATE), "got %Id\n", dst_len);
3716 ok(!memcmp(&ts, &dst, sizeof(DBDATE) ), "bytes differ\n");
3717 VariantClear(&var);
3719 dst_len = 0;
3720 bstr = SysAllocString(strW);
3721 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_DBDATE, 0, &dst_len, &bstr, &dst, 2, 0, &dst_status, 0, 0, 0);
3722 ok(hr == S_OK, "got %08lx\n", hr);
3723 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3724 ok(dst_len == sizeof(DBDATE), "got %Id\n", dst_len);
3725 ok(!memcmp(&ts, &dst, sizeof(DBDATE) ), "bytes differ\n");
3726 SysFreeString(bstr);
3728 V_VT(&var) = VT_NULL;
3729 dst_len = 88;
3730 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DBDATE, sizeof(var), &dst_len, &var, &dst, 2, 0, &dst_status, 0, 0, 0);
3731 ok(hr == S_OK, "got %08lx\n", hr);
3732 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
3733 ok(dst_len == 88, "got %Id\n", dst_len);
3737 static void test_converttovar(void)
3739 static WCHAR strW[] = {'t','e','s','t',0};
3740 BYTE byte_src[5] = {1, 2, 3, 4, 5};
3741 DBTIMESTAMP ts = {2013, 5, 14, 2, 4, 12, 0};
3742 DBDATE dbdate = {2013, 5, 15};
3743 double dvalue = 123.56;
3744 DBSTATUS dst_status;
3745 DBLENGTH dst_len;
3746 VARIANT dst;
3747 HRESULT hr;
3748 CY cy, cy2;
3749 DATE date;
3750 INT i4;
3751 signed short i2;
3752 LARGE_INTEGER i8;
3753 VARIANT_BOOL boolean = VARIANT_TRUE;
3754 FLOAT fvalue = 543.21f;
3755 VARIANT var;
3757 VariantInit(&var);
3759 V_VT(&dst) = VT_EMPTY;
3760 dst_len = 0;
3761 dst_status = DBSTATUS_S_DEFAULT;
3762 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_VARIANT, sizeof(strW), &dst_len, strW, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3763 ok(hr == S_OK, "got %08lx\n", hr);
3764 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3765 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3766 ok(V_VT(&dst) == VT_BSTR, "got %d\n", V_VT(&dst));
3767 ok(!lstrcmpW(V_BSTR(&dst), strW), "got %s\n", wine_dbgstr_w(V_BSTR(&dst)));
3768 VariantClear(&dst);
3770 /* with null dest length and status */
3771 V_VT(&dst) = VT_EMPTY;
3772 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_VARIANT, sizeof(strW), NULL, strW, &dst, sizeof(dst), 0, NULL, 0, 0, 0);
3773 ok(hr == S_OK, "got %08lx\n", hr);
3774 ok(V_VT(&dst) == VT_BSTR, "got %d\n", V_VT(&dst));
3775 ok(!lstrcmpW(V_BSTR(&dst), strW), "got %s\n", wine_dbgstr_w(V_BSTR(&dst)));
3776 VariantClear(&dst);
3778 V_VT(&dst) = VT_EMPTY;
3779 dst_status = DBSTATUS_S_DEFAULT;
3780 i8.QuadPart = 12345;
3781 dst_len = 0x1234;
3782 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_VARIANT, sizeof(i8), &dst_len, &i8, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3783 ok(hr == S_OK, "got %08lx\n", hr);
3784 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3785 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3786 ok(V_VT(&dst) == VT_DECIMAL, "got %d\n", V_VT(&dst));
3787 ok(S(U(V_DECIMAL(&dst))).scale == 0 && S(U(V_DECIMAL(&dst))).sign == 0 &&
3788 V_DECIMAL(&dst).Hi32 == 0 && U1(V_DECIMAL(&dst)).Lo64 == 12345, "Not Equal\n");
3790 V_VT(&dst) = VT_EMPTY;
3791 dst_len = 0;
3792 dst_status = DBSTATUS_S_DEFAULT;
3793 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_VARIANT, sizeof(fvalue), &dst_len, &fvalue, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3794 ok(hr == S_OK, "got %08lx\n", hr);
3795 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3796 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3797 ok(V_VT(&dst) == VT_R4, "got %d\n", V_VT(&dst));
3798 ok(V_R4(&dst) == 543.21f, "got %f\n", V_R4(&dst));
3800 V_VT(&dst) = VT_EMPTY;
3801 dst_len = 0;
3802 dst_status = DBSTATUS_S_DEFAULT;
3803 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_VARIANT, sizeof(dvalue), &dst_len, &dvalue, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3804 ok(hr == S_OK, "got %08lx\n", hr);
3805 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3806 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3807 ok(V_VT(&dst) == VT_R8, "got %d\n", V_VT(&dst));
3808 ok(V_R8(&dst) == 123.56, "got %f\n", V_R8(&dst));
3810 V_VT(&dst) = VT_EMPTY;
3811 dst_len = 0;
3812 dst_status = DBSTATUS_S_DEFAULT;
3813 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_VARIANT, sizeof(boolean), &dst_len, &boolean, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3814 ok(hr == S_OK, "got %08lx\n", hr);
3815 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3816 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3817 ok(V_VT(&dst) == VT_BOOL, "got %d\n", V_VT(&dst));
3818 ok(V_BOOL(&dst) == VARIANT_TRUE, "got %d\n", V_BOOL(&dst));
3820 V_VT(&dst) = VT_EMPTY;
3821 dst_len = 0;
3822 dst_status = DBSTATUS_S_DEFAULT;
3823 i4 = 123;
3824 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_VARIANT, sizeof(i4), &dst_len, &i4, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3825 ok(hr == S_OK, "got %08lx\n", hr);
3826 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3827 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3828 ok(V_VT(&dst) == VT_I4, "got %d\n", V_VT(&dst));
3829 ok(V_I4(&dst) == 123, "got %ld\n", V_I4(&dst));
3831 V_VT(&dst) = VT_EMPTY;
3832 dst_len = 0;
3833 dst_status = DBSTATUS_S_DEFAULT;
3834 i2 = 123;
3835 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_VARIANT, sizeof(i2), &dst_len, &i2, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3836 ok(hr == S_OK, "got %08lx\n", hr);
3837 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3838 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3839 ok(V_VT(&dst) == VT_I2, "got %d\n", V_VT(&dst));
3840 ok(V_I2(&dst) == 123, "got %d\n", V_I2(&dst));
3842 V_VT(&dst) = VT_EMPTY;
3843 dst_len = 0;
3844 dst_status = DBSTATUS_S_DEFAULT;
3845 date = 123.123;
3846 hr = IDataConvert_DataConvert(convert, DBTYPE_DATE, DBTYPE_VARIANT, sizeof(date), &dst_len, &date, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3847 ok(hr == S_OK, "got %08lx\n", hr);
3848 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3849 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3850 ok(V_VT(&dst) == VT_DATE, "got %d\n", V_VT(&dst));
3851 ok(V_DATE(&dst) == 123.123, "got %f\n", V_DATE(&dst));
3853 V_VT(&dst) = VT_EMPTY;
3854 dst_len = 0;
3855 dst_status = DBSTATUS_S_DEFAULT;
3856 S(cy).Lo = 1;
3857 S(cy).Hi = 2;
3858 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_VARIANT, sizeof(cy), &dst_len, &cy, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3859 ok(hr == S_OK, "got %08lx\n", hr);
3860 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3861 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3862 ok(V_VT(&dst) == VT_CY, "got %d\n", V_VT(&dst));
3864 cy2 = V_CY(&dst);
3865 ok(S(cy2).Lo == S(cy).Lo && S(cy2).Hi == S(cy).Hi, "got %ld,%ld\n", S(cy2).Lo, S(cy2).Hi);
3867 dst_len = 0x1234;
3868 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_VARIANT, sizeof(byte_src), &dst_len, &byte_src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3869 ok(hr == S_OK, "got %08lx\n", hr);
3870 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3871 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3872 ok(V_VT(&dst) == (VT_ARRAY|VT_UI1), "got %d\n", V_VT(&dst));
3873 if(V_VT(&dst) == (VT_ARRAY|VT_UI1))
3875 LONG l;
3877 hr = SafeArrayGetUBound(V_ARRAY(&dst), 1, &l);
3878 ok(hr == S_OK, "got %08lx\n", hr);
3879 ok(l == 4, "got %ld\n", l); /* 5 elements */
3881 VariantClear(&dst);
3883 dst_len = 0x1234;
3884 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_VARIANT, 0, &dst_len, &byte_src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3885 ok(hr == S_OK, "got %08lx\n", hr);
3886 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3887 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3888 ok(V_VT(&dst) == (VT_ARRAY|VT_UI1), "got %d\n", V_VT(&dst));
3889 if(V_VT(&dst) == (VT_ARRAY|VT_UI1))
3891 LONG l;
3893 hr = SafeArrayGetUBound(V_ARRAY(&dst), 1, &l);
3894 ok(hr == S_OK, "got %08lx\n", hr);
3895 ok(l == -1, "got %ld\n", l); /* 0 elements */
3897 VariantClear(&dst);
3899 dst_len = 0x1234;
3900 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_VARIANT, 2, &dst_len, &byte_src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3901 ok(hr == S_OK, "got %08lx\n", hr);
3902 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3903 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3904 ok(V_VT(&dst) == (VT_ARRAY|VT_UI1), "got %d\n", V_VT(&dst));
3905 if(V_VT(&dst) == (VT_ARRAY|VT_UI1))
3907 LONG l;
3909 hr = SafeArrayGetUBound(V_ARRAY(&dst), 1, &l);
3910 ok(hr == S_OK, "got %08lx\n", hr);
3911 ok(l == 1, "got %ld\n", l); /* 2 elements */
3913 VariantClear(&dst);
3915 dst_len = 0x1234;
3916 hr = IDataConvert_DataConvert(convert, DBTYPE_DBTIMESTAMP, DBTYPE_VARIANT, 0, &dst_len, &ts, &dst, sizeof(ts), 0, &dst_status, 0, 0, 0);
3917 ok(hr == S_OK, "got %08lx\n", hr);
3918 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3919 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3920 ok(V_VT(&dst) == VT_DATE, "got %d\n", V_VT(&dst));
3921 ok( (float)V_DATE(&dst) == 41408.086250f, "got %f\n", V_DATE(&dst));
3923 dst_len = 0x1234;
3924 hr = IDataConvert_DataConvert(convert, DBTYPE_DBDATE, DBTYPE_VARIANT, 0, &dst_len, &dbdate, &dst, sizeof(dbdate), 0, &dst_status, 0, 0, 0);
3925 ok(hr == S_OK, "got %08lx\n", hr);
3926 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3927 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3928 ok(V_VT(&dst) == VT_DATE, "got %d\n", V_VT(&dst));
3929 ok( (float)V_DATE(&dst) == 41409.0, "got %f\n", V_DATE(&dst));
3931 /* src_status = DBSTATUS_S_ISNULL */
3932 i4 = 123;
3933 dst_len = 99;
3934 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_VARIANT, sizeof(i4), &dst_len, &i4, &dst, sizeof(dst), DBSTATUS_S_ISNULL, &dst_status, 0, 0, 0);
3935 ok(hr == S_OK, "got %08lx\n", hr);
3936 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
3937 ok(dst_len == 0, "got %Id\n", dst_len);
3939 dst_len = 44;
3940 V_VT(&var) = VT_NULL;
3941 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_VARIANT, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3942 ok(hr == S_OK, "got %08lx\n", hr);
3943 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
3944 ok(dst_len == sizeof(VARIANT), "got %Id\n", dst_len);
3948 static void test_converttotimestamp(void)
3950 static const WCHAR strW[] = {'2','0','1','3','-','0','5','-','1','4',' ','0','2',':','0','4',':','1','2',0};
3951 static const WCHAR strFullW[] = {'2','0','1','3','-','0','5','-','1','4',' ','0','2',':','0','4',':','1','2',
3952 '.','0','1','7','0','0','0','0','0','0',0};
3953 DBTIMESTAMP ts = {2013, 5, 14, 2, 4, 12, 0};
3954 DBTIMESTAMP ts1 = {2013, 5, 14, 2, 4, 12, 17000000};
3955 DATE date;
3956 DBTIMESTAMP dst;
3957 DBSTATUS dst_status;
3958 DBLENGTH dst_len;
3959 VARIANT var;
3960 HRESULT hr;
3961 BSTR bstr;
3963 VariantInit(&var);
3964 V_VT(&var) = VT_DATE;
3965 V_DATE(&var) = 41408.086250;
3966 dst_len = 0x1234;
3967 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DBTIMESTAMP, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3968 ok(hr == S_OK, "got %08lx\n", hr);
3969 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3970 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3971 ok(!memcmp(&ts, &dst, sizeof(ts)), "Wrong timestamp\n");
3973 bstr = SysAllocString(strW);
3974 dst_len = 0x1234;
3975 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_DBTIMESTAMP, 0, &dst_len, &bstr, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3976 ok(hr == S_OK, "got %08lx\n", hr);
3977 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3978 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3979 ok(!memcmp(&ts, &dst, sizeof(ts)), "Wrong timestamp\n");
3980 SysFreeString(bstr);
3982 bstr = SysAllocString(strFullW);
3983 dst_len = 0x1234;
3984 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_DBTIMESTAMP, 0, &dst_len, &bstr, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3985 ok(hr == S_OK, "got %08lx\n", hr);
3986 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3987 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3988 ok(!memcmp(&ts1, &dst, sizeof(ts1)), "Wrong timestamp\n");
3989 SysFreeString(bstr);
3991 bstr = SysAllocString(L"2013-05-14 02:04:12.017000000");
3992 dst_len = 0x1234;
3993 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_DBTIMESTAMP, 0, &dst_len, &bstr, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
3994 ok(hr == S_OK, "got %08lx\n", hr);
3995 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
3996 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
3997 ok(!memcmp(&ts1, &dst, sizeof(ts1)), "Wrong timestamp\n");
3998 SysFreeString(bstr);
4000 bstr = SysAllocString(L"2013/05/14 02:04:12.01700");
4001 dst_len = 0x1234;
4002 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_DBTIMESTAMP, 0, &dst_len, &bstr, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4003 ok(hr == DISP_E_TYPEMISMATCH, "got %08lx\n", hr);
4004 ok(dst_status == DBSTATUS_E_CANTCONVERTVALUE, "got %08lx\n", dst_status);
4005 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4006 SysFreeString(bstr);
4008 V_VT(&var) = VT_NULL;
4009 dst_len = 77;
4010 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DBTIMESTAMP, sizeof(var), &dst_len, &var, &dst, 2, 0, &dst_status, 0, 0, 0);
4011 ok(hr == S_OK, "got %08lx\n", hr);
4012 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
4013 ok(dst_len == 77, "got %Id\n", dst_len);
4015 dst_len = 0x1234;
4016 date = 41408.086250;
4017 hr = IDataConvert_DataConvert(convert, DBTYPE_DATE, DBTYPE_DBTIMESTAMP, 0, &dst_len, &date, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4018 ok(hr == S_OK, "got %08lx\n", hr);
4019 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4020 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4021 ok(!memcmp(&ts, &dst, sizeof(ts)), "Wrong timestamp\n");
4024 static void test_converttoiunknown(void)
4026 HRESULT hr;
4027 DBSTATUS dst_status;
4028 DBLENGTH dst_len;
4029 IUnknown *dst = NULL;
4030 static WCHAR strW[] = {'t','e','s','t',0};
4031 VARIANT var;
4033 VariantInit(&var);
4035 dst_len = 0x1234;
4036 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_IUNKNOWN, sizeof(strW), &dst_len, strW, dst, sizeof(dst), DBSTATUS_S_ISNULL, &dst_status, 0, 0, 0);
4037 ok(hr == S_OK, "got %08lx\n", hr);
4038 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
4039 ok(dst_len == 0, "got %Id\n", dst_len);
4041 dst_len = 44;
4042 V_VT(&var) = VT_NULL;
4043 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_IUNKNOWN, 0, &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4044 ok(hr == S_OK, "got %08lx\n", hr);
4045 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
4046 ok(dst_len == 44, "got %Id\n", dst_len);
4049 #define test_numeric_val(current, expected) _test_numeric_val(__LINE__, current, expected);
4050 static inline void _test_numeric_val(unsigned line, DB_NUMERIC *current, DB_NUMERIC *expected)
4052 int same = !memcmp(current, expected, sizeof(DB_NUMERIC));
4053 ok_(__FILE__,line) (same, "Invalid byte array\n");
4054 if(!same)
4056 int i;
4057 for(i=0; i < sizeof(current->val); i++)
4058 ok_(__FILE__,line) (current->val[i] == expected->val[i], " byte %d got 0x%02x expected 0x%02x\n", i, current->val[i], expected->val[i]);
4062 static void test_converttonumeric(void)
4064 HRESULT hr;
4065 DBSTATUS dst_status;
4066 DBLENGTH dst_len;
4067 DB_NUMERIC dst;
4068 static WCHAR strW[] = {'1','2','3','.','4','5',0};
4069 static WCHAR largeW[] = {'1','2','3','4','5','6','7','8','9','0',0};
4070 INT i;
4071 BSTR bstr;
4072 FLOAT fvalue = 543.21f;
4073 VARIANT_BOOL boolean = VARIANT_TRUE;
4074 VARIANT var;
4075 LARGE_INTEGER i8;
4076 DB_NUMERIC result1 = { 10, 0, 1, {0x02, 0x10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; /* 4098 */
4077 DB_NUMERIC result2 = { 10, 0, 1, {0x39, 0x30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; /* 12345 */
4078 DB_NUMERIC result3 = { 10, 0, 0, {0x01, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; /* -1 */
4079 DB_NUMERIC result4 = { 10, 0, 1, {0x1f, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; /* 543.21 */
4080 DB_NUMERIC result5 = { 10, 0, 1, {0x7b, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; /* 123.45 */
4081 DB_NUMERIC result6 = { 10, 0, 1, {0xd2, 0x02, 0x96, 0x49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} }; /* 123456789 */
4083 VariantInit(&var);
4085 i = 4098;
4086 dst_len = 0x1234;
4087 dst.scale = 30;
4088 memset(dst.val, 0xfe, sizeof(dst.val));
4089 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_NUMERIC, 0, &dst_len, &i, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
4090 todo_wine ok(hr == S_OK, "got %08lx\n", hr);
4091 todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4092 todo_wine ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4093 todo_wine test_numeric_val(&dst, &result1);
4095 i8.QuadPart = 12345;
4096 dst_len = 0x1234;
4097 dst.scale = 30;
4098 memset(dst.val, 0xfe, sizeof(dst.val));
4099 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_NUMERIC, sizeof(i8), &dst_len, &i8, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
4100 todo_wine ok(hr == S_OK, "got %08lx\n", hr);
4101 todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4102 todo_wine ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4103 todo_wine test_numeric_val(&dst, &result2);
4105 dst_len = 0x1234;
4106 dst.scale = 30;
4107 dst.sign = 1;
4108 memset(dst.val, 0xfe, sizeof(dst.val));
4109 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_NUMERIC, sizeof(boolean), &dst_len, &boolean, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
4110 todo_wine ok(hr == S_OK, "got %08lx\n", hr);
4111 todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4112 todo_wine ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4113 todo_wine test_numeric_val(&dst, &result3);
4115 dst_len = 0x1234;
4116 dst.scale = 30;
4117 dst.sign = 0;
4118 memset(dst.val, 0xfe, sizeof(dst.val));
4119 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_NUMERIC, sizeof(fvalue), &dst_len, &fvalue, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
4120 todo_wine ok(hr == S_OK, "got %08lx\n", hr);
4121 todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4122 todo_wine ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4123 todo_wine test_numeric_val(&dst, &result4);
4125 dst_len = 0x1234;
4126 dst.scale = 30;
4127 dst.sign = 0;
4128 memset(dst.val, 0xfe, sizeof(dst.val));
4129 V_VT(&var) = VT_NULL;
4130 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_NUMERIC, sizeof(var), &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
4131 ok(hr == S_OK, "got %08lx\n", hr);
4132 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
4134 dst_len = 0x1234;
4135 dst.scale = 30;
4136 dst.sign = 0;
4137 memset(dst.val, 0xfe, sizeof(dst.val));
4138 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_NUMERIC, sizeof(strW), &dst_len, strW, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
4139 todo_wine ok(hr == S_OK, "got %08lx\n", hr);
4140 todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4141 todo_wine ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4142 todo_wine test_numeric_val(&dst, &result5);
4144 bstr = SysAllocString(strW);
4145 dst_status = 0;
4146 dst.scale = 30;
4147 dst.sign = 0;
4148 dst_len = sizeof(strW);
4149 memset(dst.val, 0xfe, sizeof(dst.val));
4150 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_NUMERIC, 0, &dst_len, &bstr, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
4151 todo_wine ok(hr == S_OK, "got %08lx\n", hr);
4152 todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4153 todo_wine ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4154 todo_wine test_numeric_val(&dst, &result5);
4155 SysFreeString(bstr);
4157 bstr = SysAllocString(largeW);
4158 dst_status = 0;
4159 dst.scale = 30;
4160 dst.sign = 0;
4161 dst_len = sizeof(largeW);
4162 memset(dst.val, 0xfe, sizeof(dst.val));
4163 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_NUMERIC, 0, &dst_len, &bstr, &dst, sizeof(dst), 0, &dst_status, 10, 0, 0);
4164 todo_wine ok(hr == S_OK, "got %08lx\n", hr);
4165 todo_wine ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4166 todo_wine ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4167 todo_wine test_numeric_val(&dst, &result6);
4168 SysFreeString(bstr);
4171 static void test_converttodate(void)
4173 static const WCHAR strW[] = {'2','0','1','3','-','0','5','-','1','4',0};
4174 DBLENGTH dst_len;
4175 HRESULT hr;
4176 DATE dst, date = 41408.086250;
4177 DBSTATUS dst_status;
4178 VARIANT var;
4179 BSTR bstr;
4181 dst = 0.0;
4182 dst_len = 0;
4183 hr = IDataConvert_DataConvert(convert, DBTYPE_DATE, DBTYPE_DATE, sizeof(date), &dst_len, &date, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4184 ok(hr == S_OK, "got %08lx\n", hr);
4185 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4186 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4187 ok(dst == 41408.086250, "got %f\n", dst);
4189 VariantInit(&var);
4190 V_VT(&var) = VT_DATE;
4191 V_DATE(&var) = 41408.086250;
4192 dst = 0.0;
4193 dst_len = 0;
4194 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DATE, sizeof(var), &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4195 ok(hr == S_OK, "got %08lx\n", hr);
4196 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4197 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4198 ok(dst == 41408.086250, "got %f\n", dst);
4200 VariantInit(&var);
4201 V_VT(&var) = VT_R8;
4202 V_R8(&var) = 41408.086250;
4203 dst = 0.0;
4204 dst_len = 0;
4205 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DATE, sizeof(var), &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4206 ok(hr == S_OK, "got %08lx\n", hr);
4207 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4208 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4209 ok(dst == 41408.086250, "got %f\n", dst);
4211 VariantInit(&var);
4212 V_VT(&var) = VT_I4;
4213 V_I4(&var) = 41408;
4214 dst = 0.0;
4215 dst_len = 0;
4216 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DATE, sizeof(var), &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4217 ok(hr == S_OK, "got %08lx\n", hr);
4218 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4219 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4220 ok(dst == 41408.000000, "got %f\n", dst);
4222 V_VT(&var) = VT_BSTR;
4223 V_BSTR(&var) = SysAllocString(strW);
4224 dst = 0.0;
4225 dst_len = 0;
4226 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DATE, sizeof(var), &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4227 ok(hr == S_OK, "got %08lx\n", hr);
4228 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4229 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4230 ok(dst == 41408.000000, "got %f\n", dst);
4231 VariantClear(&var);
4233 dst = 0.0;
4234 dst_len = 0;
4235 bstr = SysAllocString(strW);
4236 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_DATE, 0, &dst_len, &bstr, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4237 ok(hr == S_OK, "got %08lx\n", hr);
4238 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4239 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4240 ok(dst == 41408.000000, "got %f\n", dst);
4241 SysFreeString(bstr);
4243 V_VT(&var) = VT_EMPTY;
4244 dst = 1.0;
4245 dst_len = 0;
4246 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DATE, sizeof(var), &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4247 ok(hr == S_OK, "got %08lx\n", hr);
4248 ok(dst_status == DBSTATUS_S_OK, "got %08lx\n", dst_status);
4249 ok(dst_len == sizeof(dst), "got %Id\n", dst_len);
4250 ok(dst == 0.0, "got %f\n", dst);
4252 V_VT(&var) = VT_NULL;
4253 dst = 1.0;
4254 dst_len = 0xdeadbeef;
4255 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_DATE, sizeof(var), &dst_len, &var, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
4256 ok(hr == S_OK, "got %08lx\n", hr);
4257 ok(dst_status == DBSTATUS_S_ISNULL, "got %08lx\n", dst_status);
4258 ok(dst_len == 0xdeadbeef, "got %Id\n", dst_len);
4259 ok(dst == 1.0, "got %f\n", dst);
4262 START_TEST(convert)
4264 HRESULT hr;
4266 OleInitialize(NULL);
4268 test_dcinfo();
4270 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
4271 if(FAILED(hr))
4273 win_skip("Unable to create IDataConvert instance, 0x%08lx\n", hr);
4274 OleUninitialize();
4275 return;
4278 test_canconvert();
4279 test_converttoi1();
4280 test_converttoi2();
4281 test_converttoi4();
4282 test_converttoi8();
4283 test_converttostr();
4284 test_converttobstr();
4285 test_converttowstr();
4286 test_converttobyrefwstr();
4287 test_converttobyrefstr();
4288 test_converttoguid();
4289 test_converttoui1();
4290 test_converttoui4();
4291 test_converttor4();
4292 test_converttor8();
4293 test_converttofiletime();
4294 test_converttocy();
4295 test_converttoui8();
4296 test_converttovar();
4297 test_converttobytes();
4298 test_converttobytesbyref();
4299 test_converttodbdate();
4300 test_getconversionsize();
4301 test_converttotimestamp();
4302 test_converttoiunknown();
4303 test_converttonumeric();
4304 test_converttodate();
4306 IDataConvert_Release(convert);
4308 OleUninitialize();