[USER32_APITEST]: Add more tests for RegisterClassEx.
[reactos.git] / rostests / apitests / user32 / RegisterClassEx.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for RegisterClassEx
5 * PROGRAMMERS: Giannis Adamopoulos
6 */
7
8 #include <apitest.h>
9 #define WIN32_NO_STATUS
10 #include <ndk/rtlfuncs.h>
11
12 #include <wingdi.h>
13 #include <winuser.h>
14 #include "helper.h"
15 #include <undocuser.h>
16
17 static ATOM _RegisterClass(LPCWSTR lpwszClassName, HINSTANCE hInstance, UINT style, WNDPROC lpfnWndProc)
18 {
19 WNDCLASSEXW wcex = {sizeof(WNDCLASSEXW), style, lpfnWndProc};
20 wcex.lpszClassName = lpwszClassName;
21 wcex.hInstance = hInstance;
22 return RegisterClassExW(&wcex);
23 }
24
25 static ATOM _GetClassAtom(LPCWSTR lpwszClassName, HINSTANCE hInstance)
26 {
27 WNDCLASSEXW wcex = {sizeof(WNDCLASSEXW)};
28 return (ATOM)GetClassInfoEx(hInstance, lpwszClassName, &wcex);
29 }
30
31 static WNDPROC _GetWndproc(LPCWSTR lpwszClassName, HINSTANCE hInstance)
32 {
33 WNDCLASSEXW wcex = {sizeof(WNDCLASSEXW)};
34 GetClassInfoEx(hInstance, lpwszClassName, &wcex);
35 return wcex.lpfnWndProc;
36 }
37
38 HANDLE _CreateActCtxFromFile(LPCWSTR FileName)
39 {
40 ACTCTXW ActCtx = {sizeof(ACTCTX)};
41 WCHAR buffer[MAX_PATH] , *separator;
42
43 ok (GetModuleFileNameW(NULL, buffer, MAX_PATH), "GetModuleFileName failed\n");
44 separator = wcsrchr(buffer, L'\\');
45 if (separator)
46 wcscpy(separator + 1, FileName);
47
48 ActCtx.lpSource = buffer;
49
50 return CreateActCtxW(&ActCtx);
51 }
52
53 VOID TestGlobalClasses(VOID)
54 {
55 HMODULE hmod = GetModuleHandle(NULL);
56 ATOM a,b,c,d,e;
57
58 a = _GetClassAtom(L"TestClass1", hmod);
59 b = _RegisterClass(L"TestClass1", hmod, 0, DefWindowProcW);
60 c = _GetClassAtom(L"TestClass1", hmod);
61 UnregisterClass(L"TestClass1", hmod);
62 d = _GetClassAtom(L"TestClass1", hmod);
63 ok( a == 0, "\n");
64 ok( b != 0, "\n");
65 ok( c != 0, "\n");
66 ok( d == 0, "\n");
67 ok (b == c, "\n");
68
69 a = _GetClassAtom(L"TestClass2", hmod);
70 b = _RegisterClass(L"TestClass2", hmod, CS_GLOBALCLASS, DefWindowProcW);
71 c = _GetClassAtom(L"TestClass2", hmod);
72 UnregisterClass(L"TestClass2", hmod);
73 d = _GetClassAtom(L"TestClass2", hmod);
74 ok( a == 0, "\n");
75 ok( b != 0, "\n");
76 ok( c != 0, "\n");
77 ok( d == 0, "\n");
78 ok (b == c, "\n");
79
80 a = _RegisterClass(L"TestClass3", hmod, 0, DefWindowProcW);
81 b = _RegisterClass(L"TestClass3", hmod, 0, DefWindowProcW);
82 c = _RegisterClass(L"TestClass3", hmod, CS_GLOBALCLASS, DefWindowProcW);
83 UnregisterClass(L"TestClass3", hmod);
84 d = _GetClassAtom(L"TestClass3", hmod);
85 ok( a != 0, "\n");
86 ok( b == 0, "\n");
87 ok( c == 0, "\n");
88 ok( d == 0, "\n");
89
90 a = _RegisterClass(L"TestClass4", hmod, CS_GLOBALCLASS, DefWindowProcW);
91 b = _RegisterClass(L"TestClass4", hmod, 0, DefWindowProcW);
92 c = _RegisterClass(L"TestClass4", hmod, 0, DefWindowProcW);
93 UnregisterClass(L"TestClass4", hmod);
94 d = _GetClassAtom(L"TestClass4", hmod);
95 UnregisterClass(L"TestClass4", hmod);
96 e = _GetClassAtom(L"TestClass4", hmod);
97 ok( a != 0, "\n");
98 ok( b != 0, "\n");
99 ok( c == 0, "\n");
100 ok( d != 0, "\n");
101 ok( e == 0, "\n");
102
103 a = _GetClassAtom(L"ComboBox", hmod);
104 b = _RegisterClass(L"ComboBox", hmod, 0, DefWindowProcW);
105 c = _RegisterClass(L"ComboBox", hmod, CS_GLOBALCLASS, DefWindowProcW);
106 UnregisterClass(L"ComboBox", hmod);
107 d = _GetClassAtom(L"ComboBox", hmod);
108 UnregisterClass(L"TestClass4", hmod);
109 e = _GetClassAtom(L"TestClass4", hmod);
110 ok( a != 0, "\n");
111 ok( b != 0, "\n");
112 ok( c == 0, "\n");
113 ok( d != 0, "\n");
114 ok( e == 0, "\n");
115
116 a = _GetClassAtom(L"ScrollBar", hmod);
117 UnregisterClass(L"ScrollBar", hmod);
118 b = _GetClassAtom(L"ScrollBar", hmod);
119 c = _RegisterClass(L"ScrollBar", hmod, CS_GLOBALCLASS, DefWindowProcW);
120 d = _GetClassAtom(L"ScrollBar", hmod);
121 ok( a != 0, "\n");
122 ok( b == 0, "\n");
123 ok( c != 0, "\n");
124 ok( d != 0, "\n");
125 ok( a == c, "\n");
126 ok( a == d, "\n"); /* In Windows 10 the last 4 tests fail */
127
128 a = _GetClassAtom(L"ListBox", (HMODULE)0xdead);
129 UnregisterClass(L"ListBox", (HMODULE)0xdead);
130 b = _GetClassAtom(L"ListBox", (HMODULE)0xdead);
131 ok( a != 0, "\n");
132 ok( b == 0, "\n");
133
134 a = _RegisterClass(L"TestClass5", (HMODULE)0xdead, CS_GLOBALCLASS, DefWindowProcW);
135 b = _GetClassAtom(L"TestClass5", hmod);
136 UnregisterClass(L"TestClass5", hmod);
137 c = _GetClassAtom(L"TestClass5", (HMODULE)0xdead);
138 d = _GetClassAtom(L"TestClass5", hmod);
139 ok( a != 0, "\n");
140 ok( b != 0, "\n");
141 ok( c == 0, "\n");
142 ok( d == 0, "\n");
143 }
144
145 VOID TestVersionedClasses(VOID)
146 {
147 HMODULE hmod = GetModuleHandle(NULL);
148 HANDLE h1, h2;
149 ULONG_PTR cookie1;
150 ATOM a,b,c;
151 WNDPROC proc1,proc2,proc3, proc4, proc5;
152
153 h1 = _CreateActCtxFromFile(L"verclasstest1.manifest");
154 h2 = _CreateActCtxFromFile(L"verclasstest2.manifest");
155 if (h1 == INVALID_HANDLE_VALUE || h2 == INVALID_HANDLE_VALUE)
156 {
157 skip("Loading manifests failed. Skipping TestVersionedClasses\n");
158 return;
159 }
160
161 a = _RegisterClass(L"VersionTestClass1", hmod, 0, DefWindowProcA);
162 proc1 = _GetWndproc(L"VersionTestClass1", hmod);
163 b = _RegisterClass(L"VersionTestClass1", hmod, 0, DefWindowProcW);
164 ActivateActCtx(h1, &cookie1);
165 proc2 = _GetWndproc(L"VersionTestClass1", hmod);
166 c = _RegisterClass(L"VersionTestClass1", hmod, 0, DefWindowProcW);
167 proc3 = _GetWndproc(L"VersionTestClass1", hmod);
168 proc4 = _GetWndproc((LPCWSTR)(DWORD_PTR)a, hmod);
169 DeactivateActCtx(0, cookie1);
170 proc5 = _GetWndproc(L"VersionTestClass1", hmod);
171 ok( a != 0, "\n");
172 ok( b == 0, "\n");
173 ok( c != 0, "\n");
174 ok( a == c, "\n");
175 ok (proc1 == DefWindowProcA, "\n");
176 ok (proc2 == NULL, "\n");
177 ok (proc3 == DefWindowProcW, "\n");
178 ok (proc4 == DefWindowProcW, "\n");
179 ok (proc5 == DefWindowProcA, "\n");
180
181 a = _GetClassAtom(L"Button", hmod);
182 b = _RegisterClass(L"Button", hmod, CS_GLOBALCLASS, DefWindowProcA);
183 proc1 = _GetWndproc(L"Button", (HMODULE)0xdead);
184 ActivateActCtx(h2, &cookie1);
185 c = _RegisterClass(L"Button", hmod, CS_GLOBALCLASS, DefWindowProcA);
186 proc2 = _GetWndproc(L"Button", (HMODULE)0xdead);
187 ok( a != 0, "\n");
188 ok( b == 0, "\n");
189 ok( c != 0, "\n");
190 ok( a == c, "\n");
191 ok( proc1 != NULL, "\n");
192 ok( proc1 != proc2, "\n");
193 ok( proc2 == DefWindowProcA, "\n");
194
195 a = _RegisterClass(L"VersionTestClass2", hmod, CS_GLOBALCLASS, DefWindowProcW);
196 proc1 = _GetWndproc(L"VersionTestClass2", (HMODULE)0xdead);
197 b = _RegisterClass(L"VersionTestClass2", hmod, 0, DefWindowProcA);
198 proc2 = _GetWndproc(L"VersionTestClass2", hmod);
199 ok (a != 0, "\n");
200 ok (b != 0, "\n");
201 ok (a == b, "\n");
202 ok (proc1 == DefWindowProcW, "\n");
203 ok (proc2 == DefWindowProcA, "\n");
204
205
206 }
207
208 START_TEST(RegisterClassEx)
209 {
210 TestGlobalClasses();
211 TestVersionedClasses();
212 }