utcfphashobjectlist.pp 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. unit utcFPHashObjectList;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, contnrs, punit;
  6. procedure RegisterTests;
  7. implementation
  8. type
  9. TMyObject = class(TObject)
  10. IsFreed: ^Boolean;
  11. destructor Destroy; override;
  12. end;
  13. destructor TMyObject.Destroy;
  14. begin
  15. if Assigned(IsFreed) then
  16. IsFreed^ := True;
  17. inherited Destroy;
  18. end;
  19. Function TFPHashObjectList_TestCreate : TTestString;
  20. var
  21. L: TFPHashObjectList;
  22. begin
  23. Result:='';
  24. L := TFPHashObjectList.Create;
  25. try
  26. AssertNotNull('List should be created', L);
  27. AssertEquals('Count should be 0 on creation', 0, L.Count);
  28. AssertTrue('OwnsObjects should be true by default', L.OwnsObjects);
  29. finally
  30. L.Free;
  31. end;
  32. end;
  33. Function TFPHashObjectList_TestAdd : TTestString;
  34. var
  35. L: TFPHashObjectList;
  36. O1, O2: TObject;
  37. begin
  38. Result:='';
  39. L := TFPHashObjectList.Create(False);
  40. try
  41. O1 := TObject.Create;
  42. O2 := TObject.Create;
  43. L.Add('O1', O1);
  44. AssertEquals('Count should be 1 after adding one object', 1, L.Count);
  45. AssertSame('First item should be O1', O1, L.Items[0]);
  46. L.Add('O2', O2);
  47. AssertEquals('Count should be 2 after adding a second object', 2, L.Count);
  48. AssertSame('Second item should be O2', O2, L.Items[1]);
  49. finally
  50. L.Free;
  51. O1.Free;
  52. O2.Free;
  53. end;
  54. end;
  55. Function TFPHashObjectList_TestDelete : TTestString;
  56. var
  57. L: TFPHashObjectList;
  58. O1, O2: TObject;
  59. begin
  60. Result:='';
  61. L := TFPHashObjectList.Create(False);
  62. try
  63. O1 := TObject.Create;
  64. O2 := TObject.Create;
  65. L.Add('O1', O1);
  66. L.Add('O2', O2);
  67. L.Delete(0);
  68. AssertEquals('Count should be 1 after deleting an object', 1, L.Count);
  69. AssertSame('First item should now be O2', O2, L.Items[0]);
  70. finally
  71. L.Free;
  72. O1.Free;
  73. O2.Free;
  74. end;
  75. end;
  76. Function TFPHashObjectList_TestClear : TTestString;
  77. var
  78. L: TFPHashObjectList;
  79. O1, O2: TObject;
  80. begin
  81. Result:='';
  82. L := TFPHashObjectList.Create(False);
  83. try
  84. O1 := TObject.Create;
  85. O2 := TObject.Create;
  86. L.Add('O1', O1);
  87. L.Add('O2', O2);
  88. L.Clear;
  89. AssertEquals('Count should be 0 after clearing the list', 0, L.Count);
  90. finally
  91. L.Free;
  92. O1.Free;
  93. O2.Free;
  94. end;
  95. end;
  96. Function TFPHashObjectList_TestIndexOf : TTestString;
  97. var
  98. L: TFPHashObjectList;
  99. O1, O2, O3: TObject;
  100. begin
  101. Result:='';
  102. L := TFPHashObjectList.Create(False);
  103. O3 := TObject.Create;
  104. try
  105. O1 := TObject.Create;
  106. O2 := TObject.Create;
  107. L.Add('O1', O1);
  108. L.Add('O2', O2);
  109. AssertEquals('Index of O1 should be 0', 0, L.IndexOf(O1));
  110. AssertEquals('Index of O2 should be 1', 1, L.IndexOf(O2));
  111. AssertEquals('Index of a non-existent object should be -1', -1, L.IndexOf(O3));
  112. finally
  113. L.Free;
  114. O1.Free;
  115. O2.Free;
  116. O3.Free;
  117. end;
  118. end;
  119. Function TFPHashObjectList_TestRemove : TTestString;
  120. var
  121. L: TFPHashObjectList;
  122. O1, O2: TObject;
  123. begin
  124. Result:='';
  125. L := TFPHashObjectList.Create(False);
  126. try
  127. O1 := TObject.Create;
  128. O2 := TObject.Create;
  129. L.Add('O1', O1);
  130. L.Add('O2', O2);
  131. L.Remove(O1);
  132. AssertEquals('Count should be 1 after removing an object', 1, L.Count);
  133. AssertSame('First item should now be O2', O2, L.Items[0]);
  134. finally
  135. L.Free;
  136. O1.Free;
  137. O2.Free;
  138. end;
  139. end;
  140. Function TFPHashObjectList_TestOwnsObjects : TTestString;
  141. var
  142. L: TFPHashObjectList;
  143. O1: TMyObject;
  144. Freed: Boolean;
  145. begin
  146. Result:='';
  147. L := TFPHashObjectList.Create(True);
  148. Freed := False;
  149. O1 := TMyObject.Create;
  150. O1.IsFreed := @Freed;
  151. L.Add('O1', O1);
  152. L.Free; // This should free O1 as well
  153. AssertTrue('Object should be freed when OwnsObjects is true and list is freed', Freed);
  154. end;
  155. Function TFPHashObjectList_TestFind : TTestString;
  156. var
  157. L: TFPHashObjectList;
  158. O1, O2: TObject;
  159. begin
  160. Result:='';
  161. L := TFPHashObjectList.Create(False);
  162. try
  163. O1 := TObject.Create;
  164. O2 := TObject.Create;
  165. L.Add('O1', O1);
  166. L.Add('O2', O2);
  167. AssertSame('Find should return O1', O1, L.Find('O1'));
  168. AssertSame('Find should return O2', O2, L.Find('O2'));
  169. AssertEquals('Find for a non-existent object should return nil', nil, L.Find('O3'));
  170. finally
  171. L.Free;
  172. O1.Free;
  173. O2.Free;
  174. end;
  175. end;
  176. Function TFPHashObjectList_TestFindLong : TTestString;
  177. var
  178. L: TFPHashObjectList;
  179. O0, O1, O2: TObject;
  180. S : String;
  181. begin
  182. Result:='';
  183. O0:=Nil;
  184. O1:=Nil;
  185. O2:=Nil;
  186. L := TFPHashObjectList.Create(False);
  187. try
  188. O0 := TObject.Create;
  189. O1 := TObject.Create;
  190. O2 := TObject.Create;
  191. S:=StringOfChar('A',333);
  192. L.Add('x', O0);
  193. L.Add(S, O1);
  194. L.Add(S+'2', O2);
  195. AssertSame('Find should return O1', O1, L.Find(S));
  196. AssertSame('Find should return O2', O2, L.Find(S+'2'));
  197. AssertEquals('Find for a non-existent object should return nil', nil, L.Find('O3'));
  198. finally
  199. L.Free;
  200. O0.Free;
  201. O1.Free;
  202. O2.Free;
  203. end;
  204. end;
  205. Function TFPHashObjectList_TestFindIndexOf : TTestString;
  206. var
  207. L: TFPHashObjectList;
  208. O0, O1, O2: TObject;
  209. begin
  210. Result:='';
  211. O0:=Nil;
  212. O1:=Nil;
  213. O2:=Nil;
  214. L := TFPHashObjectList.Create(False);
  215. try
  216. O0 := TObject.Create;
  217. O1 := TObject.Create;
  218. O2 := TObject.Create;
  219. L.Add('O1', O1);
  220. L.Add('O2', O2);
  221. AssertEquals('FindIndexOf for O1 should be 0', 0, L.FindIndexOf('O1'));
  222. AssertEquals('FindIndexOf for O2 should be 1', 1, L.FindIndexOf('O2'));
  223. AssertEquals('FindIndexOf for a non-existent object should be -1', -1, L.FindIndexOf('O3'));
  224. finally
  225. L.Free;
  226. O0.Free;
  227. O1.Free;
  228. O2.Free;
  229. end;
  230. end;
  231. procedure RegisterTests;
  232. begin
  233. AddSuite('TFPHashObjectListTests');
  234. AddTest('TestCreate', @TFPHashObjectList_TestCreate, 'TFPHashObjectListTests');
  235. AddTest('TestAdd', @TFPHashObjectList_TestAdd, 'TFPHashObjectListTests');
  236. AddTest('TestDelete', @TFPHashObjectList_TestDelete, 'TFPHashObjectListTests');
  237. AddTest('TestClear', @TFPHashObjectList_TestClear, 'TFPHashObjectListTests');
  238. AddTest('TestIndexOf', @TFPHashObjectList_TestIndexOf, 'TFPHashObjectListTests');
  239. AddTest('TestRemove', @TFPHashObjectList_TestRemove, 'TFPHashObjectListTests');
  240. AddTest('TestOwnsObjects', @TFPHashObjectList_TestOwnsObjects, 'TFPHashObjectListTests');
  241. AddTest('TestFind', @TFPHashObjectList_TestFind, 'TFPHashObjectListTests');
  242. AddTest('TestFindLong', @TFPHashObjectList_TestFindLong, 'TFPHashObjectListTests');
  243. AddTest('TestFindIndexOf', @TFPHashObjectList_TestFindIndexOf, 'TFPHashObjectListTests');
  244. end;
  245. end.