tcregexp.pp 8.2 KB

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