1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         Test for NtUserGetIconInfo
5  * PROGRAMMERS:
6  */
7 
8 #include <win32nt.h>
9 
10 START_TEST(NtUserGetIconInfo)
11 {
12 	HICON hIcon;
13 	ICONINFO iinfo;
14 	HBITMAP mask, color;
15 	UNICODE_STRING hInstStr;
16 	UNICODE_STRING ResourceStr;
17 	DWORD bpp = 0;
18 
19 	ZeroMemory(&iinfo, sizeof(ICONINFO));
20 
21 	/* BASIC TESTS */
22 	hIcon = (HICON) NtUserCallOneParam(0, _ONEPARAM_ROUTINE_CREATEEMPTYCUROBJECT);
23 	TEST(hIcon != NULL);
24 
25 	/* Last param is unknown */
26 	TEST(NtUserGetIconInfo(hIcon, &iinfo, NULL, NULL, NULL, FALSE) == FALSE);
27 	TEST(NtUserGetIconInfo(hIcon, &iinfo, NULL, NULL, NULL, TRUE) == FALSE);
28 
29 	TEST(NtUserDestroyCursor(hIcon, 0) == TRUE);
30 
31 	mask = CreateBitmap(16,16,1,1,NULL);
32 	color = CreateBitmap(16,16,1,16,NULL);
33 
34 	iinfo.hbmMask = mask;
35 	iinfo.hbmColor = color ;
36 	iinfo.fIcon = TRUE;
37 	iinfo.xHotspot = 8;
38 	iinfo.yHotspot = 8;
39 
40 	hIcon = CreateIconIndirect(&iinfo);
41 	TEST(hIcon!=NULL);
42 
43 	// TODO : test last parameter...
44 	TEST(NtUserGetIconInfo(hIcon, &iinfo, NULL, NULL, NULL, FALSE) == TRUE);
45 
46 	TEST(iinfo.hbmMask != NULL);
47 	TEST(iinfo.hbmColor != NULL);
48 	TEST(iinfo.fIcon == TRUE);
49 	TEST(iinfo.yHotspot == 8);
50 	TEST(iinfo.xHotspot == 8);
51 
52 	TEST(iinfo.hbmMask != mask);
53 	TEST(iinfo.hbmColor != color);
54 
55 	/* Does it make a difference? */
56 	TEST(NtUserGetIconInfo(hIcon, &iinfo, NULL, NULL, NULL, TRUE) == TRUE);
57 
58 	TEST(iinfo.hbmMask != NULL);
59 	TEST(iinfo.hbmColor != NULL);
60 	TEST(iinfo.fIcon == TRUE);
61 	TEST(iinfo.yHotspot == 8);
62 	TEST(iinfo.xHotspot == 8);
63 
64 	TEST(iinfo.hbmMask != mask);
65 	TEST(iinfo.hbmColor != color);
66 
67 	DeleteObject(mask);
68 	DeleteObject(color);
69 
70 	DestroyIcon(hIcon);
71 
72 	/* Test full param, with local icon */
73 	hIcon = LoadImageA(GetModuleHandle(NULL),
74 					   MAKEINTRESOURCE(IDI_ICON),
75 					   IMAGE_ICON,
76 					   0,
77 					   0,
78 					   LR_DEFAULTSIZE);
79 
80 	TEST(hIcon != NULL);
81 
82 	RtlInitUnicodeString(&hInstStr, NULL);
83 	RtlInitUnicodeString(&ResourceStr, NULL);
84 
85 	TEST(NtUserGetIconInfo(hIcon,
86 						   &iinfo,
87 						   &hInstStr,
88 						   &ResourceStr,
89 						   &bpp,
90 						   FALSE) == TRUE);
91 
92 	TESTX(hInstStr.Buffer == NULL, "hInstStr.buffer : %p\n", hInstStr.Buffer);
93 	TEST((LPCTSTR)ResourceStr.Buffer == MAKEINTRESOURCE(IDI_ICON));
94 	TEST(bpp == 32);
95 
96 	/* Last param doesn't seem to matter*/
97 	TEST(NtUserGetIconInfo(hIcon,
98 						   &iinfo,
99 						   &hInstStr,
100 						   &ResourceStr,
101 						   &bpp,
102 						   TRUE) == TRUE);
103 
104 	TESTX(hInstStr.Buffer == NULL, "hInstStr.buffer : %p\n", hInstStr.Buffer);
105 	TEST((LPCTSTR)ResourceStr.Buffer == MAKEINTRESOURCE(IDI_ICON));
106 	TEST(bpp == 32);
107 
108 	DestroyIcon(hIcon);
109 
110 	/* Test full param, with foreign icon */
111 	hIcon = LoadImageA(GetModuleHandleA("shell32.dll"),
112 					   MAKEINTRESOURCE(293),
113 					   IMAGE_ICON,
114 					   0,
115 					   0,
116 					   LR_DEFAULTSIZE);
117 
118 	TEST(hIcon != NULL);
119 
120     hInstStr.Buffer = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR));
121     hInstStr.MaximumLength = MAX_PATH;
122     hInstStr.Length = 0;
123 	RtlInitUnicodeString(&ResourceStr, NULL);
124 
125 	TEST(NtUserGetIconInfo(hIcon,
126 						   &iinfo,
127 						   &hInstStr,
128 						   &ResourceStr,
129 						   &bpp,
130 						   FALSE) == TRUE);
131 
132 	TEST(hInstStr.Length != 0);
133     hInstStr.Buffer[hInstStr.Length] = 0;
134 	printf("%s,%i: hInstStr.buffer : %S\n", __FUNCTION__, __LINE__, hInstStr.Buffer);
135 	TEST((LPCTSTR)ResourceStr.Buffer == MAKEINTRESOURCE(293));
136 	TEST(ResourceStr.Length == 0);
137 	TEST(ResourceStr.MaximumLength == 0);
138 	TEST(bpp == 32);
139 
140 	ZeroMemory(hInstStr.Buffer, MAX_PATH*sizeof(WCHAR));
141     hInstStr.Length = 0;
142 	RtlInitUnicodeString(&ResourceStr, NULL);
143 
144 	TEST(NtUserGetIconInfo(hIcon,
145 						   &iinfo,
146 						   &hInstStr,
147 						   &ResourceStr,
148 						   &bpp,
149 						   TRUE) == TRUE);
150 
151     TEST(hInstStr.Length != 0);
152     hInstStr.Buffer[hInstStr.Length] = 0;
153 	printf("%s,%i: hInstStr.buffer : %S\n", __FUNCTION__, __LINE__, hInstStr.Buffer);
154 	TEST((LPCTSTR)ResourceStr.Buffer == MAKEINTRESOURCE(293));
155 	TEST(bpp == 32);
156 
157 	DestroyIcon(hIcon);
158 
159 }
160