[TRY2]user32/tests: add tests for creating subclassed builtin class windows
Hongbo Ni
hongbo at njstar.com
Wed Aug 6 03:02:55 CDT 2008
failed wine tests are marked with todo_wine.
---
dlls/user32/tests/class.c | 125 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 125 insertions(+), 0 deletions(-)
diff --git a/dlls/user32/tests/class.c b/dlls/user32/tests/class.c
index 8412e8b..7575401 100644
--- a/dlls/user32/tests/class.c
+++ b/dlls/user32/tests/class.c
@@ -2,6 +2,7 @@
*
* Copyright 2002 Mike McCormack
* Copyright 2003 Alexandre Julliard
+ * Copyright 2008 Hongbo Ni
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -778,6 +779,129 @@ static void test_builtinproc(void)
DestroyWindow(hwnd);
}
+#define MAX_BUILTIN_CLASSES 7
+static void test_builtin_class_subclassed(char *classA, WCHAR *classW);
+
+static void test_all_builtin_classes_subclassed(void)
+{
+ int i, n, len;
+ WCHAR classW[80];
+ CHAR *BUILTIN_CLASSES[MAX_BUILTIN_CLASSES] = {
+ "Edit",
+ "Button",
+ "Static",
+ "ComboBox",
+ "ComboLBox",
+ "ListBox",
+ "#32770", /* dialog */
+ };
+
+ for(i = 0; i < MAX_BUILTIN_CLASSES; i++)
+ {
+ len = strlen(BUILTIN_CLASSES[i]);
+ for(n = 0; n < len; n++) classW[n] = BUILTIN_CLASSES[i][n];
+ classW[n] = 0;
+ test_builtin_class_subclassed(BUILTIN_CLASSES[i], classW);
+ }
+}
+
+static void test_builtin_class_subclassed(char *classA, WCHAR *classW)
+{
+ HWND hwnd, hwnd2;
+ WNDPROC oldproc;
+
+ hwnd = CreateWindowExA(0, classA, NULL, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,
+ CW_USEDEFAULT, 680, 260, NULL, NULL, NULL, 0);
+
+ /** subclass builtin class globally using SetClassLongPtrA with ClassTest_WndProc2(A) **/
+ oldproc = (WNDPROC)SetClassLongPtrA( hwnd, GCLP_WNDPROC, (ULONG_PTR)ClassTest_WndProc2);
+ ok(!IS_WNDPROC_HANDLE(oldproc),
+ "%s - SetClassLongPtrA should not return a wndproc handle, got %p\n",
+ classA, (void *)oldproc);
+ ok(!IS_WNDPROC_HANDLE(GetClassLongPtrA(hwnd, GCLP_WNDPROC)),
+ "%s - GetClassLongPtrA should return an Ansi wndproc, got %p\n",
+ classA, (void *)GetClassLongPtrA(hwnd, GCLP_WNDPROC));
+ ok(IS_WNDPROC_HANDLE(GetClassLongPtrW(hwnd, GCLP_WNDPROC)),
+ "%s - GetClassLongPtrW should return a wndproc handle, got %p\n",
+ classA, (void *)GetClassLongPtrW(hwnd, GCLP_WNDPROC));
+
+ /* create a unicode builtin-class window after subclassed with SetClassLongPtrA*/
+ hwnd2 = CreateWindowExW(0, classW, NULL, WS_POPUP, 0, 0, 100, 100, GetDesktopWindow(), 0, 0, NULL);
+ ok(!IsWindowUnicode(hwnd2),
+ "%s - CreateWindowExW should create an Ansi window (subclassed by SetClassLongPtrA)\n", classA);
+ ok(!IS_WNDPROC_HANDLE(GetWindowLongPtrA(hwnd2, GWLP_WNDPROC)),
+ "%s - GetWindowLongPtrA should return an Ansi wndproc, got %p\n",
+ classA, (void *)GetWindowLongPtrA(hwnd2, GWLP_WNDPROC));
+ ok(IS_WNDPROC_HANDLE(GetWindowLongPtrW(hwnd2, GWLP_WNDPROC)),
+ "%s - GetWindowLongPtrW should return a wndproc handle, got %p\n",
+ classA, (void *)GetWindowLongPtrW(hwnd2, GWLP_WNDPROC));
+ DestroyWindow(hwnd2);
+
+ /* create a ansi builtin-class window after subclassed with SetClassLongPtrA */
+ hwnd2 = CreateWindowExA(0, classA, NULL, WS_POPUP, 0, 0, 100, 100, GetDesktopWindow(), 0, 0, NULL);
+ ok(!IsWindowUnicode(hwnd2),
+ "%s - CreateWindowExA should create an Ansi window (subclassed by SetClassLongPtrA)\n", classA);
+ ok(!IS_WNDPROC_HANDLE(GetWindowLongPtrA(hwnd2, GWLP_WNDPROC)),
+ "%s - GetWindowLongPtrA should return an Ansi wndproc, got %p\n",
+ classA, (void *)GetWindowLongPtrA(hwnd2, GWLP_WNDPROC));
+ ok(IS_WNDPROC_HANDLE(GetWindowLongPtrW(hwnd2, GWLP_WNDPROC)),
+ "%s - GetWindowLongPtrW should return a wndproc handle, got %p\n",
+ classA, (void *)GetWindowLongPtrW(hwnd2, GWLP_WNDPROC));
+ DestroyWindow(hwnd2);
+
+ SetWindowLongPtrA( hwnd, GCLP_WNDPROC, (ULONG_PTR)oldproc); /* restore procA */
+
+ /** subclass builtin class globally using SetClassLongPtrW with ClassTest_WndProc(W) **/
+ oldproc = (WNDPROC)SetClassLongPtrW( hwnd, GCLP_WNDPROC, (ULONG_PTR)ClassTest_WndProc);
+ ok(IS_WNDPROC_HANDLE(oldproc),
+ "%s - SetClassLongPtrW should not return a wndproc handle, got %p\n",
+ classA, (void *)oldproc);
+ ok(IS_WNDPROC_HANDLE(GetClassLongPtrA(hwnd, GCLP_WNDPROC)),
+ "%s - GetClassLongPtrA should return a wndproc handle, got %p\n",
+ classA, (void *)GetClassLongPtrA(hwnd, GCLP_WNDPROC));
+ ok(!IS_WNDPROC_HANDLE(GetClassLongPtrW(hwnd, GCLP_WNDPROC)),
+ "%s - GetClassLongPtrW should return a Unicode wndproc, got %p\n",
+ classA, (void *)GetClassLongPtrW(hwnd, GCLP_WNDPROC));
+
+ /* create a unicode builtin-class window after subclassed with SetClassLongPtrW */
+ hwnd2 = CreateWindowExW(0, classW, NULL, WS_POPUP, 0, 0, 100, 100, GetDesktopWindow(), 0, 0, NULL);
+ ok(IsWindowUnicode(hwnd2),
+ "%s - CreateWindowExW should create a Unicode window (subclassed by SetClassLongPtrW)\n", classA);
+ ok(IS_WNDPROC_HANDLE(GetWindowLongPtrA(hwnd2, GWLP_WNDPROC)),
+ "%s - GetWindowLongPtrA should return a wndproc handle, got %p\n",
+ classA, (void *)GetWindowLongPtrA(hwnd2, GWLP_WNDPROC));
+ ok(!IS_WNDPROC_HANDLE(GetWindowLongPtrW(hwnd2, GWLP_WNDPROC)),
+ "%s - GetWindowLongPtrW should return a Unicode wndproc, got %p\n",
+ classA, (void *)GetWindowLongPtrW(hwnd2, GWLP_WNDPROC));
+ /* ClassTest_WndProc handles Unciode message - expected */
+ ok(((WNDPROC)GetWindowLongPtrW(hwnd2, GWLP_WNDPROC) == ClassTest_WndProc),
+ "%s - GetWindowLongPtrW should return ClassTest_WndProc, %p vs %p\n",
+ classA, (void *)GetWindowLongPtrW(hwnd2, GWLP_WNDPROC), ClassTest_WndProc);
+ DestroyWindow(hwnd2);
+
+ /* create an ansi builtin-class window after subclassed with SetClassLongPtrW */
+ todo_wine
+ {
+ hwnd2 = CreateWindowExA(0, classA, NULL, WS_POPUP, 0, 0, 100, 100, GetDesktopWindow(), 0, 0, NULL);
+ ok(!IsWindowUnicode(hwnd2),
+ "%s - CreateWindowExA should create an Ansi window (subclassed by SetClassLongPtrW)\n", classA);
+ ok(!IS_WNDPROC_HANDLE(GetWindowLongPtrA(hwnd2, GWLP_WNDPROC)),
+ "%s - GetWindowLongPtrA should return an Ansi wndproc, got %p\n",
+ classA, (void *)GetWindowLongPtrA(hwnd2, GWLP_WNDPROC));
+ ok(IS_WNDPROC_HANDLE(GetWindowLongPtrW(hwnd2, GWLP_WNDPROC)),
+ "%s - GetWindowLongPtrW should return a wndproc handle, got %p\n",
+ classA, (void *)GetWindowLongPtrW(hwnd2, GWLP_WNDPROC));
+
+ /* ClassTest_WndProc should also handle Ansi message - a window Hack */
+ ok(((WNDPROC)GetWindowLongPtrA(hwnd2, GWLP_WNDPROC) == ClassTest_WndProc),
+ "%s - GetWindowLongPtrA should return ClassTest_WndProc, %p vs %p\n", classA,
+ (void *)GetWindowLongPtrA(hwnd2, GWLP_WNDPROC), ClassTest_WndProc);
+ DestroyWindow(hwnd2);
+ } /* todo_wine */
+
+ SetWindowLongPtrW( hwnd, GCLP_WNDPROC, (ULONG_PTR)oldproc);
+ DestroyWindow(hwnd);
+}
static LRESULT WINAPI TestDlgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
@@ -842,6 +966,7 @@ START_TEST(class)
CreateDialogParamTest(hInstance);
test_styles();
test_builtinproc();
+ test_all_builtin_classes_subclassed();
/* this test unregisters the Button class so it should be executed at the end */
test_instances();
--
1.5.6.1.1071.g76fb
More information about the wine-patches
mailing list