d3drm: Handle texture associated with the material when loading a mesh.
[wine] / dlls / kernel32 / tests / version.c
1 /*
2  * Unit test suite for version functions
3  *
4  * Copyright 2006 Robert Shearman
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with this library; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19  */
20
21 /* Needed for PRODUCT_* defines and GetProductInfo() */
22 #define _WIN32_WINNT 0x0600
23
24 #include <assert.h>
25
26 #include "wine/test.h"
27 #include "winbase.h"
28
29 static BOOL (WINAPI * pGetProductInfo)(DWORD, DWORD, DWORD, DWORD, DWORD *);
30 static BOOL (WINAPI * pVerifyVersionInfoA)(LPOSVERSIONINFOEXA, DWORD, DWORDLONG);
31 static ULONGLONG (WINAPI * pVerSetConditionMask)(ULONGLONG, DWORD, BYTE);
32
33 #define KERNEL32_GET_PROC(func)                                     \
34     p##func = (void *)GetProcAddress(hKernel32, #func);
35
36 static void init_function_pointers(void)
37 {
38     HMODULE hKernel32;
39
40     hKernel32 = GetModuleHandleA("kernel32.dll");
41
42     KERNEL32_GET_PROC(GetProductInfo);
43     KERNEL32_GET_PROC(VerifyVersionInfoA);
44     KERNEL32_GET_PROC(VerSetConditionMask);
45 }
46
47 static void test_GetProductInfo(void)
48 {
49     DWORD product;
50     DWORD res;
51     DWORD table[] = {9,8,7,6,
52                      7,0,0,0,
53                      6,2,0,0,
54                      6,1,2,0,
55                      6,1,1,0,
56                      6,1,0,2,
57                      6,1,0,0,
58                      6,0,3,0,
59                      6,0,2,0,
60                      6,0,1,5,
61                      6,0,1,0,
62                      6,0,0,0,
63                      5,3,0,0,
64                      5,2,0,0,
65                      5,1,0,0,
66                      5,0,0,0,
67                      0};
68
69     DWORD *entry = table;
70
71     if (!pGetProductInfo)
72     {
73         /* Not present before Vista */
74         win_skip("GetProductInfo() not available\n");
75         return;
76     }
77
78     while (*entry)
79     {
80         /* SetLastError() / GetLastError(): value is untouched */
81         product = 0xdeadbeef;
82         SetLastError(0xdeadbeef);
83         res = pGetProductInfo(entry[0], entry[1], entry[2], entry[3], &product);
84
85         if (entry[0] >= 6)
86             ok(res && (product > PRODUCT_UNDEFINED) && (product <= PRODUCT_EMBEDDED) && (GetLastError() == 0xdeadbeef),
87                "got %d and 0x%x with 0x%x (expected TRUE and a valid PRODUCT_* value  with LastError untouched)\n",
88                res, product, GetLastError());
89         else
90             ok(!res && !product && (GetLastError() == 0xdeadbeef),
91                "got %d and 0x%x with 0x%x (expected FALSE and PRODUCT_UNDEFINED with LastError untouched)\n",
92                res, product, GetLastError());
93
94         entry+= 4;
95     }
96
97     /* NULL pointer is not a problem */
98     SetLastError(0xdeadbeef);
99     res = pGetProductInfo(6, 1, 0, 0, NULL);
100     ok( (!res) && (GetLastError() == 0xdeadbeef),
101         "got %d with 0x%x (expected FALSE with LastError untouched\n", res, GetLastError());
102 }
103
104 static void test_GetVersionEx(void)
105 {
106     OSVERSIONINFOA infoA;
107     OSVERSIONINFOEXA infoExA;
108     BOOL ret;
109
110     if (0)
111     {
112         /* Silently crashes on XP */
113         GetVersionExA(NULL);
114     }
115
116     SetLastError(0xdeadbeef);
117     memset(&infoA,0,sizeof infoA);
118     ret = GetVersionExA(&infoA);
119     ok(!ret, "Expected GetVersionExA to fail\n");
120     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
121         GetLastError() == 0xdeadbeef /* Win9x */,
122         "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
123         GetLastError());
124
125     SetLastError(0xdeadbeef);
126     infoA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA) / 2;
127     ret = GetVersionExA(&infoA);
128     ok(!ret, "Expected GetVersionExA to fail\n");
129     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
130         GetLastError() == 0xdeadbeef /* Win9x */,
131         "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
132         GetLastError());
133
134     SetLastError(0xdeadbeef);
135     infoA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA) * 2;
136     ret = GetVersionExA(&infoA);
137     ok(!ret, "Expected GetVersionExA to fail\n");
138     ok(GetLastError() == ERROR_INSUFFICIENT_BUFFER ||
139         GetLastError() == 0xdeadbeef /* Win9x */,
140         "Expected ERROR_INSUFFICIENT_BUFFER or 0xdeadbeef (Win9x), got %d\n",
141         GetLastError());
142
143     SetLastError(0xdeadbeef);
144     infoA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
145     ret = GetVersionExA(&infoA);
146     ok(ret, "Expected GetVersionExA to succeed\n");
147     ok(GetLastError() == 0xdeadbeef,
148         "Expected 0xdeadbeef, got %d\n", GetLastError());
149
150     SetLastError(0xdeadbeef);
151     infoExA.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEXA);
152     ret = GetVersionExA((OSVERSIONINFOA *)&infoExA);
153     ok(ret ||
154        broken(ret == 0), /* win95 */
155        "Expected GetVersionExA to succeed\n");
156     ok(GetLastError() == 0xdeadbeef,
157         "Expected 0xdeadbeef, got %d\n", GetLastError());
158 }
159
160 static void test_VerifyVersionInfo(void)
161 {
162     OSVERSIONINFOEX info;
163     BOOL ret;
164     DWORD servicepack, error;
165
166     if(!pVerifyVersionInfoA || !pVerSetConditionMask)
167     {
168         win_skip("Needed functions not available\n");
169         return;
170     }
171
172     /* Before we start doing some tests we should check what the version of
173      * the ServicePack is. Tests on a box with no ServicePack will fail otherwise.
174      */
175     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
176     GetVersionExA((OSVERSIONINFO *)&info);
177     servicepack = info.wServicePackMajor;
178     memset(&info, 0, sizeof(info));
179
180     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION,
181         pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL));
182     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
183
184     SetLastError(0xdeadbeef);
185     ret = pVerifyVersionInfoA(&info, VER_BUILDNUMBER | VER_MAJORVERSION |
186         VER_MINORVERSION/* | VER_PLATFORMID | VER_SERVICEPACKMAJOR |
187         VER_SERVICEPACKMINOR | VER_SUITENAME | VER_PRODUCT_TYPE */,
188         pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL));
189     error = GetLastError();
190     ok(!ret, "VerifyVersionInfoA succeeded\n");
191     ok(error == ERROR_OLD_WIN_VERSION,
192        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
193
194     /* tests special handling of VER_SUITENAME */
195
196     ret = pVerifyVersionInfoA(&info, VER_SUITENAME,
197         pVerSetConditionMask(0, VER_SUITENAME, VER_AND));
198     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
199
200     ret = pVerifyVersionInfoA(&info, VER_SUITENAME,
201         pVerSetConditionMask(0, VER_SUITENAME, VER_OR));
202     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
203
204     /* test handling of version numbers */
205     
206     /* v3.10 is always less than v4.x even
207      * if the minor version is tested */
208     info.dwMajorVersion = 3;
209     info.dwMinorVersion = 10;
210     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
211         pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL),
212             VER_MAJORVERSION, VER_GREATER_EQUAL));
213     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
214
215     info.dwMinorVersion = 0;
216     info.wServicePackMajor = 10;
217     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
218         pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL),
219             VER_MAJORVERSION, VER_GREATER_EQUAL));
220     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
221
222     info.wServicePackMajor = 0;
223     info.wServicePackMinor = 10;
224     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
225         pVerSetConditionMask(pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL),
226             VER_MAJORVERSION, VER_GREATER_EQUAL));
227     ok(ret, "VerifyVersionInfoA failed with error %d\n", GetLastError());
228
229     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
230     GetVersionEx((OSVERSIONINFO *)&info);
231     info.wServicePackMinor++;
232     SetLastError(0xdeadbeef);
233     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
234         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
235     error = GetLastError();
236     ok(!ret, "VerifyVersionInfoA succeeded\n");
237     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some wink2 */,
238        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
239
240     if (servicepack == 0)
241     {
242         skip("There is no ServicePack on this system\n");
243     }
244     else
245     {
246         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
247         GetVersionEx((OSVERSIONINFO *)&info);
248         info.wServicePackMajor--;
249         ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
250             pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER));
251         ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
252
253         info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
254         GetVersionEx((OSVERSIONINFO *)&info);
255         info.wServicePackMajor--;
256         ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
257             pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
258         ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
259     }
260
261     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
262     GetVersionEx((OSVERSIONINFO *)&info);
263     info.wServicePackMajor++;
264     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
265         pVerSetConditionMask(0, VER_MINORVERSION, VER_LESS));
266     ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
267
268     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
269     GetVersionEx((OSVERSIONINFO *)&info);
270     info.wServicePackMajor++;
271     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
272         pVerSetConditionMask(0, VER_MINORVERSION, VER_LESS_EQUAL));
273     ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
274
275     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
276     GetVersionEx((OSVERSIONINFO *)&info);
277     info.wServicePackMajor--;
278     SetLastError(0xdeadbeef);
279     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
280         pVerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL));
281     error = GetLastError();
282     ok(!ret, "VerifyVersionInfoA succeeded\n");
283     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
284        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
285
286     /* test the failure hierarchy for the four version fields */
287
288     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
289     GetVersionEx((OSVERSIONINFO *)&info);
290     info.wServicePackMajor++;
291     SetLastError(0xdeadbeef);
292     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
293         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
294     error = GetLastError();
295     ok(!ret, "VerifyVersionInfoA succeeded\n");
296     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
297        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
298
299     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
300     GetVersionEx((OSVERSIONINFO *)&info);
301     info.dwMinorVersion++;
302     SetLastError(0xdeadbeef);
303     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
304         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
305     error = GetLastError();
306     ok(!ret, "VerifyVersionInfoA succeeded\n");
307     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
308        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
309
310     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
311     GetVersionEx((OSVERSIONINFO *)&info);
312     info.dwMajorVersion++;
313     SetLastError(0xdeadbeef);
314     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
315         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
316     error = GetLastError();
317     ok(!ret, "VerifyVersionInfoA succeeded\n");
318     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
319        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
320
321     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
322         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
323     ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
324
325     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
326     GetVersionEx((OSVERSIONINFO *)&info);
327     info.dwBuildNumber++;
328     SetLastError(0xdeadbeef);
329     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
330         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
331     error = GetLastError();
332     ok(!ret, "VerifyVersionInfoA succeeded\n");
333     ok(error == ERROR_OLD_WIN_VERSION || broken(error == ERROR_BAD_ARGUMENTS) /* some win2k */,
334        "VerifyVersionInfoA should have failed with ERROR_OLD_WIN_VERSION instead of %d\n", error);
335
336     ret = pVerifyVersionInfoA(&info, VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
337         pVerSetConditionMask(0, VER_MINORVERSION, VER_GREATER_EQUAL));
338     ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
339
340     /* test bad dwOSVersionInfoSize */
341     info.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
342     GetVersionEx((OSVERSIONINFO *)&info);
343     info.dwOSVersionInfoSize = 0;
344     ret = pVerifyVersionInfoA(&info, VER_MAJORVERSION | VER_MINORVERSION | VER_SERVICEPACKMAJOR | VER_SERVICEPACKMINOR,
345         pVerSetConditionMask(0, VER_MAJORVERSION, VER_GREATER_EQUAL));
346     ok(ret || broken(!ret) /* some win2k */, "VerifyVersionInfoA failed with error %d\n", GetLastError());
347 }
348
349 START_TEST(version)
350 {
351     init_function_pointers();
352
353     test_GetProductInfo();
354     test_GetVersionEx();
355     test_VerifyVersionInfo();
356 }