Author: hbelusca
Date: Tue Oct 18 15:35:06 2016
New Revision: 72981
URL:
http://svn.reactos.org/svn/reactos?rev=72981&view=rev
Log:
[KERNEL32_APITEST]: Commit a test for SetConsoleWindowInfo.
Added:
trunk/rostests/apitests/kernel32/SetConsoleWindowInfo.c (with props)
Modified:
trunk/rostests/apitests/kernel32/CMakeLists.txt
trunk/rostests/apitests/kernel32/testlist.c
Modified: trunk/rostests/apitests/kernel32/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/kernel32/CMakeLi…
==============================================================================
--- trunk/rostests/apitests/kernel32/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/rostests/apitests/kernel32/CMakeLists.txt [iso-8859-1] Tue Oct 18 15:35:06 2016
@@ -10,6 +10,7 @@
lstrcpynW.c
MultiByteToWideChar.c
PrivMoveFileIdentityW.c
+ SetConsoleWindowInfo.c
SetCurrentDirectory.c
SetUnhandledExceptionFilter.c
TerminateProcess.c
Added: trunk/rostests/apitests/kernel32/SetConsoleWindowInfo.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/kernel32/SetCons…
==============================================================================
--- trunk/rostests/apitests/kernel32/SetConsoleWindowInfo.c (added)
+++ trunk/rostests/apitests/kernel32/SetConsoleWindowInfo.c [iso-8859-1] Tue Oct 18
15:35:06 2016
@@ -0,0 +1,218 @@
+/*
+ * PROJECT: ReactOS api tests
+ * LICENSE: GPLv2+ - See COPYING in the top level directory
+ * PURPOSE: Test for SetConsoleWindowInfo
+ * PROGRAMMER: Hermes Belusca-Maito
+ */
+
+#include <apitest.h>
+#include <wincon.h>
+
+START_TEST(SetConsoleWindowInfo)
+{
+ /*
+ * The aim of this test is to show that what MSDN says about the validity
+ * checks performed on the window size rect given to SetConsoleWindowInfo
+ * is partially wrong.
+ *
+ * Indeed, while it is claimed that:
+ * "The function fails if the specified window rectangle extends beyond
+ * the boundaries of the console screen buffer. This means that the Top
+ * and Left members of the lpConsoleWindow rectangle (or the calculated
+ * top and left coordinates, if bAbsolute is FALSE) cannot be less than
+ * zero. Similarly, the Bottom and Right members (or the calculated
+ * bottom and right coordinates) cannot be greater than (screen buffer
+ * height â 1) and (screen buffer width â 1), respectively. The function
+ * also fails if the Right member (or calculated right coordinate) is
+ * less than or equal to the Left member (or calculated left coordinate)
+ * or if the Bottom member (or calculated bottom coordinate) is less than
+ * or equal to the Top member (or calculated top coordinate)."
+ *
+ * the really performed tests are fewer, and it appears that the console
+ * subsystem knows how to take proper actions when the window size rect
+ * has e.g. negative left/top coordinates...
+ *
+ * NOTE that we all perform those tests in "absolute mode" (second
parameter
+ * of SetConsoleWindowInfo being TRUE), so that the specified window size rect
+ * is in absolute coordinates (i.e. relative to the console screen buffer),
+ * and not in coordinates relative to the current window-corner coordinates.
+ */
+
+ BOOL Success;
+ DWORD dwLastError;
+ HANDLE hConOut;
+ COORD Resolution;
+ CONSOLE_SCREEN_BUFFER_INFO csbi, csbi2;
+ SMALL_RECT ConRect;
+
+ /* First, retrieve a handle to the real console output, even if we are redirected */
+ hConOut = CreateFileW(L"CONOUT$", GENERIC_READ|GENERIC_WRITE, 0, NULL,
OPEN_EXISTING, 0, 0);
+ ok(hConOut != INVALID_HANDLE_VALUE, "Opening ConOut\n");
+ if (hConOut == INVALID_HANDLE_VALUE)
+ return; // We cannot run this test if we failed...
+
+ /* Retrieve console screen buffer info */
+ Success = GetConsoleScreenBufferInfo(hConOut, &csbi);
+ ok(Success, "Getting SB info\n");
+ if (!Success)
+ goto Cleanup; // We cannot as well run this test if we failed...
+
+ /*
+ * Set the console screen buffer to a correct size
+ * that should not completely fill the computer screen.
+ */
+ Resolution.X = 80;
+ Resolution.Y = 25;
+ if (Resolution.X != csbi.dwSize.X || Resolution.Y != csbi.dwSize.Y)
+ {
+ SHORT oldWidth, oldHeight;
+
+ oldWidth = csbi.srWindow.Right - csbi.srWindow.Left + 1;
+ oldHeight = csbi.srWindow.Bottom - csbi.srWindow.Top + 1;
+
+ /*
+ * If the current console window is too large for
+ * the new screen buffer, resize it first.
+ */
+ if (oldWidth > Resolution.X || oldHeight > Resolution.Y)
+ {
+ ConRect.Left = ConRect.Top = 0;
+ ConRect.Right = ConRect.Left + min(oldWidth , Resolution.X) - 1;
+ ConRect.Bottom = ConRect.Top + min(oldHeight, Resolution.Y) - 1;
+ Success = SetConsoleWindowInfo(hConOut, TRUE, &ConRect);
+ ok(Success, "Setting console wnd info failed with last error error
%lu\n", GetLastError());
+ }
+
+ /* Now resize the screen buffer */
+ Success = SetConsoleScreenBufferSize(hConOut, Resolution);
+ ok(Success, "Setting console SB size failed with last error error
%lu\n", GetLastError());
+
+ /*
+ * Setting a new screen buffer size can change other information,
+ * so update the saved console information.
+ */
+ GetConsoleScreenBufferInfo(hConOut, &csbi);
+ }
+
+ /* Update console screen buffer info */
+ Success = GetConsoleScreenBufferInfo(hConOut, &csbi);
+ ok(Success, "Getting SB info\n");
+ if (!Success)
+ goto Cleanup; // We cannot as well run this test if we failed...
+
+ /* Test 1: Resize the console window to its possible maximum size (should succeed)
*/
+ ConRect.Left = ConRect.Top = 0;
+ ConRect.Right = ConRect.Left + min(csbi.dwSize.X, csbi.dwMaximumWindowSize.X) - 1;
+ ConRect.Bottom = ConRect.Top + min(csbi.dwSize.Y, csbi.dwMaximumWindowSize.Y) - 1;
+ SetLastError(0xdeadbeef);
+ Success = SetConsoleWindowInfo(hConOut, TRUE, &ConRect);
+ dwLastError = GetLastError();
+ ok(Success, "Setting console wnd info\n");
+ ok(dwLastError != ERROR_INVALID_PARAMETER, "GetLastError: %lu\n",
dwLastError);
+
+ /* Test 2: Set Right/Bottom members smaller than Left/Top members
+ * (should fail, agrees with MSDN) */
+ ConRect.Left = csbi.dwSize.X - 5;
+ ConRect.Right = 0;
+ ConRect.Top = csbi.dwSize.Y - 5;
+ ConRect.Bottom = 0;
+ SetLastError(0xdeadbeef);
+ Success = SetConsoleWindowInfo(hConOut, TRUE, &ConRect);
+ dwLastError = GetLastError();
+ ok(!Success, "Setting console wnd info should have failed!\n");
+ ok(dwLastError == ERROR_INVALID_PARAMETER, "GetLastError: expecting %u got
%lu\n",
+ ERROR_INVALID_PARAMETER, dwLastError);
+
+ /* Test 3: Set negative Left/Top members, but correct Right/Bottom ones.
+ * The Left/Top members are shifted to zero while the Right/Bottom ones
+ * are shifted too in accordance.
+ * 1st situation where the Right/Bottom members will be ok after the shift
+ * (should succeed, disagrees with MSDN) */
+ ConRect.Left = ConRect.Top = -5;
+ ConRect.Right = csbi.dwSize.X - 7;
+ ConRect.Bottom = csbi.dwSize.Y - 7;
+ // Expected result: ConRect.Left == ConRect.Top == 0 and
+ // ConRect.Right == csbi.dwSize.X - 2, ConRect.Bottom == csbi.dwSize.Y - 2;
+ SetLastError(0xdeadbeef);
+ Success = SetConsoleWindowInfo(hConOut, TRUE, &ConRect);
+ dwLastError = GetLastError();
+ ok(Success, "Setting console wnd info should have succeeded!\n");
+ ok(dwLastError != ERROR_INVALID_PARAMETER, "GetLastError: %lu\n",
dwLastError);
+
+ /* Check the new reported window size rect */
+ Success = GetConsoleScreenBufferInfo(hConOut, &csbi2);
+ ok(Success, "Getting SB info\n");
+ if (Success)
+ {
+ ok(csbi2.srWindow.Left == 0, "srWindow.Left = %d, expected 0\n",
csbi2.srWindow.Left);
+ ok(csbi2.srWindow.Top == 0, "srWindow.Top = %d, expected 0\n",
csbi2.srWindow.Top);
+
+ /* NOTE that here we compare against the old csbi data! */
+ ok(csbi2.srWindow.Right == csbi.dwSize.X - 2, "srWindow.Right = %d, expected
%d\n",
+ csbi2.srWindow.Right, csbi.dwSize.X - 2);
+ ok(csbi2.srWindow.Bottom == csbi.dwSize.Y - 2, "srWindow.Bottom = %d,
expected %d\n",
+ csbi2.srWindow.Bottom, csbi.dwSize.Y - 2);
+ }
+
+ /* Test 4: Similar to Test 3, but set the Right/Bottom members too large
+ * with respect to the screen buffer size, so that after their shift, they
+ * still are too large (should fail, agrees with MSDN) */
+ ConRect.Left = ConRect.Top = -5;
+ ConRect.Right = csbi.dwSize.X + 2; // Bigger than SB size
+ ConRect.Bottom = csbi.dwSize.Y + 2; // Bigger than SB size
+ SetLastError(0xdeadbeef);
+ Success = SetConsoleWindowInfo(hConOut, TRUE, &ConRect);
+ dwLastError = GetLastError();
+ ok(!Success, "Setting console wnd info should have failed!\n");
+ ok(dwLastError == ERROR_INVALID_PARAMETER, "GetLastError: expecting %u got
%lu\n",
+ ERROR_INVALID_PARAMETER, dwLastError);
+
+ /* Check the new reported window size rect */
+ Success = GetConsoleScreenBufferInfo(hConOut, &csbi2);
+ ok(Success, "Getting SB info\n");
+ if (Success)
+ {
+ /* NOTE that here we compare against the old csbi data! */
+ ok(csbi2.srWindow.Left == 0, "srWindow(2).Left = %d, expected equal to
%d\n",
+ csbi2.srWindow.Left, 0);
+ ok(csbi2.srWindow.Top == 0, "srWindow(2).Top = %d, expected equal to
%d\n",
+ csbi2.srWindow.Top, 0);
+ ok(csbi2.srWindow.Right == csbi.dwSize.X - 2, "srWindow(2).Right = %d,
expected equal to %d\n",
+ csbi2.srWindow.Right, csbi.dwSize.X - 2);
+ ok(csbi2.srWindow.Bottom == csbi.dwSize.Y - 2, "srWindow(2).Bottom = %d,
expected equal to %d\n",
+ csbi2.srWindow.Bottom, csbi.dwSize.Y - 2);
+ }
+
+ /* Test 5: Similar to Tests 3 and 4, but we here just check what happens for
+ * the Right/Bottom members when they are too large, without caring about the
+ * Left/Top members (the latter being set to valid values this time)
+ * (should fail, agrees with MSDN) */
+ ConRect.Left = ConRect.Top = 2; // OK
+ ConRect.Right = csbi.dwSize.X + 7; // Bigger than SB size
+ ConRect.Bottom = csbi.dwSize.Y + 7; // Bigger than SB size
+ SetLastError(0xdeadbeef);
+ Success = SetConsoleWindowInfo(hConOut, TRUE, &ConRect);
+ dwLastError = GetLastError();
+ ok(!Success, "Setting console wnd info should have failed!\n");
+ ok(dwLastError == ERROR_INVALID_PARAMETER, "GetLastError: expecting %u got
%lu\n",
+ ERROR_INVALID_PARAMETER, dwLastError);
+
+ /* Check the new reported window size rect */
+ Success = GetConsoleScreenBufferInfo(hConOut, &csbi2);
+ ok(Success, "Getting SB info\n");
+ if (Success)
+ {
+ ok(csbi2.srWindow.Left == 0, "srWindow.Left = %d, expected 0\n",
csbi2.srWindow.Left);
+ ok(csbi2.srWindow.Top == 0, "srWindow.Top = %d, expected 0\n",
csbi2.srWindow.Top);
+
+ /* NOTE that here we compare against the old csbi data! */
+ ok(csbi2.srWindow.Right == csbi.dwSize.X - 2, "srWindow.Right = %d, expected
%d\n",
+ csbi2.srWindow.Right, csbi.dwSize.X - 2);
+ ok(csbi2.srWindow.Bottom == csbi.dwSize.Y - 2, "srWindow.Bottom = %d,
expected %d\n",
+ csbi2.srWindow.Bottom, csbi.dwSize.Y - 2);
+ }
+
+ /* Done! */
+Cleanup:
+ CloseHandle(hConOut);
+}
Propchange: trunk/rostests/apitests/kernel32/SetConsoleWindowInfo.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/rostests/apitests/kernel32/testlist.c
URL:
http://svn.reactos.org/svn/reactos/trunk/rostests/apitests/kernel32/testlis…
==============================================================================
--- trunk/rostests/apitests/kernel32/testlist.c [iso-8859-1] (original)
+++ trunk/rostests/apitests/kernel32/testlist.c [iso-8859-1] Tue Oct 18 15:35:06 2016
@@ -14,6 +14,7 @@
extern void func_Mailslot(void);
extern void func_MultiByteToWideChar(void);
extern void func_PrivMoveFileIdentityW(void);
+extern void func_SetConsoleWindowInfo(void);
extern void func_SetCurrentDirectory(void);
extern void func_SetUnhandledExceptionFilter(void);
extern void func_TerminateProcess(void);
@@ -33,6 +34,7 @@
{ "MailslotRead", func_Mailslot },
{ "MultiByteToWideChar", func_MultiByteToWideChar },
{ "PrivMoveFileIdentityW", func_PrivMoveFileIdentityW },
+ { "SetConsoleWindowInfo", func_SetConsoleWindowInfo },
{ "SetCurrentDirectory", func_SetCurrentDirectory },
{ "SetUnhandledExceptionFilter", func_SetUnhandledExceptionFilter },
{ "TerminateProcess", func_TerminateProcess },