tciotuils.pas 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279
  1. unit tciotuils;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry, system.ioutils;
  6. type
  7. { TTestTPath }
  8. TTestIO = class(TTestCase)
  9. Private
  10. FCWD : String;
  11. FBaseDir : String;
  12. protected
  13. Procedure CreateTestDirs;
  14. Procedure CleanDirs(aDir : String);
  15. procedure SetUp; override;
  16. procedure TearDown; override;
  17. Property CWD : String Read FCWD;
  18. Property BaseDir : String Read FBaseDir;
  19. end;
  20. TTestTPath = Class(TTestIO)
  21. Published
  22. Procedure TestIsValidPathChar;
  23. Procedure TestIsValidFileNameChar;
  24. Procedure TestHasValidPathChars;
  25. Procedure TestHasValidFileNameChars;
  26. Procedure TestGetExtendedPrefix;
  27. Procedure TestIsDriveRooted;
  28. Procedure TestIsExtendedPrefixed;
  29. Procedure TestIsRelativePath;
  30. Procedure TestIsUNCPath;
  31. Procedure TestIsUNCRooted;
  32. Procedure TestGetGUIDFileName;
  33. Procedure TestDriveExists;
  34. Procedure TestMatchesPattern;
  35. Procedure TestChangeExtension;
  36. Procedure TestCombine;
  37. Procedure TestCombineMulti;
  38. Procedure TestGetDirectoryName;
  39. Procedure TestGetExtension;
  40. Procedure TestGetFileName;
  41. Procedure TestGetFileNameWithoutExtension;
  42. Procedure TestGetFullPath;
  43. Procedure TestGetInvalidFileNameChars;
  44. Procedure TestGetInvalidPathChars;
  45. Procedure TestGetPathRoot;
  46. Procedure TestGetRandomFileName;
  47. Procedure TestGetTempFileName;
  48. Procedure TestGetTempPath;
  49. Procedure TestGetHomePath;
  50. Procedure TestGetDocumentsPath;
  51. Procedure TestGetSharedDocumentsPath;
  52. Procedure TestGetLibraryPath;
  53. Procedure TestGetCachePath;
  54. Procedure TestGetPublicPath;
  55. Procedure TestGetPicturesPath;
  56. Procedure TestGetSharedPicturesPath;
  57. Procedure TestGetCameraPath;
  58. Procedure TestGetSharedCameraPath;
  59. Procedure TestGetMusicPath;
  60. Procedure TestGetSharedMusicPath;
  61. Procedure TestGetMoviesPath;
  62. Procedure TestGetSharedMoviesPath;
  63. Procedure TestGetAlarmsPath;
  64. Procedure TestGetSharedAlarmsPath;
  65. Procedure TestGetDownloadsPath;
  66. Procedure TestGetSharedDownloadsPath;
  67. Procedure TestGetRingtonesPath;
  68. Procedure TestGetSharedRingtonesPath;
  69. Procedure TestGetTemplatesPath;
  70. Procedure TestGetSetAttributes;
  71. Procedure TestHasExtension;
  72. Procedure TestIsPathRooted;
  73. Procedure TestExtensionSeparatorChar;
  74. Procedure TestAltDirectorySeparatorChar;
  75. Procedure TestDirectorySeparatorChar;
  76. Procedure TestPathSeparator;
  77. Procedure TestVolumeSeparatorChar;
  78. end;
  79. implementation
  80. procedure TTestTPath.TestIsValidPathChar;
  81. Var
  82. C : AnsiChar;
  83. begin
  84. For C:=#0 to #31 do
  85. AssertFalse('Char #'+intToStr(Ord(C)),TPath.IsValidPathChar(C));
  86. {$IFNDEF UNIX}
  87. AssertFalse('Char "',TPath.IsValidPathChar('"'));
  88. AssertFalse('Char <',TPath.IsValidPathChar('<'));
  89. AssertFalse('Char >',TPath.IsValidPathChar('>'));
  90. AssertFalse('Char |',TPath.IsValidPathChar('|'));
  91. {$ENDIF}
  92. end;
  93. procedure TTestTPath.TestIsValidFileNameChar;
  94. Var
  95. C : AnsiChar;
  96. begin
  97. For C:=#0 to #31 do
  98. AssertFalse('Char #'+intToStr(Ord(C)),TPath.IsValidPathChar(C));
  99. {$IFNDEF UNIX}
  100. {$IFDEF WINDOWS}
  101. AssertFalse('Char /',TPath.IsValidFileNameChar('/'));
  102. AssertFalse('Char *',TPath.IsValidFileNameChar('*'));
  103. AssertFalse('Char :',TPath.IsValidFileNameChar(':'));
  104. AssertFalse('Char >',TPath.IsValidFileNameChar('>'));
  105. AssertFalse('Char <',TPath.IsValidFileNameChar('<'));
  106. AssertFalse('Char ?',TPath.IsValidFileNameChar('?'));
  107. AssertFalse('Char \',TPath.IsValidFileNameChar('\'));
  108. AssertFalse('Char |',TPath.IsValidFileNameChar('|'));
  109. {$ENDIF}
  110. {$ELSE}
  111. AssertFalse('Char /',TPath.IsValidFileNameChar('/'));
  112. AssertFalse('Char ~',TPath.IsValidFileNameChar('~'));
  113. {$ENDIF}
  114. end;
  115. procedure TTestTPath.TestHasValidPathChars;
  116. procedure testok(s: string);
  117. begin
  118. AssertTrue(S+' is OK',TPath.HasValidPathChars(S,False))
  119. end;
  120. procedure testnok(s: string);
  121. begin
  122. AssertFalse(S+' is NOK',TPath.HasValidPathChars(S,False))
  123. end;
  124. var
  125. C : Char;
  126. begin
  127. TestOK('abcde12');
  128. TestOK('abcde/12');
  129. TestNOK(#10'abcde12');
  130. For C:=#0 to #31 do
  131. TestNOK(C+'abcde12');
  132. end;
  133. procedure TTestTPath.TestHasValidFileNameChars;
  134. procedure testok(s: string);
  135. begin
  136. AssertTrue(S+' is OK',TPath.HasValidFIleNameChars(S,False))
  137. end;
  138. procedure testnok(s: string);
  139. begin
  140. AssertFalse(S+' is NOK',TPath.HasValidFileNameChars(S,False))
  141. end;
  142. var
  143. C : Char;
  144. begin
  145. TestOK('abcde12');
  146. TestNOK('abcde/12');
  147. TestNOK(#10'abcde12');
  148. For C:=#0 to #31 do
  149. TestNOK(C+'abcde12');
  150. end;
  151. procedure TTestTPath.TestGetExtendedPrefix;
  152. Procedure TestIt(aExpected : TPathPrefixType; aPath : String);
  153. Var
  154. S : String;
  155. begin
  156. DoDirSeparators(aPath);
  157. Str(aExpected,S);
  158. {$IFNDEF WINDOWS}
  159. aExpected:=TPathPrefixType.pptNoPrefix;
  160. {$ENDIF}
  161. AssertTrue(aPath+' -> '+S,aExpected=TPath.GetExtendedPrefix(aPath));
  162. end;
  163. begin
  164. TestIt(TPathPrefixType.pptNoPrefix,'/a/b/c.txt');
  165. TestIt(TPathPrefixType.pptExtended,'//?/a/b/c.txt');
  166. TestIt(TPathPrefixType.pptExtendedUNC,'//?/UNC/a/b/c.txt');
  167. end;
  168. procedure TTestTPath.TestIsDriveRooted;
  169. Procedure TestIt(aExpected : Boolean; aPath : String);
  170. Var
  171. S : String;
  172. begin
  173. DoDirSeparators(aPath);
  174. Str(aExpected,S);
  175. {$IFNDEF WINDOWS}
  176. aExpected:=False;
  177. {$ENDIF}
  178. AssertTrue(aPath+' -> '+S,aExpected=TPath.IsDriveRooted(aPath));
  179. end;
  180. begin
  181. TestIt(True,'c:/me/you.txt');
  182. TestIt(True,'A:/me/you.txt');
  183. TestIt(False,'1:/me/you.txt');
  184. TestIt(False,'/me/you.txt');
  185. end;
  186. procedure TTestTPath.TestIsExtendedPrefixed;
  187. Procedure TestIt(aExpected : Boolean; aPath : String);
  188. Var
  189. S : String;
  190. begin
  191. DoDirSeparators(aPath);
  192. Str(aExpected,S);
  193. {$IFNDEF WINDOWS}
  194. aExpected:=False;
  195. {$ENDIF}
  196. AssertTrue(aPath+' -> '+S,aExpected=TPath.IsExtendedPrefixed(aPath));
  197. end;
  198. begin
  199. TestIt(False,'/a/b/c.txt');
  200. TestIt(True,'//?/a/b/c.txt');
  201. TestIt(True,'//?/UNC/a/b/c.txt');
  202. end;
  203. procedure TTestTPath.TestIsRelativePath;
  204. Procedure TestIt(aExpected : Boolean; aPath : String);
  205. Var
  206. S : String;
  207. begin
  208. DoDirSeparators(aPath);
  209. Str(aExpected,S);
  210. AssertTrue(aPath+' -> '+S,aExpected=TPath.IsRelativePath(aPath));
  211. end;
  212. begin
  213. TestIt(False,'/a/b/c.txt');
  214. TestIt(True,'a/b/c.txt');
  215. TestIt(True,'../a/b/c.txt');
  216. TestIt(True,'./a/b/c.txt');
  217. end;
  218. procedure TTestTPath.TestIsUNCPath;
  219. Procedure TestIt(aExpected : Boolean; aPath : String);
  220. Var
  221. S : String;
  222. begin
  223. DoDirSeparators(aPath);
  224. Str(aExpected,S);
  225. {$IFNDEF WINDOWS}
  226. aExpected:=False;
  227. {$ENDIF}
  228. AssertTrue(aPath+' -> '+S,aExpected=TPath.IsUNCPath(aPath));
  229. end;
  230. begin
  231. TestIt(False,'/a/b/c.txt');
  232. TestIt(False,'a/b/c.txt');
  233. TestIt(True,'//a/b/c.txt');
  234. TestIt(True,'//?/a/b/c.txt');
  235. TestIt(True,'//?/UNC/a/b/c.txt');
  236. end;
  237. procedure TTestTPath.TestIsUNCRooted;
  238. Procedure TestIt(aExpected : Boolean; aPath : String);
  239. Var
  240. S : String;
  241. begin
  242. DoDirSeparators(aPath);
  243. Str(aExpected,S);
  244. {$IFNDEF WINDOWS}
  245. aExpected:=False;
  246. {$ENDIF}
  247. AssertTrue(aPath+' -> '+S,aExpected=TPath.IsUNCRooted(aPath));
  248. end;
  249. begin
  250. TestIt(False,'//a/b/c.txt');
  251. TestIt(False,'/a/b/c.txt');
  252. TestIt(False,'//a/');
  253. TestIt(True,'//?/a/b/c.txt');
  254. TestIt(True,'//?/UNC/a/b/c.txt');
  255. end;
  256. procedure TTestTPath.TestGetGUIDFileName;
  257. var
  258. G : TGUID;
  259. S : String;
  260. begin
  261. S:=TPath.GetGUIDFileName(True);
  262. S:='{'+S+'}';
  263. AssertTrue('Correct GUID1',TryStringToGUID(S,G));
  264. S:=TPath.GetGUIDFileName(False);
  265. //['{AC1AF8B9-C050-4D5E-86FD-199A72E93313}']
  266. System.Insert('-',S,21);
  267. Insert('-',S,17);
  268. Insert('-',S,13);
  269. Insert('-',S,9);
  270. S:='{'+S+'}';
  271. AssertTrue('Correct GUID2',TryStringToGUID(S,G));
  272. end;
  273. procedure TTestTPath.TestDriveExists;
  274. Var
  275. C : String;
  276. begin
  277. {$IFDEF WINDOWS}
  278. C:=GetEnvironmentVariable('SYSTEMDRIVE');
  279. AssertTrue('Systemdrive',TPath.DriveExists(C));
  280. C:=GetEnvironmentVariable('SYSTEMROOT');
  281. AssertTrue('Systemroot',TPath.DriveExists(C));
  282. {$ELSE}
  283. C:='/tmp';
  284. AssertFalse('Unix',TPath.DriveExists(C));
  285. {$ENDIF}
  286. end;
  287. procedure TTestTPath.TestMatchesPattern;
  288. Procedure TestIt(aResult : Boolean; const aFileName,aPattern : string);
  289. begin
  290. AssertEquals(aFIleName+' matches '+aPattern,aResult,TPath.MatchesPattern(aFileName,aPattern,True));
  291. end;
  292. begin
  293. TestIt(True,'a.txt','?.txt');
  294. TestIt(False,'ab','?');
  295. TestIt(True,'ab','*');
  296. TestIt(True,'abc','*c*');
  297. end;
  298. procedure TTestTPath.TestChangeExtension;
  299. begin
  300. AssertEquals('1','a.txt',TPath.ChangeExtension('a.doc','.txt'));
  301. AssertEquals('2','a',TPath.ChangeExtension('a.doc',''));
  302. end;
  303. procedure TTestTPath.TestCombine;
  304. Procedure TestIt(aResult,aPath,aFile : String);
  305. begin
  306. DoDirSeparators(aResult);
  307. DoDirSeparators(aPath);
  308. DoDirSeparators(aFile);
  309. AssertEquals(aPath+'+'+aFile,aResult,TPath.Combine(aPath,aFile));
  310. end;
  311. begin
  312. TestIt('a.txt','','a.txt');
  313. TestIt('/path','/path','');
  314. TestIt('/path/','/path/','');
  315. TestIt('/path/a.doc','/path','a.doc');
  316. TestIt('/path/a.doc','/path/','a.doc');
  317. end;
  318. procedure TTestTPath.TestCombineMulti;
  319. procedure DoTest(const Paths: array of String; Validate: Boolean; Expected: string; ExceptionExpected: Boolean=False);
  320. function ArgsToStr: string;
  321. var
  322. i: Integer;
  323. begin
  324. Result := '';
  325. for i := Low(Paths) to High(Paths) do
  326. Result := Result+''''+Paths[i] + ''',';
  327. if (Result <> '') then SetLength(Result, Length(Result)-1);
  328. Result := '['+Result+']';
  329. end;
  330. var
  331. Res,FailMsg: String;
  332. P : Array of string;
  333. I : Integer;
  334. begin
  335. FailMsg:='';
  336. try
  337. SetLength(P,Length(Paths));
  338. for I:=0 to Length(Paths)-1 do
  339. begin
  340. P[i]:=Paths[i];
  341. DoDirSeparators(P[i]);
  342. end;
  343. DoDirSeparators(Expected);
  344. Res := TPath.Combine(P,Validate);
  345. AssertEquals(ArgsToStr,Expected,Res)
  346. except
  347. on E: Exception do
  348. if not ExceptionExpected then
  349. FailMsg:=Format('%s : an unexpected exception %s occurred: %s',[ArgsToStr,E.ClassName,E.Message])
  350. end;
  351. if FailMsg<>'' then
  352. Fail(FailMsg);
  353. end;
  354. var
  355. S: String;
  356. begin
  357. //EInOutError
  358. DoTest([''],True,'');
  359. DoTest(['',''],True,'');
  360. DoTest(['','',''],True,'');
  361. DoTest(['a','b','c'],True,'a\b\c');
  362. DoTest(['a','b','\c'],True,'\c');
  363. DoTest(['a','\b','c'],True,'\b\c');
  364. DoTest(['\a','\b','c'],True,'\b\c');
  365. DoTest(['\a','\b','\c'],True,'\c');
  366. DoTest(['\a','b','\c:'],True,'\c:');
  367. DoTest(['a','<>','\b','c','\d'],True,'',True);
  368. {$IFDEF WINDOWS}
  369. DoTest(['c:','a','b'],True,'c:a\b',False);
  370. {$ENDIF}
  371. DoTest(['\1','..\2','..\3','..4'],True,'\1\..\2\..\3\..4');
  372. DoTest(['\1','','','4','','6',''],True,'\1\4\6');
  373. DoTest(['','','','<>|'],True,'<>|',True);
  374. DoTest([''],False,'');
  375. DoTest(['',''],False,'');
  376. DoTest(['','',''],False,'');
  377. DoTest(['a','b','c'],False,'a\b\c');
  378. DoTest(['a','b','\c'],False,'\c');
  379. DoTest(['a','\b','c'],False,'\b\c');
  380. DoTest(['\a','\b','c'],False,'\b\c');
  381. DoTest(['\a','\b','\c'],False,'\c');
  382. DoTest(['\a','b','\c:'],False,'\c:');
  383. DoTest(['a','<>','\b','c','\d'],False,'\d',False);
  384. end;
  385. procedure TTestTPath.TestGetDirectoryName;
  386. Procedure TestIt(aResult,aFile : String);
  387. begin
  388. DoDirSeparators(aResult);
  389. DoDirSeparators(aFile);
  390. AssertEquals(aFile,aResult,TPath.GetDirectoryName(aFile));
  391. end;
  392. begin
  393. TestIt('/a','/a/b.txt');
  394. TestIt('','b.txt');
  395. TestIt('.','./b.txt');
  396. end;
  397. procedure TTestTPath.TestGetExtension;
  398. Procedure TestIt(aResult,aFile : String);
  399. begin
  400. DoDirSeparators(aResult);
  401. DoDirSeparators(aFile);
  402. AssertEquals(aFile,aResult,TPath.GetExtension(aFile));
  403. end;
  404. begin
  405. TestIt('.txt','/a/b.txt');
  406. TestIt('.txt','b.txt');
  407. TestIt('','.txt');
  408. end;
  409. procedure TTestTPath.TestGetFileName;
  410. Procedure TestIt(aResult,aFile : String);
  411. begin
  412. DoDirSeparators(aResult);
  413. DoDirSeparators(aFile);
  414. AssertEquals(aFile,aResult,TPath.GetFileName(aFile));
  415. end;
  416. begin
  417. TestIt('b.txt','/a/b.txt');
  418. TestIt('b.txt','b.txt');
  419. TestIt('.txt','.txt');
  420. end;
  421. procedure TTestTPath.TestGetFileNameWithoutExtension;
  422. Procedure TestIt(aResult,aFile : String);
  423. begin
  424. DoDirSeparators(aResult);
  425. DoDirSeparators(aFile);
  426. AssertEquals(aFile,aResult,TPath.GetFileNameWithoutExtension(aFile));
  427. end;
  428. begin
  429. TestIt('b','/a/b.txt');
  430. TestIt('b','b.txt');
  431. TestIt('.txt','.txt');
  432. end;
  433. procedure TTestTPath.TestGetFullPath;
  434. Procedure TestIt(aResult,aFile : String);
  435. begin
  436. DoDirSeparators(aResult);
  437. DoDirSeparators(aFile);
  438. AssertEquals(aFile,aResult,TPath.GetFullPath(aFile));
  439. end;
  440. begin
  441. TestIt('/a/b.txt','/a/b.txt');
  442. TestIt(CWD+'b.txt','b.txt');
  443. TestIt(CWD+'a/b.txt','a/b.txt');
  444. end;
  445. Function IndexOf(C : Char; A : TCharArray) : Integer; overload;
  446. Var
  447. Len : Integer;
  448. begin
  449. Result:=0;
  450. Len:=Length(A);
  451. While (Result<Len) and (A[Result]<>C) do
  452. Inc(Result);
  453. if Result>=Len then
  454. Result:=-1;
  455. end;
  456. procedure TTestTPath.TestGetInvalidFileNameChars;
  457. Const
  458. {$IFDEF UNIX}
  459. CExtraInvalid = '/~';
  460. {$ELSE}
  461. CExtraInvalid = '"*/:<>?\|';
  462. {$ENDIF}
  463. Var
  464. CA : TCharArray;
  465. C : Char;
  466. I,P : Integer;
  467. begin
  468. CA:=TPath.GetInvalidFileNameChars;
  469. For C:=#0 to #31 do
  470. begin
  471. P:=IndexOf(C,CA);
  472. AssertTrue('1 Have #'+IntToStr(Ord(C)),P<>-1);
  473. System.Delete(CA,P,1);
  474. end;
  475. For C in CExtraInvalid do
  476. begin
  477. P:=IndexOf(C,CA);
  478. AssertTrue('2 Have #'+IntToStr(Ord(C)),P<>-1);
  479. System.Delete(CA,P,1);
  480. end;
  481. AssertEquals('All characters accounted for',0,Length(CA));
  482. end;
  483. procedure TTestTPath.TestGetInvalidPathChars;
  484. Const
  485. {$IFDEF UNIX}
  486. CExtraInvalid = '"<>|';
  487. {$ELSE}
  488. CExtraInvalid = '';
  489. {$ENDIF}
  490. Var
  491. CA : TCharArray;
  492. C : Char;
  493. I,P : Integer;
  494. begin
  495. CA:=TPath.GetInvalidPathChars;
  496. For C:=#0 to #31 do
  497. begin
  498. P:=IndexOf(C,CA);
  499. AssertTrue('1 Have #'+IntToStr(Ord(C)),P<>-1);
  500. System.Delete(CA,P,1);
  501. end;
  502. For C in CExtraInvalid do
  503. begin
  504. P:=IndexOf(C,CA);
  505. AssertTrue('2 Have #'+IntToStr(Ord(C)),P<>-1);
  506. System.Delete(CA,P,1);
  507. end;
  508. AssertEquals('All characters accounted for',0,Length(CA));
  509. end;
  510. procedure TTestTPath.TestGetPathRoot;
  511. Procedure TestIt(aResult,aFile : string);
  512. begin
  513. DoDirSeparators(aResult);
  514. DoDirSeparators(aFile);
  515. AssertEquals(aFile+' -> '+aResult,aResult,TPath.GetPathRoot(aFIle));
  516. end;
  517. begin
  518. TestIt('/','/a/b/c.txt');
  519. {$IFDEF WINDOWS}
  520. TestIt('a:/','a:/b/c.txt');
  521. TestIt('//a/','//a/b/c.txt');
  522. {$ENDIF}
  523. end;
  524. procedure TTestTPath.TestGetRandomFileName;
  525. Const
  526. allowed = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.';
  527. Var
  528. FN : String;
  529. C : Char;
  530. begin
  531. FN:=TPath.GetRandomFileName;
  532. AssertEquals('Have correct length',12,Length(FN));
  533. AssertTrue('Have dot',(Pos('.',FN)<>0) and (Pos('.',FN)<Length(FN)));
  534. For C in FN do
  535. if (Pos(Upcase(C),Allowed)=0) then
  536. Fail('Invalid char in string: '+c);
  537. end;
  538. procedure TTestTPath.TestGetTempFileName;
  539. Var
  540. aDir,FN : String;
  541. begin
  542. FN:=GetTempFileName;
  543. AssertEquals('Path',TPath.GetTempPath,ExtractFilePath(FN));
  544. FN:=ExtractFileName(FN);
  545. AssertTrue('Not empty name',0<Length(FN));
  546. AssertTrue('Not empty extension',0<Length(ExtractFileExt(FN)));
  547. aDir:=BaseDir;
  548. DoDirSeparators(aDir);
  549. FN:=GetTempFileName(aDir,'ttt');
  550. AssertEquals('2 Path',adir,ExtractFilePath(FN));
  551. FN:=ExtractFileName(FN);
  552. AssertTrue('2 Not empty name',0<Length(FN));
  553. AssertEquals('Prefix',1,Pos('ttt',FN));
  554. AssertTrue('2 Not empty extension',0<Length(ExtractFileExt(FN)));
  555. end;
  556. procedure TTestTPath.TestGetTempPath;
  557. Var
  558. FN : String;
  559. begin
  560. FN:=TPath.GetTempPath;
  561. AssertTrue('Dir exists',DirectoryExists(FN));
  562. end;
  563. procedure TTestTPath.TestGetHomePath;
  564. Var
  565. FN : String;
  566. begin
  567. FN:=TPath.GetHomePath;
  568. AssertTrue('Dir exists',DirectoryExists(FN));
  569. AssertEquals('UserDir exists',GetUserDir,FN);
  570. end;
  571. {$IFDEF UNIX}
  572. //Names : array[TSpecialDir] of string
  573. // = ('DESKTOP', 'DOCUMENTS', 'DOWNLOAD', 'MUSIC', 'PICTURES', 'PUBLICSHARE', 'TEMPLATES', 'VIDEOS');
  574. function UnixSpecialDir(const AType: String): string;
  575. var
  576. cfg,varname: string;
  577. L: TStringList;
  578. begin
  579. Result := '';
  580. // XDG variable name
  581. varName:=Format('XDG_%s_DIR',[UpperCase(AType)]);
  582. Cfg:=GetEnvironmentVariable('XDG_CONFIG_HOME');
  583. if (Cfg='') then
  584. Cfg:=GetUserDir+'.config/user-dirs.dirs'
  585. else
  586. CFG:=CFG+'user-dirs.dirs';
  587. if not FileExists(Cfg) then
  588. Exit;
  589. L:=TStringList.Create;
  590. try
  591. L.LoadFromFile(Cfg);
  592. Result:=AnsiDequotedStr(L.Values[VarName],'"');
  593. finally
  594. FreeAndNil(L);
  595. end;
  596. Result:=StringReplace(Result,'$HOME', ExcludeTrailingPathDelimiter(GetUserDir), [rfIgnoreCase]);
  597. end;
  598. {$ENDIF}
  599. procedure TTestTPath.TestGetDocumentsPath;
  600. Var
  601. FN : String;
  602. begin
  603. FN:=TPath.GetDocumentsPath;
  604. {$IFDEF UNIX}
  605. AssertEquals(UnixSpecialDir('Documents'),FN);
  606. {$ELSE}
  607. {$IFDEF WINDOWS}
  608. AssertEquals(GetSpecialDir(CSIDL_PERSONAL),FN);
  609. {$ELSE}
  610. AssertEquals(GetUserDir,FN);
  611. {$ENDIF}
  612. {$ENDIF}
  613. end;
  614. procedure TTestTPath.TestGetSharedDocumentsPath;
  615. Var
  616. FN : String;
  617. begin
  618. FN:=TPath.GetSharedDocumentsPath;
  619. {$IFDEF UNIX}
  620. AssertEquals(UnixSpecialDir('PublicShare'),FN);
  621. {$ELSE}
  622. {$IFDEF WINDOWS}
  623. AssertEquals(GetSpecialDir(CSIDL_COMMON_DOCUMENTS),FN);
  624. {$ELSE}
  625. AssertEquals(GetUserDir,FN);
  626. {$ENDIF}
  627. {$ENDIF}
  628. end;
  629. procedure TTestTPath.TestGetLibraryPath;
  630. Var
  631. FN : String;
  632. begin
  633. FN:=TPath.GetLibraryPath;
  634. {$IFDEF UNIX}
  635. AssertEquals(GetCurrentDir,FN);
  636. {$ELSE}
  637. {$IFDEF WINDOWS}
  638. AssertEquals(ExtractFilePath(Paramstr(0)),FN);
  639. {$ELSE}
  640. AssertEquals(GetUserDir,FN);
  641. {$ENDIF}
  642. {$ENDIF}
  643. end;
  644. procedure TTestTPath.TestGetCachePath;
  645. Var
  646. FN : String;
  647. begin
  648. FN:=TPath.GetCachePath;
  649. {$IFDEF UNIX}
  650. AssertEquals(GetUserDir+'.cache',FN);
  651. {$ELSE}
  652. {$IFDEF WINDOWS}
  653. AssertEquals(GetSpecialDir(CSIDL_LOCAL_APPDATA),FN);
  654. {$ELSE}
  655. AssertEquals(GetTempDir,FN);
  656. {$ENDIF}
  657. {$ENDIF}
  658. end;
  659. procedure TTestTPath.TestGetPublicPath;
  660. Var
  661. FN : String;
  662. begin
  663. FN:=TPath.GetPublicPath;
  664. {$IFDEF UNIX}
  665. AssertEquals(UnixSpecialDir('PublicShare'),FN);
  666. {$ELSE}
  667. {$IFDEF WINDOWS}
  668. AssertEquals(GetSpecialDir(CSIDL_COMMON_APPDATA),FN);
  669. {$ELSE}
  670. AssertEquals(GetUserDir,FN);
  671. {$ENDIF}
  672. {$ENDIF}
  673. end;
  674. procedure TTestTPath.TestGetPicturesPath;
  675. Var
  676. FN : String;
  677. begin
  678. FN:=TPath.GetPicturesPath;
  679. {$IFDEF UNIX}
  680. AssertEquals(UnixSpecialDir('Pictures'),FN);
  681. {$ELSE}
  682. {$IFDEF WINDOWS}
  683. AssertEquals(GetSpecialDir(CSIDL_MYPICTURES),FN);
  684. {$ELSE}
  685. AssertEquals(GetUserDir,FN);
  686. {$ENDIF}
  687. {$ENDIF}
  688. end;
  689. procedure TTestTPath.TestGetSharedPicturesPath;
  690. Var
  691. FN : String;
  692. begin
  693. FN:=TPath.GetSharedPicturesPath;
  694. {$IFDEF UNIX}
  695. AssertEquals(UnixSpecialDir('PublicShare'),FN);
  696. {$ELSE}
  697. {$IFDEF WINDOWS}
  698. AssertEquals(GetSpecialDir(CSIDL_COMMON_PICTURES),FN);
  699. {$ELSE}
  700. AssertEquals(GetUserDir,FN);
  701. {$ENDIF}
  702. {$ENDIF}
  703. end;
  704. procedure TTestTPath.TestGetCameraPath;
  705. Var
  706. FN : String;
  707. begin
  708. FN:=TPath.GetPicturesPath;
  709. {$IFDEF UNIX}
  710. AssertEquals(UnixSpecialDir('Pictures'),FN);
  711. {$ELSE}
  712. {$IFDEF WINDOWS}
  713. AssertEquals(GetSpecialDir(CSIDL_MYPICTURES),FN);
  714. {$ELSE}
  715. AssertEquals(GetUserDir,FN);
  716. {$ENDIF}
  717. {$ENDIF}
  718. end;
  719. procedure TTestTPath.TestGetSharedCameraPath;
  720. Var
  721. FN : String;
  722. begin
  723. FN:=TPath.GetSharedCameraPath;
  724. {$IFDEF UNIX}
  725. AssertEquals(UnixSpecialDir('PublicShare'),FN);
  726. {$ELSE}
  727. {$IFDEF WINDOWS}
  728. AssertEquals(GetSpecialDir(CSIDL_COMMON_PICTURES),FN);
  729. {$ELSE}
  730. AssertEquals(GetUserDir,FN);
  731. {$ENDIF}
  732. {$ENDIF}
  733. end;
  734. procedure TTestTPath.TestGetMusicPath;
  735. Var
  736. FN : String;
  737. begin
  738. FN:=TPath.GetMusicPath;
  739. {$IFDEF UNIX}
  740. AssertEquals(UnixSpecialDir('Music'),FN);
  741. {$ELSE}
  742. {$IFDEF WINDOWS}
  743. AssertEquals(GetSpecialDir(CSIDL_MYMUSIC),FN);
  744. {$ELSE}
  745. AssertEquals(GetUserDir,FN);
  746. {$ENDIF}
  747. {$ENDIF}
  748. end;
  749. procedure TTestTPath.TestGetSharedMusicPath;
  750. Var
  751. FN : String;
  752. begin
  753. FN:=TPath.GetSharedMusicPath;
  754. {$IFDEF UNIX}
  755. AssertEquals(UnixSpecialDir('PublicShare'),FN);
  756. {$ELSE}
  757. {$IFDEF WINDOWS}
  758. AssertEquals(GetSpecialDir(CSIDL_COMMON_MUSIC),FN);
  759. {$ELSE}
  760. AssertEquals(GetUserDir,FN);
  761. {$ENDIF}
  762. {$ENDIF}
  763. end;
  764. procedure TTestTPath.TestGetMoviesPath;
  765. Var
  766. FN : String;
  767. begin
  768. FN:=TPath.GetMoviesPath;
  769. {$IFDEF UNIX}
  770. AssertEquals(UnixSpecialDir('Videos'),FN);
  771. {$ELSE}
  772. {$IFDEF WINDOWS}
  773. AssertEquals(GetSpecialDir(CSIDL_MYVIDEO),FN);
  774. {$ELSE}
  775. AssertEquals(GetUserDir,FN);
  776. {$ENDIF}
  777. {$ENDIF}
  778. end;
  779. procedure TTestTPath.TestGetSharedMoviesPath;
  780. Var
  781. FN : String;
  782. begin
  783. FN:=TPath.GetSharedMoviesPath;
  784. {$IFDEF UNIX}
  785. AssertEquals(UnixSpecialDir('PublicShare'),FN);
  786. {$ELSE}
  787. {$IFDEF WINDOWS}
  788. AssertEquals(GetSpecialDir(CSIDL_COMMON_VIDEO),FN);
  789. {$ELSE}
  790. AssertEquals(GetUserDir,FN);
  791. {$ENDIF}
  792. {$ENDIF}
  793. end;
  794. procedure TTestTPath.TestGetAlarmsPath;
  795. Var
  796. FN : String;
  797. begin
  798. FN:=TPath.GetAlarmsPath;
  799. {$IFDEF UNIX}
  800. AssertEquals(UnixSpecialDir('Music'),FN);
  801. {$ELSE}
  802. {$IFDEF WINDOWS}
  803. AssertEquals(GetSpecialDir(CSIDL_MYMUSIC),FN);
  804. {$ELSE}
  805. AssertEquals(GetUserDir,FN);
  806. {$ENDIF}
  807. {$ENDIF}
  808. end;
  809. procedure TTestTPath.TestGetSharedAlarmsPath;
  810. Var
  811. FN : String;
  812. begin
  813. FN:=TPath.GetSharedAlarmsPath;
  814. {$IFDEF UNIX}
  815. AssertEquals(UnixSpecialDir('PublicShare'),FN);
  816. {$ELSE}
  817. {$IFDEF WINDOWS}
  818. AssertEquals(GetSpecialDir(CSIDL_COMMON_MUSIC),FN);
  819. {$ELSE}
  820. AssertEquals(GetUserDir,FN);
  821. {$ENDIF}
  822. {$ENDIF}
  823. end;
  824. procedure TTestTPath.TestGetDownloadsPath;
  825. Var
  826. FN : String;
  827. begin
  828. FN:=TPath.GetDownloadsPath;
  829. {$IFDEF UNIX}
  830. AssertEquals(UnixSpecialDir('Download'),FN);
  831. {$ELSE}
  832. {$IFDEF WINDOWS}
  833. AssertEquals(GetSpecialDir(CSIDL_MYMUSIC),FN);
  834. {$ELSE}
  835. AssertEquals(GetUserDir,FN);
  836. {$ENDIF}
  837. {$ENDIF}
  838. end;
  839. procedure TTestTPath.TestGetSharedDownloadsPath;
  840. Var
  841. FN : String;
  842. begin
  843. FN:=TPath.GetSharedDownloadsPath;
  844. {$IFDEF UNIX}
  845. AssertEquals(UnixSpecialDir('PublicShare'),FN);
  846. {$ELSE}
  847. {$IFDEF WINDOWS}
  848. AssertEquals(GetSpecialDir(CSIDL_COMMON_APPDATA),FN);
  849. {$ELSE}
  850. AssertEquals(GetUserDir,FN);
  851. {$ENDIF}
  852. {$ENDIF}
  853. end;
  854. procedure TTestTPath.TestGetRingtonesPath;
  855. Var
  856. FN : String;
  857. begin
  858. FN:=TPath.GetAlarmsPath;
  859. {$IFDEF UNIX}
  860. AssertEquals(UnixSpecialDir('Music'),FN);
  861. {$ELSE}
  862. {$IFDEF WINDOWS}
  863. AssertEquals(GetSpecialDir(CSIDL_MYMUSIC),FN);
  864. {$ELSE}
  865. AssertEquals(GetUserDir,FN);
  866. {$ENDIF}
  867. {$ENDIF}
  868. end;
  869. procedure TTestTPath.TestGetSharedRingtonesPath;
  870. Var
  871. FN : String;
  872. begin
  873. FN:=TPath.GetSharedRingtonesPath;
  874. {$IFDEF UNIX}
  875. AssertEquals(UnixSpecialDir('PublicShare'),FN);
  876. {$ELSE}
  877. {$IFDEF WINDOWS}
  878. AssertEquals(GetSpecialDir(CSIDL_COMMON_MUSIC),FN);
  879. {$ELSE}
  880. AssertEquals(GetUserDir,FN);
  881. {$ENDIF}
  882. {$ENDIF}
  883. end;
  884. procedure TTestTPath.TestGetTemplatesPath;
  885. Var
  886. FN : String;
  887. begin
  888. FN:=TPath.GetTemplatesPath;
  889. {$IFDEF UNIX}
  890. AssertEquals(UnixSpecialDir('Templates'),FN);
  891. {$ELSE}
  892. {$IFDEF WINDOWS}
  893. AssertEquals(GetSpecialDir(CSIDL_PERSONAL),FN);
  894. {$ELSE}
  895. AssertEquals(GetUserDir,FN);
  896. {$ENDIF}
  897. {$ENDIF}
  898. end;
  899. procedure TTestTPath.TestGetSetAttributes;
  900. Const
  901. {$IFDEF UNIX}
  902. FAS = [TFileAttribute.faOwnerRead, TFileAttribute.faOwnerWrite, TFileAttribute.faOwnerExecute,
  903. TFileAttribute.faGroupRead, TFileAttribute.faGroupWrite, TFileAttribute.faGroupExecute,
  904. TFileAttribute.faOthersRead, TFileAttribute.faOthersWrite, TFileAttribute.faOthersExecute,
  905. TFileAttribute.faUserIDExecution, TFileAttribute.faGroupIDExecution, TFileAttribute.faStickyBit];
  906. {$ENDIF}
  907. Var
  908. FN : String;
  909. H : THandle;
  910. FAG : TFileAttributes;
  911. begin
  912. FN:=BaseDir+'attrfile.txt';
  913. if FileExists(FN) then
  914. DeleteFile(FN);
  915. h:=FileCreate(Fn);
  916. try
  917. {$IFDEF UNIX}
  918. TPath.SetAttributes(FN,FAS);
  919. FAG:=TPath.GetAttributes(FN);
  920. AssertTrue('All attributes set',FAS*FAG=FAG);
  921. {$ENDIF}
  922. finally
  923. FileCLose(h);
  924. DeleteFile(FN);
  925. end;
  926. end;
  927. procedure TTestTPath.TestHasExtension;
  928. Procedure TestIt(aResult : Boolean; aFileName : string);
  929. begin
  930. DoDirSeparators(aFileName);
  931. AssertEquals(aFileName+' has extension',aResult,TPatH.HasExtension(aFileName));
  932. end;
  933. begin
  934. TestIt(False,'abc');
  935. TestIt(True,'abc.def');
  936. TestIt(True,'/123/abc.def');
  937. TestIt(True,'123/abc.def');
  938. TestIt(True,'123.345/abc.def');
  939. TestIt(False,'123.345/abcdef');
  940. {$ifdef unix}
  941. TestIt(False,'.abcdef');
  942. TestIt(False,'/123/.abcdef');
  943. {$endif}
  944. end;
  945. procedure TTestTPath.TestIsPathRooted;
  946. Procedure TestIt(aResult : Boolean; aFileName : string);
  947. begin
  948. DoDirSeparators(aFileName);
  949. AssertEquals(aFileName+' is rooted',aResult,TPatH.IsPathRooted(aFileName));
  950. end;
  951. begin
  952. TestIt(False,'abc.def');
  953. TestIt(False,'ad/abc.def');
  954. TestIt(False,'../abc.def');
  955. TestIt(False,'/abc.def');
  956. TestIt(False,'/a/abc.def');
  957. {$IFDEF WINDOWS}
  958. TestIt(True,'a:/abc.def');
  959. TestIt(True,'//share/o/abc.def');
  960. {$ENDIF}
  961. end;
  962. procedure TTestTPath.TestExtensionSeparatorChar;
  963. begin
  964. AssertEquals('.',TPath.ExtensionSeparatorChar);
  965. end;
  966. procedure TTestTPath.TestAltDirectorySeparatorChar;
  967. begin
  968. {$ifdef Windows}
  969. AssertEquals('/',TPath.AltDirectorySeparatorChar);
  970. {$elseif defined(unix)}
  971. AssertEquals('\',TPath.AltDirectorySeparatorChar);
  972. {$else}
  973. AssertEquals('\',TPath.AltDirectorySeparatorChar);
  974. {$endif}
  975. end;
  976. procedure TTestTPath.TestDirectorySeparatorChar;
  977. begin
  978. {$ifdef Windows}
  979. AssertEquals('\',TPath.DirectorySeparatorChar);
  980. {$else}
  981. AssertEquals('/',TPath.DirectorySeparatorChar);
  982. {$endif}
  983. end;
  984. procedure TTestTPath.TestPathSeparator;
  985. begin
  986. {$ifdef Windows}
  987. AssertEquals(';',TPath.PathSeparator);
  988. {$else}
  989. AssertEquals(':',TPath.PathSeparator);
  990. {$endif}
  991. end;
  992. procedure TTestTPath.TestVolumeSeparatorChar;
  993. begin
  994. {$ifdef Windows}
  995. AssertEquals(':',TPath.VolumeSeparatorChar);
  996. {$else}
  997. AssertEquals(#0,TPath.VolumeSeparatorChar);
  998. {$endif}
  999. end;
  1000. procedure TTestIO.CreateTestDirs;
  1001. procedure DoCreateDir(const aDir : string);
  1002. begin
  1003. if not ForceDirectories(FBaseDir+aDir) then
  1004. Fail('Could not create directory %s',[FBaseDir+aDir]);
  1005. end;
  1006. begin
  1007. DoCreateDir('testpath');
  1008. DoCreateDir('testpath/dir1');
  1009. DoCreateDir('testpath/dir2');
  1010. DoCreateDir('testpath/dir3');
  1011. end;
  1012. procedure TTestIO.CleanDirs(aDir: String);
  1013. Var
  1014. Info : TSearchRec;
  1015. lDir,lFull : String;
  1016. begin
  1017. lDir:=IncludeTrailingPathDelimiter(aDir);
  1018. If FIndFirst(lDir+AllFilesMask,sysutils.faDirectory,Info)=0 then
  1019. try
  1020. Repeat
  1021. lFull:=lDir+Info.Name;
  1022. if Info.IsDirectory then
  1023. begin
  1024. if not Info.IsCurrentOrParentDir then
  1025. CleanDirs(lFull);
  1026. if not RemoveDir(lFull) then
  1027. Fail('Failed to remove directory %s',[lFull])
  1028. end
  1029. else if not DeleteFIle(lFull) then
  1030. Fail('Failed to remove file %s',[lFull])
  1031. until FIndNext(Info)>0;
  1032. finally
  1033. FindClose(Info);
  1034. end;
  1035. end;
  1036. procedure TTestIO.SetUp;
  1037. begin
  1038. FCWD:=IncludeTrailingPathDelimiter(GetCurrentDir);
  1039. FBaseDir:=GetTempDir(False)+'testio/';
  1040. end;
  1041. procedure TTestIO.TearDown;
  1042. begin
  1043. CleanDirs(FBaseDir);
  1044. ChDir(FCWD);
  1045. end;
  1046. initialization
  1047. RegisterTest(TTestTPath);
  1048. end.