Author: akhaldi
Date: Wed Aug 17 17:53:11 2016
New Revision: 72242
URL:
http://svn.reactos.org/svn/reactos?rev=72242&view=rev
Log:
[WIN32NT_APITEST] Add some NtUserCreateWindowEx tests by Sylvain Deverre. ROSTESTS-237
Added:
trunk/rostests/apitests/win32nt/ntuser/NtUserCreateWindowEx.c (with props)
Modified:
trunk/rostests/apitests/win32nt/CMakeLists.txt
trunk/rostests/apitests/win32nt/testlist.c
Modified: trunk/rostests/apitests/win32nt/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/win32nt/CMakeLis…
==============================================================================
--- trunk/rostests/apitests/win32nt/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/rostests/apitests/win32nt/CMakeLists.txt [iso-8859-1] Wed Aug 17 17:53:11 2016
@@ -44,6 +44,7 @@
# ntuser/NtUserCallNoParam.c
# ntuser/NtUserCallOneParam.c
ntuser/NtUserCountClipboardFormats.c
+ ntuser/NtUserCreateWindowEx.c
# ntuser/NtUserEnumDisplayMonitors.c
ntuser/NtUserEnumDisplaySettings.c
ntuser/NtUserFindExistingCursorIcon.c
Added: trunk/rostests/apitests/win32nt/ntuser/NtUserCreateWindowEx.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/win32nt/ntuser/N…
==============================================================================
--- trunk/rostests/apitests/win32nt/ntuser/NtUserCreateWindowEx.c (added)
+++ trunk/rostests/apitests/win32nt/ntuser/NtUserCreateWindowEx.c [iso-8859-1] Wed Aug 17
17:53:11 2016
@@ -0,0 +1,228 @@
+/*
+ * PROJECT: ReactOS api tests
+ * LICENSE: GPL - See COPYING in the top level directory
+ * PURPOSE: Test for NtUserCreateWindowEx
+ */
+
+#include <win32nt.h>
+
+static
+inline
+HWND
+CreateWnd(HINSTANCE hinst,
+ PLARGE_STRING clsName,
+ PLARGE_STRING clsVer,
+ PLARGE_STRING wndName)
+{
+ return NtUserCreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
+ clsName,
+ clsVer,
+ wndName,
+ WS_CAPTION,
+ CW_USEDEFAULT,
+ CW_USEDEFAULT,
+ 100,
+ 100,
+ NULL,
+ NULL,
+ hinst,
+ 0,
+ 0,
+ NULL);
+}
+
+/* WndProc for class1 */
+
+LRESULT CALLBACK wndProc1(HWND hwnd, UINT msg, WPARAM wPrm, LPARAM lPrm)
+{
+ return DefWindowProc(hwnd, msg, wPrm, lPrm);
+}
+
+/* WndProc for class2 */
+LRESULT CALLBACK wndProc2(HWND hwnd, UINT msg, WPARAM wPrm, LPARAM lPrm)
+{
+ return DefWindowProc(hwnd, msg, wPrm, lPrm);
+}
+
+
+START_TEST(NtUserCreateWindowEx)
+{
+ HINSTANCE hinst = GetModuleHandle(NULL);
+ WNDCLASSEXW wclex = {0};
+ WNDCLASSEXW wclex2 = {0};
+ WNDCLASSEXW res = {0};
+
+ /* Unicode strings for NtRegisterClassExWOW */
+ UNICODE_STRING cls = {14, 32, L"MyClass"};
+ UNICODE_STRING ver_cls = {12, 32, L"v2test"};
+ UNICODE_STRING another_cls = {10, 32, L"Dummy"};
+ UNICODE_STRING menu = {10, 10, L"MuMnu"};
+
+ /* LARGE_STRING for NtUserCreateWindowEx */
+ LARGE_STRING l_dummy = {14, 32, 0, L"DummyMe"};
+ LARGE_STRING l_wndName = {32, 32, 0, L""};
+ LARGE_STRING l_cls = {cls.Length, 32, 0, cls.Buffer};
+ LARGE_STRING l_ver_cls = {ver_cls.Length, 32, 0, ver_cls.Buffer};
+ WCHAR bufMe[255] = {0};
+ UNICODE_STRING capture = {255, 255, bufMe};
+ PWSTR pwstr = NULL;
+ CLSMENUNAME clsMenuName, outClsMnu = {0};
+ ATOM atom, atom2, atom3;
+ HWND hwnd;
+
+ clsMenuName.pszClientAnsiMenuName = "MuMnu";
+ clsMenuName.pwszClientUnicodeMenuName = menu.Buffer;
+ clsMenuName.pusMenuName = &menu;
+
+ wclex.cbSize = sizeof(WNDCLASSEXW);
+ wclex.style = 0;
+ wclex.lpfnWndProc = wndProc1;
+ wclex.cbClsExtra = 2;
+ wclex.cbWndExtra = 4;
+ wclex.hInstance = hinst;
+ wclex.hIcon = NULL;
+ wclex.hCursor = NULL;
+ wclex.hbrBackground = CreateSolidBrush(RGB(4,7,5));
+ wclex.lpszMenuName = menu.Buffer;
+ wclex.lpszClassName = cls.Buffer;
+ wclex.hIconSm = NULL;
+ memcpy(&wclex2, &wclex, sizeof(wclex));
+ wclex2.lpfnWndProc = wndProc2;
+
+ /* Register our first version */
+ atom = NtUserRegisterClassExWOW(&wclex, /* wndClass */
+ &cls, /* ClassName */
+ &cls, /* Version */
+ &clsMenuName, /* MenuName */
+ 0,
+ 0,
+ NULL);
+ TEST(atom != 0);
+
+ /* Register second version */
+ atom2 = NtUserRegisterClassExWOW(&wclex2, /* wndClass */
+ &cls, /* ClassName */
+ &ver_cls, /* Version */
+ &clsMenuName, /* MenuName */
+ 0,
+ 0,
+ NULL);
+
+ atom3 = NtUserRegisterClassExWOW(&wclex2, /* wndClass */
+ &another_cls, /* ClassName */
+ &another_cls, /* Version */
+ &clsMenuName, /* MenuName */
+ 0,
+ 0,
+ NULL);
+
+ TEST(NtUserGetWOWClass(hinst, &ver_cls) != 0);
+
+ TEST(atom2 != 0);
+ TEST(atom == atom2 && (atom | atom2) != 0);
+
+ /* Now, create our first window */
+ hwnd = CreateWnd(hinst, &l_cls, &l_cls, &l_wndName);
+ TEST(hwnd != 0);
+ if(hwnd)
+ {
+ /* Test some settings about the window */
+ TEST((WNDPROC)GetWindowLongPtrW(hwnd, GWLP_WNDPROC) == wndProc1);
+
+ /* Check class name isn't versioned */
+ TEST(NtUserGetClassName(hwnd, TRUE, &capture) != 0);
+ TEST(wcscmp(capture.Buffer, cls.Buffer) == 0);
+ TEST(wcscmp(capture.Buffer, ver_cls.Buffer) != 0);
+ ZeroMemory(capture.Buffer, 255);
+
+ /* Check what return GetClassLong */
+ TEST(GetClassLong(hwnd, GCW_ATOM) == atom);
+ TEST(NtUserSetClassLong(hwnd, GCW_ATOM, atom3, FALSE) == atom);
+ NtUserGetClassName(hwnd, TRUE, &capture);
+ TEST(wcscmp(capture.Buffer, another_cls.Buffer) == 0);
+
+ /* Finally destroy it */
+ DestroyWindow(hwnd);
+ }
+
+ /* Create our second version */
+ hwnd = CreateWnd(hinst, &l_cls, &l_ver_cls, &l_wndName);
+ TEST(hwnd != 0);
+ if (hwnd)
+ {
+ /* Test settings about window */
+ TEST((WNDPROC)GetWindowLongPtrW(hwnd, GWLP_WNDPROC) == wndProc2);
+
+ /* Check class name isn't versioned */
+ TEST(NtUserGetClassName(hwnd, TRUE, &capture) != 0);
+ TEST(wcscmp(capture.Buffer, cls.Buffer) == 0);
+ TEST(wcscmp(capture.Buffer, ver_cls.Buffer) != 0);
+ ZeroMemory(capture.Buffer, 255);
+
+ /* Check what return GetClassLong */
+ TEST(GetClassLong(hwnd, GCW_ATOM) == atom);
+
+ /* Finally destroy it */
+ DestroyWindow(hwnd);
+ }
+
+ /* Create a nonexistent window */
+ hwnd = CreateWnd(hinst, &l_cls, &l_dummy, &l_wndName);
+ TEST(hwnd == 0);
+ if (hwnd) DestroyWindow(hwnd);
+
+ /* Get non-versioned class info */
+ res.cbSize = sizeof(res);
+ SetLastError(0);
+ TEST(NtUserGetClassInfo(hinst, &cls, &res, &pwstr, 0) != 0);
+ TEST(GetLastError() == 0);
+ TEST(res.cbSize == wclex.cbSize);
+ TEST(res.style == wclex.style);
+ TEST(res.lpfnWndProc == wclex.lpfnWndProc);
+ TEST(res.cbClsExtra == wclex.cbClsExtra);
+ TEST(res.cbWndExtra == wclex.cbWndExtra);
+ TEST(res.hInstance == wclex.hInstance);
+ TEST(res.hIcon == wclex.hIcon);
+ TEST(res.hCursor == wclex.hCursor);
+ TEST(res.hbrBackground == wclex.hbrBackground);
+ TEST(res.lpszMenuName == 0);
+ TEST(res.lpszClassName == 0);
+ TEST(res.hIconSm == wclex.hIconSm);
+
+ /* Get versioned class info */
+ TEST(NtUserGetClassInfo(hinst, &ver_cls, &res, &pwstr, 0) != 0);
+ TEST(GetLastError() == 0);
+ TEST(res.cbSize == wclex2.cbSize);
+ TEST(res.style == wclex2.style);
+ TEST(res.lpfnWndProc == wclex2.lpfnWndProc);
+ TEST(res.cbClsExtra == wclex2.cbClsExtra);
+ TEST(res.cbWndExtra == wclex2.cbWndExtra);
+ TEST(res.hInstance == wclex2.hInstance);
+ TEST(res.hIcon == wclex2.hIcon);
+ TEST(res.hCursor == wclex2.hCursor);
+ TEST(res.hbrBackground == wclex2.hbrBackground);
+ TEST(res.lpszMenuName == 0);
+ TEST(res.lpszClassName == 0);
+ TEST(res.hIconSm == wclex2.hIconSm);
+
+ /* Create a new window from our old class. Since we set a new class atom,
+ * it should be set to our new atom
+ */
+ hwnd = NULL;
+ hwnd = CreateWnd(hinst, &l_cls, &l_cls, &l_wndName);
+ TEST(hwnd != NULL);
+ if (hwnd)
+ {
+ TEST(GetClassLong(hwnd, GCW_ATOM) == atom3);
+ TEST(NtUserGetClassName(hwnd, TRUE, &capture) != 0);
+ TEST(wcscmp(capture.Buffer, another_cls.Buffer) == 0);
+ DestroyWindow(hwnd);
+ }
+
+ /* Test class destruction */
+ TEST(NtUserUnregisterClass(&cls, hinst, (PCLSMENUNAME)0xbad) != 0);
+ TEST(NtUserUnregisterClass(&ver_cls, hinst, &outClsMnu) != 0);
+ TEST(NtUserUnregisterClass(&another_cls, hinst, &outClsMnu) != 0);
+ TEST(NtUserUnregisterClass(&menu, hinst, &outClsMnu) == 0);
+
+}
Propchange: trunk/rostests/apitests/win32nt/ntuser/NtUserCreateWindowEx.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/rostests/apitests/win32nt/testlist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/win32nt/testlist…
==============================================================================
--- trunk/rostests/apitests/win32nt/testlist.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/win32nt/testlist.c [iso-8859-1] Wed Aug 17 17:53:11 2016
@@ -44,6 +44,7 @@
//extern void func_NtUserCallNoParam(void);
//extern void func_NtUserCallOneParam(void);
extern void func_NtUserCountClipboardFormats(void);
+extern void func_NtUserCreateWindowEx(void);
//extern void func_NtUserEnumDisplayMonitors(void);
extern void func_NtUserEnumDisplaySettings(void);
extern void func_NtUserFindExistingCursorIcon(void);
@@ -105,6 +106,7 @@
//{ "NtUserCallNoParam", func_NtUserCallNoParam },
//{ "NtUserCallOneParam", func_NtUserCallOneParam },
{ "NtUserCountClipboardFormats", func_NtUserCountClipboardFormats },
+ { "NtUserCreateWindowEx", func_NtUserCreateWindowEx },
//{ "NtUserEnumDisplayMonitors", func_NtUserEnumDisplayMonitors },
{ "NtUserEnumDisplaySettings", func_NtUserEnumDisplaySettings },
{ "NtUserFindExistingCursorIcon", func_NtUserFindExistingCursorIcon },