Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

711 рядки
22 KiB

  1. unit uGenericsTests;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testregistry,
  6. uutlGenerics;
  7. type
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TTestObject = class
  10. private
  11. fData: Integer;
  12. fOnDestroy: TNotifyEvent;
  13. public
  14. property Data: Integer read fData;
  15. constructor Create(const aData: Integer; const aOnDestroy: TNotifyEvent);
  16. destructor Destroy; override;
  17. end;
  18. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  19. TutlListTest = class(TTestCase)
  20. private type
  21. TTestList = specialize TutlList<TTestObject>;
  22. private
  23. fList: TTestList;
  24. fTestObjs: array[0..9] of TTestObject;
  25. procedure TestObjectDestroy(aSender: TObject);
  26. protected
  27. procedure SetUp; override;
  28. procedure TearDown; override;
  29. published
  30. procedure GetItem;
  31. procedure SetItem;
  32. procedure Add;
  33. procedure Insert;
  34. procedure IndexOf;
  35. procedure Exchange;
  36. procedure Move;
  37. procedure Delete;
  38. procedure Extract;
  39. procedure Remove;
  40. procedure Clear;
  41. procedure First;
  42. procedure PushFirst;
  43. procedure PopFirst;
  44. procedure Last;
  45. procedure PushLast;
  46. procedure PopLast;
  47. end;
  48. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. TutlHashSetTest = class(TTestCase)
  50. private type
  51. TTestObjComparer = specialize TutlEventComparer<TTestObject>;
  52. TTestHashSet = specialize TutlCustomHashSet<TTestObject>;
  53. private
  54. fHashSet: TTestHashSet;
  55. fTestObjs: array[0..9] of TTestObject;
  56. procedure TestObjectDestroy(aSender: TObject);
  57. protected
  58. procedure SetUp; override;
  59. procedure TearDown; override;
  60. public
  61. function CompareTestObjects(const i1, i2: TTestObject): Integer;
  62. published
  63. procedure Add;
  64. procedure Contains;
  65. procedure IndexOf;
  66. procedure Remove;
  67. procedure Delete;
  68. end;
  69. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70. TutlMapTest = class(TTestCase)
  71. private type
  72. TTestMap = specialize TutlMap<Integer, TTestObject>;
  73. private
  74. fMap: TTestMap;
  75. fTestObjs: array[0..9] of TTestObject;
  76. fLastRemovedIndex: Integer;
  77. procedure TestObjectDestroy(aSender: TObject);
  78. function Key(const aIndex: Integer): Integer;
  79. function CreateObj: TTestObject;
  80. protected
  81. procedure SetUp; override;
  82. procedure TearDown; override;
  83. procedure AddExistingKey;
  84. published
  85. procedure GetValue;
  86. procedure SetValue;
  87. procedure GetValueAt;
  88. procedure SetValueAt;
  89. procedure GetKey;
  90. procedure Add;
  91. procedure IndexOf;
  92. procedure Delete;
  93. end;
  94. implementation
  95. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. //TTestObject///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  97. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. constructor TTestObject.Create(const aData: Integer; const aOnDestroy: TNotifyEvent);
  99. begin
  100. inherited Create;
  101. fData := aData;
  102. fOnDestroy := aOnDestroy;
  103. end;
  104. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  105. destructor TTestObject.Destroy;
  106. begin
  107. if Assigned(fOnDestroy) then
  108. fOnDestroy(self);
  109. inherited Destroy;
  110. end;
  111. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. //TutlListTest//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  113. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  114. procedure TutlListTest.TestObjectDestroy(aSender: TObject);
  115. var
  116. i: Integer;
  117. begin
  118. for i := Low(fTestObjs) to High(fTestObjs) do
  119. if (fTestObjs[i] = aSender) then
  120. fTestObjs[i] := nil;
  121. end;
  122. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  123. procedure TutlListTest.SetUp;
  124. var
  125. i: Integer;
  126. begin
  127. inherited SetUp;
  128. fList := TTestList.Create(true);
  129. for i := Low(fTestObjs) to High(fTestObjs) do begin
  130. fTestObjs[i] := TTestObject.Create(i, @TestObjectDestroy);
  131. fList.Add(fTestObjs[i]);
  132. end;
  133. end;
  134. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  135. procedure TutlListTest.TearDown;
  136. begin
  137. FreeAndNil(fList);
  138. inherited TearDown;
  139. end;
  140. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  141. procedure TutlListTest.GetItem;
  142. var
  143. i: Integer;
  144. begin
  145. for i := Low(fTestObjs) to High(fTestObjs) do
  146. AssertTrue(fTestObjs[i] = fList[i - Low(fTestObjs)]);
  147. end;
  148. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  149. procedure TutlListTest.SetItem;
  150. var
  151. o1, o2: TTestObject;
  152. begin
  153. o1 := fList[3];
  154. o2 := fList[6];
  155. fList[3] := o2;
  156. fList[6] := o1;
  157. AssertTrue(fList[6] = o1);
  158. AssertTrue(fList[3] = o2);
  159. end;
  160. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  161. procedure TutlListTest.Add;
  162. var
  163. t: TTestObject;
  164. c: Integer;
  165. begin
  166. t := TTestObject.Create(123456, @TestObjectDestroy);
  167. c := fList.Count;
  168. fList.Add(t);
  169. AssertEquals(c+1, fList.Count);
  170. AssertTrue(fList[c] = t);
  171. AssertTrue(fList.Last = t);
  172. end;
  173. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  174. procedure TutlListTest.Insert;
  175. var
  176. t: TTestObject;
  177. c: Integer;
  178. begin
  179. t := TTestObject.Create(123456, @TestObjectDestroy);
  180. c := fList.Count;
  181. fList.Insert(3, t);
  182. AssertEquals(c+1, fList.Count);
  183. AssertTrue(fList[3] = t);
  184. end;
  185. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  186. procedure TutlListTest.IndexOf;
  187. var
  188. i: Integer;
  189. begin
  190. for i := Low(fTestObjs) to High(fTestObjs) do
  191. AssertEquals(i - Low(fTestObjs), fList.IndexOf(fTestObjs[i]));
  192. end;
  193. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  194. procedure TutlListTest.Exchange;
  195. var
  196. o1, o2: TTestObject;
  197. begin
  198. o1 := fList[3];
  199. o2 := fList[7];
  200. fList.Exchange(3, 7);
  201. AssertTrue(fList[3] = o2);
  202. AssertTrue(fList[7] = o1);
  203. end;
  204. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  205. procedure TutlListTest.Move;
  206. begin
  207. fList.Move(3, 6);
  208. AssertTrue(fList[3] = fTestObjs[4]);
  209. AssertTrue(fList[4] = fTestObjs[5]);
  210. AssertTrue(fList[5] = fTestObjs[6]);
  211. AssertTrue(fList[6] = fTestObjs[3]);
  212. end;
  213. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  214. procedure TutlListTest.Delete;
  215. begin
  216. fList.Delete(3);
  217. AssertTrue(fTestObjs[3] = nil);
  218. AssertEquals(Length(fTestObjs)-1, fList.Count);
  219. fList.OwnsObjects := false;
  220. fList.Delete(4);
  221. AssertTrue(fTestObjs[5] <> nil);
  222. AssertEquals(Length(fTestObjs)-2, fList.Count);
  223. AssertTrue(fList[4] = fTestObjs[6]);
  224. FreeAndNil(fTestObjs[5]);
  225. fList.OwnsObjects := true;
  226. end;
  227. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  228. procedure TutlListTest.Extract;
  229. var
  230. o1, o2, o3: TTestObject;
  231. begin
  232. o1 := fList[1];
  233. o2 := TTestObject.Create(1234, @TestObjectDestroy);
  234. o3 := fList.Extract(o1, o2);
  235. try
  236. AssertTrue(o1 = o3);
  237. AssertEquals(Length(fTestObjs)-1, fList.Count);
  238. AssertTrue(fTestObjs[1] <> nil);
  239. finally
  240. FreeAndNil(o1);
  241. FreeAndNil(o2);
  242. end;
  243. o1 := fList[1];
  244. o2 := TTestObject.Create(1234, @TestObjectDestroy);
  245. o3 := fList.Extract(o2, o1);
  246. try
  247. AssertTrue(o1 = o3);
  248. AssertEquals(Length(fTestObjs)-1, fList.Count);
  249. finally
  250. FreeAndNil(o2);
  251. end;
  252. end;
  253. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  254. procedure TutlListTest.Remove;
  255. var
  256. o1: TTestObject;
  257. i: Integer;
  258. begin
  259. o1 := fList[3];
  260. i := fList.Remove(o1);
  261. AssertEquals(3, i);
  262. AssertEquals(Length(fTestObjs)-1, fList.Count);
  263. AssertTrue(fTestObjs[3] = nil);
  264. end;
  265. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  266. procedure TutlListTest.Clear;
  267. var
  268. o: TTestObject;
  269. begin
  270. fList.Clear;
  271. AssertEquals(0, fList.Count);
  272. for o in fTestObjs do
  273. AssertTrue(o = nil);
  274. end;
  275. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  276. procedure TutlListTest.First;
  277. begin
  278. AssertTrue(fTestObjs[Low(fTestObjs)] = fList.First);
  279. end;
  280. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  281. procedure TutlListTest.PushFirst;
  282. var
  283. o1: TTestObject;
  284. begin
  285. o1 := TTestObject.Create(1234, @TestObjectDestroy);
  286. fList.PushFirst(o1);
  287. AssertEquals(Length(fTestObjs)+1, fList.Count);
  288. AssertTrue(fList.First = o1);
  289. end;
  290. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  291. procedure TutlListTest.PopFirst;
  292. var
  293. o1: TTestObject;
  294. begin
  295. o1 := fList.PopFirst;
  296. AssertEquals(Length(fTestObjs)-1, fList.Count);
  297. AssertTrue(o1 = fTestObjs[0]);
  298. FreeAndNil(o1);
  299. o1 := fList.PopFirst(true);
  300. AssertEquals(Length(fTestObjs)-2, fList.Count);
  301. AssertTrue(o1 = nil);
  302. AssertTrue(fTestObjs[1] = nil);
  303. end;
  304. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  305. procedure TutlListTest.Last;
  306. begin
  307. AssertTrue(fTestObjs[High(fTestObjs)] = fList.Last);
  308. end;
  309. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  310. procedure TutlListTest.PushLast;
  311. var
  312. o1: TTestObject;
  313. begin
  314. o1 := TTestObject.Create(1234, @TestObjectDestroy);
  315. fList.PushLast(o1);
  316. AssertEquals(Length(fTestObjs)+1, fList.Count);
  317. AssertTrue(fList.Last = o1);
  318. end;
  319. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  320. procedure TutlListTest.PopLast;
  321. var
  322. o1: TTestObject;
  323. begin
  324. o1 := fList.PopLast;
  325. AssertEquals(Length(fTestObjs)-1, fList.Count);
  326. AssertTrue(o1 = fTestObjs[High(fTestObjs)]);
  327. FreeAndNil(o1);
  328. o1 := fList.PopLast(true);
  329. AssertEquals(Length(fTestObjs)-2, fList.Count);
  330. AssertTrue(o1 = nil);
  331. AssertTrue(fTestObjs[High(fTestObjs)-1] = nil);
  332. end;
  333. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  334. //TutlHashSetTest///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  335. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  336. procedure TutlHashSetTest.TestObjectDestroy(aSender: TObject);
  337. var
  338. i: Integer;
  339. begin
  340. for i := Low(fTestObjs) to High(fTestObjs) do
  341. if (fTestObjs[i] = aSender) then
  342. fTestObjs[i] := nil;
  343. end;
  344. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  345. procedure TutlHashSetTest.SetUp;
  346. var
  347. i: Integer;
  348. begin
  349. inherited SetUp;
  350. fHashSet := TTestHashSet.Create(TTestObjComparer.Create(@CompareTestObjects), true);
  351. for i := Low(fTestObjs) to High(fTestObjs) do begin
  352. fTestObjs[i] := TTestObject.Create(i, @TestObjectDestroy);
  353. fHashSet.Add(fTestObjs[i]);
  354. end;
  355. end;
  356. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  357. procedure TutlHashSetTest.TearDown;
  358. begin
  359. FreeAndNil(fHashSet);
  360. inherited TearDown;
  361. end;
  362. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  363. function TutlHashSetTest.CompareTestObjects(const i1, i2: TTestObject): Integer;
  364. begin
  365. if (i1.Data < i2.Data) then
  366. result := -1
  367. else if (i1.Data > i2.Data) then
  368. result := 1
  369. else
  370. result := 0;
  371. end;
  372. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  373. procedure TutlHashSetTest.Add;
  374. var
  375. o1: TTestObject;
  376. b: Boolean;
  377. begin
  378. o1 := TTestObject.Create(1234, @TestObjectDestroy);
  379. b := fHashSet.Add(o1);
  380. AssertTrue(b);
  381. AssertEquals(Length(fTestObjs)+1, fHashSet.Count);
  382. b := fHashSet.Add(o1);
  383. AssertFalse(b);
  384. AssertEquals(Length(fTestObjs)+1, fHashSet.Count);
  385. end;
  386. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  387. procedure TutlHashSetTest.Contains;
  388. var
  389. o1: TTestObject;
  390. b: Boolean;
  391. begin
  392. o1 := TTestObject.Create(1234, @TestObjectDestroy);
  393. try
  394. b := fHashSet.Contains(fTestObjs[0]);
  395. AssertTrue(b);
  396. b := fHashSet.Contains(o1);
  397. AssertFalse(b);
  398. finally
  399. FreeAndNil(o1);
  400. end;
  401. end;
  402. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  403. procedure TutlHashSetTest.IndexOf;
  404. var
  405. o1: TTestObject;
  406. i: Integer;
  407. begin
  408. o1 := TTestObject.Create(1234, @TestObjectDestroy);
  409. try
  410. i := fHashSet.IndexOf(fTestObjs[4]);
  411. AssertEquals(4, i);
  412. i := fHashSet.IndexOf(o1);
  413. AssertEquals(-1, i);
  414. finally
  415. FreeAndNil(o1);
  416. end;
  417. end;
  418. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  419. procedure TutlHashSetTest.Remove;
  420. var
  421. b: Boolean;
  422. begin
  423. b := fHashSet.Remove(fTestObjs[5]);
  424. AssertTrue(fTestObjs[5] = nil);
  425. AssertTrue(b);
  426. AssertEquals(Length(fTestObjs)-1, fHashSet.Count);
  427. fHashSet.OwnsObjects := false;
  428. try
  429. b := fHashSet.Remove(fTestObjs[0]);
  430. AssertTrue(fTestObjs[0] <> nil);
  431. AssertEquals(Length(fTestObjs)-2, fHashSet.Count);
  432. AssertTrue(b);
  433. b := fHashSet.Remove(fTestObjs[0]);
  434. AssertFalse(b);
  435. AssertEquals(Length(fTestObjs)-2, fHashSet.Count);
  436. finally
  437. FreeAndNil(fTestObjs[0]);
  438. fHashSet.OwnsObjects := true;
  439. end;
  440. end;
  441. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  442. procedure TutlHashSetTest.Delete;
  443. begin
  444. fHashSet.Delete(0);
  445. AssertEquals(Length(fTestObjs)-1, fHashSet.Count);
  446. AssertTrue(fTestObjs[0] = nil);
  447. end;
  448. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  449. //TutlMapTest///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  450. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  451. procedure TutlMapTest.TestObjectDestroy(aSender: TObject);
  452. var
  453. i: Integer;
  454. begin
  455. for i := Low(fTestObjs) to High(fTestObjs) do
  456. if (fTestObjs[i] = aSender) then begin
  457. fLastRemovedIndex := i;
  458. fTestObjs[i] := nil;
  459. exit;
  460. end;
  461. end;
  462. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  463. function TutlMapTest.Key(const aIndex: Integer): Integer;
  464. begin
  465. result := fTestObjs[aIndex].Data;
  466. end;
  467. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  468. function TutlMapTest.CreateObj: TTestObject;
  469. var
  470. k: Integer;
  471. begin
  472. repeat
  473. k := random(10000);
  474. until not fMap.Contains(k);
  475. result := TTestObject.Create(k, @TestObjectDestroy);
  476. end;
  477. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  478. procedure TutlMapTest.SetUp;
  479. var
  480. i: Integer;
  481. o: TTestObject;
  482. begin
  483. inherited SetUp;
  484. fMap := TTestMap.Create(true);
  485. Randomize;
  486. for i := Low(fTestObjs) to High(fTestObjs) do begin
  487. o := CreateObj;
  488. fTestObjs[i] := o;
  489. fMap.Add(o.Data, o);
  490. end;
  491. end;
  492. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  493. procedure TutlMapTest.TearDown;
  494. begin
  495. FreeAndNil(fMap);
  496. inherited TearDown;
  497. end;
  498. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  499. procedure TutlMapTest.AddExistingKey;
  500. var
  501. o1: TTestObject;
  502. begin
  503. o1 := TTestObject.Create(fTestObjs[0].Data, @TestObjectDestroy);
  504. try
  505. fMap.Add(o1.Data, o1);
  506. finally
  507. FreeAndNil(o1);
  508. end;
  509. end;
  510. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  511. procedure TutlMapTest.GetValue;
  512. var
  513. i: Integer;
  514. begin
  515. for i := Low(fTestObjs) to High(fTestObjs) do
  516. AssertTrue(fMap[Key(i)] = fTestObjs[i]);
  517. end;
  518. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  519. procedure TutlMapTest.SetValue;
  520. var
  521. o1, o2: TTestObject;
  522. begin
  523. o1 := fMap[Key(2)];
  524. o2 := CreateObj;
  525. fMap[Key(2)] := o2;
  526. try
  527. AssertTrue(fMap[Key(2)] = o2);
  528. finally
  529. FreeAndNil(o1);
  530. end;
  531. end;
  532. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  533. procedure TutlMapTest.GetValueAt;
  534. type
  535. TIntList = specialize TutlList<Integer>;
  536. TIntComparer = specialize TutlComparer<Integer>;
  537. var
  538. o: TTestObject;
  539. l: TIntList;
  540. i: Integer;
  541. begin
  542. l := TIntList.Create;
  543. try
  544. for o in fTestObjs do
  545. l.Add(o.Data);
  546. l.Sort(TIntComparer.Create);
  547. for i := 0 to l.Count-1 do
  548. AssertEquals(l[i], fMap.ValueAt[i].Data);
  549. finally
  550. FreeAndNil(l);
  551. end;
  552. end;
  553. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  554. procedure TutlMapTest.SetValueAt;
  555. var
  556. o1, o2: TTestObject;
  557. begin
  558. o1 := fMap.ValueAt[4];
  559. o2 := TTestObject.Create(o1.Data, @TestObjectDestroy);
  560. fMap.ValueAt[4] := o2;
  561. try
  562. AssertTrue(fMap.ValueAt[4] = o2);
  563. finally
  564. FreeAndNil(o1);
  565. end;
  566. end;
  567. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  568. procedure TutlMapTest.GetKey;
  569. type
  570. TIntList = specialize TutlList<Integer>;
  571. TIntComparer = specialize TutlComparer<Integer>;
  572. var
  573. o: TTestObject;
  574. l: TIntList;
  575. i: Integer;
  576. begin
  577. l := TIntList.Create;
  578. try
  579. for o in fTestObjs do
  580. l.Add(o.Data);
  581. l.Sort(TIntComparer.Create);
  582. for i := 0 to l.Count-1 do
  583. AssertEquals(l[i], fMap.Keys[i]);
  584. finally
  585. FreeAndNil(l);
  586. end;
  587. end;
  588. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  589. procedure TutlMapTest.Add;
  590. var
  591. o1: TTestObject;
  592. begin
  593. o1 := CreateObj;
  594. fMap.Add(o1.Data, o1);
  595. AssertEquals(Length(fTestObjs)+1, fMap.Count);
  596. AssertException(EutlMap, @AddExistingKey);
  597. end;
  598. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  599. procedure TutlMapTest.IndexOf;
  600. type
  601. TIntList = specialize TutlList<Integer>;
  602. TIntComparer = specialize TutlComparer<Integer>;
  603. var
  604. o: TTestObject;
  605. l: TIntList;
  606. begin
  607. l := TIntList.Create;
  608. try
  609. for o in fTestObjs do
  610. l.Add(o.Data);
  611. l.Sort(TIntComparer.Create);
  612. for o in fTestObjs do
  613. AssertEquals(l.IndexOf(o.Data), fMap.IndexOf(o.Data));
  614. finally
  615. FreeAndNil(l);
  616. end;
  617. end;
  618. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  619. procedure TutlMapTest.Delete;
  620. var
  621. i: Integer;
  622. begin
  623. for i := Low(fTestObjs) to High(fTestObjs) do begin
  624. fMap.Delete(Key(i));
  625. AssertNull(fTestObjs[i]);
  626. AssertEquals('Count', Length(fTestObjs)-i-1, fMap.Count);
  627. AssertEquals('Index', fLastRemovedIndex, i);
  628. end;
  629. end;
  630. initialization
  631. RegisterTest(TutlListTest);
  632. RegisterTest(TutlHashSetTest);
  633. RegisterTest(TutlMapTest);
  634. end.