source: trunk/src/kernel32/test/Resources.cpp

Last change on this file was 21494, checked in by dmik, 15 years ago

Fixed broken build after r21492 by sorting out a huuuuge wagon of duplicates, wrong include order and other dirty mess.

File size: 17.3 KB
Line 
1/* $Id: Resources.cpp,v 1.1 1999-11-28 23:10:06 bird Exp $
2 *
3 * Kernel32 Resource functions tests.
4 *
5 * Copyright (c) 1999 knut st. osmundsen
6 *
7 * Project Odin Software License can be found in LICENSE.TXT
8 *
9 */
10
11/*******************************************************************************
12* Defined Constants And Macros *
13*******************************************************************************/
14#ifdef __WATCOMC__
15 #define ENUMRESNAMEPROCW ENUMRESNAMEPROC
16 #define ENUMRESNAMEPROCA ENUMRESNAMEPROC
17 #define RT_MENUW ((LPCWSTR)RT_MENU)
18 #define RT_MENUA ((LPCTSTR)RT_MENU)
19 #define RT_DIALOGW ((LPCWSTR)RT_DIALOG)
20 #define RT_DIALOGA ((LPCTSTR)RT_DIALOG)
21#endif
22
23#define MY_LPARAM 0x12345678
24
25/*******************************************************************************
26* Header Files *
27*******************************************************************************/
28#ifndef __WATCOMC__
29 #include <odin.h>
30 #include <odinwrap.h>
31#endif
32
33#include <windows.h>
34#include "kernel32test.h"
35#include "rsrc.h"
36#include "testlib.h"
37
38
39
40/*******************************************************************************
41* Internal Functions *
42*******************************************************************************/
43static void PosEnumResourceNamesW1(void);
44static void PosEnumResourceNamesW2(void);
45static void PosEnumResourceNamesW3(void);
46static CALLBACK PosEnumNamesCallbackW1(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam);
47static CALLBACK PosEnumNamesCallbackW2(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam);
48static CALLBACK PosEnumNamesCallbackW3(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam);
49
50static void NegEnumResourceNamesW1(void);
51static void NegEnumResourceNamesW2(void);
52static void NegEnumResourceNamesW3(void);
53static void NegEnumResourceNamesW4(void);
54static void NegEnumResourceNamesW5(void);
55static CALLBACK NegEnumNamesCallbackW1(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam);
56static CALLBACK NegEnumNamesCallbackW2(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam);
57static CALLBACK NegEnumNamesCallbackW5(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam);
58
59static void PosEnumResourceNamesA1(void);
60static void PosEnumResourceNamesA2(void);
61static void PosEnumResourceNamesA3(void);
62static CALLBACK PosEnumNamesCallbackA1(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam);
63static CALLBACK PosEnumNamesCallbackA2(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam);
64static CALLBACK PosEnumNamesCallbackA3(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam);
65
66static void NegEnumResourceNamesA1(void);
67static void NegEnumResourceNamesA2(void);
68static void NegEnumResourceNamesA3(void);
69static void NegEnumResourceNamesA4(void);
70static void NegEnumResourceNamesA5(void);
71static CALLBACK NegEnumNamesCallbackA1(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam);
72static CALLBACK NegEnumNamesCallbackA2(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam);
73static CALLBACK NegEnumNamesCallbackA5(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam);
74
75
76/*******************************************************************************
77* Global Variables *
78*******************************************************************************/
79static TESTENTRY aRsrcTests[] =
80{ /* pfnTest pszName */
81 {PosEnumResourceNamesW1, "EnumResourceNamesW1+ ", 0, 0},
82 {PosEnumResourceNamesW2, "EnumResourceNamesW2+ false callback return", 0, 0},
83 {PosEnumResourceNamesW3, "EnumResourceNamesW3+ callback return > TRUE", 0, 0},
84 {NegEnumResourceNamesW1, "EnumResourceNamesW1- hmod", 0, 0},
85 {NegEnumResourceNamesW2, "EnumResourceNamesW2- type", 0, 0},
86 {NegEnumResourceNamesW3, "EnumResourceNamesW3- type pointer", 0, 0},
87 {NegEnumResourceNamesW4, "EnumResourceNamesW4- callback", 0, 0},
88 {NegEnumResourceNamesW5, "EnumResourceNamesW5- string standard type", 0, 0},
89
90 {PosEnumResourceNamesA1, "EnumResourceNamesA1+ ", 0, 0},
91 {PosEnumResourceNamesA2, "EnumResourceNamesA2+ false callback return", 0, 0},
92 {PosEnumResourceNamesA3, "EnumResourceNamesA3+ callback return > TRUE", 0, 0},
93 {NegEnumResourceNamesA1, "EnumResourceNamesA1- hmod", 0, 0},
94 {NegEnumResourceNamesA2, "EnumResourceNamesA2- type", 0, 0},
95 {NegEnumResourceNamesA3, "EnumResourceNamesA3- type pointer", 0, 0},
96 {NegEnumResourceNamesA4, "EnumResourceNamesA4- callback", 0, 0},
97 {NegEnumResourceNamesA5, "EnumResourceNamesA5- string standard type", 0, 0},
98
99 {NULL, NULL, 0, 0} /* terminator entry */
100};
101
102static TESTTABLE RsrcTestTable =
103{
104 "ResourceTests",
105 0,
106 0,
107 &aRsrcTests[0],
108 -1,
109 -1,
110 -1,
111};
112
113static int iPosW1 = 0;
114static int iPosW2 = 0;
115static int iPosA1 = 0;
116static int iPosA2 = 0;
117
118
119
120/**
121 * Tests resource functions.
122 * @returns
123 * @status stub
124 * @author knut st. osmundsen
125 * @remark
126 */
127void TestResources(void)
128{
129 TstProcessTestTable(&RsrcTestTable);
130}
131
132
133
134
135
136
137/*******************************************************************************
138* *
139* EnumResourceNamesW EnumResourceNamesW EnumResourceNamesW *
140* EnumResourceNamesW EnumResourceNamesW EnumResourceNamesW *
141* EnumResourceNamesW EnumResourceNamesW EnumResourceNamesW *
142* EnumResourceNamesW EnumResourceNamesW EnumResourceNamesW *
143* EnumResourceNamesW EnumResourceNamesW EnumResourceNamesW *
144* *
145*******************************************************************************/
146
147/**
148 * Positive - This function tests the EnumResourceNamesW function.
149 */
150static void PosEnumResourceNamesW1(void)
151{
152 BOOL fRet;
153
154 SetLastError(NO_ERROR);
155
156 fRet = EnumResourceNamesW(0, RT_MENUW,
157 (ENUMRESNAMEPROCW)PosEnumNamesCallbackW1,
158 MY_LPARAM);
159 if (!fRet)
160 {
161 TstError(__FILE__, __LINE__, "failed with fRet=%d and LastError=%d\n", fRet, GetLastError());
162 }
163 TSTCHECKLASTERROR(NO_ERROR);
164 TSTCHECK1D(iPosW1 == 4, iPosW1);
165}
166static CALLBACK PosEnumNamesCallbackW1(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam)
167{
168 static LPCWSTR aiRes[] = {(LPCWSTR)IDM_1, (LPCWSTR)IDM_2, (LPCWSTR)IDM_3, (LPCWSTR)IDM_4};
169
170 TSTCHECK(hmod == 0);
171 TSTCHECK(lpszType == RT_MENUW);
172 TSTCHECK(lParam == MY_LPARAM);
173 TSTCHECK(aiRes[iPosW1] == lpszName);
174 iPosW1++;
175 return TRUE;
176}
177
178
179/**
180 * Positive - This function tests the EnumResourceNamesW, negative callback return.
181 */
182static void PosEnumResourceNamesW2(void)
183{
184 BOOL fRet;
185
186 SetLastError(NO_ERROR);
187
188 fRet = EnumResourceNamesW((HMODULE)0, RT_MENUW,
189 (ENUMRESNAMEPROCW)PosEnumNamesCallbackW2,
190 MY_LPARAM);
191 if (fRet)
192 TstError(__FILE__, __LINE__, "didn't fail, fRet=%d and LastError=%d\n", fRet, GetLastError());
193
194 TSTINFOLASTERROR();
195 TSTCHECKLASTERROR(NO_ERROR);
196 TSTCHECK1D(iPosW2 == 2, iPosW2);
197}
198static CALLBACK PosEnumNamesCallbackW2(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam)
199{
200 static LPCWSTR aiRes[] = {(LPCWSTR)IDM_1, (LPCWSTR)IDM_2, (LPCWSTR)IDM_3, (LPCWSTR)IDM_4};
201
202 TSTCHECK(hmod == (HMODULE)0);
203 TSTCHECK(lpszType == RT_MENUW);
204 TSTCHECK(lParam == MY_LPARAM);
205 TSTCHECK(aiRes[iPosW2] == lpszName);
206 iPosW2++;
207 return iPosW2 < 2 ? TRUE : FALSE;
208}
209
210
211/**
212 * Positive - This function tests EnumResourceNamesW return value
213 */
214static void PosEnumResourceNamesW3(void)
215{
216 BOOL fRet;
217
218 SetLastError(NO_ERROR);
219
220 fRet = EnumResourceNamesW((HMODULE)0, RT_MENUW,
221 (ENUMRESNAMEPROCW)PosEnumNamesCallbackW3,
222 MY_LPARAM);
223 if (fRet != 1)
224 TstError(__FILE__, __LINE__, "invalid return, fRet=%d and LastError=%d\n", fRet, GetLastError());
225
226 TSTCHECKLASTERROR(NO_ERROR);
227}
228static CALLBACK PosEnumNamesCallbackW3(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam)
229{
230
231 TSTCHECK(hmod == (HMODULE)0);
232 TSTCHECK(lpszType == RT_MENUW);
233 TSTCHECK(lParam == MY_LPARAM);
234 lpszName = lpszName;
235 return 0xBEEF0000;
236}
237
238
239/**
240 * Negative - invalid handle
241 */
242static void NegEnumResourceNamesW1(void)
243{
244 BOOL fRet;
245
246 SetLastError(NO_ERROR);
247
248 fRet = EnumResourceNamesW((HMODULE)0xBEEFBEEF, RT_MENUW,
249 (ENUMRESNAMEPROCW)NegEnumNamesCallbackW1,
250 MY_LPARAM);
251 if (fRet == TRUE)
252 TstError(__FILE__, __LINE__, "invalid return code, !FALSE");
253 TSTCHECKLASTERROR(ERROR_RESOURCE_DATA_NOT_FOUND);
254}
255static CALLBACK NegEnumNamesCallbackW1(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam)
256{
257 hmod = hmod; lpszType = lpszType; lpszName = lpszName; lParam = lParam;
258 return TRUE;
259}
260
261
262/*
263 * invalid resource type
264 */
265static void NegEnumResourceNamesW2(void)
266{
267 BOOL fRet;
268
269 SetLastError(NO_ERROR);
270
271 fRet = EnumResourceNamesW(0, RT_DIALOGW, /* no dialogs resources */
272 (ENUMRESNAMEPROCW)NegEnumNamesCallbackW2,
273 MY_LPARAM);
274 if (fRet == TRUE)
275 TstError(__FILE__, __LINE__, "invalid return code, !FALSE");
276 TSTCHECKLASTERROR(ERROR_RESOURCE_TYPE_NOT_FOUND);
277}
278static CALLBACK NegEnumNamesCallbackW2(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam)
279{
280 hmod = hmod; lpszType = lpszType; lpszName = lpszName; lParam = lParam;
281 return TRUE;
282}
283
284
285/*
286 * invalid lpszType pointer
287 */
288static void NegEnumResourceNamesW3(void)
289{
290 BOOL fRet;
291
292 SetLastError(NO_ERROR);
293
294 fRet = EnumResourceNamesW(0, (LPCWSTR)0x80000000,
295 (ENUMRESNAMEPROCW)0UL,
296 MY_LPARAM);
297 if (fRet == TRUE)
298 TstError(__FILE__, __LINE__, "invalid return code, !FALSE");
299
300 TSTCHECKLASTERROR(ERROR_INVALID_PARAMETER);
301}
302
303
304/*
305 * invalid callback
306 */
307static void NegEnumResourceNamesW4(void)
308{
309 BOOL fRet;
310
311 SetLastError(NO_ERROR);
312
313 fRet = EnumResourceNamesW(0, RT_MENUW,
314 (ENUMRESNAMEPROCW)0UL,
315 MY_LPARAM);
316 if (fRet == TRUE)
317 TstError(__FILE__, __LINE__, "invalid return code, !FALSE");
318
319 TSTCHECKLASTERROR(ERROR_NOACCESS);
320}
321
322
323/**
324 * Negative - This function tests EnumResourceNamesW String Type for standard resource type.
325 */
326static void NegEnumResourceNamesW5(void)
327{
328 BOOL fRet;
329 WCHAR szType[] = {'M', 'E', 'N', 'U', 0};
330
331 SetLastError(NO_ERROR);
332
333 fRet = EnumResourceNamesW((HMODULE)0, szType,
334 (ENUMRESNAMEPROCW)NegEnumNamesCallbackW5,
335 MY_LPARAM);
336 TSTCHECK1D(!fRet, fRet);
337 TSTCHECKLASTERROR(ERROR_RESOURCE_TYPE_NOT_FOUND);
338}
339static CALLBACK NegEnumNamesCallbackW5(HMODULE hmod, LPCWSTR lpszType, LPCWSTR lpszName, LONG lParam)
340{
341
342 TSTCHECK(hmod == (HMODULE)0);
343 TSTCHECK(lpszType == RT_MENUW);
344 TSTCHECK(lParam == MY_LPARAM);
345 lpszName = lpszName;
346 return TRUE;
347}
348
349
350
351
352
353
354
355/*******************************************************************************
356* *
357* EnumResourceNamesA EnumResourceNamesA EnumResourceNamesA *
358* EnumResourceNamesA EnumResourceNamesA EnumResourceNamesA *
359* EnumResourceNamesA EnumResourceNamesA EnumResourceNamesA *
360* EnumResourceNamesA EnumResourceNamesA EnumResourceNamesA *
361* EnumResourceNamesA EnumResourceNamesA EnumResourceNamesA *
362* *
363*******************************************************************************/
364
365/**
366 * Positive - This function tests the EnumResourceNamesA function.
367 */
368static void PosEnumResourceNamesA1(void)
369{
370 BOOL fRet;
371
372 SetLastError(NO_ERROR);
373
374 fRet = EnumResourceNamesA(0, RT_MENUA,
375 (ENUMRESNAMEPROCA)PosEnumNamesCallbackA1,
376 MY_LPARAM);
377 if (!fRet)
378 {
379 TstError(__FILE__, __LINE__, "failed with fRet=%d and LastError=%d\n", fRet, GetLastError());
380 }
381 TSTCHECKLASTERROR(NO_ERROR);
382 TSTCHECK1D(iPosA1 == 4, iPosA1);
383}
384static CALLBACK PosEnumNamesCallbackA1(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam)
385{
386 static LPCTSTR aiRes[] = {(LPCTSTR)IDM_1, (LPCTSTR)IDM_2, (LPCTSTR)IDM_3, (LPCTSTR)IDM_4};
387
388 TSTCHECK(hmod == 0);
389 TSTCHECK(lpszType == RT_MENUA);
390 TSTCHECK(lParam == MY_LPARAM);
391 TSTCHECK(aiRes[iPosA1] == lpszName);
392 iPosA1++;
393 return TRUE;
394}
395
396
397/**
398 * Positive - This function tests the EnumResourceNamesA, negative callback return.
399 */
400static void PosEnumResourceNamesA2(void)
401{
402 BOOL fRet;
403
404 SetLastError(NO_ERROR);
405
406 fRet = EnumResourceNamesA((HMODULE)0, RT_MENUA,
407 (ENUMRESNAMEPROCA)PosEnumNamesCallbackA2,
408 MY_LPARAM);
409 if (fRet)
410 TstError(__FILE__, __LINE__, "didn't fail, fRet=%d and LastError=%d\n", fRet, GetLastError());
411
412 TSTINFOLASTERROR();
413 TSTCHECKLASTERROR(NO_ERROR);
414 TSTCHECK1D(iPosA2 == 2, iPosA2);
415}
416static CALLBACK PosEnumNamesCallbackA2(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam)
417{
418 static LPCTSTR aiRes[] = {(LPCTSTR)IDM_1, (LPCTSTR)IDM_2, (LPCTSTR)IDM_3, (LPCTSTR)IDM_4};
419
420 TSTCHECK(hmod == (HMODULE)0);
421 TSTCHECK(lpszType == RT_MENUA);
422 TSTCHECK(lParam == MY_LPARAM);
423 TSTCHECK(aiRes[iPosA2] == lpszName);
424 iPosA2++;
425 return iPosA2 < 2 ? TRUE : FALSE;
426}
427
428
429/**
430 * Positive - This function tests EnumResourceNamesA return value
431 */
432static void PosEnumResourceNamesA3(void)
433{
434 BOOL fRet;
435
436 SetLastError(NO_ERROR);
437
438 fRet = EnumResourceNamesA((HMODULE)0, RT_MENUA,
439 (ENUMRESNAMEPROCA)PosEnumNamesCallbackA3,
440 MY_LPARAM);
441 if (fRet != 1)
442 TstError(__FILE__, __LINE__, "invalid return, fRet=%d and LastError=%d\n", fRet, GetLastError());
443
444 TSTCHECKLASTERROR(NO_ERROR);
445}
446static CALLBACK PosEnumNamesCallbackA3(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam)
447{
448
449 TSTCHECK(hmod == (HMODULE)0);
450 TSTCHECK(lpszType == RT_MENUA);
451 TSTCHECK(lParam == MY_LPARAM);
452 lpszName = lpszName;
453 return 0xBEEF0000;
454}
455
456
457/**
458 * Negative - invalid handle
459 */
460static void NegEnumResourceNamesA1(void)
461{
462 BOOL fRet;
463
464 SetLastError(NO_ERROR);
465
466 fRet = EnumResourceNamesA((HMODULE)0xBEEFBEEF, RT_MENUA,
467 (ENUMRESNAMEPROCA)NegEnumNamesCallbackA1,
468 MY_LPARAM);
469 if (fRet == TRUE)
470 TstError(__FILE__, __LINE__, "invalid return code, !FALSE");
471 TSTCHECKLASTERROR(ERROR_RESOURCE_DATA_NOT_FOUND);
472}
473static CALLBACK NegEnumNamesCallbackA1(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam)
474{
475 hmod = hmod; lpszType = lpszType; lpszName = lpszName; lParam = lParam;
476 return TRUE;
477}
478
479
480/*
481 * invalid resource type
482 */
483static void NegEnumResourceNamesA2(void)
484{
485 BOOL fRet;
486
487 SetLastError(NO_ERROR);
488
489 fRet = EnumResourceNamesA(0, RT_DIALOGA, /* no dialogs resources */
490 (ENUMRESNAMEPROCA)NegEnumNamesCallbackA2,
491 MY_LPARAM);
492 if (fRet == TRUE)
493 TstError(__FILE__, __LINE__, "invalid return code, !FALSE");
494 TSTCHECKLASTERROR(ERROR_RESOURCE_TYPE_NOT_FOUND);
495}
496static CALLBACK NegEnumNamesCallbackA2(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam)
497{
498 hmod = hmod; lpszType = lpszType; lpszName = lpszName; lParam = lParam;
499 return TRUE;
500}
501
502
503/*
504 * invalid lpszType pointer
505 */
506static void NegEnumResourceNamesA3(void)
507{
508 BOOL fRet;
509
510 SetLastError(NO_ERROR);
511
512 fRet = EnumResourceNamesA(0, (LPCTSTR)0x80000000,
513 (ENUMRESNAMEPROCA)0UL,
514 MY_LPARAM);
515 if (fRet == TRUE)
516 TstError(__FILE__, __LINE__, "invalid return code, !FALSE");
517
518 TSTCHECKLASTERROR(ERROR_INVALID_PARAMETER);
519}
520
521
522/*
523 * invalid callback
524 */
525static void NegEnumResourceNamesA4(void)
526{
527 BOOL fRet;
528
529 SetLastError(NO_ERROR);
530
531 fRet = EnumResourceNamesA(0, RT_MENUA,
532 (ENUMRESNAMEPROCA)0UL,
533 MY_LPARAM);
534 if (fRet == TRUE)
535 TstError(__FILE__, __LINE__, "invalid return code, !FALSE");
536
537 TSTCHECKLASTERROR(ERROR_NOACCESS);
538}
539
540
541/**
542 * Negative - This function tests EnumResourceNamesA String Type for standard resource type.
543 */
544static void NegEnumResourceNamesA5(void)
545{
546 BOOL fRet;
547 CHAR szType[] = {'M', 'E', 'N', 'U', 0};
548
549 SetLastError(NO_ERROR);
550
551 fRet = EnumResourceNamesA((HMODULE)0, szType,
552 (ENUMRESNAMEPROCA)NegEnumNamesCallbackA5,
553 MY_LPARAM);
554 TSTCHECK1D(!fRet, fRet);
555 TSTCHECKLASTERROR(ERROR_RESOURCE_TYPE_NOT_FOUND);
556}
557static CALLBACK NegEnumNamesCallbackA5(HMODULE hmod, LPCTSTR lpszType, LPCTSTR lpszName, LONG lParam)
558{
559
560 TSTCHECK(hmod == (HMODULE)0);
561 TSTCHECK(lpszType == RT_MENUA);
562 TSTCHECK(lParam == MY_LPARAM);
563 lpszName = lpszName;
564 return TRUE;
565}
566
Note: See TracBrowser for help on using the repository browser.