tcregexp.pp 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442
  1. unit tcregexp;
  2. {$mode objfpc}{$H+}
  3. { $DEFINE DUMPTESTS} //define this to dump a
  4. interface
  5. uses
  6. Classes, SysUtils, fpcunit, testregistry, regexpr;
  7. type
  8. { TTestRegexpr }
  9. TTestRegexpr= class(TTestCase)
  10. private
  11. FRE: TRegExpr;
  12. protected
  13. class function PrintableString(AString: string): string;
  14. Procedure RunRETest(aIndex : Integer);
  15. procedure SetUp; override;
  16. procedure TearDown; override;
  17. Property RE : TRegExpr read FRE;
  18. published
  19. procedure TestEmpty;
  20. Procedure RunTest1;
  21. Procedure RunTest2;
  22. Procedure RunTest3;
  23. Procedure RunTest4;
  24. Procedure RunTest5;
  25. Procedure RunTest6;
  26. Procedure RunTest7;
  27. Procedure RunTest8;
  28. Procedure RunTest9;
  29. Procedure RunTest10;
  30. Procedure RunTest11;
  31. Procedure RunTest12;
  32. Procedure RunTest13;
  33. Procedure RunTest14;
  34. Procedure RunTest15;
  35. Procedure RunTest16;
  36. Procedure RunTest17;
  37. Procedure RunTest18;
  38. Procedure RunTest19;
  39. Procedure RunTest20;
  40. Procedure RunTest21;
  41. Procedure RunTest22;
  42. Procedure RunTest23;
  43. Procedure RunTest24;
  44. Procedure RunTest25;
  45. end;
  46. implementation
  47. Type
  48. TRegExTest = record
  49. Expression: string;
  50. InputText: string;
  51. SubstitutionText: string;
  52. ExpectedResult: string;
  53. MatchStart: integer;
  54. end;
  55. const
  56. testCases: array [1..25] of TRegExTest = (
  57. (
  58. expression: '\nd';
  59. inputText: 'abc'#13#10'def';
  60. substitutionText: '\n\x{10}\r\\';
  61. expectedResult: 'abc'#13#10#16#13'\ef';
  62. MatchStart: 0
  63. ),
  64. (
  65. expression: '(\w*)';
  66. inputText: 'name.ext';
  67. substitutionText: '$1.new';
  68. expectedResult: 'name.new.new.ext.new.new';
  69. MatchStart: 0
  70. ),
  71. (
  72. expression: #$d'('#$a')';
  73. inputText: 'word'#$d#$a;
  74. substitutionText: '$1';
  75. expectedResult: 'word'#$a;
  76. MatchStart: 0
  77. ),
  78. (
  79. expression: '(word)';
  80. inputText: 'word';
  81. substitutionText: '\U$1\\r';
  82. expectedResult: 'WORD\r';
  83. MatchStart: 0
  84. ),
  85. (
  86. expression: '(word)';
  87. inputText: 'word';
  88. substitutionText: '$1\n';
  89. expectedResult: 'word'#$a;
  90. MatchStart: 0
  91. ),
  92. (
  93. expression: '[A-Z]';
  94. inputText: '234578923457823659GHJK38';
  95. substitutionText: '';
  96. expectedResult: 'G';
  97. matchStart: 19;
  98. ),
  99. (
  100. expression: '[A-Z]*?';
  101. inputText: '234578923457823659ARTZU38';
  102. substitutionText: '';
  103. expectedResult: '';
  104. matchStart: 1
  105. ),
  106. (
  107. expression: '[A-Z]+';
  108. inputText: '234578923457823659ARTZU38';
  109. substitutionText: '';
  110. expectedResult: 'ARTZU';
  111. matchStart: 19
  112. ),
  113. (
  114. expression: '[A-Z][A-Z]*';
  115. inputText: '234578923457823659ARTZU38';
  116. substitutionText: '';
  117. expectedResult: 'ARTZU';
  118. matchStart: 19
  119. ),
  120. (
  121. expression: '[A-Z][A-Z]?';
  122. inputText: '234578923457823659ARTZU38';
  123. substitutionText: '';
  124. expectedResult: 'AR';
  125. matchStart: 19
  126. ),
  127. (
  128. expression: '[^\d]+';
  129. inputText: '234578923457823659ARTZU38';
  130. substitutionText: '';
  131. expectedResult: 'ARTZU';
  132. matchStart: 19
  133. ),
  134. (
  135. expression: '[A-Z][A-Z]?[A-Z]';
  136. inputText: '234578923457823659ARTZU38';
  137. substitutionText: '';
  138. expectedResult: 'ART';
  139. matchStart: 19
  140. ),
  141. (
  142. expression: '[A-Z][A-Z]*[0-9]';
  143. inputText: '234578923457823659ARTZU38';
  144. substitutionText: '';
  145. expectedResult: 'ARTZU3';
  146. matchStart: 19
  147. ),
  148. (
  149. expression: '[A-Z]+[0-9]';
  150. inputText: '234578923457823659ARTZU38';
  151. substitutionText: '';
  152. expectedResult: 'ARTZU3';
  153. matchStart: 19
  154. ),
  155. (
  156. expression: '(?i)[A-Z]';
  157. inputText: '234578923457823659a38';
  158. substitutionText: '';
  159. expectedResult: 'a';
  160. matchStart: 19
  161. ),
  162. (
  163. expression: '(?i)[a-z]';
  164. inputText: '234578923457823659A38';
  165. substitutionText: '';
  166. expectedResult: 'A';
  167. matchStart: 19
  168. ),
  169. (
  170. expression: '(foo)1234';
  171. inputText: '1234 foo1234XXXX';
  172. substitutionText: '';
  173. expectedResult: 'foo1234';
  174. matchStart: 8
  175. ),
  176. (
  177. expression: '(((foo)))1234';
  178. inputText: '1234 foo1234XXXX';
  179. substitutionText: '';
  180. expectedResult: 'foo1234';
  181. matchStart: 8
  182. ),
  183. (
  184. expression: '(foo)(1234)';
  185. inputText: '1234 foo1234XXXX';
  186. substitutionText: '';
  187. expectedResult: 'foo1234';
  188. matchStart: 8
  189. ),
  190. (
  191. expression: 'nofoo|foo';
  192. inputText: '1234 foo1234XXXX';
  193. substitutionText: '';
  194. expectedResult: 'foo';
  195. matchStart: 8
  196. ),
  197. (
  198. expression: '(nofoo|foo)1234';
  199. inputText: '1234 nofoo1234XXXX';
  200. substitutionText: '';
  201. expectedResult: 'nofoo1234';
  202. matchStart: 8
  203. ),
  204. (
  205. expression: '(nofoo|foo|anotherfoo)1234';
  206. inputText: '1234 nofoo1234XXXX';
  207. substitutionText: '';
  208. expectedResult: 'nofoo1234';
  209. matchStart: 8
  210. ),
  211. (
  212. expression: 'nofoo1234|foo1234';
  213. inputText: '1234 foo1234XXXX';
  214. substitutionText: '';
  215. expectedResult: 'foo1234';
  216. matchStart: 8
  217. ),
  218. (
  219. expression: '(\w*)';
  220. inputText: 'name.ext';
  221. substitutionText: '';
  222. expectedResult: 'name';
  223. matchStart: 1
  224. ),
  225. (
  226. expression: '\r(\n)';
  227. inputText: #$d#$a;
  228. substitutionText: '';
  229. expectedResult: #$d#$a;
  230. matchStart: 1
  231. )
  232. );
  233. procedure TTestRegexpr.TestEmpty;
  234. begin
  235. AssertNotNull('Have RE',RE);
  236. AssertFalse('UseOsLineEndOnReplace correcly set', RE.UseOsLineEndOnReplace);
  237. end;
  238. procedure TTestRegexpr.RunTest1;
  239. begin
  240. RunRETest(1);
  241. end;
  242. procedure TTestRegexpr.RunTest2;
  243. begin
  244. RunRETest(2);
  245. end;
  246. procedure TTestRegexpr.RunTest3;
  247. begin
  248. RunRETest(3);
  249. end;
  250. procedure TTestRegexpr.RunTest4;
  251. begin
  252. RunRETest(4);
  253. end;
  254. procedure TTestRegexpr.RunTest5;
  255. begin
  256. RunRETest(5);
  257. end;
  258. procedure TTestRegexpr.RunTest6;
  259. begin
  260. RunRETest(6);
  261. end;
  262. procedure TTestRegexpr.RunTest7;
  263. begin
  264. RunRETest(7);
  265. end;
  266. procedure TTestRegexpr.RunTest8;
  267. begin
  268. RunRETest(8);
  269. end;
  270. procedure TTestRegexpr.RunTest9;
  271. begin
  272. RunRETest(9);
  273. end;
  274. procedure TTestRegexpr.RunTest10;
  275. begin
  276. RunRETest(10);
  277. end;
  278. procedure TTestRegexpr.RunTest11;
  279. begin
  280. RunRETest(11);
  281. end;
  282. procedure TTestRegexpr.RunTest12;
  283. begin
  284. RunRETest(12);
  285. end;
  286. procedure TTestRegexpr.RunTest13;
  287. begin
  288. RunRETest(13);
  289. end;
  290. procedure TTestRegexpr.RunTest14;
  291. begin
  292. RunRETest(14);
  293. end;
  294. procedure TTestRegexpr.RunTest15;
  295. begin
  296. RunRETest(15);
  297. end;
  298. procedure TTestRegexpr.RunTest16;
  299. begin
  300. RunRETest(16);
  301. end;
  302. procedure TTestRegexpr.RunTest17;
  303. begin
  304. RunRETest(17);
  305. end;
  306. procedure TTestRegexpr.RunTest18;
  307. begin
  308. RunRETest(18);
  309. end;
  310. procedure TTestRegexpr.RunTest19;
  311. begin
  312. RunRETest(19);
  313. end;
  314. procedure TTestRegexpr.RunTest20;
  315. begin
  316. RunRETest(20);
  317. end;
  318. procedure TTestRegexpr.RunTest21;
  319. begin
  320. RunRETest(21);
  321. end;
  322. procedure TTestRegexpr.RunTest22;
  323. begin
  324. RunRETest(22);
  325. end;
  326. procedure TTestRegexpr.RunTest23;
  327. begin
  328. RunRETest(23);
  329. end;
  330. procedure TTestRegexpr.RunTest24;
  331. begin
  332. RunRETest(24);
  333. end;
  334. procedure TTestRegexpr.RunTest25;
  335. begin
  336. RunRETest(25);
  337. end;
  338. Class function TTestRegexpr.PrintableString(AString: string): string;
  339. var
  340. ch: Char;
  341. begin
  342. Result := '';
  343. for ch in AString do
  344. if ch < #31 then
  345. Result := Result + '#' + IntToStr(Ord(ch))
  346. else
  347. Result := Result + ch;
  348. end;
  349. procedure TTestRegexpr.RunRETest(aIndex: Integer);
  350. var
  351. T: TRegExTest;
  352. act : String;
  353. begin
  354. T:=testCases[aIndex];
  355. RE.Expression:=T.Expression;
  356. RE.Compile;
  357. {$IFDEF DUMPTESTS}
  358. Writeln('Test: ',TestName);
  359. writeln(' Modifiers "', RE.ModifierStr, '"');
  360. writeln(' Regular expression: ', T.Expression,' ,');
  361. writeln(' compiled into p-code: ');
  362. writeln(' ',RE.Dump);
  363. writeln(' Input text: "', PrintableString(T.inputText), '"');
  364. if (T.substitutionText <> '') then
  365. Writeln(' Substitution text: "', PrintableString(T.substitutionText), '"');
  366. {$ENDIF}
  367. if (T.SubstitutionText <> '') then
  368. begin
  369. act:=RE.Replace(T.InputText,T.SubstitutionText,True);
  370. AssertEquals('Replace failed', T.ExpectedResult,Act)
  371. end
  372. else
  373. begin
  374. RE.Exec(T.inputText);
  375. AssertEquals('Search position',T.MatchStart,RE.MatchPos[0]);
  376. AssertEquals('Matched text',T.ExpectedResult,RE.Match[0]);
  377. end;
  378. end;
  379. procedure TTestRegexpr.SetUp;
  380. begin
  381. Inherited;
  382. FRE := TRegExpr.Create;
  383. FRE.UseOsLineEndOnReplace:=False;
  384. end;
  385. procedure TTestRegexpr.TearDown;
  386. begin
  387. FreeAndNil(FRE);
  388. Inherited;
  389. end;
  390. initialization
  391. RegisterTest(TTestRegexpr);
  392. end.