1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: GPL - See COPYING in the top level directory 4 * PURPOSE: Test for CreateDialog 5 * PROGRAMMERS: Andreas Maier 6 */ 7 8 #include "precomp.h" 9 10 #define TEST_MAX_MSG 50 11 12 // cmpflag 13 #define MSGLST_CMP_WP 0x1 14 #define MSGLST_CMP_LP 0x2 15 #define MSGLST_CMP_RES 0x4 16 #define MSGLST_CMP_ALL (MSGLST_CMP_WP | MSGLST_CMP_LP | MSGLST_CMP_RES) 17 18 typedef struct 19 { 20 BOOL DlgProc; // true = DlgProg, false WndProc 21 UINT msg; 22 WPARAM wParam; 23 LPARAM lParam; 24 int result; 25 int cmpflag; 26 } tagMsgInfo; 27 28 typedef struct 29 { 30 int msgCount; 31 tagMsgInfo msgList[TEST_MAX_MSG]; 32 } tagMsgList; 33 34 tagMsgList msglist; 35 36 /* the expected message-list */ 37 const tagMsgList t1msgList = 38 { 39 9, 40 { 41 // DlgProc, msg, wParam, lParam, result, cmpflag 42 { FALSE, WM_NCCREATE, 0, 0, 1, MSGLST_CMP_WP | MSGLST_CMP_RES }, 43 { FALSE, WM_NCCALCSIZE, 0, 0, 0, MSGLST_CMP_WP | MSGLST_CMP_RES }, 44 { FALSE, WM_CREATE, 0, 0, 0, MSGLST_CMP_WP | MSGLST_CMP_RES }, 45 { FALSE, WM_SIZE, 0, 0x145012c, 0, MSGLST_CMP_ALL }, // FIXME: size is 400x400 on Win7? 46 { FALSE, WM_MOVE, 0, 0x0160003, 0, MSGLST_CMP_ALL }, 47 { TRUE, WM_SETFONT, 0, 0, 0, MSGLST_CMP_LP | MSGLST_CMP_RES }, 48 { FALSE, WM_SETFONT, 0, 0, 0, MSGLST_CMP_LP | MSGLST_CMP_RES }, 49 { TRUE, WM_INITDIALOG, 0, 0, 0, MSGLST_CMP_LP | MSGLST_CMP_RES }, 50 { FALSE, WM_INITDIALOG, 0, 0, 0, MSGLST_CMP_LP | MSGLST_CMP_RES }, 51 } 52 }; 53 54 void DumpMsgList(const char* lstName, const tagMsgList *ml) 55 { 56 const char *dlgProcName; 57 int i1; 58 59 printf("%s\n", lstName); 60 for (i1 = 0; i1 < ml->msgCount; i1++) 61 { 62 dlgProcName = (ml->msgList[i1].DlgProc) ? "DlgProc" : "WndProc"; 63 printf("#%.3d %s, msg 0x%x, wParam 0x%x, lParam 0x%Ix, result %d\n", 64 i1, 65 dlgProcName, 66 ml->msgList[i1].msg, 67 ml->msgList[i1].wParam, 68 ml->msgList[i1].lParam, 69 ml->msgList[i1].result); 70 } 71 } 72 73 BOOL CmpMsgList(const tagMsgList *recvd, 74 const tagMsgList *expect) 75 { 76 int i1; 77 BOOL isOk; 78 79 isOk = TRUE; 80 if (recvd->msgCount != expect->msgCount) 81 { 82 ok(FALSE, "%d messages expected, %d messages received!\n", 83 expect->msgCount, recvd->msgCount); 84 isOk = FALSE; 85 } 86 else 87 { 88 for (i1 = 0; i1 < recvd->msgCount; i1++) 89 { 90 if (expect->msgList[i1].DlgProc != recvd->msgList[i1].DlgProc) 91 isOk = FALSE; 92 if (expect->msgList[i1].msg != recvd->msgList[i1].msg) 93 isOk = FALSE; 94 if ((expect->msgList[i1].cmpflag & MSGLST_CMP_WP) && 95 (expect->msgList[i1].wParam != recvd->msgList[i1].wParam)) 96 isOk = FALSE; 97 if ((expect->msgList[i1].cmpflag & MSGLST_CMP_LP) && 98 (expect->msgList[i1].lParam != recvd->msgList[i1].lParam)) 99 isOk = FALSE; 100 if ((expect->msgList[i1].cmpflag & MSGLST_CMP_RES) && 101 (expect->msgList[i1].result != recvd->msgList[i1].result)) 102 isOk = FALSE; 103 if (!isOk) 104 { 105 ok(FALSE, "Message #%.3d not equal\n", i1); 106 break; 107 } 108 } 109 } 110 111 if (!isOk) 112 { 113 DumpMsgList("RECEIVED", recvd); 114 DumpMsgList("EXPECTED", expect); 115 return FALSE; 116 } 117 118 ok(TRUE, "\n"); 119 return TRUE; 120 } 121 122 INT_PTR CALLBACK Test_CreateDialogW_DLGPROC(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 123 { 124 if (msglist.msgCount < TEST_MAX_MSG) 125 { 126 msglist.msgList[msglist.msgCount].DlgProc = TRUE; 127 msglist.msgList[msglist.msgCount].msg = msg; 128 msglist.msgList[msglist.msgCount].wParam = wParam; 129 msglist.msgList[msglist.msgCount].lParam = lParam; 130 msglist.msgList[msglist.msgCount].result = 0; 131 msglist.msgCount++; 132 } 133 trace("DlgProc: msg 0x%x, wParam 0x%x, lParam 0x%Ix\n", 134 msg, wParam, lParam); 135 return FALSE; 136 } 137 138 LRESULT CALLBACK Test_CreateDialogW_WNDPROC(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) 139 { 140 LRESULT res; 141 res = DefDlgProcW(hWnd, msg, wParam, lParam); 142 143 if (msglist.msgCount < TEST_MAX_MSG) 144 { 145 msglist.msgList[msglist.msgCount].DlgProc = FALSE; 146 msglist.msgList[msglist.msgCount].msg = msg; 147 msglist.msgList[msglist.msgCount].wParam = wParam; 148 msglist.msgList[msglist.msgCount].lParam = lParam; 149 msglist.msgList[msglist.msgCount].result = res; 150 msglist.msgCount++; 151 } 152 trace("WndProc: msg 0x%x, wParam 0x%x, lParam 0x%Ix, result %Id\n", 153 msg, wParam, lParam, res); 154 return res; 155 } 156 157 void Test_CreateDialogW() 158 { 159 HWND hWnd; 160 HMODULE hMod; 161 DWORD exstyle; 162 WNDCLASSW wc; 163 164 hMod = GetModuleHandle(NULL); 165 ok(hMod != NULL, "\n"); 166 167 msglist.msgCount = 0; 168 wc.style = CS_HREDRAW | CS_VREDRAW; 169 wc.lpfnWndProc = Test_CreateDialogW_WNDPROC; 170 wc.cbClsExtra = 0; 171 wc.cbWndExtra = DLGWINDOWEXTRA; 172 wc.hInstance = hMod; 173 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 174 wc.hCursor = LoadCursor(NULL, IDC_ARROW); 175 wc.hbrBackground = (HBRUSH) (COLOR_WINDOW + 1); 176 wc.lpszMenuName = NULL; 177 wc.lpszClassName = L"TestDialogClass"; 178 179 if (!RegisterClassW(&wc)) 180 { 181 ok(FALSE, "Error registering Window-Class\n"); 182 return; 183 } 184 hWnd = CreateDialogW(hMod, L"TESTDIALOG", 0, Test_CreateDialogW_DLGPROC); 185 ok(hWnd != NULL, "Error: %lu\n", GetLastError()); 186 if (hWnd != NULL) 187 { 188 /* Check the exstyle */ 189 exstyle = GetWindowLongW(hWnd, GWL_EXSTYLE); 190 ok(exstyle != 0x50010, "ExStyle wrong, got %#08lX, expected 0x50010.\n", exstyle); 191 /* Check the messages we received during creation */ 192 CmpMsgList(&msglist, &t1msgList); 193 } 194 } 195 196 START_TEST(CreateDialog) 197 { 198 //Test_CreateDialogA();//TODO 199 Test_CreateDialogW(); 200 } 201