Author: jimtabor
Date: Wed Feb 11 23:53:08 2015
New Revision: 66233
URL:
http://svn.reactos.org/svn/reactos?rev=66233&view=rev
Log:
[ApiTest]
- Add Thomas Faber API test from CORE-8703.
Added:
trunk/rostests/apitests/user32/CreateWindowEx.c (with props)
Modified:
trunk/rostests/apitests/user32/CMakeLists.txt
trunk/rostests/apitests/user32/helper.c
trunk/rostests/apitests/user32/testlist.c
Modified: trunk/rostests/apitests/user32/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/CMakeList…
==============================================================================
--- trunk/rostests/apitests/user32/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/rostests/apitests/user32/CMakeLists.txt [iso-8859-1] Wed Feb 11 23:53:08 2015
@@ -3,6 +3,7 @@
AttachThreadInput.c
helper.c
CreateIconFromResourceEx.c
+ CreateWindowEx.c
DeferWindowPos.c
DestroyCursorIcon.c
DrawIconEx.c
Added: trunk/rostests/apitests/user32/CreateWindowEx.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/CreateWin…
==============================================================================
--- trunk/rostests/apitests/user32/CreateWindowEx.c (added)
+++ trunk/rostests/apitests/user32/CreateWindowEx.c [iso-8859-1] Wed Feb 11 23:53:08 2015
@@ -0,0 +1,189 @@
+/*
+ * PROJECT: ReactOS API tests
+ * LICENSE: LGPLv2.1+ - See COPYING.LIB in the top level directory
+ * PURPOSE: Test for CreateWindow stuff
+ * PROGRAMMERS: Thomas Faber <thomas.faber(a)reactos.org>
+ */
+
+#include <apitest.h>
+
+#include <winuser.h>
+#include "helper.h"
+
+static HWND hWndList[5 + 1];
+static const int hWndCount = sizeof(hWndList) / sizeof(hWndList[0]) - 1;
+static DWORD dwThreadId;
+
+#define ok_hwnd(val, exp) do
\
+ {
\
+ HWND _val = (val), _exp = (exp);
\
+ int _ival = get_iwnd(_val, FALSE);
\
+ int _iexp = get_iwnd(_exp, FALSE);
\
+ ok(_val == _exp, #val " = %p (%d), expected %p (%d)\n", _val, _ival,
_exp, _iexp); \
+ } while (0)
+
+static
+int
+get_iwnd(
+ _In_ HWND hWnd,
+ _In_ BOOL set)
+{
+ int i;
+ if (!hWnd)
+ return 0;
+ for (i = 1; i <= hWndCount; i++)
+ {
+ if (hWndList[i] == hWnd)
+ return i;
+ }
+ if (!set)
+ return 0;
+ for (i = 1; i <= hWndCount; i++)
+ {
+ if (hWndList[i] == NULL)
+ {
+ hWndList[i] = hWnd;
+ return i;
+ }
+ }
+ ok(0, "Too many windows!\n");
+ return 0;
+}
+
+static
+BOOL
+CALLBACK
+EnumProc(
+ _In_ HWND hWnd,
+ _In_ LPARAM lParam)
+{
+ HWND hLookingFor = (HWND)lParam;
+ return hWnd != hLookingFor;
+}
+
+static
+LRESULT
+CALLBACK
+WndProc(
+ _In_ HWND hWnd,
+ _In_ UINT message,
+ _In_ WPARAM wParam,
+ _In_ LPARAM lParam)
+{
+ HWND hTest;
+ int iwnd = get_iwnd(hWnd, TRUE);
+
+ ok(GetCurrentThreadId() == dwThreadId, "Thread 0x%lx instead of 0x%lx\n",
GetCurrentThreadId(), dwThreadId);
+ if (message > WM_USER || IsDWmMsg(message) || IseKeyMsg(message))
+ return DefWindowProcW(hWnd, message, wParam, lParam);
+
+ RECOND_MESSAGE(iwnd, message, SENT, wParam, lParam);
+
+ switch(message)
+ {
+ case WM_DESTROY:
+ if (GetParent(hWnd))
+ {
+ /* child window */
+ ok(EnumThreadWindows(dwThreadId, EnumProc, (LPARAM)hWnd), "Child window
%p (%d) enumerated\n", hWnd, iwnd);
+ ok(!EnumChildWindows(GetParent(hWnd), EnumProc, (LPARAM)hWnd), "Child
window %p (%d) not enumerated\n", hWnd, iwnd);
+ ok(!EnumThreadWindows(dwThreadId, EnumProc, (LPARAM)GetParent(hWnd)),
"Parent window of %p (%d) not enumerated\n", hWnd, iwnd);
+ }
+ else
+ {
+ /* top-level window */
+ ok(!EnumThreadWindows(dwThreadId, EnumProc, (LPARAM)hWnd), "Window %p
(%d) not enumerated in WM_DESTROY\n", hWnd, iwnd);
+ }
+ if (hWnd == hWndList[3])
+ {
+ hTest = SetParent(hWndList[4], hWndList[2]);
+ ok_hwnd(hTest, hWndList[1]);
+ hTest = SetParent(hWndList[5], hWndList[1]);
+ ok_hwnd(hTest, hWndList[2]);
+
+ ok_hwnd(GetParent(hWndList[1]), NULL);
+ ok_hwnd(GetParent(hWndList[2]), NULL);
+ ok_hwnd(GetParent(hWndList[3]), hWndList[1]);
+ ok_hwnd(GetParent(hWndList[4]), hWndList[2]);
+ ok_hwnd(GetParent(hWndList[5]), hWndList[1]);
+ }
+ break;
+ }
+
+ return DefWindowProcW(hWnd, message, wParam, lParam);
+}
+
+
+START_TEST(CreateWindowEx)
+{
+ HWND hWnd;
+ MSG msg;
+
+ SetCursorPos(0,0);
+
+ dwThreadId = GetCurrentThreadId();
+ hWndList[0] = INVALID_HANDLE_VALUE;
+ RegisterSimpleClass(WndProc, L"CreateTest");
+
+ hWnd = CreateWindowExW(0, L"CreateTest", NULL, 0, 10, 10, 20, 20, NULL,
NULL, 0, NULL);
+ ok(hWnd != NULL, "CreateWindow failed\n");
+ ok(hWnd == hWndList[1], "Got %p, expected %p\n", hWnd, hWndList[1]);
+
+ hWnd = CreateWindowExW(0, L"CreateTest", NULL, 0, 40, 10, 20, 20, NULL,
NULL, 0, NULL);
+ ok(hWnd != NULL, "CreateWindow failed\n");
+ ok(hWnd == hWndList[2], "Got %p, expected %p\n", hWnd, hWndList[2]);
+
+ hWnd = CreateWindowExW(0, L"CreateTest", NULL, WS_CHILD, 60, 10, 20, 20,
hWndList[1], NULL, 0, NULL);
+ ok(hWnd != NULL, "CreateWindow failed\n");
+ ok(hWnd == hWndList[3], "Got %p, expected %p\n", hWnd, hWndList[3]);
+
+ hWnd = CreateWindowExW(0, L"CreateTest", NULL, WS_CHILD, 80, 10, 20, 20,
hWndList[1], NULL, 0, NULL);
+ ok(hWnd != NULL, "CreateWindow failed\n");
+ ok(hWnd == hWndList[4], "Got %p, expected %p\n", hWnd, hWndList[4]);
+
+ hWnd = CreateWindowExW(0, L"CreateTest", NULL, WS_CHILD, 60, 10, 20, 20,
hWndList[2], NULL, 0, NULL);
+ ok(hWnd != NULL, "CreateWindow failed\n");
+ ok(hWnd == hWndList[5], "Got %p, expected %p\n", hWnd, hWndList[5]);
+
+trace("\n");
+ while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
+ {
+ int iwnd = get_iwnd(msg.hwnd, FALSE);
+ if(!(msg.message > WM_USER || IsDWmMsg(msg.message) ||
IseKeyMsg(msg.message)))
+ RECOND_MESSAGE(iwnd, msg.message, POST, 0, 0);
+ DispatchMessageA( &msg );
+ }
+trace("\n");
+ TRACE_CACHE();
+trace("\n");
+
+ ok_hwnd(GetParent(hWndList[1]), NULL);
+ ok_hwnd(GetParent(hWndList[2]), NULL);
+ ok_hwnd(GetParent(hWndList[3]), hWndList[1]);
+ ok_hwnd(GetParent(hWndList[4]), hWndList[1]);
+ ok_hwnd(GetParent(hWndList[5]), hWndList[2]);
+
+ DestroyWindow(hWndList[1]);
+ ok(!IsWindow(hWndList[1]), "\n");
+ ok( IsWindow(hWndList[2]), "\n");
+ ok(!IsWindow(hWndList[3]), "\n");
+ ok( IsWindow(hWndList[4]), "\n");
+ ok(!IsWindow(hWndList[5]), "\n");
+
+ ok_hwnd(GetParent(hWndList[1]), NULL);
+ ok_hwnd(GetParent(hWndList[2]), NULL);
+ ok_hwnd(GetParent(hWndList[3]), NULL);
+ ok_hwnd(GetParent(hWndList[4]), hWndList[2]);
+ ok_hwnd(GetParent(hWndList[5]), NULL);
+
+trace("\n");
+ while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
+ {
+ int iwnd = get_iwnd(msg.hwnd, FALSE);
+ if(!(msg.message > WM_USER || IsDWmMsg(msg.message) ||
IseKeyMsg(msg.message)))
+ RECOND_MESSAGE(iwnd, msg.message, POST, 0, 0);
+ DispatchMessageA( &msg );
+ }
+trace("\n");
+ TRACE_CACHE();
+ }
Propchange: trunk/rostests/apitests/user32/CreateWindowEx.c
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: trunk/rostests/apitests/user32/CreateWindowEx.c
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: trunk/rostests/apitests/user32/helper.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/helper.c?…
==============================================================================
--- trunk/rostests/apitests/user32/helper.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/user32/helper.c [iso-8859-1] Wed Feb 11 23:53:08 2015
@@ -23,6 +23,12 @@
{
switch(msg)
{
+ case WM_CREATE: return "WM_CREATE";
+ case WM_NCCREATE: return "WM_NCCREATE";
+ case WM_PARENTNOTIFY: return "WM_PARENTNOTIFY";
+ case WM_DESTROY: return "WM_DESTROY";
+ case WM_NCDESTROY: return "WM_NCDESTROY";
+ case WM_CHILDACTIVATE: return "WM_CHILDACTIVATE";
case WM_NCACTIVATE: return "WM_NCACTIVATE";
case WM_ACTIVATE: return "WM_ACTIVATE";
case WM_ACTIVATEAPP: return "WM_ACTIVATEAPP";
Modified: trunk/rostests/apitests/user32/testlist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/user32/testlist.…
==============================================================================
--- trunk/rostests/apitests/user32/testlist.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/user32/testlist.c [iso-8859-1] Wed Feb 11 23:53:08 2015
@@ -5,6 +5,7 @@
extern void func_AttachThreadInput(void);
extern void func_CreateIconFromResourceEx(void);
+extern void func_CreateWindowEx(void);
extern void func_DeferWindowPos(void);
extern void func_DestroyCursorIcon(void);
extern void func_DrawIconEx(void);
@@ -33,6 +34,7 @@
{
{ "AttachThreadInput", func_AttachThreadInput },
{ "CreateIconFromResourceEx", func_CreateIconFromResourceEx },
+ { "CreateWindowEx", func_CreateWindowEx },
{ "DeferWindowPos", func_DeferWindowPos },
{ "DestroyCursorIcon", func_DestroyCursorIcon },
{ "DrawIconEx", func_DrawIconEx },