[SHELL32_APITEST] -Add some tests for SHParseDisplayName for CORE-12882.
[reactos.git] / rostests / apitests / user32 / RealGetWindowClass.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for RealGetWindowClass
5 * PROGRAMMERS: Gregor Gullwi
6 */
7
8 #include <apitest.h>
9
10 #include <stdio.h>
11 #include <winuser.h>
12
13 #define ARRAY_SIZE(x) (sizeof(x) / sizeof(x[0]))
14
15 static PWSTR ControlsList[] =
16 {
17 L"Button\0",
18 L"Edit\0",
19 L"Static\0",
20 L"ListBox\0",
21 L"ScrollBar\0",
22 L"ComboBox\0",
23 L"MDIClient\0",
24 L"ComboLBox\0",
25 L"DDEMLEvent\0",
26 L"DDEMLMom\0",
27 L"DMGClass\0",
28 L"DDEMLAnsiClient\0",
29 L"DDEMLUnicodeClient\0",
30 L"DDEMLAnsiServer\0",
31 L"DDEMLUnicodeServer\0",
32 L"IME\0",
33 L"\0",//L"Ghost\0", // Vista+, Ghost is registered after "Message" in XP/W2k3 Win32k.sys.
34 };
35
36 typedef struct _TestData
37 {
38 BOOL OverrideWndProc; /* TRUE if lpfnWndProc should be overridden */
39 LPCSTR ClassName; /* Name of the new class to register */
40 DWORD WndExtra; /* Remove these WNDCLASS::cbWndExtra flags */
41 BOOL ExpectsHwnd; /* TRUE if a HWND should be created to run tests on */
42 LPCSTR ExpectedClassNameBefore; /* Expected class name before any dialog function is called */
43 LPCSTR ExpectedClassNameAfter; /* Expected class name after any dialog function is called */
44 } TestData;
45
46 static TestData RealClassTestData[] =
47 {
48 {
49 TRUE,
50 "OverrideWndProc_with_DLGWINDOWEXTRA_TRUE",
51 0,
52 TRUE,
53 "OverrideWndProc_with_DLGWINDOWEXTRA_TRUE",
54 "#32770",
55 },
56 {
57 TRUE,
58 "OverrideWndProc_without_DLGWINDOWEXTRA_TRUE",
59 DLGWINDOWEXTRA,
60 TRUE,
61 "OverrideWndProc_without_DLGWINDOWEXTRA_TRUE",
62 "OverrideWndProc_without_DLGWINDOWEXTRA_TRUE",
63 },
64 {
65 FALSE,
66 "DefaultWndProc_with_DLGWINDOWEXTRA_FALSE",
67 0,
68 TRUE,
69 "#32770",
70 "#32770",
71 },
72 {
73 FALSE,
74 "DefaultWndProc_without_DLGWINDOWEXTRA_FALSE",
75 DLGWINDOWEXTRA,
76 FALSE,
77 "N/A",
78 "N/A",
79 },
80 };
81
82 //
83 // The Control Class Atoms are consecitively issued.
84 //
85
86 void Test_ClassAtoms()
87 {
88 ATOM atom;
89 int i;
90 WNDCLASSW cls;
91
92 // Initialize starting Atom number.
93 atom = GetClassInfoW(NULL, ControlsList[0], &cls);
94 if (!atom)
95 {
96 skip( "No reference Atom\n" );
97 return;
98 }
99
100 trace("First Control Class Atom 0x%x\n",atom);
101
102 for (i = 0; i < 17; atom++ ,i++)
103 {
104 if (lstrcmpW(ControlsList[i],L"\0"))
105 {
106 ATOM test_atom = GetClassInfoW(NULL, ControlsList[i], &cls);
107 // Skip unregistered Classes.
108 if (test_atom)
109 {
110 ok(test_atom == atom, "%S class atom did not match %x:%x\n",ControlsList[i],test_atom,atom);
111 ok(!lstrcmpW(cls.lpszClassName,ControlsList[i]),"GetClassName returned incorrect name\n");
112 }
113 }
114 }
115 }
116
117 void Test_RealGetWindowClass()
118 {
119 int testNo;
120 UINT Result;
121 CHAR Buffer[1024];
122
123 Result = RealGetWindowClass( NULL, Buffer, ARRAY_SIZE(Buffer) );
124 ok(Result == 0, "Result = %d\n", Result);
125 ok(GetLastError() == ERROR_INVALID_WINDOW_HANDLE, "GetLastError() = %ld\n", GetLastError());
126
127 for (testNo = 0; testNo < ARRAY_SIZE(RealClassTestData); testNo++)
128 {
129 ATOM atom;
130 WNDCLASSA cls;
131 HWND hWnd;
132
133 /* Register classes, "derived" from built-in dialog, with and without the DLGWINDOWEXTRA flag set */
134 GetClassInfoA(0, "#32770", &cls);
135 if (RealClassTestData[testNo].OverrideWndProc)
136 cls.lpfnWndProc = DefWindowProcA;
137 cls.lpszClassName = RealClassTestData[testNo].ClassName;
138 cls.cbWndExtra &= ~RealClassTestData[testNo].WndExtra;
139 atom = RegisterClassA (&cls);
140 if (atom == 0) return;
141
142 /* Create a window */
143 hWnd = CreateWindowEx( WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR |
144 WS_EX_DLGMODALFRAME | WS_EX_WINDOWEDGE | WS_EX_CONTROLPARENT | WS_EX_APPWINDOW,
145 RealClassTestData[testNo].ClassName,
146 RealClassTestData[testNo].ClassName,
147 WS_POPUPWINDOW | WS_CLIPSIBLINGS | WS_DLGFRAME | WS_OVERLAPPED |
148 WS_MINIMIZEBOX | WS_MAXIMIZEBOX | DS_3DLOOK | DS_SETFONT | DS_MODALFRAME,
149 CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,
150 NULL, NULL, 0, 0);
151
152 /* Do we expect a HWND at all? */
153 if (RealClassTestData[testNo].ExpectsHwnd)
154 {
155 ok(hWnd != NULL, "\n");
156
157 if (hWnd != NULL)
158 {
159 /* Get the "real" class name */
160 Result = RealGetWindowClass( hWnd, Buffer, ARRAY_SIZE(Buffer) );
161 printf("Buffer: %s\nExpectedClassNameBefore(%d): %s\n", Buffer, testNo, RealClassTestData[testNo].ExpectedClassNameBefore);
162 ok( Result != 0, "\n" );
163 ok( strcmp( Buffer, RealClassTestData[testNo].ExpectedClassNameBefore ) == 0, "\n" );
164
165 /* Call a function that requires a dialog window */
166 DefDlgProcA( hWnd, DM_SETDEFID, IDCANCEL, 0 );
167
168 /* Get the "real" class name again */
169 Result = RealGetWindowClass( hWnd, Buffer, ARRAY_SIZE(Buffer) );
170 printf("Buffer: %s\nExpectedClassNameAfter(%d): %s\n", Buffer, testNo, RealClassTestData[testNo].ExpectedClassNameAfter);
171 ok( Result != 0, "\n" );
172 ok( strcmp( Buffer, RealClassTestData[testNo].ExpectedClassNameAfter ) == 0, "\n" );
173 }
174 }
175 else
176 {
177 ok(hWnd == NULL, "\n");
178 }
179
180 /* Cleanup */
181 DestroyWindow(hWnd);
182 UnregisterClass(RealClassTestData[testNo].ClassName, 0);
183 }
184
185 }
186
187 START_TEST(RealGetWindowClass)
188 {
189 Test_ClassAtoms();
190 Test_RealGetWindowClass();
191 }
192