From 1cb2379b988a08f0f66cb653d14ddf8e7d54fa21 Mon Sep 17 00:00:00 2001 From: Thomas Faber Date: Fri, 4 May 2012 10:28:54 +0000 Subject: [PATCH] [KERNEL32_APITEST] - Add some tests for GetCurrentDirectory and SetCurrentDirectory svn path=/trunk/; revision=56489 --- rostests/apitests/kernel32/CMakeLists.txt | 2 + .../apitests/kernel32/GetCurrentDirectory.c | 218 ++++++++++++++++++ .../apitests/kernel32/SetCurrentDirectory.c | 109 +++++++++ rostests/apitests/kernel32/testlist.c | 6 +- 4 files changed, 334 insertions(+), 1 deletion(-) create mode 100644 rostests/apitests/kernel32/GetCurrentDirectory.c create mode 100644 rostests/apitests/kernel32/SetCurrentDirectory.c diff --git a/rostests/apitests/kernel32/CMakeLists.txt b/rostests/apitests/kernel32/CMakeLists.txt index bd2478d4e52..a52c0fd8fb4 100644 --- a/rostests/apitests/kernel32/CMakeLists.txt +++ b/rostests/apitests/kernel32/CMakeLists.txt @@ -2,7 +2,9 @@ add_definitions(-D_DLL -D__USE_CRTIMP) list(APPEND SOURCE + GetCurrentDirectory.c GetDriveType.c + SetCurrentDirectory.c testlist.c) add_executable(kernel32_apitest ${SOURCE}) diff --git a/rostests/apitests/kernel32/GetCurrentDirectory.c b/rostests/apitests/kernel32/GetCurrentDirectory.c new file mode 100644 index 00000000000..a927169b7bc --- /dev/null +++ b/rostests/apitests/kernel32/GetCurrentDirectory.c @@ -0,0 +1,218 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Test for GetCurrentDirectory + * PROGRAMMER: Thomas Faber + */ + +#define WIN32_NO_STATUS +#include +#include +#include + +static +BOOLEAN +CheckBuffer( + const VOID *Buffer, + SIZE_T Size, + UCHAR Value) +{ + const UCHAR *Array = Buffer; + SIZE_T i; + + for (i = 0; i < Size; i++) + if (Array[i] != Value) + { + trace("Expected %x, found %x at offset %lu\n", Value, Array[i], (ULONG)i); + return FALSE; + } + return TRUE; +} + +static +BOOLEAN +CheckStringBufferA( + const VOID *Buffer, + SIZE_T Size, + PCSTR Expected, + UCHAR Fill) +{ + const CHAR *Chars = Buffer; + const UCHAR *UChars = Buffer; + SIZE_T Length = strlen(Expected); + SIZE_T i; + + if (Size < Length) + { + ok(0, "Size = %lu, Length = %lu\n", (ULONG)Size, (ULONG)Length); + return FALSE; + } + + for (i = 0; i < Length; i++) + if (Chars[i] != Expected[i]) + { + trace("Expected %x, found %x at offset %lu\n", Expected[i], Chars[i], (ULONG)i); + return FALSE; + } + + ok(Chars[i] == 0, "Expected null terminator, found %x at offset %lu\n", Chars[i], (ULONG)i); + i++; + + for (; i < Size; i++) + if (UChars[i] != Fill) + { + trace("Expected %x, found %x at offset %lu\n", Fill, UChars[i], (ULONG)i); + return FALSE; + } + return TRUE; +} + +static +BOOLEAN +CheckStringBufferW( + const VOID *Buffer, + SIZE_T Size, + PCWSTR Expected, + UCHAR Fill) +{ + const WCHAR *Chars = Buffer; + const UCHAR *UChars = Buffer; + SIZE_T Length = wcslen(Expected); + SIZE_T i; + + if (Size < Length) + { + ok(0, "Size = %lu, Length = %lu\n", (ULONG)Size, (ULONG)Length); + return FALSE; + } + + for (i = 0; i < Length; i++) + if (Chars[i] != Expected[i]) + { + trace("Expected %x, found %x at offset %lu\n", Expected[i], Chars[i], (ULONG)i); + return FALSE; + } + + ok(Chars[i] == 0, "Expected null terminator, found %x at offset %lu\n", Chars[i], (ULONG)i); + i++; + + i *= sizeof(WCHAR); + + for (; i < Size; i++) + if (UChars[i] != Fill) + { + trace("Expected %x, found %x at offset %lu\n", Fill, UChars[i], (ULONG)i); + return FALSE; + } + return TRUE; +} + +static +VOID +TestGetCurrentDirectoryA(VOID) +{ + CHAR Buffer[MAX_PATH]; + DWORD Length; + BOOL Ret; + BOOLEAN Okay; + + Ret = SetCurrentDirectoryA("C:\\"); + ok(Ret == TRUE, "SetCurrentDirectory failed with %lu\n", GetLastError()); + + Length = GetCurrentDirectoryA(0, NULL); + ok(Length == sizeof("C:\\"), "Length = %lu\n", Length); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryA(sizeof(Buffer), Buffer); + ok(Length == sizeof("C:\\") - 1, "Length = %lu\n", Length); + Okay = CheckStringBufferA(Buffer, sizeof(Buffer), "C:\\", 0x55); + ok(Okay, "CheckStringBufferA failed\n"); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryA(0, Buffer); + ok(Length == sizeof("C:\\"), "Length = %lu\n", Length); + Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55); + ok(Okay, "CheckBuffer failed\n"); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryA(1, Buffer); + ok(Length == sizeof("C:\\"), "Length = %lu\n", Length); + Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55); + ok(Okay, "CheckBuffer failed\n"); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryA(2, Buffer); + ok(Length == sizeof("C:\\"), "Length = %lu\n", Length); + Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55); + ok(Okay, "CheckBuffer failed\n"); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryA(3, Buffer); + ok(Length == sizeof("C:\\"), "Length = %lu\n", Length); + Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55); + ok(Okay, "CheckBuffer failed\n"); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryA(4, Buffer); + ok(Length == sizeof("C:\\") - 1, "Length = %lu\n", Length); + Okay = CheckStringBufferA(Buffer, sizeof(Buffer), "C:\\", 0x55); + ok(Okay, "CheckStringBufferA failed\n"); +} + +static +VOID +TestGetCurrentDirectoryW(VOID) +{ + WCHAR Buffer[MAX_PATH]; + DWORD Length; + BOOL Ret; + BOOLEAN Okay; + + Ret = SetCurrentDirectoryW(L"C:\\"); + ok(Ret == TRUE, "SetCurrentDirectory failed with %lu\n", GetLastError()); + + Length = GetCurrentDirectoryW(0, NULL); + ok(Length == sizeof("C:\\"), "Length = %lu\n", Length); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryW(sizeof(Buffer) / sizeof(WCHAR), Buffer); + ok(Length == sizeof("C:\\") - 1, "Length = %lu\n", Length); + Okay = CheckStringBufferW(Buffer, sizeof(Buffer), L"C:\\", 0x55); + ok(Okay, "CheckStringBufferW failed\n"); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryW(0, Buffer); + ok(Length == sizeof("C:\\"), "Length = %lu\n", Length); + Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55); + ok(Okay, "CheckBuffer failed\n"); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryW(1, Buffer); + ok(Length == sizeof("C:\\"), "Length = %lu\n", Length); + Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55); + ok(Okay, "CheckBuffer failed\n"); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryW(2, Buffer); + ok(Length == sizeof("C:\\"), "Length = %lu\n", Length); + Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55); + ok(Okay, "CheckBuffer failed\n"); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryW(3, Buffer); + ok(Length == sizeof("C:\\"), "Length = %lu\n", Length); + Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55); + ok(Okay, "CheckBuffer failed\n"); + + RtlFillMemory(Buffer, sizeof(Buffer), 0x55); + Length = GetCurrentDirectoryW(4, Buffer); + ok(Length == sizeof("C:\\") - 1, "Length = %lu\n", Length); + Okay = CheckStringBufferW(Buffer, sizeof(Buffer), L"C:\\", 0x55); + ok(Okay, "CheckStringBufferW failed\n"); +} + +START_TEST(GetCurrentDirectory) +{ + TestGetCurrentDirectoryA(); + TestGetCurrentDirectoryW(); +} diff --git a/rostests/apitests/kernel32/SetCurrentDirectory.c b/rostests/apitests/kernel32/SetCurrentDirectory.c new file mode 100644 index 00000000000..be20bd95d93 --- /dev/null +++ b/rostests/apitests/kernel32/SetCurrentDirectory.c @@ -0,0 +1,109 @@ +/* + * PROJECT: ReactOS api tests + * LICENSE: GPLv2+ - See COPYING in the top level directory + * PURPOSE: Test for SetCurrentDirectory + * PROGRAMMER: Thomas Faber + */ + +#define WIN32_NO_STATUS +#include +#include +#include + +static +VOID +SetUnrelatedDirectory(VOID) +{ + WCHAR Buffer[MAX_PATH]; + BOOL Ret; + + GetWindowsDirectoryW(Buffer, sizeof(Buffer) / sizeof(WCHAR)); + Ret = SetCurrentDirectoryW(Buffer); + ok(Ret == TRUE, "SetCurrentDirectoryW failed\n"); +} + +static +VOID +TestSetCurrentDirectoryA(VOID) +{ + BOOL Ret; + CHAR Buffer[MAX_PATH]; + DWORD Length; + + SetUnrelatedDirectory(); + + Ret = SetCurrentDirectoryA("C:\\"); + ok(Ret == TRUE, "SetCurrentDirectoryA failed\n"); + Length = GetCurrentDirectoryA(sizeof(Buffer), Buffer); + ok(Length == 3, "Length = %lu\n", Length); + ok(!strcmp(Buffer, "C:\\"), "Current directory is %s\n", Buffer); + + /* Same directory - succeeds */ + Ret = SetCurrentDirectoryA("C:\\"); + ok(Ret == TRUE, "SetCurrentDirectoryA failed\n"); + Length = GetCurrentDirectoryA(sizeof(Buffer), Buffer); + ok(Length == 3, "Length = %lu\n", Length); + ok(!strcmp(Buffer, "C:\\"), "Current directory is %s\n", Buffer); + + /* Same directory, lowercase - succeeds and does not change case */ + Ret = SetCurrentDirectoryA("c:\\"); + ok(Ret == TRUE, "SetCurrentDirectoryA failed\n"); + Length = GetCurrentDirectoryA(sizeof(Buffer), Buffer); + ok(Length == 3, "Length = %lu\n", Length); + ok(!strcmp(Buffer, "C:\\"), "Current directory is %s\n", Buffer); + + SetUnrelatedDirectory(); + + /* Now this one does change case */ + Ret = SetCurrentDirectoryA("c:\\"); + ok(Ret == TRUE, "SetCurrentDirectoryA failed\n"); + Length = GetCurrentDirectoryA(sizeof(Buffer), Buffer); + ok(Length == 3, "Length = %lu\n", Length); + ok(!strcmp(Buffer, "c:\\"), "Current directory is %s\n", Buffer); +} + +static +VOID +TestSetCurrentDirectoryW(VOID) +{ + BOOL Ret; + WCHAR Buffer[MAX_PATH]; + DWORD Length; + + SetUnrelatedDirectory(); + + Ret = SetCurrentDirectoryW(L"C:\\"); + ok(Ret == TRUE, "SetCurrentDirectoryW failed\n"); + Length = GetCurrentDirectoryW(sizeof(Buffer) / sizeof(WCHAR), Buffer); + ok(Length == 3, "Length = %lu\n", Length); + ok(!wcscmp(Buffer, L"C:\\"), "Current directory is %ls\n", Buffer); + + /* Same directory - succeeds */ + Ret = SetCurrentDirectoryW(L"C:\\"); + ok(Ret == TRUE, "SetCurrentDirectoryW failed\n"); + Length = GetCurrentDirectoryW(sizeof(Buffer) / sizeof(WCHAR), Buffer); + ok(Length == 3, "Length = %lu\n", Length); + ok(!wcscmp(Buffer, L"C:\\"), "Current directory is %ls\n", Buffer); + + /* Same directory, lowercase - succeeds and does not change case */ + Ret = SetCurrentDirectoryW(L"c:\\"); + ok(Ret == TRUE, "SetCurrentDirectoryW failed\n"); + Length = GetCurrentDirectoryW(sizeof(Buffer) / sizeof(WCHAR), Buffer); + ok(Length == 3, "Length = %lu\n", Length); + ok(!wcscmp(Buffer, L"C:\\"), "Current directory is %ls\n", Buffer); + + SetUnrelatedDirectory(); + + /* Now this one does change case */ + Ret = SetCurrentDirectoryW(L"c:\\"); + ok(Ret == TRUE, "SetCurrentDirectoryW failed\n"); + Length = GetCurrentDirectoryW(sizeof(Buffer) / sizeof(WCHAR), Buffer); + ok(Length == 3, "Length = %lu\n", Length); + ok(!wcscmp(Buffer, L"c:\\"), "Current directory is %ls\n", Buffer); +} + +START_TEST(SetCurrentDirectory) +{ + TestSetCurrentDirectoryA(); + TestSetCurrentDirectoryW(); +} diff --git a/rostests/apitests/kernel32/testlist.c b/rostests/apitests/kernel32/testlist.c index 123e1ce2ea5..140397de56e 100644 --- a/rostests/apitests/kernel32/testlist.c +++ b/rostests/apitests/kernel32/testlist.c @@ -5,11 +5,15 @@ #define STANDALONE #include "wine/test.h" +extern void func_GetCurrentDirectory(void); extern void func_GetDriveType(void); +extern void func_SetCurrentDirectory(void); const struct test winetest_testlist[] = { - { "GetDriveType", func_GetDriveType }, + { "GetCurrentDirectory", func_GetCurrentDirectory }, + { "GetDriveType", func_GetDriveType }, + { "SetCurrentDirectory", func_SetCurrentDirectory }, { 0, 0 } }; -- 2.17.1