utcobjectlist.pp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. unit utcObjectList;
  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 TObjectList_TestCreate : TTestString;
  20. var
  21. L: TObjectList;
  22. begin
  23. Result:='';
  24. L := TObjectList.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 TObjectList_TestAdd : TTestString;
  34. var
  35. L: TObjectList;
  36. O1, O2: TObject;
  37. begin
  38. Result:='';
  39. L := TObjectList.Create(False);
  40. try
  41. O1 := TObject.Create;
  42. O2 := TObject.Create;
  43. L.Add(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);
  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 TObjectList_TestExtract : TTestString;
  56. var
  57. L: TObjectList;
  58. O1, O2, Extracted: TObject;
  59. begin
  60. Result:='';
  61. L := TObjectList.Create(False);
  62. try
  63. O1 := TObject.Create;
  64. O2 := TObject.Create;
  65. L.Add(O1);
  66. L.Add(O2);
  67. Extracted := L.Extract(O1);
  68. AssertSame('Extracted object should be O1', O1, Extracted);
  69. AssertEquals('Count should be 1 after extracting an object', 1, L.Count);
  70. AssertSame('First item should now be O2', O2, L.Items[0]);
  71. finally
  72. L.Free;
  73. O1.Free;
  74. O2.Free;
  75. end;
  76. end;
  77. Function TObjectList_TestRemove : TTestString;
  78. var
  79. L: TObjectList;
  80. O1, O2: TObject;
  81. begin
  82. Result:='';
  83. L := TObjectList.Create(False);
  84. try
  85. O1 := TObject.Create;
  86. O2 := TObject.Create;
  87. L.Add(O1);
  88. L.Add(O2);
  89. L.Remove(O1);
  90. AssertEquals('Count should be 1 after removing an object', 1, L.Count);
  91. AssertSame('First item should now be O2', O2, L.Items[0]);
  92. finally
  93. L.Free;
  94. O2.Free;
  95. end;
  96. end;
  97. Function TObjectList_TestIndexOf : TTestString;
  98. var
  99. L: TObjectList;
  100. O1, O2, O3: TObject;
  101. begin
  102. Result:='';
  103. L := TObjectList.Create(False);
  104. O3 := TObject.Create;
  105. try
  106. O1 := TObject.Create;
  107. O2 := TObject.Create;
  108. L.Add(O1);
  109. L.Add(O2);
  110. AssertEquals('Index of O1 should be 0', 0, L.IndexOf(O1));
  111. AssertEquals('Index of O2 should be 1', 1, L.IndexOf(O2));
  112. AssertEquals('Index of a non-existent object should be -1', -1, L.IndexOf(O3));
  113. finally
  114. L.Free;
  115. O1.Free;
  116. O2.Free;
  117. O3.Free;
  118. end;
  119. end;
  120. Function TObjectList_TestFindInstanceOf : TTestString;
  121. var
  122. L: TObjectList;
  123. O1: TObject;
  124. C1: TMyObject;
  125. begin
  126. Result:='';
  127. L := TObjectList.Create(False);
  128. try
  129. O1 := TObject.Create;
  130. C1 := TMyObject.Create;
  131. L.Add(O1);
  132. L.Add(C1);
  133. AssertEquals('Find TObject exact', 0, L.FindInstanceOf(TObject, True, 0));
  134. AssertEquals('Find TMyObject exact', 1, L.FindInstanceOf(TMyObject, True, 0));
  135. AssertEquals('Find TObject inexact', 0, L.FindInstanceOf(TObject, False, 0));
  136. AssertEquals('Find TMyObject inexact from start', 1, L.FindInstanceOf(TMyObject, False, 0));
  137. finally
  138. L.Free;
  139. O1.Free;
  140. C1.Free;
  141. end;
  142. end;
  143. Function TObjectList_TestInsert : TTestString;
  144. var
  145. L: TObjectList;
  146. O1, O2, O3: TObject;
  147. begin
  148. Result:='';
  149. L := TObjectList.Create(False);
  150. try
  151. O1 := TObject.Create;
  152. O2 := TObject.Create;
  153. O3 := TObject.Create;
  154. L.Add(O1);
  155. L.Add(O2);
  156. L.Insert(1, O3);
  157. AssertEquals('Count should be 3 after inserting an object', 3, L.Count);
  158. AssertSame('Item at index 1 should be O3', O3, L.Items[1]);
  159. AssertSame('Item at index 2 should be O2', O2, L.Items[2]);
  160. finally
  161. L.Free;
  162. O1.Free;
  163. O2.Free;
  164. O3.Free;
  165. end;
  166. end;
  167. Function TObjectList_TestFirstLast : TTestString;
  168. var
  169. L: TObjectList;
  170. O1, O2: TObject;
  171. begin
  172. Result:='';
  173. L := TObjectList.Create(False);
  174. try
  175. O1 := TObject.Create;
  176. O2 := TObject.Create;
  177. L.Add(O1);
  178. L.Add(O2);
  179. AssertSame('First object should be O1', O1, L.First);
  180. AssertSame('Last object should be O2', O2, L.Last);
  181. finally
  182. L.Free;
  183. O1.Free;
  184. O2.Free;
  185. end;
  186. end;
  187. Function TObjectList_TestOwnsObjects : TTestString;
  188. var
  189. L: TObjectList;
  190. O1: TMyObject;
  191. Freed: Boolean;
  192. begin
  193. Result:='';
  194. L := TObjectList.Create(True);
  195. Freed := False;
  196. O1 := TMyObject.Create;
  197. O1.IsFreed := @Freed;
  198. L.Add(O1);
  199. L.Free; // This should free O1 as well
  200. AssertTrue('Object should be freed when OwnsObjects is true and list is freed', Freed);
  201. end;
  202. procedure RegisterTests;
  203. begin
  204. AddSuite('TObjectListTests');
  205. AddTest('TestCreate', @TObjectList_TestCreate, 'TObjectListTests');
  206. AddTest('TestAdd', @TObjectList_TestAdd, 'TObjectListTests');
  207. AddTest('TestExtract', @TObjectList_TestExtract, 'TObjectListTests');
  208. AddTest('TestRemove', @TObjectList_TestRemove, 'TObjectListTests');
  209. AddTest('TestIndexOf', @TObjectList_TestIndexOf, 'TObjectListTests');
  210. AddTest('TestFindInstanceOf', @TObjectList_TestFindInstanceOf, 'TObjectListTests');
  211. AddTest('TestInsert', @TObjectList_TestInsert, 'TObjectListTests');
  212. AddTest('TestFirstLast', @TObjectList_TestFirstLast, 'TObjectListTests');
  213. AddTest('TestOwnsObjects', @TObjectList_TestOwnsObjects, 'TObjectListTests');
  214. end;
  215. end.