1 /*
2  * PROJECT:     ReactOS api tests
3  * LICENSE:     GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4  * PURPOSE:     Tests for GetClassInfo
5  * COPYRIGHT:   Copyright 2023 Timo Kreuzer <timo.kreuzer@reactos.org>
6  */
7 
8 #include "precomp.h"
9 
10 static USHORT GetWinVersion(VOID)
11 {
12     return ((GetVersion() & 0xFF) << 8) |
13         ((GetVersion() >> 8) & 0xFF);
14 }
15 
16 VOID Test_Desktop(VOID)
17 {
18     WNDCLASSEXW wcex;
19     BOOL result;
20 
21     memset(&wcex, 0xab, sizeof(wcex));
22 
23     result = GetClassInfoExW(GetModuleHandle(NULL), (LPCWSTR)WC_DESKTOP, &wcex);
24     ok_int(result, (ULONG_PTR)WC_DESKTOP);
25 
26     ok_hex(wcex.cbSize, 0xabababab);
27     ok_hex(wcex.style, 0x8);
28     ok(wcex.lpfnWndProc != NULL, "lpfnWndProc shound't be NULL\n");
29     ok_int(wcex.cbClsExtra, 0);
30     ok_int(wcex.cbWndExtra, GetWinVersion() <= 0x502 ? 8 : 0);
31     ok_ptr(wcex.hInstance, GetModuleHandle(NULL));
32     ok_ptr(wcex.hIcon, NULL);
33     ok(wcex.hCursor != NULL, "hCursor shound't be NULL\n");
34     if (GetWinVersion() > 0x502)
35         ok_ptr(wcex.hbrBackground, (HBRUSH)(ULONG_PTR)2);
36     else
37         ok(wcex.hbrBackground != NULL, "hbrBackground shound't be NULL\n");
38     ok_ptr(wcex.lpszMenuName, NULL);
39     ok_ptr(wcex.lpszClassName, (LPCWSTR)WC_DESKTOP);
40     ok_ptr(wcex.hIconSm, NULL);
41 }
42 
43 VOID Test_Dialog(VOID)
44 {
45     WNDCLASSEXW wcex;
46     BOOL result;
47 
48     memset(&wcex, 0xab, sizeof(wcex));
49 
50     result = GetClassInfoExW(GetModuleHandle(NULL), (LPCWSTR)(ULONG_PTR)WC_DIALOG, &wcex);
51     ok_int(result, (ULONG_PTR)WC_DIALOG);
52 
53     ok_hex(wcex.cbSize, 0xabababab);
54     ok_hex(wcex.style, 0x808);
55     ok(wcex.lpfnWndProc != NULL, "lpfnWndProc shound't be NULL\n");
56     ok_int(wcex.cbClsExtra, 0);
57     ok_int(wcex.cbWndExtra, 30); // DLGWINDOWEXTRA
58     ok_ptr(wcex.hInstance, GetModuleHandle(NULL));
59     ok_ptr(wcex.hIcon, NULL);
60     ok(wcex.hCursor != NULL, "hCursor shound't be NULL\n");
61     ok_ptr(wcex.hbrBackground, NULL);
62     ok_ptr(wcex.lpszMenuName, NULL);
63     ok_ptr(wcex.lpszClassName, (LPCWSTR)(ULONG_PTR)WC_DIALOG);
64     ok_ptr(wcex.hIconSm, NULL);
65 }
66 
67 VOID Test_Menu(VOID)
68 {
69     WNDCLASSEXW wcex;
70     BOOL result;
71 
72     memset(&wcex, 0xab, sizeof(wcex));
73 
74     result = GetClassInfoExW(GetModuleHandle(NULL), (LPCWSTR)(ULONG_PTR)WC_MENU, &wcex);
75     ok_int(result, (ULONG_PTR)WC_MENU);
76 
77     ok_hex(wcex.cbSize, 0xabababab);
78     ok_hex(wcex.style, 0x803);
79     ok_ptr(wcex.lpfnWndProc, NULL);
80     ok_int(wcex.cbClsExtra, 0);
81     ok_int(wcex.cbWndExtra, 16);
82     ok_ptr(wcex.hInstance, GetModuleHandle(NULL));
83     ok_ptr(wcex.hIcon, NULL);
84     ok(wcex.hCursor != NULL, "hCursor shound't be NULL\n");
85     ok_ptr(wcex.hbrBackground, NULL);
86     ok_ptr(wcex.lpszMenuName, NULL);
87     ok_ptr(wcex.lpszClassName, (LPCWSTR)(ULONG_PTR)WC_MENU);
88     ok_ptr(wcex.hIconSm, NULL);
89 }
90 
91 
92 VOID Test_SwitchWnd(VOID)
93 {
94     WNDCLASSEXW wcex;
95     BOOL result;
96 
97     memset(&wcex, 0xab, sizeof(wcex));
98 
99     result = GetClassInfoExW(GetModuleHandle(NULL), (LPCWSTR)(ULONG_PTR)WC_SWITCH, &wcex);
100     ok_int(result, (ULONG_PTR)WC_SWITCH);
101 
102     ok_hex(wcex.cbSize, 0xabababab);
103     ok_hex(wcex.style, 0x803);
104     ok_ptr(wcex.lpfnWndProc, NULL);
105     ok_int(wcex.cbClsExtra, 0);
106     ok_int(wcex.cbWndExtra, GetWinVersion() <= 0x502 ? sizeof(ULONG_PTR) : 16);
107     ok_ptr(wcex.hInstance, GetModuleHandle(NULL));
108     ok_ptr(wcex.hIcon, NULL);
109     ok(wcex.hCursor != NULL, "hCursor shound't be NULL\n");
110     ok_ptr(wcex.hbrBackground, NULL);
111     ok_ptr(wcex.lpszMenuName, NULL);
112     ok_ptr(wcex.lpszClassName, (LPCWSTR)(ULONG_PTR)WC_SWITCH);
113     ok_ptr(wcex.hIconSm, NULL);
114 }
115 
116 VOID Test_Custom(VOID)
117 {
118     WNDCLASSEXW wcex;
119     ATOM atom;
120     BOOL result;
121 
122     memset(&wcex, 0, sizeof(wcex));
123 
124     wcex.cbSize = sizeof(WNDCLASSEXW);
125     wcex.style = 0x1;
126     wcex.lpfnWndProc = DefWindowProcW;
127     wcex.cbClsExtra = 1;
128     wcex.cbWndExtra = 5;
129     wcex.hInstance = GetModuleHandle(NULL);
130     wcex.hIcon = NULL;
131     wcex.hCursor = NULL;
132     wcex.hbrBackground = NULL;
133     wcex.lpszMenuName = NULL;
134     wcex.lpszClassName = L"ProTestClass1";
135     wcex.hIconSm = 0;
136 
137     atom = RegisterClassExW(&wcex);
138     ok(atom != 0, "Failed to register class!\n");
139     if (atom == 0)
140     {
141         skip("Failed to register class!");
142         return;
143     }
144 
145     memset(&wcex, 0xab, sizeof(wcex));
146 
147     result = GetClassInfoExW(GetModuleHandle(NULL), (LPCWSTR)(ULONG_PTR)atom, &wcex);
148     ok_int(result, atom);
149 
150     ok_hex(wcex.cbSize, 0xabababab);
151     ok_hex(wcex.style, 0x1);
152     ok_ptr(wcex.lpfnWndProc, DefWindowProcW);
153     ok_int(wcex.cbClsExtra, 1);
154     ok_int(wcex.cbWndExtra, 5);
155     ok_ptr(wcex.hInstance, GetModuleHandle(NULL));
156     ok_ptr(wcex.hIcon, NULL);
157     ok_ptr(wcex.hIcon, NULL);
158     ok_ptr(wcex.hbrBackground, NULL);
159     ok_ptr(wcex.lpszMenuName, NULL);
160     ok_ptr(wcex.lpszClassName, (LPCWSTR)(ULONG_PTR)atom);
161     ok_ptr(wcex.hIconSm, NULL);
162 }
163 
164 START_TEST(GetClassInfo)
165 {
166     Test_Desktop();
167     Test_Dialog();
168     Test_SwitchWnd();
169     Test_Custom();
170 }
171