user32/tests: Add tests for EM_SETSEL and getting/losing focus in combo boxes

Hugh McMaster hugh.mcmaster at outlook.com
Thu Dec 31 05:08:46 CST 2015


---
 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);
-- 
1.9.1




More information about the wine-patches mailing list