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