Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

525 linhas
17 KiB

  1. unit uutlEnumeratorTests;
  2. {$mode objfpc}{$H+}
  3. {$IFDEF UTL_NESTED_PROCVARS}
  4. {$modeswitch nestedprocvars}
  5. {$ENDIF}
  6. interface
  7. uses
  8. Classes, SysUtils, TestFramework,
  9. uutlEnumerator, uutlInterfaces;
  10. type
  11. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  12. IIntEnumerator = specialize IutlEnumerator<Integer>;
  13. TutlEnumeratorTests = class(TTestCase)
  14. protected
  15. fEnumerator: IIntEnumerator;
  16. function GenerateOther(const aData: array of Integer): IIntEnumerator;
  17. procedure Generate(const aData: array of Integer); virtual; abstract;
  18. published
  19. // Procedure Names: ProcedureUnderTest_[Parameter]_EnumeratorItems_Result
  20. procedure Iterate_1to5_1to5;
  21. {$IFDEF UTL_ENUMERATORS}
  22. procedure Count_1to5_5;
  23. procedure Any_Empty_False;
  24. procedure Any_1to5_True;
  25. procedure Reverse_1to5_5to1;
  26. procedure Skip2_1to5_3to5;
  27. procedure Take3_1to5_1to3;
  28. procedure Skip5_Reverse_0to9_9to5;
  29. procedure Take5_Reverse_0to9_4to0;
  30. procedure Reverse_Skip5_0to9_4to0;
  31. procedure Reverse_Take5_0to9_9to5;
  32. procedure Contains3_1to5_true;
  33. procedure Contains9_1to5_false;
  34. procedure Concat6to8_1to5_1to8;
  35. {$IFDEF UTL_ADVANCED_ENUMERATORS}
  36. procedure Sort;
  37. procedure Where_IsEven;
  38. procedure Distinct;
  39. procedure Intersect;
  40. procedure Union;
  41. procedure Without;
  42. procedure Select;
  43. {$ENDIF}
  44. {$ENDIF}
  45. end;
  46. TutlArrayEnumeratorTests = class(TutlEnumeratorTests)
  47. protected
  48. procedure Generate(const aData: array of Integer); override;
  49. public
  50. procedure SetUp; override;
  51. end;
  52. implementation
  53. {$IF DEFINED(UTL_ENUMERATORS) AND DEFINED(UTL_ADVANCED_ENUMERATORS)}
  54. uses
  55. uutlFilter, uutlComparer;
  56. {$ENDIF}
  57. type
  58. TIntArrayEnumerator = specialize TutlArrayEnumerator<Integer>;
  59. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. //TutlEnumeratorTests///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  61. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  62. function TutlEnumeratorTests.GenerateOther(const aData: array of Integer): IIntEnumerator;
  63. var
  64. i: Integer;
  65. arr: TIntArrayEnumerator.TArray;
  66. begin
  67. SetLength(arr, Length(aData));
  68. for i := low(aData) to high(aData) do
  69. arr[i] := aData[i];
  70. result := TIntArrayEnumerator.Create(arr);
  71. end;
  72. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  73. procedure TutlEnumeratorTests.Iterate_1to5_1to5;
  74. begin
  75. Generate([1, 2, 3, 4, 5]);
  76. fEnumerator.Reset;
  77. AssertTrue (fEnumerator.MoveNext);
  78. AssertEquals(1, fEnumerator.GetCurrent);
  79. AssertTrue (fEnumerator.MoveNext);
  80. AssertEquals(2, fEnumerator.GetCurrent);
  81. AssertTrue (fEnumerator.MoveNext);
  82. AssertEquals(3, fEnumerator.GetCurrent);
  83. AssertTrue (fEnumerator.MoveNext);
  84. AssertEquals(4, fEnumerator.GetCurrent);
  85. AssertTrue (fEnumerator.MoveNext);
  86. AssertEquals(5, fEnumerator.GetCurrent);
  87. AssertFalse (fEnumerator.MoveNext);
  88. end;
  89. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. {$IFDEF UTL_ENUMERATORS}
  91. procedure TutlEnumeratorTests.Count_1to5_5;
  92. var
  93. i: Integer;
  94. begin
  95. Generate([1, 2, 3, 4, 5]);
  96. i := fEnumerator.Count;
  97. AssertEquals(5, i);
  98. end;
  99. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100. procedure TutlEnumeratorTests.Any_Empty_False;
  101. begin
  102. AssertFalse(fEnumerator.Any);
  103. end;
  104. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  105. procedure TutlEnumeratorTests.Any_1to5_True;
  106. begin
  107. Generate([1, 2, 3, 4, 5]);
  108. AssertTrue(fEnumerator.Any);
  109. end;
  110. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  111. procedure TutlEnumeratorTests.Reverse_1to5_5to1;
  112. var
  113. e: IIntEnumerator;
  114. begin
  115. e := fEnumerator.Reverse;
  116. Generate([1, 2, 3, 4, 5]);
  117. e.Reset;
  118. AssertTrue (e.MoveNext);
  119. AssertEquals(5, e.GetCurrent);
  120. AssertTrue (e.MoveNext);
  121. AssertEquals(4, e.GetCurrent);
  122. AssertTrue (e.MoveNext);
  123. AssertEquals(3, e.GetCurrent);
  124. AssertTrue (e.MoveNext);
  125. AssertEquals(2, e.GetCurrent);
  126. AssertTrue (e.MoveNext);
  127. AssertEquals(1, e.GetCurrent);
  128. AssertFalse (e.MoveNext);
  129. end;
  130. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  131. procedure TutlEnumeratorTests.Skip2_1to5_3to5;
  132. var
  133. e: IIntEnumerator;
  134. begin
  135. e := fEnumerator.Skip(2);
  136. Generate([1, 2, 3, 4, 5]);
  137. e.Reset;
  138. AssertTrue (e.MoveNext);
  139. AssertEquals(3, e.GetCurrent);
  140. AssertTrue (e.MoveNext);
  141. AssertEquals(4, e.GetCurrent);
  142. AssertTrue (e.MoveNext);
  143. AssertEquals(5, e.GetCurrent);
  144. AssertFalse (e.MoveNext);
  145. end;
  146. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  147. procedure TutlEnumeratorTests.Take3_1to5_1to3;
  148. var
  149. e: IIntEnumerator;
  150. begin
  151. e := fEnumerator.Take(3);
  152. Generate([1, 2, 3, 4, 5]);
  153. e.Reset;
  154. AssertTrue (e.MoveNext);
  155. AssertEquals(1, e.GetCurrent);
  156. AssertTrue (e.MoveNext);
  157. AssertEquals(2, e.GetCurrent);
  158. AssertTrue (e.MoveNext);
  159. AssertEquals(3, e.GetCurrent);
  160. AssertFalse (e.MoveNext);
  161. end;
  162. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  163. procedure TutlEnumeratorTests.Skip5_Reverse_0to9_9to5;
  164. var
  165. e: IIntEnumerator;
  166. begin
  167. e := fEnumerator.Skip(5).Reverse;
  168. Generate([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
  169. e.Reset;
  170. AssertTrue (e.MoveNext);
  171. AssertEquals(9, e.GetCurrent);
  172. AssertTrue (e.MoveNext);
  173. AssertEquals(8, e.GetCurrent);
  174. AssertTrue (e.MoveNext);
  175. AssertEquals(7, e.GetCurrent);
  176. AssertTrue (e.MoveNext);
  177. AssertEquals(6, e.GetCurrent);
  178. AssertTrue (e.MoveNext);
  179. AssertEquals(5, e.GetCurrent);
  180. AssertFalse (e.MoveNext);
  181. end;
  182. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  183. procedure TutlEnumeratorTests.Take5_Reverse_0to9_4to0;
  184. var
  185. e: IIntEnumerator;
  186. begin
  187. e := fEnumerator.Take(5).Reverse;
  188. Generate([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
  189. e.Reset;
  190. AssertTrue (e.MoveNext);
  191. AssertEquals(4, e.GetCurrent);
  192. AssertTrue (e.MoveNext);
  193. AssertEquals(3, e.GetCurrent);
  194. AssertTrue (e.MoveNext);
  195. AssertEquals(2, e.GetCurrent);
  196. AssertTrue (e.MoveNext);
  197. AssertEquals(1, e.GetCurrent);
  198. AssertTrue (e.MoveNext);
  199. AssertEquals(0, e.GetCurrent);
  200. AssertFalse (e.MoveNext);
  201. end;
  202. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  203. procedure TutlEnumeratorTests.Reverse_Skip5_0to9_4to0;
  204. var
  205. e: IIntEnumerator;
  206. begin
  207. e := fEnumerator.Reverse.Skip(5);
  208. Generate([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
  209. e.Reset;
  210. AssertTrue (e.MoveNext);
  211. AssertEquals(4, e.GetCurrent);
  212. AssertTrue (e.MoveNext);
  213. AssertEquals(3, e.GetCurrent);
  214. AssertTrue (e.MoveNext);
  215. AssertEquals(2, e.GetCurrent);
  216. AssertTrue (e.MoveNext);
  217. AssertEquals(1, e.GetCurrent);
  218. AssertTrue (e.MoveNext);
  219. AssertEquals(0, e.GetCurrent);
  220. AssertFalse (e.MoveNext);
  221. end;
  222. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  223. procedure TutlEnumeratorTests.Reverse_Take5_0to9_9to5;
  224. var
  225. e: IIntEnumerator;
  226. begin
  227. e := fEnumerator.Reverse.Take(5);
  228. Generate([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
  229. e.Reset;
  230. AssertTrue (e.MoveNext);
  231. AssertEquals(9, e.GetCurrent);
  232. AssertTrue (e.MoveNext);
  233. AssertEquals(8, e.GetCurrent);
  234. AssertTrue (e.MoveNext);
  235. AssertEquals(7, e.GetCurrent);
  236. AssertTrue (e.MoveNext);
  237. AssertEquals(6, e.GetCurrent);
  238. AssertTrue (e.MoveNext);
  239. AssertEquals(5, e.GetCurrent);
  240. AssertFalse (e.MoveNext);
  241. end;
  242. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  243. procedure TutlEnumeratorTests.Contains3_1to5_true;
  244. var
  245. b: Boolean;
  246. begin
  247. Generate([1, 2, 3, 4, 5]);
  248. b := fEnumerator.Contains(3, specialize TutlEqualityComparer<Integer>.Create);
  249. AssertTrue(b);
  250. end;
  251. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  252. procedure TutlEnumeratorTests.Contains9_1to5_false;
  253. var
  254. b: Boolean;
  255. begin
  256. Generate([1, 2, 3, 4, 5]);
  257. b := fEnumerator.Contains(9, specialize TutlEqualityComparer<Integer>.Create);
  258. AssertFalse(b);
  259. end;
  260. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  261. procedure TutlEnumeratorTests.Concat6to8_1to5_1to8;
  262. var
  263. e: IIntEnumerator;
  264. begin
  265. e := fEnumerator.Concat(GenerateOther([6, 7, 8]));
  266. Generate([1, 2, 3, 4, 5]);
  267. e.Reset;
  268. AssertTrue (e.MoveNext);
  269. AssertEquals(1, e.GetCurrent);
  270. AssertTrue (e.MoveNext);
  271. AssertEquals(2, e.GetCurrent);
  272. AssertTrue (e.MoveNext);
  273. AssertEquals(3, e.GetCurrent);
  274. AssertTrue (e.MoveNext);
  275. AssertEquals(4, e.GetCurrent);
  276. AssertTrue (e.MoveNext);
  277. AssertEquals(5, e.GetCurrent);
  278. AssertTrue (e.MoveNext);
  279. AssertEquals(6, e.GetCurrent);
  280. AssertTrue (e.MoveNext);
  281. AssertEquals(7, e.GetCurrent);
  282. AssertTrue (e.MoveNext);
  283. AssertEquals(8, e.GetCurrent);
  284. AssertFalse (e.MoveNext);
  285. end;
  286. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  287. {$IFDEF UTL_ADVANCED_ENUMERATORS}
  288. procedure TutlEnumeratorTests.Sort;
  289. var
  290. e: IIntEnumerator;
  291. begin
  292. e := fEnumerator.Sort(specialize TutlComparer<Integer>.Create);
  293. Generate([5, 8, 2, 6, 9, 4, 2, 6, 8, 4, 2, 5, 8, 4]);
  294. e.Reset;
  295. AssertTrue (e.MoveNext);
  296. AssertEquals(2, e.GetCurrent);
  297. AssertTrue (e.MoveNext);
  298. AssertEquals(2, e.GetCurrent);
  299. AssertTrue (e.MoveNext);
  300. AssertEquals(2, e.GetCurrent);
  301. AssertTrue (e.MoveNext);
  302. AssertEquals(4, e.GetCurrent);
  303. AssertTrue (e.MoveNext);
  304. AssertEquals(4, e.GetCurrent);
  305. AssertTrue (e.MoveNext);
  306. AssertEquals(4, e.GetCurrent);
  307. AssertTrue (e.MoveNext);
  308. AssertEquals(5, e.GetCurrent);
  309. AssertTrue (e.MoveNext);
  310. AssertEquals(5, e.GetCurrent);
  311. AssertTrue (e.MoveNext);
  312. AssertEquals(6, e.GetCurrent);
  313. AssertTrue (e.MoveNext);
  314. AssertEquals(6, e.GetCurrent);
  315. AssertTrue (e.MoveNext);
  316. AssertEquals(8, e.GetCurrent);
  317. AssertTrue (e.MoveNext);
  318. AssertEquals(8, e.GetCurrent);
  319. AssertTrue (e.MoveNext);
  320. AssertEquals(8, e.GetCurrent);
  321. AssertTrue (e.MoveNext);
  322. AssertEquals(9, e.GetCurrent);
  323. AssertFalse (e.MoveNext);
  324. end;
  325. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  326. function IsEven(constref i: Integer): Boolean;
  327. begin
  328. result := (i mod 2) = 0;
  329. end;
  330. procedure TutlEnumeratorTests.Where_IsEven;
  331. var
  332. e: IIntEnumerator;
  333. begin
  334. e := fEnumerator.Where(specialize TutlCallbackFilter<Integer>.Create(@IsEven));
  335. Generate([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]);
  336. e.Reset;
  337. AssertTrue (e.MoveNext);
  338. AssertEquals(0, e.GetCurrent);
  339. AssertTrue (e.MoveNext);
  340. AssertEquals(2, e.GetCurrent);
  341. AssertTrue (e.MoveNext);
  342. AssertEquals(4, e.GetCurrent);
  343. AssertTrue (e.MoveNext);
  344. AssertEquals(6, e.GetCurrent);
  345. AssertTrue (e.MoveNext);
  346. AssertEquals(8, e.GetCurrent);
  347. AssertFalse (e.MoveNext);
  348. end;
  349. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  350. procedure TutlEnumeratorTests.Distinct;
  351. var
  352. e: IIntEnumerator;
  353. begin
  354. e := fEnumerator.Distinct(specialize TutlComparer<Integer>.Create);
  355. Generate([1, 5, 2, 7, 1, 3, 7, 4, 5, 8]);
  356. e.Reset;
  357. AssertTrue (e.MoveNext);
  358. AssertEquals(1, e.Current);
  359. AssertTrue (e.MoveNext);
  360. AssertEquals(5, e.Current);
  361. AssertTrue (e.MoveNext);
  362. AssertEquals(2, e.Current);
  363. AssertTrue (e.MoveNext);
  364. AssertEquals(7, e.Current);
  365. AssertTrue (e.MoveNext);
  366. AssertEquals(3, e.Current);
  367. AssertTrue (e.MoveNext);
  368. AssertEquals(4, e.Current);
  369. AssertTrue (e.MoveNext);
  370. AssertEquals(8, e.Current);
  371. AssertFalse (e.MoveNext);
  372. end;
  373. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  374. procedure TutlEnumeratorTests.Intersect;
  375. var
  376. e: IIntEnumerator;
  377. begin
  378. e := fEnumerator
  379. .Intersect(GenerateOther([5, 6, 8]), specialize TutlComparer<Integer>.Create);
  380. Generate([1, 6, 4, 8, 2, 5]);
  381. e.Reset;
  382. AssertTrue (e.MoveNext);
  383. AssertEquals(6, e.Current);
  384. AssertTrue (e.MoveNext);
  385. AssertEquals(8, e.Current);
  386. AssertTrue (e.MoveNext);
  387. AssertEquals(5, e.Current);
  388. AssertFalse (e.MoveNext);
  389. end;
  390. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  391. procedure TutlEnumeratorTests.Union;
  392. var
  393. e: IIntEnumerator;
  394. begin
  395. e := fEnumerator
  396. .Union(GenerateOther([9, 3, 4, 6, 7]), specialize TutlComparer<Integer>.Create);
  397. Generate([1, 6, 4, 8, 2, 5]);
  398. e.Reset;
  399. AssertTrue (e.MoveNext);
  400. AssertEquals(1, e.Current);
  401. AssertTrue (e.MoveNext);
  402. AssertEquals(6, e.Current);
  403. AssertTrue (e.MoveNext);
  404. AssertEquals(4, e.Current);
  405. AssertTrue (e.MoveNext);
  406. AssertEquals(8, e.Current);
  407. AssertTrue (e.MoveNext);
  408. AssertEquals(2, e.Current);
  409. AssertTrue (e.MoveNext);
  410. AssertEquals(5, e.Current);
  411. AssertTrue (e.MoveNext);
  412. AssertEquals(9, e.Current);
  413. AssertTrue (e.MoveNext);
  414. AssertEquals(3, e.Current);
  415. AssertTrue (e.MoveNext);
  416. AssertEquals(7, e.Current);
  417. AssertFalse (e.MoveNext);
  418. end;
  419. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  420. procedure TutlEnumeratorTests.Without;
  421. var
  422. e: IIntEnumerator;
  423. begin
  424. e := fEnumerator
  425. .Without(GenerateOther([6, 8, 5]), specialize TutlComparer<Integer>.Create);
  426. Generate([1, 6, 4, 8, 2, 5]);
  427. e.Reset;
  428. AssertTrue (e.MoveNext);
  429. AssertEquals(1, e.Current);
  430. AssertTrue (e.MoveNext);
  431. AssertEquals(4, e.Current);
  432. AssertTrue (e.MoveNext);
  433. AssertEquals(2, e.Current);
  434. AssertFalse (e.MoveNext);
  435. end;
  436. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  437. function ConvertToFloat(constref a: Integer): Single;
  438. begin
  439. result := Single(a) / 2.0;
  440. end;
  441. procedure TutlEnumeratorTests.Select;
  442. var
  443. e: specialize IutlEnumerator<Single>;
  444. begin
  445. e := specialize TutlSelectEnumerator<Integer, Single>.Create(
  446. fEnumerator,
  447. specialize TutlCallbackSelector<Integer, Single>.Create(@ConvertToFloat));
  448. Generate([1, 2, 3, 4, 5]);
  449. e.Reset;
  450. AssertTrue (e.MoveNext);
  451. AssertEquals(0.5, e.Current);
  452. AssertTrue (e.MoveNext);
  453. AssertEquals(1.0, e.Current);
  454. AssertTrue (e.MoveNext);
  455. AssertEquals(1.5, e.Current);
  456. AssertTrue (e.MoveNext);
  457. AssertEquals(2.0, e.Current);
  458. AssertTrue (e.MoveNext);
  459. AssertEquals(2.5, e.Current);
  460. AssertFalse (e.MoveNext);
  461. end;
  462. {$ENDIF}
  463. {$ENDIF}
  464. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  465. //TutlArrayEnumeratorTests//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  466. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  467. procedure TutlArrayEnumeratorTests.Generate(const aData: array of Integer);
  468. var
  469. i: Integer;
  470. arr: TIntArrayEnumerator.TArray;
  471. begin
  472. SetLength(arr, Length(aData));
  473. for i := low(aData) to high(aData) do
  474. arr[i] := aData[i];
  475. (fEnumerator as TIntArrayEnumerator).Data := arr;
  476. end;
  477. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  478. procedure TutlArrayEnumeratorTests.SetUp;
  479. begin
  480. fEnumerator := TIntArrayEnumerator.Create;
  481. end;
  482. initialization
  483. RegisterTest(TutlArrayEnumeratorTests.Suite);
  484. end.