tciotuils.pas 28 KB

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