Alexandre Julliard : user32/tests: Add a few more clipboard tests.
Alexandre Julliard
julliard at winehq.org
Tue Aug 23 11:28:44 CDT 2016
Module: wine
Branch: master
Commit: 43e38153eed81d4c3aac41472192a0674afbcc7b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=43e38153eed81d4c3aac41472192a0674afbcc7b
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Aug 23 18:00:02 2016 +0900
user32/tests: Add a few more clipboard tests.
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/user32/tests/clipboard.c | 63 ++++++++++++++++++++++++++++++++++++++++---
1 file changed, 60 insertions(+), 3 deletions(-)
diff --git a/dlls/user32/tests/clipboard.c b/dlls/user32/tests/clipboard.c
index 549a625..9893e8a 100644
--- a/dlls/user32/tests/clipboard.c
+++ b/dlls/user32/tests/clipboard.c
@@ -68,6 +68,11 @@ static DWORD WINAPI set_clipboard_data_thread(LPVOID arg)
ok( IsClipboardFormatAvailable( CF_WAVE ), "%u: SetClipboardData failed\n", thread_from_line );
ret = SetClipboardData( CF_WAVE, GlobalAlloc( GMEM_DDESHARE | GMEM_ZEROINIT, 100 ));
ok( ret != 0, "%u: SetClipboardData failed err %u\n", thread_from_line, GetLastError() );
+ SetLastError( 0xdeadbeef );
+ ret = GetClipboardData( CF_WAVE );
+ ok( !ret, "%u: GetClipboardData succeeded\n", thread_from_line );
+ ok( GetLastError() == ERROR_CLIPBOARD_NOT_OPEN, "%u: wrong error %u\n",
+ thread_from_line, GetLastError());
}
else
{
@@ -147,6 +152,24 @@ static void run_process( const char *args )
CloseHandle( info.hThread );
}
+static WNDPROC old_proc;
+static LRESULT CALLBACK winproc_wrapper( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp )
+{
+ static int destroyed;
+
+ if (msg == WM_DESTROY) destroyed = TRUE;
+
+ trace( "%p msg %04x\n", hwnd, msg );
+ if (!destroyed)
+ ok( GetClipboardOwner() == hwnd, "%04x: wrong owner %p/%p\n", msg, GetClipboardOwner(), hwnd );
+ else todo_wine_if (msg == WM_DESTROY)
+ ok( !GetClipboardOwner(), "%04x: wrong owner %p\n", msg, GetClipboardOwner() );
+ ok( GetClipboardViewer() == hwnd, "%04x: wrong viewer %p/%p\n", msg, GetClipboardViewer(), hwnd );
+ ok( GetOpenClipboardWindow() == hwnd, "%04x: wrong open win %p/%p\n",
+ msg, GetOpenClipboardWindow(), hwnd );
+ return old_proc( hwnd, msg, wp, lp );
+}
+
static void test_ClipboardOwner(void)
{
HWND hWnd1, hWnd2;
@@ -182,6 +205,8 @@ static void test_ClipboardOwner(void)
run_thread( open_clipboard_thread, hWnd1, __LINE__ );
run_thread( empty_clipboard_thread, 0, __LINE__ );
run_thread( set_clipboard_data_thread, hWnd1, __LINE__ );
+ ok( !IsClipboardFormatAvailable( CF_WAVE ), "CF_WAVE available\n" );
+ ok( !GetClipboardData( CF_WAVE ), "CF_WAVE data available\n" );
run_process( "set_clipboard_data 0" );
ok(!CloseClipboard(), "CloseClipboard should fail if clipboard wasn't open\n");
ok(OpenClipboard(hWnd1), "OpenClipboard failed\n");
@@ -198,6 +223,8 @@ static void test_ClipboardOwner(void)
ok(GetClipboardOwner() == hWnd1, "clipboard should be owned by %p, not by %p\n", hWnd1, GetClipboardOwner());
run_thread( empty_clipboard_thread, 0, __LINE__ );
run_thread( set_clipboard_data_thread, hWnd1, __LINE__ );
+ ok( IsClipboardFormatAvailable( CF_WAVE ), "CF_WAVE not available\n" );
+ ok( GetClipboardData( CF_WAVE ) != 0, "CF_WAVE data not available\n" );
run_process( "set_clipboard_data 1" );
SetLastError(0xdeadbeef);
@@ -217,6 +244,8 @@ static void test_ClipboardOwner(void)
ok( GetClipboardOwner() == GetDesktopWindow(), "wrong owner %p/%p\n",
GetClipboardOwner(), GetDesktopWindow() );
run_thread( set_clipboard_data_thread, GetDesktopWindow(), __LINE__ );
+ ok( IsClipboardFormatAvailable( CF_WAVE ), "CF_WAVE not available\n" );
+ ok( GetClipboardData( CF_WAVE ) != 0, "CF_WAVE data not available\n" );
run_process( "set_clipboard_data 2" );
ret = CloseClipboard();
ok( ret, "CloseClipboard error %d\n", GetLastError());
@@ -225,20 +254,31 @@ static void test_ClipboardOwner(void)
ok( ret, "OpenClipboard error %d\n", GetLastError());
ret = EmptyClipboard();
ok( ret, "EmptyClipboard error %d\n", GetLastError());
+ SetClipboardViewer( hWnd1 );
ok( GetClipboardOwner() == hWnd1, "wrong owner %p/%p\n", GetClipboardOwner(), hWnd1 );
- ret = CloseClipboard();
- ok( ret, "CloseClipboard error %d\n", GetLastError());
+ ok( GetClipboardViewer() == hWnd1, "wrong viewer %p/%p\n", GetClipboardViewer(), hWnd1 );
+ ok( GetOpenClipboardWindow() == hWnd1, "wrong open win %p/%p\n", GetOpenClipboardWindow(), hWnd1 );
+ old_proc = (WNDPROC)SetWindowLongPtrA( hWnd1, GWLP_WNDPROC, (LONG_PTR)winproc_wrapper );
ret = DestroyWindow(hWnd1);
ok( ret, "DestroyWindow error %d\n", GetLastError());
ret = DestroyWindow(hWnd2);
ok( ret, "DestroyWindow error %d\n", GetLastError());
SetLastError(0xdeadbeef);
ok(!GetClipboardOwner() && GetLastError() == 0xdeadbeef, "clipboard should not be owned\n");
+ todo_wine ok(!GetClipboardViewer() && GetLastError() == 0xdeadbeef, "viewer still exists\n");
+ todo_wine ok(!GetOpenClipboardWindow() && GetLastError() == 0xdeadbeef, "clipboard should not be open\n");
+
+ SetLastError( 0xdeadbeef );
+ ret = CloseClipboard();
+ todo_wine ok( !ret, "CloseClipboard succeeded\n" );
+ todo_wine ok( GetLastError() == ERROR_CLIPBOARD_NOT_OPEN, "wrong error %u\n", GetLastError() );
ret = OpenClipboard( 0 );
ok( ret, "OpenClipboard error %d\n", GetLastError());
run_thread( set_clipboard_data_thread, 0, __LINE__ );
+ ok( IsClipboardFormatAvailable( CF_WAVE ), "CF_WAVE not available\n" );
+ ok( GetClipboardData( CF_WAVE ) != 0, "CF_WAVE data not available\n" );
run_process( "set_clipboard_data 3" );
ret = CloseClipboard();
ok( ret, "CloseClipboard error %d\n", GetLastError());
@@ -248,6 +288,8 @@ static void test_ClipboardOwner(void)
ret = OpenClipboard( 0 );
ok( ret, "OpenClipboard error %d\n", GetLastError());
run_thread( set_clipboard_data_thread, 0, __LINE__ );
+ ok( IsClipboardFormatAvailable( CF_WAVE ), "CF_WAVE not available\n" );
+ ok( GetClipboardData( CF_WAVE ) != 0, "CF_WAVE data not available\n" );
run_process( "set_clipboard_data 4" );
ret = EmptyClipboard();
ok( ret, "EmptyClipboard error %d\n", GetLastError());
@@ -459,6 +501,7 @@ static LRESULT CALLBACK clipboard_wnd_proc(HWND hwnd, UINT msg, WPARAM wp, LPARA
static UINT wm_drawclipboard;
static UINT wm_clipboardupdate;
static UINT wm_destroyclipboard;
+ static UINT nb_formats;
LRESULT ret;
switch(msg) {
@@ -476,6 +519,7 @@ static LRESULT CALLBACK clipboard_wnd_proc(HWND hwnd, UINT msg, WPARAM wp, LPARA
case WM_DESTROYCLIPBOARD:
wm_destroyclipboard++;
ok( GetClipboardOwner() == hwnd, "WM_DESTROYCLIPBOARD owner %p\n", GetClipboardOwner() );
+ nb_formats = CountClipboardFormats();
break;
case WM_CLIPBOARDUPDATE:
wm_clipboardupdate++;
@@ -496,6 +540,8 @@ static LRESULT CALLBACK clipboard_wnd_proc(HWND hwnd, UINT msg, WPARAM wp, LPARA
ret = wm_destroyclipboard;
wm_destroyclipboard = 0;
return ret;
+ case WM_USER+4:
+ return nb_formats;
}
return DefWindowProcA(hwnd, msg, wp, lp);
@@ -506,7 +552,7 @@ static DWORD WINAPI clipboard_thread(void *param)
HWND win = param;
BOOL r;
HANDLE handle;
- UINT count, old_seq = 0, seq;
+ UINT count, formats, old_seq = 0, seq;
if (pGetClipboardSequenceNumber) old_seq = pGetClipboardSequenceNumber();
@@ -575,6 +621,8 @@ static DWORD WINAPI clipboard_thread(void *param)
ok( !count, "WM_CLIPBOARDUPDATE received\n" );
count = SendMessageA( win, WM_USER+3, 0, 0 );
ok( count, "WM_DESTROYCLIPBOARD not received\n" );
+ count = SendMessageA( win, WM_USER+4, 0, 0 );
+ ok( !count, "wrong format count %u on WM_DESTROYCLIPBOARD\n", count );
handle = SetClipboardData( CF_TEXT, create_text() );
ok(handle != 0, "SetClipboardData failed: %d\n", GetLastError());
@@ -686,6 +734,10 @@ static DWORD WINAPI clipboard_thread(void *param)
count = SendMessageA( win, WM_USER+2, 0, 0 );
ok( !count, "WM_CLIPBOARDUPDATE received\n" );
+ formats = CountClipboardFormats();
+ count = SendMessageA( win, WM_USER+3, 0, 0 );
+ ok( !count, "WM_DESTROYCLIPBOARD received\n" );
+
r = OpenClipboard(0);
ok(r, "OpenClipboard failed: %d\n", GetLastError());
r = EmptyClipboard();
@@ -693,6 +745,11 @@ static DWORD WINAPI clipboard_thread(void *param)
r = CloseClipboard();
ok(r, "CloseClipboard failed: %d\n", GetLastError());
+ count = SendMessageA( win, WM_USER+3, 0, 0 );
+ ok( count, "WM_DESTROYCLIPBOARD not received\n" );
+ count = SendMessageA( win, WM_USER+4, 0, 0 );
+ ok( count == formats, "wrong format count %u on WM_DESTROYCLIPBOARD\n", count );
+
r = PostMessageA(win, WM_USER, 0, 0);
ok(r, "PostMessage failed: %d\n", GetLastError());
return 0;
More information about the wine-cvs
mailing list