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

Last change on this file since 3830 was 1870, checked in by bird, 26 years ago

API test skeleton.

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