2 * Unit test suite for Get*PathNamesA and (Get|Set)CurrentDirectoryA.
4 * Copyright 2002 Geoffrey Hausheer
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #include "wine/test.h"
30 #define HAS_TRAIL_SLASH_A(string) (string[lstrlenA(string)-1]=='\\')
32 #define LONGFILE "Long File test.path"
33 #define SHORTFILE "pathtest.pth"
34 #define SHORTDIR "shortdir"
35 #define LONGDIR "Long Directory"
36 #define NONFILE_SHORT "noexist.pth"
37 #define NONFILE_LONG "NonExistent File"
38 #define NONDIR_SHORT "notadir"
39 #define NONDIR_LONG "NonExistent Directory"
41 #define NOT_A_VALID_DRIVE '@'
43 /* the following characters don't work well with GetFullPathNameA
44 in Win98. I don't know if this is a FAT thing, or if it is an OS thing
45 but I don't test these characters now.
46 NOTE: Win2k allows GetFullPathNameA to work with them though
49 static const CHAR funny_chars
[]="!@#$%^&*()=+{}[],?'`";
50 static const CHAR is_char_ok
[] ="11111110111111111011";
52 static DWORD (WINAPI
*pGetLongPathNameA
)(LPCSTR
,LPSTR
,DWORD
);
54 /* a structure to deal with wine todos somewhat cleanly */
64 /* function that tests GetFullPathNameA, GetShortPathNameA,GetLongPathNameA */
65 /* NOTE: the passfail structure is used to allow cutomizeable todo checking
66 for wine. It is not very pretty, but it sure beats duplicating this
67 function lots of times
69 static void test_ValidPathA(CHAR
*curdir
, CHAR
*subdir
, CHAR
*filename
,
70 CHAR
*shortstr
, SLpassfail
*passfail
, CHAR
*errstr
) {
71 CHAR tmpstr
[MAX_PATH
],
72 fullpath
[MAX_PATH
], /*full path to the file (not short/long) */
73 subpath
[MAX_PATH
], /*relative path to the file */
74 fullpathshort
[MAX_PATH
], /*absolue path to the file (short format) */
75 fullpathlong
[MAX_PATH
], /*absolute path to the file (long format) */
76 curdirshort
[MAX_PATH
], /*absolute path to the current dir (short) */
77 curdirlong
[MAX_PATH
]; /*absolute path to the current dir (long) */
78 LPSTR strptr
; /*ptr to the filename portion of the path */
80 /* if passfail is NULL, we can perform all checks within this function,
81 otherwise, we will return the relevant data in the passfail struct, so
82 we must initialize it first
85 passfail
->shortlen
=-1;passfail
->s2llen
=-1;passfail
->longlen
=-1;
86 passfail
->shorterror
=0;passfail
->s2lerror
=0;passfail
->longerror
=0;
88 /* GetLongPathNameA is only supported on Win2k+ and Win98+ */
89 if(pGetLongPathNameA
) {
90 ok((len
=pGetLongPathNameA(curdir
,curdirlong
,MAX_PATH
)),
91 "%s: GetLongPathNameA failed\n",errstr
);
92 /*GetLongPathNameA can return a trailing '\\' but shouldn't do so here */
93 ok(! HAS_TRAIL_SLASH_A(curdirlong
),
94 "%s: GetLongPathNameA should not have a trailing \\\n",errstr
);
96 ok((len
=GetShortPathNameA(curdir
,curdirshort
,MAX_PATH
)),
97 "%s: GetShortPathNameA failed\n",errstr
);
98 /*GetShortPathNameA can return a trailing '\\' but shouldn't do so here */
99 ok(! HAS_TRAIL_SLASH_A(curdirshort
),
100 "%s: GetShortPathNameA should not have a trailing \\\n",errstr
);
101 /* build relative and absolute paths from inputs */
102 if(lstrlenA(subdir
)) {
103 sprintf(subpath
,"%s\\%s",subdir
,filename
);
105 lstrcpyA(subpath
,filename
);
107 sprintf(fullpath
,"%s\\%s",curdir
,subpath
);
108 sprintf(fullpathshort
,"%s\\%s",curdirshort
,subpath
);
109 sprintf(fullpathlong
,"%s\\%s",curdirlong
,subpath
);
110 /* Test GetFullPathNameA functionality */
111 len
=GetFullPathNameA(subpath
,MAX_PATH
,tmpstr
,&strptr
);
112 ok(len
, "GetFullPathNameA failed for: '%s'\n",subpath
);
113 if(HAS_TRAIL_SLASH_A(subpath
)) {
115 "%s: GetFullPathNameA should not return a filename ptr\n",errstr
);
116 ok(lstrcmpiA(fullpath
,tmpstr
)==0,
117 "%s: GetFullPathNameA returned '%s' instead of '%s'\n",
118 errstr
,tmpstr
,fullpath
);
120 ok(lstrcmpiA(strptr
,filename
)==0,
121 "%s: GetFullPathNameA returned '%s' instead of '%s'\n",
122 errstr
,strptr
,filename
);
123 ok(lstrcmpiA(fullpath
,tmpstr
)==0,
124 "%s: GetFullPathNameA returned '%s' instead of '%s'\n",
125 errstr
,tmpstr
,fullpath
);
127 /* Test GetShortPathNameA functionality */
129 len
=GetShortPathNameA(fullpathshort
,shortstr
,MAX_PATH
);
131 ok(len
, "%s: GetShortPathNameA failed\n",errstr
);
133 passfail
->shortlen
=len
;
134 passfail
->shorterror
=GetLastError();
136 /* Test GetLongPathNameA functionality
137 We test both conversion from GetFullPathNameA and from GetShortPathNameA
139 if(pGetLongPathNameA
) {
142 len
=pGetLongPathNameA(shortstr
,tmpstr
,MAX_PATH
);
145 "%s: GetLongPathNameA failed during Short->Long conversion\n", errstr
);
146 ok(lstrcmpiA(fullpathlong
,tmpstr
)==0,
147 "%s: GetLongPathNameA returned '%s' instead of '%s'\n",
148 errstr
,tmpstr
,fullpathlong
);
150 passfail
->s2llen
=len
;
151 passfail
->s2lerror
=GetLastError();
155 len
=pGetLongPathNameA(fullpath
,tmpstr
,MAX_PATH
);
157 ok(len
, "%s: GetLongPathNameA failed\n",errstr
);
158 if(HAS_TRAIL_SLASH_A(fullpath
)) {
159 ok(lstrcmpiA(fullpathlong
,tmpstr
)==0,
160 "%s: GetLongPathNameA returned '%s' instead of '%s'\n",
161 errstr
,tmpstr
,fullpathlong
);
163 ok(lstrcmpiA(fullpathlong
,tmpstr
)==0,
164 "%s: GetLongPathNameA returned '%s' instead of '%s'\n",
165 errstr
,tmpstr
,fullpathlong
);
168 passfail
->longlen
=len
;
169 passfail
->longerror
=GetLastError();
174 /* split path into leading directory, and 8.3 filename */
175 static void test_SplitShortPathA(CHAR
*path
,CHAR
*dir
,CHAR
*eight
,CHAR
*three
) {
180 ext
=len
; fil
=len
; done
=0; error
=0;
181 /* walk backwards over path looking for '.' or '\\' separators */
182 for(i
=len
-1;(i
>=0) && (!done
);i
--) {
184 if(ext
!=len
) error
=1; else ext
=i
;
185 else if(path
[i
]=='\\') {
194 /* Check that we didn't find a trailing '\\' or multiple '.' */
195 ok(!error
,"Illegal file found in 8.3 path '%s'\n",path
);
196 /* Separate dir, root, and extension */
197 if(ext
!=len
) lstrcpyA(three
,path
+ext
+1); else lstrcpyA(three
,"");
199 lstrcpynA(eight
,path
+fil
+1,ext
-fil
);
200 lstrcpynA(dir
,path
,fil
+1);
202 lstrcpynA(eight
,path
,ext
+1);
205 /* Validate that root and extension really are 8.3 */
206 ok(lstrlenA(eight
)<=8 && lstrlenA(three
)<=3,
207 "GetShortPathNAmeA did not return an 8.3 path\n");
210 /* Check that GetShortPathNameA returns a valid 8.3 path */
211 static void test_LongtoShortA(CHAR
*teststr
,CHAR
*goodstr
,
212 CHAR
*ext
,CHAR
*errstr
) {
213 CHAR dir
[MAX_PATH
],eight
[MAX_PATH
],three
[MAX_PATH
];
215 test_SplitShortPathA(teststr
,dir
,eight
,three
);
216 ok(lstrcmpiA(dir
,goodstr
)==0,
217 "GetShortPathNameA returned '%s' instead of '%s'\n",dir
,goodstr
);
218 ok(lstrcmpiA(three
,ext
)==0,
219 "GetShortPathNameA returned '%s' with incorrect extension\n",three
);
222 /* Test that Get(Short|Long|Full)PathNameA work correctly with interesting
223 characters in the filename.
224 'valid' indicates whether this would be an allowed filename
225 'todo' indicates that wine doesn't get this right yet.
226 NOTE: We always call this routine with a nonexistent filename, so
227 Get(Short|Long)PathNameA should never pass, but GetFullPathNameA
230 static void test_FunnyChars(CHAR
*curdir
,CHAR
*curdir_short
,CHAR
*filename
, INT valid
,CHAR
*errstr
)
232 CHAR tmpstr
[MAX_PATH
],tmpstr1
[MAX_PATH
];
235 test_ValidPathA(curdir
,"",filename
,tmpstr
,&passfail
,errstr
);
237 sprintf(tmpstr1
,"%s\\%s",curdir_short
,filename
);
238 ok((passfail
.shortlen
==0 &&
239 (passfail
.shorterror
==ERROR_FILE_NOT_FOUND
|| passfail
.shorterror
==ERROR_PATH_NOT_FOUND
|| !passfail
.shorterror
)) ||
240 (passfail
.shortlen
==strlen(tmpstr1
) && lstrcmpiA(tmpstr
,tmpstr1
)==0),
241 "%s: GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n",
242 errstr
,passfail
.shortlen
,passfail
.shorterror
,tmpstr
);
244 ok(passfail
.shortlen
==0 &&
245 (passfail
.shorterror
==ERROR_INVALID_NAME
|| passfail
.shorterror
==ERROR_FILE_NOT_FOUND
|| !passfail
.shorterror
),
246 "%s: GetShortPathA should have failed len=%ld, error=%ld\n",
247 errstr
,passfail
.shortlen
,passfail
.shorterror
);
249 if(pGetLongPathNameA
) {
250 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
252 ok(passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
253 "%s: GetLongPathA returned %ld and not %d\n",
254 errstr
,passfail
.longerror
,ERROR_FILE_NOT_FOUND
);
256 ok(passfail
.longerror
==ERROR_INVALID_NAME
||
257 passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
258 "%s: GetLongPathA returned %ld and not %d or %d'\n",
259 errstr
, passfail
.longerror
,ERROR_INVALID_NAME
,ERROR_FILE_NOT_FOUND
);
264 /* Routine to test that SetCurrentDirectory behaves as expected. */
265 static void test_setdir(CHAR
*olddir
,CHAR
*newdir
,
266 CHAR
*cmprstr
, INT pass
,CHAR
*errstr
)
268 CHAR tmppath
[MAX_PATH
], *dirptr
;
269 DWORD val
,len
,chklen
;
271 val
=SetCurrentDirectoryA(newdir
);
272 len
=GetCurrentDirectoryA(MAX_PATH
,tmppath
);
273 /* if 'pass' then the SetDirectoryA was supposed to pass */
275 dirptr
=(cmprstr
==NULL
) ? newdir
: cmprstr
;
276 chklen
=lstrlenA(dirptr
);
277 ok(val
,"%s: SetCurrentDirectoryA failed\n",errstr
);
279 "%s: SetCurrentDirectory did not change the directory, though it passed\n",
281 ok(lstrcmpiA(dirptr
,tmppath
)==0,
282 "%s: SetCurrentDirectory did not change the directory, though it passed\n",
284 ok(SetCurrentDirectoryA(olddir
),
285 "%s: Couldn't set directory to it's original value\n",errstr
);
287 /* else thest that it fails correctly */
288 chklen
=lstrlenA(olddir
);
290 "%s: SetCurrentDirectoryA passed when it should have failed\n",errstr
);
292 "%s: SetCurrentDirectory changed the directory, though it failed\n",
294 ok(lstrcmpiA(olddir
,tmppath
)==0,
295 "%s: SetCurrentDirectory changed the directory, though it failed\n",
299 static void test_InitPathA(CHAR
*newdir
, CHAR
*curDrive
, CHAR
*otherDrive
)
301 CHAR tmppath
[MAX_PATH
], /*path to TEMP */
304 DWORD len
,len1
,drives
;
308 *curDrive
= *otherDrive
= NOT_A_VALID_DRIVE
;
310 /* Get the current drive letter */
311 if( GetCurrentDirectoryA( MAX_PATH
, tmpstr
))
312 *curDrive
= tmpstr
[0];
314 trace( "Unable to discover current drive, some tests will not be conducted.\n");
316 /* Test GetTempPathA */
317 len
=GetTempPathA(MAX_PATH
,tmppath
);
318 ok(len
!=0 && len
< MAX_PATH
,"GetTempPathA failed\n");
319 ok(HAS_TRAIL_SLASH_A(tmppath
),
320 "GetTempPathA returned a path that did not end in '\\'\n");
321 lstrcpyA(tmpstr
,"aaaaaaaa");
322 len1
=GetTempPathA(len
,tmpstr
);
324 "GetTempPathA should return string length %ld instead of %ld\n",len
+1,len1
);
326 /* Test GetTmpFileNameA
327 The only test we do here is whether GetTempFileNameA passes or not.
328 We do not thoroughly test this function yet (specifically, whether
329 it behaves correctly when 'unique' is non zero)
331 ok((id
=GetTempFileNameA(tmppath
,"path",0,newdir
)),"GetTempFileNameA failed\n");
332 sprintf(tmpstr
,"pat%.4x.tmp",id
& 0xffff);
333 sprintf(tmpstr1
,"pat%x.tmp",id
& 0xffff);
334 ok(lstrcmpiA(newdir
+lstrlenA(tmppath
),tmpstr
)==0 ||
335 lstrcmpiA(newdir
+lstrlenA(tmppath
),tmpstr1
)==0,
336 "GetTempPath returned '%s' which doesn't match '%s' or '%s'. id=%x\n",
337 newdir
,tmpstr
,tmpstr1
,id
);
339 /* Find first valid drive letter that is neither newdir[0] nor curDrive */
340 drives
= GetLogicalDrives() & ~(1<<(newdir
[0]-'A'));
341 if( *curDrive
!= NOT_A_VALID_DRIVE
)
342 drives
&= ~(1<<(*curDrive
-'A'));
344 for( *otherDrive
='A'; (drives
& 1) == 0; drives
>>=1, (*otherDrive
)++);
346 trace( "Could not find alternative drive, some tests will not be conducted.\n");
348 /* Do some CreateDirectoryA tests */
349 /* It would be nice to do test the SECURITY_ATTRIBUTES, but I don't
350 really understand how they work.
351 More formal tests should be done along with CreateFile tests
353 ok(CreateDirectoryA(newdir
,NULL
)==0,
354 "CreateDirectoryA succeeded even though a file of the same name exists\n");
355 ok(DeleteFileA(newdir
),"Couldn't delete the temporary file we just created\n");
356 ok(CreateDirectoryA(newdir
,NULL
),"CreateDirectoryA failed\n");
357 /* Create some files to test other functions. Note, we will test CreateFileA
360 sprintf(tmpstr
,"%s\\%s",newdir
,SHORTDIR
);
361 ok(CreateDirectoryA(tmpstr
,NULL
),"CreateDirectoryA failed\n");
362 sprintf(tmpstr
,"%s\\%s",newdir
,LONGDIR
);
363 ok(CreateDirectoryA(tmpstr
,NULL
),"CreateDirectoryA failed\n");
364 sprintf(tmpstr
,"%s\\%s\\%s",newdir
,SHORTDIR
,SHORTFILE
);
365 hndl
=CreateFileA(tmpstr
,GENERIC_WRITE
,0,NULL
,
366 CREATE_NEW
,FILE_ATTRIBUTE_NORMAL
,NULL
);
367 ok(hndl
!=INVALID_HANDLE_VALUE
,"CreateFileA failed\n");
368 ok(CloseHandle(hndl
),"CloseHandle failed\n");
369 sprintf(tmpstr
,"%s\\%s\\%s",newdir
,SHORTDIR
,LONGFILE
);
370 hndl
=CreateFileA(tmpstr
,GENERIC_WRITE
,0,NULL
,
371 CREATE_NEW
,FILE_ATTRIBUTE_NORMAL
,NULL
);
372 ok(hndl
!=INVALID_HANDLE_VALUE
,"CreateFileA failed\n");
373 ok(CloseHandle(hndl
),"CloseHandle failed\n");
374 sprintf(tmpstr
,"%s\\%s\\%s",newdir
,LONGDIR
,SHORTFILE
);
375 hndl
=CreateFileA(tmpstr
,GENERIC_WRITE
,0,NULL
,
376 CREATE_NEW
,FILE_ATTRIBUTE_NORMAL
,NULL
);
377 ok(hndl
!=INVALID_HANDLE_VALUE
,"CreateFileA failed\n");
378 ok(CloseHandle(hndl
),"CloseHandle failed\n");
379 sprintf(tmpstr
,"%s\\%s\\%s",newdir
,LONGDIR
,LONGFILE
);
380 hndl
=CreateFileA(tmpstr
,GENERIC_WRITE
,0,NULL
,
381 CREATE_NEW
,FILE_ATTRIBUTE_NORMAL
,NULL
);
382 ok(hndl
!=INVALID_HANDLE_VALUE
,"CreateFileA failed\n");
383 ok(CloseHandle(hndl
),"CloseHandle failed\n");
386 /* Test GetCurrentDirectory & SetCurrentDirectory */
387 static void test_CurrentDirectoryA(CHAR
*origdir
, CHAR
*newdir
)
389 CHAR tmpstr
[MAX_PATH
],tmpstr1
[MAX_PATH
];
391 /* Save the original directory, so that we can return to it at the end
394 len
=GetCurrentDirectoryA(MAX_PATH
,origdir
);
395 ok(len
!=0 && len
< MAX_PATH
,"GetCurrentDirectoryA failed\n");
396 /* Make sure that CetCurrentDirectoryA doesn't overwrite the buffer when the
397 buffer size is too small to hold the current directory
399 lstrcpyA(tmpstr
,"aaaaaaa");
400 len1
=GetCurrentDirectoryA(len
,tmpstr
);
401 ok(len1
==len
+1, "GetCurrentDirectoryA returned %ld instead of %ld\n",len1
,len
+1);
402 ok(lstrcmpiA(tmpstr
,"aaaaaaa")==0,
403 "GetCurrentDirectoryA should not have modified the buffer\n");
404 /* SetCurrentDirectoryA shouldn't care whether the string has a
407 sprintf(tmpstr
,"%s\\",newdir
);
408 test_setdir(origdir
,tmpstr
,newdir
,1,"check 1");
409 test_setdir(origdir
,newdir
,NULL
,1,"check 2");
410 /* Set the directory to the working area. We just tested that this works,
411 so why check it again.
413 SetCurrentDirectoryA(newdir
);
414 /* Check that SetCurrentDirectory fails when a nonexistent dir is specified */
415 sprintf(tmpstr
,"%s\\%s\\%s",newdir
,SHORTDIR
,NONDIR_SHORT
);
416 test_setdir(newdir
,tmpstr
,NULL
,0,"check 3");
417 /* Check that SetCurrentDirectory fails for a nonexistent lond directory */
418 sprintf(tmpstr
,"%s\\%s\\%s",newdir
,SHORTDIR
,NONDIR_LONG
);
419 test_setdir(newdir
,tmpstr
,NULL
,0,"check 4");
420 /* Check that SetCurrentDirectory passes with a long directory */
421 sprintf(tmpstr
,"%s\\%s",newdir
,LONGDIR
);
422 test_setdir(newdir
,tmpstr
,NULL
,1,"check 5");
423 /* Check that SetCurrentDirectory passes with a short relative directory */
424 sprintf(tmpstr
,"%s",SHORTDIR
);
425 sprintf(tmpstr1
,"%s\\%s",newdir
,SHORTDIR
);
426 test_setdir(newdir
,tmpstr
,tmpstr1
,1,"check 6");
427 /* starting with a '.' */
428 sprintf(tmpstr
,".\\%s",SHORTDIR
);
429 test_setdir(newdir
,tmpstr
,tmpstr1
,1,"check 7");
430 /* Check that SetCurrentDirectory passes with a short relative directory */
431 sprintf(tmpstr
,"%s",LONGDIR
);
432 sprintf(tmpstr1
,"%s\\%s",newdir
,LONGDIR
);
433 test_setdir(newdir
,tmpstr
,tmpstr1
,1,"check 8");
434 /* starting with a '.' */
435 sprintf(tmpstr
,".\\%s",LONGDIR
);
436 test_setdir(newdir
,tmpstr
,tmpstr1
,1,"check 9");
439 /* Cleanup the mess we made while executing these tests */
440 static void test_CleanupPathA(CHAR
*origdir
, CHAR
*curdir
)
442 CHAR tmpstr
[MAX_PATH
];
443 sprintf(tmpstr
,"%s\\%s\\%s",curdir
,SHORTDIR
,SHORTFILE
);
444 ok(DeleteFileA(tmpstr
),"DeleteFileA failed\n");
445 sprintf(tmpstr
,"%s\\%s\\%s",curdir
,SHORTDIR
,LONGFILE
);
446 ok(DeleteFileA(tmpstr
),"DeleteFileA failed\n");
447 sprintf(tmpstr
,"%s\\%s\\%s",curdir
,LONGDIR
,SHORTFILE
);
448 ok(DeleteFileA(tmpstr
),"DeleteFileA failed\n");
449 sprintf(tmpstr
,"%s\\%s\\%s",curdir
,LONGDIR
,LONGFILE
);
450 ok(DeleteFileA(tmpstr
),"DeleteFileA failed\n");
451 sprintf(tmpstr
,"%s\\%s",curdir
,SHORTDIR
);
452 ok(RemoveDirectoryA(tmpstr
),"RemoveDirectoryA failed\n");
453 sprintf(tmpstr
,"%s\\%s",curdir
,LONGDIR
);
454 ok(RemoveDirectoryA(tmpstr
),"RemoveDirectoryA failed\n");
455 ok(SetCurrentDirectoryA(origdir
),"SetCurrentDirectoryA failed\n");
456 ok(RemoveDirectoryA(curdir
),"RemoveDirectoryA failed\n");
459 /* This routine will test Get(Full|Short|Long)PathNameA */
460 static void test_PathNameA(CHAR
*curdir
, CHAR curDrive
, CHAR otherDrive
)
462 CHAR curdir_short
[MAX_PATH
],
463 longdir_short
[MAX_PATH
];
464 CHAR tmpstr
[MAX_PATH
],tmpstr1
[MAX_PATH
],tmpstr2
[MAX_PATH
];
465 LPSTR strptr
; /*ptr to the filename portion of the path */
468 CHAR dir
[MAX_PATH
],eight
[MAX_PATH
],three
[MAX_PATH
];
471 /* Get the short form of the current directory */
472 ok((len
=GetShortPathNameA(curdir
,curdir_short
,MAX_PATH
)),
473 "GetShortPathNameA failed\n");
474 ok(!HAS_TRAIL_SLASH_A(curdir_short
),
475 "GetShortPathNameA should not have a trailing \\\n");
476 /* Get the short form of the absolute-path to LONGDIR */
477 sprintf(tmpstr
,"%s\\%s",curdir_short
,LONGDIR
);
478 ok((len
=GetShortPathNameA(tmpstr
,longdir_short
,MAX_PATH
)),
479 "GetShortPathNameA failed\n");
480 ok(lstrcmpiA(longdir_short
+(len
-1),"\\")!=0,
481 "GetShortPathNameA should not have a trailing \\\n");
483 if (pGetLongPathNameA
) {
485 sprintf(tmpstr
,"%s\\%s\\%s",curdir
,LONGDIR
,LONGFILE
);
486 rc1
=(*pGetLongPathNameA
)(tmpstr
,NULL
,0);
487 rc2
=(*pGetLongPathNameA
)(curdir
,NULL
,0);
488 ok((rc1
-strlen(tmpstr
))==(rc2
-strlen(curdir
)),
489 "GetLongPathNameA: wrong return code, %ld instead of %d\n",
490 rc1
, strlen(tmpstr
)+1);
492 sprintf(dir
,"%c:",curDrive
);
493 rc1
=(*pGetLongPathNameA
)(dir
,tmpstr
,sizeof(tmpstr
));
494 ok(strcmp(dir
,tmpstr
)==0,
495 "GetLongPathNameA: returned '%s' instead of '%s' (rc=%ld)\n",
499 /* Check the cases where both file and directory exist first */
500 /* Start with a 8.3 directory, 8.3 filename */
501 test_ValidPathA(curdir
,SHORTDIR
,SHORTFILE
,tmpstr
,NULL
,"test1");
502 sprintf(tmpstr1
,"%s\\%s\\%s",curdir_short
,SHORTDIR
,SHORTFILE
);
503 ok(lstrcmpiA(tmpstr
,tmpstr1
)==0,
504 "GetShortPathNameA returned '%s' instead of '%s'\n",tmpstr
,tmpstr1
);
505 /* Now try a 8.3 directory, long file name */
506 test_ValidPathA(curdir
,SHORTDIR
,LONGFILE
,tmpstr
,NULL
,"test2");
507 sprintf(tmpstr1
,"%s\\%s",curdir_short
,SHORTDIR
);
508 test_LongtoShortA(tmpstr
,tmpstr1
,"PAT","test2");
509 /* Next is a long directory, 8.3 file */
510 test_ValidPathA(curdir
,LONGDIR
,SHORTFILE
,tmpstr
,NULL
,"test3");
511 sprintf(tmpstr1
,"%s\\%s",longdir_short
,SHORTFILE
);
512 ok(lstrcmpiA(tmpstr
,tmpstr1
)==0,
513 "GetShortPathNameA returned '%s' instead of '%s'\n",tmpstr
,tmpstr1
);
514 /*Lastly a long directory, long file */
515 test_ValidPathA(curdir
,LONGDIR
,LONGFILE
,tmpstr
,NULL
,"test4");
516 test_LongtoShortA(tmpstr
,longdir_short
,"PAT","test4");
518 /* Now check all of the invalid file w/ valid directory combinations */
519 /* Start with a 8.3 directory, 8.3 filename */
520 test_ValidPathA(curdir
,SHORTDIR
,NONFILE_SHORT
,tmpstr
,&passfail
,"test5");
521 sprintf(tmpstr1
,"%s\\%s\\%s",curdir_short
,SHORTDIR
,NONFILE_SHORT
);
522 ok((passfail
.shortlen
==0 &&
523 (passfail
.shorterror
==ERROR_PATH_NOT_FOUND
||
524 passfail
.shorterror
==ERROR_FILE_NOT_FOUND
)) ||
525 (passfail
.shortlen
==strlen(tmpstr1
) && lstrcmpiA(tmpstr
,tmpstr1
)==0),
526 "GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n",
527 passfail
.shortlen
,passfail
.shorterror
,tmpstr
);
528 if(pGetLongPathNameA
) {
529 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
530 ok(passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
531 "GetlongPathA should have returned 'ERROR_FILE_NOT_FOUND'\n");
533 /* Now try a 8.3 directory, long file name */
534 test_ValidPathA(curdir
,SHORTDIR
,NONFILE_LONG
,tmpstr
,&passfail
,"test6");
535 ok(passfail
.shortlen
==0,"GetShortPathNameA passed when it shouldn't have\n");
536 ok(passfail
.shorterror
==ERROR_PATH_NOT_FOUND
||
537 passfail
.shorterror
==ERROR_FILE_NOT_FOUND
||
538 !passfail
.shorterror
,
539 "GetShortPathA should have returned 'ERROR_FILE_NOT_FOUND'\n");
540 if(pGetLongPathNameA
) {
541 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
542 ok(passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
543 "GetlongPathA should have returned 'ERROR_FILE_NOT_FOUND'\n");
545 /* Next is a long directory, 8.3 file */
546 test_ValidPathA(curdir
,LONGDIR
,NONFILE_SHORT
,tmpstr
,&passfail
,"test7");
547 sprintf(tmpstr2
,"%s\\%s",curdir_short
,LONGDIR
);
548 GetShortPathNameA(tmpstr2
,tmpstr1
,MAX_PATH
);
549 strcat(tmpstr1
,"\\" NONFILE_SHORT
);
550 ok((passfail
.shortlen
==0 &&
551 (passfail
.shorterror
==ERROR_PATH_NOT_FOUND
||
552 passfail
.shorterror
==ERROR_FILE_NOT_FOUND
)) ||
553 (passfail
.shortlen
==strlen(tmpstr1
) && lstrcmpiA(tmpstr
,tmpstr1
)==0),
554 "GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n",
555 passfail
.shortlen
,passfail
.shorterror
,tmpstr
);
556 if(pGetLongPathNameA
) {
557 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
558 ok(passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
559 "GetlongPathA should have returned 'ERROR_FILE_NOT_FOUND'\n");
561 /*Lastly a long directory, long file */
562 test_ValidPathA(curdir
,LONGDIR
,NONFILE_LONG
,tmpstr
,&passfail
,"test8");
563 ok(passfail
.shortlen
==0,"GetShortPathNameA passed when it shouldn't have\n");
564 ok(passfail
.shorterror
==ERROR_PATH_NOT_FOUND
||
565 passfail
.shorterror
==ERROR_FILE_NOT_FOUND
||
566 !passfail
.shorterror
,
567 "GetShortPathA should have returned 'ERROR_FILE_NOT_FOUND'\n");
568 if(pGetLongPathNameA
) {
569 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
570 ok(passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
571 "GetlongPathA should have returned 'ERROR_FILE_NOT_FOUND'\n");
573 /* Now try again with directories that don't exist */
574 /* 8.3 directory, 8.3 filename */
575 test_ValidPathA(curdir
,NONDIR_SHORT
,SHORTFILE
,tmpstr
,&passfail
,"test9");
576 sprintf(tmpstr1
,"%s\\%s\\%s",curdir_short
,NONDIR_SHORT
,SHORTFILE
);
577 ok((passfail
.shortlen
==0 &&
578 (passfail
.shorterror
==ERROR_PATH_NOT_FOUND
||
579 passfail
.shorterror
==ERROR_FILE_NOT_FOUND
)) ||
580 (passfail
.shortlen
==strlen(tmpstr1
) && lstrcmpiA(tmpstr
,tmpstr1
)==0),
581 "GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n",
582 passfail
.shortlen
,passfail
.shorterror
,tmpstr
);
583 if(pGetLongPathNameA
) {
584 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
585 ok(passfail
.longerror
==ERROR_PATH_NOT_FOUND
||
586 passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
587 "GetLongPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n",
590 /* Now try a 8.3 directory, long file name */
591 test_ValidPathA(curdir
,NONDIR_SHORT
,LONGFILE
,tmpstr
,&passfail
,"test10");
592 ok(passfail
.shortlen
==0,"GetShortPathNameA passed when it shouldn't have\n");
593 ok(passfail
.shorterror
==ERROR_PATH_NOT_FOUND
||
594 passfail
.shorterror
==ERROR_FILE_NOT_FOUND
||
595 !passfail
.shorterror
,
596 "GetShortPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n",
597 passfail
.shorterror
);
598 if(pGetLongPathNameA
) {
599 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
600 ok(passfail
.longerror
==ERROR_PATH_NOT_FOUND
||
601 passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
602 "GetLongPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n",
605 /* Next is a long directory, 8.3 file */
606 test_ValidPathA(curdir
,NONDIR_LONG
,SHORTFILE
,tmpstr
,&passfail
,"test11");
607 ok(passfail
.shortlen
==0,"GetShortPathNameA passed when it shouldn't have\n");
608 ok(passfail
.shorterror
==ERROR_PATH_NOT_FOUND
||
609 passfail
.shorterror
==ERROR_FILE_NOT_FOUND
||
610 !passfail
.shorterror
,
611 "GetShortPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n",
612 passfail
.shorterror
);
613 if(pGetLongPathNameA
) {
614 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
615 ok(passfail
.longerror
==ERROR_PATH_NOT_FOUND
||
616 passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
617 "GetLongPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n",
620 /*Lastly a long directory, long file */
621 test_ValidPathA(curdir
,NONDIR_LONG
,LONGFILE
,tmpstr
,&passfail
,"test12");
622 ok(passfail
.shortlen
==0,"GetShortPathNameA passed when it shouldn't have\n");
623 ok(passfail
.shorterror
==ERROR_PATH_NOT_FOUND
||
624 passfail
.shorterror
==ERROR_FILE_NOT_FOUND
||
625 !passfail
.shorterror
,
626 "GetShortPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n",
627 passfail
.shorterror
);
628 if(pGetLongPathNameA
) {
629 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
630 ok(passfail
.longerror
==ERROR_PATH_NOT_FOUND
||
631 passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
632 "GetLongPathA returned %ld and not 'ERROR_PATH_NOT_FOUND'\n",
635 /* Next try directories ending with '\\' */
636 /* Existing Directories */
637 sprintf(tmpstr
,"%s\\",SHORTDIR
);
638 test_ValidPathA(curdir
,"",tmpstr
,tmpstr1
,NULL
,"test13");
639 sprintf(tmpstr
,"%s\\",LONGDIR
);
640 test_ValidPathA(curdir
,"",tmpstr
,tmpstr1
,NULL
,"test14");
641 /* Nonexistent directories */
642 sprintf(tmpstr
,"%s\\",NONDIR_SHORT
);
643 test_ValidPathA(curdir
,"",tmpstr
,tmpstr1
,&passfail
,"test15");
644 sprintf(tmpstr2
,"%s\\%s",curdir_short
,tmpstr
);
645 ok((passfail
.shortlen
==0 &&
646 (passfail
.shorterror
==ERROR_PATH_NOT_FOUND
||
647 passfail
.shorterror
==ERROR_FILE_NOT_FOUND
)) ||
648 (passfail
.shortlen
==strlen(tmpstr2
) && lstrcmpiA(tmpstr1
,tmpstr2
)==0),
649 "GetShortPathNameA error: len=%ld error=%ld tmpstr=[%s]\n",
650 passfail
.shortlen
,passfail
.shorterror
,tmpstr
);
651 if(pGetLongPathNameA
) {
652 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
653 ok(passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
654 "GetLongPathA returned %ld and not 'ERROR_FILE_NOT_FOUND'\n",
657 sprintf(tmpstr
,"%s\\",NONDIR_LONG
);
658 test_ValidPathA(curdir
,"",tmpstr
,tmpstr1
,&passfail
,"test16");
659 ok(passfail
.shortlen
==0,"GetShortPathNameA passed when it shouldn't have\n");
660 ok(passfail
.shorterror
==ERROR_PATH_NOT_FOUND
||
661 passfail
.shorterror
==ERROR_FILE_NOT_FOUND
||
662 !passfail
.shorterror
,
663 "GetShortPathA returned %ld and not 'ERROR_FILE_NOT_FOUND'\n",
664 passfail
.shorterror
);
665 if(pGetLongPathNameA
) {
666 ok(passfail
.longlen
==0,"GetLongPathNameA passed when it shouldn't have\n");
667 ok(passfail
.longerror
==ERROR_FILE_NOT_FOUND
,
668 "GetLongPathA returned %ld and not 'ERROR_FILE_NOT_FOUND'\n",
671 /* Test GetFullPathNameA with drive letters */
672 if( curDrive
!= NOT_A_VALID_DRIVE
) {
673 sprintf(tmpstr
,"%c:",curdir
[0]);
674 ok(GetFullPathNameA(tmpstr
,MAX_PATH
,tmpstr2
,&strptr
),
675 "GetFullPathNameA(%c:) failed\n", curdir
[0]);
676 GetCurrentDirectoryA(MAX_PATH
,tmpstr
);
677 sprintf(tmpstr1
,"%s\\",tmpstr
);
678 ok(lstrcmpiA(tmpstr
,tmpstr2
)==0 || lstrcmpiA(tmpstr1
,tmpstr2
)==0,
679 "GetFullPathNameA(%c:) returned '%s' instead of '%s' or '%s'\n",
680 curdir
[0],tmpstr2
,tmpstr
,tmpstr1
);
682 sprintf(tmpstr
,"%c:\\%s\\%s",curDrive
,SHORTDIR
,SHORTFILE
);
683 ok(GetFullPathNameA(tmpstr
,MAX_PATH
,tmpstr1
,&strptr
),"GetFullPathNameA failed\n");
684 ok(lstrcmpiA(tmpstr
,tmpstr1
)==0,
685 "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1
,tmpstr
);
686 ok(lstrcmpiA(SHORTFILE
,strptr
)==0,
687 "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr
,SHORTFILE
);
689 /* Without a leading slash, insert the current directory if on the current drive */
690 sprintf(tmpstr
,"%c:%s\\%s",curdir
[0],SHORTDIR
,SHORTFILE
);
691 ok(GetFullPathNameA(tmpstr
,MAX_PATH
,tmpstr1
,&strptr
),"GetFullPathNameA failed\n");
692 sprintf(tmpstr
,"%s\\%s\\%s",curdir
,SHORTDIR
,SHORTFILE
);
693 ok(lstrcmpiA(tmpstr
,tmpstr1
)==0,
694 "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1
,tmpstr
);
695 ok(lstrcmpiA(SHORTFILE
,strptr
)==0,
696 "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr
,SHORTFILE
);
697 /* Otherwise insert the missing leading slash */
698 if( otherDrive
!= NOT_A_VALID_DRIVE
) {
699 sprintf(tmpstr
,"%c:%s\\%s",otherDrive
,SHORTDIR
,SHORTFILE
);
700 ok(GetFullPathNameA(tmpstr
,MAX_PATH
,tmpstr1
,&strptr
),"GetFullPathNameA failed for %s\n", tmpstr
);
701 sprintf(tmpstr
,"%c:\\%s\\%s",otherDrive
,SHORTDIR
,SHORTFILE
);
702 ok(lstrcmpiA(tmpstr
,tmpstr1
)==0,
703 "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1
,tmpstr
);
704 ok(lstrcmpiA(SHORTFILE
,strptr
)==0,
705 "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr
,SHORTFILE
);
707 /* Xilinx tools like to mix Unix and DOS formats, which Windows handles fine.
709 if( curDrive
!= NOT_A_VALID_DRIVE
) {
710 sprintf(tmpstr
,"%c:/%s\\%s",curDrive
,SHORTDIR
,SHORTFILE
);
711 ok(GetFullPathNameA(tmpstr
,MAX_PATH
,tmpstr1
,&strptr
),"GetFullPathNameA failed\n");
712 sprintf(tmpstr
,"%c:\\%s\\%s",curDrive
,SHORTDIR
,SHORTFILE
);
713 ok(lstrcmpiA(tmpstr
,tmpstr1
)==0,
714 "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1
,tmpstr
);
715 ok(lstrcmpiA(SHORTFILE
,strptr
)==0,
716 "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr
,SHORTFILE
);
719 sprintf(tmpstr
,"%c:%s/%s",curdir
[0],SHORTDIR
,SHORTFILE
);
720 ok(GetFullPathNameA(tmpstr
,MAX_PATH
,tmpstr1
,&strptr
),"GetFullPathNameA failed\n");
721 sprintf(tmpstr
,"%s\\%s\\%s",curdir
,SHORTDIR
,SHORTFILE
);
722 ok(lstrcmpiA(tmpstr
,tmpstr1
)==0,
723 "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1
,tmpstr
);
724 ok(lstrcmpiA(SHORTFILE
,strptr
)==0,
725 "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr
,SHORTFILE
);
726 /* Windows will insert a drive letter in front of an absolute UNIX path */
727 sprintf(tmpstr
,"/%s/%s",SHORTDIR
,SHORTFILE
);
728 ok(GetFullPathNameA(tmpstr
,MAX_PATH
,tmpstr1
,&strptr
),"GetFullPathNameA failed\n");
729 sprintf(tmpstr
,"%c:\\%s\\%s",*tmpstr1
,SHORTDIR
,SHORTFILE
);
730 ok(lstrcmpiA(tmpstr
,tmpstr1
)==0,
731 "GetFullPathNameA returned '%s' instead of '%s'\n",tmpstr1
,tmpstr
);
732 /* This passes in Wine because it still contains the pointer from the previous test */
733 ok(lstrcmpiA(SHORTFILE
,strptr
)==0,
734 "GetFullPathNameA returned part '%s' instead of '%s'\n",strptr
,SHORTFILE
);
736 /* Now try some relative paths */
737 ok(GetShortPathNameA(LONGDIR
,tmpstr
,MAX_PATH
),"GetShortPathNameA failed\n");
738 test_SplitShortPathA(tmpstr
,dir
,eight
,three
);
739 if(pGetLongPathNameA
) {
740 ok(pGetLongPathNameA(tmpstr
,tmpstr1
,MAX_PATH
),"GetLongPathNameA failed\n");
741 ok(lstrcmpiA(tmpstr1
,LONGDIR
)==0,
742 "GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1
,LONGDIR
);
744 sprintf(tmpstr
,".\\%s",LONGDIR
);
745 ok(GetShortPathNameA(tmpstr
,tmpstr1
,MAX_PATH
),"GetShortPathNameA failed\n");
746 test_SplitShortPathA(tmpstr1
,dir
,eight
,three
);
747 ok(lstrcmpiA(dir
,".")==0 || dir
[0]=='\0',
748 "GetShortPathNameA did not keep relative directory [%s]\n",tmpstr1
);
749 if(pGetLongPathNameA
) {
750 ok(pGetLongPathNameA(tmpstr1
,tmpstr1
,MAX_PATH
),"GetLongPathNameA failed %s\n",
752 ok(lstrcmpiA(tmpstr1
,tmpstr
)==0,
753 "GetLongPathNameA returned '%s' instead of '%s'\n",tmpstr1
,tmpstr
);
755 /* Check out Get*PathNameA on some funny characters */
756 for(i
=0;i
<lstrlenA(funny_chars
);i
++) {
758 valid
=(is_char_ok
[i
]=='0') ? 0 : 1;
759 sprintf(tmpstr1
,"check%d-1",i
);
760 sprintf(tmpstr
,"file%c000.ext",funny_chars
[i
]);
761 test_FunnyChars(curdir
,curdir_short
,tmpstr
,valid
,tmpstr1
);
762 sprintf(tmpstr1
,"check%d-2",i
);
763 sprintf(tmpstr
,"file000.e%ct",funny_chars
[i
]);
764 test_FunnyChars(curdir
,curdir_short
,tmpstr
,valid
,tmpstr1
);
765 sprintf(tmpstr1
,"check%d-3",i
);
766 sprintf(tmpstr
,"%cfile000.ext",funny_chars
[i
]);
767 test_FunnyChars(curdir
,curdir_short
,tmpstr
,valid
,tmpstr1
);
768 sprintf(tmpstr1
,"check%d-4",i
);
769 sprintf(tmpstr
,"file000%c.ext",funny_chars
[i
]);
770 test_FunnyChars(curdir
,curdir_short
,tmpstr
,valid
,tmpstr1
);
771 sprintf(tmpstr1
,"check%d-5",i
);
772 sprintf(tmpstr
,"Long %c File",funny_chars
[i
]);
773 test_FunnyChars(curdir
,curdir_short
,tmpstr
,valid
,tmpstr1
);
774 sprintf(tmpstr1
,"check%d-6",i
);
775 sprintf(tmpstr
,"%c Long File",funny_chars
[i
]);
776 test_FunnyChars(curdir
,curdir_short
,tmpstr
,valid
,tmpstr1
);
777 sprintf(tmpstr1
,"check%d-7",i
);
778 sprintf(tmpstr
,"Long File %c",funny_chars
[i
]);
779 test_FunnyChars(curdir
,curdir_short
,tmpstr
,valid
,tmpstr1
);
783 static void test_GetTempPathA(char* tmp_dir
)
785 DWORD len
, len_with_null
;
788 len_with_null
= strlen(tmp_dir
) + 1;
790 lstrcpyA(buf
, "foo");
791 len
= GetTempPathA(MAX_PATH
, buf
);
792 ok(len
<= MAX_PATH
, "should fit into MAX_PATH\n");
793 ok(lstrcmpiA(buf
, tmp_dir
) == 0, "expected [%s], got [%s]\n",tmp_dir
,buf
);
794 ok(len
== strlen(buf
), "returned length should be equal to the length of string\n");
796 /* Some versions of Windows touch the buffer, some don't so we don't
797 * test that. Also, NT sometimes exagerates the required buffer size
798 * so we cannot test for an exact match. Finally, the
799 * 'len_with_null - 1' case is so buggy on Windows it's not testable.
800 * For instance in some cases Win98 returns len_with_null - 1 instead
803 len
= GetTempPathA(1, buf
);
804 ok(len
>= len_with_null
, "Expected >= %lu, got %lu\n", len_with_null
, len
);
806 len
= GetTempPathA(0, NULL
);
807 ok(len
>= len_with_null
, "Expected >= %lu, got %lu\n", len_with_null
, len
);
809 /* The call above gave us the buffer size that Windows thinks is needed
810 * so the next call should work
812 lstrcpyA(buf
, "foo");
813 len
= GetTempPathA(len
, buf
);
814 ok(lstrcmpiA(buf
, tmp_dir
) == 0, "expected [%s], got [%s]\n",tmp_dir
,buf
);
815 ok(len
== strlen(buf
), "returned length should be equal to the length of string\n");
818 static void test_GetTempPathW(char* tmp_dir
)
820 DWORD len
, len_with_null
;
822 WCHAR tmp_dirW
[MAX_PATH
];
823 static const WCHAR fooW
[] = {'f','o','o',0};
825 MultiByteToWideChar(CP_ACP
,0,tmp_dir
,-1,tmp_dirW
,sizeof(tmp_dirW
)/sizeof(*tmp_dirW
));
826 len_with_null
= lstrlenW(tmp_dirW
) + 1;
828 /* This one is different from ANSI version: ANSI version doesn't
829 * touch the buffer, unicode version usually truncates the buffer
830 * to zero size. NT still exagerates the required buffer size
831 * sometimes so we cannot test for an exact match. Finally, the
832 * 'len_with_null - 1' case is so buggy on Windows it's not testable.
833 * For instance on NT4 it will sometimes return a path without the
834 * trailing '\\' and sometimes return an error.
838 len
= GetTempPathW(MAX_PATH
, buf
);
839 if (len
==0 && GetLastError()==ERROR_CALL_NOT_IMPLEMENTED
)
841 ok(lstrcmpiW(buf
, tmp_dirW
) == 0, "GetTempPathW returned an incorrect temporary path\n");
842 ok(len
== lstrlenW(buf
), "returned length should be equal to the length of string\n");
845 len
= GetTempPathW(1, buf
);
846 ok(buf
[0] == 0, "unicode version should truncate the buffer to zero size\n");
847 ok(len
>= len_with_null
, "Expected >= %lu, got %lu\n", len_with_null
, len
);
849 len
= GetTempPathW(0, NULL
);
850 ok(len
>= len_with_null
, "Expected >= %lu, got %lu\n", len_with_null
, len
);
853 len
= GetTempPathW(len
, buf
);
854 ok(lstrcmpiW(buf
, tmp_dirW
) == 0, "GetTempPathW returned an incorrect temporary path\n");
855 ok(len
== lstrlenW(buf
), "returned length should be equal to the length of string\n");
858 static void test_GetTempPath(void)
860 char save_TMP
[MAX_PATH
];
861 char windir
[MAX_PATH
];
864 GetEnvironmentVariableA("TMP", save_TMP
, sizeof(save_TMP
));
866 /* test default configuration */
867 trace("TMP=%s\n", save_TMP
);
868 strcpy(buf
,save_TMP
);
869 if (buf
[strlen(buf
)-1]!='\\')
871 test_GetTempPathA(buf
);
872 test_GetTempPathW(buf
);
875 GetWindowsDirectoryA(windir
, sizeof(windir
));
876 SetEnvironmentVariableA("TMP", windir
);
877 GetEnvironmentVariableA("TMP", buf
, sizeof(buf
));
878 trace("TMP=%s\n", buf
);
880 test_GetTempPathA(windir
);
881 test_GetTempPathW(windir
);
884 GetWindowsDirectoryA(windir
, sizeof(windir
));
886 SetEnvironmentVariableA("TMP", windir
);
887 GetEnvironmentVariableA("TMP", buf
, sizeof(buf
));
888 trace("TMP=%s\n", buf
);
889 test_GetTempPathA(windir
);
890 test_GetTempPathW(windir
);
892 /* TMP=C: i.e. use current working directory of the specified drive */
893 GetWindowsDirectoryA(windir
, sizeof(windir
));
894 SetCurrentDirectoryA(windir
);
896 SetEnvironmentVariableA("TMP", windir
);
897 GetEnvironmentVariableA("TMP", buf
, sizeof(buf
));
898 trace("TMP=%s\n", buf
);
899 GetWindowsDirectoryA(windir
, sizeof(windir
));
901 test_GetTempPathA(windir
);
902 test_GetTempPathW(windir
);
904 SetEnvironmentVariableA("TMP", save_TMP
);
909 CHAR origdir
[MAX_PATH
],curdir
[MAX_PATH
], curDrive
, otherDrive
;
910 pGetLongPathNameA
= (void*)GetProcAddress( GetModuleHandleA("kernel32.dll"),
911 "GetLongPathNameA" );
912 test_InitPathA(curdir
, &curDrive
, &otherDrive
);
913 test_CurrentDirectoryA(origdir
,curdir
);
914 test_PathNameA(curdir
, curDrive
, otherDrive
);
915 test_CleanupPathA(origdir
,curdir
);