Bill Medland (billmedland@xxxxxxxxxxxxxxxx) Conformance tests for IsDialogMessage (and associated functions). This first version addresses the issue for which I submitted a patch yesterday. Index: wine/dlls/user/tests/Makefile.in =================================================================== RCS file: /home/wine/wine/dlls/user/tests/Makefile.in,v retrieving revision 1.6 diff -u -r1.6 Makefile.in --- wine/dlls/user/tests/Makefile.in 28 Oct 2003 00:18:40 -0000 1.6 +++ wine/dlls/user/tests/Makefile.in 6 Jan 2004 20:32:03 -0000 @@ -9,6 +9,7 @@ class.c \ generated.c \ input.c \ + IsDlgMsg.c \ listbox.c \ msg.c \ sysparams.c \ --- /dev/null 2002-08-30 16:31:37.000000000 -0700 +++ wine/dlls/user/tests/IsDlgMsg.c 2004-01-06 12:28:03.000000000 -0800 @@ -0,0 +1,153 @@ +/* Unit test suite for the IsDialogMessage function etc. + * + * Copyright 2004 Bill Medland + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include <assert.h> +#include <stdarg.h> + +#include "wine/test.h" +#include "windef.h" +#include "winbase.h" +#include "winuser.h" + +/* Global handles */ +HINSTANCE g_hinst; /* This application's HINSTANCE */ +HWND g_hwndLastFocus; +HWND g_hwndMain, g_hwndButton1, g_hwndButtonCancel; + +/* Form the lParam of a WM_KEYDOWN message */ +static DWORD KeyDownData (int repeat, int scancode, int extended, int wasdown) +{ + return ((repeat & 0x0000FFFF) | ((scancode & 0x00FF) >> 16) | (extended ? 0x01000000 : 0) | (wasdown ? 0x40000000 : 0)); +} + +/* Form a WM_KEYDOWN message to the specified window */ +static void FormTabMsg (MSG *pMsg, HWND hwnd) +{ + pMsg->hwnd = hwnd; + pMsg->message = WM_KEYDOWN; + pMsg->wParam = VK_TAB; + pMsg->lParam = KeyDownData (1, 0x0F, 0, 0); + /* pMsg->time is not set. It shouldn't be needed */ + /* pMsg->pt is ignored */ +} + +/* + * OnMainWindowCreate + */ +BOOL OnMainWindowCreate(HWND hwnd, LPCREATESTRUCT lpcs) +{ + g_hwndButton1 = + CreateWindow( + TEXT("button"), /* Class Name */ + TEXT("Button &1"), /* Title */ + WS_CHILD | WS_VISIBLE | WS_TABSTOP | + BS_DEFPUSHBUTTON | BS_PUSHBUTTON | BS_TEXT, /* Style */ + 0, 0, 100, 100, /* Position and size */ + hwnd, /* Parent */ + (HMENU)100, /* Child ID */ + g_hinst, /* Instance */ + 0); /* No special parameters */ + if (!g_hwndButton1) return FALSE; + g_hwndLastFocus = g_hwndButton1; + + g_hwndButtonCancel = + CreateWindow( + TEXT("button"), /* Class Name */ + TEXT("Cancel"), /* Title */ + WS_CHILD | WS_VISIBLE | WS_TABSTOP | + BS_PUSHBUTTON | BS_TEXT, /* Style */ + 100, 0, 100, 100, /* Position and size */ + hwnd, /* Parent */ + (HMENU)IDCANCEL, /* Child ID */ + g_hinst, /* Instance */ + 0); /* No special parameters */ + if (!g_hwndButtonCancel) return FALSE; + + return TRUE; +} + +LRESULT CALLBACK main_window_procA(HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam) +{ + LRESULT result; + switch (uiMsg) { + // Add blank case statements for these to ensure we don't use them + // by mistake. + case DM_GETDEFID: break; + case DM_SETDEFID: break; + + case WM_CREATE: return (OnMainWindowCreate(hwnd, (LPCREATESTRUCTA) lParam) ? 0 : (LRESULT) -1); + } + + result=DefWindowProcA(hwnd, uiMsg, wParam, lParam); + return result; +} + +static BOOL RegisterWindowClasses(void) +{ + WNDCLASSA cls; + + cls.style = 0; + cls.lpfnWndProc = main_window_procA; + cls.cbClsExtra = 0; + cls.cbWndExtra = 0; + cls.hInstance = g_hinst; + cls.hIcon = NULL; + cls.hCursor = LoadCursorA(NULL, IDC_ARROW); + cls.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); + cls.lpszMenuName = NULL; + cls.lpszClassName = "MainWindowClass"; + + if (!RegisterClassA(&cls)) return FALSE; + + return TRUE; +} + +static void IsDialogMessageWTest(void) +{ + MSG msg; + + /* The focus should initially be nowhere. The first TAB should take it + * to the first button. The second TAB should take it to the Cancel + * button. + */ + FormTabMsg (&msg, g_hwndMain); + ok (IsDialogMessage(g_hwndMain, &msg), "Did not handle first TAB"); + ok ((GetFocus() == g_hwndButton1), "Focus did not move to first button"); + FormTabMsg (&msg, g_hwndButton1); + ok (IsDialogMessage(g_hwndMain, &msg), "Did not handle second TAB"); + ok ((GetFocus() == g_hwndButtonCancel), "Focus did not move to cancel button"); +} + +START_TEST(IsDlgMsg) +{ + if (!RegisterWindowClasses()) assert(0); + + g_hinst = GetModuleHandleA(0); + + g_hwndMain = CreateWindow( "MainWindowClass", "MainWindowClass", + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + NULL, NULL, g_hinst, 0); + + assert (g_hwndMain); + assert (g_hwndButton1); + assert (g_hwndButtonCancel); + + IsDialogMessageWTest(); +}