2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for sprintf
5 * PROGRAMMER: Timo Kreuzer
18 #define ok_str(x, y) \
19 ok(strcmp(x, y) == 0, "got '%s', expected '%s'\n", x, y);
21 #define ok_int(x, y) \
22 ok(x == y, "got %d, expected %d\n", x, y);
24 int (*p_vsprintf
)(char *buf
, const char *fmt
, va_list argptr
);
28 my_sprintf(char *buf
, const char *format
, ...)
30 const TCHAR
* fmt
= format
;
34 va_start(argptr
, format
);
35 ret
= p_vsprintf(buf
, fmt
, argptr
);
42 my_swprintf(wchar_t *buf
, const wchar_t *format
, ...)
44 const wchar_t * fmt
= format
;
48 va_start(argptr
, format
);
49 ret
= _vsnwprintf(buf
, MAXLONG
, fmt
, argptr
);
55 #define sprintf(buf, format, ...) my_sprintf(buf, format, __VA_ARGS__);
56 #define swprintf(buf, format, ...) my_swprintf((wchar_t*)buf, format, __VA_ARGS__);
63 sprintf(buffer
, "%c", 0x3031);
66 sprintf(buffer
, "%hc", 0x3031);
69 sprintf(buffer
, "%wc", 0x3031);
72 sprintf(buffer
, "%lc", 0x3031);
75 sprintf(buffer
, "%Lc", 0x3031);
78 sprintf(buffer
, "%Ic", 0x3031);
81 sprintf(buffer
, "%Iwc", 0x3031);
82 ok_str(buffer
, "Iwc");
84 sprintf(buffer
, "%I32c", 0x3031);
87 sprintf(buffer
, "%I64c", 0x3031);
90 sprintf(buffer
, "%4c", 0x3031);
93 sprintf(buffer
, "%04c", 0x3031);
94 ok_str(buffer
, "0001");
96 sprintf(buffer
, "%+4c", 0x3031);
107 sprintf(buffer
, "%d", 1234567);
108 ok_str(buffer
, "1234567");
110 sprintf(buffer
, "%d", -1234567);
111 ok_str(buffer
, "-1234567");
113 sprintf(buffer
, "%hd", 1234567);
114 ok_str(buffer
, "-10617");
116 sprintf(buffer
, "%08d", 1234);
117 ok_str(buffer
, "00001234");
119 sprintf(buffer
, "%-08d", 1234);
120 ok_str(buffer
, "1234 ");
122 sprintf(buffer
, "%+08d", 1234);
123 ok_str(buffer
, "+0001234");
125 sprintf(buffer
, "%+3d", 1234);
126 ok_str(buffer
, "+1234");
128 sprintf(buffer
, "%3.3d", 1234);
129 ok_str(buffer
, "1234");
131 sprintf(buffer
, "%3.6d", 1234);
132 ok_str(buffer
, "001234");
134 sprintf(buffer
, "%8d", -1234);
135 ok_str(buffer
, " -1234");
137 sprintf(buffer
, "%08d", -1234);
138 ok_str(buffer
, "-0001234");
140 sprintf(buffer
, "%ld", -1234);
141 ok_str(buffer
, "-1234");
143 sprintf(buffer
, "%wd", -1234);
144 ok_str(buffer
, "-1234");
146 sprintf(buffer
, "%ld", -5149074030855LL);
147 ok_str(buffer
, "591757049");
149 sprintf(buffer
, "%lld", -5149074030855LL);
150 ok_str(buffer
, "591757049");
152 sprintf(buffer
, "%I64d", -5149074030855LL);
153 ok_str(buffer
, "-5149074030855");
155 sprintf(buffer
, "%Ld", -5149074030855LL);
156 ok_str(buffer
, "591757049");
158 sprintf(buffer
, "%lhwI64d", -5149074030855LL);
159 ok_str(buffer
, "-5149074030855");
161 sprintf(buffer
, "%I64hlwd", -5149074030855LL);
162 ok_str(buffer
, "-5149074030855");
164 sprintf(buffer
, "%hlwd", -5149074030855LL);
165 ok_str(buffer
, "32505");
167 sprintf(buffer
, "%Ild", -5149074030855LL);
168 ok_str(buffer
, "Ild");
170 sprintf(buffer
, "%hd", -5149074030855LL);
171 ok_str(buffer
, "32505");
173 sprintf(buffer
, "%hhd", -5149074030855LL);
174 ok_str(buffer
, "32505");
176 sprintf(buffer
, "%hI32hd", -5149074030855LL);
177 ok_str(buffer
, "32505");
179 sprintf(buffer
, "%wd", -5149074030855LL);
180 ok_str(buffer
, "591757049");
182 result
= sprintf(buffer
, " %d.%d", 3, 0);
192 sprintf(buffer
, "%u", 1234);
193 ok_str(buffer
, "1234");
195 sprintf(buffer
, "%u", -1234);
196 ok_str(buffer
, "4294966062");
198 sprintf(buffer
, "%lu", -1234);
199 ok_str(buffer
, "4294966062");
201 sprintf(buffer
, "%llu", -1234);
202 ok_str(buffer
, "4294966062");
204 sprintf(buffer
, "%+u", 1234);
205 ok_str(buffer
, "1234");
207 sprintf(buffer
, "% u", 1234);
208 ok_str(buffer
, "1234");
217 sprintf(buffer
, "%x", 0x1234abcd);
218 ok_str(buffer
, "1234abcd");
220 sprintf(buffer
, "%X", 0x1234abcd);
221 ok_str(buffer
, "1234ABCD");
223 sprintf(buffer
, "%#x", 0x1234abcd);
224 ok_str(buffer
, "0x1234abcd");
226 sprintf(buffer
, "%#X", 0x1234abcd);
227 ok_str(buffer
, "0X1234ABCD");
229 /* "0x" is contained in the field length */
230 sprintf(buffer
, "%#012X", 0x1234abcd);
231 ok_str(buffer
, "0X001234ABCD");
233 sprintf(buffer
, "%llx", 0x1234abcd5678ULL
);
234 ok_str(buffer
, "abcd5678");
236 sprintf(buffer
, "%I64x", 0x1234abcd5678ULL
);
237 ok_str(buffer
, "1234abcd5678");
246 sprintf(buffer
, "%p", (void*)(ptrdiff_t)0x123abc);
247 ok_str(buffer
, "00123ABC");
249 sprintf(buffer
, "%#p", (void*)(ptrdiff_t)0x123abc);
250 ok_str(buffer
, "0X00123ABC");
252 sprintf(buffer
, "%#012p", (void*)(ptrdiff_t)0x123abc);
253 ok_str(buffer
, " 0X00123ABC");
255 sprintf(buffer
, "%9p", (void*)(ptrdiff_t)0x123abc);
256 ok_str(buffer
, " 00123ABC");
258 sprintf(buffer
, "%09p", (void*)(ptrdiff_t)0x123abc);
259 ok_str(buffer
, " 00123ABC");
261 sprintf(buffer
, "% 9p", (void*)(ptrdiff_t)0x123abc);
262 ok_str(buffer
, " 00123ABC");
264 sprintf(buffer
, "%-9p", (void*)(ptrdiff_t)0x123abc);
265 ok_str(buffer
, "00123ABC ");
267 sprintf(buffer
, "%4p", (void*)(ptrdiff_t)0x123abc);
268 ok_str(buffer
, "00123ABC");
270 sprintf(buffer
, "%9.4p", (void*)(ptrdiff_t)0x123abc);
271 ok_str(buffer
, " 00123ABC");
273 sprintf(buffer
, "%I64p", 0x123abc456789ULL
);
274 ok_str(buffer
, "123ABC456789");
276 sprintf(buffer
, "%hp", 0x123abc);
277 ok_str(buffer
, "00003ABC");
286 sprintf(buffer
, "%o", 1234);
287 ok_str(buffer
, "2322");
289 sprintf(buffer
, "%o", -1234);
290 ok_str(buffer
, "37777775456");
299 sprintf(buffer
, "%s", "test");
300 ok_str(buffer
, "test");
302 sprintf(buffer
, "%S", L
"test");
303 ok_str(buffer
, "test");
305 sprintf(buffer
, "%ls", L
"test");
306 ok_str(buffer
, "test");
308 sprintf(buffer
, "%ws", L
"test");
309 ok_str(buffer
, "test");
311 sprintf(buffer
, "%hs", "test");
312 ok_str(buffer
, "test");
314 sprintf(buffer
, "%hS", "test");
315 ok_str(buffer
, "test");
317 sprintf(buffer
, "%7s", "test");
318 ok_str(buffer
, " test");
320 sprintf(buffer
, "%07s", "test");
321 ok_str(buffer
, "000test");
323 sprintf(buffer
, "%.3s", "test");
324 ok_str(buffer
, "tes");
326 sprintf(buffer
, "%+7.3s", "test");
327 ok_str(buffer
, " tes");
329 sprintf(buffer
, "%+4.0s", "test");
342 sprintf(buffer
, "%07s%n", "test", &len
);
346 sprintf(buffer
, "%s%hn", "test", &len
);
347 ok_int(len
, 0x12340004);
350 sprintf(buffer
, "%s%hhn", "test", &len
);
351 ok_int(len
, 0x12340004);
353 len64
= 0x0123456781234567ULL
;
354 sprintf(buffer
, "%s%lln", "test", &len64
);
355 ok(len64
== 0x123456700000004ULL
, " ");
366 sprintf(buffer
, "%f", fpval
);
367 ok_str(buffer
, "-0.000000");
369 sprintf(buffer
, "%lf", fpval
);
370 ok_str(buffer
, "-0.000000");
372 sprintf(buffer
, "%llf", fpval
);
373 ok_str(buffer
, "-0.000000");
375 sprintf(buffer
, "%Lf", fpval
);
376 ok_str(buffer
, "-0.000000");
378 sprintf(buffer
, "%f", (double)fpval
);
379 ok_str(buffer
, "0.333333");
381 sprintf(buffer
, "%f", (double)0.125);
382 ok_str(buffer
, "0.125000");
384 sprintf(buffer
, "%3.7f", (double)fpval
);
385 ok_str(buffer
, "0.3333333");
387 sprintf(buffer
, "%3.30f", (double)fpval
);
388 ok_str(buffer
, "0.333333333333333310000000000000");
390 sprintf(buffer
, "%3.60f", (double)fpval
);
391 ok_str(buffer
, "0.333333333333333310000000000000000000000000000000000000000000");
393 sprintf(buffer
, "%3.80f", (double)fpval
);
394 ok_str(buffer
, "0.33333333333333331000000000000000000000000000000000000000000000000000000000000000");
397 sprintf(buffer
, "%f", fpval
);
398 ok_str(buffer
, "0.000000");
400 sprintf(buffer
, "%f", 0x7ff8000000000000ULL
); // NAN
401 ok_str(buffer
, "1.#QNAN0");
403 sprintf(buffer
, "%.9f", 0x7ff8000000000000ULL
);
404 ok_str(buffer
, "1.#QNAN0000");
406 sprintf(buffer
, "%f", 0x7ff0000000000000ULL
); // INFINITY
407 ok_str(buffer
, "1.#INF00");
409 sprintf(buffer
, "%f", 0xfff0000000000000ULL
); // -INFINITY
410 ok_str(buffer
, "-1.#INF00");
412 sprintf(buffer
, "%f", 0xfff8000000000000ULL
); // broken
413 ok_str(buffer
, "-1.#IND00");
424 sprintf(buffer
, "%e", fpval
);
425 ok_str(buffer
, "-3.720662e-103");
428 sprintf(buffer
, "%e", (double)fpval
);
429 ok_str(buffer
, "3.333333e-001");
431 sprintf(buffer
, "%e", 33.54223);
432 ok_str(buffer
, "3.354223e+001");
434 sprintf(buffer
, "%e", NAN
);
435 ok_str(buffer
, "1.#QNAN0e+000");
437 sprintf(buffer
, "%.9e", NAN
);
438 ok_str(buffer
, "1.#QNAN0000e+000");
440 sprintf(buffer
, "%e", INFINITY
);
441 ok_str(buffer
, "1.#INF00e+000");
443 sprintf(buffer
, "%e", -INFINITY
);
444 ok_str(buffer
, "-1.#INF00e+000");
449 typedef struct _STRING
451 unsigned short Length
;
452 unsigned short MaximumLength
;
463 string
.Buffer
= "Test\0Hallo";
465 string
.MaximumLength
= 5;
467 sprintf(buffer
, "%Z", &string
);
468 ok_str(buffer
, "Test");
471 sprintf(buffer
, "%Z", &string
);
472 ok_str(buffer
, "Test");
475 sprintf(buffer
, "%Z", &string
);
476 ok_str(buffer
, "Tes");
479 sprintf(buffer
, "%Z", &string
);
480 ok_str(buffer
, "(null)");
482 sprintf(buffer
, "%Z", 0);
483 ok_str(buffer
, "(null)");
485 string
.Buffer
= (char*)L
"Test\0Hallo";
487 string
.MaximumLength
= 10;
490 string
.Buffer
= (char*)L
"test";
492 string
.MaximumLength
= 15;
493 result
= _snprintf(buffer
, 127, "%Z %u%c", &string
, 1, 0);
503 sprintf(buffer
, "%lI64wQ", "test");
512 hModule
= GetModuleHandleA("msvcrt.dll");
513 if (!hModule
) return;
514 p_vsprintf
= (PVOID
)GetProcAddress(hModule
, "vsprintf");
515 if (!p_vsprintf
) return;