1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for EmptyClipboard
5 * PROGRAMMERS: Giannis Adamopoulos
6 */
7
8 #include "precomp.h"
9
10 static HWND hWnd1, hWnd2;
11
12 static CRITICAL_SECTION CritSect;
13
14 /* FIXME: test for HWND_TOP, etc...*/
get_iwnd(HWND hWnd)15 static int get_iwnd(HWND hWnd)
16 {
17 if(hWnd == hWnd1) return 1;
18 else if(hWnd2 && hWnd == hWnd2) return 2;
19 else return 0;
20 }
21
ClipTestProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)22 LRESULT CALLBACK ClipTestProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
23 {
24 int iwnd = get_iwnd(hWnd);
25
26 if(message > WM_USER || !iwnd || IsDWmMsg(message) || IseKeyMsg(message))
27 return DefWindowProc(hWnd, message, wParam, lParam);
28
29 switch(message)
30 {
31 case WM_GETICON :
32 case WM_SETICON:
33 break;
34 case WM_DESTROYCLIPBOARD:
35 Sleep(1000);
36 default:
37 EnterCriticalSection(&CritSect);
38 RECORD_MESSAGE(iwnd, message, SENT, 0,0);
39 LeaveCriticalSection(&CritSect);
40 }
41 return DefWindowProc(hWnd, message, wParam, lParam);
42 }
43
RecordAndDispatch(MSG * pmsg)44 static void RecordAndDispatch(MSG* pmsg)
45 {
46 int iwnd = get_iwnd(pmsg->hwnd);
47 if(!(pmsg->message > WM_USER || !iwnd || IsDWmMsg(pmsg->message) || IseKeyMsg(pmsg->message)))
48 {
49 EnterCriticalSection(&CritSect);
50 RECORD_MESSAGE(iwnd, pmsg->message, POST,0,0);
51 LeaveCriticalSection(&CritSect);
52 }
53 DispatchMessageA( pmsg );
54 }
55
FlushMessages()56 static void FlushMessages()
57 {
58 MSG msg;
59 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
60 RecordAndDispatch(&msg);
61 }
62
ClipThread(PVOID Parameter)63 static DWORD WINAPI ClipThread(PVOID Parameter)
64 {
65 BOOL ret;
66
67 hWnd2 = CreateWindowW(L"clipstest", L"clipstest", WS_OVERLAPPEDWINDOW,
68 20, 20, 300, 300, NULL, NULL, 0, NULL);
69
70 /* Get ownership of the clipboard and record the messages we get */
71 ret = OpenClipboard(hWnd2);
72 ok (ret, "OpenClipboard failed\n");
73
74 EnterCriticalSection(&CritSect);
75 RECORD_MESSAGE(1, WM_DESTROYCLIPBOARD, MARKER,0,0);
76 LeaveCriticalSection(&CritSect);
77
78 ret = EmptyClipboard();
79 ok (ret, "EmptyClipboard failed\n");
80
81 EnterCriticalSection(&CritSect);
82 RECORD_MESSAGE(1, WM_DESTROYCLIPBOARD, MARKER,1,0);
83 LeaveCriticalSection(&CritSect);
84
85 ret = CloseClipboard();
86 ok (ret, "CloseClipboard failed\n");
87
88 /* Record if we got any post messages */
89 FlushMessages();
90
91 /* Force the parent thread out of its loop */
92 PostMessageW(hWnd1, WM_QUIT, 0, 0);
93
94 return 0;
95 }
96
97 static MSG_ENTRY EmptyClipboard_chain[]={
98 {1,WM_DESTROYCLIPBOARD, MARKER, 0},
99 {1,WM_DESTROYCLIPBOARD, SENT},
100 {1,WM_DESTROYCLIPBOARD, MARKER, 1},
101 {0,0}};
102
TestMessages()103 void TestMessages()
104 {
105 HANDLE hThread;
106 DWORD dwThread;
107 BOOL ret;
108 MSG msg;
109
110 /* Initialize the test */
111 InitializeCriticalSection(&CritSect);
112
113 RegisterSimpleClass(ClipTestProc, L"clipstest");
114
115 hWnd2 = NULL;
116 hWnd1 = CreateWindowW(L"clipstest", L"clipstest", WS_OVERLAPPEDWINDOW,
117 20, 20, 300, 300, NULL, NULL, 0, NULL);
118 ok (hWnd1 != NULL, "CreateWindowW failed\n");
119
120 EMPTY_CACHE();
121
122 /* Get ownership of the clipboard and record the messages we get */
123 ret = OpenClipboard(hWnd1);
124 ok (ret, "OpenClipboard failed\n");
125
126 ret = EmptyClipboard();
127 ok (ret, "EmptyClipboard failed\n");
128
129 ret = CloseClipboard();
130 ok (ret, "CloseClipboard failed\n");
131
132 /* Record posted messages */
133 FlushMessages();
134 COMPARE_CACHE(empty_chain);
135
136 /* Create the child thread and record messages till we get the WM_QUIT */
137 hThread = CreateThread(NULL, 0, ClipThread, NULL, 0, &dwThread);
138
139 while (GetMessage(&msg, 0, 0 ,0))
140 RecordAndDispatch(&msg);
141
142 COMPARE_CACHE(EmptyClipboard_chain);
143
144 CloseHandle(hThread);
145 }
146
TestOwnership()147 void TestOwnership()
148 {
149 BOOL ret;
150 HWND hWnd, hWndClipOwner;
151
152 ret = OpenClipboard(NULL);
153 ok (ret, "OpenClipboard failed\n");
154
155 ret = EmptyClipboard();
156 ok (ret, "EmptyClipboard failed\n");
157
158 ret = CloseClipboard();
159 ok (ret, "CloseClipboard failed\n");
160
161 hWndClipOwner = GetClipboardOwner();
162 ok (hWndClipOwner == NULL, "Expected NULL owner\n");
163
164 hWnd = CreateWindowW(L"static", L"static", WS_OVERLAPPEDWINDOW, 20, 20, 300, 300, NULL, NULL, 0, NULL);
165 ok (hWnd != 0 , "CreateWindowW failed\n");
166
167 ret = OpenClipboard(hWnd);
168 ok (ret, "OpenClipboard failed\n");
169
170 hWndClipOwner = GetClipboardOwner();
171 ok (hWndClipOwner == NULL, "Expected NULL owner\n");
172
173 ret = EmptyClipboard();
174 ok (ret, "EmptyClipboard failed\n");
175
176 ret = CloseClipboard();
177 ok (ret, "CloseClipboard failed\n");
178
179 hWndClipOwner = GetClipboardOwner();
180 ok (hWndClipOwner == hWnd, "Expected hWnd owner\n");
181
182 DestroyWindow(hWnd);
183 }
184
START_TEST(EmptyClipboard)185 START_TEST(EmptyClipboard)
186 {
187 TestOwnership();
188 TestMessages();
189 }
190