[KERNEL32_APITEST]
[reactos.git] / rostests / apitests / kernel32 / GetCurrentDirectory.c
1 /*
2 * PROJECT: ReactOS api tests
3 * LICENSE: GPLv2+ - See COPYING in the top level directory
4 * PURPOSE: Test for GetCurrentDirectory
5 * PROGRAMMER: Thomas Faber <thfabba@gmx.de>
6 */
7
8 #define WIN32_NO_STATUS
9 #include <stdio.h>
10 #include <wine/test.h>
11 #include <ndk/rtltypes.h>
12
13 static
14 BOOLEAN
15 CheckBuffer(
16 const VOID *Buffer,
17 SIZE_T Size,
18 UCHAR Value)
19 {
20 const UCHAR *Array = Buffer;
21 SIZE_T i;
22
23 for (i = 0; i < Size; i++)
24 if (Array[i] != Value)
25 {
26 trace("Expected %x, found %x at offset %lu\n", Value, Array[i], (ULONG)i);
27 return FALSE;
28 }
29 return TRUE;
30 }
31
32 static
33 BOOLEAN
34 CheckStringBufferA(
35 const VOID *Buffer,
36 SIZE_T Size,
37 PCSTR Expected,
38 UCHAR Fill)
39 {
40 const CHAR *Chars = Buffer;
41 const UCHAR *UChars = Buffer;
42 SIZE_T Length = strlen(Expected);
43 SIZE_T i;
44
45 if (Size < Length)
46 {
47 ok(0, "Size = %lu, Length = %lu\n", (ULONG)Size, (ULONG)Length);
48 return FALSE;
49 }
50
51 for (i = 0; i < Length; i++)
52 if (Chars[i] != Expected[i])
53 {
54 trace("Expected %x, found %x at offset %lu\n", Expected[i], Chars[i], (ULONG)i);
55 return FALSE;
56 }
57
58 ok(Chars[i] == 0, "Expected null terminator, found %x at offset %lu\n", Chars[i], (ULONG)i);
59 i++;
60
61 for (; i < Size; i++)
62 if (UChars[i] != Fill)
63 {
64 trace("Expected %x, found %x at offset %lu\n", Fill, UChars[i], (ULONG)i);
65 return FALSE;
66 }
67 return TRUE;
68 }
69
70 static
71 BOOLEAN
72 CheckStringBufferW(
73 const VOID *Buffer,
74 SIZE_T Size,
75 PCWSTR Expected,
76 UCHAR Fill)
77 {
78 const WCHAR *Chars = Buffer;
79 const UCHAR *UChars = Buffer;
80 SIZE_T Length = wcslen(Expected);
81 SIZE_T i;
82
83 if (Size < Length)
84 {
85 ok(0, "Size = %lu, Length = %lu\n", (ULONG)Size, (ULONG)Length);
86 return FALSE;
87 }
88
89 for (i = 0; i < Length; i++)
90 if (Chars[i] != Expected[i])
91 {
92 trace("Expected %x, found %x at offset %lu\n", Expected[i], Chars[i], (ULONG)i);
93 return FALSE;
94 }
95
96 ok(Chars[i] == 0, "Expected null terminator, found %x at offset %lu\n", Chars[i], (ULONG)i);
97 i++;
98
99 i *= sizeof(WCHAR);
100
101 for (; i < Size; i++)
102 if (UChars[i] != Fill)
103 {
104 trace("Expected %x, found %x at offset %lu\n", Fill, UChars[i], (ULONG)i);
105 return FALSE;
106 }
107 return TRUE;
108 }
109
110 static
111 VOID
112 TestGetCurrentDirectoryA(VOID)
113 {
114 CHAR Buffer[MAX_PATH];
115 DWORD Length;
116 BOOL Ret;
117 BOOLEAN Okay;
118
119 Ret = SetCurrentDirectoryA("C:\\");
120 ok(Ret == TRUE, "SetCurrentDirectory failed with %lu\n", GetLastError());
121
122 Length = GetCurrentDirectoryA(0, NULL);
123 ok(Length == sizeof("C:\\"), "Length = %lu\n", Length);
124
125 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
126 Length = GetCurrentDirectoryA(sizeof(Buffer), Buffer);
127 ok(Length == sizeof("C:\\") - 1, "Length = %lu\n", Length);
128 Okay = CheckStringBufferA(Buffer, sizeof(Buffer), "C:\\", 0x55);
129 ok(Okay, "CheckStringBufferA failed\n");
130
131 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
132 Length = GetCurrentDirectoryA(0, Buffer);
133 ok(Length == sizeof("C:\\"), "Length = %lu\n", Length);
134 Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55);
135 ok(Okay, "CheckBuffer failed\n");
136
137 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
138 Length = GetCurrentDirectoryA(1, Buffer);
139 ok(Length == sizeof("C:\\"), "Length = %lu\n", Length);
140 Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55);
141 ok(Okay, "CheckBuffer failed\n");
142
143 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
144 Length = GetCurrentDirectoryA(2, Buffer);
145 ok(Length == sizeof("C:\\"), "Length = %lu\n", Length);
146 Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55);
147 ok(Okay, "CheckBuffer failed\n");
148
149 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
150 Length = GetCurrentDirectoryA(3, Buffer);
151 ok(Length == sizeof("C:\\"), "Length = %lu\n", Length);
152 Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55);
153 ok(Okay, "CheckBuffer failed\n");
154
155 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
156 Length = GetCurrentDirectoryA(4, Buffer);
157 ok(Length == sizeof("C:\\") - 1, "Length = %lu\n", Length);
158 Okay = CheckStringBufferA(Buffer, sizeof(Buffer), "C:\\", 0x55);
159 ok(Okay, "CheckStringBufferA failed\n");
160 }
161
162 static
163 VOID
164 TestGetCurrentDirectoryW(VOID)
165 {
166 WCHAR Buffer[MAX_PATH];
167 DWORD Length;
168 BOOL Ret;
169 BOOLEAN Okay;
170
171 Ret = SetCurrentDirectoryW(L"C:\\");
172 ok(Ret == TRUE, "SetCurrentDirectory failed with %lu\n", GetLastError());
173
174 Length = GetCurrentDirectoryW(0, NULL);
175 ok(Length == sizeof("C:\\"), "Length = %lu\n", Length);
176
177 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
178 Length = GetCurrentDirectoryW(sizeof(Buffer) / sizeof(WCHAR), Buffer);
179 ok(Length == sizeof("C:\\") - 1, "Length = %lu\n", Length);
180 Okay = CheckStringBufferW(Buffer, sizeof(Buffer), L"C:\\", 0x55);
181 ok(Okay, "CheckStringBufferW failed\n");
182
183 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
184 Length = GetCurrentDirectoryW(0, Buffer);
185 ok(Length == sizeof("C:\\"), "Length = %lu\n", Length);
186 Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55);
187 ok(Okay, "CheckBuffer failed\n");
188
189 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
190 Length = GetCurrentDirectoryW(1, Buffer);
191 ok(Length == sizeof("C:\\"), "Length = %lu\n", Length);
192 Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55);
193 ok(Okay, "CheckBuffer failed\n");
194
195 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
196 Length = GetCurrentDirectoryW(2, Buffer);
197 ok(Length == sizeof("C:\\"), "Length = %lu\n", Length);
198 Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55);
199 ok(Okay, "CheckBuffer failed\n");
200
201 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
202 Length = GetCurrentDirectoryW(3, Buffer);
203 ok(Length == sizeof("C:\\"), "Length = %lu\n", Length);
204 Okay = CheckBuffer(Buffer, sizeof(Buffer), 0x55);
205 ok(Okay, "CheckBuffer failed\n");
206
207 RtlFillMemory(Buffer, sizeof(Buffer), 0x55);
208 Length = GetCurrentDirectoryW(4, Buffer);
209 ok(Length == sizeof("C:\\") - 1, "Length = %lu\n", Length);
210 Okay = CheckStringBufferW(Buffer, sizeof(Buffer), L"C:\\", 0x55);
211 ok(Okay, "CheckStringBufferW failed\n");
212 }
213
214 START_TEST(GetCurrentDirectory)
215 {
216 TestGetCurrentDirectoryA();
217 TestGetCurrentDirectoryW();
218 }