Module: wine Branch: master Commit: ad1d215774b49df237289f6a9636215454d58216 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ad1d215774b49df237289f6a96...
Author: Hugh McMaster hugh.mcmaster@outlook.com Date: Fri Jan 1 00:00:20 2016 +1100
user32/tests: Add tests for EM_SETSEL and getting/losing focus in combo boxes.
Signed-off-by: Hugh McMaster hugh.mcmaster@outlook.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/user32/tests/combo.c | 104 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+)
diff --git a/dlls/user32/tests/combo.c b/dlls/user32/tests/combo.c index 0d22fa5..2704262 100644 --- a/dlls/user32/tests/combo.c +++ b/dlls/user32/tests/combo.c @@ -17,6 +17,7 @@ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */
+#include <limits.h> #include <stdarg.h> #include <stdio.h>
@@ -537,6 +538,107 @@ static void test_editselection(void) DestroyWindow(hCombo); }
+static WNDPROC edit_window_proc; +static long setsel_start = 1, setsel_end = 1; +static HWND hCBN_SetFocus, hCBN_KillFocus; + +static LRESULT CALLBACK combobox_subclass_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + if (msg == EM_SETSEL) + { + setsel_start = wParam; + setsel_end = lParam; + } + return CallWindowProcA(edit_window_proc, hwnd, msg, wParam, lParam); +} + +static LRESULT CALLBACK test_window_proc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_COMMAND: + switch (HIWORD(wParam)) + { + case CBN_SETFOCUS: + hCBN_SetFocus = (HWND)lParam; + break; + case CBN_KILLFOCUS: + hCBN_KillFocus = (HWND)lParam; + break; + } + break; + case WM_NEXTDLGCTL: + SetFocus((HWND)wParam); + break; + } + return CallWindowProcA(old_parent_proc, hwnd, msg, wParam, lParam); +} + +static void test_editselection_focus(DWORD style) +{ + BOOL (WINAPI *pGetComboBoxInfo)(HWND, PCOMBOBOXINFO); + HWND hCombo, hEdit, hButton; + COMBOBOXINFO cbInfo; + BOOL ret; + const char wine_test[] = "Wine Test"; + char buffer[16] = {0}; + DWORD len; + + pGetComboBoxInfo = (void *)GetProcAddress(GetModuleHandleA("user32.dll"), "GetComboBoxInfo"); + if (!pGetComboBoxInfo) + { + win_skip("GetComboBoxInfo is not available\n"); + return; + } + + hCombo = build_combo(style); + cbInfo.cbSize = sizeof(COMBOBOXINFO); + SetLastError(0xdeadbeef); + ret = pGetComboBoxInfo(hCombo, &cbInfo); + ok(ret, "Failed to get COMBOBOXINFO structure; LastError: %u\n", GetLastError()); + hEdit = cbInfo.hwndItem; + + hButton = CreateWindowA("Button", "OK", WS_VISIBLE|WS_CHILD|BS_DEFPUSHBUTTON, + 5, 50, 100, 20, hMainWnd, NULL, + (HINSTANCE)GetWindowLongPtrA(hMainWnd, GWLP_HINSTANCE), NULL); + + old_parent_proc = (WNDPROC)SetWindowLongPtrA(hMainWnd, GWLP_WNDPROC, (ULONG_PTR)test_window_proc); + edit_window_proc = (WNDPROC)SetWindowLongPtrA(hEdit, GWLP_WNDPROC, (ULONG_PTR)combobox_subclass_proc); + + SendMessageA(hCombo, WM_SETFOCUS, 0, (LPARAM)hEdit); + ok(setsel_start == 0, "Unexpected EM_SETSEL start value; got %ld\n", setsel_start); + todo_wine ok(setsel_end == INT_MAX, "Unexpected EM_SETSEL end value; got %ld\n", setsel_end); + ok(hCBN_SetFocus == hCombo, "Wrong handle set by CBN_SETFOCUS; got %p\n", hCBN_SetFocus); + ok(GetFocus() == hEdit, "hEdit should have keyboard focus\n"); + + SendMessageA(hMainWnd, WM_NEXTDLGCTL, (WPARAM)hButton, TRUE); + ok(setsel_start == 0, "Unexpected EM_SETSEL start value; got %ld\n", setsel_start); + todo_wine ok(setsel_end == 0, "Unexpected EM_SETSEL end value; got %ld\n", setsel_end); + ok(hCBN_KillFocus == hCombo, "Wrong handle set by CBN_KILLFOCUS; got %p\n", hCBN_KillFocus); + ok(GetFocus() == hButton, "hButton should have keyboard focus\n"); + + SendMessageA(hCombo, WM_SETTEXT, 0, (LPARAM)wine_test); + SendMessageA(hMainWnd, WM_NEXTDLGCTL, (WPARAM)hCombo, TRUE); + ok(setsel_start == 0, "Unexpected EM_SETSEL start value; got %ld\n", setsel_start); + todo_wine ok(setsel_end == INT_MAX, "Unexpected EM_SETSEL end value; got %ld\n", setsel_end); + ok(hCBN_SetFocus == hCombo, "Wrong handle set by CBN_SETFOCUS; got %p\n", hCBN_SetFocus); + ok(GetFocus() == hEdit, "hEdit should have keyboard focus\n"); + SendMessageA(hCombo, WM_GETTEXT, sizeof(buffer), (LPARAM)buffer); + ok(!strcmp(buffer, wine_test), "Unexpected text in edit control; got '%s'\n", buffer); + + SendMessageA(hMainWnd, WM_NEXTDLGCTL, (WPARAM)hButton, TRUE); + ok(setsel_start == 0, "Unexpected EM_SETSEL start value; got %ld\n", setsel_start); + todo_wine ok(setsel_end == 0, "Unexpected EM_SETSEL end value; got %ld\n", setsel_end); + ok(hCBN_KillFocus == hCombo, "Wrong handle set by CBN_KILLFOCUS; got %p\n", hCBN_KillFocus); + ok(GetFocus() == hButton, "hButton should have keyboard focus\n"); + len = SendMessageA(hCombo, CB_GETEDITSEL, 0, 0); + ok(len == 0, "Unexpected text selection; start: %u, end: %u\n", LOWORD(len), HIWORD(len)); + + SetWindowLongPtrA(hMainWnd, GWLP_WNDPROC, (ULONG_PTR)old_parent_proc); + DestroyWindow(hButton); + DestroyWindow(hCombo); +} + static void test_listbox_styles(DWORD cb_style) { BOOL (WINAPI *pGetComboBoxInfo)(HWND, PCOMBOBOXINFO); @@ -606,6 +708,8 @@ START_TEST(combo) test_changesize(CBS_DROPDOWN); test_changesize(CBS_DROPDOWNLIST); test_editselection(); + test_editselection_focus(CBS_SIMPLE); + test_editselection_focus(CBS_DROPDOWN); test_listbox_styles(CBS_SIMPLE); test_listbox_styles(CBS_DROPDOWN); test_listbox_styles(CBS_DROPDOWNLIST);