tchashlist.pp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. unit tchashlist;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, fpcunit, testutils, testregistry, contnrs;
  6. type
  7. { TItemObject }
  8. TItemObject = Class(TObject)
  9. private
  10. FIndex: Integer;
  11. Public
  12. Constructor Create(AIndex : integer);
  13. Property Index : Integer Read FIndex Write FIndex;
  14. end;
  15. { TTestHash }
  16. TTestHash = class(TTestCase)
  17. Protected
  18. FH : TFPHashList;
  19. FItems : TStringList;
  20. Procedure Setup; override;
  21. Procedure TearDown; override;
  22. Procedure AddItem(I : Integer);
  23. Procedure AssertItem(AItemIndex: Integer; AItem : Pointer);
  24. Procedure AssertItem(AItemIndex,AHAshIndex : Integer);
  25. Procedure AssertCount(ACount : Integer);
  26. Procedure AssertCapacity(ACapacity : Integer);
  27. published
  28. procedure TestEmpty;
  29. Procedure TestAdd;
  30. Procedure TestGrow;
  31. Procedure TestDelete;
  32. Procedure TestFind;
  33. end;
  34. implementation
  35. { TItemObject }
  36. constructor TItemObject.Create(AIndex: integer);
  37. begin
  38. FIndex:=AIndex;
  39. end;
  40. procedure TTestHash.Setup;
  41. Var
  42. I : integer;
  43. begin
  44. Inherited;
  45. FH:=TFPHashList.Create;
  46. FItems:=TStringList.Create;
  47. For I:=0 to 1000 do
  48. FItems.AddObject(IntToStr(I),TItemObject.Create(i));
  49. end;
  50. procedure TTestHash.TearDown;
  51. begin
  52. FreeAndNil(FItems);
  53. FreeAndNil(FH);
  54. Inherited;
  55. end;
  56. procedure TTestHash.AddItem(I: Integer);
  57. begin
  58. FH.Add(FItems[i],FItems.Objects[i]);
  59. end;
  60. procedure TTestHash.AssertItem(AItemIndex: Integer; AItem: Pointer);
  61. begin
  62. if not (AItemindex<FItems.Count) then
  63. Fail(Format('Incorrect item index : %d >= %d',[AItemIndex,FItems.Count]));
  64. AssertSame(Format('Object %d',[AItemIndex]),FItems.Objects[AItemIndex],AItem);
  65. end;
  66. procedure TTestHash.AssertItem(AItemIndex, AHAshIndex: Integer);
  67. begin
  68. if not (AItemindex<FItems.Count) then
  69. Fail(Format('Incorrect item index : %d >= %d',[AItemIndex,FItems.Count]));
  70. if not (AHashIndex<FH.Count) then
  71. Fail(Format('Incorrect hash index : %d >= %d',[AItemIndex,FItems.Count]));
  72. AssertSame(Format('Object %d',[AItemIndex]),FItems.Objects[AItemIndex],FH.Items[AHashIndex]);
  73. end;
  74. procedure TTestHash.AssertCount(ACount: Integer);
  75. begin
  76. AssertEquals('Hash list item count',ACount,FH.Count);
  77. end;
  78. procedure TTestHash.AssertCapacity(ACapacity: Integer);
  79. begin
  80. AssertEquals('Hash list capacity',ACapacity,FH.Capacity);
  81. end;
  82. procedure TTestHash.TestEmpty;
  83. begin
  84. AssertCount(0);
  85. AssertCapacity(0);
  86. end;
  87. Const
  88. CS = 2*SizeOf(ptrint);
  89. CS2 = SizeOf(ptrint);
  90. procedure TTestHash.TestAdd;
  91. begin
  92. AddItem(0);
  93. AssertCount(1);
  94. AssertCapacity(CS);
  95. AssertItem(0,0);
  96. end;
  97. procedure TTestHash.TestGrow;
  98. Var
  99. I : Integer;
  100. begin
  101. For I:=0 to CS do
  102. AddItem(i);
  103. AssertCount(CS+1);
  104. AssertCapacity(CS+CS+CS2);
  105. end;
  106. procedure TTestHash.TestDelete;
  107. Var
  108. I : Integer;
  109. begin
  110. For I:=0 to 9 do
  111. AddItem(i);
  112. FH.Delete(3);
  113. AssertCount(9);
  114. For I:=0 to 2 do
  115. AssertItem(I,I);
  116. For I:=4 to 9 do
  117. AssertItem(I,I-1);
  118. end;
  119. procedure TTestHash.TestFind;
  120. Var
  121. I : integer;
  122. begin
  123. For I:=0 to FItems.Count-1 do
  124. AddItem(I);
  125. For I:=0 to FItems.Count-1 do
  126. AssertItem(I,FH.FindIndexOf(FItems[i]));
  127. For I:=0 to FItems.Count-1 do
  128. AssertItem(I,FH.Find(FItems[i]));
  129. AssertNull('Not existing not found',FH.Find('XYZ'));
  130. FH.Delete(0);
  131. AssertNull('Deleted is not found',FH.Find('0'))
  132. end;
  133. initialization
  134. RegisterTest(TTestHash);
  135. end.