1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for _vsnprintf
5 */
6
7 #include <apitest.h>
8
9 #define WIN32_NO_STATUS
10 #include <stdio.h>
11 #include <tchar.h>
12 #include <pseh/pseh2.h>
13 #include <ndk/mmfuncs.h>
14 #include <ndk/rtlfuncs.h>
15
call_varargs(char * buf,size_t buf_size,int expected_ret,LPCSTR formatString,...)16 static void call_varargs(char* buf, size_t buf_size, int expected_ret, LPCSTR formatString, ...)
17 {
18 va_list args;
19 int ret;
20 /* Test the basic functionality */
21 va_start(args, formatString);
22 ret = _vsnprintf(buf, buf_size, formatString, args);
23 va_end(args);
24 ok(expected_ret == ret, "Test failed: expected %i, got %i.\n", expected_ret, ret);
25 }
26
START_TEST(_vsnprintf)27 START_TEST(_vsnprintf)
28 {
29 char buffer[255];
30
31 /* Here you can mix wide and ANSI strings */
32 call_varargs(buffer, 255, 12, "%S world!", L"hello");
33 call_varargs(buffer, 255, 12, "%s world!", "hello");
34 call_varargs(buffer, 255, 11, "%u cookies", 100);
35
36 StartSeh()
37 #if defined(TEST_CRTDLL)||defined(TEST_USER32)
38 call_varargs(NULL, INT_MAX, -1, "%s it really work?", "does");
39 #else
40 call_varargs(NULL, INT_MAX, 20, "%s it really work?", "does");
41 #endif
42
43 #if defined(TEST_CRTDLL)||defined(TEST_USER32)
44 EndSeh(STATUS_ACCESS_VIOLATION);
45 #else
46 EndSeh(STATUS_SUCCESS);
47 #endif
48
49 #if defined(TEST_USER32) /* NTDLL doesn't use/set errno */
50 ok(errno == EINVAL, "Expected EINVAL, got %u\n", errno);
51 #else
52 ok(errno == 0, "Expected 0, got %u\n", errno);
53 #endif
54
55 /* This one is no better */
56 StartSeh()
57 #if defined(TEST_CRTDLL)||defined(TEST_USER32)
58 call_varargs(NULL, 0, -1, "%s it really work?", "does");
59 #else
60 call_varargs(NULL, 0, 20, "%s it really work?", "does");
61 #endif
62
63 #if defined(TEST_USER32)
64 EndSeh(STATUS_ACCESS_VIOLATION);
65 #else
66 EndSeh(STATUS_SUCCESS);
67 #endif
68
69 #if defined(TEST_USER32) /* NTDLL doesn't use/set errno */
70 ok(errno == EINVAL, "Expected EINVAL, got %u\n", errno);
71 #else
72 ok(errno == 0, "Expected 0, got %u\n", errno);
73 #endif
74
75 /* One more NULL checks */
76 StartSeh()
77 call_varargs(buffer, 255, -1, NULL);
78 EndSeh(STATUS_ACCESS_VIOLATION);
79
80 #if defined(TEST_USER32) /* NTDLL doesn't use/set errno */
81 ok(errno == EINVAL, "Expected EINVAL, got %u\n", errno);
82 #else
83 ok(errno == 0, "Expected 0, got %u\n", errno);
84 #endif
85 }
86