[USER32_APITEST] -Add tests for global classes and versioned classes for RegisterClassEx.
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Mon, 6 Feb 2017 16:33:25 +0000 (16:33 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Mon, 6 Feb 2017 16:33:25 +0000 (16:33 +0000)
svn path=/trunk/; revision=73725

rostests/apitests/user32/CMakeLists.txt
rostests/apitests/user32/RegisterClassEx.c [new file with mode: 0644]
rostests/apitests/user32/testlist.c
rostests/apitests/user32/verclasstest1.manifest [new file with mode: 0644]
rostests/apitests/user32/verclasstest2.manifest [new file with mode: 0644]

index 3abd104..d16c020 100644 (file)
@@ -22,6 +22,7 @@ list(APPEND SOURCE
     LookupIconIdFromDirectoryEx.c
     NextDlgItem.c
     RealGetWindowClass.c
     LookupIconIdFromDirectoryEx.c
     NextDlgItem.c
     RealGetWindowClass.c
+    RegisterClassEx.c
     RegisterHotKey.c
     ScrollDC.c
     ScrollWindowEx.c
     RegisterHotKey.c
     ScrollDC.c
     ScrollWindowEx.c
@@ -43,3 +44,6 @@ target_link_libraries(user32_apitest wine ${PSEH_LIB})
 set_module_type(user32_apitest win32cui)
 add_importlibs(user32_apitest advapi32 gdi32 user32 msvcrt kernel32 ntdll)
 add_rostests_file(TARGET user32_apitest)
 set_module_type(user32_apitest win32cui)
 add_importlibs(user32_apitest advapi32 gdi32 user32 msvcrt kernel32 ntdll)
 add_rostests_file(TARGET user32_apitest)
+
+add_rostests_file(FILE "${CMAKE_CURRENT_SOURCE_DIR}/verclasstest1.manifest")
+add_rostests_file(FILE "${CMAKE_CURRENT_SOURCE_DIR}/verclasstest2.manifest")
diff --git a/rostests/apitests/user32/RegisterClassEx.c b/rostests/apitests/user32/RegisterClassEx.c
new file mode 100644 (file)
index 0000000..c886df7
--- /dev/null
@@ -0,0 +1,193 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPL - See COPYING in the top level directory
+ * PURPOSE:         Test for RegisterClassEx
+ * PROGRAMMERS:     Giannis Adamopoulos
+ */
+
+#include <apitest.h>
+#define WIN32_NO_STATUS
+#include <ndk/rtlfuncs.h>
+
+#include <wingdi.h>
+#include <winuser.h>
+#include "helper.h"
+#include <undocuser.h>
+
+static ATOM _RegisterClass(LPCWSTR lpwszClassName, HINSTANCE hInstance, UINT style, WNDPROC lpfnWndProc)
+{
+    WNDCLASSEXW wcex = {sizeof(WNDCLASSEXW), style, lpfnWndProc};
+    wcex.lpszClassName  = lpwszClassName;
+    wcex.hInstance      = hInstance;
+    return RegisterClassExW(&wcex);
+}
+
+static ATOM _GetClassAtom(LPCWSTR lpwszClassName, HINSTANCE hInstance)
+{
+    WNDCLASSEXW wcex = {sizeof(WNDCLASSEXW)};
+    return (ATOM)GetClassInfoEx(hInstance, lpwszClassName, &wcex);
+}
+
+static WNDPROC _GetWndproc(LPCWSTR lpwszClassName, HINSTANCE hInstance)
+{
+    WNDCLASSEXW wcex = {sizeof(WNDCLASSEXW)};
+    GetClassInfoEx(hInstance, lpwszClassName, &wcex);
+    return wcex.lpfnWndProc;
+}
+
+HANDLE _CreateActCtxFromFile(LPCWSTR FileName)
+{
+    ACTCTXW ActCtx = {sizeof(ACTCTX)};
+    WCHAR buffer[MAX_PATH] , *separator;
+
+    ok (GetModuleFileNameW(NULL, buffer, MAX_PATH), "GetModuleFileName failed\n");
+    separator = wcsrchr(buffer, L'\\');
+    if (separator)
+        wcscpy(separator + 1, FileName);
+
+    ActCtx.lpSource = buffer;
+
+    return CreateActCtxW(&ActCtx);
+}
+
+VOID TestGlobalClasses(VOID)
+{
+    HMODULE hmod = GetModuleHandle(NULL);
+    ATOM a,b,c,d,e;
+
+    a = _GetClassAtom(L"TestClass1", hmod);
+    b = _RegisterClass(L"TestClass1", hmod, 0, DefWindowProcW);
+    c = _GetClassAtom(L"TestClass1", hmod);
+    UnregisterClass(L"TestClass1", hmod);
+    d = _GetClassAtom(L"TestClass1", hmod);
+    ok( a == 0, "\n");
+    ok( b != 0, "\n");
+    ok( c != 0, "\n");
+    ok( d == 0, "\n");
+    ok (b == c, "\n");
+   
+    a = _GetClassAtom(L"TestClass2", hmod);
+    b = _RegisterClass(L"TestClass2", hmod, CS_GLOBALCLASS, DefWindowProcW);
+    c = _GetClassAtom(L"TestClass2", hmod);
+    UnregisterClass(L"TestClass2", hmod);
+    d = _GetClassAtom(L"TestClass2", hmod);
+    ok( a == 0, "\n");
+    ok( b != 0, "\n");
+    ok( c != 0, "\n");
+    ok( d == 0, "\n");
+    ok (b == c, "\n");
+
+    a = _RegisterClass(L"TestClass3", hmod, 0, DefWindowProcW);
+    b = _RegisterClass(L"TestClass3", hmod, 0, DefWindowProcW);
+    c = _RegisterClass(L"TestClass3", hmod, CS_GLOBALCLASS, DefWindowProcW);
+    UnregisterClass(L"TestClass3", hmod);
+    d = _GetClassAtom(L"TestClass3", hmod);
+    ok( a != 0, "\n");
+    ok( b == 0, "\n");
+    ok( c == 0, "\n");
+    ok( d == 0, "\n");
+
+    a = _RegisterClass(L"TestClass4", hmod, CS_GLOBALCLASS, DefWindowProcW);
+    b = _RegisterClass(L"TestClass4", hmod, 0, DefWindowProcW);
+    c = _RegisterClass(L"TestClass4", hmod, 0, DefWindowProcW);
+    UnregisterClass(L"TestClass4", hmod);
+    d = _GetClassAtom(L"TestClass4", hmod);
+    UnregisterClass(L"TestClass4", hmod);
+    e = _GetClassAtom(L"TestClass4", hmod);
+    ok( a != 0, "\n");
+    ok( b != 0, "\n");
+    ok( c == 0, "\n");
+    ok( d != 0, "\n");
+    ok( e == 0, "\n");
+
+    a = _GetClassAtom(L"ComboBox", hmod);
+    b = _RegisterClass(L"ComboBox", hmod, 0, DefWindowProcW);
+    c = _RegisterClass(L"ComboBox", hmod, CS_GLOBALCLASS, DefWindowProcW);
+    UnregisterClass(L"ComboBox", hmod);
+    d = _GetClassAtom(L"ComboBox", hmod);
+    UnregisterClass(L"TestClass4", hmod);
+    e = _GetClassAtom(L"TestClass4", hmod);
+    ok( a != 0, "\n");
+    ok( b != 0, "\n");
+    ok( c == 0, "\n");
+    ok( d != 0, "\n");
+    ok( e == 0, "\n");
+    
+    a = _GetClassAtom(L"ScrollBar", hmod);
+    UnregisterClass(L"ScrollBar", hmod);
+    b = _GetClassAtom(L"ScrollBar", hmod);
+    ok( a != 0, "\n");
+    ok( b == 0, "\n");
+    
+    a = _GetClassAtom(L"ListBox", (HMODULE)0xdead);
+    UnregisterClass(L"ListBox", (HMODULE)0xdead);
+    b = _GetClassAtom(L"ListBox", (HMODULE)0xdead);
+    ok( a != 0, "\n");
+    ok( b == 0, "\n");
+    
+    a = _RegisterClass(L"TestClass5", (HMODULE)0xdead, CS_GLOBALCLASS, DefWindowProcW);
+    b = _GetClassAtom(L"TestClass5", hmod);
+    UnregisterClass(L"TestClass5", hmod);
+    c = _GetClassAtom(L"TestClass5", (HMODULE)0xdead);
+    d = _GetClassAtom(L"TestClass5", hmod);
+    ok( a != 0, "\n");
+    ok( b != 0, "\n");    
+    ok( c == 0, "\n");
+    ok( d == 0, "\n");    
+}
+
+VOID TestVersionedClasses(VOID)
+{
+    HMODULE hmod = GetModuleHandle(NULL);
+    HANDLE h1, h2;
+    ULONG_PTR cookie1;
+    ATOM a,b,c;
+    WNDPROC proc1,proc2,proc3, proc4;
+
+    h1 = _CreateActCtxFromFile(L"verclasstest1.manifest");
+    h2 = _CreateActCtxFromFile(L"verclasstest2.manifest");
+    if (h1 == INVALID_HANDLE_VALUE || h2 == INVALID_HANDLE_VALUE)
+    {
+        skip("Loading manifests failed. Skipping TestVersionedClasses\n");
+        return;
+    }
+    
+    a = _RegisterClass(L"VersionTestClass1", hmod, 0, DefWindowProcA);
+    proc1 = _GetWndproc(L"VersionTestClass1", hmod);
+    b = _RegisterClass(L"VersionTestClass1", hmod, 0, DefWindowProcW);
+    ActivateActCtx(h1, &cookie1);
+    proc2 = _GetWndproc(L"VersionTestClass1", hmod);
+    c = _RegisterClass(L"VersionTestClass1", hmod, 0, DefWindowProcW);
+    proc3 = _GetWndproc(L"VersionTestClass1", hmod);
+    DeactivateActCtx(0, cookie1);
+    proc4 = _GetWndproc(L"VersionTestClass1", hmod);
+    ok( a != 0, "\n");
+    ok( b == 0, "\n");
+    ok( c != 0, "\n");
+    ok( a == c, "\n");
+    ok (proc1 == DefWindowProcA, "\n");
+    ok (proc2 == NULL, "\n");
+    ok (proc3 == DefWindowProcW, "\n");
+    ok (proc4 == DefWindowProcA, "\n");
+    
+    a = _GetClassAtom(L"Button", hmod);
+    b = _RegisterClass(L"Button", hmod, CS_GLOBALCLASS, DefWindowProcA);
+    proc1 = _GetWndproc(L"Button", (HMODULE)0xdead);
+    ActivateActCtx(h2, &cookie1);
+    c = _RegisterClass(L"Button", hmod, CS_GLOBALCLASS, DefWindowProcA);
+    proc2 = _GetWndproc(L"Button", (HMODULE)0xdead);
+    ok( a != 0, "\n");
+    ok( b == 0, "\n");
+    ok( c != 0, "\n");
+    ok( a == c, "\n");
+    ok( proc1 != NULL, "\n");
+    ok( proc2 != NULL, "\n");
+    ok( proc1 != proc2, "\n");
+    ok( proc2 == DefWindowProcA, "\n");
+}
+
+START_TEST(RegisterClassEx)
+{
+    TestGlobalClasses();
+    TestVersionedClasses();
+}
index ed2e672..e5194f7 100644 (file)
@@ -25,6 +25,7 @@ extern void func_LookupIconIdFromDirectoryEx(void);
 extern void func_NextDlgItem(void);
 extern void func_RealGetWindowClass(void);
 extern void func_RegisterHotKey(void);
 extern void func_NextDlgItem(void);
 extern void func_RealGetWindowClass(void);
 extern void func_RegisterHotKey(void);
+extern void func_RegisterClassEx(void);
 extern void func_ScrollDC(void);
 extern void func_ScrollWindowEx(void);
 extern void func_SendMessageTimeout(void);
 extern void func_ScrollDC(void);
 extern void func_ScrollWindowEx(void);
 extern void func_SendMessageTimeout(void);
@@ -62,6 +63,7 @@ const struct test winetest_testlist[] =
     { "NextDlgItem", func_NextDlgItem },
     { "RealGetWindowClass", func_RealGetWindowClass },
     { "RegisterHotKey", func_RegisterHotKey },
     { "NextDlgItem", func_NextDlgItem },
     { "RealGetWindowClass", func_RealGetWindowClass },
     { "RegisterHotKey", func_RegisterHotKey },
+    { "RegisterClassEx", func_RegisterClassEx },
     { "ScrollDC", func_ScrollDC },
     { "ScrollWindowEx", func_ScrollWindowEx },
     { "SendMessageTimeout", func_SendMessageTimeout },
     { "ScrollDC", func_ScrollDC },
     { "ScrollWindowEx", func_ScrollWindowEx },
     { "SendMessageTimeout", func_SendMessageTimeout },
diff --git a/rostests/apitests/user32/verclasstest1.manifest b/rostests/apitests/user32/verclasstest1.manifest
new file mode 100644 (file)
index 0000000..b9ece64
--- /dev/null
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\r
+  <assemblyIdentity type="win32" name="verclasstest1" version="2.2.2.2" processorArchitecture="x86"/>\r
+  <file name="user32_apitest.dll">\r
+    <windowClass>VersionTestClass1</windowClass>\r
+    <windowClass>VersionTestClass2</windowClass>\r
+    <windowClass>VersionTestClass4</windowClass>\r
+  </file>\r
+</assembly>\r
diff --git a/rostests/apitests/user32/verclasstest2.manifest b/rostests/apitests/user32/verclasstest2.manifest
new file mode 100644 (file)
index 0000000..e548309
--- /dev/null
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>\r
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">\r
+  <assemblyIdentity type="win32" name="verclasstest2" version="3.3.3.3" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df"/>\r
+  <file name="user32_apitest.exe">\r
+    <windowClass>VersionTestClass1</windowClass>\r
+    <windowClass>VersionTestClass2</windowClass>\r
+    <windowClass>VersionTestClass3</windowClass>\r
+    <windowClass>Button</windowClass>\r
+  </file>\r
+</assembly>\r