Você não pode selecionar mais de 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.

1253 linhas
90 KiB

  1. unit uGenericsTests;
  2. {$mode objfpc}{$H+}
  3. {$modeswitch nestedprocvars}
  4. interface
  5. uses
  6. Classes, SysUtils, fpcunit, testregistry,
  7. uutlGenerics;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TTestObject = class
  11. private
  12. fData: Integer;
  13. fOnDestroy: TNotifyEvent;
  14. public
  15. property Data: Integer read fData;
  16. constructor Create(const aData: Integer; const aOnDestroy: TNotifyEvent);
  17. destructor Destroy; override;
  18. end;
  19. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  20. TutlListTest = class(TTestCase)
  21. private type
  22. TTestList = specialize TutlList<TTestObject>;
  23. private
  24. fList: TTestList;
  25. fTestObjs: array[0..9] of TTestObject;
  26. procedure TestObjectDestroy(aSender: TObject);
  27. protected
  28. procedure SetUp; override;
  29. procedure TearDown; override;
  30. published
  31. procedure GetItem;
  32. procedure SetItem;
  33. procedure Add;
  34. procedure Insert;
  35. procedure IndexOf;
  36. procedure Exchange;
  37. procedure Move;
  38. procedure Delete;
  39. procedure Extract;
  40. procedure Remove;
  41. procedure Clear;
  42. procedure First;
  43. procedure PushFirst;
  44. procedure PopFirst;
  45. procedure Last;
  46. procedure PushLast;
  47. procedure PopLast;
  48. end;
  49. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  50. TutlHashSetTest = class(TTestCase)
  51. private type
  52. TTestObjComparer = specialize TutlEventComparer<TTestObject>;
  53. TTestHashSet = specialize TutlCustomHashSet<TTestObject>;
  54. private
  55. fHashSet: TTestHashSet;
  56. fTestObjs: array[0..9] of TTestObject;
  57. procedure TestObjectDestroy(aSender: TObject);
  58. protected
  59. procedure SetUp; override;
  60. procedure TearDown; override;
  61. public
  62. function CompareTestObjects(const i1, i2: TTestObject): Integer;
  63. published
  64. procedure Add;
  65. procedure Contains;
  66. procedure IndexOf;
  67. procedure Remove;
  68. procedure Delete;
  69. end;
  70. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  71. TutlMapTest = class(TTestCase)
  72. private type
  73. TTestMap = specialize TutlMap<Integer, TTestObject>;
  74. private
  75. fMap: TTestMap;
  76. fTestObjs: array[0..9] of TTestObject;
  77. fLastRemovedIndex: Integer;
  78. procedure TestObjectDestroy(aSender: TObject);
  79. function Key(const aIndex: Integer): Integer;
  80. function CreateObj: TTestObject;
  81. protected
  82. procedure SetUp; override;
  83. procedure TearDown; override;
  84. procedure AddExistingKey;
  85. published
  86. procedure GetValue;
  87. procedure SetValue;
  88. procedure GetValueAt;
  89. procedure SetValueAt;
  90. procedure GetKey;
  91. procedure Add;
  92. procedure IndexOf;
  93. procedure Delete;
  94. end;
  95. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. TutlPagedDataFiFoTest = class(TTestCase)
  97. private type
  98. TTestFiFo = specialize TutlPagedDataFiFo<Byte>;
  99. private
  100. fFiFo: TTestFiFo;
  101. protected
  102. procedure SetUp; override;
  103. procedure TearDown; override;
  104. published
  105. procedure WriteReadSinglePage;
  106. procedure WriteReadMultiPage;
  107. procedure WritePeekReadSinglePage;
  108. procedure WritePeekReadMultiPage;
  109. procedure WriteDiscardReadSinglePage;
  110. procedure WriteDiscardReadMultiPage;
  111. procedure NestedProvider;
  112. procedure NestedConsumer;
  113. procedure StreamProvider;
  114. procedure StreamConsumer;
  115. procedure RandomSizeTest;
  116. procedure BigDataBlocks;
  117. procedure WriteSmallBlocks;
  118. procedure ReadSmallBlocks;
  119. procedure WriteHalfPageReadAll;
  120. end;
  121. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  122. TutlEnumHelperTest = class(TTestCase)
  123. private type
  124. TBasicEnum = (test1,test2,test3);
  125. TBasicEnumH = specialize TutlEnumHelper<TBasicEnum>;
  126. TOffsetEnum = (
  127. rtNone = -1,
  128. rtJanaru = 0,
  129. rtTambinor = 1,
  130. rtBendalir = 2,
  131. rtCogadh = 3);
  132. TOffsetEnumH = specialize TutlEnumHelper<TOffsetEnum>;
  133. TSparseEnum = (
  134. pmFoo = $00f0,
  135. pmPoint = $1b01,
  136. pmLine = $1b02,
  137. pmFill = $1b03);
  138. TSparseEnumH = specialize TutlEnumHelper<TSparseEnum>;
  139. TDisorder = (teNone = -1, teOne = 200, teTwo = 10);
  140. TDisorderH = specialize TutlEnumHelper<TDisorder>;
  141. {$push}{$ScopedEnums on}
  142. TScoped = (tefoo, uGenericsTests);
  143. TScopedH = specialize TutlEnumHelper<TScoped>;
  144. {$pop}
  145. published
  146. procedure BasicConvert;
  147. procedure OffsetEnum;
  148. procedure SparseEnum;
  149. procedure DisorderedEnum;
  150. procedure ScopedEnum;
  151. end;
  152. implementation
  153. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  154. //TTestObject///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  155. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  156. constructor TTestObject.Create(const aData: Integer; const aOnDestroy: TNotifyEvent);
  157. begin
  158. inherited Create;
  159. fData := aData;
  160. fOnDestroy := aOnDestroy;
  161. end;
  162. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  163. destructor TTestObject.Destroy;
  164. begin
  165. if Assigned(fOnDestroy) then
  166. fOnDestroy(self);
  167. inherited Destroy;
  168. end;
  169. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  170. //TutlListTest//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  171. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  172. procedure TutlListTest.TestObjectDestroy(aSender: TObject);
  173. var
  174. i: Integer;
  175. begin
  176. for i := Low(fTestObjs) to High(fTestObjs) do
  177. if (fTestObjs[i] = aSender) then
  178. fTestObjs[i] := nil;
  179. end;
  180. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  181. procedure TutlListTest.SetUp;
  182. var
  183. i: Integer;
  184. begin
  185. inherited SetUp;
  186. fList := TTestList.Create(true);
  187. for i := Low(fTestObjs) to High(fTestObjs) do begin
  188. fTestObjs[i] := TTestObject.Create(i, @TestObjectDestroy);
  189. fList.Add(fTestObjs[i]);
  190. end;
  191. end;
  192. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  193. procedure TutlListTest.TearDown;
  194. begin
  195. FreeAndNil(fList);
  196. inherited TearDown;
  197. end;
  198. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  199. procedure TutlListTest.GetItem;
  200. var
  201. i: Integer;
  202. begin
  203. for i := Low(fTestObjs) to High(fTestObjs) do
  204. AssertTrue(fTestObjs[i] = fList[i - Low(fTestObjs)]);
  205. end;
  206. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  207. procedure TutlListTest.SetItem;
  208. var
  209. o1, o2: TTestObject;
  210. begin
  211. o1 := fList[3];
  212. o2 := fList[6];
  213. fList[3] := o2;
  214. fList[6] := o1;
  215. AssertTrue(fList[6] = o1);
  216. AssertTrue(fList[3] = o2);
  217. end;
  218. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  219. procedure TutlListTest.Add;
  220. var
  221. t: TTestObject;
  222. c: Integer;
  223. begin
  224. t := TTestObject.Create(123456, @TestObjectDestroy);
  225. c := fList.Count;
  226. fList.Add(t);
  227. AssertEquals(c+1, fList.Count);
  228. AssertTrue(fList[c] = t);
  229. AssertTrue(fList.Last = t);
  230. end;
  231. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  232. procedure TutlListTest.Insert;
  233. var
  234. t: TTestObject;
  235. c: Integer;
  236. begin
  237. t := TTestObject.Create(123456, @TestObjectDestroy);
  238. c := fList.Count;
  239. fList.Insert(3, t);
  240. AssertEquals(c+1, fList.Count);
  241. AssertTrue(fList[3] = t);
  242. end;
  243. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  244. procedure TutlListTest.IndexOf;
  245. var
  246. i: Integer;
  247. begin
  248. for i := Low(fTestObjs) to High(fTestObjs) do
  249. AssertEquals(i - Low(fTestObjs), fList.IndexOf(fTestObjs[i]));
  250. end;
  251. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  252. procedure TutlListTest.Exchange;
  253. var
  254. o1, o2: TTestObject;
  255. begin
  256. o1 := fList[3];
  257. o2 := fList[7];
  258. fList.Exchange(3, 7);
  259. AssertTrue(fList[3] = o2);
  260. AssertTrue(fList[7] = o1);
  261. end;
  262. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  263. procedure TutlListTest.Move;
  264. begin
  265. fList.Move(3, 6);
  266. AssertTrue(fList[3] = fTestObjs[4]);
  267. AssertTrue(fList[4] = fTestObjs[5]);
  268. AssertTrue(fList[5] = fTestObjs[6]);
  269. AssertTrue(fList[6] = fTestObjs[3]);
  270. end;
  271. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  272. procedure TutlListTest.Delete;
  273. begin
  274. fList.Delete(3);
  275. AssertTrue(fTestObjs[3] = nil);
  276. AssertEquals(Length(fTestObjs)-1, fList.Count);
  277. fList.OwnsObjects := false;
  278. fList.Delete(4);
  279. AssertTrue(fTestObjs[5] <> nil);
  280. AssertEquals(Length(fTestObjs)-2, fList.Count);
  281. AssertTrue(fList[4] = fTestObjs[6]);
  282. FreeAndNil(fTestObjs[5]);
  283. fList.OwnsObjects := true;
  284. end;
  285. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  286. procedure TutlListTest.Extract;
  287. var
  288. o1, o2, o3: TTestObject;
  289. begin
  290. o1 := fList[1];
  291. o2 := TTestObject.Create(1234, @TestObjectDestroy);
  292. o3 := fList.Extract(o1, o2);
  293. try
  294. AssertTrue(o1 = o3);
  295. AssertEquals(Length(fTestObjs)-1, fList.Count);
  296. AssertTrue(fTestObjs[1] <> nil);
  297. finally
  298. FreeAndNil(o1);
  299. FreeAndNil(o2);
  300. end;
  301. o1 := fList[1];
  302. o2 := TTestObject.Create(1234, @TestObjectDestroy);
  303. o3 := fList.Extract(o2, o1);
  304. try
  305. AssertTrue(o1 = o3);
  306. AssertEquals(Length(fTestObjs)-1, fList.Count);
  307. finally
  308. FreeAndNil(o2);
  309. end;
  310. end;
  311. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  312. procedure TutlListTest.Remove;
  313. var
  314. o1: TTestObject;
  315. i: Integer;
  316. begin
  317. o1 := fList[3];
  318. i := fList.Remove(o1);
  319. AssertEquals(3, i);
  320. AssertEquals(Length(fTestObjs)-1, fList.Count);
  321. AssertTrue(fTestObjs[3] = nil);
  322. end;
  323. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  324. procedure TutlListTest.Clear;
  325. var
  326. o: TTestObject;
  327. begin
  328. fList.Clear;
  329. AssertEquals(0, fList.Count);
  330. for o in fTestObjs do
  331. AssertTrue(o = nil);
  332. end;
  333. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  334. procedure TutlListTest.First;
  335. begin
  336. AssertTrue(fTestObjs[Low(fTestObjs)] = fList.First);
  337. end;
  338. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  339. procedure TutlListTest.PushFirst;
  340. var
  341. o1: TTestObject;
  342. begin
  343. o1 := TTestObject.Create(1234, @TestObjectDestroy);
  344. fList.PushFirst(o1);
  345. AssertEquals(Length(fTestObjs)+1, fList.Count);
  346. AssertTrue(fList.First = o1);
  347. end;
  348. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  349. procedure TutlListTest.PopFirst;
  350. var
  351. o1: TTestObject;
  352. begin
  353. o1 := fList.PopFirst;
  354. AssertEquals(Length(fTestObjs)-1, fList.Count);
  355. AssertTrue(o1 = fTestObjs[0]);
  356. FreeAndNil(o1);
  357. o1 := fList.PopFirst(true);
  358. AssertEquals(Length(fTestObjs)-2, fList.Count);
  359. AssertTrue(o1 = nil);
  360. AssertTrue(fTestObjs[1] = nil);
  361. end;
  362. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  363. procedure TutlListTest.Last;
  364. begin
  365. AssertTrue(fTestObjs[High(fTestObjs)] = fList.Last);
  366. end;
  367. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  368. procedure TutlListTest.PushLast;
  369. var
  370. o1: TTestObject;
  371. begin
  372. o1 := TTestObject.Create(1234, @TestObjectDestroy);
  373. fList.PushLast(o1);
  374. AssertEquals(Length(fTestObjs)+1, fList.Count);
  375. AssertTrue(fList.Last = o1);
  376. end;
  377. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  378. procedure TutlListTest.PopLast;
  379. var
  380. o1: TTestObject;
  381. begin
  382. o1 := fList.PopLast;
  383. AssertEquals(Length(fTestObjs)-1, fList.Count);
  384. AssertTrue(o1 = fTestObjs[High(fTestObjs)]);
  385. FreeAndNil(o1);
  386. o1 := fList.PopLast(true);
  387. AssertEquals(Length(fTestObjs)-2, fList.Count);
  388. AssertTrue(o1 = nil);
  389. AssertTrue(fTestObjs[High(fTestObjs)-1] = nil);
  390. end;
  391. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  392. //TutlHashSetTest///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  393. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  394. procedure TutlHashSetTest.TestObjectDestroy(aSender: TObject);
  395. var
  396. i: Integer;
  397. begin
  398. for i := Low(fTestObjs) to High(fTestObjs) do
  399. if (fTestObjs[i] = aSender) then
  400. fTestObjs[i] := nil;
  401. end;
  402. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  403. procedure TutlHashSetTest.SetUp;
  404. var
  405. i: Integer;
  406. begin
  407. inherited SetUp;
  408. fHashSet := TTestHashSet.Create(TTestObjComparer.Create(@CompareTestObjects), true);
  409. for i := Low(fTestObjs) to High(fTestObjs) do begin
  410. fTestObjs[i] := TTestObject.Create(i, @TestObjectDestroy);
  411. fHashSet.Add(fTestObjs[i]);
  412. end;
  413. end;
  414. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  415. procedure TutlHashSetTest.TearDown;
  416. begin
  417. FreeAndNil(fHashSet);
  418. inherited TearDown;
  419. end;
  420. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  421. function TutlHashSetTest.CompareTestObjects(const i1, i2: TTestObject): Integer;
  422. begin
  423. if (i1.Data < i2.Data) then
  424. result := -1
  425. else if (i1.Data > i2.Data) then
  426. result := 1
  427. else
  428. result := 0;
  429. end;
  430. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  431. procedure TutlHashSetTest.Add;
  432. var
  433. o1: TTestObject;
  434. b: Boolean;
  435. begin
  436. o1 := TTestObject.Create(1234, @TestObjectDestroy);
  437. b := fHashSet.Add(o1);
  438. AssertTrue(b);
  439. AssertEquals(Length(fTestObjs)+1, fHashSet.Count);
  440. b := fHashSet.Add(o1);
  441. AssertFalse(b);
  442. AssertEquals(Length(fTestObjs)+1, fHashSet.Count);
  443. end;
  444. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  445. procedure TutlHashSetTest.Contains;
  446. var
  447. o1: TTestObject;
  448. b: Boolean;
  449. begin
  450. o1 := TTestObject.Create(1234, @TestObjectDestroy);
  451. try
  452. b := fHashSet.Contains(fTestObjs[0]);
  453. AssertTrue(b);
  454. b := fHashSet.Contains(o1);
  455. AssertFalse(b);
  456. finally
  457. FreeAndNil(o1);
  458. end;
  459. end;
  460. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  461. procedure TutlHashSetTest.IndexOf;
  462. var
  463. o1: TTestObject;
  464. i: Integer;
  465. begin
  466. o1 := TTestObject.Create(1234, @TestObjectDestroy);
  467. try
  468. i := fHashSet.IndexOf(fTestObjs[4]);
  469. AssertEquals(4, i);
  470. i := fHashSet.IndexOf(o1);
  471. AssertEquals(-1, i);
  472. finally
  473. FreeAndNil(o1);
  474. end;
  475. end;
  476. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  477. procedure TutlHashSetTest.Remove;
  478. var
  479. b: Boolean;
  480. begin
  481. b := fHashSet.Remove(fTestObjs[5]);
  482. AssertTrue(fTestObjs[5] = nil);
  483. AssertTrue(b);
  484. AssertEquals(Length(fTestObjs)-1, fHashSet.Count);
  485. fHashSet.OwnsObjects := false;
  486. try
  487. b := fHashSet.Remove(fTestObjs[0]);
  488. AssertTrue(fTestObjs[0] <> nil);
  489. AssertEquals(Length(fTestObjs)-2, fHashSet.Count);
  490. AssertTrue(b);
  491. b := fHashSet.Remove(fTestObjs[0]);
  492. AssertFalse(b);
  493. AssertEquals(Length(fTestObjs)-2, fHashSet.Count);
  494. finally
  495. FreeAndNil(fTestObjs[0]);
  496. fHashSet.OwnsObjects := true;
  497. end;
  498. end;
  499. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  500. procedure TutlHashSetTest.Delete;
  501. begin
  502. fHashSet.Delete(0);
  503. AssertEquals(Length(fTestObjs)-1, fHashSet.Count);
  504. AssertTrue(fTestObjs[0] = nil);
  505. end;
  506. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  507. //TutlMapTest///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  508. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  509. procedure TutlMapTest.TestObjectDestroy(aSender: TObject);
  510. var
  511. i: Integer;
  512. begin
  513. for i := Low(fTestObjs) to High(fTestObjs) do
  514. if (fTestObjs[i] = aSender) then begin
  515. fLastRemovedIndex := i;
  516. fTestObjs[i] := nil;
  517. exit;
  518. end;
  519. end;
  520. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  521. function TutlMapTest.Key(const aIndex: Integer): Integer;
  522. begin
  523. result := fTestObjs[aIndex].Data;
  524. end;
  525. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  526. function TutlMapTest.CreateObj: TTestObject;
  527. var
  528. k: Integer;
  529. begin
  530. repeat
  531. k := random(10000);
  532. until not fMap.Contains(k);
  533. result := TTestObject.Create(k, @TestObjectDestroy);
  534. end;
  535. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  536. procedure TutlMapTest.SetUp;
  537. var
  538. i: Integer;
  539. o: TTestObject;
  540. begin
  541. inherited SetUp;
  542. fMap := TTestMap.Create(true);
  543. Randomize;
  544. for i := Low(fTestObjs) to High(fTestObjs) do begin
  545. o := CreateObj;
  546. fTestObjs[i] := o;
  547. fMap.Add(o.Data, o);
  548. end;
  549. end;
  550. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  551. procedure TutlMapTest.TearDown;
  552. begin
  553. FreeAndNil(fMap);
  554. inherited TearDown;
  555. end;
  556. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  557. procedure TutlMapTest.AddExistingKey;
  558. var
  559. o1: TTestObject;
  560. begin
  561. o1 := TTestObject.Create(fTestObjs[0].Data, @TestObjectDestroy);
  562. try
  563. fMap.Add(o1.Data, o1);
  564. finally
  565. FreeAndNil(o1);
  566. end;
  567. end;
  568. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  569. procedure TutlMapTest.GetValue;
  570. var
  571. i: Integer;
  572. begin
  573. for i := Low(fTestObjs) to High(fTestObjs) do
  574. AssertTrue(fMap[Key(i)] = fTestObjs[i]);
  575. end;
  576. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  577. procedure TutlMapTest.SetValue;
  578. var
  579. o1, o2: TTestObject;
  580. begin
  581. o1 := fMap[Key(2)];
  582. o2 := CreateObj;
  583. fMap[Key(2)] := o2;
  584. try
  585. AssertTrue(fMap[Key(2)] = o2);
  586. finally
  587. FreeAndNil(o1);
  588. end;
  589. end;
  590. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  591. procedure TutlMapTest.GetValueAt;
  592. type
  593. TIntList = specialize TutlList<Integer>;
  594. TIntComparer = specialize TutlComparer<Integer>;
  595. var
  596. o: TTestObject;
  597. l: TIntList;
  598. i: Integer;
  599. begin
  600. l := TIntList.Create;
  601. try
  602. for o in fTestObjs do
  603. l.Add(o.Data);
  604. l.Sort(TIntComparer.Create);
  605. for i := 0 to l.Count-1 do
  606. AssertEquals(l[i], fMap.ValueAt[i].Data);
  607. finally
  608. FreeAndNil(l);
  609. end;
  610. end;
  611. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  612. procedure TutlMapTest.SetValueAt;
  613. var
  614. o1, o2: TTestObject;
  615. begin
  616. o1 := fMap.ValueAt[4];
  617. o2 := TTestObject.Create(o1.Data, @TestObjectDestroy);
  618. fMap.ValueAt[4] := o2;
  619. try
  620. AssertTrue(fMap.ValueAt[4] = o2);
  621. finally
  622. FreeAndNil(o1);
  623. end;
  624. end;
  625. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  626. procedure TutlMapTest.GetKey;
  627. type
  628. TIntList = specialize TutlList<Integer>;
  629. TIntComparer = specialize TutlComparer<Integer>;
  630. var
  631. o: TTestObject;
  632. l: TIntList;
  633. i: Integer;
  634. begin
  635. l := TIntList.Create;
  636. try
  637. for o in fTestObjs do
  638. l.Add(o.Data);
  639. l.Sort(TIntComparer.Create);
  640. for i := 0 to l.Count-1 do
  641. AssertEquals(l[i], fMap.Keys[i]);
  642. finally
  643. FreeAndNil(l);
  644. end;
  645. end;
  646. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  647. procedure TutlMapTest.Add;
  648. var
  649. o1: TTestObject;
  650. begin
  651. o1 := CreateObj;
  652. fMap.Add(o1.Data, o1);
  653. AssertEquals(Length(fTestObjs)+1, fMap.Count);
  654. AssertException(EutlMapKeyAlreadyExists, @AddExistingKey);
  655. end;
  656. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  657. procedure TutlMapTest.IndexOf;
  658. type
  659. TIntList = specialize TutlList<Integer>;
  660. TIntComparer = specialize TutlComparer<Integer>;
  661. var
  662. o: TTestObject;
  663. l: TIntList;
  664. begin
  665. l := TIntList.Create;
  666. try
  667. for o in fTestObjs do
  668. l.Add(o.Data);
  669. l.Sort(TIntComparer.Create);
  670. for o in fTestObjs do
  671. AssertEquals(l.IndexOf(o.Data), fMap.IndexOf(o.Data));
  672. finally
  673. FreeAndNil(l);
  674. end;
  675. end;
  676. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  677. procedure TutlMapTest.Delete;
  678. var
  679. i: Integer;
  680. begin
  681. for i := Low(fTestObjs) to High(fTestObjs) do begin
  682. fMap.Delete(Key(i));
  683. AssertNull(fTestObjs[i]);
  684. AssertEquals('Count', Length(fTestObjs)-i-1, fMap.Count);
  685. AssertEquals('Index', fLastRemovedIndex, i);
  686. end;
  687. end;
  688. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  689. //TutlPagedDataFiFoTest/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  690. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  691. procedure TutlPagedDataFiFoTest.SetUp;
  692. begin
  693. inherited SetUp;
  694. fFiFo := TTestFiFo.Create;
  695. end;
  696. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  697. procedure TutlPagedDataFiFoTest.TearDown;
  698. begin
  699. FreeAndNil(fFiFo);
  700. inherited TearDown;
  701. end;
  702. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  703. procedure TutlPagedDataFiFoTest.WriteReadSinglePage;
  704. var
  705. buf1, buf2: String;
  706. l: Integer;
  707. begin
  708. buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis a';
  709. l := Length(buf1);
  710. AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
  711. AssertEquals(l, fFiFo.Size);
  712. SetLength(buf2, l);
  713. AssertEquals(l, fFiFo.Read(PByte(@buf2[1]), l));
  714. AssertEquals(0, fFiFo.Size);
  715. AssertEquals('Data', 0, CompareStr(buf1, buf2));
  716. end;
  717. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  718. procedure TutlPagedDataFiFoTest.WriteReadMultiPage;
  719. var
  720. buf1, buf2: String;
  721. l: Integer;
  722. begin
  723. buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
  724. l := Length(buf1);
  725. AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
  726. AssertEquals(l, fFiFo.Size);
  727. SetLength(buf2, l);
  728. AssertEquals(l, fFiFo.Read(PByte(@buf2[1]), l));
  729. AssertEquals(0, fFiFo.Size);
  730. AssertEquals('Data', 0, CompareStr(buf1, buf2));
  731. end;
  732. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  733. procedure TutlPagedDataFiFoTest.WritePeekReadSinglePage;
  734. var
  735. buf1, buf2, buf3: String;
  736. l: Integer;
  737. begin
  738. buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis a';
  739. l := Length(buf1);
  740. AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
  741. AssertEquals(l, fFiFo.Size);
  742. SetLength(buf2, l);
  743. AssertEquals(l, fFiFo.Peek(PByte(@buf2[1]), l));
  744. AssertEquals(l, fFiFo.Size);
  745. Assert(buf1 = buf2);
  746. SetLength(buf3, l);
  747. AssertEquals(l, fFiFo.Read(PByte(@buf3[1]), l));
  748. AssertEquals(0, fFiFo.Size);
  749. AssertEquals('Data', 0, CompareStr(buf1, buf3));
  750. end;
  751. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  752. procedure TutlPagedDataFiFoTest.WritePeekReadMultiPage;
  753. var
  754. buf1, buf2, buf3: String;
  755. l: Integer;
  756. begin
  757. buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
  758. l := Length(buf1);
  759. AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
  760. AssertEquals(l, fFiFo.Size);
  761. SetLength(buf2, l);
  762. AssertEquals(l, fFiFo.Peek(PByte(@buf2[1]), l));
  763. AssertEquals(l, fFiFo.Size);
  764. Assert(buf1 = buf2);
  765. SetLength(buf3, l);
  766. AssertEquals(l, fFiFo.Read(PByte(@buf3[1]), l));
  767. AssertEquals(0, fFiFo.Size);
  768. AssertEquals('Data', 0, CompareStr(buf1, buf3));
  769. end;
  770. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  771. procedure TutlPagedDataFiFoTest.WriteDiscardReadSinglePage;
  772. var
  773. buf1, buf2: String;
  774. l: Integer;
  775. begin
  776. buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
  777. l := Length(buf1);
  778. AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
  779. AssertEquals(l, fFiFo.Size);
  780. AssertEquals(512, fFiFo.Discard(512));
  781. AssertEquals(l - 512, fFiFo.Size);
  782. buf1 := 't clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
  783. l := Length(buf1);
  784. SetLength(buf2, l);
  785. AssertEquals(l, fFiFo.Read(PByte(@buf2[1]), l));
  786. AssertEquals(0, fFiFo.Size);
  787. AssertEquals('Data', 0, CompareStr(buf1, buf2));
  788. end;
  789. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  790. procedure TutlPagedDataFiFoTest.WriteDiscardReadMultiPage;
  791. var
  792. buf1, buf2: String;
  793. l: Integer;
  794. begin
  795. buf1 := 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, At accusam aliquyam diam diam dolore dolores duo eirmod eos erat, et nonumy sed tempor et et invidunt justo labore Stet clita ea et gubergren, kasd magna no rebum. sanctus sea sed takimata ut vero voluptua. est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
  796. l := Length(buf1);
  797. AssertEquals(l, fFiFo.Write(PByte(@buf1[1]), l));
  798. AssertEquals(l, fFiFo.Size);
  799. AssertEquals(3000, fFiFo.Discard(3000));
  800. AssertEquals(l - 3000, fFiFo.Size);
  801. buf1 := 'tur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat. Consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptu';
  802. l := Length(buf1);
  803. SetLength(buf2, l);
  804. AssertEquals(l, fFiFo.Read(PByte(@buf2[1]), l));
  805. AssertEquals(0, fFiFo.Size);
  806. AssertEquals('Data', 0, CompareStr(buf1, buf2));
  807. end;
  808. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  809. procedure TutlPagedDataFiFoTest.NestedProvider;
  810. var
  811. pos: Integer;
  812. len: Integer;
  813. data: String;
  814. tmp: String;
  815. function GiveData(const aBuffer: PByte; aCount: Integer): Integer;
  816. begin
  817. result := aCount;
  818. if (result > len - pos) then
  819. result := len - pos;
  820. move(data[pos+1], aBuffer^, result);
  821. inc(pos, result);
  822. end;
  823. var
  824. provider: TTestFiFo.IDataProvider;
  825. begin
  826. data := 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab';
  827. len := Length(data);
  828. pos := 0;
  829. provider := TTestFiFo.TNestedDataProvider.Create(@GiveData);
  830. AssertEquals(len, fFiFo.Write(provider, len));
  831. provider := nil;
  832. SetLength(tmp, len);
  833. AssertEquals(len, fFiFo.Read(PByte(@tmp[1]), len));
  834. AssertEquals(0, fFiFo.Size);
  835. AssertEquals('Data', 0, CompareStr(data, tmp));
  836. end;
  837. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  838. procedure TutlPagedDataFiFoTest.NestedConsumer;
  839. var
  840. pos: Integer;
  841. len: Integer;
  842. data: String;
  843. tmp: String;
  844. function TakeData(const aBuffer: PByte; aCount: Integer): Integer;
  845. begin
  846. result := aCount;
  847. if (result > len - pos) then
  848. result := len - pos;
  849. move(aBuffer^, data[pos+1], result);
  850. inc(pos, result);
  851. end;
  852. var
  853. consumer: TTestFiFo.IDataConsumer;
  854. begin
  855. tmp := 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab';
  856. len := Length(tmp);
  857. pos := 0;
  858. AssertEquals(len, fFiFo.Write(@tmp[1], len));
  859. SetLength(data, len);
  860. consumer := TTestFiFo.TNestedDataConsumer.Create(@TakeData);
  861. AssertEquals(len, fFiFo.Read(consumer, len));
  862. consumer := nil;
  863. AssertEquals(0, fFiFo.Size);
  864. AssertEquals('Data', 0, CompareStr(data, tmp));
  865. end;
  866. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  867. procedure TutlPagedDataFiFoTest.StreamProvider;
  868. var
  869. s: TMemoryStream;
  870. len: Integer;
  871. buf1, buf2: String;
  872. provider: TTestFiFo.IDataProvider;
  873. begin
  874. buf1 := 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab';
  875. len := Length(buf1);
  876. s := TMemoryStream.Create;
  877. try
  878. s.Write(buf1[1], len);
  879. s.Position := 0;
  880. provider := TTestFiFo.TStreamDataProvider.Create(s);
  881. AssertEquals(len, fFiFo.Write(provider, len));
  882. provider := nil;
  883. SetLength(buf2, len);
  884. AssertEquals(len, fFiFo.Read(@buf2[1], len));
  885. AssertEquals('Data', 0, CompareStr(buf1, buf2));
  886. finally
  887. FreeAndNil(s);
  888. end;
  889. end;
  890. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  891. procedure TutlPagedDataFiFoTest.StreamConsumer;
  892. var
  893. s: TMemoryStream;
  894. len: Integer;
  895. buf1, buf2: String;
  896. consumer: TTestFiFo.IDataConsumer;
  897. begin
  898. buf1 := 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab';
  899. len := Length(buf1);
  900. AssertEquals(len, fFiFo.Write(@buf1[1], len));
  901. s := TMemoryStream.Create;
  902. try
  903. consumer := TTestFiFo.TStreamDataConsumer.Create(s);
  904. AssertEquals(len, fFiFo.Read(consumer, len));
  905. consumer := nil;
  906. SetLength(buf2, len);
  907. s.Position := 0;
  908. s.Read(buf2[1], len);
  909. AssertEquals('Data', 0, CompareStr(buf1, buf2));
  910. finally
  911. FreeAndNil(s);
  912. end;
  913. end;
  914. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  915. procedure TutlPagedDataFiFoTest.RandomSizeTest;
  916. const
  917. MAX_LEN = 128;
  918. MAX_REPEAT = 1024;
  919. var
  920. rBuf, wBuf: Word;
  921. buf, tmp: array[0..MAX_LEN-1] of Word;
  922. len, i, j: Integer;
  923. begin
  924. rBuf := 0;
  925. wBuf := 0;
  926. len := 1;
  927. for i := 0 to MAX_REPEAT-1 do begin
  928. for j := 0 to len-1 do begin
  929. buf[j] := wBuf;
  930. inc(wBuf);
  931. end;
  932. AssertEquals(SizeOf(Word) * len, fFiFo.Write(@buf[0], SizeOf(Word) * len));
  933. AssertEquals(SizeOf(Word) * len, fFiFo.Peek(@tmp[0], SizeOf(Word) * len));
  934. for j := 0 to len-1 do begin
  935. AssertEquals(rBuf, tmp[j]);
  936. inc(rBuf);
  937. end;
  938. AssertEquals(SizeOf(Word) * len, fFiFo.Discard(SizeOf(Word) * len));
  939. AssertEquals(0, fFiFo.Size);
  940. inc(len);
  941. if (len >= MAX_LEN) then
  942. len := 1;
  943. end;
  944. end;
  945. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  946. procedure TutlPagedDataFiFoTest.BigDataBlocks;
  947. const
  948. BUFFER_LEN = 1000;
  949. REPEAT_COUNT = 50;
  950. var
  951. buf1, buf2: array[0..BUFFER_LEN-1] of Integer;
  952. i, j, sz: Integer;
  953. begin
  954. for i := 0 to BUFFER_LEN-1 do
  955. buf1[i] := i;
  956. sz := 0;
  957. for i := 0 to REPEAT_COUNT + 4 do begin
  958. if (i < REPEAT_COUNT) then begin
  959. AssertEquals(SizeOf(Integer) * BUFFER_LEN, fFiFo.Write(@buf1[0], SizeOf(Integer) * BUFFER_LEN));
  960. inc(sz, SizeOf(Integer) * BUFFER_LEN);
  961. AssertEquals(sz, fFiFo.Size);
  962. end;
  963. if (i >= 5) then begin
  964. AssertEquals(SizeOf(Integer) * BUFFER_LEN, fFiFo.Read(@buf2[0], SizeOf(Integer) * BUFFER_LEN));
  965. dec(sz, SizeOf(Integer) * BUFFER_LEN);
  966. AssertEquals(sz, fFiFo.Size);
  967. for j := 0 to BUFFER_LEN-1 do
  968. AssertEquals(j, buf2[j]);
  969. end;
  970. end;
  971. end;
  972. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  973. procedure TutlPagedDataFiFoTest.WriteSmallBlocks;
  974. var
  975. pos: Integer;
  976. len: Integer;
  977. data: String;
  978. tmp: String;
  979. function GiveData(const aBuffer: PByte; aCount: Integer): Integer;
  980. begin
  981. result := aCount;
  982. if (result > len - pos) then
  983. result := len - pos;
  984. if (result > 10) then
  985. result := 10;
  986. move(data[pos+1], aBuffer^, result);
  987. inc(pos, result);
  988. end;
  989. var
  990. provider: TTestFiFo.IDataProvider;
  991. begin
  992. data := 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab';
  993. len := Length(data);
  994. pos := 0;
  995. provider := TTestFiFo.TNestedDataProvider.Create(@GiveData);
  996. AssertEquals(len, fFiFo.Write(provider, len));
  997. provider := nil;
  998. SetLength(tmp, len);
  999. AssertEquals(len, fFiFo.Read(PByte(@tmp[1]), len));
  1000. AssertEquals(0, fFiFo.Size);
  1001. AssertEquals('Data', 0, CompareStr(data, tmp));
  1002. end;
  1003. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1004. procedure TutlPagedDataFiFoTest.ReadSmallBlocks;
  1005. var
  1006. pos: Integer;
  1007. len: Integer;
  1008. data: String;
  1009. tmp: String;
  1010. function TakeData(const aBuffer: PByte; aCount: Integer): Integer;
  1011. begin
  1012. result := aCount;
  1013. if (result > len - pos) then
  1014. result := len - pos;
  1015. if (result > 10) then
  1016. result := 10;
  1017. move(aBuffer^, data[pos+1], result);
  1018. inc(pos, result);
  1019. end;
  1020. var
  1021. consumer: TTestFiFo.IDataConsumer;
  1022. begin
  1023. tmp := 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab';
  1024. len := Length(tmp);
  1025. pos := 0;
  1026. AssertEquals(len, fFiFo.Write(@tmp[1], len));
  1027. SetLength(data, len);
  1028. consumer := TTestFiFo.TNestedDataConsumer.Create(@TakeData);
  1029. AssertEquals(len, fFiFo.Read(consumer, len));
  1030. consumer := nil;
  1031. AssertEquals(0, fFiFo.Size);
  1032. AssertEquals('Data', 0, CompareStr(data, tmp));
  1033. end;
  1034. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1035. procedure TutlPagedDataFiFoTest.WriteHalfPageReadAll;
  1036. const
  1037. REPEAT_COUNT = 10;
  1038. var
  1039. buf1: String;
  1040. i, sz: Integer;
  1041. p: Pointer;
  1042. begin
  1043. buf1 := 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzab';
  1044. for i := 1 to REPEAT_COUNT do begin
  1045. AssertEquals('Write' + IntToStr(i), fFiFo.PageSize div 2, fFiFo.Write(@buf1[1], fFiFo.PageSize div 2));
  1046. sz := fFiFo.Size;
  1047. AssertEquals('Size' + IntToStr(i), fFiFo.PageSize div 2, sz);
  1048. p := GetMem(fFiFo.PageSize);
  1049. try
  1050. AssertEquals('Read' + IntToStr(i), sz, fFiFo.Read(p, fFiFo.PageSize));
  1051. Assert(CompareMem(p, @buf1[1], sz), 'Data' + IntToStr(i));
  1052. finally
  1053. Freemem(p);
  1054. end;
  1055. end;
  1056. end;
  1057. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1058. //TutlEnumHelperTest////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1059. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1060. procedure TutlEnumHelperTest.BasicConvert;
  1061. var
  1062. en: TBasicEnum;
  1063. begin
  1064. AssertEquals('test1', TBasicEnumH.ToString(test1));
  1065. AssertEquals(Ord(test2), Ord(TBasicEnumH.ToEnum('test2')));
  1066. en:= test1;
  1067. AssertEquals(false, TBasicEnumH.TryToEnum('NotInList',en));
  1068. AssertEquals(ord(test1), ord(en));
  1069. end;
  1070. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1071. procedure TutlEnumHelperTest.OffsetEnum;
  1072. begin
  1073. AssertEquals('rtJanaru', TOffsetEnumH.ToString(rtJanaru));
  1074. AssertEquals(Ord(rtJanaru), Ord(TOffsetEnumH.ToEnum('rtJanaru')));
  1075. AssertEquals(5, Length(TOffsetEnumH.Values));
  1076. end;
  1077. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1078. procedure TutlEnumHelperTest.SparseEnum;
  1079. begin
  1080. AssertEquals('pmPoint', TSparseEnumH.ToString(pmPoint));
  1081. AssertEquals(Ord(pmPoint), Ord(TSparseEnumH.ToEnum('pmPoint')));
  1082. AssertEquals(4, Length(TSparseEnumH.Values));
  1083. end;
  1084. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1085. procedure TutlEnumHelperTest.DisorderedEnum;
  1086. var
  1087. s: string;
  1088. en: TDisorder;
  1089. begin
  1090. AssertEquals(3, Length(TDisorderH.Values));
  1091. s:= '';
  1092. for en in TDisorderH.Values do
  1093. s += TDisorderH.ToString(en) + '|';
  1094. AssertEquals('teNone|teOne|teTwo|', s);
  1095. end;
  1096. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  1097. procedure TutlEnumHelperTest.ScopedEnum;
  1098. var
  1099. s: string;
  1100. en: TScoped;
  1101. begin
  1102. AssertEquals(2, Length(TScopedH.Values));
  1103. s:= '';
  1104. for en in TScopedH.Values do
  1105. s += TScopedH.ToString(en) + '|';
  1106. AssertEquals('tefoo|uGenericsTests|', s);
  1107. end;
  1108. initialization
  1109. RegisterTest(TutlListTest);
  1110. RegisterTest(TutlHashSetTest);
  1111. RegisterTest(TutlMapTest);
  1112. RegisterTest(TutlPagedDataFiFoTest);
  1113. RegisterTest(TutlEnumHelperTest);
  1114. end.