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
23 #define NONAMELESSUNION
24 #define NONAMELESSSTRUCT
36 #include "wine/test.h"
39 static void test_dcinfo(void)
46 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDCInfo, (void**)&info);
49 win_skip("Unable to load oledb conversion library\n");
53 types[0] = DCINFOTYPE_VERSION;
54 hr = IDCInfo_GetInfo(info, 1, types, &inf);
55 ok(hr == S_OK, "got %08x\n", hr);
57 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08x\n", inf->eInfoType);
58 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
59 ok(V_UI4(&inf->vData) == 0x110, "got %08x\n", V_UI4(&inf->vData));
61 V_UI4(&inf->vData) = 0x200;
62 hr = IDCInfo_SetInfo(info, 1, inf);
63 ok(hr == S_OK, "got %08x\n", hr);
66 hr = IDCInfo_GetInfo(info, 1, types, &inf);
67 ok(hr == S_OK, "got %08x\n", hr);
68 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08x\n", inf->eInfoType);
69 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
70 ok(V_UI4(&inf->vData) == 0x200, "got %08x\n", V_UI4(&inf->vData));
72 V_UI4(&inf->vData) = 0x100;
73 hr = IDCInfo_SetInfo(info, 1, inf);
74 ok(hr == S_OK, "got %08x\n", hr);
77 hr = IDCInfo_GetInfo(info, 1, types, &inf);
78 ok(hr == S_OK, "got %08x\n", hr);
79 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08x\n", inf->eInfoType);
80 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
81 ok(V_UI4(&inf->vData) == 0x100, "got %08x\n", V_UI4(&inf->vData));
83 V_UI4(&inf->vData) = 0x500;
84 hr = IDCInfo_SetInfo(info, 1, inf);
85 ok(hr == S_OK, "got %08x\n", hr);
88 hr = IDCInfo_GetInfo(info, 1, types, &inf);
89 ok(hr == S_OK, "got %08x\n", hr);
90 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08x\n", inf->eInfoType);
91 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
92 ok(V_UI4(&inf->vData) == 0x500, "got %08x\n", V_UI4(&inf->vData));
94 V_UI4(&inf->vData) = 0xffff;
95 hr = IDCInfo_SetInfo(info, 1, inf);
96 ok(hr == S_OK, "got %08x\n", hr);
99 hr = IDCInfo_GetInfo(info, 1, types, &inf);
100 ok(hr == S_OK, "got %08x\n", hr);
101 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08x\n", inf->eInfoType);
102 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
103 ok(V_UI4(&inf->vData) == 0xffff, "got %08x\n", V_UI4(&inf->vData));
105 V_UI4(&inf->vData) = 0x12345678;
106 hr = IDCInfo_SetInfo(info, 1, inf);
107 ok(hr == S_OK, "got %08x\n", hr);
110 hr = IDCInfo_GetInfo(info, 1, types, &inf);
111 ok(hr == S_OK, "got %08x\n", hr);
112 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08x\n", inf->eInfoType);
113 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
114 ok(V_UI4(&inf->vData) == 0x12345678, "got %08x\n", V_UI4(&inf->vData));
116 /* Try setting a version variant of something other than VT_UI4 */
117 V_VT(&inf->vData) = VT_I4;
118 V_I4(&inf->vData) = 0x200;
119 hr = IDCInfo_SetInfo(info, 1, inf);
120 ok(hr == DB_S_ERRORSOCCURRED, "got %08x\n", hr);
123 hr = IDCInfo_GetInfo(info, 1, types, &inf);
124 ok(hr == S_OK, "got %08x\n", hr);
125 ok(inf->eInfoType == DCINFOTYPE_VERSION, "got %08x\n", inf->eInfoType);
126 ok(V_VT(&inf->vData) == VT_UI4, "got %08x\n", V_VT(&inf->vData));
127 ok(V_UI4(&inf->vData) == 0x12345678, "got %08x\n", V_UI4(&inf->vData));
130 /* More than one type */
132 hr = IDCInfo_GetInfo(info, 2, types, &inf);
133 ok(hr == S_OK, "got %08x\n", hr);
134 ok(inf[0].eInfoType == DCINFOTYPE_VERSION, "got %08x\n", inf[0].eInfoType);
135 ok(V_VT(&inf[0].vData) == VT_UI4, "got %08x\n", V_VT(&inf[0].vData));
136 ok(V_UI4(&inf[0].vData) == 0x12345678, "got %08x\n", V_UI4(&inf[0].vData));
137 ok(inf[1].eInfoType == 2, "got %08x\n", inf[1].eInfoType);
138 ok(V_VT(&inf[1].vData) == VT_EMPTY, "got %08x\n", V_VT(&inf[1].vData));
140 hr = IDCInfo_SetInfo(info, 2, inf);
141 ok(hr == S_OK, "got %08x\n", hr);
145 IDCInfo_Release(info);
148 static const struct can_convert
151 DWORD can_convert_to;
154 {DBTYPE_EMPTY, 0x63bfd9ff},
155 {DBTYPE_NULL, 0x40001002},
156 {DBTYPE_I2, 0x3b9fd9ff},
157 {DBTYPE_I4, 0x3bdfd9ff},
159 {DBTYPE_R4, 0x3b9fd9ff},
160 {DBTYPE_R8, 0x3b9fd9ff},
161 {DBTYPE_CY, 0x039fd97f},
162 {DBTYPE_DATE, 0x799f99bf},
164 {DBTYPE_BSTR, 0x7bffd9ff},
165 {DBTYPE_IDISPATCH, 0x7bffffff},
166 {DBTYPE_ERROR, 0x01001500},
167 {DBTYPE_BOOL, 0x039fd9ff},
169 {DBTYPE_VARIANT, 0x7bffffff},
170 {DBTYPE_IUNKNOWN, 0x00003203},
171 {DBTYPE_DECIMAL, 0x3b9fd97f},
172 {DBTYPE_I1, 0x3b9fd9ff},
174 {DBTYPE_UI1, 0x3b9fd9ff},
175 {DBTYPE_UI2, 0x3b9fd9ff},
176 {DBTYPE_UI4, 0x3bdfd9ff},
177 {DBTYPE_I8, 0x43dfd97f},
179 {DBTYPE_UI8, 0x43dfd97f},
180 {DBTYPE_GUID, 0x01e01103},
181 {DBTYPE_BYTES, 0x01fc110b},
182 {DBTYPE_STR, 0x7bffd9ff},
184 {DBTYPE_WSTR, 0x7bffd9ff},
185 {DBTYPE_NUMERIC, 0x039fd97f},
186 {DBTYPE_UDT, 0x00000000},
187 {DBTYPE_DBDATE, 0x79801183},
189 {DBTYPE_DBTIME, 0x79801183},
190 {DBTYPE_DBTIMESTAMP, 0x79801183},
191 {DBTYPE_FILETIME, 0x79981183}
195 static inline BOOL array_type(DBTYPE type)
197 return (type >= DBTYPE_I2 && type <= DBTYPE_UI4);
200 static void test_canconvert(void)
202 IDataConvert *convert;
204 int src_idx, dst_idx;
206 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
209 win_skip("Unable to load oledb conversion library\n");
213 /* Some older versions of the library don't support several conversions, we'll skip
214 if we have such a library */
215 hr = IDataConvert_CanConvert(convert, DBTYPE_EMPTY, DBTYPE_DBTIMESTAMP);
218 win_skip("Doesn't handle DBTYPE_EMPTY -> DBTYPE_DBTIMESTAMP conversion so skipping\n");
219 IDataConvert_Release(convert);
223 /* Some older versions of the library don't support several conversions, we'll skip
224 if we have such a library */
225 hr = IDataConvert_CanConvert(convert, DBTYPE_EMPTY, DBTYPE_DBTIMESTAMP);
228 win_skip("Doesn't handle DBTYPE_EMPTY -> DBTYPE_DBTIMESTAMP conversion so skipping\n");
229 IDataConvert_Release(convert);
233 for(src_idx = 0; src_idx < sizeof(simple_convert) / sizeof(simple_convert[0]); src_idx++)
234 for(dst_idx = 0; dst_idx < sizeof(simple_convert) / sizeof(simple_convert[0]); dst_idx++)
236 BOOL expect, simple_expect;
237 simple_expect = (simple_convert[src_idx].can_convert_to >> dst_idx) & 1;
239 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type, simple_convert[dst_idx].type);
240 expect = simple_expect;
241 ok((hr == S_OK && expect == TRUE) ||
242 (hr == S_FALSE && expect == FALSE),
243 "%04x -> %04x: got %08x expect conversion to be %spossible\n", simple_convert[src_idx].type,
244 simple_convert[dst_idx].type, hr, expect ? "" : "not ");
246 /* src DBTYPE_BYREF */
247 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_BYREF, simple_convert[dst_idx].type);
248 expect = simple_expect;
249 ok((hr == S_OK && expect == TRUE) ||
250 (hr == S_FALSE && expect == FALSE),
251 "%04x -> %04x: got %08x expect conversion to be %spossible\n", simple_convert[src_idx].type | DBTYPE_BYREF,
252 simple_convert[dst_idx].type, hr, expect ? "" : "not ");
254 /* dst DBTYPE_BYREF */
255 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type, simple_convert[dst_idx].type | DBTYPE_BYREF);
258 (simple_convert[dst_idx].type == DBTYPE_BYTES ||
259 simple_convert[dst_idx].type == DBTYPE_STR ||
260 simple_convert[dst_idx].type == DBTYPE_WSTR))
262 ok((hr == S_OK && expect == TRUE) ||
263 (hr == S_FALSE && expect == FALSE),
264 "%04x -> %04x: got %08x expect conversion to be %spossible\n", simple_convert[src_idx].type,
265 simple_convert[dst_idx].type | DBTYPE_BYREF, hr, expect ? "" : "not ");
267 /* src & dst DBTYPE_BYREF */
268 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_BYREF, simple_convert[dst_idx].type | DBTYPE_BYREF);
271 (simple_convert[dst_idx].type == DBTYPE_BYTES ||
272 simple_convert[dst_idx].type == DBTYPE_STR ||
273 simple_convert[dst_idx].type == DBTYPE_WSTR))
275 ok((hr == S_OK && expect == TRUE) ||
276 (hr == S_FALSE && expect == FALSE),
277 "%04x -> %04x: got %08x expect conversion to be %spossible\n", simple_convert[src_idx].type | DBTYPE_BYREF,
278 simple_convert[dst_idx].type | DBTYPE_BYREF, hr, expect ? "" : "not ");
280 /* src DBTYPE_ARRAY */
281 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_ARRAY, simple_convert[dst_idx].type);
283 if(array_type(simple_convert[src_idx].type) && simple_convert[dst_idx].type == DBTYPE_VARIANT)
285 ok((hr == S_OK && expect == TRUE) ||
286 (hr == S_FALSE && expect == FALSE),
287 "%04x -> %04x: got %08x expect conversion to be %spossible\n", simple_convert[src_idx].type | DBTYPE_ARRAY,
288 simple_convert[dst_idx].type, hr, expect ? "" : "not ");
290 /* dst DBTYPE_ARRAY */
291 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type, simple_convert[dst_idx].type | DBTYPE_ARRAY);
293 if(array_type(simple_convert[dst_idx].type) &&
294 (simple_convert[src_idx].type == DBTYPE_IDISPATCH ||
295 simple_convert[src_idx].type == DBTYPE_VARIANT))
297 ok((hr == S_OK && expect == TRUE) ||
298 (hr == S_FALSE && expect == FALSE),
299 "%04x -> %04x: got %08x expect conversion to be %spossible\n", simple_convert[src_idx].type,
300 simple_convert[dst_idx].type | DBTYPE_ARRAY, hr, expect ? "" : "not ");
302 /* src & dst DBTYPE_ARRAY */
303 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_ARRAY, simple_convert[dst_idx].type | DBTYPE_ARRAY);
305 if(array_type(simple_convert[src_idx].type) &&
306 simple_convert[src_idx].type == simple_convert[dst_idx].type)
308 ok((hr == S_OK && expect == TRUE) ||
309 (hr == S_FALSE && expect == FALSE),
310 "%04x -> %04x: got %08x expect conversion to be %spossible\n", simple_convert[src_idx].type | DBTYPE_ARRAY,
311 simple_convert[dst_idx].type | DBTYPE_ARRAY, hr, expect ? "" : "not ");
313 /* src DBTYPE_VECTOR */
314 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_VECTOR, simple_convert[dst_idx].type);
316 ok((hr == S_OK && expect == TRUE) ||
317 (hr == S_FALSE && expect == FALSE),
318 "%04x -> %04x: got %08x expect conversion to be %spossible\n", simple_convert[src_idx].type | DBTYPE_VECTOR,
319 simple_convert[dst_idx].type, hr, expect ? "" : "not ");
321 /* dst DBTYPE_VECTOR */
322 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type, simple_convert[dst_idx].type | DBTYPE_VECTOR);
324 ok((hr == S_OK && expect == TRUE) ||
325 (hr == S_FALSE && expect == FALSE),
326 "%04x -> %04x: got %08x expect conversion to be %spossible\n", simple_convert[src_idx].type,
327 simple_convert[dst_idx].type | DBTYPE_VECTOR, hr, expect ? "" : "not ");
329 /* src & dst DBTYPE_VECTOR */
330 hr = IDataConvert_CanConvert(convert, simple_convert[src_idx].type | DBTYPE_VECTOR, simple_convert[dst_idx].type | DBTYPE_VECTOR);
332 ok((hr == S_OK && expect == TRUE) ||
333 (hr == S_FALSE && expect == FALSE),
334 "%04x -> %04x: got %08x expect conversion to be %spossible\n", simple_convert[src_idx].type | DBTYPE_VECTOR,
335 simple_convert[dst_idx].type | DBTYPE_VECTOR, hr, expect ? "" : "not ");
340 IDataConvert_Release(convert);
343 static void test_converttoi2(void)
345 IDataConvert *convert;
351 static const WCHAR ten[] = {'1','0',0};
354 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
357 win_skip("Unable to load oledb conversion library\n");
361 dst_len = dst = 0x1234;
362 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
363 ok(hr == S_OK, "got %08x\n", hr);
364 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
365 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
366 ok(dst == 0, "got %08x\n", dst);
368 dst_len = dst = 0x1234;
369 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
370 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
371 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
372 ok(dst_len == 0x1234, "got %ld\n", dst_len);
373 ok(dst == 0x1234, "got %08x\n", dst);
375 dst_len = dst = 0x1234;
376 *(short *)src = 0x4321;
377 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
378 ok(hr == S_OK, "got %08x\n", hr);
379 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
380 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
381 ok(dst == 0x4321, "got %08x\n", dst);
383 dst_len = dst = 0x1234;
384 *(int *)src = 0x4321cafe;
385 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
387 ok(hr == DB_E_DATAOVERFLOW, "got %08x\n", hr);
388 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
389 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
390 ok(dst == 0x1234, "got %08x\n", dst);
392 dst_len = dst = 0x1234;
393 *(int *)src = 0x4321;
394 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
395 ok(hr == S_OK, "got %08x\n", hr);
396 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
397 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
398 ok(dst == 0x4321, "got %08x\n", dst);
400 dst_len = dst = 0x1234;
401 *(FLOAT *)src = 10.75;
402 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
403 ok(hr == S_OK, "got %08x\n", hr);
404 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
405 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
406 ok(dst == 11, "got %08x\n", dst);
408 dst_len = dst = 0x1234;
409 *(FLOAT *)src = -10.75;
410 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
411 ok(hr == S_OK, "got %08x\n", hr);
412 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
413 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
414 ok(dst == -11, "got %08x\n", dst);
416 dst_len = dst = 0x1234;
417 *(double *)src = 10.75;
418 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
419 ok(hr == S_OK, "got %08x\n", hr);
420 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
421 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
422 ok(dst == 11, "got %08x\n", dst);
424 dst_len = dst = 0x1234;
425 ((LARGE_INTEGER *)src)->QuadPart = 107500;
426 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
427 ok(hr == S_OK, "got %08x\n", hr);
428 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
429 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
430 ok(dst == 11, "got %08x\n", dst);
432 dst_len = dst = 0x1234;
433 *(DATE *)src = 10.7500;
434 hr = IDataConvert_DataConvert(convert, DBTYPE_DATE, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
435 ok(hr == S_OK, "got %08x\n", hr);
436 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
437 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
438 ok(dst == 11, "got %08x\n", dst);
440 dst_len = dst = 0x1234;
441 b = SysAllocString(ten);
443 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
444 ok(hr == S_OK, "got %08x\n", hr);
445 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
446 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
447 ok(dst == 10, "got %08x\n", dst);
450 dst_len = dst = 0x1234;
451 *(SCODE *)src = 0x4321cafe;
452 hr = IDataConvert_DataConvert(convert, DBTYPE_ERROR, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
453 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
454 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
455 ok(dst_len == 0x1234, "got %ld\n", dst_len);
456 ok(dst == 0x1234, "got %08x\n", dst);
458 dst_len = dst = 0x1234;
459 *(VARIANT_BOOL *)src = VARIANT_TRUE;
460 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
461 ok(hr == S_OK, "got %08x\n", hr);
462 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
463 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
464 ok(dst == -1, "got %08x\n", dst);
466 dst_len = dst = 0x1234;
467 *(VARIANT_BOOL *)src = VARIANT_FALSE;
468 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
469 ok(hr == S_OK, "got %08x\n", hr);
470 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
471 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
472 ok(dst == 0, "got %08x\n", dst);
474 dst_len = dst = 0x1234;
475 V_VT((VARIANT*)src) = VT_I2;
476 V_I2((VARIANT*)src) = 0x4321;
477 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
478 ok(hr == S_OK, "got %08x\n", hr);
479 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
480 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
481 ok(dst == 0x4321, "got %08x\n", dst);
483 dst_len = dst = 0x1234;
484 memset(src, 0, sizeof(DECIMAL));
485 ((DECIMAL*)src)->u1.Lo64 = 0x4321;
486 hr = IDataConvert_DataConvert(convert, DBTYPE_DECIMAL, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
487 ok(hr == S_OK, "got %08x\n", hr);
488 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
489 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
490 ok(dst == 0x4321, "got %08x\n", dst);
492 dst_len = dst = 0x1234;
493 *(signed char*)src = 0xab;
494 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
495 ok(hr == S_OK, "got %08x\n", hr);
496 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
497 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
498 ok(dst == (signed short)0xffab, "got %08x\n", dst);
500 dst_len = dst = 0x1234;
502 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
503 ok(hr == S_OK, "got %08x\n", hr);
504 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
505 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
506 ok(dst == 0xab, "got %08x\n", dst);
508 dst_len = dst = 0x1234;
509 *(WORD*)src = 0x4321;
510 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
511 ok(hr == S_OK, "got %08x\n", hr);
512 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
513 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
514 ok(dst == 0x4321, "got %08x\n", dst);
516 dst_len = dst = 0x1234;
517 *(WORD*)src = 0xabcd;
518 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
519 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
520 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
522 ok(broken(dst_len == sizeof(dst)) || dst_len == 0x1234 /* W2K+ */, "got %ld\n", dst_len);
523 ok(dst == 0x1234, "got %08x\n", dst);
525 dst_len = dst = 0x1234;
526 *(DWORD*)src = 0xabcd1234;
527 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
529 ok(hr == DB_E_DATAOVERFLOW, "got %08x\n", hr);
530 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
531 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
532 ok(dst == 0x1234, "got %08x\n", dst);
534 dst_len = dst = 0x1234;
535 *(DWORD*)src = 0x1234abcd;
536 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
538 ok(hr == DB_E_DATAOVERFLOW, "got %08x\n", hr);
539 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
540 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
541 ok(dst == 0x1234, "got %08x\n", dst);
543 dst_len = dst = 0x1234;
544 *(DWORD*)src = 0x4321;
545 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
546 ok(hr == S_OK, "got %08x\n", hr);
547 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
548 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
549 ok(dst == 0x4321, "got %08x\n", dst);
551 dst_len = dst = 0x1234;
552 ((LARGE_INTEGER*)src)->QuadPart = 0x1234abcd;
553 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
554 ok(hr == DB_E_ERRORSOCCURRED ||
555 broken(hr == DB_E_UNSUPPORTEDCONVERSION), /* win98 */
557 if(hr != DB_E_UNSUPPORTEDCONVERSION) /* win98 doesn't support I8/UI8 */
559 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
560 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
561 ok(dst == 0x1234, "got %08x\n", dst);
563 dst_len = dst = 0x1234;
564 ((LARGE_INTEGER*)src)->QuadPart = 0x4321;
565 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
566 ok(hr == S_OK, "got %08x\n", hr);
567 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
568 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
569 ok(dst == 0x4321, "got %08x\n", dst);
571 dst_len = dst = 0x1234;
572 ((ULARGE_INTEGER*)src)->QuadPart = 0x4321;
573 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
574 ok(hr == S_OK, "got %08x\n", hr);
575 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
576 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
577 ok(dst == 0x4321, "got %08x\n", dst);
580 dst_len = dst = 0x1234;
581 strcpy((char *)src, "10");
582 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I2, 2, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
583 ok(hr == S_OK, "got %08x\n", hr);
584 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
585 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
586 ok(dst == 10, "got %08x\n", dst);
588 dst_len = dst = 0x1234;
589 strcpy((char *)src, "10");
590 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
591 ok(hr == S_OK, "got %08x\n", hr);
592 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
593 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
594 ok(dst == 10, "got %08x\n", dst);
596 dst_len = dst = 0x1234;
597 memcpy(src, ten, sizeof(ten));
598 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I2, 4, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
599 ok(hr == S_OK, "got %08x\n", hr);
600 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
601 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
602 ok(dst == 10, "got %08x\n", dst);
604 dst_len = dst = 0x1234;
605 memcpy(src, ten, sizeof(ten));
606 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
607 ok(hr == S_OK, "got %08x\n", hr);
608 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
609 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
610 ok(dst == 10, "got %08x\n", dst);
613 dst_len = dst = 0x1234;
614 *(WORD*)src = 0x4321;
615 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_UI2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
616 ok(hr == S_OK, "got %08x\n", hr);
617 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
618 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
619 ok(dst == 0x4321, "got %08x\n", dst);
621 dst_len = dst = 0x1234;
622 *(DWORD*)src = 0xabcd1234;
623 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
625 ok(hr == DB_E_DATAOVERFLOW, "got %08x\n", hr);
626 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
627 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
628 ok(dst == 0x1234, "got %08x\n", dst);
630 dst_len = dst = 0x1234;
631 *(DWORD*)src = 0x1234abcd;
632 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
634 ok(hr == DB_E_DATAOVERFLOW, "got %08x\n", hr);
635 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
636 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
637 ok(dst == 0x1234, "got %08x\n", dst);
639 dst_len = dst = 0x1234;
640 *(DWORD*)src = 0x4321;
641 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
642 ok(hr == S_OK, "got %08x\n", hr);
643 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
644 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
645 ok(dst == 0x4321, "got %08x\n", dst);
647 dst_len = dst = 0x1234;
648 memcpy(src, ten, sizeof(ten));
649 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_UI2, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
650 ok(hr == S_OK, "got %08x\n", hr);
651 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
652 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
653 ok(dst == 10, "got %08x\n", dst);
655 IDataConvert_Release(convert);
658 static void test_converttoi4(void)
660 IDataConvert *convert;
666 static const WCHAR ten[] = {'1','0',0};
669 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
672 win_skip("Unable to load oledb conversion library\n");
678 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
679 ok(hr == S_OK, "got %08x\n", hr);
680 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
681 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
682 ok(i4 == 0, "got %08x\n", i4);
686 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
687 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
688 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
689 ok(dst_len == 0x1234, "got %ld\n", dst_len);
690 ok(i4 == 0x12345678, "got %08x\n", i4);
693 *(short *)src = 0x4321;
695 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
696 ok(hr == S_OK, "got %08x\n", hr);
697 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
698 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
699 ok(i4 == 0x4321, "got %08x\n", i4);
702 *(int *)src = 0x4321cafe;
704 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
705 ok(hr == S_OK, "got %08x\n", hr);
706 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
707 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
708 ok(i4 == 0x4321cafe, "got %08x\n", i4);
711 *(FLOAT *)src = 10.75;
712 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
713 ok(hr == S_OK, "got %08x\n", hr);
714 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
715 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
716 ok(i4 == 11, "got %08x\n", i4);
719 *(FLOAT *)src = -10.75;
721 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
722 ok(hr == S_OK, "got %08x\n", hr);
723 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
724 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
725 ok(i4 == -11, "got %08x\n", i4);
728 *(double *)src = 10.75;
730 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
731 ok(hr == S_OK, "got %08x\n", hr);
732 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
733 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
734 ok(i4 == 11, "got %08x\n", i4);
737 ((LARGE_INTEGER *)src)->QuadPart = 107500;
739 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
740 ok(hr == S_OK, "got %08x\n", hr);
741 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
742 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
743 ok(i4 == 11, "got %08x\n", i4);
746 *(DATE *)src = 10.7500;
748 hr = IDataConvert_DataConvert(convert, DBTYPE_DATE, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
749 ok(hr == S_OK, "got %08x\n", hr);
750 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
751 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
752 ok(i4 == 11, "got %08x\n", i4);
755 b = SysAllocString(ten);
758 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
759 ok(hr == S_OK, "got %08x\n", hr);
760 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
761 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
762 ok(i4 == 10, "got %08x\n", i4);
766 *(SCODE *)src = 0x4321cafe;
768 hr = IDataConvert_DataConvert(convert, DBTYPE_ERROR, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
769 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
770 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
771 ok(dst_len == 0x1234, "got %ld\n", dst_len);
772 ok(i4 == 0x12345678, "got %08x\n", i4);
775 *(VARIANT_BOOL *)src = VARIANT_TRUE;
777 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
778 ok(hr == S_OK, "got %08x\n", hr);
779 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
780 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
781 ok(i4 == 0xffffffff, "got %08x\n", i4);
784 *(VARIANT_BOOL *)src = VARIANT_FALSE;
786 hr = IDataConvert_DataConvert(convert, DBTYPE_BOOL, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
787 ok(hr == S_OK, "got %08x\n", hr);
788 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
789 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
790 ok(i4 == 0, "got %08x\n", i4);
793 V_VT((VARIANT*)src) = VT_I2;
794 V_I2((VARIANT*)src) = 0x1234;
796 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
797 ok(hr == S_OK, "got %08x\n", hr);
798 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
799 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
800 ok(i4 == 0x1234, "got %08x\n", i4);
803 memset(src, 0, sizeof(DECIMAL));
804 ((DECIMAL*)src)->u1.Lo64 = 0x1234;
806 hr = IDataConvert_DataConvert(convert, DBTYPE_DECIMAL, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
807 ok(hr == S_OK, "got %08x\n", hr);
808 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
809 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
810 ok(i4 == 0x1234, "got %08x\n", i4);
813 *(signed char*)src = 0xab;
815 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
816 ok(hr == S_OK, "got %08x\n", hr);
817 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
818 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
819 ok(i4 == 0xffffffab, "got %08x\n", i4);
824 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
825 ok(hr == S_OK, "got %08x\n", hr);
826 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
827 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
828 ok(i4 == 0xab, "got %08x\n", i4);
831 *(WORD*)src = 0xabcd;
833 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
834 ok(hr == S_OK, "got %08x\n", hr);
835 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
836 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
837 ok(i4 == 0xabcd, "got %08x\n", i4);
840 *(DWORD*)src = 0xabcd1234;
842 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
843 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
844 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
846 ok(broken(dst_len == sizeof(i4)) || dst_len == 0x1234 /* W2K+ */, "got %ld\n", dst_len);
847 ok(i4 == 0x12345678, "got %08x\n", i4);
850 *(DWORD*)src = 0x1234abcd;
852 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
853 ok(hr == S_OK, "got %08x\n", hr);
854 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
855 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
856 ok(i4 == 0x1234abcd, "got %08x\n", i4);
859 ((LARGE_INTEGER*)src)->QuadPart = 0x1234abcd;
861 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
863 broken(hr == DB_E_UNSUPPORTEDCONVERSION), /* win98 */
865 if(hr != DB_E_UNSUPPORTEDCONVERSION) /* win98 doesn't support I8/UI8 */
867 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
868 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
869 ok(i4 == 0x1234abcd, "got %08x\n", i4);
872 ((ULARGE_INTEGER*)src)->QuadPart = 0x1234abcd;
874 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
875 ok(hr == S_OK, "got %08x\n", hr);
876 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
877 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
878 ok(i4 == 0x1234abcd, "got %08x\n", i4);
882 strcpy((char *)src, "10");
884 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I4, 2, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
885 ok(hr == S_OK, "got %08x\n", hr);
886 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
887 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
888 ok(i4 == 10, "got %08x\n", i4);
891 strcpy((char *)src, "10");
893 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
894 ok(hr == S_OK, "got %08x\n", hr);
895 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
896 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
897 ok(i4 == 10, "got %08x\n", i4);
900 memcpy(src, ten, sizeof(ten));
902 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I4, 4, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, 0);
903 ok(hr == S_OK, "got %08x\n", hr);
904 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
905 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
906 ok(i4 == 10, "got %08x\n", i4);
909 memcpy(src, ten, sizeof(ten));
911 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_I4, 0, &dst_len, src, &i4, sizeof(i4), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
912 ok(hr == S_OK, "got %08x\n", hr);
913 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
914 ok(dst_len == sizeof(i4), "got %ld\n", dst_len);
915 ok(i4 == 10, "got %08x\n", i4);
917 IDataConvert_Release(convert);
920 static void test_converttoi8(void)
922 IDataConvert *convert;
928 static const WCHAR ten[] = {'1','0',0};
931 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
934 win_skip("Unable to load oledb conversion library\n");
939 ((ULARGE_INTEGER*)src)->QuadPart = 1234;
941 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_I8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
942 ok(hr == S_OK, "got %08x\n", hr);
943 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
944 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
945 ok(dst.QuadPart == 1234, "got %d\n", (int)dst.QuadPart);
948 ((ULARGE_INTEGER*)src)->QuadPart = 1234;
949 b = SysAllocString(ten);
951 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_I8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
952 ok(hr == S_OK, "got %08x\n", hr);
953 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
954 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
955 ok(dst.QuadPart == 10, "got %d\n", (int)dst.QuadPart);
958 IDataConvert_Release(convert);
961 static void test_converttobstr(void)
963 IDataConvert *convert;
969 static const WCHAR ten[] = {'1','0',0};
973 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
976 win_skip("Unable to load oledb conversion library\n");
981 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
982 ok(hr == S_OK, "got %08x\n", hr);
983 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
984 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
985 ok(dst != NULL, "got %p\n", dst);
986 ok(SysStringLen(dst) == 0, "got %d\n", SysStringLen(dst));
990 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
991 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
992 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
993 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
994 ok(dst == (void*)0x1234, "got %p\n", dst);
996 *(short *)src = 4321;
997 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
998 ok(hr == S_OK, "got %08x\n", hr);
999 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1000 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
1001 ok(dst != NULL, "got %p\n", dst);
1002 ok(SysStringLen(dst) == 4, "got %d\n", SysStringLen(dst));
1005 b = SysAllocString(ten);
1007 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1008 ok(hr == S_OK, "got %08x\n", hr);
1009 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1010 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
1011 ok(dst != NULL, "got %p\n", dst);
1012 ok(dst != b, "got %p src %p\n", dst, b);
1013 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
1017 b = SysAllocString(ten);
1020 hr = IDataConvert_DataConvert(convert, DBTYPE_VARIANT, DBTYPE_BSTR, 0, &dst_len, &v, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1021 ok(hr == S_OK, "got %08x\n", hr);
1022 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1023 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
1024 ok(dst != NULL, "got %p\n", dst);
1025 ok(dst != b, "got %p src %p\n", dst, b);
1026 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
1030 IDataConvert_Release(convert);
1033 static void test_converttowstr(void)
1035 IDataConvert *convert;
1039 DBSTATUS dst_status;
1041 static const WCHAR ten[] = {'1','0',0};
1042 static const WCHAR fourthreetwoone[] = {'4','3','2','1',0};
1043 static const WCHAR guid_str[] = {
1044 '{','0','C','7','3','3','A','8','D','-','2','A','1','C','-','1','1','C','E','-',
1045 'A','D','E','5','-','0','0','A','A','0','0','4','4','7','7','3','D','}',0};
1046 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 };
1047 static const WCHAR hexpacked_w[] = {'W','i','n','e', 0 };
1050 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
1053 win_skip("Unable to load oledb conversion library\n");
1058 memset(dst, 0xcc, sizeof(dst));
1060 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1061 ok(hr == S_OK, "got %08x\n", hr);
1062 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1063 ok(dst_len == 0, "got %ld\n", dst_len);
1064 ok(dst[0] == 0, "got %02x\n", dst[0]);
1065 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1067 memset(dst, 0xcc, sizeof(dst));
1069 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1070 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
1071 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
1072 ok(dst_len == 0x1234, "got %ld\n", dst_len);
1073 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1075 *(short *)src = 4321;
1077 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1078 ok(hr == S_OK, "got %08x\n", hr);
1079 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1080 ok(dst_len == 8, "got %ld\n", dst_len);
1081 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1083 *(short *)src = 4321;
1084 memset(dst, 0xcc, sizeof(dst));
1086 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1087 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1088 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1089 ok(dst_len == 8, "got %ld\n", dst_len);
1090 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1092 *(short *)src = 4321;
1093 memset(dst, 0xcc, sizeof(dst));
1095 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1096 ok(hr == S_OK, "got %08x\n", hr);
1097 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1098 ok(dst_len == 8, "got %ld\n", dst_len);
1099 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1101 *(short *)src = 4321;
1102 memset(dst, 0xcc, sizeof(dst));
1104 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1105 ok(hr == S_OK, "got %08x\n", hr);
1106 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1107 ok(dst_len == 8, "got %ld\n", dst_len);
1108 ok(dst[0] == '4', "got %02x\n", dst[0]);
1109 ok(dst[1] == 0, "got %02x\n", dst[1]);
1110 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1112 *(short *)src = 4321;
1113 memset(dst, 0xcc, sizeof(dst));
1115 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1116 ok(hr == S_OK, "got %08x\n", hr);
1117 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1118 ok(dst_len == 8, "got %ld\n", dst_len);
1119 ok(dst[0] == 0, "got %02x\n", dst[0]);
1120 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1122 *(short *)src = 4321;
1123 memset(dst, 0xcc, sizeof(dst));
1125 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1126 ok(hr == S_OK, "got %08x\n", hr);
1127 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1128 ok(dst_len == 8, "got %ld\n", dst_len);
1129 ok(dst[0] == '4', "got %02x\n", dst[0]);
1130 ok(dst[1] == '3', "got %02x\n", dst[1]);
1131 ok(dst[2] == '2', "got %02x\n", dst[2]);
1132 ok(dst[3] == 0, "got %02x\n", dst[3]);
1133 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1139 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1140 ok(hr == S_OK, "got %08x\n", hr);
1141 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1142 ok(dst_len == 8, "got %ld\n", dst_len);
1143 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1146 memset(dst, 0xcc, sizeof(dst));
1148 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1149 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1150 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1151 ok(dst_len == 8, "got %ld\n", dst_len);
1152 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1155 memset(dst, 0xcc, sizeof(dst));
1156 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1157 ok(hr == S_OK, "got %08x\n", hr);
1158 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1159 ok(dst_len == 8, "got %ld\n", dst_len);
1160 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1163 memset(dst, 0xcc, sizeof(dst));
1165 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1166 ok(hr == S_OK, "got %08x\n", hr);
1167 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1168 ok(dst_len == 8, "got %ld\n", dst_len);
1169 ok(dst[0] == '4', "got %02x\n", dst[0]);
1170 ok(dst[1] == 0, "got %02x\n", dst[1]);
1171 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1174 memset(dst, 0xcc, sizeof(dst));
1176 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1177 ok(hr == S_OK, "got %08x\n", hr);
1178 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1179 ok(dst_len == 8, "got %ld\n", dst_len);
1180 ok(dst[0] == 0, "got %02x\n", dst[0]);
1181 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1184 memset(dst, 0xcc, sizeof(dst));
1186 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1187 ok(hr == S_OK, "got %08x\n", hr);
1188 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1189 ok(dst_len == 8, "got %ld\n", dst_len);
1190 ok(dst[0] == '4', "got %02x\n", dst[0]);
1191 ok(dst[1] == '3', "got %02x\n", dst[1]);
1192 ok(dst[2] == '2', "got %02x\n", dst[2]);
1193 ok(dst[3] == 0, "got %02x\n", dst[3]);
1194 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1198 *(float *)src = 4321;
1200 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1201 ok(hr == S_OK, "got %08x\n", hr);
1202 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1203 ok(dst_len == 8, "got %ld\n", dst_len);
1204 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1206 *(float *)src = 4321;
1207 memset(dst, 0xcc, sizeof(dst));
1209 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1210 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1211 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1212 ok(dst_len == 8, "got %ld\n", dst_len);
1213 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1215 *(float *)src = 4321;
1216 memset(dst, 0xcc, sizeof(dst));
1217 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1218 ok(hr == S_OK, "got %08x\n", hr);
1219 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1220 ok(dst_len == 8, "got %ld\n", dst_len);
1221 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1223 *(float *)src = 4321;
1224 memset(dst, 0xcc, sizeof(dst));
1226 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1227 ok(hr == S_OK, "got %08x\n", hr);
1228 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1229 ok(dst_len == 8, "got %ld\n", dst_len);
1230 ok(dst[0] == '4', "got %02x\n", dst[0]);
1231 ok(dst[1] == 0, "got %02x\n", dst[1]);
1232 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1234 *(float *)src = 4321;
1235 memset(dst, 0xcc, sizeof(dst));
1237 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1238 ok(hr == S_OK, "got %08x\n", hr);
1239 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1240 ok(dst_len == 8, "got %ld\n", dst_len);
1241 ok(dst[0] == 0, "got %02x\n", dst[0]);
1242 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1244 *(float *)src = 4321;
1245 memset(dst, 0xcc, sizeof(dst));
1247 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1248 ok(hr == S_OK, "got %08x\n", hr);
1249 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1250 ok(dst_len == 8, "got %ld\n", dst_len);
1251 ok(dst[0] == '4', "got %02x\n", dst[0]);
1252 ok(dst[1] == '3', "got %02x\n", dst[1]);
1253 ok(dst[2] == '2', "got %02x\n", dst[2]);
1254 ok(dst[3] == 0, "got %02x\n", dst[3]);
1255 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1259 *(double *)src = 4321;
1261 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1262 ok(hr == S_OK, "got %08x\n", hr);
1263 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1264 ok(dst_len == 8, "got %ld\n", dst_len);
1265 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1267 *(double *)src = 4321;
1268 memset(dst, 0xcc, sizeof(dst));
1269 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1270 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1271 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1272 ok(dst_len == 8, "got %ld\n", dst_len);
1273 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1275 *(double *)src = 4321;
1276 memset(dst, 0xcc, sizeof(dst));
1278 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1279 ok(hr == S_OK, "got %08x\n", hr);
1280 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1281 ok(dst_len == 8, "got %ld\n", dst_len);
1282 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1284 *(double *)src = 4321;
1285 memset(dst, 0xcc, sizeof(dst));
1287 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1288 ok(hr == S_OK, "got %08x\n", hr);
1289 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1290 ok(dst_len == 8, "got %ld\n", dst_len);
1291 ok(dst[0] == '4', "got %02x\n", dst[0]);
1292 ok(dst[1] == 0, "got %02x\n", dst[1]);
1293 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1295 *(double *)src = 4321;
1296 memset(dst, 0xcc, sizeof(dst));
1298 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1299 ok(hr == S_OK, "got %08x\n", hr);
1300 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1301 ok(dst_len == 8, "got %ld\n", dst_len);
1302 ok(dst[0] == 0, "got %02x\n", dst[0]);
1303 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1305 *(double *)src = 4321;
1306 memset(dst, 0xcc, sizeof(dst));
1308 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1309 ok(hr == S_OK, "got %08x\n", hr);
1310 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1311 ok(dst_len == 8, "got %ld\n", dst_len);
1312 ok(dst[0] == '4', "got %02x\n", dst[0]);
1313 ok(dst[1] == '3', "got %02x\n", dst[1]);
1314 ok(dst[2] == '2', "got %02x\n", dst[2]);
1315 ok(dst[3] == 0, "got %02x\n", dst[3]);
1316 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1320 memset(src, 0, sizeof(src));
1321 ((CY*)src)->int64 = 43210000;
1322 memset(dst, 0xcc, sizeof(dst));
1324 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1325 ok(hr == S_OK, "got %08x\n", hr);
1326 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1327 ok(dst_len == 8, "got %ld\n", dst_len);
1328 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1332 memset(src, 0, sizeof(src));
1333 *(signed char *)src = 10;
1335 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1336 ok(hr == S_OK, "got %08x\n", hr);
1337 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1338 ok(dst_len == 4, "got %ld\n", dst_len);
1339 ok(!lstrcmpW(dst, ten), "got %s\n", wine_dbgstr_w(dst));
1341 memset(src, 0, sizeof(src));
1342 *(unsigned char *)src = 10;
1344 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1345 ok(hr == S_OK, "got %08x\n", hr);
1346 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1347 ok(dst_len == 4, "got %ld\n", dst_len);
1348 ok(!lstrcmpW(dst, ten), "got %s\n", wine_dbgstr_w(dst));
1350 memset(src, 0, sizeof(src));
1351 *(unsigned short *)src = 4321;
1353 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1354 ok(hr == S_OK, "got %08x\n", hr);
1355 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1356 ok(dst_len == 8, "got %ld\n", dst_len);
1357 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1359 memset(src, 0, sizeof(src));
1360 *(unsigned int *)src = 4321;
1362 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1363 ok(hr == S_OK, "got %08x\n", hr);
1364 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1365 ok(dst_len == 8, "got %ld\n", dst_len);
1366 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1368 memset(src, 0, sizeof(src));
1369 ((LARGE_INTEGER*)src)->QuadPart = 4321;
1371 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1372 ok(broken(DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08x\n", hr);
1373 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08x\n", dst_status);
1374 ok(broken(dst_len == 0x1234) || dst_len == 8 /* W2K+ */, "got %ld\n", dst_len);
1375 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1377 memset(src, 0, sizeof(src));
1378 ((ULARGE_INTEGER*)src)->QuadPart = 4321;
1379 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1380 ok(broken(DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08x\n", hr);
1381 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08x\n", dst_status);
1382 ok(broken(dst_len == 0x1234) || dst_len == 8 /* W2K+ */, "got %ld\n", dst_len);
1383 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1387 memset(src, 0, sizeof(src));
1388 memcpy(src, &IID_IDataConvert, sizeof(GUID));
1389 memset(dst, 0xcc, sizeof(dst));
1391 hr = IDataConvert_DataConvert(convert, DBTYPE_GUID, DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1392 ok(hr == S_OK, "got %08x\n", hr);
1393 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1394 ok(dst_len == 76, "got %ld\n", dst_len);
1395 ok(!lstrcmpW(dst, guid_str), "got %s\n", wine_dbgstr_w(dst));
1399 b = SysAllocString(ten);
1402 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1403 ok(hr == S_OK, "got %08x\n", hr);
1404 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1405 ok(dst_len == 4, "got %ld\n", dst_len);
1406 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
1409 memcpy(src, ten, sizeof(ten));
1411 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_WSTR, 2, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1412 ok(hr == S_OK, "got %08x\n", hr);
1413 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1414 ok(dst_len == 2, "got %ld\n", dst_len);
1415 ok(dst[0] == '1', "got %02x\n", dst[0]);
1416 ok(dst[1] == 0, "got %02x\n", dst[1]);
1418 memcpy(src, ten, sizeof(ten));
1420 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_WSTR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1421 ok(hr == S_OK, "got %08x\n", hr);
1422 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1423 ok(dst_len == 4, "got %ld\n", dst_len);
1424 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
1426 memcpy(src, ten, sizeof(ten));
1428 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1429 ok(hr == S_OK, "got %08x\n", hr);
1430 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1431 ok(dst_len == 4, "got %ld\n", dst_len);
1432 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
1436 /* DBTYPE_BYTES to DBTYPE_*STR unpacks binary data into a hex string */
1437 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1438 memset(dst, 0xcc, sizeof(dst));
1440 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, sizeof(hexpacked_w), &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1441 ok(hr == S_OK, "got %08x\n", hr);
1442 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1443 ok(dst_len == sizeof(hexpacked_w) * 4, "got %ld\n", dst_len);
1444 ok(!lstrcmpW(hexunpacked_w, dst), "got %s\n", wine_dbgstr_w(dst));
1445 ok(dst[sizeof(hexpacked_w)/sizeof(WCHAR) * 4 + 1] == 0xcccc, "clobbered buffer\n");
1447 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1448 memset(dst, 0xcc, sizeof(dst));
1450 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1451 ok(hr == S_OK, "got %08x\n", hr);
1452 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1453 ok(dst_len == 0, "got %ld\n", dst_len);
1454 ok(dst[0] == 0, "not null terminated\n");
1455 ok(dst[1] == 0xcccc, "clobbered buffer\n");
1457 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1458 memset(dst, 0xcc, sizeof(dst));
1460 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1461 ok(hr == S_OK, "got %08x\n", hr);
1462 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1463 ok(dst_len == 2 * sizeof(WCHAR) * 4, "got %ld\n", dst_len);
1464 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 ), "got %s\n", wine_dbgstr_w(dst));
1465 ok(dst[2 * 4] == 0, "not null terminated\n");
1466 ok(dst[2 * 4 + 1] == 0xcccc, "clobbered buffer\n");
1468 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1469 memset(dst, 0xcc, sizeof(dst));
1471 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);
1472 ok(hr == S_OK, "got %08x\n", hr);
1473 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1474 ok(dst_len == sizeof(hexpacked_w) * 4, "got %ld\n", dst_len);
1475 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 ), "got %s\n", wine_dbgstr_w(dst));
1476 ok(dst[2 * 4] == 0, "not null terminated\n");
1477 ok(dst[2 * 4 + 1] == 0xcccc, "clobbered buffer\n");
1479 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1480 memset(dst, 0xcc, sizeof(dst));
1482 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);
1483 ok(hr == S_OK, "got %08x\n", hr);
1484 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1485 ok(dst_len == sizeof(hexpacked_w) * 4, "got %ld\n", dst_len);
1486 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 - 2 ), "got %s\n", wine_dbgstr_w(dst));
1487 ok(dst[2 * 4 - 1] == 0, "not null terminated\n");
1488 ok(dst[2 * 4] == 0xcccc, "clobbered buffer\n");
1490 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1491 memset(dst, 0xcc, sizeof(dst));
1493 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);
1494 ok(hr == S_OK, "got %08x\n", hr);
1495 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1496 ok(dst_len == sizeof(hexpacked_w) * 4, "got %ld\n", dst_len);
1497 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 - 2 ), "got %s\n", wine_dbgstr_w(dst));
1498 ok(dst[2 * 4 - 1] == 0, "not null terminated\n");
1499 ok(dst[2 * 4] == 0xcccc, "clobbered buffer\n");
1501 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1502 memset(dst, 0xcc, sizeof(dst));
1504 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1505 ok(hr == S_OK, "got %08x\n", hr);
1506 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1507 ok(dst_len == 0, "got %ld\n", dst_len);
1508 ok(dst[0] == 0, "not null terminated\n");
1509 ok(dst[1] == 0xcccc, "clobbered buffer\n");
1512 IDataConvert_Release(convert);
1515 static void test_converttostr(void)
1517 IDataConvert *convert;
1521 DBSTATUS dst_status;
1523 static const WCHAR ten[] = {'1','0',0};
1524 static const char ten_a[] = "10";
1525 static const char fourthreetwoone[] = "4321";
1526 static const char guid_str[] = "{0C733A8D-2A1C-11CE-ADE5-00AA0044773D}";
1527 static const char hexunpacked_a[] = "57696E6500";
1528 static const char hexpacked_a[] = "Wine";
1531 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
1534 win_skip("Unable to load oledb conversion library\n");
1539 memset(dst, 0xcc, sizeof(dst));
1541 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1542 ok(hr == S_OK, "got %08x\n", hr);
1543 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1544 ok(dst_len == 0, "got %ld\n", dst_len);
1545 ok(dst[0] == 0, "got %02x\n", dst[0]);
1546 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1548 memset(dst, 0xcc, sizeof(dst));
1550 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1551 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
1552 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
1553 ok(dst_len == 0x1234, "got %ld\n", dst_len);
1554 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1556 *(short *)src = 4321;
1558 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1559 ok(hr == S_OK, "got %08x\n", hr);
1560 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1561 ok(dst_len == 4, "got %ld\n", dst_len);
1562 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1564 *(short *)src = 4321;
1565 memset(dst, 0xcc, sizeof(dst));
1567 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1568 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1569 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1570 ok(dst_len == 4, "got %ld\n", dst_len);
1571 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1573 *(short *)src = 4321;
1574 memset(dst, 0xcc, sizeof(dst));
1576 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1577 ok(hr == S_OK, "got %08x\n", hr);
1578 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1579 ok(dst_len == 4, "got %ld\n", dst_len);
1580 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1582 *(short *)src = 4321;
1583 memset(dst, 0xcc, sizeof(dst));
1585 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1586 ok(hr == S_OK, "got %08x\n", hr);
1587 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1588 ok(dst_len == 4, "got %ld\n", dst_len);
1589 ok(dst[0] == '4', "got %02x\n", dst[0]);
1590 ok(dst[1] == 0, "got %02x\n", dst[1]);
1591 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
1593 *(short *)src = 4321;
1594 memset(dst, 0xcc, sizeof(dst));
1596 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
1597 ok(hr == S_OK, "got %08x\n", hr);
1598 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1599 ok(dst_len == 4, "got %ld\n", dst_len);
1600 ok(dst[0] == 0, "got %02x\n", dst[0]);
1601 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1603 *(short *)src = 4321;
1604 memset(dst, 0xcc, sizeof(dst));
1606 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1607 ok(hr == S_OK, "got %08x\n", hr);
1608 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1609 ok(dst_len == 4, "got %ld\n", dst_len);
1610 ok(dst[0] == '4', "got %02x\n", dst[0]);
1611 ok(dst[1] == '3', "got %02x\n", dst[1]);
1612 ok(dst[2] == '2', "got %02x\n", dst[2]);
1613 ok(dst[3] == 0, "got %02x\n", dst[3]);
1614 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
1619 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1620 ok(hr == S_OK, "got %08x\n", hr);
1621 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1622 ok(dst_len == 4, "got %ld\n", dst_len);
1623 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1626 memset(dst, 0xcc, sizeof(dst));
1628 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1629 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1630 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1631 ok(dst_len == 4, "got %ld\n", dst_len);
1632 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1635 memset(dst, 0xcc, sizeof(dst));
1637 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1638 ok(hr == S_OK, "got %08x\n", hr);
1639 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1640 ok(dst_len == 4, "got %ld\n", dst_len);
1641 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1644 memset(dst, 0xcc, sizeof(dst));
1646 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1647 ok(hr == S_OK, "got %08x\n", hr);
1648 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1649 ok(dst_len == 4, "got %ld\n", dst_len);
1650 ok(dst[0] == '4', "got %02x\n", dst[0]);
1651 ok(dst[1] == 0, "got %02x\n", dst[1]);
1652 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
1655 memset(dst, 0xcc, sizeof(dst));
1657 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
1658 ok(hr == S_OK, "got %08x\n", hr);
1659 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1660 ok(dst_len == 4, "got %ld\n", dst_len);
1661 ok(dst[0] == 0, "got %02x\n", dst[0]);
1662 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1665 memset(dst, 0xcc, sizeof(dst));
1667 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1668 ok(hr == S_OK, "got %08x\n", hr);
1669 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1670 ok(dst_len == 4, "got %ld\n", dst_len);
1671 ok(dst[0] == '4', "got %02x\n", dst[0]);
1672 ok(dst[1] == '3', "got %02x\n", dst[1]);
1673 ok(dst[2] == '2', "got %02x\n", dst[2]);
1674 ok(dst[3] == 0, "got %02x\n", dst[3]);
1675 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
1678 *(float *)src = 4321;
1680 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1681 ok(hr == S_OK, "got %08x\n", hr);
1682 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1683 ok(dst_len == 4, "got %ld\n", dst_len);
1684 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1686 *(float *)src = 4321;
1687 memset(dst, 0xcc, sizeof(dst));
1689 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1690 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1691 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1692 ok(dst_len == 4, "got %ld\n", dst_len);
1693 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1695 *(float *)src = 4321;
1696 memset(dst, 0xcc, sizeof(dst));
1698 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1699 ok(hr == S_OK, "got %08x\n", hr);
1700 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1701 ok(dst_len == 4, "got %ld\n", dst_len);
1702 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1704 *(float *)src = 4321;
1705 memset(dst, 0xcc, sizeof(dst));
1707 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1708 ok(hr == S_OK, "got %08x\n", hr);
1709 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1710 ok(dst_len == 4, "got %ld\n", dst_len);
1711 ok(dst[0] == '4', "got %02x\n", dst[0]);
1712 ok(dst[1] == 0, "got %02x\n", dst[1]);
1713 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
1715 *(float *)src = 4321;
1716 memset(dst, 0xcc, sizeof(dst));
1718 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
1719 ok(hr == S_OK, "got %08x\n", hr);
1720 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1721 ok(dst_len == 4, "got %ld\n", dst_len);
1722 ok(dst[0] == 0, "got %02x\n", dst[0]);
1723 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1725 *(float *)src = 4321;
1726 memset(dst, 0xcc, sizeof(dst));
1728 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1729 ok(hr == S_OK, "got %08x\n", hr);
1730 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1731 ok(dst_len == 4, "got %ld\n", dst_len);
1732 ok(dst[0] == '4', "got %02x\n", dst[0]);
1733 ok(dst[1] == '3', "got %02x\n", dst[1]);
1734 ok(dst[2] == '2', "got %02x\n", dst[2]);
1735 ok(dst[3] == 0, "got %02x\n", dst[3]);
1736 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
1739 *(double *)src = 4321;
1741 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1742 ok(hr == S_OK, "got %08x\n", hr);
1743 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1744 ok(dst_len == 4, "got %ld\n", dst_len);
1745 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1747 *(double *)src = 4321;
1748 memset(dst, 0xcc, sizeof(dst));
1750 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1751 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1752 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1753 ok(dst_len == 4, "got %ld\n", dst_len);
1754 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1756 *(double *)src = 4321;
1757 memset(dst, 0xcc, sizeof(dst));
1759 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1760 ok(hr == S_OK, "got %08x\n", hr);
1761 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1762 ok(dst_len == 4, "got %ld\n", dst_len);
1763 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1765 *(double *)src = 4321;
1766 memset(dst, 0xcc, sizeof(dst));
1768 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1769 ok(hr == S_OK, "got %08x\n", hr);
1770 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1771 ok(dst_len == 4, "got %ld\n", dst_len);
1772 ok(dst[0] == '4', "got %02x\n", dst[0]);
1773 ok(dst[1] == 0, "got %02x\n", dst[1]);
1774 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
1776 *(double *)src = 4321;
1777 memset(dst, 0xcc, sizeof(dst));
1779 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
1780 ok(hr == S_OK, "got %08x\n", hr);
1781 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1782 ok(dst_len == 4, "got %ld\n", dst_len);
1783 ok(dst[0] == 0, "got %02x\n", dst[0]);
1784 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1786 *(double *)src = 4321;
1787 memset(dst, 0xcc, sizeof(dst));
1789 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1790 ok(hr == S_OK, "got %08x\n", hr);
1791 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1792 ok(dst_len == 4, "got %ld\n", dst_len);
1793 ok(dst[0] == '4', "got %02x\n", dst[0]);
1794 ok(dst[1] == '3', "got %02x\n", dst[1]);
1795 ok(dst[2] == '2', "got %02x\n", dst[2]);
1796 ok(dst[3] == 0, "got %02x\n", dst[3]);
1797 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
1801 memset(src, 0, sizeof(src));
1802 ((CY*)src)->int64 = 43210000;
1803 memset(dst, 0xcc, sizeof(dst));
1805 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1806 ok(hr == S_OK, "got %08x\n", hr);
1807 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1808 ok(dst_len == 4, "got %ld\n", dst_len);
1809 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1813 memset(src, 0, sizeof(src));
1814 *(signed char *)src = 10;
1816 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1817 ok(hr == S_OK, "got %08x\n", hr);
1818 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1819 ok(dst_len == 2, "got %ld\n", dst_len);
1820 ok(!lstrcmpA(dst, ten_a), "got %s\n", dst);
1822 memset(src, 0, sizeof(src));
1823 *(unsigned char *)src = 10;
1825 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1826 ok(hr == S_OK, "got %08x\n", hr);
1827 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1828 ok(dst_len == 2, "got %ld\n", dst_len);
1829 ok(!lstrcmpA(dst, ten_a), "got %s\n", dst);
1831 memset(src, 0, sizeof(src));
1832 *(unsigned short *)src = 4321;
1834 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1835 ok(hr == S_OK, "got %08x\n", hr);
1836 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1837 ok(dst_len == 4, "got %ld\n", dst_len);
1838 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1840 memset(src, 0, sizeof(src));
1841 *(unsigned int *)src = 4321;
1843 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1844 ok(hr == S_OK, "got %08x\n", hr);
1845 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1846 ok(dst_len == 4, "got %ld\n", dst_len);
1847 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1849 memset(src, 0, sizeof(src));
1850 ((LARGE_INTEGER*)src)->QuadPart = 4321;
1852 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1853 ok(broken(DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08x\n", hr);
1854 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08x\n", dst_status);
1855 ok(broken(dst_len == 0x1234) || dst_len == 4 /* W2K+ */, "got %ld\n", dst_len);
1856 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1858 memset(src, 0, sizeof(src));
1859 ((ULARGE_INTEGER*)src)->QuadPart = 4321;
1861 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1862 ok(broken(DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08x\n", hr);
1863 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08x\n", dst_status);
1864 ok(broken(dst_len == 0x1234) || dst_len == 4 /* W2K+ */, "got %ld\n", dst_len);
1865 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1869 memset(src, 0, sizeof(src));
1870 memcpy(src, &IID_IDataConvert, sizeof(GUID));
1871 memset(dst, 0xcc, sizeof(dst));
1873 hr = IDataConvert_DataConvert(convert, DBTYPE_GUID, DBTYPE_STR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1874 ok(hr == S_OK, "got %08x\n", hr);
1875 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1876 ok(dst_len == 38, "got %ld\n", dst_len);
1877 ok(!lstrcmpA(dst, guid_str), "got %s\n", dst);
1881 b = SysAllocString(ten);
1883 memset(dst, 0xcc, sizeof(dst));
1885 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1886 ok(hr == S_OK, "got %08x\n", hr);
1887 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1888 ok(dst_len == 2, "got %ld\n", dst_len);
1889 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
1892 memcpy(src, ten, sizeof(ten));
1893 memset(dst, 0xcc, sizeof(dst));
1895 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR, 2, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1896 ok(hr == S_OK, "got %08x\n", hr);
1897 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1898 ok(dst_len == 1, "got %ld\n", dst_len);
1899 ok(dst[0] == '1', "got %02x\n", dst[0]);
1900 ok(dst[1] == 0, "got %02x\n", dst[1]);
1902 memcpy(src, ten, sizeof(ten));
1903 memset(dst, 0xcc, sizeof(dst));
1905 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1906 ok(hr == S_OK, "got %08x\n", hr);
1907 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1908 ok(dst_len == 2, "got %ld\n", dst_len);
1909 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
1911 memcpy(src, ten, sizeof(ten));
1912 memset(dst, 0xcc, sizeof(dst));
1914 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1915 ok(hr == S_OK, "got %08x\n", hr);
1916 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1917 ok(dst_len == 2, "got %ld\n", dst_len);
1918 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
1920 memcpy(src, ten_a, sizeof(ten_a));
1921 memset(dst, 0xcc, sizeof(dst));
1923 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 2, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1924 ok(hr == S_OK, "got %08x\n", hr);
1925 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1926 ok(dst_len == 2, "got %ld\n", dst_len);
1927 ok(dst[0] == '1', "got %02x\n", dst[0]);
1928 ok(dst[1] == '0', "got %02x\n", dst[1]);
1929 ok(dst[2] == 0, "got %02x\n", dst[2]);
1930 ok(dst[3] == (char)0xcc, "got %02x\n", dst[3]);
1932 memcpy(src, ten_a, sizeof(ten_a));
1933 memset(dst, 0xcc, sizeof(dst));
1935 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1936 ok(hr == S_OK, "got %08x\n", hr);
1937 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1938 ok(dst_len == 4, "got %ld\n", dst_len);
1939 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
1941 memcpy(src, ten_a, sizeof(ten_a));
1942 memset(dst, 0xcc, sizeof(dst));
1944 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1945 ok(hr == S_OK, "got %08x\n", hr);
1946 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1947 ok(dst_len == 2, "got %ld\n", dst_len);
1948 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
1952 /* DBTYPE_BYTES to DBTYPE_*STR unpacks binary data into a hex string */
1953 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1954 memset(dst, 0xcc, sizeof(dst));
1956 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, sizeof(hexpacked_a), &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1957 ok(hr == S_OK, "got %08x\n", hr);
1958 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1959 ok(dst_len == sizeof(hexpacked_a) * 2, "got %ld\n", dst_len);
1960 ok(!lstrcmpA(hexunpacked_a, dst), "got %s\n", dst);
1961 ok(dst[sizeof(hexpacked_a)/sizeof(char) * 4 + 1] == (char)0xcc, "clobbered buffer\n");
1963 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1964 memset(dst, 0xcc, sizeof(dst));
1966 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1967 ok(hr == S_OK, "got %08x\n", hr);
1968 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1969 ok(dst_len == 0, "got %ld\n", dst_len);
1970 ok(dst[0] == 0, "not null terminated\n");
1971 ok(dst[1] == (char)0xcc, "clobbered buffer\n");
1973 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1974 memset(dst, 0xcc, sizeof(dst));
1976 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1977 ok(hr == S_OK, "got %08x\n", hr);
1978 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1979 ok(dst_len == 2 * sizeof(char) * 4, "got %ld\n", dst_len);
1980 ok(!memcmp(hexunpacked_a, dst, 2 * sizeof(char) * 4 ), "got %s\n", dst);
1981 ok(dst[2 * 4] == 0, "not null terminated\n");
1982 ok(dst[2 * 4 + 1] == (char)0xcc, "clobbered buffer\n");
1984 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1985 memset(dst, 0xcc, sizeof(dst));
1987 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);
1988 ok(hr == S_OK, "got %08x\n", hr);
1989 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1990 ok(dst_len == sizeof(hexpacked_a) * 2, "got %ld\n", dst_len);
1991 ok(!memcmp(hexunpacked_a, dst, 2 * sizeof(char) * 4 ), "got %s\n", dst);
1992 ok(dst[2 * 4] == 0, "not null terminated\n");
1993 ok(dst[2 * 4 + 1] == (char)0xcc, "clobbered buffer\n");
1995 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1996 memset(dst, 0xcc, sizeof(dst));
1998 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);
1999 ok(hr == S_OK, "got %08x\n", hr);
2000 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
2001 ok(dst_len == sizeof(hexpacked_a) * 2, "got %ld\n", dst_len);
2002 ok(!memcmp(hexunpacked_a, dst, 2 * sizeof(char) * 4 - 2 ), "got %s\n", dst);
2003 ok(dst[2 * 4 - 1] == 0, "not null terminated\n");
2004 ok(dst[2 * 4] == (char)0xcc, "clobbered buffer\n");
2006 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
2007 memset(dst, 0xcc, sizeof(dst));
2009 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
2010 ok(hr == S_OK, "got %08x\n", hr);
2011 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2012 ok(dst_len == 0, "got %ld\n", dst_len);
2013 ok(dst[0] == 0, "not null terminated\n");
2014 ok(dst[1] == (char)0xcc, "clobbered buffer\n");
2016 IDataConvert_Release(convert);
2019 static void test_converttobyrefwstr(void)
2021 IDataConvert *convert;
2025 DBSTATUS dst_status;
2027 static const WCHAR ten[] = {'1','0',0};
2028 static const WCHAR fourthreetwoone[] = {'4','3','2','1',0};
2031 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2034 win_skip("Unable to load oledb conversion library\n");
2038 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2039 ok(hr == S_OK, "got %08x\n", hr);
2040 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2041 ok(dst_len == 0, "got %ld\n", dst_len);
2042 ok(dst[0] == 0, "got %04x\n", dst[0]);
2045 dst = (void*)0x12345678;
2047 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2048 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2049 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2050 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2051 ok(dst == (void*)0x12345678, "got %p\n", dst);
2053 *(short *)src = 4321;
2055 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2056 ok(hr == S_OK, "got %08x\n", hr);
2057 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2058 ok(dst_len == 8, "got %ld\n", dst_len);
2059 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
2062 *(short *)src = 4321;
2064 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, 0, 0, &dst_status, 0, 0, 0);
2065 ok(hr == S_OK, "got %08x\n", hr);
2066 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2067 ok(dst_len == 8, "got %ld\n", dst_len);
2068 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
2071 b = SysAllocString(ten);
2074 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2075 ok(hr == S_OK, "got %08x\n", hr);
2076 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2077 ok(dst_len == 4, "got %ld\n", dst_len);
2078 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
2082 memcpy(src, ten, sizeof(ten));
2084 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_BYREF | DBTYPE_WSTR, 2, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2085 ok(hr == S_OK, "got %08x\n", hr);
2086 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2087 ok(dst_len == 2, "got %ld\n", dst_len);
2088 ok(dst[0] == '1', "got %02x\n", dst[0]);
2089 ok(dst[1] == 0, "got %02x\n", dst[1]);
2092 memcpy(src, ten, sizeof(ten));
2094 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_BYREF | DBTYPE_WSTR, 4, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2095 ok(hr == S_OK, "got %08x\n", hr);
2096 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2097 ok(dst_len == 4, "got %ld\n", dst_len);
2098 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
2101 memcpy(src, ten, sizeof(ten));
2103 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
2104 ok(hr == S_OK, "got %08x\n", hr);
2105 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2106 ok(dst_len == 4, "got %ld\n", dst_len);
2107 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
2110 IDataConvert_Release(convert);
2113 static void test_converttoguid(void)
2115 IDataConvert *convert;
2119 DBSTATUS dst_status;
2122 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2125 win_skip("Unable to load oledb conversion library\n");
2131 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_GUID, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2132 ok(hr == S_OK, "got %08x\n", hr);
2133 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2134 ok(dst_len == sizeof(GUID), "got %ld\n", dst_len);
2135 ok(IsEqualGUID(&dst, &GUID_NULL), "didn't get GUID_NULL\n");
2139 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_GUID, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2140 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2141 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2142 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2143 ok(IsEqualGUID(&dst, &IID_IDCInfo), "dst has changed\n");
2146 memcpy(src, &IID_IDataConvert, sizeof(GUID));
2148 hr = IDataConvert_DataConvert(convert, DBTYPE_GUID, DBTYPE_GUID, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2149 ok(hr == S_OK, "got %08x\n", hr);
2150 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2151 ok(dst_len == sizeof(GUID), "got %ld\n", dst_len);
2152 ok(IsEqualGUID(&dst, &IID_IDataConvert), "didn't get IID_IDataConvert\n");
2154 IDataConvert_Release(convert);
2157 static void test_converttofiletime(void)
2159 IDataConvert *convert;
2163 DBSTATUS dst_status;
2166 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2169 win_skip("Unable to load oledb conversion library\n");
2173 memset(&dst, 0xcc, sizeof(dst));
2174 ((FILETIME *)src)->dwLowDateTime = 0x12345678;
2175 ((FILETIME *)src)->dwHighDateTime = 0x9abcdef0;
2177 hr = IDataConvert_DataConvert(convert, DBTYPE_FILETIME, DBTYPE_FILETIME, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2179 broken(hr == DB_E_BADBINDINFO), /* win98 */
2183 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2184 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2185 ok(dst.dwLowDateTime == 0x12345678, "got %08x\n", dst.dwLowDateTime);
2186 ok(dst.dwHighDateTime == 0x9abcdef0, "got %08x\n", dst.dwHighDateTime);
2189 IDataConvert_Release(convert);
2192 static void test_converttoui1(void)
2194 IDataConvert *convert;
2198 DBSTATUS dst_status;
2201 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2204 win_skip("Unable to load oledb conversion library\n");
2210 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2211 ok(hr == S_OK, "got %08x\n", hr);
2212 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2213 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2214 ok(dst == 0, "got %08x\n", dst);
2218 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2219 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2220 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2221 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2222 ok(dst == 0x12, "got %08x\n", dst);
2227 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2228 ok(hr == S_OK, "got %08x\n", hr);
2229 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2230 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2231 ok(dst == 0x43, "got %08x\n", dst);
2236 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2237 ok(hr == S_OK, "got %08x\n", hr);
2238 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2239 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2240 ok(dst == 0xfe, "got %08x\n", dst);
2242 IDataConvert_Release(convert);
2245 static void test_converttoui4(void)
2247 IDataConvert *convert;
2251 DBSTATUS dst_status;
2254 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2257 win_skip("Unable to load oledb conversion library\n");
2263 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2264 ok(hr == S_OK, "got %08x\n", hr);
2265 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2266 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2267 ok(dst == 0, "got %08x\n", dst);
2271 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2272 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2273 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2274 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2275 ok(dst == 0x12345678, "got %08x\n", dst);
2278 *(DWORD*)src = 0x87654321;
2280 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2281 ok(hr == S_OK, "got %08x\n", hr);
2282 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2283 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2284 ok(dst == 0x87654321, "got %08x\n", dst);
2287 *(signed short *)src = 0x4321;
2289 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2290 ok(hr == S_OK, "got %08x\n", hr);
2291 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2292 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2293 ok(dst == 0x4321, "got %08x\n", dst);
2296 *(signed short *)src = -1;
2298 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2299 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
2301 ok(dst_status == DBSTATUS_E_SIGNMISMATCH, "got %08x\n", dst_status);
2303 ok(broken(dst_len == sizeof(dst)) || dst_len == 0x1234 /* W2K+ */, "got %ld\n", dst_len);
2304 ok(dst == 0x12345678, "got %08x\n", dst);
2306 IDataConvert_Release(convert);
2309 static void test_converttor4(void)
2311 IDataConvert *convert;
2315 DBSTATUS dst_status;
2318 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2321 win_skip("Unable to load oledb conversion library\n");
2327 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2328 ok(hr == S_OK, "got %08x\n", hr);
2329 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2330 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2331 ok(dst == 0.0, "got %f\n", dst);
2335 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2336 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2337 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2338 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2339 ok(dst == 1.0, "got %f\n", dst);
2342 *(signed int*)src = 12345678;
2344 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2345 ok(hr == S_OK, "got %08x\n", hr);
2346 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2347 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2348 ok(dst == 12345678.0, "got %f\n", dst);
2351 *(FLOAT *)src = 10.0;
2353 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2354 ok(hr == S_OK, "got %08x\n", hr);
2355 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2356 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2357 ok(dst == 10.0, "got %f\n", dst);
2359 IDataConvert_Release(convert);
2362 static void test_converttocy(void)
2364 IDataConvert *convert;
2368 DBSTATUS dst_status;
2371 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2374 win_skip("Unable to load oledb conversion library\n");
2380 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2381 ok(hr == S_OK, "got %08x\n", hr);
2382 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2383 ok(dst_len == sizeof(CY), "got %ld\n", dst_len);
2384 ok(dst.int64 == 0, "didn't get 0\n");
2388 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2389 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2390 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2391 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2392 ok(dst.int64 == 0xcc, "dst changed\n");
2397 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2398 ok(hr == S_OK, "got %08x\n", hr);
2399 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2400 ok(dst_len == sizeof(CY), "got %ld\n", dst_len);
2401 ok(dst.int64 == 12340000, "got %d\n", dst.s.Lo);
2404 ((CY*)src)->int64 = 1234;
2406 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2407 ok(hr == S_OK, "got %08x\n", hr);
2408 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2409 ok(dst_len == sizeof(CY), "got %ld\n", dst_len);
2410 ok(dst.int64 == 1234, "got %d\n", dst.s.Lo);
2412 IDataConvert_Release(convert);
2415 static void test_converttoui8(void)
2417 IDataConvert *convert;
2421 DBSTATUS dst_status;
2424 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2427 win_skip("Unable to load oledb conversion library\n");
2431 dst.QuadPart = 0xcc;
2433 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2434 ok(hr == S_OK, "got %08x\n", hr);
2435 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2436 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2437 ok(dst.QuadPart == 0, "got %d\n", (int)dst.QuadPart);
2439 dst.QuadPart = 0xcc;
2441 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2442 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2443 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2444 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2445 ok(dst.QuadPart == 0xcc, "dst changed\n");
2447 dst.QuadPart = 0xcc;
2450 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2451 ok(hr == S_OK, "got %08x\n", hr);
2452 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2453 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2454 ok(dst.QuadPart == 1234, "got %d\n", (int)dst.QuadPart);
2456 dst.QuadPart = 0xcc;
2459 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2460 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
2462 ok(dst_status == DBSTATUS_E_SIGNMISMATCH, "got %08x\n", dst_status);
2464 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2465 ok(dst.QuadPart == 0xcc, "got %d\n", (int)dst.QuadPart);
2467 dst.QuadPart = 0xcc;
2468 ((ULARGE_INTEGER*)src)->QuadPart = 1234;
2470 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2471 ok(hr == S_OK, "got %08x\n", hr);
2472 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2473 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2474 ok(dst.QuadPart == 1234, "got %d\n", (int)dst.QuadPart);
2476 IDataConvert_Release(convert);
2479 static void test_getconversionsize(void)
2481 IDataConvert *convert;
2486 static WCHAR strW[] = {'t','e','s','t',0};
2487 static char strTest[] = "test";
2489 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2492 win_skip("Unable to load oledb conversion library\n");
2496 /* same way as CanConvert fails here */
2498 hr = IDataConvert_GetConversionSize(convert, DBTYPE_NULL, DBTYPE_BSTR, NULL, &dst_len, NULL);
2499 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got 0x%08x\n", hr);
2502 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I2, DBTYPE_I4, NULL, &dst_len, NULL);
2503 ok(hr == S_OK, "got 0x%08x\n", hr);
2504 ok(dst_len == 4, "got %ld\n", dst_len);
2506 hr = IDataConvert_GetConversionSize(convert, DBTYPE_I2, DBTYPE_I4, NULL, NULL, NULL);
2507 ok(hr == E_INVALIDARG, "got 0x%08x\n", hr);
2509 /* size doesn't include string size */
2510 str = SysAllocStringLen(NULL, 10);
2512 hr = IDataConvert_GetConversionSize(convert, DBTYPE_BSTR, DBTYPE_VARIANT, NULL, &dst_len, str);
2513 ok(hr == S_OK, "got 0x%08x\n", hr);
2514 ok(dst_len == sizeof(VARIANT), "%ld\n", dst_len);
2518 hr = IDataConvert_GetConversionSize(convert, DBTYPE_WSTR, DBTYPE_WSTR, NULL, &dst_len, strW);
2519 ok(hr == S_OK, "got 0x%08x\n", hr);
2520 ok(dst_len == 10, "%ld\n", dst_len);
2524 hr = IDataConvert_GetConversionSize(convert, DBTYPE_WSTR, DBTYPE_WSTR, &src_len, &dst_len, strW);
2525 ok(hr == S_OK, "got 0x%08x\n", hr);
2526 ok(dst_len == 4, "%ld\n", dst_len);
2530 hr = IDataConvert_GetConversionSize(convert, DBTYPE_WSTR, DBTYPE_WSTR, &src_len, &dst_len, strW);
2531 ok(hr == S_OK, "got 0x%08x\n", hr);
2532 ok(dst_len == 22, "%ld\n", dst_len);
2535 hr = IDataConvert_GetConversionSize(convert, DBTYPE_STR, DBTYPE_WSTR, NULL, &dst_len, strTest);
2536 ok(hr == S_OK, "got 0x%08x\n", hr);
2537 ok(dst_len == 10 || broken(dst_len == 12), "%ld\n", dst_len);
2541 hr = IDataConvert_GetConversionSize(convert, DBTYPE_STR, DBTYPE_WSTR, &src_len, &dst_len, strTest);
2542 ok(hr == S_OK, "got 0x%08x\n", hr);
2543 ok(dst_len == 6, "%ld\n", dst_len);
2547 hr = IDataConvert_GetConversionSize(convert, DBTYPE_STR, DBTYPE_WSTR, &src_len, &dst_len, strTest);
2548 ok(hr == S_OK, "got 0x%08x\n", hr);
2549 ok(dst_len == 42, "%ld\n", dst_len);
2551 IDataConvert_Release(convert);
2554 static void test_converttovar(void)
2556 static WCHAR strW[] = {'t','e','s','t',0};
2557 double dvalue = 123.56;
2558 IDataConvert *convert;
2559 DBSTATUS dst_status;
2568 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2571 win_skip("Unable to load oledb conversion library\n");
2575 V_VT(&dst) = VT_EMPTY;
2577 dst_status = DBSTATUS_S_DEFAULT;
2578 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_VARIANT, sizeof(strW), &dst_len, strW, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2579 ok(hr == S_OK, "got %08x\n", hr);
2580 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2581 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2582 ok(V_VT(&dst) == VT_BSTR, "got %d\n", V_VT(&dst));
2583 ok(!lstrcmpW(V_BSTR(&dst), strW), "got %s\n", wine_dbgstr_w(V_BSTR(&dst)));
2586 /* with null dest length and status */
2587 V_VT(&dst) = VT_EMPTY;
2588 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_VARIANT, sizeof(strW), NULL, strW, &dst, sizeof(dst), 0, NULL, 0, 0, 0);
2589 ok(hr == S_OK, "got %08x\n", hr);
2590 ok(V_VT(&dst) == VT_BSTR, "got %d\n", V_VT(&dst));
2591 ok(!lstrcmpW(V_BSTR(&dst), strW), "got %s\n", wine_dbgstr_w(V_BSTR(&dst)));
2594 V_VT(&dst) = VT_EMPTY;
2596 dst_status = DBSTATUS_S_DEFAULT;
2597 i8.QuadPart = 12345;
2599 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_VARIANT, sizeof(i8), &dst_len, &i8, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2600 ok(hr == S_OK, "got %08x\n", hr);
2601 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2602 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2603 ok(V_VT(&dst) == VT_DECIMAL, "got %d\n", V_VT(&dst));
2604 ok(S(U(V_DECIMAL(&dst))).scale == 0 && S(U(V_DECIMAL(&dst))).sign == 0 &&
2605 V_DECIMAL(&dst).Hi32 == 0 && U1(V_DECIMAL(&dst)).Lo64 == 12345, "Not Equal\n");
2607 V_VT(&dst) = VT_EMPTY;
2609 dst_status = DBSTATUS_S_DEFAULT;
2610 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_VARIANT, sizeof(dvalue), &dst_len, &dvalue, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2611 ok(hr == S_OK, "got %08x\n", hr);
2612 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2613 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2614 ok(V_VT(&dst) == VT_R8, "got %d\n", V_VT(&dst));
2615 ok(V_R8(&dst) == 123.56, "got %f\n", V_R8(&dst));
2617 V_VT(&dst) = VT_EMPTY;
2619 dst_status = DBSTATUS_S_DEFAULT;
2621 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_VARIANT, sizeof(i4), &dst_len, &i4, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2622 ok(hr == S_OK, "got %08x\n", hr);
2623 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2624 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2625 ok(V_VT(&dst) == VT_I4, "got %d\n", V_VT(&dst));
2626 ok(V_I4(&dst) == 123, "got %d\n", V_I4(&dst));
2628 V_VT(&dst) = VT_EMPTY;
2630 dst_status = DBSTATUS_S_DEFAULT;
2632 hr = IDataConvert_DataConvert(convert, DBTYPE_DATE, DBTYPE_VARIANT, sizeof(date), &dst_len, &date, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2633 ok(hr == S_OK, "got %08x\n", hr);
2634 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2635 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2636 ok(V_VT(&dst) == VT_DATE, "got %d\n", V_VT(&dst));
2637 ok(V_DATE(&dst) == 123.123, "got %f\n", V_DATE(&dst));
2639 V_VT(&dst) = VT_EMPTY;
2641 dst_status = DBSTATUS_S_DEFAULT;
2644 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_VARIANT, sizeof(cy), &dst_len, &cy, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2645 ok(hr == S_OK, "got %08x\n", hr);
2646 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2647 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2648 ok(V_VT(&dst) == VT_CY, "got %d\n", V_VT(&dst));
2651 ok(S(cy2).Lo == S(cy).Lo && S(cy2).Hi == S(cy).Hi, "got %d,%d\n", S(cy2).Lo, S(cy2).Hi);
2653 IDataConvert_Release(convert);
2658 OleInitialize(NULL);
2664 test_converttostr();
2665 test_converttobstr();
2666 test_converttowstr();
2667 test_converttobyrefwstr();
2668 test_converttoguid();
2669 test_converttoui1();
2670 test_converttoui4();
2672 test_converttofiletime();
2674 test_converttoui8();
2675 test_converttovar();
2676 test_getconversionsize();