tfexpand.pp 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. program TFExpand;
  2. (* Test for possible bugs in Dos.FExpand *)
  3. { $DEFINE DEBUG}
  4. (* Defining DEBUG causes all the source and target strings *)
  5. (* to be written to the console to make debugging easier. *)
  6. uses
  7. Dos;
  8. {$IFDEF OS2}
  9. function _DosError (Error: longint): longint; cdecl;
  10. external 'DOSCALLS' index 212;
  11. {$ENDIF OS2}
  12. {$IFDEF LINUX}
  13. {$IFNDEF UNIX}
  14. {$DEFINE UNIX}
  15. {$ENDIF UNIX}
  16. {$ENDIF LINUX}
  17. {$IFDEF AMIGA}
  18. {$DEFINE VOLUMES}
  19. {$ENDIF AMIGA}
  20. {$IFDEF NETWARE}
  21. {$DEFINE VOLUMES}
  22. {$ENDIF NETWARE}
  23. const
  24. {$IFDEF FPC}
  25. {$IFDEF VER1_0}
  26. {$IFDEF UNIX}
  27. FileNameCaseSensitive = false;
  28. {$ENDIF}
  29. {$ENDIF}
  30. {$ELSE}
  31. FileNameCaseSensitive = false;
  32. {$ENDIF}
  33. {$IFDEF UNIX}
  34. DirSep = '/';
  35. CDrive = '';
  36. {$ELSE}
  37. DirSep = '\';
  38. CDrive = 'C:';
  39. {$ENDIF}
  40. HasErrors: boolean = false;
  41. var
  42. TestDir, OrigDir, OrigTstDir, CurDir, CDir, S: DirStr;
  43. TestDrive: string [2];
  44. I: byte;
  45. IOR: longint;
  46. function Translate (S: PathStr): PathStr;
  47. var
  48. I: byte;
  49. begin
  50. {$IFDEF UNIX}
  51. if (Length (S) > 1) and (S [2] = ':') then Delete (S, 1, 2);
  52. {$ELSE}
  53. for I := 1 to Length (S) do if S [I] = '/' then S [I] := DirSep;
  54. if (Length (S) > 0) and (S [1] in ['a'..'z']) then S [1] := UpCase (S [1]);
  55. {$ENDIF}
  56. if not (FileNameCaseSensitive) then
  57. for I := 1 to Length (S) do S [I] := UpCase (S [I]);
  58. Translate := S;
  59. end;
  60. procedure Check (Src, Rslt: PathStr);
  61. var
  62. Rslt2: PathStr;
  63. begin
  64. {$IFDEF DEBUG}
  65. WriteLn (Src, '=>', Rslt);
  66. {$ENDIF}
  67. Rslt := Translate (Rslt);
  68. Rslt2 := FExpand (Src);
  69. if Rslt <> Rslt2 then
  70. begin
  71. WriteLn ('Error: FExpand (', Src, ') should be "', Rslt, '", not "',
  72. Rslt2, '"');
  73. HasErrors := true;
  74. end;
  75. end;
  76. begin
  77. {$IFDEF OS2}
  78. (* Avoid OS/2 error messages. *)
  79. _DosError (0);
  80. {$ENDIF OS2}
  81. if ParamCount <> 1 then
  82. begin
  83. WriteLn ('Warning: Parameter missing!');
  84. WriteLn ('Full path to a directory with write access' +
  85. {$IFNDEF UNIX}
  86. #13#10'(preferably not on a C: drive)' +
  87. {$ENDIF}
  88. ' expected.');
  89. WriteLn ('Trying to use the current directory instead ' +
  90. {$IFDEF UNIX}
  91. '(not quite ideal).');
  92. {$ELSE UNIX}
  93. '(problems might arise).');
  94. {$ENDIF UNIX}
  95. GetDir (0, TestDir);
  96. end else TestDir := ParamStr (1);
  97. if TestDir [Length (TestDir)] <> DirSep then TestDir := TestDir + DirSep;
  98. GetDir (0, OrigDir);
  99. {$IFDEF UNIX}
  100. TestDrive := '';
  101. {$ELSE UNIX}
  102. TestDrive := Copy (TestDir, 1, 2);
  103. GetDir ((Ord (TestDir [1]) and not ($20)) - 64, OrigTstDir);
  104. {$ENDIF UNIX}
  105. {$I-}
  106. MkDir (TestDir + 'TESTDIR1');
  107. if IOResult <> 0 then ;
  108. MkDir (TestDir + 'TESTDIR1' + DirSep + 'TESTDIR2');
  109. if IOResult <> 0 then ;
  110. {$I+}
  111. ChDir (TestDir + 'TESTDIR1' + DirSep + 'TESTDIR2');
  112. GetDir (0, CurDir);
  113. {$IFDEF UNIX}
  114. CDir := CurDir;
  115. {$ELSE UNIX}
  116. GetDir (3, CDir);
  117. {$ENDIF UNIX}
  118. Check (' ', CurDir + DirSep + ' ');
  119. Check ('', CurDir + DirSep);
  120. Check ('.', CurDir);
  121. Check ('C:', CDir);
  122. Check ('C:.', CDir);
  123. if CDir [Length (CDir)] = DirSep then Check ('c:anything', CDir + 'anything')
  124. else Check ('c:anything', CDir + DirSep + 'anything');
  125. Check ('C:' + DirSep, CDrive + DirSep);
  126. Check ('C:' + DirSep + '.', CDrive + DirSep);
  127. Check ('C:' + DirSep + '..', CDrive + DirSep);
  128. Check ('C:' + DirSep + 'DOS', CDrive + DirSep + 'DOS');
  129. Check ('C:' + DirSep + '..' + DirSep + 'DOS', CDrive + DirSep + 'DOS');
  130. Check ('C:' + DirSep + 'DOS.', CDrive + DirSep + 'DOS.');
  131. Check ('C:' + DirSep + 'DOS' + DirSep, CDrive + DirSep + 'DOS' + DirSep);
  132. Check ('C:' + DirSep + 'DOS' + DirSep + '.', CDrive + DirSep + 'DOS');
  133. Check ('C:' + DirSep + 'DOS' + DirSep + '..', CDrive + DirSep);
  134. Check ('C:' + DirSep + 'DOS' + DirSep + '..' + DirSep, CDrive + DirSep);
  135. Check ('C:' + DirSep + 'DOS' + DirSep + 'TEST' + DirSep + '..', CDrive +
  136. DirSep + 'DOS');
  137. Check ('C:' + DirSep + 'DOS' + DirSep + 'TEST' + DirSep + '..' + DirSep,
  138. CDrive + DirSep + 'DOS' + DirSep);
  139. Check (DirSep, TestDrive + DirSep);
  140. Check (DirSep + '.', TestDrive + DirSep);
  141. Check (DirSep + '..', TestDrive + DirSep);
  142. Check (DirSep + 'DOS', TestDrive + DirSep + 'DOS');
  143. Check ('d', CurDir + DirSep + 'd');
  144. Check (' d', CurDir + DirSep + ' d');
  145. Check ('dd', CurDir + DirSep + 'dd');
  146. Check ('dd' + DirSep + 'dd', CurDir + DirSep + 'dd' + DirSep + 'dd');
  147. Check ('ddd', CurDir + DirSep + 'ddd');
  148. Check ('dddd' + DirSep + 'eeee.ffff', CurDir + DirSep + 'dddd' + DirSep
  149. + 'eeee.ffff');
  150. Check ('.special', CurDir + DirSep + '.special');
  151. Check ('..special', CurDir + DirSep + '..special');
  152. Check ('special..', CurDir + DirSep + 'special..');
  153. Check ('special.' + DirSep, CurDir + DirSep + 'special.' + DirSep);
  154. Check (DirSep + '.special', TestDrive + DirSep + '.special');
  155. Check ('..', TestDir + 'TESTDIR1');
  156. Check ('.' + DirSep + '..', TestDir + 'TESTDIR1');
  157. Check ('..' + DirSep + '.', TestDir + 'TESTDIR1');
  158. Check ('...', CurDir + DirSep + '...');
  159. {$IFDEF UNIX}
  160. S := GetEnv ('HOME');
  161. Check ('~', S);
  162. Check ('~' + DirSep + '.', S);
  163. if (Length (S) > 0) and (S [Length (S)] <> DirSep) then S := S + DirSep;
  164. Check ('~NobodyWithThisNameShouldEverExist.test/nothing', CurDir + DirSep +
  165. '~NobodyWithThisNameShouldEverExist.test/nothing');
  166. Check ('/tmp/~NoSuchUserAgain', '/tmp/~NoSuchUserAgain');
  167. Check ('~' + DirSep, S);
  168. Check ('~' + DirSep + '.' + DirSep, S);
  169. Check ('~' + DirSep + 'directory' + DirSep + 'another',
  170. S + 'directory' + DirSep + 'another');
  171. {$ELSE UNIX}
  172. Check (TestDrive + '..', TestDir + 'TESTDIR1');
  173. Check (TestDrive + '..' + DirSep, TestDir + 'TESTDIR1' + DirSep);
  174. Check (TestDrive + '.' + DirSep + '.', CurDir);
  175. Check (TestDrive + '.' + DirSep + '..', TestDir + 'TESTDIR1');
  176. {$I-}
  177. I := 1;
  178. repeat
  179. S := '';
  180. GetDir (I, S);
  181. IOR := IOResult;
  182. if IOR = 0 then Inc (I);
  183. until (I > 26) or (IOR <> 0);
  184. if I <= 26 then
  185. begin
  186. S := Chr (I + 64) + ':ddd';
  187. Check (S, Chr (I + 64) + ':' + DirSep + 'ddd');
  188. end else
  189. WriteLn ('Sorry, cannot test FExpand behaviour for incorrect drives here.');
  190. {$I+}
  191. {$IFDEF FPC}
  192. Check ('d\d/d', CurDir + DirSep + 'd' + DirSep + 'd' + DirSep + 'd');
  193. Check ('\\server\share\directory', '\\server\share\directory');
  194. Check ('\\server\share\directory1\directory2\..',
  195. '\\server\share\directory1');
  196. Check ('\\', '\\');
  197. Check ('\\.', '\\.\');
  198. Check ('\\.\', '\\.\');
  199. Check ('\\.\.', '\\.\.');
  200. Check ('\\.\..', '\\.\..');
  201. Check ('\\.\...', '\\.\...');
  202. Check ('\\.\TEST', '\\.\TEST');
  203. Check ('\\..\', '\\..\');
  204. Check ('\\..\TEST', '\\..\TEST');
  205. Check ('\\..\TEST\.', '\\..\TEST');
  206. Check ('\\..\TEST1\TEST2\..', '\\..\TEST1');
  207. Check ('\\..\TEST\..', '\\..\TEST');
  208. Check ('\\..\TEST\..\..', '\\..\TEST');
  209. {$ENDIF FPC}
  210. ChDir (OrigTstDir);
  211. {$ENDIF UNIX}
  212. {$IFDEF VOLUMES}
  213. Check ('VolName:' + DirSep + 'DIR1', 'VolName:' + DirSep + 'DIR1');
  214. Check ('VolName:' + DirSep + 'DIR1' + DirSep + '..', 'VolName:' + DirSep);
  215. Check ('VolName:' + DirSep + 'DIR1' + DirSep + '..' + DirSep + '..',
  216. 'VolName:' + DirSep);
  217. Check ('VolName:' + DirSep + '.', 'VolName:' + DirSep);
  218. Check ('VolName:' + DirSep + '..', 'VolName:' + DirSep);
  219. Check ('VolName:' + DirSep + '..' + DirSep, 'VolName:' + DirSep);
  220. Check ('SrvName\VolName:' + DirSep + 'TEST', 'SrvName' + DirSep + 'VolName:' +
  221. DirSep + 'TEST');
  222. Check ('SrvName/VolName:' + DirSep + 'TEST', 'SrvName' + DirSep + 'VolName:' +
  223. DirSep + 'TEST');
  224. {$ENDIF VOLUMES}
  225. ChDir (OrigDir);
  226. RmDir (TestDir + 'TESTDIR1' + DirSep + 'TESTDIR2');
  227. RmDir (TestDir + 'TESTDIR1');
  228. if HasErrors then
  229. begin
  230. WriteLn ('FExpand doesn''t work correctly.');
  231. Halt (1);
  232. end;
  233. end.