2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for sprintf
5 * PROGRAMMER: Thomas Faber <thomas.faber@reactos.org>
9 #include <apitest_guard.h>
11 #define WIN32_NO_STATUS
14 #include <pseh/pseh2.h>
15 #include <ndk/mmfuncs.h>
16 #include <ndk/rtlfuncs.h>
19 #pragma warning(disable:4778) // unterminated format string '%'
20 #elif defined(__GNUC__)
21 #pragma GCC diagnostic ignored "-Wformat"
22 #pragma GCC diagnostic ignored "-Wformat-zero-length"
23 #pragma GCC diagnostic ignored "-Wnonnull"
25 #pragma GCC diagnostic ignored "-Wformat-overflow"
29 /* NOTE: This test is not only used for all the CRT apitests, but also for
30 * user32's wsprintf. Make sure to test them all */
37 /* basic parameter tests */
39 Length
= sprintf(NULL
, NULL
);
40 EndSeh(STATUS_ACCESS_VIOLATION
);
43 Length
= sprintf(NULL
, "");
45 #if TEST_CRTDLL || TEST_USER32
46 EndSeh(STATUS_ACCESS_VIOLATION
);
48 EndSeh(STATUS_SUCCESS
);
52 Length
= sprintf(NULL
, "Hello");
54 #if TEST_CRTDLL || TEST_USER32
55 EndSeh(STATUS_ACCESS_VIOLATION
);
57 EndSeh(STATUS_SUCCESS
);
60 /* some basic formats */
61 Length
= sprintf(Buffer
, "abcde");
62 ok_str(Buffer
, "abcde");
65 Length
= sprintf(Buffer
, "%%");
69 Length
= sprintf(Buffer
, "%");
73 Length
= sprintf(Buffer
, "%%%");
77 Length
= sprintf(Buffer
, "%d", 8);
81 Length
= sprintf(Buffer
, "%s", "hello");
82 ok_str(Buffer
, "hello");
85 /* field width for %s */
86 Length
= sprintf(Buffer
, "%8s", "hello");
87 ok_str(Buffer
, " hello");
90 Length
= sprintf(Buffer
, "%4s", "hello");
91 ok_str(Buffer
, "hello");
94 Length
= sprintf(Buffer
, "%-8s", "hello");
95 ok_str(Buffer
, "hello ");
98 Length
= sprintf(Buffer
, "%-5s", "hello");
99 ok_str(Buffer
, "hello");
102 Length
= sprintf(Buffer
, "%0s", "hello");
103 ok_str(Buffer
, "hello");
106 Length
= sprintf(Buffer
, "%-0s", "hello");
107 ok_str(Buffer
, "hello");
110 Length
= sprintf(Buffer
, "%*s", -8, "hello");
112 ok_str(Buffer
, "*s");
115 ok_str(Buffer
, "hello ");
119 /* precision for %s */
120 Length
= sprintf(Buffer
, "%.s", "hello");
124 Length
= sprintf(Buffer
, "%.0s", "hello");
128 Length
= sprintf(Buffer
, "%.10s", "hello");
129 ok_str(Buffer
, "hello");
132 Length
= sprintf(Buffer
, "%.5s", "hello");
133 ok_str(Buffer
, "hello");
136 Length
= sprintf(Buffer
, "%.4s", "hello");
137 ok_str(Buffer
, "hell");
141 Length
= sprintf(Buffer
, "%.*s", -1, "hello");
143 ok_str(Buffer
, "*s");
146 ok_str(Buffer
, "hello");
149 EndSeh(STATUS_SUCCESS
);
151 String
= AllocateGuarded(6);
154 skip("Guarded allocation failure\n");
158 strcpy(String
, "hello");
160 Length
= sprintf(Buffer
, "%.8s", String
);
161 ok_str(Buffer
, "hello");
163 EndSeh(STATUS_SUCCESS
);
166 Length
= sprintf(Buffer
, "%.6s", String
);
167 ok_str(Buffer
, "hello");
169 EndSeh(STATUS_SUCCESS
);
172 Length
= sprintf(Buffer
, "%.5s", String
);
173 ok_str(Buffer
, "hello");
175 EndSeh(STATUS_SUCCESS
);
178 Length
= sprintf(Buffer
, "%.4s", String
);
179 ok_str(Buffer
, "hell");
181 EndSeh(STATUS_SUCCESS
);
185 Length
= sprintf(Buffer
, "%.5s", String
);
186 ok_str(Buffer
, "hello");
189 EndSeh(STATUS_ACCESS_VIOLATION
);
191 EndSeh(STATUS_SUCCESS
);
195 Length
= sprintf(Buffer
, "%.6s", String
);
196 ok_str(Buffer
, "hello!");
199 EndSeh(STATUS_ACCESS_VIOLATION
);
201 EndSeh(STATUS_SUCCESS
);
205 Length
= sprintf(Buffer
, "%.*s", 5, String
);
207 ok_str(Buffer
, "*s");
210 ok_str(Buffer
, "hello");
213 EndSeh(STATUS_SUCCESS
);
216 Length
= sprintf(Buffer
, "%.*s", 6, String
);
218 ok_str(Buffer
, "*s");
221 ok_str(Buffer
, "hello!");
224 EndSeh(STATUS_SUCCESS
);
226 /* both field width and precision */
228 Length
= sprintf(Buffer
, "%8.5s", String
);
229 ok_str(Buffer
, " hello");
232 EndSeh(STATUS_ACCESS_VIOLATION
);
234 EndSeh(STATUS_SUCCESS
);
238 Length
= sprintf(Buffer
, "%-*.6s", -8, String
);
240 ok_str(Buffer
, "*.6s");
243 ok_str(Buffer
, "hello! ");
246 EndSeh(STATUS_SUCCESS
);
249 Length
= sprintf(Buffer
, "%*.*s", -8, 6, String
);
251 ok_str(Buffer
, "*.*s");
254 ok_str(Buffer
, "hello! ");
257 EndSeh(STATUS_SUCCESS
);