Reverse the order for deleting the items in resetcontent to correctly
[wine] / dlls / shlwapi / tests / ordinal.c
1 /* Unit test suite for SHLWAPI ordinal functions
2  *
3  * Copyright 2004 Jon Griffiths
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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19
20 #include <stdlib.h>
21 #include <stdio.h>
22
23 #include "wine/test.h"
24 #include "winbase.h"
25 #include "winerror.h"
26 #include "winuser.h"
27
28 /* Function ptrs for ordinal calls */
29 static HMODULE hShlwapi;
30 static int (WINAPI *pSHSearchMapInt)(const int*,const int*,int,int);
31 static HRESULT (WINAPI *pGetAcceptLanguagesA)(LPSTR,LPDWORD);
32
33 static HANDLE (WINAPI *pSHAllocShared)(LPCVOID,DWORD,DWORD);
34 static LPVOID (WINAPI *pSHLockShared)(HANDLE,DWORD);
35 static BOOL   (WINAPI *pSHUnlockShared)(LPVOID);
36 static BOOL   (WINAPI *pSHFreeShared)(HANDLE,DWORD);
37
38 static void test_GetAcceptLanguagesA(void)
39 {   HRESULT retval;
40     DWORD buffersize, buffersize2, exactsize;
41     char buffer[100];
42
43     if (!pGetAcceptLanguagesA)
44         return;
45
46     buffersize = sizeof(buffer);
47     memset(buffer, 0, sizeof(buffer));
48     SetLastError(ERROR_SUCCESS);
49     retval = pGetAcceptLanguagesA( buffer, &buffersize);
50     trace("GetAcceptLanguagesA: retval %08lx, size %08lx, buffer (%s),"
51         " last error %ld\n", retval, buffersize, buffer, GetLastError());
52     if(retval != S_OK) {
53         trace("GetAcceptLanguagesA: skipping tests\n");
54         return;
55     }
56     ok( (ERROR_NO_IMPERSONATION_TOKEN == GetLastError()) || 
57         (ERROR_CLASS_DOES_NOT_EXIST == GetLastError()) ||
58         (ERROR_PROC_NOT_FOUND == GetLastError()) ||
59         (ERROR_CALL_NOT_IMPLEMENTED == GetLastError()) ||
60         (ERROR_SUCCESS == GetLastError()), "last error set to %ld\n", GetLastError());
61     exactsize = strlen(buffer);
62
63     SetLastError(ERROR_SUCCESS);
64     retval = pGetAcceptLanguagesA( NULL, NULL);
65     ok(retval == E_FAIL,
66        "function result wrong: got %08lx; expected E_FAIL\n", retval);
67     ok(ERROR_SUCCESS == GetLastError(), "last error set to %ld\n", GetLastError());
68
69     buffersize = sizeof(buffer);
70     SetLastError(ERROR_SUCCESS);
71     retval = pGetAcceptLanguagesA( NULL, &buffersize);
72     ok(retval == E_FAIL,
73        "function result wrong: got %08lx; expected E_FAIL\n", retval);
74     ok(buffersize == sizeof(buffer),
75        "buffersize was changed (2nd parameter; not on Win2k)\n");
76     ok(ERROR_SUCCESS == GetLastError(), "last error set to %ld\n", GetLastError());
77
78     SetLastError(ERROR_SUCCESS);
79     retval = pGetAcceptLanguagesA( buffer, NULL);
80     ok(retval == E_FAIL,
81        "function result wrong: got %08lx; expected E_FAIL\n", retval);
82     ok(ERROR_SUCCESS == GetLastError(), "last error set to %ld\n", GetLastError());
83
84     buffersize = 0;
85     memset(buffer, 0, sizeof(buffer));
86     SetLastError(ERROR_SUCCESS);
87     retval = pGetAcceptLanguagesA( buffer, &buffersize);
88     ok(retval == E_FAIL,
89        "function result wrong: got %08lx; expected E_FAIL\n", retval);
90     ok(buffersize == 0,
91        "buffersize wrong(changed) got %08lx; expected 0 (2nd parameter; not on Win2k)\n", buffersize);
92     ok(ERROR_SUCCESS == GetLastError(), "last error set to %ld\n", GetLastError());
93
94     buffersize = buffersize2 = 1;
95     memset(buffer, 0, sizeof(buffer));
96     SetLastError(ERROR_SUCCESS);
97     retval = pGetAcceptLanguagesA( buffer, &buffersize);
98     switch(retval) {
99         case 0L:
100             if(buffersize == exactsize) {
101             ok( (ERROR_SUCCESS == GetLastError()) || (ERROR_CALL_NOT_IMPLEMENTED == GetLastError()) ||
102                 (ERROR_PROC_NOT_FOUND == GetLastError()) || (ERROR_NO_IMPERSONATION_TOKEN == GetLastError()),
103                 "last error wrong: got %08lx; expected ERROR_SUCCESS(NT4)/ERROR_CALL_NOT_IMPLEMENTED(98/ME)/"
104                 "ERROR_PROC_NOT_FOUND(NT4)/ERROR_NO_IMPERSONATION_TOKEN(XP)\n", GetLastError());
105             ok(exactsize == strlen(buffer),
106                  "buffer content (length) wrong: got %08x, expected %08lx \n", strlen(buffer), exactsize);
107             } else if((buffersize +1) == buffersize2) {
108                 ok(ERROR_SUCCESS == GetLastError(),
109                     "last error wrong: got %08lx; expected ERROR_SUCCESS\n", GetLastError());
110                 ok(buffersize == strlen(buffer),
111                     "buffer content (length) wrong: got %08x, expected %08lx \n", strlen(buffer), buffersize);
112             } else
113                 ok( 0, "retval %08lx, size %08lx, buffer (%s), last error %ld\n",
114                     retval, buffersize, buffer, GetLastError());
115             break;
116         case E_INVALIDARG:
117             ok(buffersize == 0,
118                "buffersize wrong: got %08lx, expected 0 (2nd parameter;Win2k)\n", buffersize);
119             ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(),
120                "last error wrong: got %08lx; expected ERROR_INSUFFICIENT_BUFFER\n", GetLastError());
121             ok(buffersize2 == strlen(buffer),
122                "buffer content (length) wrong: got %08x, expected %08lx \n", strlen(buffer), buffersize2);
123             break;
124         default:
125             ok( 0, "retval %08lx, size %08lx, buffer (%s), last error %ld\n",
126                 retval, buffersize, buffer, GetLastError());
127             break;
128     }
129
130     buffersize = buffersize2 = exactsize;
131     memset(buffer, 0, sizeof(buffer));
132     SetLastError(ERROR_SUCCESS);
133     retval = pGetAcceptLanguagesA( buffer, &buffersize);
134     switch(retval) {
135         case 0L:
136             ok(ERROR_SUCCESS == GetLastError(),
137                  "last error wrong: got %08lx; expected ERROR_SUCCESS\n", GetLastError());
138             if((buffersize == exactsize) /* XP */ ||
139                ((buffersize +1)== exactsize) /* 98 */)
140                 ok(buffersize == strlen(buffer),
141                     "buffer content (length) wrong: got %08x, expected %08lx \n", strlen(buffer), buffersize);
142             else
143                 ok( 0, "retval %08lx, size %08lx, buffer (%s), last error %ld\n",
144                     retval, buffersize, buffer, GetLastError());
145             break;
146         case E_INVALIDARG:
147             ok(buffersize == 0,
148                "buffersize wrong: got %08lx, expected 0 (2nd parameter;Win2k)\n", buffersize);
149             ok(ERROR_INSUFFICIENT_BUFFER == GetLastError(),
150                "last error wrong: got %08lx; expected ERROR_INSUFFICIENT_BUFFER\n", GetLastError());
151             ok(buffersize2 == strlen(buffer),
152                "buffer content (length) wrong: got %08x, expected %08lx \n", strlen(buffer), buffersize2);
153             break;
154         default:
155             ok( 0, "retval %08lx, size %08lx, buffer (%s), last error %ld\n",
156                 retval, buffersize, buffer, GetLastError());
157             break;
158     }
159 }
160
161 static void test_SHSearchMapInt(void)
162 {
163   int keys[8], values[8];
164   int i = 0;
165
166   if (!pSHSearchMapInt)
167     return;
168
169   memset(keys, 0, sizeof(keys));
170   memset(values, 0, sizeof(values));
171   keys[0] = 99; values[0] = 101;
172
173   /* NULL key/value lists crash native, so skip testing them */
174
175   /* 1 element */
176   i = pSHSearchMapInt(keys, values, 1, keys[0]);
177   ok(i == values[0], "Len 1, expected %d, got %d\n", values[0], i);
178
179   /* Key doesn't exist */
180   i = pSHSearchMapInt(keys, values, 1, 100);
181   ok(i == -1, "Len 1 - bad key, expected -1, got %d\n", i);
182
183   /* Len = 0 => not found */
184   i = pSHSearchMapInt(keys, values, 0, keys[0]);
185   ok(i == -1, "Len 1 - passed len 0, expected -1, got %d\n", i);
186
187   /* 2 elements, len = 1 */
188   keys[1] = 98; values[1] = 102;
189   i = pSHSearchMapInt(keys, values, 1, keys[1]);
190   ok(i == -1, "Len 1 - array len 2, expected -1, got %d\n", i);
191
192   /* 2 elements, len = 2 */
193   i = pSHSearchMapInt(keys, values, 2, keys[1]);
194   ok(i == values[1], "Len 2, expected %d, got %d\n", values[1], i);
195
196   /* Searches forward */
197   keys[2] = 99; values[2] = 103;
198   i = pSHSearchMapInt(keys, values, 3, keys[0]);
199   ok(i == values[0], "Len 3, expected %d, got %d\n", values[0], i);
200 }
201
202 static void test_alloc_shared()
203 {
204     DWORD procid;
205     HANDLE hmem;
206     int val;
207     int* p;
208     BOOL ret;
209
210     procid=GetCurrentProcessId();
211     hmem=pSHAllocShared(NULL,10,procid);
212     ok(hmem!=NULL,"SHAllocShared(NULL...) failed: %ld\n", GetLastError());
213     ret = pSHFreeShared(hmem, procid);
214     ok( ret, "SHFreeShared failed: %ld\n", GetLastError());
215
216     val=0x12345678;
217     hmem=pSHAllocShared(&val,4,procid);
218     ok(hmem!=NULL,"SHAllocShared(NULL...) failed: %ld\n", GetLastError());
219
220     p=(int*)pSHLockShared(hmem,procid);
221     ok(p!=NULL,"SHLockShared failed: %ld\n", GetLastError());
222     if (p!=NULL)
223         ok(*p==val,"Wrong value in shared memory: %d instead of %d\n",*p,val);
224     ret = pSHUnlockShared(p);
225     ok( ret, "SHUnlockShared failed: %ld\n", GetLastError());
226
227     ret = pSHFreeShared(hmem, procid);
228     ok( ret, "SHFreeShared failed: %ld\n", GetLastError());
229 }
230
231 START_TEST(ordinal)
232 {
233   hShlwapi = LoadLibraryA("shlwapi.dll");
234   ok(hShlwapi != 0, "LoadLibraryA failed\n");
235   if (!hShlwapi)
236     return;
237
238   pGetAcceptLanguagesA = (void*)GetProcAddress(hShlwapi, (LPSTR)14);
239   pSHSearchMapInt = (void*)GetProcAddress(hShlwapi, (LPSTR)198);
240   pSHAllocShared=(void*)GetProcAddress(hShlwapi,(char*)7);
241   pSHLockShared=(void*)GetProcAddress(hShlwapi,(char*)8);
242   pSHUnlockShared=(void*)GetProcAddress(hShlwapi,(char*)9);
243   pSHFreeShared=(void*)GetProcAddress(hShlwapi,(char*)10);
244
245   test_GetAcceptLanguagesA();
246   test_SHSearchMapInt();
247   test_alloc_shared();
248   FreeLibrary(hShlwapi);
249 }