2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for sprintf
5 * PROGRAMMER: Timo Kreuzer
13 #include <wine/test.h>
17 #define ok_str(x, y) \
18 ok(strcmp(x, y) == 0, "got '%s', expected '%s'\n", x, y);
20 #define ok_int(x, y) \
21 ok(x == y, "got %d, expected %d\n", x, y);
23 int (*p_vsprintf
)(char *buf
, const char *fmt
, va_list argptr
);
27 my_sprintf(char *buf
, const char *format
, ...)
29 const TCHAR
* fmt
= format
;
32 va_start(argptr
, format
);
33 return p_vsprintf(buf
, fmt
, argptr
);
37 my_swprintf(wchar_t *buf
, const wchar_t *format
, ...)
39 const wchar_t * fmt
= format
;
42 va_start(argptr
, format
);
43 return _vsnwprintf(buf
, MAXLONG
, fmt
, argptr
);
46 #define sprintf(buf, format, ...) my_sprintf(buf, format, __VA_ARGS__);
47 #define swprintf(buf, format, ...) my_swprintf((wchar_t*)buf, format, __VA_ARGS__);
54 sprintf(buffer
, "%c", 0x3031);
57 sprintf(buffer
, "%hc", 0x3031);
60 sprintf(buffer
, "%wc", 0x3031);
63 sprintf(buffer
, "%lc", 0x3031);
66 sprintf(buffer
, "%Lc", 0x3031);
69 sprintf(buffer
, "%Ic", 0x3031);
72 sprintf(buffer
, "%Iwc", 0x3031);
73 ok_str(buffer
, "Iwc");
75 sprintf(buffer
, "%I32c", 0x3031);
78 sprintf(buffer
, "%I64c", 0x3031);
81 sprintf(buffer
, "%4c", 0x3031);
84 sprintf(buffer
, "%04c", 0x3031);
85 ok_str(buffer
, "0001");
87 sprintf(buffer
, "%+4c", 0x3031);
98 sprintf(buffer
, "%d", 1234567);
99 ok_str(buffer
, "1234567");
101 sprintf(buffer
, "%d", -1234567);
102 ok_str(buffer
, "-1234567");
104 sprintf(buffer
, "%hd", 1234567);
105 ok_str(buffer
, "-10617");
107 sprintf(buffer
, "%08d", 1234);
108 ok_str(buffer
, "00001234");
110 sprintf(buffer
, "%-08d", 1234);
111 ok_str(buffer
, "1234 ");
113 sprintf(buffer
, "%+08d", 1234);
114 ok_str(buffer
, "+0001234");
116 sprintf(buffer
, "%+3d", 1234);
117 ok_str(buffer
, "+1234");
119 sprintf(buffer
, "%3.3d", 1234);
120 ok_str(buffer
, "1234");
122 sprintf(buffer
, "%3.6d", 1234);
123 ok_str(buffer
, "001234");
125 sprintf(buffer
, "%8d", -1234);
126 ok_str(buffer
, " -1234");
128 sprintf(buffer
, "%08d", -1234);
129 ok_str(buffer
, "-0001234");
131 sprintf(buffer
, "%ld", -1234);
132 ok_str(buffer
, "-1234");
134 sprintf(buffer
, "%wd", -1234);
135 ok_str(buffer
, "-1234");
137 sprintf(buffer
, "%ld", -5149074030855LL);
138 ok_str(buffer
, "591757049");
140 sprintf(buffer
, "%lld", -5149074030855LL);
141 ok_str(buffer
, "591757049");
143 sprintf(buffer
, "%I64d", -5149074030855LL);
144 ok_str(buffer
, "-5149074030855");
146 sprintf(buffer
, "%Ld", -5149074030855LL);
147 ok_str(buffer
, "591757049");
149 sprintf(buffer
, "%lhwI64d", -5149074030855LL);
150 ok_str(buffer
, "-5149074030855");
152 sprintf(buffer
, "%I64hlwd", -5149074030855LL);
153 ok_str(buffer
, "-5149074030855");
155 sprintf(buffer
, "%hlwd", -5149074030855LL);
156 ok_str(buffer
, "32505");
158 sprintf(buffer
, "%Ild", -5149074030855LL);
159 ok_str(buffer
, "Ild");
161 sprintf(buffer
, "%hd", -5149074030855LL);
162 ok_str(buffer
, "32505");
164 sprintf(buffer
, "%hhd", -5149074030855LL);
165 ok_str(buffer
, "32505");
167 sprintf(buffer
, "%hI32hd", -5149074030855LL);
168 ok_str(buffer
, "32505");
170 sprintf(buffer
, "%wd", -5149074030855LL);
171 ok_str(buffer
, "591757049");
173 result
= sprintf(buffer
, " %d.%d", 3, 0);
183 sprintf(buffer
, "%u", 1234);
184 ok_str(buffer
, "1234");
186 sprintf(buffer
, "%u", -1234);
187 ok_str(buffer
, "4294966062");
189 sprintf(buffer
, "%lu", -1234);
190 ok_str(buffer
, "4294966062");
192 sprintf(buffer
, "%llu", -1234);
193 ok_str(buffer
, "4294966062");
195 sprintf(buffer
, "%+u", 1234);
196 ok_str(buffer
, "1234");
198 sprintf(buffer
, "% u", 1234);
199 ok_str(buffer
, "1234");
208 sprintf(buffer
, "%x", 0x1234abcd);
209 ok_str(buffer
, "1234abcd");
211 sprintf(buffer
, "%X", 0x1234abcd);
212 ok_str(buffer
, "1234ABCD");
214 sprintf(buffer
, "%#x", 0x1234abcd);
215 ok_str(buffer
, "0x1234abcd");
217 sprintf(buffer
, "%#X", 0x1234abcd);
218 ok_str(buffer
, "0X1234ABCD");
220 /* "0x" is contained in the field length */
221 sprintf(buffer
, "%#012X", 0x1234abcd);
222 ok_str(buffer
, "0X001234ABCD");
224 sprintf(buffer
, "%llx", 0x1234abcd5678ULL
);
225 ok_str(buffer
, "abcd5678");
227 sprintf(buffer
, "%I64x", 0x1234abcd5678ULL
);
228 ok_str(buffer
, "1234abcd5678");
237 sprintf(buffer
, "%p", (void*)(ptrdiff_t)0x123abc);
238 ok_str(buffer
, "00123ABC");
240 sprintf(buffer
, "%#p", (void*)(ptrdiff_t)0x123abc);
241 ok_str(buffer
, "0X00123ABC");
243 sprintf(buffer
, "%#012p", (void*)(ptrdiff_t)0x123abc);
244 ok_str(buffer
, " 0X00123ABC");
246 sprintf(buffer
, "%9p", (void*)(ptrdiff_t)0x123abc);
247 ok_str(buffer
, " 00123ABC");
249 sprintf(buffer
, "%09p", (void*)(ptrdiff_t)0x123abc);
250 ok_str(buffer
, " 00123ABC");
252 sprintf(buffer
, "% 9p", (void*)(ptrdiff_t)0x123abc);
253 ok_str(buffer
, " 00123ABC");
255 sprintf(buffer
, "%-9p", (void*)(ptrdiff_t)0x123abc);
256 ok_str(buffer
, "00123ABC ");
258 sprintf(buffer
, "%4p", (void*)(ptrdiff_t)0x123abc);
259 ok_str(buffer
, "00123ABC");
261 sprintf(buffer
, "%9.4p", (void*)(ptrdiff_t)0x123abc);
262 ok_str(buffer
, " 00123ABC");
264 sprintf(buffer
, "%I64p", 0x123abc456789ULL
);
265 ok_str(buffer
, "123ABC456789");
267 sprintf(buffer
, "%hp", 0x123abc);
268 ok_str(buffer
, "00003ABC");
277 sprintf(buffer
, "%o", 1234);
278 ok_str(buffer
, "2322");
280 sprintf(buffer
, "%o", -1234);
281 ok_str(buffer
, "37777775456");
290 sprintf(buffer
, "%s", "test");
291 ok_str(buffer
, "test");
293 sprintf(buffer
, "%S", L
"test");
294 ok_str(buffer
, "test");
296 sprintf(buffer
, "%ls", L
"test");
297 ok_str(buffer
, "test");
299 sprintf(buffer
, "%ws", L
"test");
300 ok_str(buffer
, "test");
302 sprintf(buffer
, "%hs", "test");
303 ok_str(buffer
, "test");
305 sprintf(buffer
, "%hS", "test");
306 ok_str(buffer
, "test");
308 sprintf(buffer
, "%7s", "test");
309 ok_str(buffer
, " test");
311 sprintf(buffer
, "%07s", "test");
312 ok_str(buffer
, "000test");
314 sprintf(buffer
, "%.3s", "test");
315 ok_str(buffer
, "tes");
317 sprintf(buffer
, "%+7.3s", "test");
318 ok_str(buffer
, " tes");
320 sprintf(buffer
, "%+4.0s", "test");
333 sprintf(buffer
, "%07s%n", "test", &len
);
337 sprintf(buffer
, "%s%hn", "test", &len
);
338 ok_int(len
, 0x12340004);
341 sprintf(buffer
, "%s%hhn", "test", &len
);
342 ok_int(len
, 0x12340004);
344 len64
= 0x0123456781234567ULL
;
345 sprintf(buffer
, "%s%lln", "test", &len64
);
346 ok(len64
== 0x123456700000004ULL
, " ");
357 sprintf(buffer
, "%f", fpval
);
358 ok_str(buffer
, "-0.000000");
360 sprintf(buffer
, "%lf", fpval
);
361 ok_str(buffer
, "-0.000000");
363 sprintf(buffer
, "%llf", fpval
);
364 ok_str(buffer
, "-0.000000");
366 sprintf(buffer
, "%Lf", fpval
);
367 ok_str(buffer
, "-0.000000");
369 sprintf(buffer
, "%f", (double)fpval
);
370 ok_str(buffer
, "0.333333");
372 sprintf(buffer
, "%f", (double)0.125);
373 ok_str(buffer
, "0.125000");
375 sprintf(buffer
, "%3.7f", (double)fpval
);
376 ok_str(buffer
, "0.3333333");
378 sprintf(buffer
, "%3.30f", (double)fpval
);
379 ok_str(buffer
, "0.333333333333333310000000000000");
381 sprintf(buffer
, "%3.60f", (double)fpval
);
382 ok_str(buffer
, "0.333333333333333310000000000000000000000000000000000000000000");
384 sprintf(buffer
, "%3.80f", (double)fpval
);
385 ok_str(buffer
, "0.33333333333333331000000000000000000000000000000000000000000000000000000000000000");
388 sprintf(buffer
, "%f", fpval
);
389 ok_str(buffer
, "0.000000");
391 sprintf(buffer
, "%f", 0x7ff8000000000000ULL
); // NAN
392 ok_str(buffer
, "1.#QNAN0");
394 sprintf(buffer
, "%.9f", 0x7ff8000000000000ULL
);
395 ok_str(buffer
, "1.#QNAN0000");
397 sprintf(buffer
, "%f", 0x7ff0000000000000ULL
); // INFINITY
398 ok_str(buffer
, "1.#INF00");
400 sprintf(buffer
, "%f", 0xfff0000000000000ULL
); // -INFINITY
401 ok_str(buffer
, "-1.#INF00");
403 sprintf(buffer
, "%f", 0xfff8000000000000ULL
); // broken
404 ok_str(buffer
, "-1.#IND00");
415 sprintf(buffer
, "%e", fpval
);
416 ok_str(buffer
, "-3.720662e-103");
419 sprintf(buffer
, "%e", (double)fpval
);
420 ok_str(buffer
, "3.333333e-001");
422 sprintf(buffer
, "%e", 33.54223);
423 ok_str(buffer
, "3.354223e+001");
425 sprintf(buffer
, "%e", NAN
);
426 ok_str(buffer
, "1.#QNAN0e+000");
428 sprintf(buffer
, "%.9e", NAN
);
429 ok_str(buffer
, "1.#QNAN0000e+000");
431 sprintf(buffer
, "%e", INFINITY
);
432 ok_str(buffer
, "1.#INF00e+000");
434 sprintf(buffer
, "%e", -INFINITY
);
435 ok_str(buffer
, "-1.#INF00e+000");
440 typedef struct _STRING
442 unsigned short Length
;
443 unsigned short MaximumLength
;
454 string
.Buffer
= "Test\0Hallo";
456 string
.MaximumLength
= 5;
458 sprintf(buffer
, "%Z", &string
);
459 ok_str(buffer
, "Test");
462 sprintf(buffer
, "%Z", &string
);
463 ok_str(buffer
, "Test");
466 sprintf(buffer
, "%Z", &string
);
467 ok_str(buffer
, "Tes");
470 sprintf(buffer
, "%Z", &string
);
471 ok_str(buffer
, "(null)");
473 sprintf(buffer
, "%Z", 0);
474 ok_str(buffer
, "(null)");
476 string
.Buffer
= (char*)L
"Test\0Hallo";
478 string
.MaximumLength
= 10;
481 string
.Buffer
= (char*)L
"test";
483 string
.MaximumLength
= 15;
484 result
= _snprintf(buffer
, 127, "%Z %u%c", &string
, 1, 0);
494 sprintf(buffer
, "%lI64wQ", "test");
503 hModule
= GetModuleHandleA("msvcrt.dll");
504 if (!hModule
) return;
505 p_vsprintf
= (PVOID
)GetProcAddress(hModule
, "vsprintf");
506 if (!p_vsprintf
) return;