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, 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 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