1ba99e5d7552a86de69ecab3016795d0531d90e7
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
;
33 va_start(argptr
, format
);
34 return p_vsprintf(buf
, fmt
, argptr
);
38 my_swprintf(wchar_t *buf
, const wchar_t *format
, ...)
40 const wchar_t * fmt
= format
;
43 va_start(argptr
, format
);
44 return _vsnwprintf(buf
, MAXLONG
, fmt
, argptr
);
47 #define sprintf(buf, format, ...) my_sprintf(buf, format, __VA_ARGS__);
48 #define swprintf(buf, format, ...) my_swprintf((wchar_t*)buf, format, __VA_ARGS__);
55 sprintf(buffer
, "%c", 0x3031);
58 sprintf(buffer
, "%hc", 0x3031);
61 sprintf(buffer
, "%wc", 0x3031);
64 sprintf(buffer
, "%lc", 0x3031);
67 sprintf(buffer
, "%Lc", 0x3031);
70 sprintf(buffer
, "%Ic", 0x3031);
73 sprintf(buffer
, "%Iwc", 0x3031);
74 ok_str(buffer
, "Iwc");
76 sprintf(buffer
, "%I32c", 0x3031);
79 sprintf(buffer
, "%I64c", 0x3031);
82 sprintf(buffer
, "%4c", 0x3031);
85 sprintf(buffer
, "%04c", 0x3031);
86 ok_str(buffer
, "0001");
88 sprintf(buffer
, "%+4c", 0x3031);
99 sprintf(buffer
, "%d", 1234567);
100 ok_str(buffer
, "1234567");
102 sprintf(buffer
, "%d", -1234567);
103 ok_str(buffer
, "-1234567");
105 sprintf(buffer
, "%hd", 1234567);
106 ok_str(buffer
, "-10617");
108 sprintf(buffer
, "%08d", 1234);
109 ok_str(buffer
, "00001234");
111 sprintf(buffer
, "%-08d", 1234);
112 ok_str(buffer
, "1234 ");
114 sprintf(buffer
, "%+08d", 1234);
115 ok_str(buffer
, "+0001234");
117 sprintf(buffer
, "%+3d", 1234);
118 ok_str(buffer
, "+1234");
120 sprintf(buffer
, "%3.3d", 1234);
121 ok_str(buffer
, "1234");
123 sprintf(buffer
, "%3.6d", 1234);
124 ok_str(buffer
, "001234");
126 sprintf(buffer
, "%8d", -1234);
127 ok_str(buffer
, " -1234");
129 sprintf(buffer
, "%08d", -1234);
130 ok_str(buffer
, "-0001234");
132 sprintf(buffer
, "%ld", -1234);
133 ok_str(buffer
, "-1234");
135 sprintf(buffer
, "%wd", -1234);
136 ok_str(buffer
, "-1234");
138 sprintf(buffer
, "%ld", -5149074030855LL);
139 ok_str(buffer
, "591757049");
141 sprintf(buffer
, "%lld", -5149074030855LL);
142 ok_str(buffer
, "591757049");
144 sprintf(buffer
, "%I64d", -5149074030855LL);
145 ok_str(buffer
, "-5149074030855");
147 sprintf(buffer
, "%Ld", -5149074030855LL);
148 ok_str(buffer
, "591757049");
150 sprintf(buffer
, "%lhwI64d", -5149074030855LL);
151 ok_str(buffer
, "-5149074030855");
153 sprintf(buffer
, "%I64hlwd", -5149074030855LL);
154 ok_str(buffer
, "-5149074030855");
156 sprintf(buffer
, "%hlwd", -5149074030855LL);
157 ok_str(buffer
, "32505");
159 sprintf(buffer
, "%Ild", -5149074030855LL);
160 ok_str(buffer
, "Ild");
162 sprintf(buffer
, "%hd", -5149074030855LL);
163 ok_str(buffer
, "32505");
165 sprintf(buffer
, "%hhd", -5149074030855LL);
166 ok_str(buffer
, "32505");
168 sprintf(buffer
, "%hI32hd", -5149074030855LL);
169 ok_str(buffer
, "32505");
171 sprintf(buffer
, "%wd", -5149074030855LL);
172 ok_str(buffer
, "591757049");
174 result
= sprintf(buffer
, " %d.%d", 3, 0);
184 sprintf(buffer
, "%u", 1234);
185 ok_str(buffer
, "1234");
187 sprintf(buffer
, "%u", -1234);
188 ok_str(buffer
, "4294966062");
190 sprintf(buffer
, "%lu", -1234);
191 ok_str(buffer
, "4294966062");
193 sprintf(buffer
, "%llu", -1234);
194 ok_str(buffer
, "4294966062");
196 sprintf(buffer
, "%+u", 1234);
197 ok_str(buffer
, "1234");
199 sprintf(buffer
, "% u", 1234);
200 ok_str(buffer
, "1234");
209 sprintf(buffer
, "%x", 0x1234abcd);
210 ok_str(buffer
, "1234abcd");
212 sprintf(buffer
, "%X", 0x1234abcd);
213 ok_str(buffer
, "1234ABCD");
215 sprintf(buffer
, "%#x", 0x1234abcd);
216 ok_str(buffer
, "0x1234abcd");
218 sprintf(buffer
, "%#X", 0x1234abcd);
219 ok_str(buffer
, "0X1234ABCD");
221 /* "0x" is contained in the field length */
222 sprintf(buffer
, "%#012X", 0x1234abcd);
223 ok_str(buffer
, "0X001234ABCD");
225 sprintf(buffer
, "%llx", 0x1234abcd5678ULL
);
226 ok_str(buffer
, "abcd5678");
228 sprintf(buffer
, "%I64x", 0x1234abcd5678ULL
);
229 ok_str(buffer
, "1234abcd5678");
238 sprintf(buffer
, "%p", (void*)(ptrdiff_t)0x123abc);
239 ok_str(buffer
, "00123ABC");
241 sprintf(buffer
, "%#p", (void*)(ptrdiff_t)0x123abc);
242 ok_str(buffer
, "0X00123ABC");
244 sprintf(buffer
, "%#012p", (void*)(ptrdiff_t)0x123abc);
245 ok_str(buffer
, " 0X00123ABC");
247 sprintf(buffer
, "%9p", (void*)(ptrdiff_t)0x123abc);
248 ok_str(buffer
, " 00123ABC");
250 sprintf(buffer
, "%09p", (void*)(ptrdiff_t)0x123abc);
251 ok_str(buffer
, " 00123ABC");
253 sprintf(buffer
, "% 9p", (void*)(ptrdiff_t)0x123abc);
254 ok_str(buffer
, " 00123ABC");
256 sprintf(buffer
, "%-9p", (void*)(ptrdiff_t)0x123abc);
257 ok_str(buffer
, "00123ABC ");
259 sprintf(buffer
, "%4p", (void*)(ptrdiff_t)0x123abc);
260 ok_str(buffer
, "00123ABC");
262 sprintf(buffer
, "%9.4p", (void*)(ptrdiff_t)0x123abc);
263 ok_str(buffer
, " 00123ABC");
265 sprintf(buffer
, "%I64p", 0x123abc456789ULL
);
266 ok_str(buffer
, "123ABC456789");
268 sprintf(buffer
, "%hp", 0x123abc);
269 ok_str(buffer
, "00003ABC");
278 sprintf(buffer
, "%o", 1234);
279 ok_str(buffer
, "2322");
281 sprintf(buffer
, "%o", -1234);
282 ok_str(buffer
, "37777775456");
291 sprintf(buffer
, "%s", "test");
292 ok_str(buffer
, "test");
294 sprintf(buffer
, "%S", L
"test");
295 ok_str(buffer
, "test");
297 sprintf(buffer
, "%ls", L
"test");
298 ok_str(buffer
, "test");
300 sprintf(buffer
, "%ws", L
"test");
301 ok_str(buffer
, "test");
303 sprintf(buffer
, "%hs", "test");
304 ok_str(buffer
, "test");
306 sprintf(buffer
, "%hS", "test");
307 ok_str(buffer
, "test");
309 sprintf(buffer
, "%7s", "test");
310 ok_str(buffer
, " test");
312 sprintf(buffer
, "%07s", "test");
313 ok_str(buffer
, "000test");
315 sprintf(buffer
, "%.3s", "test");
316 ok_str(buffer
, "tes");
318 sprintf(buffer
, "%+7.3s", "test");
319 ok_str(buffer
, " tes");
321 sprintf(buffer
, "%+4.0s", "test");
334 sprintf(buffer
, "%07s%n", "test", &len
);
338 sprintf(buffer
, "%s%hn", "test", &len
);
339 ok_int(len
, 0x12340004);
342 sprintf(buffer
, "%s%hhn", "test", &len
);
343 ok_int(len
, 0x12340004);
345 len64
= 0x0123456781234567ULL
;
346 sprintf(buffer
, "%s%lln", "test", &len64
);
347 ok(len64
== 0x123456700000004ULL
, " ");
358 sprintf(buffer
, "%f", fpval
);
359 ok_str(buffer
, "-0.000000");
361 sprintf(buffer
, "%lf", fpval
);
362 ok_str(buffer
, "-0.000000");
364 sprintf(buffer
, "%llf", fpval
);
365 ok_str(buffer
, "-0.000000");
367 sprintf(buffer
, "%Lf", fpval
);
368 ok_str(buffer
, "-0.000000");
370 sprintf(buffer
, "%f", (double)fpval
);
371 ok_str(buffer
, "0.333333");
373 sprintf(buffer
, "%f", (double)0.125);
374 ok_str(buffer
, "0.125000");
376 sprintf(buffer
, "%3.7f", (double)fpval
);
377 ok_str(buffer
, "0.3333333");
379 sprintf(buffer
, "%3.30f", (double)fpval
);
380 ok_str(buffer
, "0.333333333333333310000000000000");
382 sprintf(buffer
, "%3.60f", (double)fpval
);
383 ok_str(buffer
, "0.333333333333333310000000000000000000000000000000000000000000");
385 sprintf(buffer
, "%3.80f", (double)fpval
);
386 ok_str(buffer
, "0.33333333333333331000000000000000000000000000000000000000000000000000000000000000");
389 sprintf(buffer
, "%f", fpval
);
390 ok_str(buffer
, "0.000000");
392 sprintf(buffer
, "%f", 0x7ff8000000000000ULL
); // NAN
393 ok_str(buffer
, "1.#QNAN0");
395 sprintf(buffer
, "%.9f", 0x7ff8000000000000ULL
);
396 ok_str(buffer
, "1.#QNAN0000");
398 sprintf(buffer
, "%f", 0x7ff0000000000000ULL
); // INFINITY
399 ok_str(buffer
, "1.#INF00");
401 sprintf(buffer
, "%f", 0xfff0000000000000ULL
); // -INFINITY
402 ok_str(buffer
, "-1.#INF00");
404 sprintf(buffer
, "%f", 0xfff8000000000000ULL
); // broken
405 ok_str(buffer
, "-1.#IND00");
416 sprintf(buffer
, "%e", fpval
);
417 ok_str(buffer
, "-3.720662e-103");
420 sprintf(buffer
, "%e", (double)fpval
);
421 ok_str(buffer
, "3.333333e-001");
423 sprintf(buffer
, "%e", 33.54223);
424 ok_str(buffer
, "3.354223e+001");
426 sprintf(buffer
, "%e", NAN
);
427 ok_str(buffer
, "1.#QNAN0e+000");
429 sprintf(buffer
, "%.9e", NAN
);
430 ok_str(buffer
, "1.#QNAN0000e+000");
432 sprintf(buffer
, "%e", INFINITY
);
433 ok_str(buffer
, "1.#INF00e+000");
435 sprintf(buffer
, "%e", -INFINITY
);
436 ok_str(buffer
, "-1.#INF00e+000");
441 typedef struct _STRING
443 unsigned short Length
;
444 unsigned short MaximumLength
;
455 string
.Buffer
= "Test\0Hallo";
457 string
.MaximumLength
= 5;
459 sprintf(buffer
, "%Z", &string
);
460 ok_str(buffer
, "Test");
463 sprintf(buffer
, "%Z", &string
);
464 ok_str(buffer
, "Test");
467 sprintf(buffer
, "%Z", &string
);
468 ok_str(buffer
, "Tes");
471 sprintf(buffer
, "%Z", &string
);
472 ok_str(buffer
, "(null)");
474 sprintf(buffer
, "%Z", 0);
475 ok_str(buffer
, "(null)");
477 string
.Buffer
= (char*)L
"Test\0Hallo";
479 string
.MaximumLength
= 10;
482 string
.Buffer
= (char*)L
"test";
484 string
.MaximumLength
= 15;
485 result
= _snprintf(buffer
, 127, "%Z %u%c", &string
, 1, 0);
495 sprintf(buffer
, "%lI64wQ", "test");
504 hModule
= GetModuleHandleA("msvcrt.dll");
505 if (!hModule
) return;
506 p_vsprintf
= (PVOID
)GetProcAddress(hModule
, "vsprintf");
507 if (!p_vsprintf
) return;