1 /* Unit test suite for the wsprintf functions 2 * 3 * Copyright 2002 Bill Medland 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Lesser General Public 7 * License as published by the Free Software Foundation; either 8 * version 2.1 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Lesser General Public License for more details. 14 * 15 * You should have received a copy of the GNU Lesser General Public 16 * License along with this library; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA 18 */ 19 20 #include <stdarg.h> 21 22 #include "wine/test.h" 23 #include "windef.h" 24 #include "winbase.h" 25 #include "winuser.h" 26 #include "winnls.h" 27 28 static const struct 29 { 30 const char *fmt; 31 ULONGLONG value; 32 const char *res; 33 } i64_formats[] = 34 { 35 { "%I64X", ((ULONGLONG)0x12345 << 32) | 0x67890a, "123450067890A" }, 36 { "%I32X", ((ULONGLONG)0x12345 << 32) | 0x67890a, "67890A" }, 37 { "%I64d", (ULONGLONG)543210 * 1000000, "543210000000" }, 38 { "%I64X", (LONGLONG)-0x12345, "FFFFFFFFFFFEDCBB" }, 39 { "%I32x", (LONGLONG)-0x12345, "fffedcbb" }, 40 { "%I64u", (LONGLONG)-123, "18446744073709551493" }, 41 { "%Id", (LONGLONG)-12345, "-12345" }, 42 #ifdef _WIN64 43 { "%Ix", ((ULONGLONG)0x12345 << 32) | 0x67890a, "123450067890a" }, 44 { "%Ix", (LONGLONG)-0x12345, "fffffffffffedcbb" }, 45 { "%p", (LONGLONG)-0x12345, "FFFFFFFFFFFEDCBB" }, 46 #else 47 { "%Ix", ((ULONGLONG)0x12345 << 32) | 0x67890a, "67890a" }, 48 { "%Ix", (LONGLONG)-0x12345, "fffedcbb" }, 49 { "%p", (LONGLONG)-0x12345, "FFFEDCBB" }, 50 #endif 51 }; 52 53 static void wsprintfATest(void) 54 { 55 char buf[25]; 56 unsigned int i; 57 int rc; 58 59 rc=wsprintfA(buf, "%010ld", -1); 60 ok(rc == 10, "wsprintfA length failure: rc=%d error=%d\n",rc,GetLastError()); 61 ok((lstrcmpA(buf, "-000000001") == 0), 62 "wsprintfA zero padded negative value failure: buf=[%s]\n",buf); 63 rc = wsprintfA(buf, "%I64X", (ULONGLONG)0); 64 if (rc == 4 && !lstrcmpA(buf, "I64X")) 65 { 66 win_skip( "I64 formats not supported\n" ); 67 return; 68 } 69 for (i = 0; i < ARRAY_SIZE(i64_formats); i++) 70 { 71 rc = wsprintfA(buf, i64_formats[i].fmt, i64_formats[i].value); 72 ok(rc == strlen(i64_formats[i].res), "%u: wsprintfA length failure: rc=%d\n", i, rc); 73 ok(!strcmp(buf, i64_formats[i].res), "%u: wrong result [%s]\n", i, buf); 74 } 75 } 76 77 static void wsprintfWTest(void) 78 { 79 static const WCHAR fmt_010ld[] = {'%','0','1','0','l','d','\0'}; 80 static const WCHAR res_010ld[] = {'-','0','0','0','0','0','0','0','0','1', '\0'}; 81 static const WCHAR fmt_I64x[] = {'%','I','6','4','x',0}; 82 WCHAR buf[25], fmt[25], res[25]; 83 unsigned int i; 84 int rc; 85 86 rc=wsprintfW(buf, fmt_010ld, -1); 87 if (rc==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED) 88 { 89 win_skip("wsprintfW is not implemented\n"); 90 return; 91 } 92 ok(rc == 10, "wsPrintfW length failure: rc=%d error=%d\n",rc,GetLastError()); 93 ok((lstrcmpW(buf, res_010ld) == 0), 94 "wsprintfW zero padded negative value failure\n"); 95 rc = wsprintfW(buf, fmt_I64x, (ULONGLONG)0 ); 96 if (rc == 4 && !lstrcmpW(buf, fmt_I64x + 1)) 97 { 98 win_skip( "I64 formats not supported\n" ); 99 return; 100 } 101 for (i = 0; i < ARRAY_SIZE(i64_formats); i++) 102 { 103 MultiByteToWideChar( CP_ACP, 0, i64_formats[i].fmt, -1, fmt, ARRAY_SIZE(fmt)); 104 MultiByteToWideChar( CP_ACP, 0, i64_formats[i].res, -1, res, ARRAY_SIZE(res)); 105 rc = wsprintfW(buf, fmt, i64_formats[i].value); 106 ok(rc == lstrlenW(res), "%u: wsprintfW length failure: rc=%d\n", i, rc); 107 ok(!lstrcmpW(buf, res), "%u: wrong result [%s]\n", i, wine_dbgstr_w(buf)); 108 } 109 } 110 111 /* Test if the CharUpper / CharLower functions return true 16 bit results, 112 if the input is a 16 bit input value. */ 113 114 static void CharUpperTest(void) 115 { 116 INT_PTR i, out; 117 BOOL failed = FALSE; 118 119 for (i=0;i<256;i++) 120 { 121 out = (INT_PTR)CharUpperA((LPSTR)i); 122 if ((out >> 16) != 0) 123 { 124 failed = TRUE; 125 break; 126 } 127 } 128 ok(!failed,"CharUpper failed - 16bit input (0x%0lx) returned 32bit result (0x%0lx)\n",i,out); 129 } 130 131 static void CharLowerTest(void) 132 { 133 INT_PTR i, out; 134 BOOL failed = FALSE; 135 136 for (i=0;i<256;i++) 137 { 138 out = (INT_PTR)CharLowerA((LPSTR)i); 139 if ((out >> 16) != 0) 140 { 141 failed = TRUE; 142 break; 143 } 144 } 145 ok(!failed,"CharLower failed - 16bit input (0x%0lx) returned 32bit result (0x%0lx)\n",i,out); 146 } 147 148 149 START_TEST(wsprintf) 150 { 151 wsprintfATest(); 152 wsprintfWTest(); 153 CharUpperTest(); 154 CharLowerTest(); 155 } 156