tciotuils.pas 24 KB

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