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_converttobstr(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 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
940 ok(hr == S_OK, "got %08x\n", hr);
941 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
942 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
943 ok(dst != NULL, "got %p\n", dst);
944 ok(SysStringLen(dst) == 0, "got %d\n", SysStringLen(dst));
948 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
949 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
950 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
951 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
952 ok(dst == (void*)0x1234, "got %p\n", dst);
954 *(short *)src = 4321;
955 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
956 ok(hr == S_OK, "got %08x\n", hr);
957 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
958 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
959 ok(dst != NULL, "got %p\n", dst);
960 ok(SysStringLen(dst) == 4, "got %d\n", SysStringLen(dst));
963 b = SysAllocString(ten);
965 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_BSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
966 ok(hr == S_OK, "got %08x\n", hr);
967 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
968 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
969 ok(dst != NULL, "got %p\n", dst);
970 ok(dst != b, "got %p src %p\n", dst, b);
971 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
975 IDataConvert_Release(convert);
978 static void test_converttowstr(void)
980 IDataConvert *convert;
986 static const WCHAR ten[] = {'1','0',0};
987 static const WCHAR fourthreetwoone[] = {'4','3','2','1',0};
988 static const WCHAR guid_str[] = {
989 '{','0','C','7','3','3','A','8','D','-','2','A','1','C','-','1','1','C','E','-',
990 'A','D','E','5','-','0','0','A','A','0','0','4','4','7','7','3','D','}',0};
991 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 };
992 static const WCHAR hexpacked_w[] = {'W','i','n','e', 0 };
995 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
998 win_skip("Unable to load oledb conversion library\n");
1003 memset(dst, 0xcc, sizeof(dst));
1005 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1006 ok(hr == S_OK, "got %08x\n", hr);
1007 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1008 ok(dst_len == 0, "got %ld\n", dst_len);
1009 ok(dst[0] == 0, "got %02x\n", dst[0]);
1010 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1012 memset(dst, 0xcc, sizeof(dst));
1014 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1015 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
1016 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
1017 ok(dst_len == 0x1234, "got %ld\n", dst_len);
1018 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1020 *(short *)src = 4321;
1022 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1023 ok(hr == S_OK, "got %08x\n", hr);
1024 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1025 ok(dst_len == 8, "got %ld\n", dst_len);
1026 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1028 *(short *)src = 4321;
1029 memset(dst, 0xcc, sizeof(dst));
1031 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1032 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1033 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1034 ok(dst_len == 8, "got %ld\n", dst_len);
1035 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1037 *(short *)src = 4321;
1038 memset(dst, 0xcc, sizeof(dst));
1040 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1041 ok(hr == S_OK, "got %08x\n", hr);
1042 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1043 ok(dst_len == 8, "got %ld\n", dst_len);
1044 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1046 *(short *)src = 4321;
1047 memset(dst, 0xcc, sizeof(dst));
1049 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1050 ok(hr == S_OK, "got %08x\n", hr);
1051 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1052 ok(dst_len == 8, "got %ld\n", dst_len);
1053 ok(dst[0] == '4', "got %02x\n", dst[0]);
1054 ok(dst[1] == 0, "got %02x\n", dst[1]);
1055 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1057 *(short *)src = 4321;
1058 memset(dst, 0xcc, sizeof(dst));
1060 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1061 ok(hr == S_OK, "got %08x\n", hr);
1062 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1063 ok(dst_len == 8, "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 *(short *)src = 4321;
1068 memset(dst, 0xcc, sizeof(dst));
1070 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1071 ok(hr == S_OK, "got %08x\n", hr);
1072 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1073 ok(dst_len == 8, "got %ld\n", dst_len);
1074 ok(dst[0] == '4', "got %02x\n", dst[0]);
1075 ok(dst[1] == '3', "got %02x\n", dst[1]);
1076 ok(dst[2] == '2', "got %02x\n", dst[2]);
1077 ok(dst[3] == 0, "got %02x\n", dst[3]);
1078 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1084 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1085 ok(hr == S_OK, "got %08x\n", hr);
1086 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1087 ok(dst_len == 8, "got %ld\n", dst_len);
1088 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1091 memset(dst, 0xcc, sizeof(dst));
1093 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1094 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1095 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1096 ok(dst_len == 8, "got %ld\n", dst_len);
1097 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1100 memset(dst, 0xcc, sizeof(dst));
1101 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1102 ok(hr == S_OK, "got %08x\n", hr);
1103 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1104 ok(dst_len == 8, "got %ld\n", dst_len);
1105 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1108 memset(dst, 0xcc, sizeof(dst));
1110 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1111 ok(hr == S_OK, "got %08x\n", hr);
1112 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1113 ok(dst_len == 8, "got %ld\n", dst_len);
1114 ok(dst[0] == '4', "got %02x\n", dst[0]);
1115 ok(dst[1] == 0, "got %02x\n", dst[1]);
1116 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1119 memset(dst, 0xcc, sizeof(dst));
1121 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1122 ok(hr == S_OK, "got %08x\n", hr);
1123 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1124 ok(dst_len == 8, "got %ld\n", dst_len);
1125 ok(dst[0] == 0, "got %02x\n", dst[0]);
1126 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1129 memset(dst, 0xcc, sizeof(dst));
1131 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1132 ok(hr == S_OK, "got %08x\n", hr);
1133 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1134 ok(dst_len == 8, "got %ld\n", dst_len);
1135 ok(dst[0] == '4', "got %02x\n", dst[0]);
1136 ok(dst[1] == '3', "got %02x\n", dst[1]);
1137 ok(dst[2] == '2', "got %02x\n", dst[2]);
1138 ok(dst[3] == 0, "got %02x\n", dst[3]);
1139 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1143 *(float *)src = 4321;
1145 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1146 ok(hr == S_OK, "got %08x\n", hr);
1147 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1148 ok(dst_len == 8, "got %ld\n", dst_len);
1149 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1151 *(float *)src = 4321;
1152 memset(dst, 0xcc, sizeof(dst));
1154 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1155 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1156 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1157 ok(dst_len == 8, "got %ld\n", dst_len);
1158 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1160 *(float *)src = 4321;
1161 memset(dst, 0xcc, sizeof(dst));
1162 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1163 ok(hr == S_OK, "got %08x\n", hr);
1164 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1165 ok(dst_len == 8, "got %ld\n", dst_len);
1166 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1168 *(float *)src = 4321;
1169 memset(dst, 0xcc, sizeof(dst));
1171 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1172 ok(hr == S_OK, "got %08x\n", hr);
1173 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1174 ok(dst_len == 8, "got %ld\n", dst_len);
1175 ok(dst[0] == '4', "got %02x\n", dst[0]);
1176 ok(dst[1] == 0, "got %02x\n", dst[1]);
1177 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1179 *(float *)src = 4321;
1180 memset(dst, 0xcc, sizeof(dst));
1182 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1183 ok(hr == S_OK, "got %08x\n", hr);
1184 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1185 ok(dst_len == 8, "got %ld\n", dst_len);
1186 ok(dst[0] == 0, "got %02x\n", dst[0]);
1187 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1189 *(float *)src = 4321;
1190 memset(dst, 0xcc, sizeof(dst));
1192 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1193 ok(hr == S_OK, "got %08x\n", hr);
1194 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1195 ok(dst_len == 8, "got %ld\n", dst_len);
1196 ok(dst[0] == '4', "got %02x\n", dst[0]);
1197 ok(dst[1] == '3', "got %02x\n", dst[1]);
1198 ok(dst[2] == '2', "got %02x\n", dst[2]);
1199 ok(dst[3] == 0, "got %02x\n", dst[3]);
1200 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1204 *(double *)src = 4321;
1206 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1207 ok(hr == S_OK, "got %08x\n", hr);
1208 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1209 ok(dst_len == 8, "got %ld\n", dst_len);
1210 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1212 *(double *)src = 4321;
1213 memset(dst, 0xcc, sizeof(dst));
1214 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1215 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1216 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1217 ok(dst_len == 8, "got %ld\n", dst_len);
1218 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1220 *(double *)src = 4321;
1221 memset(dst, 0xcc, sizeof(dst));
1223 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1224 ok(hr == S_OK, "got %08x\n", hr);
1225 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1226 ok(dst_len == 8, "got %ld\n", dst_len);
1227 ok(dst[0] == 0xcccc, "got %02x\n", dst[0]);
1229 *(double *)src = 4321;
1230 memset(dst, 0xcc, sizeof(dst));
1232 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1233 ok(hr == S_OK, "got %08x\n", hr);
1234 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1235 ok(dst_len == 8, "got %ld\n", dst_len);
1236 ok(dst[0] == '4', "got %02x\n", dst[0]);
1237 ok(dst[1] == 0, "got %02x\n", dst[1]);
1238 ok(dst[2] == 0xcccc, "got %02x\n", dst[2]);
1240 *(double *)src = 4321;
1241 memset(dst, 0xcc, sizeof(dst));
1243 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1244 ok(hr == S_OK, "got %08x\n", hr);
1245 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1246 ok(dst_len == 8, "got %ld\n", dst_len);
1247 ok(dst[0] == 0, "got %02x\n", dst[0]);
1248 ok(dst[1] == 0xcccc, "got %02x\n", dst[1]);
1250 *(double *)src = 4321;
1251 memset(dst, 0xcc, sizeof(dst));
1253 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_WSTR, 0, &dst_len, src, dst, 8, 0, &dst_status, 0, 0, 0);
1254 ok(hr == S_OK, "got %08x\n", hr);
1255 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1256 ok(dst_len == 8, "got %ld\n", dst_len);
1257 ok(dst[0] == '4', "got %02x\n", dst[0]);
1258 ok(dst[1] == '3', "got %02x\n", dst[1]);
1259 ok(dst[2] == '2', "got %02x\n", dst[2]);
1260 ok(dst[3] == 0, "got %02x\n", dst[3]);
1261 ok(dst[4] == 0xcccc, "got %02x\n", dst[4]);
1265 memset(src, 0, sizeof(src));
1266 ((CY*)src)->int64 = 43210000;
1267 memset(dst, 0xcc, sizeof(dst));
1269 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1270 ok(hr == S_OK, "got %08x\n", hr);
1271 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1272 ok(dst_len == 8, "got %ld\n", dst_len);
1273 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1277 memset(src, 0, sizeof(src));
1278 *(signed char *)src = 10;
1280 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1281 ok(hr == S_OK, "got %08x\n", hr);
1282 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1283 ok(dst_len == 4, "got %ld\n", dst_len);
1284 ok(!lstrcmpW(dst, ten), "got %s\n", wine_dbgstr_w(dst));
1286 memset(src, 0, sizeof(src));
1287 *(unsigned char *)src = 10;
1289 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1290 ok(hr == S_OK, "got %08x\n", hr);
1291 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1292 ok(dst_len == 4, "got %ld\n", dst_len);
1293 ok(!lstrcmpW(dst, ten), "got %s\n", wine_dbgstr_w(dst));
1295 memset(src, 0, sizeof(src));
1296 *(unsigned short *)src = 4321;
1298 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1299 ok(hr == S_OK, "got %08x\n", hr);
1300 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1301 ok(dst_len == 8, "got %ld\n", dst_len);
1302 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1304 memset(src, 0, sizeof(src));
1305 *(unsigned int *)src = 4321;
1307 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1308 ok(hr == S_OK, "got %08x\n", hr);
1309 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1310 ok(dst_len == 8, "got %ld\n", dst_len);
1311 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1313 memset(src, 0, sizeof(src));
1314 ((LARGE_INTEGER*)src)->QuadPart = 4321;
1316 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1317 ok(broken(DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08x\n", hr);
1318 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08x\n", dst_status);
1319 ok(broken(dst_len == 0x1234) || dst_len == 8 /* W2K+ */, "got %ld\n", dst_len);
1320 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1322 memset(src, 0, sizeof(src));
1323 ((ULARGE_INTEGER*)src)->QuadPart = 4321;
1324 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1325 ok(broken(DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08x\n", hr);
1326 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08x\n", dst_status);
1327 ok(broken(dst_len == 0x1234) || dst_len == 8 /* W2K+ */, "got %ld\n", dst_len);
1328 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
1332 memset(src, 0, sizeof(src));
1333 memcpy(src, &IID_IDataConvert, sizeof(GUID));
1334 memset(dst, 0xcc, sizeof(dst));
1336 hr = IDataConvert_DataConvert(convert, DBTYPE_GUID, DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1337 ok(hr == S_OK, "got %08x\n", hr);
1338 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1339 ok(dst_len == 76, "got %ld\n", dst_len);
1340 ok(!lstrcmpW(dst, guid_str), "got %s\n", wine_dbgstr_w(dst));
1344 b = SysAllocString(ten);
1347 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1348 ok(hr == S_OK, "got %08x\n", hr);
1349 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1350 ok(dst_len == 4, "got %ld\n", dst_len);
1351 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
1354 memcpy(src, ten, sizeof(ten));
1356 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_WSTR, 2, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1357 ok(hr == S_OK, "got %08x\n", hr);
1358 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1359 ok(dst_len == 2, "got %ld\n", dst_len);
1360 ok(dst[0] == '1', "got %02x\n", dst[0]);
1361 ok(dst[1] == 0, "got %02x\n", dst[1]);
1363 memcpy(src, ten, sizeof(ten));
1365 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_WSTR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1366 ok(hr == S_OK, "got %08x\n", hr);
1367 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1368 ok(dst_len == 4, "got %ld\n", dst_len);
1369 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
1371 memcpy(src, ten, sizeof(ten));
1373 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1374 ok(hr == S_OK, "got %08x\n", hr);
1375 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1376 ok(dst_len == 4, "got %ld\n", dst_len);
1377 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
1381 /* DBTYPE_BYTES to DBTYPE_*STR unpacks binary data into a hex string */
1382 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1383 memset(dst, 0xcc, sizeof(dst));
1385 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, sizeof(hexpacked_w), &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1386 ok(hr == S_OK, "got %08x\n", hr);
1387 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1388 ok(dst_len == sizeof(hexpacked_w) * 4, "got %ld\n", dst_len);
1389 ok(!lstrcmpW(hexunpacked_w, dst), "got %s\n", wine_dbgstr_w(dst));
1390 ok(dst[sizeof(hexpacked_w)/sizeof(WCHAR) * 4 + 1] == 0xcccc, "clobbered buffer\n");
1392 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1393 memset(dst, 0xcc, sizeof(dst));
1395 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1396 ok(hr == S_OK, "got %08x\n", hr);
1397 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1398 ok(dst_len == 0, "got %ld\n", dst_len);
1399 ok(dst[0] == 0, "not null terminated\n");
1400 ok(dst[1] == 0xcccc, "clobbered buffer\n");
1402 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1403 memset(dst, 0xcc, sizeof(dst));
1405 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1406 ok(hr == S_OK, "got %08x\n", hr);
1407 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1408 ok(dst_len == 2 * sizeof(WCHAR) * 4, "got %ld\n", dst_len);
1409 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 ), "got %s\n", wine_dbgstr_w(dst));
1410 ok(dst[2 * 4] == 0, "not null terminated\n");
1411 ok(dst[2 * 4 + 1] == 0xcccc, "clobbered buffer\n");
1413 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1414 memset(dst, 0xcc, sizeof(dst));
1416 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);
1417 ok(hr == S_OK, "got %08x\n", hr);
1418 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1419 ok(dst_len == sizeof(hexpacked_w) * 4, "got %ld\n", dst_len);
1420 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 ), "got %s\n", wine_dbgstr_w(dst));
1421 ok(dst[2 * 4] == 0, "not null terminated\n");
1422 ok(dst[2 * 4 + 1] == 0xcccc, "clobbered buffer\n");
1424 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1425 memset(dst, 0xcc, sizeof(dst));
1427 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);
1428 ok(hr == S_OK, "got %08x\n", hr);
1429 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1430 ok(dst_len == sizeof(hexpacked_w) * 4, "got %ld\n", dst_len);
1431 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 - 2 ), "got %s\n", wine_dbgstr_w(dst));
1432 ok(dst[2 * 4 - 1] == 0, "not null terminated\n");
1433 ok(dst[2 * 4] == 0xcccc, "clobbered buffer\n");
1435 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1436 memset(dst, 0xcc, sizeof(dst));
1438 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);
1439 ok(hr == S_OK, "got %08x\n", hr);
1440 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1441 ok(dst_len == sizeof(hexpacked_w) * 4, "got %ld\n", dst_len);
1442 ok(!memcmp(hexunpacked_w, dst, 2 * sizeof(WCHAR) * 4 - 2 ), "got %s\n", wine_dbgstr_w(dst));
1443 ok(dst[2 * 4 - 1] == 0, "not null terminated\n");
1444 ok(dst[2 * 4] == 0xcccc, "clobbered buffer\n");
1446 memcpy(src, hexpacked_w, sizeof(hexpacked_w));
1447 memset(dst, 0xcc, sizeof(dst));
1449 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_WSTR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1450 ok(hr == S_OK, "got %08x\n", hr);
1451 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1452 ok(dst_len == 0, "got %ld\n", dst_len);
1453 ok(dst[0] == 0, "not null terminated\n");
1454 ok(dst[1] == 0xcccc, "clobbered buffer\n");
1457 IDataConvert_Release(convert);
1460 static void test_converttostr(void)
1462 IDataConvert *convert;
1466 DBSTATUS dst_status;
1468 static const WCHAR ten[] = {'1','0',0};
1469 static const char ten_a[] = "10";
1470 static const char fourthreetwoone[] = "4321";
1471 static const char guid_str[] = "{0C733A8D-2A1C-11CE-ADE5-00AA0044773D}";
1472 static const char hexunpacked_a[] = "57696E6500";
1473 static const char hexpacked_a[] = "Wine";
1476 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
1479 win_skip("Unable to load oledb conversion library\n");
1484 memset(dst, 0xcc, sizeof(dst));
1486 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1487 ok(hr == S_OK, "got %08x\n", hr);
1488 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1489 ok(dst_len == 0, "got %ld\n", dst_len);
1490 ok(dst[0] == 0, "got %02x\n", dst[0]);
1491 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1493 memset(dst, 0xcc, sizeof(dst));
1495 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1496 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
1497 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
1498 ok(dst_len == 0x1234, "got %ld\n", dst_len);
1499 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1501 *(short *)src = 4321;
1503 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1504 ok(hr == S_OK, "got %08x\n", hr);
1505 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1506 ok(dst_len == 4, "got %ld\n", dst_len);
1507 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1509 *(short *)src = 4321;
1510 memset(dst, 0xcc, sizeof(dst));
1512 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1513 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1514 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1515 ok(dst_len == 4, "got %ld\n", dst_len);
1516 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1518 *(short *)src = 4321;
1519 memset(dst, 0xcc, sizeof(dst));
1521 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1522 ok(hr == S_OK, "got %08x\n", hr);
1523 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1524 ok(dst_len == 4, "got %ld\n", dst_len);
1525 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1527 *(short *)src = 4321;
1528 memset(dst, 0xcc, sizeof(dst));
1530 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1531 ok(hr == S_OK, "got %08x\n", hr);
1532 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1533 ok(dst_len == 4, "got %ld\n", dst_len);
1534 ok(dst[0] == '4', "got %02x\n", dst[0]);
1535 ok(dst[1] == 0, "got %02x\n", dst[1]);
1536 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
1538 *(short *)src = 4321;
1539 memset(dst, 0xcc, sizeof(dst));
1541 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
1542 ok(hr == S_OK, "got %08x\n", hr);
1543 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1544 ok(dst_len == 4, "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 *(short *)src = 4321;
1549 memset(dst, 0xcc, sizeof(dst));
1551 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1552 ok(hr == S_OK, "got %08x\n", hr);
1553 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1554 ok(dst_len == 4, "got %ld\n", dst_len);
1555 ok(dst[0] == '4', "got %02x\n", dst[0]);
1556 ok(dst[1] == '3', "got %02x\n", dst[1]);
1557 ok(dst[2] == '2', "got %02x\n", dst[2]);
1558 ok(dst[3] == 0, "got %02x\n", dst[3]);
1559 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
1564 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1565 ok(hr == S_OK, "got %08x\n", hr);
1566 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1567 ok(dst_len == 4, "got %ld\n", dst_len);
1568 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1571 memset(dst, 0xcc, sizeof(dst));
1573 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1574 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1575 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1576 ok(dst_len == 4, "got %ld\n", dst_len);
1577 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1580 memset(dst, 0xcc, sizeof(dst));
1582 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1583 ok(hr == S_OK, "got %08x\n", hr);
1584 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1585 ok(dst_len == 4, "got %ld\n", dst_len);
1586 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1589 memset(dst, 0xcc, sizeof(dst));
1591 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1592 ok(hr == S_OK, "got %08x\n", hr);
1593 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1594 ok(dst_len == 4, "got %ld\n", dst_len);
1595 ok(dst[0] == '4', "got %02x\n", dst[0]);
1596 ok(dst[1] == 0, "got %02x\n", dst[1]);
1597 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
1600 memset(dst, 0xcc, sizeof(dst));
1602 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
1603 ok(hr == S_OK, "got %08x\n", hr);
1604 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1605 ok(dst_len == 4, "got %ld\n", dst_len);
1606 ok(dst[0] == 0, "got %02x\n", dst[0]);
1607 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1610 memset(dst, 0xcc, sizeof(dst));
1612 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1613 ok(hr == S_OK, "got %08x\n", hr);
1614 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1615 ok(dst_len == 4, "got %ld\n", dst_len);
1616 ok(dst[0] == '4', "got %02x\n", dst[0]);
1617 ok(dst[1] == '3', "got %02x\n", dst[1]);
1618 ok(dst[2] == '2', "got %02x\n", dst[2]);
1619 ok(dst[3] == 0, "got %02x\n", dst[3]);
1620 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
1623 *(float *)src = 4321;
1625 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1626 ok(hr == S_OK, "got %08x\n", hr);
1627 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1628 ok(dst_len == 4, "got %ld\n", dst_len);
1629 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1631 *(float *)src = 4321;
1632 memset(dst, 0xcc, sizeof(dst));
1634 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1635 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1636 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1637 ok(dst_len == 4, "got %ld\n", dst_len);
1638 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1640 *(float *)src = 4321;
1641 memset(dst, 0xcc, sizeof(dst));
1643 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1644 ok(hr == S_OK, "got %08x\n", hr);
1645 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1646 ok(dst_len == 4, "got %ld\n", dst_len);
1647 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1649 *(float *)src = 4321;
1650 memset(dst, 0xcc, sizeof(dst));
1652 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1653 ok(hr == S_OK, "got %08x\n", hr);
1654 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1655 ok(dst_len == 4, "got %ld\n", dst_len);
1656 ok(dst[0] == '4', "got %02x\n", dst[0]);
1657 ok(dst[1] == 0, "got %02x\n", dst[1]);
1658 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
1660 *(float *)src = 4321;
1661 memset(dst, 0xcc, sizeof(dst));
1663 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
1664 ok(hr == S_OK, "got %08x\n", hr);
1665 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1666 ok(dst_len == 4, "got %ld\n", dst_len);
1667 ok(dst[0] == 0, "got %02x\n", dst[0]);
1668 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1670 *(float *)src = 4321;
1671 memset(dst, 0xcc, sizeof(dst));
1673 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1674 ok(hr == S_OK, "got %08x\n", hr);
1675 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1676 ok(dst_len == 4, "got %ld\n", dst_len);
1677 ok(dst[0] == '4', "got %02x\n", dst[0]);
1678 ok(dst[1] == '3', "got %02x\n", dst[1]);
1679 ok(dst[2] == '2', "got %02x\n", dst[2]);
1680 ok(dst[3] == 0, "got %02x\n", dst[3]);
1681 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
1684 *(double *)src = 4321;
1686 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1687 ok(hr == S_OK, "got %08x\n", hr);
1688 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1689 ok(dst_len == 4, "got %ld\n", dst_len);
1690 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1692 *(double *)src = 4321;
1693 memset(dst, 0xcc, sizeof(dst));
1695 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 0, 0, &dst_status, 0, 0, 0);
1696 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
1697 ok(dst_status == DBSTATUS_E_DATAOVERFLOW, "got %08x\n", dst_status);
1698 ok(dst_len == 4, "got %ld\n", dst_len);
1699 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1701 *(double *)src = 4321;
1702 memset(dst, 0xcc, sizeof(dst));
1704 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, NULL, 0, 0, &dst_status, 0, 0, 0);
1705 ok(hr == S_OK, "got %08x\n", hr);
1706 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1707 ok(dst_len == 4, "got %ld\n", dst_len);
1708 ok(dst[0] == (char)0xcc, "got %02x\n", dst[0]);
1710 *(double *)src = 4321;
1711 memset(dst, 0xcc, sizeof(dst));
1713 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 2, 0, &dst_status, 0, 0, 0);
1714 ok(hr == S_OK, "got %08x\n", hr);
1715 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1716 ok(dst_len == 4, "got %ld\n", dst_len);
1717 ok(dst[0] == '4', "got %02x\n", dst[0]);
1718 ok(dst[1] == 0, "got %02x\n", dst[1]);
1719 ok(dst[2] == (char)0xcc, "got %02x\n", dst[2]);
1721 *(double *)src = 4321;
1722 memset(dst, 0xcc, sizeof(dst));
1724 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 1, 0, &dst_status, 0, 0, 0);
1725 ok(hr == S_OK, "got %08x\n", hr);
1726 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1727 ok(dst_len == 4, "got %ld\n", dst_len);
1728 ok(dst[0] == 0, "got %02x\n", dst[0]);
1729 ok(dst[1] == (char)0xcc, "got %02x\n", dst[1]);
1731 *(double *)src = 4321;
1732 memset(dst, 0xcc, sizeof(dst));
1734 hr = IDataConvert_DataConvert(convert, DBTYPE_R8, DBTYPE_STR, 0, &dst_len, src, dst, 4, 0, &dst_status, 0, 0, 0);
1735 ok(hr == S_OK, "got %08x\n", hr);
1736 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1737 ok(dst_len == 4, "got %ld\n", dst_len);
1738 ok(dst[0] == '4', "got %02x\n", dst[0]);
1739 ok(dst[1] == '3', "got %02x\n", dst[1]);
1740 ok(dst[2] == '2', "got %02x\n", dst[2]);
1741 ok(dst[3] == 0, "got %02x\n", dst[3]);
1742 ok(dst[4] == (char)0xcc, "got %02x\n", dst[4]);
1746 memset(src, 0, sizeof(src));
1747 ((CY*)src)->int64 = 43210000;
1748 memset(dst, 0xcc, sizeof(dst));
1750 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1751 ok(hr == S_OK, "got %08x\n", hr);
1752 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1753 ok(dst_len == 4, "got %ld\n", dst_len);
1754 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1758 memset(src, 0, sizeof(src));
1759 *(signed char *)src = 10;
1761 hr = IDataConvert_DataConvert(convert, DBTYPE_I1, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1762 ok(hr == S_OK, "got %08x\n", hr);
1763 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1764 ok(dst_len == 2, "got %ld\n", dst_len);
1765 ok(!lstrcmpA(dst, ten_a), "got %s\n", dst);
1767 memset(src, 0, sizeof(src));
1768 *(unsigned char *)src = 10;
1770 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1771 ok(hr == S_OK, "got %08x\n", hr);
1772 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1773 ok(dst_len == 2, "got %ld\n", dst_len);
1774 ok(!lstrcmpA(dst, ten_a), "got %s\n", dst);
1776 memset(src, 0, sizeof(src));
1777 *(unsigned short *)src = 4321;
1779 hr = IDataConvert_DataConvert(convert, DBTYPE_UI2, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1780 ok(hr == S_OK, "got %08x\n", hr);
1781 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1782 ok(dst_len == 4, "got %ld\n", dst_len);
1783 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1785 memset(src, 0, sizeof(src));
1786 *(unsigned int *)src = 4321;
1788 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1789 ok(hr == S_OK, "got %08x\n", hr);
1790 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1791 ok(dst_len == 4, "got %ld\n", dst_len);
1792 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1794 memset(src, 0, sizeof(src));
1795 ((LARGE_INTEGER*)src)->QuadPart = 4321;
1797 hr = IDataConvert_DataConvert(convert, DBTYPE_I8, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1798 ok(broken(DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08x\n", hr);
1799 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08x\n", dst_status);
1800 ok(broken(dst_len == 0x1234) || dst_len == 4 /* W2K+ */, "got %ld\n", dst_len);
1801 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1803 memset(src, 0, sizeof(src));
1804 ((ULARGE_INTEGER*)src)->QuadPart = 4321;
1806 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1807 ok(broken(DB_E_UNSUPPORTEDCONVERSION) || hr == S_OK /* W2K+ */, "got %08x\n", hr);
1808 ok(broken(dst_status == DBSTATUS_E_BADACCESSOR) || dst_status == DBSTATUS_S_OK /* W2K+ */, "got %08x\n", dst_status);
1809 ok(broken(dst_len == 0x1234) || dst_len == 4 /* W2K+ */, "got %ld\n", dst_len);
1810 ok(!lstrcmpA(dst, fourthreetwoone), "got %s\n", dst);
1814 memset(src, 0, sizeof(src));
1815 memcpy(src, &IID_IDataConvert, sizeof(GUID));
1816 memset(dst, 0xcc, sizeof(dst));
1818 hr = IDataConvert_DataConvert(convert, DBTYPE_GUID, DBTYPE_STR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1819 ok(hr == S_OK, "got %08x\n", hr);
1820 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1821 ok(dst_len == 38, "got %ld\n", dst_len);
1822 ok(!lstrcmpA(dst, guid_str), "got %s\n", dst);
1826 b = SysAllocString(ten);
1828 memset(dst, 0xcc, sizeof(dst));
1830 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1831 ok(hr == S_OK, "got %08x\n", hr);
1832 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1833 ok(dst_len == 2, "got %ld\n", dst_len);
1834 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
1837 memcpy(src, ten, sizeof(ten));
1838 memset(dst, 0xcc, sizeof(dst));
1840 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR, 2, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1841 ok(hr == S_OK, "got %08x\n", hr);
1842 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1843 ok(dst_len == 1, "got %ld\n", dst_len);
1844 ok(dst[0] == '1', "got %02x\n", dst[0]);
1845 ok(dst[1] == 0, "got %02x\n", dst[1]);
1847 memcpy(src, ten, sizeof(ten));
1848 memset(dst, 0xcc, sizeof(dst));
1850 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1851 ok(hr == S_OK, "got %08x\n", hr);
1852 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1853 ok(dst_len == 2, "got %ld\n", dst_len);
1854 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
1856 memcpy(src, ten, sizeof(ten));
1857 memset(dst, 0xcc, sizeof(dst));
1859 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1860 ok(hr == S_OK, "got %08x\n", hr);
1861 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1862 ok(dst_len == 2, "got %ld\n", dst_len);
1863 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
1865 memcpy(src, ten_a, sizeof(ten_a));
1866 memset(dst, 0xcc, sizeof(dst));
1868 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 2, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1869 ok(hr == S_OK, "got %08x\n", hr);
1870 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1871 ok(dst_len == 2, "got %ld\n", dst_len);
1872 ok(dst[0] == '1', "got %02x\n", dst[0]);
1873 ok(dst[1] == '0', "got %02x\n", dst[1]);
1874 ok(dst[2] == 0, "got %02x\n", dst[2]);
1875 ok(dst[3] == (char)0xcc, "got %02x\n", dst[3]);
1877 memcpy(src, ten_a, sizeof(ten_a));
1878 memset(dst, 0xcc, sizeof(dst));
1880 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1881 ok(hr == S_OK, "got %08x\n", hr);
1882 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1883 ok(dst_len == 4, "got %ld\n", dst_len);
1884 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
1886 memcpy(src, ten_a, sizeof(ten_a));
1887 memset(dst, 0xcc, sizeof(dst));
1889 hr = IDataConvert_DataConvert(convert, DBTYPE_STR, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1890 ok(hr == S_OK, "got %08x\n", hr);
1891 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1892 ok(dst_len == 2, "got %ld\n", dst_len);
1893 ok(!lstrcmpA(ten_a, dst), "got %s\n", dst);
1897 /* DBTYPE_BYTES to DBTYPE_*STR unpacks binary data into a hex string */
1898 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1899 memset(dst, 0xcc, sizeof(dst));
1901 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, sizeof(hexpacked_a), &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1902 ok(hr == S_OK, "got %08x\n", hr);
1903 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1904 ok(dst_len == sizeof(hexpacked_a) * 2, "got %ld\n", dst_len);
1905 ok(!lstrcmpA(hexunpacked_a, dst), "got %s\n", dst);
1906 ok(dst[sizeof(hexpacked_a)/sizeof(char) * 4 + 1] == (char)0xcc, "clobbered buffer\n");
1908 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1909 memset(dst, 0xcc, sizeof(dst));
1911 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1912 ok(hr == S_OK, "got %08x\n", hr);
1913 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1914 ok(dst_len == 0, "got %ld\n", dst_len);
1915 ok(dst[0] == 0, "not null terminated\n");
1916 ok(dst[1] == (char)0xcc, "clobbered buffer\n");
1918 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1919 memset(dst, 0xcc, sizeof(dst));
1921 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, 4, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1922 ok(hr == S_OK, "got %08x\n", hr);
1923 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1924 ok(dst_len == 2 * sizeof(char) * 4, "got %ld\n", dst_len);
1925 ok(!memcmp(hexunpacked_a, dst, 2 * sizeof(char) * 4 ), "got %s\n", dst);
1926 ok(dst[2 * 4] == 0, "not null terminated\n");
1927 ok(dst[2 * 4 + 1] == (char)0xcc, "clobbered buffer\n");
1929 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1930 memset(dst, 0xcc, sizeof(dst));
1932 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);
1933 ok(hr == S_OK, "got %08x\n", hr);
1934 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1935 ok(dst_len == sizeof(hexpacked_a) * 2, "got %ld\n", dst_len);
1936 ok(!memcmp(hexunpacked_a, dst, 2 * sizeof(char) * 4 ), "got %s\n", dst);
1937 ok(dst[2 * 4] == 0, "not null terminated\n");
1938 ok(dst[2 * 4 + 1] == (char)0xcc, "clobbered buffer\n");
1940 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1941 memset(dst, 0xcc, sizeof(dst));
1943 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);
1944 ok(hr == S_OK, "got %08x\n", hr);
1945 ok(dst_status == DBSTATUS_S_TRUNCATED, "got %08x\n", dst_status);
1946 ok(dst_len == sizeof(hexpacked_a) * 2, "got %ld\n", dst_len);
1947 ok(!memcmp(hexunpacked_a, dst, 2 * sizeof(char) * 4 - 2 ), "got %s\n", dst);
1948 ok(dst[2 * 4 - 1] == 0, "not null terminated\n");
1949 ok(dst[2 * 4] == (char)0xcc, "clobbered buffer\n");
1951 memcpy(src, hexpacked_a, sizeof(hexpacked_a));
1952 memset(dst, 0xcc, sizeof(dst));
1954 hr = IDataConvert_DataConvert(convert, DBTYPE_BYTES, DBTYPE_STR, 0, &dst_len, src, dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
1955 ok(hr == S_OK, "got %08x\n", hr);
1956 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1957 ok(dst_len == 0, "got %ld\n", dst_len);
1958 ok(dst[0] == 0, "not null terminated\n");
1959 ok(dst[1] == (char)0xcc, "clobbered buffer\n");
1961 IDataConvert_Release(convert);
1964 static void test_converttobyrefwstr(void)
1966 IDataConvert *convert;
1970 DBSTATUS dst_status;
1972 static const WCHAR ten[] = {'1','0',0};
1973 static const WCHAR fourthreetwoone[] = {'4','3','2','1',0};
1976 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
1979 win_skip("Unable to load oledb conversion library\n");
1983 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1984 ok(hr == S_OK, "got %08x\n", hr);
1985 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
1986 ok(dst_len == 0, "got %ld\n", dst_len);
1987 ok(dst[0] == 0, "got %04x\n", dst[0]);
1990 dst = (void*)0x12345678;
1992 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
1993 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
1994 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
1995 ok(dst_len == 0x1234, "got %ld\n", dst_len);
1996 ok(dst == (void*)0x12345678, "got %p\n", dst);
1998 *(short *)src = 4321;
2000 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2001 ok(hr == S_OK, "got %08x\n", hr);
2002 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2003 ok(dst_len == 8, "got %ld\n", dst_len);
2004 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
2007 *(short *)src = 4321;
2009 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, 0, 0, &dst_status, 0, 0, 0);
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 == 8, "got %ld\n", dst_len);
2013 ok(!lstrcmpW(dst, fourthreetwoone), "got %s\n", wine_dbgstr_w(dst));
2016 b = SysAllocString(ten);
2019 hr = IDataConvert_DataConvert(convert, DBTYPE_BSTR, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2020 ok(hr == S_OK, "got %08x\n", hr);
2021 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2022 ok(dst_len == 4, "got %ld\n", dst_len);
2023 ok(!lstrcmpW(b, dst), "got %s\n", wine_dbgstr_w(dst));
2027 memcpy(src, ten, sizeof(ten));
2029 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_BYREF | DBTYPE_WSTR, 2, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2030 ok(hr == S_OK, "got %08x\n", hr);
2031 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2032 ok(dst_len == 2, "got %ld\n", dst_len);
2033 ok(dst[0] == '1', "got %02x\n", dst[0]);
2034 ok(dst[1] == 0, "got %02x\n", dst[1]);
2037 memcpy(src, ten, sizeof(ten));
2039 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_BYREF | DBTYPE_WSTR, 4, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2040 ok(hr == S_OK, "got %08x\n", hr);
2041 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2042 ok(dst_len == 4, "got %ld\n", dst_len);
2043 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
2046 memcpy(src, ten, sizeof(ten));
2048 hr = IDataConvert_DataConvert(convert, DBTYPE_WSTR, DBTYPE_BYREF | DBTYPE_WSTR, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, DBDATACONVERT_LENGTHFROMNTS);
2049 ok(hr == S_OK, "got %08x\n", hr);
2050 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2051 ok(dst_len == 4, "got %ld\n", dst_len);
2052 ok(!lstrcmpW(ten, dst), "got %s\n", wine_dbgstr_w(dst));
2055 IDataConvert_Release(convert);
2058 static void test_converttoguid(void)
2060 IDataConvert *convert;
2064 DBSTATUS dst_status;
2067 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2070 win_skip("Unable to load oledb conversion library\n");
2076 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_GUID, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2077 ok(hr == S_OK, "got %08x\n", hr);
2078 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2079 ok(dst_len == sizeof(GUID), "got %ld\n", dst_len);
2080 ok(IsEqualGUID(&dst, &GUID_NULL), "didn't get GUID_NULL\n");
2084 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_GUID, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2085 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2086 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2087 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2088 ok(IsEqualGUID(&dst, &IID_IDCInfo), "dst has changed\n");
2091 memcpy(src, &IID_IDataConvert, sizeof(GUID));
2093 hr = IDataConvert_DataConvert(convert, DBTYPE_GUID, DBTYPE_GUID, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2094 ok(hr == S_OK, "got %08x\n", hr);
2095 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2096 ok(dst_len == sizeof(GUID), "got %ld\n", dst_len);
2097 ok(IsEqualGUID(&dst, &IID_IDataConvert), "didn't get IID_IDataConvert\n");
2099 IDataConvert_Release(convert);
2102 static void test_converttofiletime(void)
2104 IDataConvert *convert;
2108 DBSTATUS dst_status;
2111 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2114 win_skip("Unable to load oledb conversion library\n");
2118 memset(&dst, 0xcc, sizeof(dst));
2119 ((FILETIME *)src)->dwLowDateTime = 0x12345678;
2120 ((FILETIME *)src)->dwHighDateTime = 0x9abcdef0;
2122 hr = IDataConvert_DataConvert(convert, DBTYPE_FILETIME, DBTYPE_FILETIME, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2124 broken(hr == DB_E_BADBINDINFO), /* win98 */
2128 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2129 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2130 ok(dst.dwLowDateTime == 0x12345678, "got %08x\n", dst.dwLowDateTime);
2131 ok(dst.dwHighDateTime == 0x9abcdef0, "got %08x\n", dst.dwHighDateTime);
2134 IDataConvert_Release(convert);
2137 static void test_converttoui1(void)
2139 IDataConvert *convert;
2143 DBSTATUS dst_status;
2146 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2149 win_skip("Unable to load oledb conversion library\n");
2155 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2156 ok(hr == S_OK, "got %08x\n", hr);
2157 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2158 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2159 ok(dst == 0, "got %08x\n", dst);
2163 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2164 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2165 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2166 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2167 ok(dst == 0x12, "got %08x\n", dst);
2172 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2173 ok(hr == S_OK, "got %08x\n", hr);
2174 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2175 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2176 ok(dst == 0x43, "got %08x\n", dst);
2181 hr = IDataConvert_DataConvert(convert, DBTYPE_UI1, DBTYPE_UI1, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2182 ok(hr == S_OK, "got %08x\n", hr);
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 == 0xfe, "got %08x\n", dst);
2187 IDataConvert_Release(convert);
2190 static void test_converttoui4(void)
2192 IDataConvert *convert;
2196 DBSTATUS dst_status;
2199 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2202 win_skip("Unable to load oledb conversion library\n");
2208 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2209 ok(hr == S_OK, "got %08x\n", hr);
2210 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2211 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2212 ok(dst == 0, "got %08x\n", dst);
2216 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2217 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2218 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2219 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2220 ok(dst == 0x12345678, "got %08x\n", dst);
2223 *(DWORD*)src = 0x87654321;
2225 hr = IDataConvert_DataConvert(convert, DBTYPE_UI4, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2226 ok(hr == S_OK, "got %08x\n", hr);
2227 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2228 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2229 ok(dst == 0x87654321, "got %08x\n", dst);
2232 *(signed short *)src = 0x4321;
2234 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2235 ok(hr == S_OK, "got %08x\n", hr);
2236 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2237 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2238 ok(dst == 0x4321, "got %08x\n", dst);
2241 *(signed short *)src = -1;
2243 hr = IDataConvert_DataConvert(convert, DBTYPE_I2, DBTYPE_UI4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2244 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
2246 ok(dst_status == DBSTATUS_E_SIGNMISMATCH, "got %08x\n", dst_status);
2248 ok(broken(dst_len == sizeof(dst)) || dst_len == 0x1234 /* W2K+ */, "got %ld\n", dst_len);
2249 ok(dst == 0x12345678, "got %08x\n", dst);
2251 IDataConvert_Release(convert);
2254 static void test_converttor4(void)
2256 IDataConvert *convert;
2260 DBSTATUS dst_status;
2263 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2266 win_skip("Unable to load oledb conversion library\n");
2272 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2273 ok(hr == S_OK, "got %08x\n", hr);
2274 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2275 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2276 ok(dst == 0.0, "got %f\n", dst);
2280 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2281 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2282 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2283 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2284 ok(dst == 1.0, "got %f\n", dst);
2287 *(signed int*)src = 12345678;
2289 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_R4, 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 == 12345678.0, "got %f\n", dst);
2296 *(FLOAT *)src = 10.0;
2298 hr = IDataConvert_DataConvert(convert, DBTYPE_R4, DBTYPE_R4, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2299 ok(hr == S_OK, "got %08x\n", hr);
2300 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2301 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2302 ok(dst == 10.0, "got %f\n", dst);
2304 IDataConvert_Release(convert);
2307 static void test_converttocy(void)
2309 IDataConvert *convert;
2313 DBSTATUS dst_status;
2316 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2319 win_skip("Unable to load oledb conversion library\n");
2325 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2326 ok(hr == S_OK, "got %08x\n", hr);
2327 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2328 ok(dst_len == sizeof(CY), "got %ld\n", dst_len);
2329 ok(dst.int64 == 0, "didn't get 0\n");
2333 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2334 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2335 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2336 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2337 ok(dst.int64 == 0xcc, "dst changed\n");
2342 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2343 ok(hr == S_OK, "got %08x\n", hr);
2344 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2345 ok(dst_len == sizeof(CY), "got %ld\n", dst_len);
2346 ok(dst.int64 == 12340000, "got %d\n", dst.s.Lo);
2349 ((CY*)src)->int64 = 1234;
2351 hr = IDataConvert_DataConvert(convert, DBTYPE_CY, DBTYPE_CY, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2352 ok(hr == S_OK, "got %08x\n", hr);
2353 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2354 ok(dst_len == sizeof(CY), "got %ld\n", dst_len);
2355 ok(dst.int64 == 1234, "got %d\n", dst.s.Lo);
2357 IDataConvert_Release(convert);
2360 static void test_converttoui8(void)
2362 IDataConvert *convert;
2366 DBSTATUS dst_status;
2369 hr = CoCreateInstance(&CLSID_OLEDB_CONVERSIONLIBRARY, NULL, CLSCTX_INPROC_SERVER, &IID_IDataConvert, (void**)&convert);
2372 win_skip("Unable to load oledb conversion library\n");
2376 dst.QuadPart = 0xcc;
2378 hr = IDataConvert_DataConvert(convert, DBTYPE_EMPTY, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2379 ok(hr == S_OK, "got %08x\n", hr);
2380 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2381 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2382 ok(dst.QuadPart == 0, "got %d\n", (int)dst.QuadPart);
2384 dst.QuadPart = 0xcc;
2386 hr = IDataConvert_DataConvert(convert, DBTYPE_NULL, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2387 ok(hr == DB_E_UNSUPPORTEDCONVERSION, "got %08x\n", hr);
2388 ok(dst_status == DBSTATUS_E_BADACCESSOR, "got %08x\n", dst_status);
2389 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2390 ok(dst.QuadPart == 0xcc, "dst changed\n");
2392 dst.QuadPart = 0xcc;
2395 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2396 ok(hr == S_OK, "got %08x\n", hr);
2397 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2398 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2399 ok(dst.QuadPart == 1234, "got %d\n", (int)dst.QuadPart);
2401 dst.QuadPart = 0xcc;
2404 hr = IDataConvert_DataConvert(convert, DBTYPE_I4, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2405 ok(hr == DB_E_ERRORSOCCURRED, "got %08x\n", hr);
2407 ok(dst_status == DBSTATUS_E_SIGNMISMATCH, "got %08x\n", dst_status);
2409 ok(dst_len == 0x1234, "got %ld\n", dst_len);
2410 ok(dst.QuadPart == 0xcc, "got %d\n", (int)dst.QuadPart);
2412 dst.QuadPart = 0xcc;
2413 ((ULARGE_INTEGER*)src)->QuadPart = 1234;
2415 hr = IDataConvert_DataConvert(convert, DBTYPE_UI8, DBTYPE_UI8, 0, &dst_len, src, &dst, sizeof(dst), 0, &dst_status, 0, 0, 0);
2416 ok(hr == S_OK, "got %08x\n", hr);
2417 ok(dst_status == DBSTATUS_S_OK, "got %08x\n", dst_status);
2418 ok(dst_len == sizeof(dst), "got %ld\n", dst_len);
2419 ok(dst.QuadPart == 1234, "got %d\n", (int)dst.QuadPart);
2421 IDataConvert_Release(convert);
2426 OleInitialize(NULL);
2431 test_converttostr();
2432 test_converttobstr();
2433 test_converttowstr();
2434 test_converttobyrefwstr();
2435 test_converttoguid();
2436 test_converttoui1();
2437 test_converttoui4();
2439 test_converttofiletime();
2441 test_converttoui8();