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.

856 linhas
28 KiB

  1. unit uutlLinqTests;
  2. {$mode objfpc}{$H+}
  3. {$IFDEF UTL_NESTED_PROCVARS}
  4. {$modeswitch nestedprocvars}
  5. {$ENDIF}
  6. interface
  7. {$IFDEF UTL_ENUMERATORS}
  8. uses
  9. Classes, SysUtils, TestFramework,
  10. uutlLinq;
  11. type
  12. TutlLinqTests = class(TTestCase)
  13. published
  14. procedure proc_Count;
  15. procedure proc_Any;
  16. procedure proc_Contains;
  17. procedure proc_Contains_WithComparer;
  18. procedure proc_ToArray;
  19. procedure proc_Reverse;
  20. procedure proc_Skip;
  21. procedure proc_Take;
  22. procedure proc_Concat;
  23. procedure proc_Concat_WithArray;
  24. {$IFDEF UTL_ADVANCED_ENUMERATORS}
  25. procedure proc_Sort;
  26. procedure proc_Sort_WithComparer;
  27. procedure proc_Where_WithFilter;
  28. procedure proc_Where_WithNormalCallback;
  29. procedure proc_Where_WithObjectCallback;
  30. {$IFDEF UTL_NESTED_PROCVARS}
  31. procedure proc_Where_WithNestedCallback;
  32. {$ENDIF}
  33. procedure proc_Distinct;
  34. procedure proc_Distinct_WithComparer;
  35. procedure proc_Intersect;
  36. procedure proc_Intersect_WithComparer;
  37. procedure proc_Union;
  38. procedure proc_Union_WithComparer;
  39. procedure proc_Without;
  40. procedure proc_Without_WithComparer;
  41. procedure proc_Select_WithSelector;
  42. procedure proc_Select_WithNormalCallback;
  43. procedure proc_Select_WithObjectCallback;
  44. {$IFDEF UTL_NESTED_PROCVARS}
  45. procedure proc_Select_WithNestedCallback;
  46. {$ENDIF}
  47. procedure proc_SelectMany_WithSelector;
  48. procedure proc_SelectMany_WithNormalCallback;
  49. procedure proc_SelectMany_WithObjectCallback;
  50. {$IFDEF UTL_NESTED_PROCVARS}
  51. procedure proc_SelectMany_WithNestedCallback;
  52. {$ENDIF}
  53. procedure proc_Zip;
  54. {$ENDIF}
  55. end;
  56. {$ENDIF}
  57. implementation
  58. {$IFDEF UTL_ENUMERATORS}
  59. uses
  60. uutlEnumerator, uutlComparer, uutlFilter, uutlTypes, uutlInterfaces;
  61. type
  62. TIntArrEnumerator = specialize TutlArrayEnumerator<Integer>;
  63. TStringArrEnumerator = specialize TutlArrayEnumerator<String>;
  64. TCallbackObject = class(TInterfacedObject,
  65. specialize IutlFilter<Integer>,
  66. specialize IutlSelector<Integer, Single>)
  67. public
  68. function Filter(constref i: Integer): Boolean;
  69. function Select(constref i: Integer): Single;
  70. end;
  71. TSelectManyObject = class(TInterfacedObject,
  72. specialize IutlSelector<Integer, specialize IutlEnumerator<Single>>)
  73. public
  74. function Select(constref i: Integer): specialize IutlEnumerator<Single>;
  75. end;
  76. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. //Helper////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  78. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. function TestFilter(constref i: Integer): Boolean;
  80. begin
  81. result := (i mod 2) = 0;
  82. end;
  83. function TestSelector(constref i: Integer): Single;
  84. begin
  85. result := i / 2.0;
  86. end;
  87. function TestManySelector(constref i: Integer): specialize IutlEnumerator<Single>;
  88. var
  89. data: array of Single;
  90. begin
  91. SetLength(data, 3);
  92. data[0] := 10 * i + 1.5;
  93. data[1] := 10 * i + 5.0;
  94. data[2] := 10 * i + 7.5;
  95. result := specialize TutlArrayEnumerator<Single>.Create(data);
  96. end;
  97. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. function TCallbackObject.Filter(constref i: Integer): Boolean;
  99. begin
  100. result := TestFilter(i);
  101. end;
  102. function TCallbackObject.Select(constref i: Integer): Single;
  103. begin
  104. result := TestSelector(i);
  105. end;
  106. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  107. function TSelectManyObject.Select(constref i: Integer): specialize IutlEnumerator<Single>;
  108. begin
  109. result := TestManySelector(i);
  110. end;
  111. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. function CreateArrayEnumerator(const aSize: Integer; const aStartIndex: Integer = 1): TIntArrEnumerator.IutlEnumerator;
  113. var
  114. arr: array of Integer;
  115. i: Integer;
  116. begin
  117. SetLength(arr, aSize);
  118. for i := low(arr) to high(arr) do
  119. arr[i] := aStartIndex + i;
  120. result := TIntArrEnumerator.Create(arr);
  121. end;
  122. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  123. function CreateArrayEnumerator(const aData: array of Integer): TIntArrEnumerator.IutlEnumerator;
  124. var
  125. arr: array of Integer;
  126. i: Integer;
  127. begin
  128. SetLength(arr, Length(aData));
  129. for i := low(arr) to high(arr) do
  130. arr[i] := aData[i];
  131. result := TIntArrEnumerator.Create(arr);
  132. end;
  133. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  134. function CreateStringEnumerator(const aData: array of String): TStringArrEnumerator.IutlEnumerator;
  135. var
  136. arr: array of String;
  137. i: Integer;
  138. begin
  139. SetLength(arr, Length(aData));
  140. for i := low(arr) to high(arr) do
  141. arr[i] := aData[i];
  142. result := TStringArrEnumerator.Create(arr);
  143. end;
  144. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  145. //TutlLinqTests/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  146. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  147. procedure TutlLinqTests.proc_Count;
  148. var
  149. e: TIntArrEnumerator.IutlEnumerator;
  150. begin
  151. e := CreateArrayEnumerator(10);
  152. AssertEquals(10, specialize utlCount<Integer>(e));
  153. end;
  154. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  155. procedure TutlLinqTests.proc_Any;
  156. begin
  157. AssertFalse(specialize utlAny<Integer>(CreateArrayEnumerator(0)));
  158. AssertTrue (specialize utlAny<Integer>(CreateArrayEnumerator(1)));
  159. AssertTrue (specialize utlAny<Integer>(CreateArrayEnumerator(2)));
  160. AssertTrue (specialize utlAny<Integer>(CreateArrayEnumerator(9)));
  161. end;
  162. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  163. procedure TutlLinqTests.proc_Contains;
  164. begin
  165. AssertFalse(specialize utlContains<Integer>(CreateArrayEnumerator(10), 11));
  166. AssertFalse(specialize utlContains<Integer>(CreateArrayEnumerator(10), -1));
  167. AssertTrue (specialize utlContains<Integer>(CreateArrayEnumerator(10), 4));
  168. AssertTrue (specialize utlContains<Integer>(CreateArrayEnumerator(10), 6));
  169. end;
  170. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  171. procedure TutlLinqTests.proc_Contains_WithComparer;
  172. begin
  173. AssertFalse(specialize utlContains<Integer>(CreateArrayEnumerator(10), 11, specialize TutlEqualityComparer<Integer>.Create));
  174. AssertFalse(specialize utlContains<Integer>(CreateArrayEnumerator(10), -1, specialize TutlEqualityComparer<Integer>.Create));
  175. AssertTrue (specialize utlContains<Integer>(CreateArrayEnumerator(10), 4, specialize TutlEqualityComparer<Integer>.Create));
  176. AssertTrue (specialize utlContains<Integer>(CreateArrayEnumerator(10), 6, specialize TutlEqualityComparer<Integer>.Create));
  177. end;
  178. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  179. procedure TutlLinqTests.proc_ToArray;
  180. var
  181. arr: array of Integer;
  182. begin
  183. arr := specialize utlToArray<Integer>(CreateArrayEnumerator(5));
  184. AssertEquals(5, Length(arr));
  185. AssertEquals(1, arr[0]);
  186. AssertEquals(2, arr[1]);
  187. AssertEquals(3, arr[2]);
  188. AssertEquals(4, arr[3]);
  189. AssertEquals(5, arr[4]);
  190. end;
  191. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  192. procedure TutlLinqTests.proc_Reverse;
  193. var
  194. e: TIntArrEnumerator.IutlEnumerator;
  195. begin
  196. e := specialize utlReverse<Integer>(CreateArrayEnumerator(5));
  197. e.Reset;
  198. AssertTrue (e.MoveNext);
  199. AssertEquals(5, e.Current);
  200. AssertTrue (e.MoveNext);
  201. AssertEquals(4, e.Current);
  202. AssertTrue (e.MoveNext);
  203. AssertEquals(3, e.Current);
  204. AssertTrue (e.MoveNext);
  205. AssertEquals(2, e.Current);
  206. AssertTrue (e.MoveNext);
  207. AssertEquals(1, e.Current);
  208. AssertFalse (e.MoveNext);
  209. end;
  210. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  211. procedure TutlLinqTests.proc_Skip;
  212. var
  213. e: TIntArrEnumerator.IutlEnumerator;
  214. begin
  215. e := specialize utlSkip<Integer>(CreateArrayEnumerator(5), 2);
  216. e.Reset;
  217. AssertTrue (e.MoveNext);
  218. AssertEquals(3, e.Current);
  219. AssertTrue (e.MoveNext);
  220. AssertEquals(4, e.Current);
  221. AssertTrue (e.MoveNext);
  222. AssertEquals(5, e.Current);
  223. AssertFalse (e.MoveNext);
  224. end;
  225. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  226. procedure TutlLinqTests.proc_Take;
  227. var
  228. e: TIntArrEnumerator.IutlEnumerator;
  229. begin
  230. e := specialize utlTake<Integer>(CreateArrayEnumerator(5), 3);
  231. e.Reset;
  232. AssertTrue (e.MoveNext);
  233. AssertEquals(1, e.Current);
  234. AssertTrue (e.MoveNext);
  235. AssertEquals(2, e.Current);
  236. AssertTrue (e.MoveNext);
  237. AssertEquals(3, e.Current);
  238. AssertFalse (e.MoveNext);
  239. end;
  240. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  241. procedure TutlLinqTests.proc_Concat;
  242. var
  243. e: TIntArrEnumerator.IutlEnumerator;
  244. begin
  245. e := specialize utlConcat<Integer>(
  246. CreateArrayEnumerator(2, 1),
  247. CreateArrayEnumerator(2, 3));
  248. e.Reset;
  249. AssertTrue (e.MoveNext);
  250. AssertEquals(1, e.Current);
  251. AssertTrue (e.MoveNext);
  252. AssertEquals(2, e.Current);
  253. AssertTrue (e.MoveNext);
  254. AssertEquals(3, e.Current);
  255. AssertTrue (e.MoveNext);
  256. AssertEquals(4, e.Current);
  257. AssertFalse (e.MoveNext);
  258. end;
  259. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  260. procedure TutlLinqTests.proc_Concat_WithArray;
  261. var
  262. e: TIntArrEnumerator.IutlEnumerator;
  263. begin
  264. e := specialize utlConcat<Integer>(
  265. specialize TutlArray<specialize IutlEnumerator<Integer>>.Create(
  266. CreateArrayEnumerator(2, 1),
  267. CreateArrayEnumerator(2, 3),
  268. CreateArrayEnumerator(2, 5)));
  269. e.Reset;
  270. AssertTrue (e.MoveNext);
  271. AssertEquals(1, e.Current);
  272. AssertTrue (e.MoveNext);
  273. AssertEquals(2, e.Current);
  274. AssertTrue (e.MoveNext);
  275. AssertEquals(3, e.Current);
  276. AssertTrue (e.MoveNext);
  277. AssertEquals(4, e.Current);
  278. AssertTrue (e.MoveNext);
  279. AssertEquals(5, e.Current);
  280. AssertTrue (e.MoveNext);
  281. AssertEquals(6, e.Current);
  282. AssertFalse (e.MoveNext);
  283. end;
  284. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  285. {$IFDEF UTL_ADVANCED_ENUMERATORS}
  286. procedure TutlLinqTests.proc_Sort;
  287. var
  288. e: TIntArrEnumerator.IutlEnumerator;
  289. begin
  290. e := specialize utlSort<Integer>(CreateArrayEnumerator([1, 5, 3, 6, 7, 9, 2]));
  291. e.Reset;
  292. AssertTrue (e.MoveNext);
  293. AssertEquals(1, e.Current);
  294. AssertTrue (e.MoveNext);
  295. AssertEquals(2, e.Current);
  296. AssertTrue (e.MoveNext);
  297. AssertEquals(3, e.Current);
  298. AssertTrue (e.MoveNext);
  299. AssertEquals(5, e.Current);
  300. AssertTrue (e.MoveNext);
  301. AssertEquals(6, e.Current);
  302. AssertTrue (e.MoveNext);
  303. AssertEquals(7, e.Current);
  304. AssertTrue (e.MoveNext);
  305. AssertEquals(9, e.Current);
  306. AssertFalse (e.MoveNext);
  307. end;
  308. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  309. procedure TutlLinqTests.proc_Sort_WithComparer;
  310. var
  311. e: TIntArrEnumerator.IutlEnumerator;
  312. begin
  313. e := specialize utlSort<Integer>(CreateArrayEnumerator([1, 5, 3, 6, 7, 9, 2]), specialize TutlComparer<Integer>.Create);
  314. e.Reset;
  315. AssertTrue (e.MoveNext);
  316. AssertEquals(1, e.Current);
  317. AssertTrue (e.MoveNext);
  318. AssertEquals(2, e.Current);
  319. AssertTrue (e.MoveNext);
  320. AssertEquals(3, e.Current);
  321. AssertTrue (e.MoveNext);
  322. AssertEquals(5, e.Current);
  323. AssertTrue (e.MoveNext);
  324. AssertEquals(6, e.Current);
  325. AssertTrue (e.MoveNext);
  326. AssertEquals(7, e.Current);
  327. AssertTrue (e.MoveNext);
  328. AssertEquals(9, e.Current);
  329. AssertFalse (e.MoveNext);
  330. end;
  331. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  332. procedure TutlLinqTests.proc_Where_WithFilter;
  333. var
  334. e: TIntArrEnumerator.IutlEnumerator;
  335. begin
  336. e := specialize utlWhere<Integer>(CreateArrayEnumerator(5), TCallbackObject.Create);
  337. e.Reset;
  338. AssertTrue (e.MoveNext);
  339. AssertEquals(2, e.Current);
  340. AssertTrue (e.MoveNext);
  341. AssertEquals(4, e.Current);
  342. AssertFalse (e.MoveNext);
  343. end;
  344. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  345. procedure TutlLinqTests.proc_Where_WithNormalCallback;
  346. var
  347. e: TIntArrEnumerator.IutlEnumerator;
  348. begin
  349. e := specialize utlWhere<Integer>(CreateArrayEnumerator(5), @TestFilter);
  350. e.Reset;
  351. AssertTrue (e.MoveNext);
  352. AssertEquals(2, e.Current);
  353. AssertTrue (e.MoveNext);
  354. AssertEquals(4, e.Current);
  355. AssertFalse (e.MoveNext);
  356. end;
  357. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  358. procedure TutlLinqTests.proc_Where_WithObjectCallback;
  359. var
  360. e: TIntArrEnumerator.IutlEnumerator;
  361. o: TCallbackObject;
  362. begin
  363. o := TCallbackObject.Create;
  364. try
  365. e := specialize utlWhere<Integer>(CreateArrayEnumerator(5), @o.Filter);
  366. e.Reset;
  367. AssertTrue (e.MoveNext);
  368. AssertEquals(2, e.Current);
  369. AssertTrue (e.MoveNext);
  370. AssertEquals(4, e.Current);
  371. AssertFalse (e.MoveNext);
  372. finally
  373. FreeAndNil(o);
  374. end;
  375. end;
  376. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  377. {$IFDEF UTL_NESTED_PROCVARS}
  378. procedure TutlLinqTests.proc_Where_WithNestedCallback;
  379. function IsEventNested(constref i: Integer): Boolean;
  380. begin
  381. result := (i mod 2) = 0;
  382. end;
  383. var
  384. e: TIntArrEnumerator.IutlEnumerator;
  385. begin
  386. e := specialize utlWhere<Integer>(CreateArrayEnumerator(5), @IsEventNested);
  387. e.Reset;
  388. AssertTrue (e.MoveNext);
  389. AssertEquals(2, e.Current);
  390. AssertTrue (e.MoveNext);
  391. AssertEquals(4, e.Current);
  392. AssertFalse (e.MoveNext);
  393. end;
  394. {$ENDIF}
  395. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  396. procedure TutlLinqTests.proc_Distinct;
  397. var
  398. e: TIntArrEnumerator.IutlEnumerator;
  399. begin
  400. e := specialize utlDistinct<Integer>(CreateArrayEnumerator([1, 4, 3, 6, 1, 3, 4, 7 ]));
  401. e.Reset;
  402. AssertTrue (e.MoveNext);
  403. AssertEquals(1, e.Current);
  404. AssertTrue (e.MoveNext);
  405. AssertEquals(4, e.Current);
  406. AssertTrue (e.MoveNext);
  407. AssertEquals(3, e.Current);
  408. AssertTrue (e.MoveNext);
  409. AssertEquals(6, e.Current);
  410. AssertTrue (e.MoveNext);
  411. AssertEquals(7, e.Current);
  412. AssertFalse (e.MoveNext);
  413. end;
  414. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  415. procedure TutlLinqTests.proc_Distinct_WithComparer;
  416. var
  417. e: TIntArrEnumerator.IutlEnumerator;
  418. begin
  419. e := specialize utlDistinct<Integer>(CreateArrayEnumerator([1, 4, 3, 6, 1, 3, 4, 7 ]), specialize TutlComparer<Integer>.Create);
  420. e.Reset;
  421. AssertTrue (e.MoveNext);
  422. AssertEquals(1, e.Current);
  423. AssertTrue (e.MoveNext);
  424. AssertEquals(4, e.Current);
  425. AssertTrue (e.MoveNext);
  426. AssertEquals(3, e.Current);
  427. AssertTrue (e.MoveNext);
  428. AssertEquals(6, e.Current);
  429. AssertTrue (e.MoveNext);
  430. AssertEquals(7, e.Current);
  431. AssertFalse (e.MoveNext);
  432. end;
  433. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  434. procedure TutlLinqTests.proc_Intersect;
  435. var
  436. e: TIntArrEnumerator.IutlEnumerator;
  437. begin
  438. e := specialize utlIntersect<Integer>(
  439. CreateArrayEnumerator([ 1, 2, 3, 4, 5, 6, 7 ]),
  440. CreateArrayEnumerator([ 3, 5, 4, 3 ]));
  441. e.Reset;
  442. AssertTrue (e.MoveNext);
  443. AssertEquals(3, e.Current);
  444. AssertTrue (e.MoveNext);
  445. AssertEquals(4, e.Current);
  446. AssertTrue (e.MoveNext);
  447. AssertEquals(5, e.Current);
  448. AssertFalse (e.MoveNext);
  449. end;
  450. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  451. procedure TutlLinqTests.proc_Intersect_WithComparer;
  452. var
  453. e: TIntArrEnumerator.IutlEnumerator;
  454. begin
  455. e := specialize utlIntersect<Integer>(
  456. CreateArrayEnumerator([ 1, 2, 3, 4, 5, 6, 7 ]),
  457. CreateArrayEnumerator([ 3, 5, 4, 3 ]),
  458. specialize TutlComparer<Integer>.Create);
  459. e.Reset;
  460. AssertTrue (e.MoveNext);
  461. AssertEquals(3, e.Current);
  462. AssertTrue (e.MoveNext);
  463. AssertEquals(4, e.Current);
  464. AssertTrue (e.MoveNext);
  465. AssertEquals(5, e.Current);
  466. AssertFalse (e.MoveNext);
  467. end;
  468. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  469. procedure TutlLinqTests.proc_Union;
  470. var
  471. e: TIntArrEnumerator.IutlEnumerator;
  472. begin
  473. e := specialize utlUnion<Integer>(
  474. CreateArrayEnumerator([ 2, 4, 5, 7 ]),
  475. CreateArrayEnumerator([ 3, 5, 4, 3, 8 ]));
  476. e.Reset;
  477. AssertTrue (e.MoveNext);
  478. AssertEquals(2, e.Current);
  479. AssertTrue (e.MoveNext);
  480. AssertEquals(4, e.Current);
  481. AssertTrue (e.MoveNext);
  482. AssertEquals(5, e.Current);
  483. AssertTrue (e.MoveNext);
  484. AssertEquals(7, e.Current);
  485. AssertTrue (e.MoveNext);
  486. AssertEquals(3, e.Current);
  487. AssertTrue (e.MoveNext);
  488. AssertEquals(8, e.Current);
  489. AssertFalse (e.MoveNext);
  490. end;
  491. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  492. procedure TutlLinqTests.proc_Union_WithComparer;
  493. var
  494. e: TIntArrEnumerator.IutlEnumerator;
  495. begin
  496. e := specialize utlUnion<Integer>(
  497. CreateArrayEnumerator([ 2, 4, 5, 7 ]),
  498. CreateArrayEnumerator([ 3, 5, 4, 3, 8 ]),
  499. specialize TutlComparer<Integer>.Create);
  500. e.Reset;
  501. AssertTrue (e.MoveNext);
  502. AssertEquals(2, e.Current);
  503. AssertTrue (e.MoveNext);
  504. AssertEquals(4, e.Current);
  505. AssertTrue (e.MoveNext);
  506. AssertEquals(5, e.Current);
  507. AssertTrue (e.MoveNext);
  508. AssertEquals(7, e.Current);
  509. AssertTrue (e.MoveNext);
  510. AssertEquals(3, e.Current);
  511. AssertTrue (e.MoveNext);
  512. AssertEquals(8, e.Current);
  513. AssertFalse (e.MoveNext);
  514. end;
  515. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  516. procedure TutlLinqTests.proc_Without;
  517. var
  518. e: TIntArrEnumerator.IutlEnumerator;
  519. begin
  520. e := specialize utlWithout<Integer>(
  521. CreateArrayEnumerator([ 1, 2, 3, 4, 5, 6, 7 ]),
  522. CreateArrayEnumerator([ 3, 5, 4, 3 ]),
  523. specialize TutlComparer<Integer>.Create);
  524. e.Reset;
  525. AssertTrue (e.MoveNext);
  526. AssertEquals(1, e.Current);
  527. AssertTrue (e.MoveNext);
  528. AssertEquals(2, e.Current);
  529. AssertTrue (e.MoveNext);
  530. AssertEquals(6, e.Current);
  531. AssertTrue (e.MoveNext);
  532. AssertEquals(7, e.Current);
  533. AssertFalse (e.MoveNext);
  534. end;
  535. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  536. procedure TutlLinqTests.proc_Without_WithComparer;
  537. var
  538. e: TIntArrEnumerator.IutlEnumerator;
  539. begin
  540. e := specialize utlWithout<Integer>(
  541. CreateArrayEnumerator([ 1, 2, 3, 4, 5, 6, 7 ]),
  542. CreateArrayEnumerator([ 3, 5, 4, 3 ]));
  543. e.Reset;
  544. AssertTrue (e.MoveNext);
  545. AssertEquals(1, e.Current);
  546. AssertTrue (e.MoveNext);
  547. AssertEquals(2, e.Current);
  548. AssertTrue (e.MoveNext);
  549. AssertEquals(6, e.Current);
  550. AssertTrue (e.MoveNext);
  551. AssertEquals(7, e.Current);
  552. AssertFalse (e.MoveNext);
  553. end;
  554. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  555. procedure TutlLinqTests.proc_Select_WithSelector;
  556. var
  557. e: specialize IutlEnumerator<Single>;
  558. begin
  559. e := specialize utlSelect<Integer, Single>(
  560. CreateArrayEnumerator(4),
  561. TCallbackObject.Create);
  562. e.Reset;
  563. AssertTrue (e.MoveNext);
  564. AssertEquals(0.5, e.Current);
  565. AssertTrue (e.MoveNext);
  566. AssertEquals(1.0, e.Current);
  567. AssertTrue (e.MoveNext);
  568. AssertEquals(1.5, e.Current);
  569. AssertTrue (e.MoveNext);
  570. AssertEquals(2.0, e.Current);
  571. AssertFalse (e.MoveNext);
  572. end;
  573. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  574. procedure TutlLinqTests.proc_Select_WithNormalCallback;
  575. var
  576. e: specialize IutlEnumerator<Single>;
  577. begin
  578. e := specialize utlSelect<Integer, Single>(
  579. CreateArrayEnumerator(4),
  580. @TestSelector);
  581. e.Reset;
  582. AssertTrue (e.MoveNext);
  583. AssertEquals(0.5, e.Current);
  584. AssertTrue (e.MoveNext);
  585. AssertEquals(1.0, e.Current);
  586. AssertTrue (e.MoveNext);
  587. AssertEquals(1.5, e.Current);
  588. AssertTrue (e.MoveNext);
  589. AssertEquals(2.0, e.Current);
  590. AssertFalse (e.MoveNext);
  591. end;
  592. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  593. procedure TutlLinqTests.proc_Select_WithObjectCallback;
  594. var
  595. o: TCallbackObject;
  596. e: specialize IutlEnumerator<Single>;
  597. begin
  598. o := TCallbackObject.Create;
  599. try
  600. e := specialize utlSelect<Integer, Single>(
  601. CreateArrayEnumerator(4),
  602. @o.Select);
  603. e.Reset;
  604. AssertTrue (e.MoveNext);
  605. AssertEquals(0.5, e.Current);
  606. AssertTrue (e.MoveNext);
  607. AssertEquals(1.0, e.Current);
  608. AssertTrue (e.MoveNext);
  609. AssertEquals(1.5, e.Current);
  610. AssertTrue (e.MoveNext);
  611. AssertEquals(2.0, e.Current);
  612. AssertFalse (e.MoveNext);
  613. finally
  614. FreeAndNil(o);
  615. end;
  616. end;
  617. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  618. {$IFDEF UTL_NESTED_PROCVARS}
  619. procedure TutlLinqTests.proc_Select_WithNestedCallback;
  620. function TestSelectorNested(constref i: Integer): Single;
  621. begin
  622. result := i / 2.0;
  623. end;
  624. var
  625. e: specialize IutlEnumerator<Single>;
  626. begin
  627. e := specialize utlSelect<Integer, Single>(
  628. CreateArrayEnumerator(4),
  629. @TestSelectorNested);
  630. e.Reset;
  631. AssertTrue (e.MoveNext);
  632. AssertEquals(0.5, e.Current);
  633. AssertTrue (e.MoveNext);
  634. AssertEquals(1.0, e.Current);
  635. AssertTrue (e.MoveNext);
  636. AssertEquals(1.5, e.Current);
  637. AssertTrue (e.MoveNext);
  638. AssertEquals(2.0, e.Current);
  639. AssertFalse (e.MoveNext);
  640. end;
  641. {$ENDIF}
  642. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  643. procedure TutlLinqTests.proc_SelectMany_WithSelector;
  644. var
  645. e: specialize IutlEnumerator<Single>;
  646. begin
  647. e := specialize utlSelectMany<Integer, Single>(
  648. CreateArrayEnumerator(3),
  649. TSelectManyObject.Create);
  650. e.Reset;
  651. AssertTrue (e.MoveNext);
  652. AssertEquals(11.5, e.Current);
  653. AssertTrue (e.MoveNext);
  654. AssertEquals(15.0, e.Current);
  655. AssertTrue (e.MoveNext);
  656. AssertEquals(17.5, e.Current);
  657. AssertTrue (e.MoveNext);
  658. AssertEquals(21.5, e.Current);
  659. AssertTrue (e.MoveNext);
  660. AssertEquals(25.0, e.Current);
  661. AssertTrue (e.MoveNext);
  662. AssertEquals(27.5, e.Current);
  663. AssertTrue (e.MoveNext);
  664. AssertEquals(31.5, e.Current);
  665. AssertTrue (e.MoveNext);
  666. AssertEquals(35.0, e.Current);
  667. AssertTrue (e.MoveNext);
  668. AssertEquals(37.5, e.Current);
  669. AssertFalse (e.MoveNext);
  670. end;
  671. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  672. procedure TutlLinqTests.proc_SelectMany_WithNormalCallback;
  673. var
  674. e: specialize IutlEnumerator<Single>;
  675. begin
  676. e := specialize utlSelectMany<Integer, Single>(
  677. CreateArrayEnumerator(3),
  678. @TestManySelector);
  679. e.Reset;
  680. AssertTrue (e.MoveNext);
  681. AssertEquals(11.5, e.Current);
  682. AssertTrue (e.MoveNext);
  683. AssertEquals(15.0, e.Current);
  684. AssertTrue (e.MoveNext);
  685. AssertEquals(17.5, e.Current);
  686. AssertTrue (e.MoveNext);
  687. AssertEquals(21.5, e.Current);
  688. AssertTrue (e.MoveNext);
  689. AssertEquals(25.0, e.Current);
  690. AssertTrue (e.MoveNext);
  691. AssertEquals(27.5, e.Current);
  692. AssertTrue (e.MoveNext);
  693. AssertEquals(31.5, e.Current);
  694. AssertTrue (e.MoveNext);
  695. AssertEquals(35.0, e.Current);
  696. AssertTrue (e.MoveNext);
  697. AssertEquals(37.5, e.Current);
  698. AssertFalse (e.MoveNext);
  699. end;
  700. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  701. procedure TutlLinqTests.proc_SelectMany_WithObjectCallback;
  702. var
  703. o: TSelectManyObject;
  704. e: specialize IutlEnumerator<Single>;
  705. begin
  706. o := TSelectManyObject.Create;
  707. try
  708. e := specialize utlSelectMany<Integer, Single>(
  709. CreateArrayEnumerator(3),
  710. @o.Select);
  711. e.Reset;
  712. AssertTrue (e.MoveNext);
  713. AssertEquals(11.5, e.Current);
  714. AssertTrue (e.MoveNext);
  715. AssertEquals(15.0, e.Current);
  716. AssertTrue (e.MoveNext);
  717. AssertEquals(17.5, e.Current);
  718. AssertTrue (e.MoveNext);
  719. AssertEquals(21.5, e.Current);
  720. AssertTrue (e.MoveNext);
  721. AssertEquals(25.0, e.Current);
  722. AssertTrue (e.MoveNext);
  723. AssertEquals(27.5, e.Current);
  724. AssertTrue (e.MoveNext);
  725. AssertEquals(31.5, e.Current);
  726. AssertTrue (e.MoveNext);
  727. AssertEquals(35.0, e.Current);
  728. AssertTrue (e.MoveNext);
  729. AssertEquals(37.5, e.Current);
  730. AssertFalse (e.MoveNext);
  731. finally
  732. FreeAndNil(o);
  733. end;
  734. end;
  735. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  736. {$IFDEF UTL_NESTED_PROCVARS}
  737. procedure TutlLinqTests.proc_SelectMany_WithNestedCallback;
  738. function TestManySelectorNested(constref i: Integer): specialize IutlEnumerator<Single>;
  739. begin
  740. result := TestManySelector(i);
  741. end;
  742. var
  743. e: specialize IutlEnumerator<Single>;
  744. begin
  745. e := specialize utlSelectMany<Integer, Single>(
  746. CreateArrayEnumerator(3),
  747. @TestManySelectorNested);
  748. e.Reset;
  749. AssertTrue (e.MoveNext);
  750. AssertEquals(11.5, e.Current);
  751. AssertTrue (e.MoveNext);
  752. AssertEquals(15.0, e.Current);
  753. AssertTrue (e.MoveNext);
  754. AssertEquals(17.5, e.Current);
  755. AssertTrue (e.MoveNext);
  756. AssertEquals(21.5, e.Current);
  757. AssertTrue (e.MoveNext);
  758. AssertEquals(25.0, e.Current);
  759. AssertTrue (e.MoveNext);
  760. AssertEquals(27.5, e.Current);
  761. AssertTrue (e.MoveNext);
  762. AssertEquals(31.5, e.Current);
  763. AssertTrue (e.MoveNext);
  764. AssertEquals(35.0, e.Current);
  765. AssertTrue (e.MoveNext);
  766. AssertEquals(37.5, e.Current);
  767. AssertFalse (e.MoveNext);
  768. end;
  769. {$ENDIF}
  770. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  771. procedure TutlLinqTests.proc_Zip;
  772. var
  773. e: specialize IutlEnumerator<specialize TutlPair<Integer, String>>;
  774. begin
  775. e := specialize utlZip<Integer, String>(
  776. CreateArrayEnumerator([ 1, 4, 6, 9 ]),
  777. CreateStringEnumerator([ 'fuu', 'bar', 'baz' ]));
  778. e.Reset;
  779. AssertTrue (e.MoveNext);
  780. AssertEquals(1, e.Current.First);
  781. AssertEquals('fuu', e.Current.Second);
  782. AssertTrue (e.MoveNext);
  783. AssertEquals(4, e.Current.First);
  784. AssertEquals('bar', e.Current.Second);
  785. AssertTrue (e.MoveNext);
  786. AssertEquals(6, e.Current.First);
  787. AssertEquals('baz', e.Current.Second);
  788. AssertFalse (e.MoveNext);
  789. end;
  790. {$ENDIF}
  791. initialization
  792. RegisterTest(TutlLinqTests.Suite);
  793. {$ENDIF}
  794. end.