[KERNEL32_APITEST]
authorThomas Faber <thomas.faber@reactos.org>
Fri, 4 May 2012 10:28:54 +0000 (10:28 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Fri, 4 May 2012 10:28:54 +0000 (10:28 +0000)
- Add some tests for GetCurrentDirectory and SetCurrentDirectory

svn path=/trunk/; revision=56489

rostests/apitests/kernel32/CMakeLists.txt
rostests/apitests/kernel32/GetCurrentDirectory.c [new file with mode: 0644]
rostests/apitests/kernel32/SetCurrentDirectory.c [new file with mode: 0644]
rostests/apitests/kernel32/testlist.c

index bd2478d..a52c0fd 100644 (file)
@@ -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 (file)
index 0000000..a927169
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPLv2+ - See COPYING in the top level directory
+ * PURPOSE:         Test for GetCurrentDirectory
+ * PROGRAMMER:      Thomas Faber <thfabba@gmx.de>
+ */
+
+#define WIN32_NO_STATUS
+#include <stdio.h>
+#include <wine/test.h>
+#include <ndk/rtltypes.h>
+
+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 (file)
index 0000000..be20bd9
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * PROJECT:         ReactOS api tests
+ * LICENSE:         GPLv2+ - See COPYING in the top level directory
+ * PURPOSE:         Test for SetCurrentDirectory
+ * PROGRAMMER:      Thomas Faber <thfabba@gmx.de>
+ */
+
+#define WIN32_NO_STATUS
+#include <stdio.h>
+#include <wine/test.h>
+#include <ndk/rtltypes.h>
+
+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();
+}
index 123e1ce..140397d 100644 (file)
@@ -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 }
 };