ReactOS  0.4.13-dev-687-g023794c
static.c
Go to the documentation of this file.
1 /* Unit test suite for static controls.
2  *
3  * Copyright 2007 Google (Mikolaj Zalewski)
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Lesser General Public
7  * License as published by the Free Software Foundation; either
8  * version 2.1 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  * Lesser General Public License for more details.
14  *
15  * You should have received a copy of the GNU Lesser General Public
16  * License along with this library; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
18  */
19 
20 #include <stdarg.h>
21 #include <stdio.h>
22 
23 #define STRICT
24 #define WIN32_LEAN_AND_MEAN
25 #include <windows.h>
26 
27 #include "wine/test.h"
28 
29 #define TODO_COUNT 1
30 
31 #define CTRL_ID 1995
32 
33 static HWND hMainWnd;
34 
35 #define expect_eq(expr, value, type, fmt) { type val = expr; ok(val == (value), #expr " expected " fmt " got " fmt "\n", (value), val); }
36 
37 static int g_nReceivedColorStatic = 0;
38 
39 /* try to make sure pending X events have been processed before continuing */
40 static void flush_events(void)
41 {
42  MSG msg;
43  int diff = 200;
44  int min_timeout = 100;
45  DWORD time = GetTickCount() + diff;
46 
47  while (diff > 0)
48  {
49  if (MsgWaitForMultipleObjects( 0, NULL, FALSE, min_timeout, QS_ALLINPUT ) == WAIT_TIMEOUT) break;
50  while (PeekMessageA( &msg, 0, 0, 0, PM_REMOVE )) DispatchMessageA( &msg );
51  diff = time - GetTickCount();
52  }
53 }
54 
56 {
57  return CreateWindowA("static", "Test", WS_VISIBLE|WS_CHILD|style, 5, 5, 100, 100, hMainWnd, (HMENU)CTRL_ID, NULL, 0);
58 }
59 
61 {
62  switch (msg)
63  {
64  case WM_CTLCOLORSTATIC:
65  {
66  HDC hdc = (HDC)wparam;
67  HRGN hrgn = CreateRectRgn(0, 0, 1, 1);
68  ok(GetClipRgn(hdc, hrgn) == 1, "Static controls during a WM_CTLCOLORSTATIC must have a clipping region\n");
72  }
73  break;
74  }
75 
76  return DefWindowProcA(hwnd, msg, wparam, lparam);
77 }
78 
79 static void test_updates(int style, int flags)
80 {
81  RECT r1 = {20, 20, 30, 30};
82  HWND hStatic = build_static(style);
83  int exp;
84 
85  flush_events();
86  trace("Testing style 0x%x\n", style);
88  /* during each update parent WndProc will test the WM_CTLCOLORSTATIC message */
93  InvalidateRect(hStatic, &r1, FALSE);
94  UpdateWindow(hStatic);
95  InvalidateRect(hStatic, NULL, FALSE);
96  UpdateWindow(hStatic);
97 
98  if( (style & SS_TYPEMASK) == SS_BITMAP) {
99  HDC hdc = GetDC( hStatic);
100  COLORREF colour = GetPixel( hdc, 10, 10);
101  ok ( colour != 0, "pixel should NOT be painted black!\n");
102  ReleaseDC(hStatic, hdc);
103  }
104  if (style != SS_ETCHEDHORZ && style != SS_ETCHEDVERT)
105  exp = 4;
106  else
107  exp = 1; /* SS_ETCHED* seems to send WM_CTLCOLORSTATIC only sometimes */
108 
109  if (flags & TODO_COUNT)
111  else if ((style & SS_TYPEMASK) == SS_ICON || (style & SS_TYPEMASK) == SS_BITMAP)
112  ok( g_nReceivedColorStatic == exp, "expected %u got %u\n", exp, g_nReceivedColorStatic );
113  else
114  expect_eq(g_nReceivedColorStatic, exp, int, "%d");
115  DestroyWindow(hStatic);
116 }
117 
118 static void test_set_text(void)
119 {
120  HWND hStatic = build_static(SS_SIMPLE);
121  char buffA[10];
122 
123  GetWindowTextA(hStatic, buffA, sizeof(buffA));
124  ok(!strcmp(buffA, "Test"), "got wrong text %s\n", buffA);
125 
126  SetWindowTextA(hStatic, NULL);
127  GetWindowTextA(hStatic, buffA, sizeof(buffA));
128  ok(buffA[0] == 0, "got wrong text %s\n", buffA);
129 
130  DestroyWindow(hStatic);
131 }
132 
133 START_TEST(static)
134 {
135  static const char szClassName[] = "testclass";
136  WNDCLASSEXA wndclass;
137 
138  wndclass.cbSize = sizeof(wndclass);
139  wndclass.style = CS_HREDRAW | CS_VREDRAW;
140  wndclass.lpfnWndProc = WndProc;
141  wndclass.cbClsExtra = 0;
142  wndclass.cbWndExtra = 0;
143  wndclass.hInstance = GetModuleHandleA(NULL);
144  wndclass.hIcon = LoadIconA(NULL, (LPCSTR)IDI_APPLICATION);
146  wndclass.hCursor = LoadCursorA(NULL, (LPCSTR)IDC_ARROW);
148  wndclass.lpszClassName = szClassName;
149  wndclass.lpszMenuName = NULL;
150  RegisterClassExA(&wndclass);
151 
154 
155  test_updates(0, 0);
157  test_updates(SS_ICON, 0);
164  test_set_text();
165 
167 }
HGDIOBJ WINAPI GetStockObject(_In_ int)
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
UINT style
Definition: winuser.h:3176
#define trace(...)
Definition: kmt_test.h:217
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)
LPCSTR lpszMenuName
Definition: winuser.h:3184
static void test_updates(int style, int flags)
Definition: static.c:79
int WINAPI GetWindowTextA(HWND hWnd, LPSTR lpString, int nMaxCount)
Definition: window.c:1296
HCURSOR hCursor
Definition: winuser.h:3182
WNDPROC lpfnWndProc
Definition: winuser.h:3177
#define expect_eq(expr, value, type, fmt)
Definition: static.c:35
HDC WINAPI GetDC(_In_opt_ HWND)
LPCSTR lpszClassName
Definition: winuser.h:3185
#define SS_BLACKRECT
Definition: pedump.c:696
static void test_set_text(void)
Definition: static.c:118
#define WM_CTLCOLORSTATIC
Definition: winuser.h:1754
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define SS_TYPEMASK
Definition: winuser.h:362
static HDC
Definition: imagelist.c:92
#define CALLBACK
Definition: compat.h:27
static void flush_events(void)
Definition: static.c:40
static DNS_RECORDW r1
Definition: record.c:37
BOOL WINAPI UpdateWindow(_In_ HWND)
DWORD WINAPI GetTickCount(VOID)
Definition: time.c:445
#define CS_HREDRAW
Definition: winuser.h:648
BOOL WINAPI DeleteObject(_In_ HGDIOBJ)
#define WHITE_BRUSH
Definition: wingdi.h:901
#define IDI_APPLICATION
Definition: winuser.h:699
UINT_PTR WPARAM
Definition: windef.h:207
#define WS_CHILD
Definition: pedump.c:617
#define TODO_COUNT
Definition: static.c:29
HICON hIconSm
Definition: winuser.h:3186
__u16 time
Definition: mkdosfs.c:366
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
BOOL WINAPI PeekMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT, _In_ UINT)
DWORD GetPixel(LPDIRECTDRAWSURFACE7 Surface, UINT x, UINT y)
Definition: blt.cpp:2
BOOL WINAPI DestroyWindow(_In_ HWND)
HICON WINAPI LoadIconA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2029
#define SS_BITMAP
Definition: pedump.c:704
HINSTANCE hInstance
Definition: winuser.h:3180
static HWND build_static(DWORD style)
Definition: static.c:55
static UINT WPARAM LPARAM lparam
Definition: combo.c:716
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define ok(value,...)
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4216
smooth NULL
Definition: ftsmooth.c:416
LONG_PTR LPARAM
Definition: windef.h:208
UINT cbSize
Definition: winuser.h:3175
const char * LPCSTR
Definition: xmlstorage.h:183
#define SW_SHOW
Definition: winuser.h:769
HBRUSH hbrBackground
Definition: winuser.h:3183
HRGN WINAPI CreateRectRgn(_In_ int, _In_ int, _In_ int, _In_ int)
#define BLACK_BRUSH
Definition: wingdi.h:895
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
Definition: static.c:60
#define CTRL_ID
Definition: static.c:31
#define CS_VREDRAW
Definition: winuser.h:653
#define SS_ETCHEDHORZ
Definition: winuser.h:343
static const WCHAR szClassName[]
Definition: clipbrd.c:11
BOOL WINAPI SetWindowTextA(_In_ HWND, _In_opt_ LPCSTR)
DWORD COLORREF
Definition: windef.h:285
BOOL WINAPI InvalidateRect(_In_opt_ HWND, _In_opt_ LPCRECT, _In_ BOOL)
unsigned long DWORD
Definition: ntddk_ex.h:95
int cbWndExtra
Definition: winuser.h:3179
GLbitfield flags
Definition: glext.h:7161
#define WAIT_TIMEOUT
Definition: dderror.h:14
DWORD WINAPI MsgWaitForMultipleObjects(_In_ DWORD nCount, _In_reads_opt_(nCount) CONST HANDLE *pHandles, _In_ BOOL fWaitAll, _In_ DWORD dwMilliseconds, _In_ DWORD dwWakeMask)
HICON hIcon
Definition: winuser.h:3181
#define todo_wine
Definition: test.h:154
HDC hdc
Definition: main.c:9
static HRGN hrgn
Definition: win.c:55
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:821
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
ATOM WINAPI RegisterClassExA(_In_ CONST WNDCLASSEXA *)
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2059
START_TEST(static)
Definition: static.c:138
#define SS_CENTERIMAGE
Definition: winuser.h:339
static HWND hMainWnd
Definition: static.c:33
#define SS_SIMPLE
Definition: pedump.c:702
int cbClsExtra
Definition: winuser.h:3178
#define QS_ALLINPUT
Definition: winuser.h:874
#define SS_ETCHEDVERT
Definition: winuser.h:344
unsigned int UINT
Definition: ndis.h:50
DWORD exp
Definition: msg.c:15681
static int g_nReceivedColorStatic
Definition: static.c:37
#define msg(x)
Definition: auth_time.c:54
#define IDC_ARROW
Definition: winuser.h:682
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
int strcmp(const char *String1, const char *String2)
Definition: utclib.c:469
int WINAPI GetClipRgn(_In_ HDC, _In_ HRGN)
#define PM_REMOVE
Definition: winuser.h:1182
LONG_PTR LRESULT
Definition: windef.h:209
Arabic default style
Definition: afstyles.h:93
#define WS_VISIBLE
Definition: pedump.c:620
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:60
#define SS_ICON
Definition: pedump.c:695
#define SS_WHITERECT
Definition: pedump.c:698
static UINT WPARAM wparam
Definition: combo.c:716