[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