Move the test strings into their own array and convert them to unicode
[wine/multimedia.git] / dlls / oleaut32 / tests / vartest.c
blobcdeb2099548d933c56d0ae4e4cae66d69a541df7
1 /*
2 * VARIANT test program
4 * Copyright 1998 Jean-Claude Cote
6 * The purpose of this program is validate the implementation
7 * of the APIs related to VARIANTs. The validation is done
8 * by comparing the results given by the Windows implementation
9 * versus the Wine implementation.
11 * This program tests the creation/coercion/destruction of VARIANTs.
13 * The program does not currently test any API that takes
14 * arguments of type: IDispatch, IUnknown, DECIMAL, CURRENCY.
16 * Since the purpose of this program is to compare the results
17 * from Windows and Wine it is written so that with a simple
18 * define it can be compiled either in Windows or Linux.
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
25 * This library is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
34 * NOTES
35 * - The Variant structure in Windows has a non-named union. This means
36 * the member of the union are accessible simply by doing
37 * pVariant->pfltVal. With gcc it is not possible to have non-named
38 * union so it has been named 'u'. So it's members are accessible
39 * using this name like so pVariant->u.pfltVal. So if this program is
40 * compiled in Windows the references to 'u' will need to be take out
41 * of this file.
43 * - Also the printf is a little different so the format specifiers may
44 * need to be tweaked if this file is compile in Windows.
45 * Printf is also different in that it continues printing numbers
46 * even after there is no more significative digits left to print. These
47 * number are garbage and in windows they are set to zero but not
48 * on Linux.
50 * - The VarDateFromStr is not implemented yet.
52 * - The date and floating point format may not be the exact same
53 * format has the one inwindows depending on what the Internatinal
54 * setting are in windows.
60 #include <stdio.h>
61 #include <stdlib.h>
62 #include <math.h>
63 #include <float.h>
64 #include <time.h>
66 #include "wine/test.h"
67 #include "winbase.h"
68 #include "winuser.h"
69 #include "wingdi.h"
70 #include "winnls.h"
71 #include "winerror.h"
72 #include "winnt.h"
74 #include "wtypes.h"
75 #include "oleauto.h"
78 #define MAX_BUFFER 1024
80 static char* WtoA( OLECHAR* p )
82 static char buffer[MAX_BUFFER];
83 DWORD len = WideCharToMultiByte( CP_ACP, 0, p, -1, buffer+1, sizeof(buffer)-3, NULL, NULL );
84 buffer[0] = '\"';
85 buffer[len] = '\"';
86 buffer[len+1] = 0;
87 return buffer;
90 static OLECHAR* AtoW( char* p )
92 OLECHAR *buffer;
93 DWORD len = MultiByteToWideChar( CP_ACP, 0, p, -1, NULL, 0 );
94 buffer = malloc( len * sizeof(OLECHAR) );
95 MultiByteToWideChar( CP_ACP, 0, p, -1, buffer, len );
96 return buffer;
99 static const struct _vartypes {
100 int ind;
101 DWORD vcind1,vcind2,vcex1,vcex2;
102 } vartypes[] = {
103 {0, 0, 0x80070057, 0, 0x80020008 },
104 {1, 0, 0x80070057, 0, 0x80020008 },
105 {2, 0, 0, 0, 0x80020005 },
106 {3, 0, 0, 0, 0x80020005 },
107 {4, 0, 0, 0, 0x80020005 },
108 {5, 0, 0, 0, 0x80020005 },
109 {6, 0, 0, 0, 0x80020005 },
110 {7, 0, 0, 0, 0x80020005 },
111 {77,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
112 {78,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
113 {79,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
114 {80,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
115 {81,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
116 {82,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
117 {83,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
118 {84,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
119 {85,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
120 {86,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
121 {87,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
122 {88,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
123 {89,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
124 {90,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
125 {91,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
126 {92,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
127 {93,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
128 {94,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
129 {95,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
130 {96,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
131 {97,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
132 {98,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
133 {99,0x80020008, 0x80070057, 0x80020008, 0x80020008 },
136 static const char *strfromr8[] = {
137 "1",
138 "-1",
139 "21",
140 "-21",
141 "321",
142 "-321",
143 "4321",
144 "-4321",
145 "54321",
146 "-54321",
147 "654321",
148 "-654321",
149 "7654321",
150 "-7654321",
151 "87654321",
152 "-87654321",
153 "987654321",
154 "-987654321",
155 "1987654321",
156 "-1987654321",
157 "21987654321",
158 "-21987654321",
159 "321987654321",
160 "-321987654321",
161 "4321987654321",
162 "-4321987654321",
163 "54321987654321",
164 "-54321987654321",
165 "654321987654321",
166 "-654321987654321",
167 "7.65432198765432e+15",
168 "-7.65432198765432e+15",
169 "8.76543219876543e+16",
170 "-8.76543219876543e+16",
171 "9.87654321987654e+17",
172 "-9.87654321987654e+17",
173 "1.98765432198765e+18",
174 "-1.98765432198765e+18",
175 "2.19876543219877e+19",
176 "-2.19876543219877e+19",
177 "1",
178 "0",
179 "-1",
180 "1.2",
181 "0.2",
182 "-1.2",
183 "1.23",
184 "0.23",
185 "-1.23",
186 "1.234",
187 "0.234",
188 "-1.234",
189 "1.2345",
190 "0.2345",
191 "-1.2345",
192 "1.23456",
193 "0.23456",
194 "-1.23456",
195 "1.234567",
196 "0.234567",
197 "-1.234567",
198 "1.2345678",
199 "0.2345678",
200 "-1.2345678",
201 "1.23456789",
202 "0.23456789",
203 "-1.23456789",
204 "1.234567891",
205 "0.234567891",
206 "-1.234567891",
207 "1.2345678912",
208 "0.2345678912",
209 "-1.2345678912",
210 "1.23456789123",
211 "0.23456789123",
212 "-1.23456789123",
213 "1.234567891234",
214 "0.234567891234",
215 "-1.234567891234",
216 "1.2345678912345",
217 "0.2345678912345",
218 "-1.2345678912345",
219 "1.23456789123456",
220 "0.23456789123456",
221 "-1.23456789123456",
222 "1.23456789123457",
223 "0.234567891234567",
224 "-1.23456789123457",
225 "1.23456789123457",
226 "0.234567891234568",
227 "-1.23456789123457",
228 "1.23456789123457",
229 "0.234567891234568",
230 "-1.23456789123457",
231 "1.23456789123457",
232 "0.234567891234568",
233 "-1.23456789123457",
234 "1.23456789123457",
235 "0.234567891234568",
236 "-1.23456789123457",
237 "2",
238 "-2",
239 "22.2",
240 "-22.2",
241 "322.23",
242 "-322.23",
243 "4322.234",
244 "-4322.234",
245 "54322.2345",
246 "-54322.2345",
247 "654322.23456",
248 "-654322.23456",
249 "7654322.234567",
250 "-7654322.234567",
251 "87654322.2345678",
252 "-87654322.2345678",
253 "987654322.234568",
254 "-987654322.234568",
255 "1987654322.23457",
256 "-1987654322.23457",
257 "21987654322.2346",
258 "-21987654322.2346",
259 "321987654322.235",
260 "-321987654322.235",
261 "4321987654322.23",
262 "-4321987654322.23",
263 "54321987654322.2",
264 "-54321987654322.2",
265 "654321987654322",
266 "-654321987654322",
267 "7.65432198765432e+15",
268 "-7.65432198765432e+15",
269 "8.76543219876543e+16",
270 "-8.76543219876543e+16",
271 "9.87654321987654e+17",
272 "-9.87654321987654e+17",
273 "1.98765432198765e+18",
274 "-1.98765432198765e+18",
275 "2.19876543219877e+19",
276 "-2.19876543219877e+19",
277 /* r4 tests */
278 "1",
279 "-1",
280 "21",
281 "-21",
282 "321",
283 "-321",
284 "4321",
285 "-4321",
286 "54321",
287 "-54321",
288 "654321",
289 "-654321",
290 "7654321",
291 "-7654321",
292 "8.765432e+07",
293 "-8.765432e+07",
294 "9.876543e+08",
295 "-9.876543e+08",
296 "1.987654e+09",
297 "-1.987654e+09",
298 "1",
299 "0",
300 "-1",
301 "1.2",
302 "0.2",
303 "-1.2",
304 "1.23",
305 "0.23",
306 "-1.23",
307 "1.234",
308 "0.234",
309 "-1.234",
310 "1.2345",
311 "0.2345001", /* FIXME: should be 0.2345 ? */
312 "-1.2345",
313 "1.23456",
314 "0.23456",
315 "-1.23456",
316 "1.234567",
317 "0.234567",
318 "-1.234567",
319 "1.234568",
320 "0.2345678",
321 "-1.234568",
322 "1.234568",
323 "0.2345679",
324 "-1.234568",
325 "1.234568",
326 "0.2345679",
327 "-1.234568",
328 "2",
329 "-2",
330 "22.2",
331 "-22.2",
332 "322.23",
333 "-322.23",
334 "4322.234",
335 "-4322.234",
336 "54322.23",
337 "-54322.23",
338 "654322.2", /* FIXME: should be 654322.3 */
339 "-654322.2",/* FIXME: should be -654322.3 */
340 "7654322",
341 "-7654322",
342 "8.765432e+07",
343 "-8.765432e+07",
344 "9.876543e+08",
345 "-9.876543e+08",
346 "1.987654e+09",
347 "-1.987654e+09",
350 /* These are the strings we use for the XxxFromStr tests.
351 * The arrays that follow define the expected results for each type.
353 static char* _pTestStrA[] = {
354 "-2",
355 "-1",
356 "-0.51",
357 "-0.5",
358 "-0.49",
359 "-0.0",
360 "0.0",
361 "0.49",
362 "0.5",
363 "0.51",
364 "1",
365 "127",
366 "128",
367 "129",
368 "255",
369 "256",
370 "257",
371 "32767",
372 "32768",
373 "-32768",
374 "-32769",
375 "16777216",
376 "16777217",
377 "-16777216",
378 "16777217",
379 "2147483647",
380 "2147483648",
381 "-2147483647",
382 "-2147483648",
385 " ",
386 "1F",
387 "1G",
388 " 1 ",
389 " 1 2 ",
390 "1,2,3",
391 "1 2 3",
392 "1,2, 3",
393 "1;2;3",
394 "1.2.3",
396 "0.",
397 ".0",
398 "0.1E12",
399 "2.4,E1",
400 " +3.2,E1",
401 "4E2.5",
402 " 2E+2",
403 "1 E+2",
404 ".",
405 ".E2",
406 "1000000000000000000000000000000000000000000000000000000000000000",
407 "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
408 "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
409 "100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
410 "0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001",
411 "65535",
412 "65535.5",
413 "65536",
414 "4294967295",
415 "4294967296",
417 "1 January 99",
418 "December 31, 2078",
419 "January 1, 1900",
420 "January 2 1900",
421 "11.11.1999",
422 "11/11/1999",
423 " 11 / 11 / 1999",
424 "11/11/1999:11:11:1134",
425 "11/11/1999 11:11:11:1",
426 "\t1999/\t11/21 11 :11:11am",
428 "11/11/1999 11:11:11Am",
429 "11/11/1999 11:11:11PM",
430 "11/11/199911:11:11PM",
431 "11/11/1999 0:0:11am",
432 "11/11/1999 11,11:11am",
433 "11/11/1999 11:11:11am",
434 "11/11/1999 11/11:11am",
435 "11/11/1999 11:11AM",
436 "11/11/1999 1AM",
437 "11/11/1999 0AM",
439 "11/11/1999 11:11:11",
440 "11/13/1999 0AM",
441 "13/13/1999 0AM",
442 "13/11/1999 0AM",
443 "11/33/1999 0AM",
444 "11/11/1999 AM",
445 "1/1/0 0AM",
446 "1/1/-1 0AM",
447 "1999 January 3 9AM",
448 "1 January 1999 11AM",
450 "4AM 11/11/1999",
451 "4:22 11/11/1999 AM",
452 " 1 1 /11/1999",
453 "11-11/1999 11:11:11.12AM",
454 "1999 January 3, 9AM",
455 "December, 31, 2078",
456 "December, 31, 2078,",
457 "December, 31 2078",
458 "11/99",
459 "11-1999",
461 "true",
462 "True",
463 "TRue",
464 "TRUE",
465 " TRUE",
466 "FALSE ",
467 "False",
468 "JustSomeText",
469 "Just Some Text",
471 "1.5",
472 "2.5",
473 "3.5",
474 "4.5",
476 #define NB_OLE_STRINGS (sizeof(_pTestStrA)/sizeof(*_pTestStrA))
478 static const struct _strret_date {
479 HRESULT error;
480 DATE retval;
481 BOOL todo_rc;
482 BOOL todo_val;
483 } strrets_DATE[NB_OLE_STRINGS] = {
484 { 0x80020005 },
485 { 0x80020005 },
486 { 0x80020005 },
487 { 0x80020005 },
488 { 0x80020005 },
489 { 0x80020005 },
490 { 0, 0.000000, 1 },
491 { 0, 0.034028, 1 },
492 { 0, 0.003472, 1 },
493 { 0, 0.035417, 1 },
494 { 0x80020005 },
495 { 0x80020005 },
496 { 0x80020005 },
497 { 0x80020005 },
498 { 0x80020005 },
499 { 0x80020005 },
500 { 0x80020005 },
501 { 0x80020005 },
502 { 0x80020005 },
503 { 0x80020005 },
504 { 0x80020005 },
505 { 0x80020005, 0, 1 },
506 { 0x80020005, 0, 1 },
507 { 0x80020005 },
508 { 0x80020005, 0, 1 },
509 { 0x80020005 },
510 { 0x80020005 },
511 { 0x80020005 },
512 { 0x80020005 },
513 { 0x80020005 },
514 { 0x80020005 },
515 { 0x80020005 },
516 { 0x80020005 },
517 { 0x80020005 },
518 { 0, 35797.000000, 1 },
519 { 0, 37623.000000 },
520 { 0, 37623.000000 },
521 { 0, 37623.000000 },
522 { 0x80020005, 0, 1 },
523 { 0, 0.043090, 0, 1 },
524 { 0x80020005 },
525 { 0x80020005 },
526 { 0x80020005, 0, 1 },
527 { 0x80020005, 0, 1 },
528 { 0x80020005 },
529 { 0x80020005, 0, 1 },
530 { 0x80020005 },
531 { 0x80020005 },
532 { 0x80020005 },
533 { 0x80020005 },
534 { 0x80020005 },
535 { 0x80020005 },
536 { 0x80020005 },
537 { 0x80020005 },
538 { 0x80020005 },
539 { 0x80020005 },
540 { 0x80020005 },
541 { 0x80020005 },
542 { 0x80020005 },
543 { 0x80020005 },
544 { 0, 36161.000000, 1 },
545 { 0, 65380.000000 },
546 { 0, 2.000000 },
547 { 0, 3.000000 },
548 { 0x80020005, 0, 1 },
549 { 0, 36475.000000 },
550 { 0, 36475.000000 },
551 { 0x80020005 },
552 { 0x80020005 },
553 { 0, 36485.466100, 1 },
554 { 0, 36475.466100, 0, 1 },
555 { 0, 36475.966100, 0, 1 },
556 { 0x80020005, 0, 1 },
557 { 0, 36475.000127, 0, 1 },
558 { 0x80020005 },
559 { 0, 36475.466100, 0, 1 },
560 { 0x80020005 },
561 { 0, 36475.465972, 0, 1 },
562 { 0, 36475.041667, 1 },
563 { 0, 36475.000000, 1 },
564 { 0, 36475.466100, 0, 1 },
565 { 0, 36477.000000, 1 },
566 { 0x80020005 },
567 { 0, 36477.000000, 1 },
568 { 0x80020005 },
569 { 0x80020005, 0, 1 },
570 { 0, 36526.000000, 1 },
571 { 0x80020005 },
572 { 0, 36163.375000, 1 },
573 { 0, 36161.458333, 1 },
574 { 0, 36475.166667, 1 },
575 { 0x80020005, 0, 1 },
576 { 0x80020005 },
577 { 0x80020005, 0, 1 },
578 { 0x80020005 },
579 { 0, 65380.000000 },
580 { 0x80020005, 0, 1 },
581 { 0, 65380.000000 },
582 { 0, 36465.000000, 1 },
583 { 0, 36465.000000, 1 },
584 { 0x80020005 },
585 { 0x80020005 },
586 { 0x80020005 },
587 { 0x80020005 },
588 { 0x80020005 },
589 { 0x80020005 },
590 { 0x80020005 },
591 { 0x80020005 },
592 { 0x80020005 },
593 { 0, 0.045139, 1 },
594 { 0, 0.086806, 1 },
595 { 0, 0.128472, 1 },
596 { 0, 0.170139, 1 },
598 static const struct _strret_b {
599 HRESULT error;
600 BOOL retval;
601 } strrets_B[NB_OLE_STRINGS] = {
602 { 0, VARIANT_TRUE },
603 { 0, VARIANT_TRUE },
604 { 0, VARIANT_TRUE },
605 { 0, VARIANT_TRUE },
606 { 0, VARIANT_TRUE },
607 { 0, VARIANT_FALSE },
608 { 0, VARIANT_FALSE },
609 { 0, VARIANT_TRUE },
610 { 0, VARIANT_TRUE },
611 { 0, VARIANT_TRUE },
612 { 0, VARIANT_TRUE },
613 { 0, VARIANT_TRUE },
614 { 0, VARIANT_TRUE },
615 { 0, VARIANT_TRUE },
616 { 0, VARIANT_TRUE },
617 { 0, VARIANT_TRUE },
618 { 0, VARIANT_TRUE },
619 { 0, VARIANT_TRUE },
620 { 0, VARIANT_TRUE },
621 { 0, VARIANT_TRUE },
622 { 0, VARIANT_TRUE },
623 { 0, VARIANT_TRUE },
624 { 0, VARIANT_TRUE },
625 { 0, VARIANT_TRUE },
626 { 0, VARIANT_TRUE },
627 { 0, VARIANT_TRUE },
628 { 0, VARIANT_TRUE },
629 { 0, VARIANT_TRUE },
630 { 0, VARIANT_TRUE },
631 { 0x80020005 },
632 { 0x80020005 },
633 { 0x80020005 },
634 { 0x80020005 },
635 { 0, VARIANT_TRUE },
636 { 0x80020005 },
637 { 0, VARIANT_TRUE },
638 { 0x80020005 },
639 { 0x80020005 },
640 { 0x80020005 },
641 { 0x80020005 },
642 { 0, VARIANT_FALSE },
643 { 0, VARIANT_FALSE },
644 { 0, VARIANT_TRUE },
645 { 0, VARIANT_TRUE },
646 { 0, VARIANT_TRUE },
647 { 0x80020005 },
648 { 0, VARIANT_TRUE },
649 { 0x80020005 },
650 { 0x80020005 },
651 { 0x80020005 },
652 { 0, VARIANT_TRUE },
653 { 0, VARIANT_TRUE },
654 { 0, VARIANT_TRUE },
655 { 0, VARIANT_TRUE },
656 { 0, VARIANT_TRUE },
657 { 0, VARIANT_TRUE },
658 { 0, VARIANT_TRUE },
659 { 0, VARIANT_TRUE },
660 { 0, VARIANT_TRUE },
661 { 0, VARIANT_TRUE },
662 { 0x80020005 },
663 { 0x80020005 },
664 { 0x80020005 },
665 { 0x80020005 },
666 { 0x80020005 },
667 { 0x80020005 },
668 { 0x80020005 },
669 { 0x80020005 },
670 { 0x80020005 },
671 { 0x80020005 },
672 { 0x80020005 },
673 { 0x80020005 },
674 { 0x80020005 },
675 { 0x80020005 },
676 { 0x80020005 },
677 { 0x80020005 },
678 { 0x80020005 },
679 { 0x80020005 },
680 { 0x80020005 },
681 { 0x80020005 },
682 { 0x80020005 },
683 { 0x80020005 },
684 { 0x80020005 },
685 { 0x80020005 },
686 { 0x80020005 },
687 { 0x80020005 },
688 { 0x80020005 },
689 { 0x80020005 },
690 { 0x80020005 },
691 { 0x80020005 },
692 { 0x80020005 },
693 { 0x80020005 },
694 { 0x80020005 },
695 { 0x80020005 },
696 { 0x80020005 },
697 { 0x80020005 },
698 { 0x80020005 },
699 { 0x80020005 },
700 { 0x80020005 },
701 { 0x80020005 },
702 { 0, VARIANT_TRUE },
703 { 0, VARIANT_TRUE },
704 { 0, VARIANT_TRUE },
705 { 0, VARIANT_TRUE },
706 { 0x80020005 },
707 { 0x80020005 },
708 { 0, VARIANT_FALSE },
709 { 0x80020005 },
710 { 0x80020005 },
711 { 0, VARIANT_TRUE },
712 { 0, VARIANT_TRUE },
713 { 0, VARIANT_TRUE },
714 { 0, VARIANT_TRUE },
716 static const struct _strret_r8 {
717 HRESULT error;
718 DOUBLE retval;
719 } strrets_R8[NB_OLE_STRINGS] = {
720 { 0, -2.000000 },
721 { 0, -1.000000 },
722 { 0, -0.510000 },
723 { 0, -0.500000 },
724 { 0, -0.490000 },
725 { 0, 0.000000 },
726 { 0, 0.000000 },
727 { 0, 0.490000 },
728 { 0, 0.500000 },
729 { 0, 0.510000 },
730 { 0, 1.000000 },
731 { 0, 127.000000 },
732 { 0, 128.000000 },
733 { 0, 129.000000 },
734 { 0, 255.000000 },
735 { 0, 256.000000 },
736 { 0, 257.000000 },
737 { 0, 32767.000000 },
738 { 0, 32768.000000 },
739 { 0, -32768.000000 },
740 { 0, -32769.000000 },
741 { 0, 16777216.000000 },
742 { 0, 16777217.000000 },
743 { 0, -16777216.000000 },
744 { 0, 16777217.000000 },
745 { 0, 2147483647.000000 },
746 { 0, 2147483648.000000 },
747 { 0, -2147483647.000000 },
748 { 0, -2147483648.000000 },
749 { 0x80020005 },
750 { 0x80020005 },
751 { 0x80020005 },
752 { 0x80020005 },
753 { 0, 1.000000 },
754 { 0x80020005 },
755 { 0, 123.000000 },
756 { 0x80020005 },
757 { 0x80020005 },
758 { 0x80020005 },
759 { 0x80020005 },
760 { 0, 0.000000 },
761 { 0, 0.000000 },
762 { 0, 100000000000.000000 },
763 { 0, 24.000000 },
764 { 0, 32.000000 },
765 { 0x80020005 },
766 { 0, 200.000000 },
767 { 0x80020005 },
768 { 0x80020005 },
769 { 0x80020005 },
770 { 0, 1e63 },
771 { 0, 1.000000 },
772 { 0, 1.000000 },
773 { 0, 99999999999999997e183 },
774 { 0, 1.000000 },
775 { 0, 65535.000000 },
776 { 0, 65535.500000 },
777 { 0, 65536.000000 },
778 { 0, 4294967295.000000 },
779 { 0, 4294967296.000000 },
780 { 0x80020005 },
781 { 0x80020005 },
782 { 0x80020005 },
783 { 0x80020005 },
784 { 0x80020005 },
785 { 0x80020005 },
786 { 0x80020005 },
787 { 0x80020005 },
788 { 0x80020005 },
789 { 0x80020005 },
790 { 0x80020005 },
791 { 0x80020005 },
792 { 0x80020005 },
793 { 0x80020005 },
794 { 0x80020005 },
795 { 0x80020005 },
796 { 0x80020005 },
797 { 0x80020005 },
798 { 0x80020005 },
799 { 0x80020005 },
800 { 0x80020005 },
801 { 0x80020005 },
802 { 0x80020005 },
803 { 0x80020005 },
804 { 0x80020005 },
805 { 0x80020005 },
806 { 0x80020005 },
807 { 0x80020005 },
808 { 0x80020005 },
809 { 0x80020005 },
810 { 0x80020005 },
811 { 0x80020005 },
812 { 0x80020005 },
813 { 0x80020005 },
814 { 0x80020005 },
815 { 0x80020005 },
816 { 0x80020005 },
817 { 0x80020005 },
818 { 0x80020005 },
819 { 0x80020005 },
820 { 0x80020005 },
821 { 0x80020005 },
822 { 0x80020005 },
823 { 0x80020005 },
824 { 0x80020005 },
825 { 0x80020005 },
826 { 0x80020005 },
827 { 0x80020005 },
828 { 0x80020005 },
829 { 0, 1.500000 },
830 { 0, 2.500000 },
831 { 0, 3.500000 },
832 { 0, 4.500000 },
834 static const struct _strret_r4 {
835 HRESULT error;
836 FLOAT retval;
837 } strrets_R4[NB_OLE_STRINGS] = {
838 { 0, -2.000000F },
839 { 0, -1.000000F },
840 { 0, -0.510000F },
841 { 0, -0.500000F },
842 { 0, -0.490000F },
843 { 0, 0.000000F },
844 { 0, 0.000000F },
845 { 0, 0.490000F },
846 { 0, 0.500000F },
847 { 0, 0.510000F },
848 { 0, 1.000000F },
849 { 0, 127.000000F },
850 { 0, 128.000000F },
851 { 0, 129.000000F },
852 { 0, 255.000000F },
853 { 0, 256.000000F },
854 { 0, 257.000000F },
855 { 0, 32767.000000F },
856 { 0, 32768.000000F },
857 { 0, -32768.000000F },
858 { 0, -32769.000000F },
859 { 0, 16777216.000000F },
860 { 0, 16777216.000000F },
861 { 0, -16777216.000000F },
862 { 0, 16777216.000000F },
863 { 0, 2147483648.000000F },
864 { 0, 2147483648.000000F },
865 { 0, -2147483648.000000F },
866 { 0, -2147483648.000000F },
867 { 0x80020005 },
868 { 0x80020005 },
869 { 0x80020005 },
870 { 0x80020005 },
871 { 0, 1.000000F },
872 { 0x80020005 },
873 { 0, 123.000000F },
874 { 0x80020005 },
875 { 0x80020005 },
876 { 0x80020005 },
877 { 0x80020005 },
878 { 0, 0.000000F },
879 { 0, 0.000000F },
880 { 0, 99999997952.000000F },
881 { 0, 24.000000F },
882 { 0, 32.000000F },
883 { 0x80020005 },
884 { 0, 200.000000F },
885 { 0x80020005 },
886 { 0x80020005 },
887 { 0x80020005 },
888 { 0x8002000A },
889 { 0, 1.000000F },
890 { 0, 1.000000F },
891 { 0x8002000A },
892 { 0, 1.000000F },
893 { 0, 65535.000000F },
894 { 0, 65535.500000F },
895 { 0, 65536.000000F },
896 { 0, 4294967296.000000F },
897 { 0, 4294967296.000000F },
898 { 0x80020005 },
899 { 0x80020005 },
900 { 0x80020005 },
901 { 0x80020005 },
902 { 0x80020005 },
903 { 0x80020005 },
904 { 0x80020005 },
905 { 0x80020005 },
906 { 0x80020005 },
907 { 0x80020005 },
908 { 0x80020005 },
909 { 0x80020005 },
910 { 0x80020005 },
911 { 0x80020005 },
912 { 0x80020005 },
913 { 0x80020005 },
914 { 0x80020005 },
915 { 0x80020005 },
916 { 0x80020005 },
917 { 0x80020005 },
918 { 0x80020005 },
919 { 0x80020005 },
920 { 0x80020005 },
921 { 0x80020005 },
922 { 0x80020005 },
923 { 0x80020005 },
924 { 0x80020005 },
925 { 0x80020005 },
926 { 0x80020005 },
927 { 0x80020005 },
928 { 0x80020005 },
929 { 0x80020005 },
930 { 0x80020005 },
931 { 0x80020005 },
932 { 0x80020005 },
933 { 0x80020005 },
934 { 0x80020005 },
935 { 0x80020005 },
936 { 0x80020005 },
937 { 0x80020005 },
938 { 0x80020005 },
939 { 0x80020005 },
940 { 0x80020005 },
941 { 0x80020005 },
942 { 0x80020005 },
943 { 0x80020005 },
944 { 0x80020005 },
945 { 0x80020005 },
946 { 0x80020005 },
947 { 0, 1.500000F },
948 { 0, 2.500000F },
949 { 0, 3.500000F },
950 { 0, 4.500000F },
952 static const struct _strret_i4 {
953 HRESULT error;
954 LONG retval;
955 } strrets_I4[NB_OLE_STRINGS] = {
956 { 0, -2L },
957 { 0, -1L },
958 { 0, -1L },
959 { 0, 0L },
960 { 0, 0L },
961 { 0, 0L },
962 { 0, 0L },
963 { 0, 0L },
964 { 0, 0L },
965 { 0, 1L },
966 { 0, 1L },
967 { 0, 127L },
968 { 0, 128L },
969 { 0, 129L },
970 { 0, 255L },
971 { 0, 256L },
972 { 0, 257L },
973 { 0, 32767L },
974 { 0, 32768L },
975 { 0, -32768L },
976 { 0, -32769L },
977 { 0, 16777216L },
978 { 0, 16777217L },
979 { 0, -16777216L },
980 { 0, 16777217L },
981 { 0, 2147483647L },
982 { 0x8002000A },
983 { 0, -2147483647L },
984 { 0, 0x80000000L },
985 { 0x80020005 },
986 { 0x80020005 },
987 { 0x80020005 },
988 { 0x80020005 },
989 { 0, 1L },
990 { 0x80020005 },
991 { 0, 123L },
992 { 0x80020005 },
993 { 0x80020005 },
994 { 0x80020005 },
995 { 0x80020005 },
996 { 0, 0L },
997 { 0, 0L },
998 { 0x8002000A },
999 { 0, 24L },
1000 { 0, 32L },
1001 { 0x80020005 },
1002 { 0, 200L },
1003 { 0x80020005 },
1004 { 0x80020005 },
1005 { 0x80020005 },
1006 { 0x8002000A },
1007 { 0, 1L },
1008 { 0, 1L },
1009 { 0x8002000A },
1010 { 0, 1L },
1011 { 0, 65535L },
1012 { 0, 65536L },
1013 { 0, 65536L },
1014 { 0x8002000A },
1015 { 0x8002000A },
1016 { 0x80020005 },
1017 { 0x80020005 },
1018 { 0x80020005 },
1019 { 0x80020005 },
1020 { 0x80020005 },
1021 { 0x80020005 },
1022 { 0x80020005 },
1023 { 0x80020005 },
1024 { 0x80020005 },
1025 { 0x80020005 },
1026 { 0x80020005 },
1027 { 0x80020005 },
1028 { 0x80020005 },
1029 { 0x80020005 },
1030 { 0x80020005 },
1031 { 0x80020005 },
1032 { 0x80020005 },
1033 { 0x80020005 },
1034 { 0x80020005 },
1035 { 0x80020005 },
1036 { 0x80020005 },
1037 { 0x80020005 },
1038 { 0x80020005 },
1039 { 0x80020005 },
1040 { 0x80020005 },
1041 { 0x80020005 },
1042 { 0x80020005 },
1043 { 0x80020005 },
1044 { 0x80020005 },
1045 { 0x80020005 },
1046 { 0x80020005 },
1047 { 0x80020005 },
1048 { 0x80020005 },
1049 { 0x80020005 },
1050 { 0x80020005 },
1051 { 0x80020005 },
1052 { 0x80020005 },
1053 { 0x80020005 },
1054 { 0x80020005 },
1055 { 0x80020005 },
1056 { 0x80020005 },
1057 { 0x80020005 },
1058 { 0x80020005 },
1059 { 0x80020005 },
1060 { 0x80020005 },
1061 { 0x80020005 },
1062 { 0x80020005 },
1063 { 0x80020005 },
1064 { 0x80020005 },
1065 { 0, 2L },
1066 { 0, 2L },
1067 { 0, 4L },
1068 { 0, 4L },
1070 static const struct _strret_i2 {
1071 HRESULT error;
1072 SHORT retval;
1073 } strrets_I2[NB_OLE_STRINGS] = {
1074 { 0, -2 },
1075 { 0, -1 },
1076 { 0, -1 },
1077 { 0, 0 },
1078 { 0, 0 },
1079 { 0, 0 },
1080 { 0, 0 },
1081 { 0, 0 },
1082 { 0, 0 },
1083 { 0, 1 },
1084 { 0, 1 },
1085 { 0, 127 },
1086 { 0, 128 },
1087 { 0, 129 },
1088 { 0, 255 },
1089 { 0, 256 },
1090 { 0, 257 },
1091 { 0, 32767 },
1092 { 0x8002000A },
1093 { 0, -32768 },
1094 { 0x8002000A },
1095 { 0x8002000A },
1096 { 0x8002000A },
1097 { 0x8002000A },
1098 { 0x8002000A },
1099 { 0x8002000A },
1100 { 0x8002000A },
1101 { 0x8002000A },
1102 { 0x8002000A },
1103 { 0x80020005 },
1104 { 0x80020005 },
1105 { 0x80020005 },
1106 { 0x80020005 },
1107 { 0, 1 },
1108 { 0x80020005 },
1109 { 0, 123 },
1110 { 0x80020005 },
1111 { 0x80020005 },
1112 { 0x80020005 },
1113 { 0x80020005 },
1114 { 0, 0 },
1115 { 0, 0 },
1116 { 0x8002000A },
1117 { 0, 24 },
1118 { 0, 32 },
1119 { 0x80020005 },
1120 { 0, 200 },
1121 { 0x80020005 },
1122 { 0x80020005 },
1123 { 0x80020005 },
1124 { 0x8002000A },
1125 { 0, 1 },
1126 { 0, 1 },
1127 { 0x8002000A },
1128 { 0, 1 },
1129 { 0x8002000A },
1130 { 0x8002000A },
1131 { 0x8002000A },
1132 { 0x8002000A },
1133 { 0x8002000A },
1134 { 0x80020005 },
1135 { 0x80020005 },
1136 { 0x80020005 },
1137 { 0x80020005 },
1138 { 0x80020005 },
1139 { 0x80020005 },
1140 { 0x80020005 },
1141 { 0x80020005 },
1142 { 0x80020005 },
1143 { 0x80020005 },
1144 { 0x80020005 },
1145 { 0x80020005 },
1146 { 0x80020005 },
1147 { 0x80020005 },
1148 { 0x80020005 },
1149 { 0x80020005 },
1150 { 0x80020005 },
1151 { 0x80020005 },
1152 { 0x80020005 },
1153 { 0x80020005 },
1154 { 0x80020005 },
1155 { 0x80020005 },
1156 { 0x80020005 },
1157 { 0x80020005 },
1158 { 0x80020005 },
1159 { 0x80020005 },
1160 { 0x80020005 },
1161 { 0x80020005 },
1162 { 0x80020005 },
1163 { 0x80020005 },
1164 { 0x80020005 },
1165 { 0x80020005 },
1166 { 0x80020005 },
1167 { 0x80020005 },
1168 { 0x80020005 },
1169 { 0x80020005 },
1170 { 0x80020005 },
1171 { 0x80020005 },
1172 { 0x80020005 },
1173 { 0x80020005 },
1174 { 0x80020005 },
1175 { 0x80020005 },
1176 { 0x80020005 },
1177 { 0x80020005 },
1178 { 0x80020005 },
1179 { 0x80020005 },
1180 { 0x80020005 },
1181 { 0x80020005 },
1182 { 0x80020005 },
1183 { 0, 2 },
1184 { 0, 2 },
1185 { 0, 4 },
1186 { 0, 4 },
1188 static const struct _strret_i1 {
1189 HRESULT error;
1190 CHAR retval;
1191 } strrets_I1[NB_OLE_STRINGS] = {
1192 { 0, -2 },
1193 { 0, -1 },
1194 { 0, -1 },
1195 { 0, 0 },
1196 { 0, 0 },
1197 { 0, 0 },
1198 { 0, 0 },
1199 { 0, 0 },
1200 { 0, 0 },
1201 { 0, 1 },
1202 { 0, 1 },
1203 { 0, 127 },
1204 { 0x8002000A },
1205 { 0x8002000A },
1206 { 0x8002000A },
1207 { 0x8002000A },
1208 { 0x8002000A },
1209 { 0x8002000A },
1210 { 0x8002000A },
1211 { 0x8002000A },
1212 { 0x8002000A },
1213 { 0x8002000A },
1214 { 0x8002000A },
1215 { 0x8002000A },
1216 { 0x8002000A },
1217 { 0x8002000A },
1218 { 0x8002000A },
1219 { 0x8002000A },
1220 { 0x8002000A },
1221 { 0x80020005 },
1222 { 0x80020005 },
1223 { 0x80020005 },
1224 { 0x80020005 },
1225 { 0, 1 },
1226 { 0x80020005 },
1227 { 0, 123 },
1228 { 0x80020005 },
1229 { 0x80020005 },
1230 { 0x80020005 },
1231 { 0x80020005 },
1232 { 0, 0 },
1233 { 0, 0 },
1234 { 0x8002000A },
1235 { 0, 24 },
1236 { 0, 32 },
1237 { 0x80020005 },
1238 { 0x8002000A },
1239 { 0x80020005 },
1240 { 0x80020005 },
1241 { 0x80020005 },
1242 { 0x8002000A },
1243 { 0, 1 },
1244 { 0, 1 },
1245 { 0x8002000A },
1246 { 0, 1 },
1247 { 0x8002000A },
1248 { 0x8002000A },
1249 { 0x8002000A },
1250 { 0x8002000A },
1251 { 0x8002000A },
1252 { 0x80020005 },
1253 { 0x80020005 },
1254 { 0x80020005 },
1255 { 0x80020005 },
1256 { 0x80020005 },
1257 { 0x80020005 },
1258 { 0x80020005 },
1259 { 0x80020005 },
1260 { 0x80020005 },
1261 { 0x80020005 },
1262 { 0x80020005 },
1263 { 0x80020005 },
1264 { 0x80020005 },
1265 { 0x80020005 },
1266 { 0x80020005 },
1267 { 0x80020005 },
1268 { 0x80020005 },
1269 { 0x80020005 },
1270 { 0x80020005 },
1271 { 0x80020005 },
1272 { 0x80020005 },
1273 { 0x80020005 },
1274 { 0x80020005 },
1275 { 0x80020005 },
1276 { 0x80020005 },
1277 { 0x80020005 },
1278 { 0x80020005 },
1279 { 0x80020005 },
1280 { 0x80020005 },
1281 { 0x80020005 },
1282 { 0x80020005 },
1283 { 0x80020005 },
1284 { 0x80020005 },
1285 { 0x80020005 },
1286 { 0x80020005 },
1287 { 0x80020005 },
1288 { 0x80020005 },
1289 { 0x80020005 },
1290 { 0x80020005 },
1291 { 0x80020005 },
1292 { 0x80020005 },
1293 { 0x80020005 },
1294 { 0x80020005 },
1295 { 0x80020005 },
1296 { 0x80020005 },
1297 { 0x80020005 },
1298 { 0x80020005 },
1299 { 0x80020005 },
1300 { 0x80020005 },
1301 { 0, 2 },
1302 { 0, 2 },
1303 { 0, 4 },
1304 { 0, 4 },
1306 static const struct _strret_u1 {
1307 HRESULT error;
1308 BYTE retval;
1309 } strrets_U1[NB_OLE_STRINGS] = {
1310 { 0x8002000A },
1311 { 0x8002000A },
1312 { 0x8002000A },
1313 { 0, 0 },
1314 { 0, 0 },
1315 { 0, 0 },
1316 { 0, 0 },
1317 { 0, 0 },
1318 { 0, 0 },
1319 { 0, 1 },
1320 { 0, 1 },
1321 { 0, 0x7F },
1322 { 0, 0x80 },
1323 { 0, 0x81 },
1324 { 0, 0xFF },
1325 { 0x8002000A },
1326 { 0x8002000A },
1327 { 0x8002000A },
1328 { 0x8002000A },
1329 { 0x8002000A },
1330 { 0x8002000A },
1331 { 0x8002000A },
1332 { 0x8002000A },
1333 { 0x8002000A },
1334 { 0x8002000A },
1335 { 0x8002000A },
1336 { 0x8002000A },
1337 { 0x8002000A },
1338 { 0x8002000A },
1339 { 0x80020005 },
1340 { 0x80020005 },
1341 { 0x80020005 },
1342 { 0x80020005 },
1343 { 0, 1 },
1344 { 0x80020005 },
1345 { 0, 0x7B },
1346 { 0x80020005 },
1347 { 0x80020005 },
1348 { 0x80020005 },
1349 { 0x80020005 },
1350 { 0, 0 },
1351 { 0, 0 },
1352 { 0x8002000A },
1353 { 0, 0x18 },
1354 { 0, 0x20 },
1355 { 0x80020005 },
1356 { 0, 0xC8 },
1357 { 0x80020005 },
1358 { 0x80020005 },
1359 { 0x80020005 },
1360 { 0x8002000A },
1361 { 0, 1 },
1362 { 0, 1 },
1363 { 0x8002000A },
1364 { 0, 1 },
1365 { 0x8002000A },
1366 { 0x8002000A },
1367 { 0x8002000A },
1368 { 0x8002000A },
1369 { 0x8002000A },
1370 { 0x80020005 },
1371 { 0x80020005 },
1372 { 0x80020005 },
1373 { 0x80020005 },
1374 { 0x80020005 },
1375 { 0x80020005 },
1376 { 0x80020005 },
1377 { 0x80020005 },
1378 { 0x80020005 },
1379 { 0x80020005 },
1380 { 0x80020005 },
1381 { 0x80020005 },
1382 { 0x80020005 },
1383 { 0x80020005 },
1384 { 0x80020005 },
1385 { 0x80020005 },
1386 { 0x80020005 },
1387 { 0x80020005 },
1388 { 0x80020005 },
1389 { 0x80020005 },
1390 { 0x80020005 },
1391 { 0x80020005 },
1392 { 0x80020005 },
1393 { 0x80020005 },
1394 { 0x80020005 },
1395 { 0x80020005 },
1396 { 0x80020005 },
1397 { 0x80020005 },
1398 { 0x80020005 },
1399 { 0x80020005 },
1400 { 0x80020005 },
1401 { 0x80020005 },
1402 { 0x80020005 },
1403 { 0x80020005 },
1404 { 0x80020005 },
1405 { 0x80020005 },
1406 { 0x80020005 },
1407 { 0x80020005 },
1408 { 0x80020005 },
1409 { 0x80020005 },
1410 { 0x80020005 },
1411 { 0x80020005 },
1412 { 0x80020005 },
1413 { 0x80020005 },
1414 { 0x80020005 },
1415 { 0x80020005 },
1416 { 0x80020005 },
1417 { 0x80020005 },
1418 { 0x80020005 },
1419 { 0, 2 },
1420 { 0, 2 },
1421 { 0, 4 },
1422 { 0, 4 },
1425 static const struct _strret_U2 {
1426 HRESULT error;
1427 WORD retval;
1428 } strrets_U2[NB_OLE_STRINGS] = {
1429 { 0x8002000A },
1430 { 0x8002000A },
1431 { 0x8002000A },
1432 { 0, 0 },
1433 { 0, 0 },
1434 { 0, 0 },
1435 { 0, 0 },
1436 { 0, 0 },
1437 { 0, 0 },
1438 { 0, 1 },
1439 { 0, 1 },
1440 { 0, 127 },
1441 { 0, 128 },
1442 { 0, 129 },
1443 { 0, 255 },
1444 { 0, 256 },
1445 { 0, 257 },
1446 { 0, 32767 },
1447 { 0, 32768 },
1448 { 0x8002000A },
1449 { 0x8002000A },
1450 { 0x8002000A },
1451 { 0x8002000A },
1452 { 0x8002000A },
1453 { 0x8002000A },
1454 { 0x8002000A },
1455 { 0x8002000A },
1456 { 0x8002000A },
1457 { 0x8002000A },
1458 { 0x80020005 },
1459 { 0x80020005 },
1460 { 0x80020005 },
1461 { 0x80020005 },
1462 { 0, 1 },
1463 { 0x80020005 },
1464 { 0, 123 },
1465 { 0x80020005 },
1466 { 0x80020005 },
1467 { 0x80020005 },
1468 { 0x80020005 },
1469 { 0, 0 },
1470 { 0, 0 },
1471 { 0x8002000A },
1472 { 0, 24 },
1473 { 0, 32 },
1474 { 0x80020005 },
1475 { 0, 200 },
1476 { 0x80020005 },
1477 { 0x80020005 },
1478 { 0x80020005 },
1479 { 0x8002000A },
1480 { 0, 1 },
1481 { 0, 1 },
1482 { 0x8002000A },
1483 { 0, 1 },
1484 { 0, 65535 },
1485 { 0x8002000A },
1486 { 0x8002000A },
1487 { 0x8002000A },
1488 { 0x8002000A },
1489 { 0x80020005 },
1490 { 0x80020005 },
1491 { 0x80020005 },
1492 { 0x80020005 },
1493 { 0x80020005 },
1494 { 0x80020005 },
1495 { 0x80020005 },
1496 { 0x80020005 },
1497 { 0x80020005 },
1498 { 0x80020005 },
1499 { 0x80020005 },
1500 { 0x80020005 },
1501 { 0x80020005 },
1502 { 0x80020005 },
1503 { 0x80020005 },
1504 { 0x80020005 },
1505 { 0x80020005 },
1506 { 0x80020005 },
1507 { 0x80020005 },
1508 { 0x80020005 },
1509 { 0x80020005 },
1510 { 0x80020005 },
1511 { 0x80020005 },
1512 { 0x80020005 },
1513 { 0x80020005 },
1514 { 0x80020005 },
1515 { 0x80020005 },
1516 { 0x80020005 },
1517 { 0x80020005 },
1518 { 0x80020005 },
1519 { 0x80020005 },
1520 { 0x80020005 },
1521 { 0x80020005 },
1522 { 0x80020005 },
1523 { 0x80020005 },
1524 { 0x80020005 },
1525 { 0x80020005 },
1526 { 0x80020005 },
1527 { 0x80020005 },
1528 { 0x80020005 },
1529 { 0x80020005 },
1530 { 0x80020005 },
1531 { 0x80020005 },
1532 { 0x80020005 },
1533 { 0x80020005 },
1534 { 0x80020005 },
1535 { 0x80020005 },
1536 { 0x80020005 },
1537 { 0x80020005 },
1538 { 0, 2 },
1539 { 0, 2 },
1540 { 0, 4 },
1541 { 0, 4 },
1544 static const struct _strret_U4 {
1545 HRESULT error;
1546 DWORD retval;
1547 } strrets_U4[NB_OLE_STRINGS] = {
1548 { 0x8002000A },
1549 { 0x8002000A },
1550 { 0x8002000A },
1551 { 0, 0 },
1552 { 0, 0 },
1553 { 0, 0 },
1554 { 0, 0 },
1555 { 0, 0 },
1556 { 0, 0 },
1557 { 0, 1 },
1558 { 0, 1 },
1559 { 0, 127 },
1560 { 0, 128 },
1561 { 0, 129 },
1562 { 0, 255 },
1563 { 0, 256 },
1564 { 0, 257 },
1565 { 0, 32767 },
1566 { 0, 32768 },
1567 { 0x8002000A },
1568 { 0x8002000A },
1569 { 0, 16777216 },
1570 { 0, 16777217 },
1571 { 0x8002000A },
1572 { 0, 16777217 },
1573 { 0, 2147483647 },
1574 { 0, 2147483648U },
1575 { 0x8002000A },
1576 { 0x8002000A },
1577 { 0x80020005 },
1578 { 0x80020005 },
1579 { 0x80020005 },
1580 { 0x80020005 },
1581 { 0, 1 },
1582 { 0x80020005 },
1583 { 0, 123 },
1584 { 0x80020005 },
1585 { 0x80020005 },
1586 { 0x80020005 },
1587 { 0x80020005 },
1588 { 0, 0 },
1589 { 0, 0 },
1590 { 0x8002000A },
1591 { 0, 24 },
1592 { 0, 32 },
1593 { 0x80020005 },
1594 { 0, 200 },
1595 { 0x80020005 },
1596 { 0x80020005 },
1597 { 0x80020005 },
1598 { 0x8002000A },
1599 { 0, 1 },
1600 { 0, 1 },
1601 { 0x8002000A },
1602 { 0, 1 },
1603 { 0, 65535 },
1604 { 0, 65536 },
1605 { 0, 65536 },
1606 { 0, 4294967295U },
1607 { 0x8002000A },
1608 { 0x80020005 },
1609 { 0x80020005 },
1610 { 0x80020005 },
1611 { 0x80020005 },
1612 { 0x80020005 },
1613 { 0x80020005 },
1614 { 0x80020005 },
1615 { 0x80020005 },
1616 { 0x80020005 },
1617 { 0x80020005 },
1618 { 0x80020005 },
1619 { 0x80020005 },
1620 { 0x80020005 },
1621 { 0x80020005 },
1622 { 0x80020005 },
1623 { 0x80020005 },
1624 { 0x80020005 },
1625 { 0x80020005 },
1626 { 0x80020005 },
1627 { 0x80020005 },
1628 { 0x80020005 },
1629 { 0x80020005 },
1630 { 0x80020005 },
1631 { 0x80020005 },
1632 { 0x80020005 },
1633 { 0x80020005 },
1634 { 0x80020005 },
1635 { 0x80020005 },
1636 { 0x80020005 },
1637 { 0x80020005 },
1638 { 0x80020005 },
1639 { 0x80020005 },
1640 { 0x80020005 },
1641 { 0x80020005 },
1642 { 0x80020005 },
1643 { 0x80020005 },
1644 { 0x80020005 },
1645 { 0x80020005 },
1646 { 0x80020005 },
1647 { 0x80020005 },
1648 { 0x80020005 },
1649 { 0x80020005 },
1650 { 0x80020005 },
1651 { 0x80020005 },
1652 { 0x80020005 },
1653 { 0x80020005 },
1654 { 0x80020005 },
1655 { 0x80020005 },
1656 { 0x80020005 },
1657 { 0, 2 },
1658 { 0, 2 },
1659 { 0, 4 },
1660 { 0, 4 },
1663 START_TEST(vartest)
1665 VARIANTARG va;
1666 VARIANTARG vb;
1667 VARIANTARG vc;
1668 VARIANTARG vd;
1669 VARIANTARG ve;
1671 HRESULT rc;
1672 int theInt = 0;
1673 int* pInt = &theInt;
1674 VARIANT_BOOL b = 0;
1675 VARIANT_BOOL* pBool = &b;
1676 unsigned short uShort = 0;
1677 unsigned short* pUShort = &uShort;
1678 unsigned long uLong = 0;
1679 unsigned long* pULong = &uLong;
1680 CHAR theChar;
1681 CHAR* pChar = &theChar;
1682 BYTE byte;
1683 BYTE* pByte = &byte;
1684 short s = 0;
1685 short* pShort = &s;
1686 long Long = 0;
1687 long* pLong = &Long;
1688 float f = 0;
1689 float* pFloat = &f;
1690 double d = 0;
1691 double* pDouble = &d;
1693 BSTR bstr = NULL;
1694 int off, i = 0;
1695 OLECHAR* pOleChar[NB_OLE_STRINGS];
1697 for (i=0; i<NB_OLE_STRINGS;i++) {
1698 pOleChar[i]=AtoW(_pTestStrA[i]);
1701 /* Start testing the Low-Level API ( the coercions )
1705 /* unsigned char from...
1707 trace( "\n\n======== Testing VarUI1FromXXX ========\n");
1709 #define XOK "should return S_OK"
1710 #define XOV "should return DISP_E_OVERFLOW"
1711 /* ok(S_OK == VarUI1FromI2( 0, NULL ), XOK);
1713 trace( "VarUI1FromI2: passing in NULL as return val makes it crash, need to write proper test.\n" );
1715 ok(VarUI1FromStr(NULL,0,0,pByte) == DISP_E_TYPEMISMATCH,"should return DISP_E_TYPEMISMATCH");
1716 ok(S_OK == VarUI1FromI2( 0, pByte ), XOK);
1717 ok(*pByte == 0,"should give 0 byte value");
1719 ok(S_OK == VarUI1FromI2( 69, pByte ), XOK);
1720 ok(*pByte == 69,"should give 69 byte value");
1722 ok(S_OK == VarUI1FromI2( 70, pByte ), XOK);
1723 ok(*pByte == 70,"should give 70 byte value");
1725 ok(S_OK == VarUI1FromI2( 128, pByte ), XOK);
1726 ok(*pByte == 128,"should give 128 byte value");
1728 ok(S_OK == VarUI1FromI2( 255, pByte ), XOK);
1729 ok(*pByte == 255,"should give 255 byte value");
1731 ok(DISP_E_OVERFLOW == VarUI1FromI2( 256, pByte ), XOV);
1732 ok(DISP_E_OVERFLOW == VarUI1FromI2( 257, pByte ), XOV);
1734 ok(S_OK == VarUI1FromR8( 0.0, pByte ), XOK);
1735 ok(*pByte == 0,"0.0 float should be converted to 0");
1737 ok(S_OK == VarUI1FromR8( 69.33, pByte ), XOK);
1738 ok(*pByte == 0x45, "expected 69 (hex 0x45) as byte value");
1740 ok(S_OK == VarUI1FromR8( 69.66, pByte ), XOK);
1741 ok(*pByte == 0x46, "expected 70 (hex 0x46) as byte value");
1743 ok(DISP_E_OVERFLOW == VarUI1FromR8( -69.33, pByte ), XOV);
1744 ok(DISP_E_OVERFLOW == VarUI1FromR8( -69.66, pByte ), XOV);
1746 ok(S_OK == VarUI1FromR8( -0.5, pByte ), XOK);
1747 ok(*pByte == 0,"-0.5 should give return 0");
1749 ok(DISP_E_OVERFLOW == VarUI1FromR8( -0.51, pByte ), XOV);
1751 ok(S_OK == VarUI1FromR8( -0.49, pByte ), XOK);
1752 ok(*pByte == 0,"-0.49 should give return 0");
1754 ok(S_OK == VarUI1FromR8( 0.5, pByte ), XOK);
1755 ok(*pByte == 0,"0.5 should give return 0");
1757 ok(S_OK == VarUI1FromR8( 0.51, pByte ), XOK);
1758 ok(*pByte == 1,"0.51 should give return 1");
1760 ok(S_OK == VarUI1FromR8( 0.49, pByte ), XOK);
1761 ok(*pByte == 0,"0.49 should give return 0");
1763 ok(S_OK == VarUI1FromDate( 0.0, pByte ), XOK);
1764 ok(*pByte == 0,"0.0 date should give return 0");
1766 ok(S_OK == VarUI1FromDate( 69.33, pByte ), XOK);
1767 ok(*pByte == 0x45,"69.33 date should give return 0x45");
1769 ok(S_OK == VarUI1FromDate( 69.66, pByte ), XOK);
1770 ok(*pByte == 0x46,"69.66 date should give return 0x46");
1772 ok(DISP_E_OVERFLOW == VarUI1FromDate( -69.33, pByte ), XOV);
1774 ok(DISP_E_OVERFLOW == VarUI1FromDate( -69.66, pByte ), XOV);
1776 ok(S_OK == VarUI1FromBool( VARIANT_TRUE, pByte ), XOK);
1777 ok(*pByte == 0xff, "true should be converted to 0xff");
1779 ok(S_OK == VarUI1FromBool( VARIANT_FALSE, pByte ), XOK);
1780 ok(*pByte == 0, "false should be converted to 0");
1782 for (i = 0; i < NB_OLE_STRINGS; i++)
1784 *pByte= 42;
1785 rc=VarUI1FromStr( pOleChar[i], 0, 0, pByte );
1786 ok(rc == strrets_U1[i].error,
1787 "VarUI1FromStr([%d]=\"%s\") rc=%lx instead of %lx",
1788 i,_pTestStrA[i],rc,strrets_U1[i].error);
1789 if (rc == 0 && strrets_U1[i].error == 0) {
1790 ok(*pByte == strrets_U1[i].retval,
1791 "VarUI1FromStr([%d]=\"%s\") got %02x instead of %02x",
1792 i,_pTestStrA[i],*pByte,strrets_U1[i].retval);
1796 /* unsigned short from ... */
1797 trace( "\n\n======== Testing VarUI2FromXXX ========\n");
1799 ok(DISP_E_OVERFLOW == VarUI2FromI2( -1, pUShort ), XOV);
1800 /* ok(S_OK == VarUI2FromI2( 0, NULL ), XOK);
1802 trace("VarUI2FromI2: passing in NULL as return val makes it crash, needs to be fixed.\n");
1804 ok(DISP_E_TYPEMISMATCH == VarUI2FromStr( NULL, 0, 0, pUShort ), "should return DISP_E_TYPEMISMATCH");
1806 ok(S_OK == VarUI2FromI2( 0, pUShort ), XOK);
1807 ok(*pUShort == 0,"0 should be 0");
1808 ok(S_OK == VarUI2FromI2( 69, pUShort ), XOK);
1809 ok(*pUShort == 69,"69 should be 69");
1810 ok(S_OK == VarUI2FromI2( 70, pUShort ), XOK);
1811 ok(*pUShort == 70,"70 should be 70");
1813 ok(S_OK == VarUI2FromI2( 128, pUShort ), XOK);
1814 ok(*pUShort == 128,"128 should be 128");
1816 ok(S_OK == VarUI2FromI4( 65535, pUShort ), XOK);
1817 ok(*pUShort == 65535,"65535 should be 65535");
1818 ok(DISP_E_OVERFLOW == VarUI2FromI4( 65536, pUShort ), XOV);
1819 ok(DISP_E_OVERFLOW == VarUI2FromI4( 65537, pUShort ), XOV);
1820 ok(S_OK == VarUI2FromR8( 0.0, pUShort ), XOK);
1821 ok(*pUShort == 0,"0.0 should be 0");
1822 ok(S_OK == VarUI2FromR8( 69.33, pUShort ), XOK);
1823 ok(*pUShort == 69,"69.33 should be 69");
1824 ok(S_OK == VarUI2FromR8( 69.66, pUShort ), XOK);
1825 ok(*pUShort == 70,"69.66 should be 70");
1827 ok(DISP_E_OVERFLOW == VarUI2FromR8( -69.33, pUShort ), XOV);
1828 ok(DISP_E_OVERFLOW == VarUI2FromR8( -69.66, pUShort ), XOV);
1830 ok(S_OK == VarUI2FromR8( -0.5, pUShort ), XOK);
1831 ok(*pUShort == 0, "-0.5 -> 0");
1832 ok(DISP_E_OVERFLOW == VarUI2FromR8( -0.51, pUShort ), XOV);
1833 ok(S_OK == VarUI2FromR8( -0.49, pUShort ), XOK);
1834 ok(*pUShort == 0, "-0.49 -> 0");
1836 ok(S_OK == VarUI2FromR8( 0.5, pUShort ), XOK);
1837 ok(*pUShort == 0,"0.5 should be 0");
1838 ok(S_OK == VarUI2FromR8( 0.51, pUShort ), XOK);
1839 ok(*pUShort == 1,"0.51 should be 1");
1840 ok(S_OK == VarUI2FromR8( 0.49, pUShort ), XOK);
1841 ok(*pUShort == 0,"0.49 should be 0");
1843 ok(S_OK == VarUI2FromDate( 0.0, pUShort ), XOK);
1844 ok(*pUShort == 0,"0.0 should be 0");
1845 ok(S_OK == VarUI2FromDate( 69.33, pUShort ), XOK);
1846 ok(*pUShort == 69,"69.33 should be 69");
1847 ok(S_OK == VarUI2FromDate( 69.66, pUShort ), XOK);
1848 ok(*pUShort == 70,"69.66 should be 70");
1849 ok(DISP_E_OVERFLOW == VarUI2FromDate( -69.33, pUShort ), XOV);
1850 ok(DISP_E_OVERFLOW == VarUI2FromDate( -69.66, pUShort ), XOV);
1852 ok(S_OK == VarUI2FromBool( VARIANT_TRUE, pUShort ), XOK);
1853 ok(*pUShort == 65535,"TRUE should be 65535");
1854 ok(S_OK == VarUI2FromBool( VARIANT_FALSE, pUShort ), XOK);
1855 ok(*pUShort == 0,"FALSE should be 0");
1857 for (i = 0; i < NB_OLE_STRINGS; i++)
1859 *pUShort=42;
1860 rc=VarUI2FromStr( pOleChar[i], 0, 0, pUShort );
1861 ok(rc == strrets_U2[i].error,
1862 "VarUI2FromStr([%d]=\"%s\") rc=%lx instead of %lx",
1863 i,_pTestStrA[i],rc,strrets_U2[i].error);
1864 if (rc == 0 && strrets_U2[i].error == 0) {
1865 ok(*pUShort == strrets_U2[i].retval,
1866 "VarUI2FromStr([%d]=\"%s\") got %u instead of %u",
1867 i,_pTestStrA[i],*pUShort,strrets_U2[i].retval);
1871 /* unsigned long from ...
1873 trace( "\n\n======== Testing VarUI4FromXXX ========\n");
1874 /*ok(S_OK == VarUI4FromI2( 0, NULL ), XOK);
1876 trace( "VarUI4FromI2: passing in NULL as return val makes it crash, implement me.\n");
1878 ok(DISP_E_TYPEMISMATCH == VarUI4FromStr( NULL, 0, 0, pULong ), "should erturn DISP_E_TYPEMISMATCH");
1880 ok(S_OK == VarUI4FromI2( 0, pULong ), XOK);
1881 ok(*pULong == 0,"0 should be 0");
1882 ok(S_OK == VarUI4FromI2( 69, pULong ), XOK);
1883 ok(*pULong == 69,"69 should be 69");
1885 ok(S_OK == VarUI4FromI2( 70, pULong ), XOK);
1886 ok(*pULong == 70,"70 should be 70");
1888 ok(S_OK == VarUI4FromI2( 128, pULong ), XOK);
1889 ok(*pULong == 128,"128 should be 128");
1890 ok(S_OK == VarUI4FromI2( 255, pULong ), XOK);
1891 ok(*pULong == 255,"255 should be 255");
1893 ok(S_OK == VarUI4FromR8( 4294967295.0, pULong ), XOK);
1894 ok(*pULong == 4294967295U,"4294967295.0 should be 4294967295");
1895 ok(DISP_E_OVERFLOW == VarUI4FromR8( 4294967296.0, pULong ), XOV);
1897 ok(S_OK == VarUI4FromR8( 0.0, pULong ), XOK);
1898 ok(*pULong == 0,"0 should be 0");
1899 ok(S_OK == VarUI4FromR8( 69.33, pULong ), XOK);
1900 ok(*pULong == 69,"69.33 should be 69");
1901 ok(S_OK == VarUI4FromR8( 69.66, pULong ), XOK);
1902 ok(*pULong == 70,"69.66 should be 70");
1903 ok(DISP_E_OVERFLOW == VarUI4FromR8( -69.33, pULong ), XOV);
1904 ok(DISP_E_OVERFLOW == VarUI4FromR8( -69.66, pULong ), XOV);
1906 ok(S_OK == VarUI4FromR8( -0.5, pULong ), XOK);
1907 ok(*pULong == 0,"-0.5 should be 0");
1909 ok(DISP_E_OVERFLOW == VarUI4FromR8( -0.51, pULong ), XOV);
1911 ok(S_OK == VarUI4FromR8( -0.49, pULong ), XOK);
1912 ok(*pULong == 0,"-0.49 should be 0");
1914 ok(S_OK == VarUI4FromR8( 0.5, pULong ), XOK);
1915 ok(*pULong == 0,"0.5 should be 0");
1916 ok(S_OK == VarUI4FromR8( 0.51, pULong ), XOK);
1917 ok(*pULong == 1,"0.51 should be 1");
1918 ok(S_OK == VarUI4FromR8( 0.49, pULong ), XOK);
1919 ok(*pULong == 0,"0.49 should be 0");
1921 ok(S_OK == VarUI4FromDate( 0.0, pULong ), XOK);
1922 ok(*pULong == 0,"0.0 should be 0");
1923 ok(S_OK == VarUI4FromDate( 69.33, pULong ), XOK);
1924 ok(*pULong == 69,"69.33 should be 69");
1925 ok(S_OK == VarUI4FromDate( 69.66, pULong ), XOK);
1926 ok(*pULong == 70,"69.66 should be 70");
1927 ok(DISP_E_OVERFLOW == VarUI4FromDate( -69.33, pULong ), XOV);
1928 ok(DISP_E_OVERFLOW == VarUI4FromDate( -69.66, pULong ), XOV);
1930 ok(S_OK == VarUI4FromBool( VARIANT_TRUE, pULong ), XOK);
1931 ok(*pULong == 4294967295U, "TRUE should be 4294967295");
1932 ok(S_OK == VarUI4FromBool( VARIANT_FALSE, pULong ), XOK);
1933 ok(*pULong == 0, "FALSE should be 0");
1935 for (i = 0; i < NB_OLE_STRINGS; i++)
1937 *pULong=42;
1938 rc=VarUI4FromStr( pOleChar[i], 0, 0, pULong );
1939 ok(rc == strrets_U4[i].error,
1940 "VarUI4FromStr([%d]=\"%s\") rc=%lx instead of %lx",
1941 i,_pTestStrA[i],rc,strrets_U4[i].error);
1942 if (rc == 0 && strrets_U4[i].error == 0) {
1943 ok(*pULong == strrets_U4[i].retval,
1944 "VarUI4FromStr([%d]=\"%s\") got %lu instead of %lu",
1945 i,_pTestStrA[i],*pULong,strrets_U4[i].retval);
1949 /* CHAR from ...
1951 trace( "\n\n======== Testing VarI1FromXXX ========\n");
1953 ok(S_OK == VarI1FromBool( VARIANT_TRUE, pByte ), XOK);
1954 ok(*pByte == 255, " TRUE should be 255");
1956 ok(S_OK == VarI1FromBool( VARIANT_TRUE, pChar ), XOK);
1957 ok(*pChar == -1, "TRUE should be -1");
1959 ok(S_OK == VarI1FromBool( VARIANT_FALSE, pChar ), XOK);
1960 ok(*pChar == 0, "FALSE should be 0");
1962 ok(DISP_E_OVERFLOW == VarI1FromUI1( (unsigned char)32767, pChar ), XOV);
1963 ok(*pChar == 0, "should still be 0");
1964 ok(DISP_E_OVERFLOW == VarI1FromUI1( (unsigned char)65535, pChar ), XOV);
1965 ok(*pChar == 0, "should still be 0");
1967 ok(DISP_E_OVERFLOW == VarI1FromI4( 32767, pChar ), XOV);
1968 ok(*pChar == 0, "should still be 0");
1969 ok(DISP_E_OVERFLOW == VarI1FromI4( 32768, pChar ), XOV);
1970 ok(*pChar == 0, "should still be 0");
1971 ok(DISP_E_OVERFLOW == VarI1FromI4( -32768, pChar ), XOV);
1972 ok(*pChar == 0, "should still be 0");
1973 ok(DISP_E_OVERFLOW == VarI1FromI4( -32769, pChar ), XOV);
1974 ok(*pChar == 0, "should still be 0");
1976 ok(S_OK == VarI1FromR8( 69.33, pChar ), XOK);
1977 ok(*pChar == 69, "69.33 should be 69");
1978 ok(S_OK == VarI1FromR8( 69.66, pChar ), XOK);
1979 ok(*pChar == 70, "69.66 should be 70");
1981 ok(S_OK == VarI1FromR8( -69.33, pChar ), XOK);
1982 ok(*pChar == -69, "-69.33 should be -69");
1983 ok(S_OK == VarI1FromR8( -69.66, pChar ), XOK);
1984 ok(*pChar == -70, "-69.66 should be -70");
1985 ok(S_OK == VarI1FromDate( -69.66, pChar ), XOK);
1986 ok(*pChar == -70, "-69.66 should be -70");
1988 for (i = 0; i < NB_OLE_STRINGS; i++)
1990 *pChar=42;
1991 rc=VarI1FromStr( pOleChar[i], 0, 0, pChar );
1992 ok(rc == strrets_I1[i].error,
1993 "VarI1FromStr([%d]=\"%s\") rc=%lx instead of %lx",
1994 i,_pTestStrA[i],rc,strrets_I1[i].error);
1995 if (rc == 0 && strrets_I1[i].error == 0) {
1996 ok(*pChar == strrets_I1[i].retval,
1997 "VarI1FromStr([%d]=\"%s\") got %d instead of %d",
1998 i,_pTestStrA[i],*pChar,strrets_I1[i].retval);
2002 /* short from ...
2004 trace( "\n\n======== Testing VarI2FromXXX ========\n");
2006 ok(S_OK == VarI2FromUI2( 32767, pShort ), XOK);
2007 ok(*pShort == 32767, "should be 32767");
2008 ok(DISP_E_OVERFLOW == VarI2FromUI2( 65535, pShort ), XOV);
2009 ok(*pShort == 32767, "pShort should be unchanged");
2011 ok(S_OK == VarI2FromI4( 32767, pShort ), XOK);
2012 ok(*pShort == 32767, "should be 32767");
2013 ok(DISP_E_OVERFLOW == VarI2FromI4( 32768, pShort ), XOV);
2014 ok(*pShort == 32767, "should still be 32767");
2015 ok(S_OK == VarI2FromI4( -32768, pShort ), XOK);
2016 ok(*pShort == -32768, "should be -32768");
2017 ok(DISP_E_OVERFLOW == VarI2FromI4( -32769, pShort ), XOV);
2018 ok(*pShort == -32768, "should still be -32768");
2020 ok(S_OK == VarI2FromR8( 69.33, pShort ), XOK);
2021 ok(*pShort == 69, "should be 69");
2022 ok(S_OK == VarI2FromR8( 69.66, pShort ), XOK);
2023 ok(*pShort == 70, "should be 70");
2024 ok(S_OK == VarI2FromR8( -69.33, pShort ), XOK);
2025 ok(*pShort == -69, "should be -69");
2026 ok(S_OK == VarI2FromR8( -69.66, pShort ), XOK);
2027 ok(*pShort == -70, "should be -70");
2028 ok(S_OK == VarI2FromDate( -69.66, pShort ), XOK);
2029 ok(*pShort == -70, "should be -70");
2031 for (i = 0; i < NB_OLE_STRINGS; i++)
2033 *pShort=42;
2034 rc=VarI2FromStr( pOleChar[i], 0, 0, pShort );
2035 ok(rc == strrets_I2[i].error,
2036 "VarI2FromStr([%d]=\"%s\") rc=%lx instead of %lx",
2037 i,_pTestStrA[i],rc,strrets_I2[i].error);
2038 if (rc == 0 && strrets_I2[i].error == 0) {
2039 ok(*pShort == strrets_I2[i].retval,
2040 "VarI2FromStr([%d]=\"%s\") got %d instead of %d",
2041 i,_pTestStrA[i],*pShort,strrets_I2[i].retval);
2045 /* long from ...
2047 trace( "\n\n======== Testing VarI4FromXXX ========\n");
2049 ok(S_OK == VarI4FromI2( 3, (long*)pInt ), XOK);
2050 ok(*pInt == 3,"should be 3");
2052 ok(S_OK == VarI4FromR8( 69.33, pLong ), XOK);
2053 ok(*pLong == 69,"should be 69");
2054 ok(S_OK == VarI4FromR8( 69.66, pLong ), XOK);
2055 ok(*pLong == 70,"should be 70");
2056 ok(S_OK == VarI4FromR8( -69.33, pLong ), XOK);
2057 ok(*pLong == -69,"should be -69");
2058 ok(S_OK == VarI4FromR8( -69.66, pLong ), XOK);
2059 ok(*pLong == -70,"should be -70");
2061 ok(S_OK == VarI4FromR8( 2147483647.0, pLong ), XOK);
2062 ok(*pLong == 2147483647,"should be 2147483647");
2063 ok(DISP_E_OVERFLOW == VarI4FromR8( 2147483648.0, pLong ), XOV);
2064 ok(*pLong == 2147483647,"should still be 2147483647");
2066 ok(S_OK == VarI4FromR8( -2147483647.0, pLong ), XOK);
2067 ok(*pLong == -2147483647,"should be -2147483647");
2068 ok(S_OK == VarI4FromR8( -2147483648.0, pLong ), XOK);
2069 ok(*pLong == 0x80000000L,"should be -2147483648");
2070 ok(DISP_E_OVERFLOW == VarI4FromR8( -2147483649.0, pLong ), XOV);
2071 ok(*pLong == 0x80000000L,"should still be -2147483648");
2072 ok(DISP_E_OVERFLOW == VarI4FromDate( -2147483649.0, pLong ), XOV);
2073 ok(*pLong == 0x80000000L,"should still be -2147483648");
2075 for (i = 0; i < NB_OLE_STRINGS; i++)
2077 *pLong=42;
2078 rc=VarI4FromStr( pOleChar[i], 0, 0, pLong );
2079 ok(rc == strrets_I4[i].error,
2080 "VarI4FromStr([%d]=\"%s\") rc=%lx instead of %lx",
2081 i,_pTestStrA[i],rc,strrets_I4[i].error);
2082 if (rc == 0 && strrets_I4[i].error == 0) {
2083 ok(*pLong == strrets_I4[i].retval,
2084 "VarI4FromStr([%d]=\"%s\") got %ld instead of %ld",
2085 i,_pTestStrA[i],*pLong,strrets_I4[i].retval);
2089 /* float from ...
2091 trace( "\n\n======== Testing VarR4FromXXX ========\n");
2093 ok(S_OK == VarR4FromI4( 16777216, pFloat ), XOK);
2094 ok(16777216.0 == *pFloat,"should be 16777216.0");
2096 ok(S_OK == VarR4FromI4( 16777217, pFloat ), XOK);
2097 ok(16777216.0 == *pFloat,"should be 16777216.0");
2098 ok(S_OK == VarR4FromI4( -16777216, pFloat ), XOK);
2099 ok(-16777216.0 == *pFloat,"should be -16777216.0");
2100 ok(S_OK == VarR4FromI4( -16777217, pFloat ), XOK);
2101 ok(-16777216.0 == *pFloat,"should be -16777216.0");
2103 ok(S_OK == VarR4FromR8( 16777216.0, pFloat ), XOK);
2104 ok(16777216.0 == *pFloat,"should be 16777216.0");
2105 ok(S_OK == VarR4FromR8( 16777217.0, pFloat ), XOK);
2106 ok(16777216.0 == *pFloat,"should be 16777216.0");
2107 ok(S_OK == VarR4FromR8( -16777216.0, pFloat ), XOK);
2108 ok(-16777216.0 == *pFloat,"should be -16777216.0");
2109 ok(S_OK == VarR4FromR8( -16777217.0, pFloat ), XOK);
2110 ok(-16777216.0 == *pFloat,"should be -16777216.0");
2112 ok(S_OK == VarR4FromR8( 16777218e31, pFloat ), XOK);
2113 ok(*pFloat == 167772177736353110000000000000000000000.000000,
2114 "should be 167772177736353110000000000000000000000.000000");
2115 ok(DISP_E_OVERFLOW == VarR4FromR8( 16777218e32, pFloat ), XOV);
2116 ok(*pFloat == 167772177736353110000000000000000000000.000000,
2117 "should still be 167772177736353110000000000000000000000.000000");
2118 ok(S_OK == VarR4FromDate( 16777218e31, pFloat ), XOK);
2119 ok(*pFloat == 167772177736353110000000000000000000000.000000,
2120 "should be 167772177736353110000000000000000000000.000000");
2122 for (i = 0; i < NB_OLE_STRINGS; i++)
2124 *pFloat=42.0;
2125 rc=VarR4FromStr( pOleChar[i], 0, 0, pFloat );
2126 ok(rc == strrets_R4[i].error,
2127 "VarR4FromStr([%d]=\"%s\") rc=%lx instead of %lx",
2128 i,_pTestStrA[i],rc,strrets_R4[i].error);
2129 if (rc == 0 && strrets_R4[i].error == 0) {
2130 ok(*pFloat == strrets_R4[i].retval,
2131 "VarR4FromStr([%d]=\"%s\") got %f instead of %f",
2132 i,_pTestStrA[i],*pFloat,strrets_R4[i].retval);
2136 /* double from ...
2138 trace( "\n\n======== Testing VarR8FromXXX ========\n");
2140 ok(S_OK == VarR8FromDate( 900719925474099.0, pDouble ), XOK);
2141 ok(*pDouble == 900719925474099.000000,"should be 900719925474099.000000\n");
2142 for (i = 0; i < NB_OLE_STRINGS; i++)
2144 *pDouble=42.0;
2145 rc=VarR8FromStr( pOleChar[i], 0, 0, pDouble );
2146 ok(rc == strrets_R8[i].error,
2147 "VarR8FromStr([%d]=\"%s\") rc=%lx instead of %lx",
2148 i,_pTestStrA[i],rc,strrets_R8[i].error);
2149 if (rc == 0 && strrets_R8[i].error == 0) {
2150 ok(*pDouble == strrets_R8[i].retval,
2151 "VarR8FromStr([%d]=\"%s\") got %g instead of %g",
2152 i,_pTestStrA[i],*pDouble,strrets_R8[i].retval);
2156 /* date from ...
2158 trace( "\n\n======== Testing VarDateFromXXX ========\n");
2160 ok(S_OK == VarDateFromI4( 2958465, pDouble ), XOK);
2161 ok(*pDouble == 2958465.000000,"should be 2958465.000000");
2162 ok(DISP_E_OVERFLOW == VarDateFromI4( 2958466, pDouble ), XOV);
2163 ok(*pDouble == 2958465.000000,"should still be 2958465.000000");
2164 ok(S_OK == VarDateFromI4( -657434, pDouble ), XOK);
2165 ok(*pDouble == -657434.000000,"should be -657434.000000");
2166 ok(DISP_E_OVERFLOW == VarDateFromI4( -657435, pDouble ), XOV);
2167 ok(*pDouble == -657434.000000,"should still be -657434.000000");
2169 ok(S_OK == VarDateFromR8( 2958465.9999, pDouble ), XOK);
2170 ok(*pDouble == 2958465.999900, "should be 2958465.999900");
2171 ok(DISP_E_OVERFLOW == VarDateFromR8( 2958466, pDouble ), XOV);
2172 ok(*pDouble == 2958465.999900, "should still be 2958465.999900");
2173 ok(S_OK == VarDateFromR8( -657434.9999, pDouble ), XOK);
2174 ok(*pDouble == -657434.999900,"should be -657434.999900");
2175 ok(DISP_E_OVERFLOW == VarDateFromR8( -657435, pDouble ), XOV);
2176 ok(*pDouble == -657434.999900,"should still be -657434.999900");
2178 ok(S_OK == VarDateFromR8( 0.0, pDouble ), XOK);
2179 ok(*pDouble == 0.0,"0.0 should be 0.0");
2180 ok(S_OK == VarDateFromR8( 1.0, pDouble ), XOK);
2181 ok(*pDouble == 1.0,"1.0 should be 1.0");
2182 ok(S_OK == VarDateFromR8( 2.25, pDouble ), XOK);
2183 ok(*pDouble == 2.25,"2.25 should be 2.25");
2184 ok(S_OK == VarDateFromR8( -2.0, pDouble ), XOK);
2185 ok(*pDouble == -2.0,"-2.0 should be -2.0");
2187 /* Need some parsing function in Linux to emulate this...
2188 * Still in progess.
2190 for (i = 0; i < NB_OLE_STRINGS; i++)
2192 *pDouble=42.0;
2193 rc=VarDateFromStr( pOleChar[i], 0, 0, pDouble );
2194 if (strrets_DATE[i].todo_rc) {
2195 todo_wine {
2196 ok(rc == strrets_DATE[i].error,
2197 "VarDateFromStr([%d]=\"%s\") rc= %lx instead of %lx",
2198 i,_pTestStrA[i],rc,strrets_DATE[i].error);
2200 } else {
2201 ok(rc == strrets_DATE[i].error,
2202 "VarDateFromStr([%d]=\"%s\") rc= %lx instead of %lx",
2203 i,_pTestStrA[i],rc,strrets_DATE[i].error);
2205 if (strrets_DATE[i].todo_rc || strrets_DATE[i].todo_val) {
2206 todo_wine {
2207 if (rc == 0 && strrets_DATE[i].error == 0) {
2208 ok(*pDouble == strrets_DATE[i].retval,
2209 "VarDateFromStr([%d]=\"%s\") got %g instead of %g",
2210 i,_pTestStrA[i],*pDouble,strrets_DATE[i].retval);
2213 } else {
2214 if (rc == 0 && strrets_DATE[i].error == 0) {
2215 ok(*pDouble == strrets_DATE[i].retval,
2216 "VarDateFromStr([%d]=\"%s\") got %g instead of %g",
2217 i,_pTestStrA[i],*pDouble,strrets_DATE[i].retval);
2221 /* bool from ...
2223 trace( "\n\n======== Testing VarBoolFromXXX ========\n");
2225 ok(S_OK == VarBoolFromI4( 0, pBool ), XOK);
2226 ok(VARIANT_FALSE == *pBool, "expected FALSE");
2227 ok(S_OK == VarBoolFromI4( 1, pBool ), XOK);
2228 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2229 ok(S_OK == VarBoolFromI4( -1, pBool ), XOK);
2230 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2231 ok(S_OK == VarBoolFromI4( 2, pBool ), XOK);
2232 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2234 ok(S_OK == VarBoolFromUI1( ' ', pBool ), XOK);
2235 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2236 ok(S_OK == VarBoolFromUI1( '\0', pBool ), XOK);
2237 ok(VARIANT_FALSE == *pBool, "expected FALSE");
2238 ok(S_OK == VarBoolFromUI1( 0x0000, pBool ), XOK);
2239 ok(VARIANT_FALSE == *pBool, "expected FALSE");
2240 ok(S_OK == VarBoolFromUI1( (unsigned char)0xFFF, pBool ), XOK);
2241 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2242 ok(S_OK == VarBoolFromUI1( (unsigned char)0xFFFF, pBool ), XOK);
2243 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2245 ok(S_OK == VarBoolFromR8( 0.0, pBool ), XOK);
2246 ok(VARIANT_FALSE == *pBool, "expected FALSE");
2247 ok(S_OK == VarBoolFromR8( 1.1, pBool ), XOK);
2248 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2249 ok(S_OK == VarBoolFromR8( 0.5, pBool ), XOK);
2250 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2251 ok(S_OK == VarBoolFromR8( 0.49, pBool ), XOK);
2252 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2253 ok(S_OK == VarBoolFromR8( 0.51, pBool ), XOK);
2254 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2255 ok(S_OK == VarBoolFromR8( -0.5, pBool ), XOK);
2256 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2257 ok(S_OK == VarBoolFromR8( -0.49, pBool ), XOK);
2258 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2259 ok(S_OK == VarBoolFromR8( -0.51, pBool ), XOK);
2260 ok(VARIANT_TRUE == *pBool, "expected TRUE");
2263 for (i = 0; i < NB_OLE_STRINGS; i++)
2265 *pBool=42;
2266 rc=VarBoolFromStr( pOleChar[i], 0, 0, pBool );
2267 ok(rc == strrets_B[i].error,
2268 "VarBoolFromStr([%d]=\"%s\") rc=%lx instead of %lx",
2269 i,_pTestStrA[i],rc,strrets_B[i].error);
2270 if (rc == 0 && strrets_B[i].error == 0) {
2271 ok(*pBool == strrets_B[i].retval,
2272 "VarBoolFromStr([%d]=\"%s\") got %x instead of %x",
2273 i,_pTestStrA[i],*pBool,strrets_B[i].retval);
2277 ok(S_OK == VarI1FromBool( VARIANT_TRUE, pByte ), XOK);
2278 ok(*pByte == 0xff,"true should be 0xff");
2279 ok(DISP_E_OVERFLOW == VarUI2FromI2( -1, pUShort ), XOV);
2281 /* BSTR from ...
2283 trace( "\n\n======== Testing VarBSTRFromXXX ========\n");
2285 /* integers...
2287 ok(S_OK == VarBstrFromI1( -100, 0, 0, &bstr ), XOK);
2288 ok(!strcmp(WtoA(bstr),"\"-100\""),"should be string -100");
2290 ok(S_OK == VarBstrFromUI1( 0x5A, 0, 0, &bstr ), XOK);
2291 ok(!strcmp(WtoA(bstr),"\"90\""),"should be string 90");
2292 ok(S_OK == VarBstrFromI4( 2958465, 0, 0, &bstr ), XOK);
2293 ok(!strcmp(WtoA(bstr),"\"2958465\""),"should be string 2958465");
2295 /* reals...
2297 off = 0;
2298 d=0;
2299 for( i=0; i<20; i++ )
2301 char xval[80];
2302 /* add an integer to the real number
2304 d += ((i%9)+1) * pow( 10, i );
2306 ok(S_OK == VarBstrFromR8( d, 0, 0, &bstr ), XOK);
2307 sprintf(xval,"\"%s\"",strfromr8[off]);
2308 ok(!strcmp(xval,WtoA(bstr)),
2309 "d is %g, should be cvt. to %s, but return val is %s",
2310 d,strfromr8[off],WtoA(bstr));
2311 off++;
2313 ok(S_OK == VarBstrFromR8( -d, 0, 0, &bstr ), XOK);
2314 sprintf(xval,"\"%s\"",strfromr8[off]);
2315 ok(!strcmp(xval,WtoA(bstr)),
2316 "d is %g, should be cvt. to %s, but return val is %s",
2317 -d,strfromr8[off],WtoA(bstr));
2318 off++;
2320 d=0;
2321 for( i=0; i<20; i++ )
2323 char xval[80];
2324 /* add a decimal to the real number
2326 d += ((i%9)+1) * pow( 10, (i*-1) );
2327 ok(S_OK == VarBstrFromR8( d, 0, 0, &bstr ), XOK);
2328 sprintf(xval,"\"%s\"",strfromr8[off]);
2329 ok(!strcmp(xval,WtoA(bstr)),
2330 "d is %g, should be cvt. to %s, but return val is %s",
2331 d,strfromr8[off],WtoA(bstr));
2332 off++;
2333 ok(S_OK == VarBstrFromR8( d-1, 0, 0, &bstr ), XOK);
2334 sprintf(xval,"\"%s\"",strfromr8[off]);
2335 ok(!strcmp(xval,WtoA(bstr)),
2336 "d is %g, should be cvt. to %s, but return val is %s",
2337 d-1,strfromr8[off],WtoA(bstr));
2338 off++;
2339 ok(S_OK == VarBstrFromR8( -d, 0, 0, &bstr ), XOK);
2340 sprintf(xval,"\"%s\"",strfromr8[off]);
2341 ok(!strcmp(xval,WtoA(bstr)),
2342 "d is %g, should be cvt. to %s, but return val is %s",
2343 -d,strfromr8[off],WtoA(bstr));
2344 off++;
2347 d=0;
2348 for( i=0; i<20; i++ )
2350 char xval[80];
2351 /* add an integer to the real number
2353 d += ((i%9)+1) * pow( 10, i );
2354 /* add a decimal to the real number
2356 d += ((i%9)+1) * pow( 10, (i*-1) );
2357 ok(S_OK == VarBstrFromR8( d, 0, 0, &bstr ), XOK);
2358 sprintf(xval,"\"%s\"",strfromr8[off]);
2359 ok(!strcmp(xval,WtoA(bstr)),
2360 "d is %g, should be cvt. to %s, but return val is %s",
2361 d,strfromr8[off],WtoA(bstr));
2362 off++;
2363 ok(S_OK == VarBstrFromR8( -d, 0, 0, &bstr ), XOK);
2364 sprintf(xval,"\"%s\"",strfromr8[off]);
2365 ok(!strcmp(xval,WtoA(bstr)),
2366 "d is %g, should be cvt. to %s, but return val is %s",
2367 -d,strfromr8[off],WtoA(bstr));
2368 off++;
2373 d=0;
2374 for( i=0; i<10; i++ )
2376 char xval[80];
2377 /* add an integer to the real number
2379 d += ((i%9)+1) * pow( 10, i );
2380 ok(S_OK == VarBstrFromR4( (float)d, 0, 0, &bstr ), XOK);
2381 sprintf(xval,"\"%s\"",strfromr8[off]);
2382 ok(!strcmp(xval,WtoA(bstr)),
2383 "d is %g, should be cvt. to %s, but return val is %s",
2384 d,strfromr8[off],WtoA(bstr));
2385 off++;
2386 ok(S_OK == VarBstrFromR4( (float)-d, 0, 0, &bstr ), XOK);
2387 sprintf(xval,"\"%s\"",strfromr8[off]);
2388 ok(!strcmp(xval,WtoA(bstr)),
2389 "d is %g, should be cvt. to %s, but return val is %s",
2390 -d,strfromr8[off],WtoA(bstr));
2391 off++;
2393 d=0;
2394 for( i=0; i<10; i++ )
2396 char xval[80];
2397 /* add a decimal to the real number
2399 d += ((i%9)+1) * pow( 10, (i*-1) );
2400 ok(S_OK == VarBstrFromR4( (float)d, 0, 0, &bstr ), XOK);
2401 sprintf(xval,"\"%s\"",strfromr8[off]);
2402 ok(!strcmp(xval,WtoA(bstr)),
2403 "d is %g, should be cvt. to %s, but return val is %s",
2404 d,strfromr8[off],WtoA(bstr));
2405 off++;
2406 ok(S_OK == VarBstrFromR4( (float)d-1, 0, 0, &bstr ), XOK);
2407 sprintf(xval,"\"%s\"",strfromr8[off]);
2408 ok(!strcmp(xval,WtoA(bstr)),
2409 "d is %g, should be cvt. to %s, but return val is %s",
2410 d-1,strfromr8[off],WtoA(bstr));
2411 off++;
2412 ok(S_OK == VarBstrFromR4( (float)-d, 0, 0, &bstr ), XOK);
2413 sprintf(xval,"\"%s\"",strfromr8[off]);
2414 ok(!strcmp(xval,WtoA(bstr)),
2415 "d is %g, should be cvt. to %s, but return val is %s",
2416 -d,strfromr8[off],WtoA(bstr));
2417 off++;
2420 d=0;
2421 for( i=0; i<10; i++ )
2423 char xval[80];
2424 /* add an integer to the real number
2426 d += ((i%9)+1) * pow( 10, i );
2427 /* add a decimal to the real number
2429 d += ((i%9)+1) * pow( 10, (i*-1) );
2430 ok(S_OK == VarBstrFromR4( (float)d, 0, 0, &bstr ), XOK);
2431 sprintf(xval,"\"%s\"",strfromr8[off]);
2432 ok(!strcmp(xval,WtoA(bstr)),
2433 "d is %g, should be cvt. to %s, but return val is %s",
2434 d,strfromr8[off],WtoA(bstr));
2435 off++;
2436 ok(S_OK == VarBstrFromR4( (float)-d, 0, 0, &bstr ), XOK);
2437 sprintf(xval,"\"%s\"",strfromr8[off]);
2438 ok(!strcmp(xval,WtoA(bstr)),
2439 "d is %g, should be cvt. to %s, but return val is %s",
2440 -d,strfromr8[off],WtoA(bstr));
2441 off++;
2444 ok(S_OK == VarBstrFromBool( 0x00, 0, 0, &bstr ), XOK);
2445 ok(!strcmp(WtoA(bstr),"\"False\""),"should be 'False'");
2446 ok(S_OK == VarBstrFromBool( 0xFF, 0, 0, &bstr ), XOK);
2447 ok(!strcmp(WtoA(bstr),"\"True\""),"should be 'True'");
2449 ok(S_OK == VarBstrFromDate( 0.0, 0, 0, &bstr ), XOK);
2450 todo_wine {
2451 ok(!strcmp(WtoA(bstr),"\"12:00:00 AM\""),
2452 "should be '12:00:00 AM', but is %s\n",WtoA(bstr));
2455 ok(S_OK == VarBstrFromDate( 3.34, 0, 0, &bstr ), XOK);
2456 todo_wine {
2457 ok(!strcmp(WtoA(bstr),"\"1/2/1900 8:09:36 AM\""),
2458 "should be '1/2/1900 8:09:36 AM', but is %s\n",WtoA(bstr));
2461 ok(S_OK == VarBstrFromDate( 3339.34, 0, 0, &bstr ), XOK);
2462 todo_wine {
2463 ok(!strcmp(WtoA(bstr),"\"2/20/1909 8:09:36 AM\""),
2464 "should be '2/20/1909 8:09:36 AM', but is %s\n",WtoA(bstr));
2467 ok(S_OK == VarBstrFromDate( 365.00, 0, 0, &bstr ), XOK);
2468 todo_wine {
2469 ok(!strcmp(WtoA(bstr),"\"12/30/1900\""),
2470 "should be '12/30/1900', but is %s\n",WtoA(bstr));
2473 ok(S_OK == VarBstrFromDate( 365.25, 0, 0, &bstr ), XOK);
2474 todo_wine {
2475 ok(!strcmp(WtoA(bstr),"\"12/30/1900 6:00:00 AM\""),
2476 "should be '12/30/1900 6:00:00 AM', but is %s\n",WtoA(bstr));
2479 ok(S_OK == VarBstrFromDate( 1461.0, 0, 0, &bstr ), XOK);
2480 todo_wine {
2481 ok(!strcmp(WtoA(bstr),"\"12/31/1903\""),
2482 "should be '12/31/1903', but is %s\n",WtoA(bstr));
2485 ok(S_OK == VarBstrFromDate( 1461.5, 0, 0, &bstr ), XOK);
2486 todo_wine {
2487 ok(!strcmp(WtoA(bstr),"\"12/31/1903 12:00:00 PM\""),
2488 "should be '12/31/1903 12:00:00 PM', but is %s\n",WtoA(bstr));
2491 /* Test variant API...
2493 trace( "\n\n======== Testing Hi-Level Variant API ========\n");
2495 bstr = SysAllocString( pOleChar[4] );
2497 VariantClear( &va );
2499 VariantInit( &va );
2500 VariantInit( &vb );
2501 VariantInit( &vc );
2502 VariantInit( &vd );
2503 VariantInit( &ve );
2505 V_VT(&va) = VT_BSTR;
2506 V_UNION(&va,bstrVal) = bstr;
2507 ok(S_OK == VariantClear( &va ), XOK);
2508 SysFreeString( bstr );
2509 SysFreeString( bstr );
2511 ok(S_OK == VariantCopy( &vb, &va ), XOK);
2512 ok(S_OK == VariantClear( &vb ), XOK);
2513 ok(S_OK == VariantClear( &va ), XOK);
2515 V_VT(&va) = VT_R8;
2516 d = 4.123;
2517 V_UNION(&va,dblVal) = d;
2518 ok(S_OK == VariantCopy( &va, &va ), XOK);
2519 ok(V_R8(&va) == 4.123,"should be 4.123");
2521 V_VT(&va) = VT_R8 | VT_BYREF;
2522 d = 31.123;
2523 V_UNION(&va,pdblVal) = &d;
2524 ok(S_OK == VariantCopyInd( &va, &va ), XOK);
2525 ok(V_R8(&va) == 31.123,"should be 31.123");
2527 V_VT(&va) = VT_R8;
2528 d = 1.123;
2529 V_UNION(&va,dblVal) = d;
2530 ok(S_OK == VariantCopy( &vb, &va ), XOK);
2531 ok(V_R8(&vb) == 1.123,"should be 1.123");
2533 V_VT(&va) = VT_R8 | VT_BYREF;
2534 d = 123.123;
2535 V_UNION(&va,pdblVal) = &d;
2536 ok(S_OK == VariantCopy( &vb, &va ), XOK);
2537 ok(*(V_R8REF(&vb)) == 123.123,"should be 123.123");
2539 V_VT(&va) = VT_R8 | VT_BYREF;
2540 d = 111.2;
2541 V_UNION(&va,pdblVal) = &d;
2542 ok(S_OK == VariantCopyInd( &vb, &va ), XOK);
2543 ok(V_R8(&vb) == 111.2,"should be 111.2");
2545 V_VT(&va) = VT_R8 | VT_BYREF;
2546 d = 1211.123453;
2547 V_UNION(&va,pdblVal) = &d;
2548 ok(S_OK == VariantChangeTypeEx( &va, &va, 0, 0, VT_I2 ), XOK);
2549 ok(V_VT(&va) == VT_I2,"should be type VT_I2");
2551 V_VT(&va) = VT_INT;
2552 V_UNION(&va,intVal) = 4;
2553 ok(S_OK == VariantChangeTypeEx(&vb, &va, 0, 0, VT_BSTR ), XOK);
2554 ok(!strcmp(WtoA(V_BSTR(&vb)),"\"4\""),"should be 4");
2556 V_VT(&va) = VT_DATE;
2557 V_UNION(&va,date) = 34465.332431;
2558 ok(S_OK == VariantChangeTypeEx(&vb, &va, 0, 0, VT_BSTR ), XOK);
2559 todo_wine {
2560 ok(!strcmp(WtoA(V_BSTR(&vb)),"\"5/11/94 7:58:42 AM\""),"should be 5/11/94 7:58:42 AM");
2563 bstr = pOleChar[4];
2564 V_VT(&va) = VT_BSTR;
2565 V_UNION(&va,bstrVal) = bstr;
2566 ok(S_OK == VariantChangeTypeEx(&vb, &va, 0, 0, VT_R8 ), XOK);
2567 ok(V_R8(&vb) == -0.490000,"should be -0.49");
2569 V_VT(&vc) = VT_BSTR | VT_BYREF;
2570 V_UNION(&vc,pbstrVal) = &bstr;
2571 V_VT(&vb) = VT_VARIANT | VT_BYREF;
2572 V_UNION(&vb,pvarVal) = &vc;
2573 V_VT(&va) = VT_VARIANT | VT_BYREF;
2574 V_UNION(&va,pvarVal) = &vb;
2575 ok(E_INVALIDARG == VariantCopyInd( &vd, &va ), "expect E_INVALIDARG");
2577 /* test what happens when bad vartypes are passed in */
2578 trace( "-------------- Testing different VARTYPES ----------------\n" );
2580 #ifdef FIXED_THIS
2581 for( i=0; i<sizeof(vartypes)/sizeof(vartypes[0]); i++ )
2583 /* Trying to use variants that are set to be BSTR but
2584 * do not contain a valid pointer makes the program crash
2585 * in Windows so we will skip those. We do not need them
2586 * anyway to illustrate the behavior.
2588 V_VT(&va) = vartypes[i].ind;
2589 d = 4.123;
2590 V_UNION(&va,dblVal) = d;
2591 rc = VariantCopyInd( &vb, &va );
2592 sprintf(msg,"vt %d, return value %lx, expected was %lx",vartypes[i].ind,rc,vartypes[i].vcind1);
2593 ok(vartypes[i].vcind1 == rc, msg);
2594 V_VT(&va) = vartypes[i].ind | VT_BYREF;
2595 d = 4.123;
2596 V_UNION(&va,pdblVal) = &d;
2597 rc = VariantCopyInd( &vb, &va );
2598 sprintf(msg,"vt %d, return value %lx, expected was %lx",vartypes[i].ind,rc,vartypes[i].vcind2);
2599 ok(vartypes[i].vcind2 == rc, msg);
2600 V_VT(&va) = VT_R8;
2601 d = 4.123;
2602 V_UNION(&va,dblVal) = d;
2603 rc = VariantChangeTypeEx( &vb, &va, 0, 0, i );
2604 sprintf(msg,"vt %d, return value %lx, expected was %lx",vartypes[i].ind,rc,vartypes[i].vcex1);
2605 ok(vartypes[i].vcex1 == rc, msg);
2606 V_VT(&va) = VT_R8;
2607 d = 4.123;
2608 V_UNION(&va,dblVal) = d;
2609 rc = VariantChangeTypeEx( &vb, &va, 0, 0, i | VT_BYREF );
2610 sprintf(msg,"vt %d, return value %lx, expected was %lx",vartypes[i].ind,rc,vartypes[i].vcex1);
2611 ok(vartypes[i].vcex2 == rc, msg);
2613 V_VT(&va) = 99;
2614 d = 4.123;
2615 V_UNION(&va,dblVal) = d;
2616 ok(DISP_E_BADVARTYPE == VariantClear( &va ), "should give DISP_E_BADVARTYPE");
2618 #endif
2619 VariantClear( &va );
2620 VariantClear( &vb );
2621 VariantClear( &vc );
2622 VariantClear( &vd );
2623 VariantClear( &ve );
2624 /* There is alot of memory leaks but this is simply a test program.