Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/comctl32/tests/tab.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+)
diff --git a/dlls/comctl32/tests/tab.c b/dlls/comctl32/tests/tab.c index 0bfbb38a58..9823915724 100644 --- a/dlls/comctl32/tests/tab.c +++ b/dlls/comctl32/tests/tab.c @@ -79,6 +79,7 @@ static void TabCheckSetSize(HWND hwnd, INT set_width, INT set_height, INT exp_wi static HFONT hFont; static DRAWITEMSTRUCT g_drawitem; static HWND parent_wnd; +static LRESULT tcn_selchanging_result;
static struct msg_sequence *sequences[NUM_MSG_SEQUENCES];
@@ -264,6 +265,22 @@ static const struct message rbuttonup_seq[] = { { 0 } };
+static const struct message full_selchange_parent_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, TCN_SELCHANGING }, + { WM_NOTIFY, sent|id, 0, 0, TCN_SELCHANGE }, + { 0 } +}; + +static const struct message selchanging_parent_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, TCN_SELCHANGING }, + { 0 } +}; + +static const struct message selchange_parent_seq[] = { + { WM_NOTIFY, sent|id, 0, 0, TCN_SELCHANGE }, + { 0 } +}; + static HWND create_tabcontrol (DWORD style, DWORD mask) { @@ -322,6 +339,8 @@ static LRESULT WINAPI parentWindowProcess(HWND hwnd, UINT message, WPARAM wParam if (defwndproc_counter) msg.flags |= defwinproc; msg.wParam = wParam; msg.lParam = lParam; + if (message == WM_NOTIFY && lParam) + msg.id = ((NMHDR*)lParam)->code; add_message(sequences, PARENT_SEQ_INDEX, &msg); }
@@ -329,6 +348,13 @@ static LRESULT WINAPI parentWindowProcess(HWND hwnd, UINT message, WPARAM wParam if (message == WM_DRAWITEM) g_drawitem = *(DRAWITEMSTRUCT*)lParam;
+ if (message == WM_NOTIFY) + { + NMHDR *nmhdr = (NMHDR *)lParam; + if (nmhdr && nmhdr->code == TCN_SELCHANGING) + return tcn_selchanging_result; + } + defwndproc_counter++; ret = DefWindowProcA(hwnd, message, wParam, lParam); defwndproc_counter--; @@ -1443,6 +1469,73 @@ static void init_functions(void) #undef X }
+static void test_TCN_SELCHANGING(void) +{ + const INT nTabs = 5; + HWND hTab; + INT ret; + + hTab = createFilledTabControl(parent_wnd, WS_CHILD|TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); + ok(hTab != NULL, "Failed to create tab control\n"); + + /* Initially first tab is focused. */ + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(ret == 0, "Unexpected tab focus %d.\n", ret); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + /* Setting focus to currently focused item should do nothing. */ + ret = SendMessageA(hTab, TCM_SETCURFOCUS, 0, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Set focus to focused tab sequence", FALSE); + + /* Allow selection change. */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + tcn_selchanging_result = 0; + ret = SendMessageA(hTab, TCM_SETCURFOCUS, nTabs - 1, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + + ok_sequence(sequences, PARENT_SEQ_INDEX, full_selchange_parent_seq, "Focus change allowed sequence", FALSE); + + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(ret == nTabs - 1, "Unexpected focused tab %d.\n", ret); + ret = SendMessageA(hTab, TCM_GETCURSEL, 0, 0); + ok(ret == nTabs - 1, "Unexpected selected tab %d.\n", ret); + + /* Forbid selection change. */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + tcn_selchanging_result = 1; + ret = SendMessageA(hTab, TCM_SETCURFOCUS, 0, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + + ok_sequence(sequences, PARENT_SEQ_INDEX, selchanging_parent_seq, "Focus change disallowed sequence", FALSE); + + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); +todo_wine + ok(ret == nTabs - 1, "Unexpected focused tab %d.\n", ret); + ret = SendMessageA(hTab, TCM_GETCURSEL, 0, 0); +todo_wine + ok(ret == nTabs - 1, "Unexpected selected tab %d.\n", ret); + + /* Removing focus sends only TCN_SELCHANGE */ + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + ret = SendMessageA(hTab, TCM_SETCURFOCUS, -1, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + + ok_sequence(sequences, PARENT_SEQ_INDEX, selchange_parent_seq, "Remove focus sequence", FALSE); + + ret = SendMessageA(hTab, TCM_GETCURFOCUS, 0, 0); + ok(ret == -1, "Unexpected focused tab %d.\n", ret); + + tcn_selchanging_result = 0; + + DestroyWindow(hTab); +} + START_TEST(tab) { LOGFONTA logfont; @@ -1481,6 +1574,7 @@ START_TEST(tab) test_TCS_OWNERDRAWFIXED(); test_WM_CONTEXTMENU(); test_create(); + test_TCN_SELCHANGING();
DestroyWindow(parent_wnd); }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/comctl32/tests/tab.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/dlls/comctl32/tests/tab.c b/dlls/comctl32/tests/tab.c index 9823915724..8a5555343c 100644 --- a/dlls/comctl32/tests/tab.c +++ b/dlls/comctl32/tests/tab.c @@ -319,7 +319,7 @@ create_tabcontrol (DWORD style, DWORD mask) return handle; }
-static LRESULT WINAPI parentWindowProcess(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +static LRESULT WINAPI parent_wnd_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { static LONG defwndproc_counter = 0; struct message msg = { 0 }; @@ -367,7 +367,7 @@ static BOOL registerParentWindowClass(void) WNDCLASSA cls;
cls.style = 0; - cls.lpfnWndProc = parentWindowProcess; + cls.lpfnWndProc = parent_wnd_proc; cls.cbClsExtra = 0; cls.cbWndExtra = 0; cls.hInstance = GetModuleHandleA(NULL); @@ -389,7 +389,7 @@ static HWND createParentWindow(void) GetDesktopWindow(), NULL, GetModuleHandleA(NULL), NULL); }
-static LRESULT WINAPI tabSubclassProcess(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) +static LRESULT WINAPI tab_subclass_proc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA); static LONG defwndproc_counter = 0; @@ -435,7 +435,7 @@ static HWND createFilledTabControl(HWND parent_wnd, DWORD style, DWORD mask, INT rect.bottom, parent_wnd, NULL, NULL, 0); ok(tabHandle != NULL, "failed to create tab wnd\n");
- oldproc = (WNDPROC)SetWindowLongPtrA(tabHandle, GWLP_WNDPROC, (LONG_PTR)tabSubclassProcess); + oldproc = (WNDPROC)SetWindowLongPtrA(tabHandle, GWLP_WNDPROC, (LONG_PTR)tab_subclass_proc); SetWindowLongPtrA(tabHandle, GWLP_USERDATA, (LONG_PTR)oldproc);
tcNewTab.mask = mask;
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/comctl32/tests/tab.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
diff --git a/dlls/comctl32/tests/tab.c b/dlls/comctl32/tests/tab.c index 8a5555343c..aa411b500e 100644 --- a/dlls/comctl32/tests/tab.c +++ b/dlls/comctl32/tests/tab.c @@ -974,8 +974,9 @@ static void test_getset_item(void) static void test_getset_tooltips(void) { char toolTipText[32] = "ToolTip Text Test"; + HWND hTab, toolTip, hwnd; const INT nTabs = 5; - HWND hTab, toolTip; + int ret;
hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); ok(hTab != NULL, "Failed to create tab control\n"); @@ -983,16 +984,22 @@ static void test_getset_tooltips(void) flush_sequences(sequences, NUM_MSG_SEQUENCES);
toolTip = create_tooltip(hTab, toolTipText); - SendMessageA(hTab, TCM_SETTOOLTIPS, (LPARAM)toolTip, 0); - ok(toolTip == (HWND)SendMessageA(hTab, TCM_GETTOOLTIPS, 0,0), "ToolTip was set incorrectly.\n"); + ret = SendMessageA(hTab, TCM_SETTOOLTIPS, (WPARAM)toolTip, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + hwnd = (HWND)SendMessageA(hTab, TCM_GETTOOLTIPS, 0, 0); + ok(toolTip == hwnd, "Unexpected tooltip window.\n");
- SendMessageA(hTab, TCM_SETTOOLTIPS, 0, 0); - ok(!SendMessageA(hTab, TCM_GETTOOLTIPS, 0,0), "ToolTip was set incorrectly.\n"); + ret = SendMessageA(hTab, TCM_SETTOOLTIPS, 0, 0); + ok(ret == 0, "Unexpected ret value %d.\n", ret); + hwnd = (HWND)SendMessageA(hTab, TCM_GETTOOLTIPS, 0, 0); + ok(hwnd == NULL, "Unexpected tooltip window.\n"); + ok(IsWindow(toolTip), "Expected tooltip window to be alive.\n");
ok_sequence(sequences, TAB_SEQ_INDEX, getset_tooltip_seq, "Getset tooltip test sequence", TRUE); ok_sequence(sequences, PARENT_SEQ_INDEX, getset_tooltip_parent_seq, "Getset tooltip test parent sequence", TRUE);
DestroyWindow(hTab); + DestroyWindow(toolTip); }
static void test_misc(void)
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/comctl32/tests/tab.c | 157 +++++++--------------------------------------- 1 file changed, 24 insertions(+), 133 deletions(-)
diff --git a/dlls/comctl32/tests/tab.c b/dlls/comctl32/tests/tab.c index aa411b500e..a54dbb5de0 100644 --- a/dlls/comctl32/tests/tab.c +++ b/dlls/comctl32/tests/tab.c @@ -83,81 +83,15 @@ static LRESULT tcn_selchanging_result;
static struct msg_sequence *sequences[NUM_MSG_SEQUENCES];
-static const struct message add_tab_to_parent[] = { - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent|optional }, - { WM_NOTIFYFORMAT, sent|defwinproc }, - { WM_QUERYUISTATE, sent|wparam|lparam|defwinproc|optional, 0, 0 }, - { WM_PARENTNOTIFY, sent|defwinproc }, - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent|optional }, - { 0 } -}; - -static const struct message add_tab_to_parent_interactive[] = { - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent }, - { WM_NOTIFYFORMAT, sent|defwinproc }, - { WM_QUERYUISTATE, sent|wparam|lparam|defwinproc, 0, 0 }, - { WM_PARENTNOTIFY, sent|defwinproc }, - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent }, - { TCM_INSERTITEMA, sent }, - { WM_SHOWWINDOW, sent}, - { WM_WINDOWPOSCHANGING, sent}, - { WM_WINDOWPOSCHANGING, sent}, - { WM_NCACTIVATE, sent}, - { WM_ACTIVATE, sent}, - { WM_IME_SETCONTEXT, sent|defwinproc|optional}, - { WM_IME_NOTIFY, sent|defwinproc|optional}, - { WM_SETFOCUS, sent|defwinproc}, - { WM_WINDOWPOSCHANGED, sent}, - { WM_SIZE, sent}, - { WM_MOVE, sent}, - { 0 } -}; - -static const struct message add_tab_control_parent_seq[] = { - { WM_NOTIFYFORMAT, sent }, - { WM_QUERYUISTATE, sent|wparam|lparam|optional, 0, 0 }, - { 0 } -}; - -static const struct message add_tab_control_parent_seq_interactive[] = { - { WM_NOTIFYFORMAT, sent }, - { WM_QUERYUISTATE, sent|wparam|lparam, 0, 0 }, - { WM_WINDOWPOSCHANGING, sent|optional}, - { WM_NCACTIVATE, sent}, - { WM_ACTIVATE, sent}, - { WM_WINDOWPOSCHANGING, sent|optional}, - { WM_KILLFOCUS, sent}, - { WM_IME_SETCONTEXT, sent|optional}, - { WM_IME_NOTIFY, sent|optional}, - { 0 } -}; - static const struct message empty_sequence[] = { { 0 } };
-static const struct message get_item_count_seq[] = { - { TCM_GETITEMCOUNT, sent|wparam|lparam, 0, 0 }, - { 0 } -}; - static const struct message get_row_count_seq[] = { { TCM_GETROWCOUNT, sent|wparam|lparam, 0, 0 }, { 0 } };
-static const struct message get_item_rect_seq[] = { - { TCM_GETITEMRECT, sent }, - { TCM_GETITEMRECT, sent }, - { 0 } -}; - static const struct message getset_cur_focus_seq[] = { { TCM_SETCURFOCUS, sent|lparam, 0 }, { TCM_GETCURFOCUS, sent|wparam|lparam, 0, 0 }, @@ -1002,68 +936,6 @@ static void test_getset_tooltips(void) DestroyWindow(toolTip); }
-static void test_misc(void) -{ - const INT nTabs = 5; - HWND hTab; - RECT rTab; - INT nTabsRetrieved; - INT rowCount; - INT dpi; - HDC hdc; - - ok(parent_wnd != NULL, "no parent window!\n"); - flush_sequences(sequences, NUM_MSG_SEQUENCES); - - hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); - ok(hTab != NULL, "Failed to create tab control\n"); - - if(!winetest_interactive) - ok_sequence(sequences, TAB_SEQ_INDEX, add_tab_to_parent, - "Tab sequence, after adding tab control to parent", TRUE); - else - ok_sequence(sequences, TAB_SEQ_INDEX, add_tab_to_parent_interactive, - "Tab sequence, after adding tab control to parent", TRUE); - - if(!winetest_interactive) - ok_sequence(sequences, PARENT_SEQ_INDEX, add_tab_control_parent_seq, - "Parent after sequence, adding tab control to parent", TRUE); - else - ok_sequence(sequences, PARENT_SEQ_INDEX, add_tab_control_parent_seq_interactive, - "Parent after sequence, adding tab control to parent", TRUE); - - flush_sequences(sequences, NUM_MSG_SEQUENCES); - ok(SendMessageA(hTab, TCM_SETMINTABWIDTH, 0, -1) > 0, "TCM_SETMINTABWIDTH returned < 0\n"); - ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Set minTabWidth test parent sequence", FALSE); - - /* Testing GetItemCount */ - flush_sequences(sequences, NUM_MSG_SEQUENCES); - nTabsRetrieved = SendMessageA(hTab, TCM_GETITEMCOUNT, 0, 0); - expect(nTabs, nTabsRetrieved); - ok_sequence(sequences, TAB_SEQ_INDEX, get_item_count_seq, "Get itemCount test sequence", FALSE); - ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Getset itemCount test parent sequence", FALSE); - - /* Testing GetRowCount */ - flush_sequences(sequences, NUM_MSG_SEQUENCES); - rowCount = SendMessageA(hTab, TCM_GETROWCOUNT, 0, 0); - expect(1, rowCount); - ok_sequence(sequences, TAB_SEQ_INDEX, get_row_count_seq, "Get rowCount test sequence", FALSE); - ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Get rowCount test parent sequence", FALSE); - - /* Testing GetItemRect */ - flush_sequences(sequences, NUM_MSG_SEQUENCES); - ok(SendMessageA(hTab, TCM_GETITEMRECT, 0, (LPARAM)&rTab), "GetItemRect failed.\n"); - - hdc = GetDC(hTab); - dpi = GetDeviceCaps(hdc, LOGPIXELSX); - ReleaseDC(hTab, hdc); - CHECKSIZE(hTab, dpi, -1 , "Default Width"); - ok_sequence(sequences, TAB_SEQ_INDEX, get_item_rect_seq, "Get itemRect test sequence", FALSE); - ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Get itemRect test parent sequence", FALSE); - - DestroyWindow(hTab); -} - static void test_adjustrect(void) { HWND hTab; @@ -1543,6 +1415,28 @@ todo_wine DestroyWindow(hTab); }
+static void test_TCM_GETROWCOUNT(void) +{ + const INT nTabs = 5; + HWND hTab; + INT count; + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + hTab = createFilledTabControl(parent_wnd, TCS_FIXEDWIDTH, TCIF_TEXT|TCIF_IMAGE, nTabs); + ok(hTab != NULL, "Failed to create tab control\n"); + + flush_sequences(sequences, NUM_MSG_SEQUENCES); + + count = SendMessageA(hTab, TCM_GETROWCOUNT, 0, 0); + ok(count == 1, "Unexpected row count %d.\n", count); + + ok_sequence(sequences, TAB_SEQ_INDEX, get_row_count_seq, "Get rowCount test sequence", FALSE); + ok_sequence(sequences, PARENT_SEQ_INDEX, empty_sequence, "Get rowCount test parent sequence", FALSE); + + DestroyWindow(hTab); +} + START_TEST(tab) { LOGFONTA logfont; @@ -1556,23 +1450,19 @@ START_TEST(tab)
init_functions();
- test_width(); - init_msg_sequences(sequences, NUM_MSG_SEQUENCES);
parent_wnd = createParentWindow(); ok(parent_wnd != NULL, "Failed to create parent window!\n");
+ test_width(); test_curfocus(); test_cursel(); test_extendedstyle(); test_unicodeformat(); test_getset_item(); test_getset_tooltips(); - test_misc(); - test_adjustrect(); - test_insert_focus(); test_delete_focus(); test_delete_selection(); @@ -1582,6 +1472,7 @@ START_TEST(tab) test_WM_CONTEXTMENU(); test_create(); test_TCN_SELCHANGING(); + test_TCM_GETROWCOUNT();
DestroyWindow(parent_wnd); }
Signed-off-by: Nikolay Sivov nsivov@codeweavers.com --- dlls/comctl32/tests/treeview.c | 10 ---------- dlls/comctl32/tests/v6util.h | 6 ++++++ 2 files changed, 6 insertions(+), 10 deletions(-)
diff --git a/dlls/comctl32/tests/treeview.c b/dlls/comctl32/tests/treeview.c index 51404af089..e4abc4a621 100644 --- a/dlls/comctl32/tests/treeview.c +++ b/dlls/comctl32/tests/treeview.c @@ -1342,9 +1342,6 @@ static LRESULT CALLBACK parent_wnd_proc(HWND hWnd, UINT message, WPARAM wParam, break; }
- case WM_DESTROY: - PostQuitMessage(0); - break; }
defwndproc_counter++; @@ -2760,11 +2757,4 @@ START_TEST(treeview) test_WM_GETDLGCODE();
unload_v6_module(ctx_cookie, hCtx); - - PostMessageA(hMainWnd, WM_CLOSE, 0, 0); - while(GetMessageA(&msg, 0, 0, 0)) - { - TranslateMessage(&msg); - DispatchMessageA(&msg); - } } diff --git a/dlls/comctl32/tests/v6util.h b/dlls/comctl32/tests/v6util.h index b78290a50a..626f6e6125 100644 --- a/dlls/comctl32/tests/v6util.h +++ b/dlls/comctl32/tests/v6util.h @@ -70,6 +70,7 @@ static BOOL load_v6_module(ULONG_PTR *pcookie, HANDLE *hCtx) { ACTCTX_SECTION_KEYED_DATA data; DWORD written; + HMODULE hmod; ACTCTXA ctx; HANDLE file; BOOL ret; @@ -103,6 +104,8 @@ static BOOL load_v6_module(ULONG_PTR *pcookie, HANDLE *hCtx) *hCtx = CreateActCtxA(&ctx); ok(*hCtx != 0, "Expected context handle\n");
+ hmod = GetModuleHandleA("comctl32.dll"); + ret = ActivateActCtx(*hCtx, pcookie); ok(ret, "Failed to activate context, error %d.\n", GetLastError());
@@ -117,7 +120,10 @@ static BOOL load_v6_module(ULONG_PTR *pcookie, HANDLE *hCtx) "comctl32.dll", &data); ok(ret, "failed to find comctl32.dll in active context, %u\n", GetLastError()); if (ret) + { + FreeLibrary(hmod); LoadLibraryA("comctl32.dll"); + }
return ret; }