utcfpobjectlist.pp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. unit utcfpobjectlist;
  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 TFPObjectList_TestCreate : TTestString;
  20. var
  21. L: TFPObjectList;
  22. begin
  23. Result:='';
  24. L := TFPObjectList.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 TFPObjectList_TestAdd : TTestString;
  34. var
  35. L: TFPObjectList;
  36. O1, O2: TObject;
  37. begin
  38. Result:='';
  39. L := TFPObjectList.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 TFPObjectList_TestDelete : TTestString;
  56. var
  57. L: TFPObjectList;
  58. O1, O2: TObject;
  59. begin
  60. Result:='';
  61. L := TFPObjectList.Create(False);
  62. try
  63. O1 := TObject.Create;
  64. O2 := TObject.Create;
  65. L.Add(O1);
  66. L.Add(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 TFPObjectList_TestClear : TTestString;
  77. var
  78. L: TFPObjectList;
  79. O1, O2: TObject;
  80. begin
  81. Result:='';
  82. L := TFPObjectList.Create(False);
  83. try
  84. O1 := TObject.Create;
  85. O2 := TObject.Create;
  86. L.Add(O1);
  87. L.Add(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 TFPObjectList_TestIndexOf : TTestString;
  97. var
  98. L: TFPObjectList;
  99. O1, O2, O3: TObject;
  100. begin
  101. Result:='';
  102. L := TFPObjectList.Create(False);
  103. O3 := TObject.Create;
  104. try
  105. O1 := TObject.Create;
  106. O2 := TObject.Create;
  107. L.Add(O1);
  108. L.Add(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 TFPObjectList_TestRemove : TTestString;
  120. var
  121. L: TFPObjectList;
  122. O1, O2: TObject;
  123. begin
  124. Result:='';
  125. L := TFPObjectList.Create(False);
  126. try
  127. O1 := TObject.Create;
  128. O2 := TObject.Create;
  129. try
  130. L.Add(O1);
  131. L.Add(O2);
  132. L.Remove(O1);
  133. AssertEquals('Count should be 1 after removing an object', 1, L.Count);
  134. AssertSame('First item should now be O2', O2, L.Items[0]);
  135. finally
  136. O1.Free;
  137. O2.Free;
  138. end;
  139. finally
  140. L.Free;
  141. end;
  142. end;
  143. Function TFPObjectList_TestOwnsObjects : TTestString;
  144. var
  145. L: TFPObjectList;
  146. O1: TMyObject;
  147. Freed: Boolean;
  148. begin
  149. Result:='';
  150. L := TFPObjectList.Create(True);
  151. Freed := False;
  152. O1 := TMyObject.Create;
  153. O1.IsFreed := @Freed;
  154. L.Add(O1);
  155. L.Free; // This should free O1 as well
  156. AssertTrue('Object should be freed when OwnsObjects is true and list is freed', Freed);
  157. end;
  158. procedure RegisterTests;
  159. begin
  160. AddSuite('TFPObjectListTests');
  161. AddTest('TestCreate', @TFPObjectList_TestCreate, 'TFPObjectListTests');
  162. AddTest('TestAdd', @TFPObjectList_TestAdd, 'TFPObjectListTests');
  163. AddTest('TestDelete', @TFPObjectList_TestDelete, 'TFPObjectListTests');
  164. AddTest('TestClear', @TFPObjectList_TestClear, 'TFPObjectListTests');
  165. AddTest('TestIndexOf', @TFPObjectList_TestIndexOf, 'TFPObjectListTests');
  166. AddTest('TestRemove', @TFPObjectList_TestRemove, 'TFPObjectListTests');
  167. AddTest('TestOwnsObjects', @TFPObjectList_TestOwnsObjects, 'TFPObjectListTests');
  168. end;
  169. end.