[MSVCRT_CRT_APITEST]
[reactos.git] / rostests / apitests / crt / _vsnprintf.c
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
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, 255, formatString, args);
23 ok(expected_ret == ret, "Test failed: expected %i, got %i.\n", expected_ret, ret);
24 }
25
26 START_TEST(_vsnprintf)
27 {
28 char buffer[255];
29
30 /* Here you can mix wide and ANSI strings */
31 call_varargs(buffer, 255, 12, "%S world!", L"hello");
32 call_varargs(buffer, 255, 12, "%s world!", "hello");
33 call_varargs(buffer, 255, 11, "%u cookies", 100);
34 /* This is how WINE implements _vcsprintf, and they are obviously wrong */
35 StartSeh()
36 call_varargs(NULL, INT_MAX, -1, "%s it really work?", "does");
37 #if defined(TEST_CRTDLL) || defined(TEST_USER32)
38 EndSeh(STATUS_ACCESS_VIOLATION);
39 #else
40 EndSeh(STATUS_SUCCESS);
41 #endif
42 #if defined(TEST_MSVCRT) /* NTDLL doesn't use/set errno */
43 ok(errno == EINVAL, "Expected EINVAL, got %u\n", errno);
44 #endif
45 /* This one is no better */
46 StartSeh()
47 call_varargs(NULL, 0, -1, "%s it really work?", "does");
48 #if defined(TEST_CRTDLL) || defined(TEST_USER32)
49 EndSeh(STATUS_ACCESS_VIOLATION);
50 #else
51 EndSeh(STATUS_SUCCESS);
52 #endif
53 #if defined(TEST_MSVCRT) /* NTDLL doesn't use/set errno */
54 ok(errno == EINVAL, "Expected EINVAL, got %u\n", errno);
55 #endif
56 /* One more NULL checks */
57 StartSeh()
58 call_varargs(buffer, 255, -1, NULL);
59 #if defined(TEST_CRTDLL)
60 EndSeh(STATUS_ACCESS_VIOLATION);
61 #else
62 EndSeh(STATUS_SUCCESS);
63 #endif
64 #if defined(TEST_MSVCRT) /* NTDLL doesn't use/set errno */
65 ok(errno == EINVAL, "Expected EINVAL, got %u\n", errno);
66 #endif
67 }