From c170a483232f8ecf89e0d12408bd7a70730fdf3c Mon Sep 17 00:00:00 2001 From: Nikolay Sivov Date: Thu, 14 Dec 2017 09:50:21 +0300 Subject: [PATCH] comctl32/tests: Add Static control tests. Signed-off-by: Nikolay Sivov Signed-off-by: Alexandre Julliard --- dlls/comctl32/tests/Makefile.in | 1 + dlls/comctl32/tests/static.c | 177 ++++++++++++++++++++++++++++++++ 2 files changed, 178 insertions(+) create mode 100644 dlls/comctl32/tests/static.c diff --git a/dlls/comctl32/tests/Makefile.in b/dlls/comctl32/tests/Makefile.in index ad298f8a0de..36d77f0e1c7 100644 --- a/dlls/comctl32/tests/Makefile.in +++ b/dlls/comctl32/tests/Makefile.in @@ -18,6 +18,7 @@ C_SRCS = \ progress.c \ propsheet.c \ rebar.c \ + static.c \ status.c \ subclass.c \ syslink.c \ diff --git a/dlls/comctl32/tests/static.c b/dlls/comctl32/tests/static.c new file mode 100644 index 00000000000..890fcf5b966 --- /dev/null +++ b/dlls/comctl32/tests/static.c @@ -0,0 +1,177 @@ +/* Unit test suite for static controls. + * + * Copyright 2007 Google (Mikolaj Zalewski) + * + * 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include +#include + +#define STRICT +#define WIN32_LEAN_AND_MEAN +#include + +#include "wine/test.h" + +#include "v6util.h" + +#define TODO_COUNT 1 + +#define CTRL_ID 1995 + +static HWND hMainWnd; +static int g_nReceivedColorStatic; + +/* try to make sure pending X events have been processed before continuing */ +static void flush_events(void) +{ + MSG msg; + int diff = 200; + int min_timeout = 100; + DWORD time = GetTickCount() + diff; + + while (diff > 0) + { + if (MsgWaitForMultipleObjects( 0, NULL, FALSE, min_timeout, QS_ALLINPUT ) == WAIT_TIMEOUT) break; + while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg ); + diff = time - GetTickCount(); + } +} + +static HWND create_static(DWORD style) +{ + return CreateWindowA("static", "Test", WS_VISIBLE|WS_CHILD|style, 5, 5, 100, 100, hMainWnd, (HMENU)CTRL_ID, NULL, 0); +} + +static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) +{ + switch (msg) + { + case WM_CTLCOLORSTATIC: + { + HDC hdc = (HDC)wparam; + HRGN hrgn = CreateRectRgn(0, 0, 1, 1); + ok(GetClipRgn(hdc, hrgn) == 1, "Static controls during a WM_CTLCOLORSTATIC must have a clipping region\n"); + DeleteObject(hrgn); + g_nReceivedColorStatic++; + return (LRESULT) GetStockObject(BLACK_BRUSH); + } + break; + } + + return DefWindowProcA(hwnd, msg, wparam, lparam); +} + +static void test_updates(int style, int flags) +{ + HWND hStatic = create_static(style); + RECT r1 = {20, 20, 30, 30}; + int exp; + + flush_events(); + g_nReceivedColorStatic = 0; + /* during each update parent WndProc will test the WM_CTLCOLORSTATIC message */ + InvalidateRect(hMainWnd, NULL, FALSE); + UpdateWindow(hMainWnd); + InvalidateRect(hMainWnd, &r1, FALSE); + UpdateWindow(hMainWnd); + InvalidateRect(hStatic, &r1, FALSE); + UpdateWindow(hStatic); + InvalidateRect(hStatic, NULL, FALSE); + UpdateWindow(hStatic); + + if ((style & SS_TYPEMASK) == SS_BITMAP) + { + HDC hdc = GetDC(hStatic); + COLORREF colour = GetPixel(hdc, 10, 10); + todo_wine + ok(colour == 0, "Unexpected pixel color.\n"); + ReleaseDC(hStatic, hdc); + } + + if (style != SS_ETCHEDHORZ && style != SS_ETCHEDVERT) + exp = 4; + else + exp = 1; /* SS_ETCHED* seems to send WM_CTLCOLORSTATIC only sometimes */ + + if (flags & TODO_COUNT) + todo_wine + ok(g_nReceivedColorStatic == exp, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + else if ((style & SS_TYPEMASK) == SS_ICON || (style & SS_TYPEMASK) == SS_BITMAP) + ok(g_nReceivedColorStatic == exp, "Unexpected %u got %u\n", exp, g_nReceivedColorStatic); + else + ok(g_nReceivedColorStatic == exp, "Unexpected WM_CTLCOLORSTATIC value %d\n", g_nReceivedColorStatic); + DestroyWindow(hStatic); +} + +static void test_set_text(void) +{ + HWND hStatic = create_static(SS_SIMPLE); + char buffA[10]; + + GetWindowTextA(hStatic, buffA, sizeof(buffA)); + ok(!strcmp(buffA, "Test"), "got wrong text %s\n", buffA); + + SetWindowTextA(hStatic, NULL); + GetWindowTextA(hStatic, buffA, sizeof(buffA)); + ok(buffA[0] == 0, "got wrong text %s\n", buffA); + + DestroyWindow(hStatic); +} + +START_TEST(static) +{ + static const char classname[] = "testclass"; + WNDCLASSEXA wndclass; + ULONG_PTR ctx_cookie; + HANDLE hCtx; + + if (!load_v6_module(&ctx_cookie, &hCtx)) + return; + + wndclass.cbSize = sizeof(wndclass); + wndclass.style = CS_HREDRAW | CS_VREDRAW; + wndclass.lpfnWndProc = WndProc; + wndclass.cbClsExtra = 0; + wndclass.cbWndExtra = 0; + wndclass.hInstance = GetModuleHandleA(NULL); + wndclass.hIcon = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION); + wndclass.hIconSm = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION); + wndclass.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW); + wndclass.hbrBackground = GetStockObject(WHITE_BRUSH); + wndclass.lpszClassName = classname; + wndclass.lpszMenuName = NULL; + RegisterClassExA(&wndclass); + + hMainWnd = CreateWindowA(classname, "Test", WS_OVERLAPPEDWINDOW, 0, 0, 500, 500, NULL, NULL, + GetModuleHandleA(NULL), NULL); + ShowWindow(hMainWnd, SW_SHOW); + + test_updates(0, 0); + test_updates(SS_SIMPLE, 0); + test_updates(SS_ICON, 0); + test_updates(SS_BITMAP, 0); + test_updates(SS_BITMAP | SS_CENTERIMAGE, 0); + test_updates(SS_BLACKRECT, TODO_COUNT); + test_updates(SS_WHITERECT, TODO_COUNT); + test_updates(SS_ETCHEDHORZ, TODO_COUNT); + test_updates(SS_ETCHEDVERT, TODO_COUNT); + test_set_text(); + + DestroyWindow(hMainWnd); + + unload_v6_module(ctx_cookie, hCtx); +}