1 /* 2 * PROJECT: ReactOS API tests 3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) 4 * PURPOSE: Tests for _mbsncmp 5 * COPYRIGHT: Copyright 2024 Thomas Faber (thomas.faber@reactos.org) 6 */ 7 8 #include <apitest.h> 9 #include <mbstring.h> 10 #define WIN32_NO_STATUS 11 #include <pseh/pseh2.h> 12 #include <ndk/mmfuncs.h> 13 14 ULONG g_WinVersion; 15 16 /* 17 * cmp functions can either return 1/-1 or the actual difference between the 18 * first two differing characters. 19 * On Win2003, both crtdll and msvcrt always return 1/-1. 20 * On Win10, msvcrt returns the diff, crtdll returns 1/-1. 21 */ 22 #ifdef TEST_CRTDLL 23 #define RETURN_DIFF 0 24 #else 25 #define RETURN_DIFF (g_WinVersion >= _WIN32_WINNT_VISTA) 26 #endif 27 28 #define DIFF_RETURN(sign, absolute) (sign (RETURN_DIFF ? absolute : 1)) 29 30 START_TEST(_mbsncmp) 31 { 32 int ret; 33 34 ULONG Version = GetVersion(); 35 g_WinVersion = (Version & 0xFF) << 8 | (Version & 0xFF00) >> 8; 36 37 /* Zero length always returns true */ 38 ret = _mbsncmp(NULL, NULL, 0); 39 ok(ret == 0, "ret = %d\n", ret); 40 41 ret = _mbsncmp((const unsigned char *)"a", (const unsigned char *)"c", 0); 42 ok(ret == 0, "ret = %d\n", ret); 43 44 /* No null checks - length 1 crashes */ 45 StartSeh() 46 (void)_mbsncmp((const unsigned char *)"a", NULL, 1); 47 EndSeh(STATUS_ACCESS_VIOLATION); 48 49 StartSeh() 50 (void)_mbsncmp(NULL, (const unsigned char *)"c", 1); 51 EndSeh(STATUS_ACCESS_VIOLATION); 52 53 /* Strings longer than or equal to length */ 54 ret = _mbsncmp((const unsigned char *)"a", (const unsigned char *)"c", 1); 55 ok(ret == DIFF_RETURN(-, 2), "ret = %d\n", ret); 56 57 ret = _mbsncmp((const unsigned char *)"a", (const unsigned char *)"a", 1); 58 ok(ret == 0, "ret = %d\n", ret); 59 60 ret = _mbsncmp((const unsigned char *)"ab", (const unsigned char *)"aB", 1); 61 ok(ret == 0, "ret = %d\n", ret); 62 63 ret = _mbsncmp((const unsigned char *)"aa", (const unsigned char *)"ac", 2); 64 ok(ret == DIFF_RETURN(-, 2), "ret = %d\n", ret); 65 66 /* Length longer than one of the strings */ 67 ret = _mbsncmp((const unsigned char *)"a", (const unsigned char *)"ac", 2); 68 ok(ret == DIFF_RETURN(-, 'c'), "ret = %d\n", ret); 69 70 ret = _mbsncmp((const unsigned char *)"aa", (const unsigned char *)"a", 2); 71 ok(ret == DIFF_RETURN(+, 'a'), "ret = %d\n", ret); 72 73 ret = _mbsncmp((const unsigned char *)"ab", (const unsigned char *)"ab", 100); 74 ok(ret == 0, "ret = %d\n", ret); 75 } 76