b612d6d993fcbe0fc9296bb7384d02ce4d15a769
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>
10 #define WIN32_NO_STATUS
13 #include <pseh/pseh2.h>
14 #include <ndk/mmfuncs.h>
15 #include <ndk/rtlfuncs.h>
18 #pragma warning(disable:4778) // unterminated format string '%'
19 #elif defined(__GNUC__)
20 #pragma GCC diagnostic ignored "-Wformat"
21 #pragma GCC diagnostic ignored "-Wformat-zero-length"
22 #pragma GCC diagnostic ignored "-Wnonnull"
24 #pragma GCC diagnostic ignored "-Wformat-overflow"
34 SIZE_T Size
= PAGE_ROUND_UP(SizeRequested
+ PAGE_SIZE
);
35 PVOID VirtualMemory
= NULL
;
38 Status
= NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory
, 0, &Size
, MEM_RESERVE
, PAGE_NOACCESS
);
40 if (!NT_SUCCESS(Status
))
46 Status
= NtAllocateVirtualMemory(NtCurrentProcess(), &VirtualMemory
, 0, &Size
, MEM_COMMIT
, PAGE_READWRITE
);
47 if (!NT_SUCCESS(Status
))
50 Status
= NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory
, &Size
, MEM_RELEASE
);
51 ok(Status
== STATUS_SUCCESS
, "Status = %lx\n", Status
);
56 StartOfBuffer
= VirtualMemory
;
57 StartOfBuffer
+= Size
- SizeRequested
;
68 PVOID VirtualMemory
= (PVOID
)PAGE_ROUND_DOWN((SIZE_T
)Pointer
);
71 Status
= NtFreeVirtualMemory(NtCurrentProcess(), &VirtualMemory
, &Size
, MEM_RELEASE
);
72 ok(Status
== STATUS_SUCCESS
, "Status = %lx\n", Status
);
75 /* NOTE: This test is not only used for all the CRT apitests, but also for
76 * user32's wsprintf. Make sure to test them all */
83 /* basic parameter tests */
85 Length
= sprintf(NULL
, NULL
);
86 EndSeh(STATUS_ACCESS_VIOLATION
);
89 Length
= sprintf(NULL
, "");
91 #if TEST_CRTDLL || TEST_USER32
92 EndSeh(STATUS_ACCESS_VIOLATION
);
94 EndSeh(STATUS_SUCCESS
);
98 Length
= sprintf(NULL
, "Hello");
100 #if TEST_CRTDLL || TEST_USER32
101 EndSeh(STATUS_ACCESS_VIOLATION
);
103 EndSeh(STATUS_SUCCESS
);
106 /* some basic formats */
107 Length
= sprintf(Buffer
, "abcde");
108 ok_str(Buffer
, "abcde");
111 Length
= sprintf(Buffer
, "%%");
115 Length
= sprintf(Buffer
, "%");
119 Length
= sprintf(Buffer
, "%%%");
123 Length
= sprintf(Buffer
, "%d", 8);
127 Length
= sprintf(Buffer
, "%s", "hello");
128 ok_str(Buffer
, "hello");
131 /* field width for %s */
132 Length
= sprintf(Buffer
, "%8s", "hello");
133 ok_str(Buffer
, " hello");
136 Length
= sprintf(Buffer
, "%4s", "hello");
137 ok_str(Buffer
, "hello");
140 Length
= sprintf(Buffer
, "%-8s", "hello");
141 ok_str(Buffer
, "hello ");
144 Length
= sprintf(Buffer
, "%-5s", "hello");
145 ok_str(Buffer
, "hello");
148 Length
= sprintf(Buffer
, "%0s", "hello");
149 ok_str(Buffer
, "hello");
152 Length
= sprintf(Buffer
, "%-0s", "hello");
153 ok_str(Buffer
, "hello");
156 Length
= sprintf(Buffer
, "%*s", -8, "hello");
158 ok_str(Buffer
, "*s");
161 ok_str(Buffer
, "hello ");
165 /* precision for %s */
166 Length
= sprintf(Buffer
, "%.s", "hello");
170 Length
= sprintf(Buffer
, "%.0s", "hello");
174 Length
= sprintf(Buffer
, "%.10s", "hello");
175 ok_str(Buffer
, "hello");
178 Length
= sprintf(Buffer
, "%.5s", "hello");
179 ok_str(Buffer
, "hello");
182 Length
= sprintf(Buffer
, "%.4s", "hello");
183 ok_str(Buffer
, "hell");
187 Length
= sprintf(Buffer
, "%.*s", -1, "hello");
189 ok_str(Buffer
, "*s");
192 ok_str(Buffer
, "hello");
195 EndSeh(STATUS_SUCCESS
);
197 String
= AllocateGuarded(6);
200 skip("Guarded allocation failure\n");
204 strcpy(String
, "hello");
206 Length
= sprintf(Buffer
, "%.8s", String
);
207 ok_str(Buffer
, "hello");
209 EndSeh(STATUS_SUCCESS
);
212 Length
= sprintf(Buffer
, "%.6s", String
);
213 ok_str(Buffer
, "hello");
215 EndSeh(STATUS_SUCCESS
);
218 Length
= sprintf(Buffer
, "%.5s", String
);
219 ok_str(Buffer
, "hello");
221 EndSeh(STATUS_SUCCESS
);
224 Length
= sprintf(Buffer
, "%.4s", String
);
225 ok_str(Buffer
, "hell");
227 EndSeh(STATUS_SUCCESS
);
231 Length
= sprintf(Buffer
, "%.5s", String
);
232 ok_str(Buffer
, "hello");
235 EndSeh(STATUS_ACCESS_VIOLATION
);
237 EndSeh(STATUS_SUCCESS
);
241 Length
= sprintf(Buffer
, "%.6s", String
);
242 ok_str(Buffer
, "hello!");
245 EndSeh(STATUS_ACCESS_VIOLATION
);
247 EndSeh(STATUS_SUCCESS
);
251 Length
= sprintf(Buffer
, "%.*s", 5, String
);
253 ok_str(Buffer
, "*s");
256 ok_str(Buffer
, "hello");
259 EndSeh(STATUS_SUCCESS
);
262 Length
= sprintf(Buffer
, "%.*s", 6, String
);
264 ok_str(Buffer
, "*s");
267 ok_str(Buffer
, "hello!");
270 EndSeh(STATUS_SUCCESS
);
272 /* both field width and precision */
274 Length
= sprintf(Buffer
, "%8.5s", String
);
275 ok_str(Buffer
, " hello");
278 EndSeh(STATUS_ACCESS_VIOLATION
);
280 EndSeh(STATUS_SUCCESS
);
284 Length
= sprintf(Buffer
, "%-*.6s", -8, String
);
286 ok_str(Buffer
, "*.6s");
289 ok_str(Buffer
, "hello! ");
292 EndSeh(STATUS_SUCCESS
);
295 Length
= sprintf(Buffer
, "%*.*s", -8, 6, String
);
297 ok_str(Buffer
, "*.*s");
300 ok_str(Buffer
, "hello! ");
303 EndSeh(STATUS_SUCCESS
);