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