1 /* 2 * PROJECT: ReactOS api tests 3 * LICENSE: GPL - See COPYING in the top level directory 4 * PURPOSE: Test for GetMessageTime and GetTickCount 5 * PROGRAMMERS: Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com> 6 */ 7 #include "precomp.h" 8 9 #define TIMER_ID 999 10 #define TIMER_INTERVAL 500 /* 500 milliseconds */ 11 12 #define MOUSE_LOCATION_X(x) ((DWORD)(x) * 0xFFFF / GetSystemMetrics(SM_CXSCREEN)) 13 #define MOUSE_LOCATION_Y(y) ((DWORD)(y) * 0xFFFF / GetSystemMetrics(SM_CYSCREEN)) 14 15 #define WIN_X 50 16 #define WIN_Y 50 17 #define WIN_CX 100 18 #define WIN_CY 100 19 20 static INT s_nCount = 0; 21 static LONG s_nMsgTime = 0; 22 23 static LRESULT CALLBACK 24 WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 25 { 26 static BOOL s_bReach_WM_MOUSEMOVE; 27 static BOOL s_bReach_WM_LBUTTONDOWN; 28 static BOOL s_bReach_WM_LBUTTONUP; 29 switch (uMsg) 30 { 31 case WM_CREATE: 32 s_nCount = 0; 33 s_nMsgTime = GetMessageTime(); 34 SetTimer(hwnd, TIMER_ID, TIMER_INTERVAL, NULL); 35 s_bReach_WM_MOUSEMOVE = FALSE; 36 s_bReach_WM_LBUTTONDOWN = FALSE; 37 s_bReach_WM_LBUTTONUP = FALSE; 38 break; 39 case WM_TIMER: 40 if (s_nCount == 5) 41 { 42 KillTimer(hwnd, TIMER_ID); 43 DestroyWindow(hwnd); 44 break; 45 } 46 if (s_nCount != 0) 47 { 48 ok(GetMessageTime() - s_nMsgTime >= TIMER_INTERVAL / 2, 49 "GetMessageTime() is wrong, compared to previous one\n"); 50 ok(GetTickCount() - (DWORD)GetMessageTime() < TIMER_INTERVAL / 2, 51 "GetMessageTime() is wrong, compared to GetTickCount()\n"); 52 } 53 s_nMsgTime = GetMessageTime(); 54 ok(s_nMsgTime != 0, "message time was zero.\n"); 55 s_nCount++; 56 if (s_nCount == 5) 57 { 58 mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, 59 MOUSE_LOCATION_X(WIN_X + WIN_CX / 2), 60 MOUSE_LOCATION_Y(WIN_Y + WIN_CY / 2), 61 0, 0); 62 mouse_event(MOUSEEVENTF_MOVE, 1, 1, 0, 0); 63 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0); 64 mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0); 65 } 66 break; 67 case WM_MOUSEMOVE: 68 trace("WM_MOUSEMOVE\n"); 69 ok_int(s_nCount, 5); 70 ok(GetMessageTime() - s_nMsgTime < TIMER_INTERVAL, 71 "GetMessageTime() is wrong, compared to previous one\n"); 72 ok(GetTickCount() - (DWORD)GetMessageTime() < TIMER_INTERVAL / 2, 73 "GetMessageTime() is wrong, compared to GetTickCount()\n"); 74 s_bReach_WM_MOUSEMOVE = TRUE; 75 break; 76 case WM_LBUTTONDOWN: 77 trace("WM_LBUTTONDOWN\n"); 78 ok_int(s_nCount, 5); 79 ok(GetMessageTime() - s_nMsgTime < TIMER_INTERVAL, 80 "GetMessageTime() is wrong, compared to previous one\n"); 81 ok(GetTickCount() - (DWORD)GetMessageTime() < TIMER_INTERVAL / 2, 82 "GetMessageTime() is wrong, compared to GetTickCount()\n"); 83 s_bReach_WM_LBUTTONDOWN = TRUE; 84 break; 85 case WM_LBUTTONUP: 86 trace("WM_LBUTTONUP\n"); 87 ok_int(s_nCount, 5); 88 ok(GetMessageTime() - s_nMsgTime < TIMER_INTERVAL, 89 "GetMessageTime() is wrong, compared to previous one\n"); 90 ok(GetTickCount() - (DWORD)GetMessageTime() < TIMER_INTERVAL / 2, 91 "GetMessageTime() is wrong, compared to GetTickCount()\n"); 92 s_bReach_WM_LBUTTONUP = TRUE; 93 break; 94 case WM_DESTROY: 95 ok_int(s_bReach_WM_MOUSEMOVE, TRUE); 96 ok_int(s_bReach_WM_LBUTTONDOWN, TRUE); 97 ok_int(s_bReach_WM_LBUTTONUP, TRUE); 98 PostQuitMessage(0); 99 break; 100 default: 101 return DefWindowProcW(hwnd, uMsg, wParam, lParam); 102 } 103 return 0; 104 } 105 106 START_TEST(GetMessageTime) 107 { 108 static const WCHAR s_szName[] = L"MessageTimeTestWindow"; 109 WNDCLASSW wc; 110 ATOM atom; 111 HWND hwnd; 112 MSG msg; 113 BOOL bRet; 114 115 mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE, 116 MOUSE_LOCATION_X(1), MOUSE_LOCATION_Y(1), 117 0, 0); 118 119 ZeroMemory(&wc, sizeof(wc)); 120 wc.lpfnWndProc = WindowProc; 121 wc.hInstance = GetModuleHandleW(NULL); 122 wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); 123 wc.hCursor = LoadCursor(NULL, IDC_ARROW); 124 wc.hbrBackground = (HBRUSH)(COLOR_3DFACE + 1); 125 wc.lpszClassName = s_szName; 126 atom = RegisterClassW(&wc); 127 ok(atom != 0, "RegisterClassW\n"); 128 129 hwnd = CreateWindowW(s_szName, s_szName, 130 WS_OVERLAPPEDWINDOW, 131 WIN_X, WIN_Y, WIN_CX, WIN_CY, 132 NULL, NULL, GetModuleHandleW(NULL), NULL); 133 ok(hwnd != NULL, "CreateWindowW\n"); 134 135 if (hwnd) 136 { 137 ShowWindow(hwnd, SW_SHOWNORMAL); 138 UpdateWindow(hwnd); 139 140 while (GetMessageW(&msg, NULL, 0, 0)) 141 { 142 TranslateMessage(&msg); 143 DispatchMessageW(&msg); 144 } 145 } 146 else 147 { 148 skip("hwnd was NULL.\n"); 149 } 150 151 bRet = UnregisterClassW(s_szName, GetModuleHandleW(NULL)); 152 ok_int(bRet, 1); 153 154 ok_int(s_nCount, 5); 155 ok(s_nMsgTime != 0, "message time was zero.\n"); 156 } 157