utccomponentlist.pp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. unit utcComponentList;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, contnrs, punit;
  6. procedure RegisterTests;
  7. implementation
  8. type
  9. TMyComponent = class(TComponent)
  10. public
  11. IsFreed: ^Boolean;
  12. constructor Create(AOwner: TComponent); override;
  13. destructor Destroy; override;
  14. end;
  15. constructor TMyComponent.Create(AOwner: TComponent);
  16. begin
  17. inherited Create(AOwner);
  18. IsFreed := nil;
  19. end;
  20. destructor TMyComponent.Destroy;
  21. begin
  22. if Assigned(IsFreed) then
  23. IsFreed^ := True;
  24. inherited Destroy;
  25. end;
  26. Function TComponentList_TestCreate : TTestString;
  27. var
  28. L: TComponentList;
  29. begin
  30. Result:='';
  31. L := TComponentList.Create;
  32. try
  33. AssertNotNull('List should be created', L);
  34. AssertEquals('Count should be 0 on creation', 0, L.Count);
  35. AssertTrue('OwnsObjects should be true by default', L.OwnsObjects);
  36. finally
  37. L.Free;
  38. end;
  39. end;
  40. Function TComponentList_TestAdd : TTestString;
  41. var
  42. L: TComponentList;
  43. C1, C2: TComponent;
  44. begin
  45. Result:='';
  46. L := TComponentList.Create(False);
  47. try
  48. C1 := TComponent.Create(nil);
  49. C2 := TComponent.Create(nil);
  50. L.Add(C1);
  51. AssertEquals('Count should be 1 after adding one component', 1, L.Count);
  52. AssertSame('First item should be C1', C1, L.Items[0]);
  53. L.Add(C2);
  54. AssertEquals('Count should be 2 after adding a second component', 2, L.Count);
  55. AssertSame('Second item should be C2', C2, L.Items[1]);
  56. finally
  57. L.Free;
  58. C1.Free;
  59. C2.Free;
  60. end;
  61. end;
  62. Function TComponentList_TestExtract : TTestString;
  63. var
  64. L: TComponentList;
  65. C1, C2, Extracted: TComponent;
  66. begin
  67. Result:='';
  68. L := TComponentList.Create(False);
  69. try
  70. C1 := TComponent.Create(nil);
  71. C2 := TComponent.Create(nil);
  72. L.Add(C1);
  73. L.Add(C2);
  74. Extracted := L.Extract(C1);
  75. AssertSame('Extracted component should be C1', C1, Extracted);
  76. AssertEquals('Count should be 1 after extracting a component', 1, L.Count);
  77. AssertSame('First item should now be C2', C2, L.Items[0]);
  78. finally
  79. L.Free;
  80. C1.Free;
  81. C2.Free;
  82. end;
  83. end;
  84. Function TComponentList_TestRemove : TTestString;
  85. var
  86. L: TComponentList;
  87. C1, C2: TComponent;
  88. begin
  89. Result:='';
  90. L := TComponentList.Create(False);
  91. try
  92. C1 := TComponent.Create(nil);
  93. C2 := TComponent.Create(nil);
  94. L.Add(C1);
  95. L.Add(C2);
  96. L.Remove(C1);
  97. AssertEquals('Count should be 1 after removing a component', 1, L.Count);
  98. AssertSame('First item should now be C2', C2, L.Items[0]);
  99. finally
  100. L.Free;
  101. C2.Free;
  102. end;
  103. end;
  104. Function TComponentList_TestIndexOf : TTestString;
  105. var
  106. L: TComponentList;
  107. C1, C2, C3: TComponent;
  108. begin
  109. Result:='';
  110. L := TComponentList.Create(False);
  111. C3 := TComponent.Create(nil);
  112. try
  113. C1 := TComponent.Create(nil);
  114. C2 := TComponent.Create(nil);
  115. L.Add(C1);
  116. L.Add(C2);
  117. AssertEquals('Index of C1 should be 0', 0, L.IndexOf(C1));
  118. AssertEquals('Index of C2 should be 1', 1, L.IndexOf(C2));
  119. AssertEquals('Index of a non-existent component should be -1', -1, L.IndexOf(C3));
  120. finally
  121. L.Free;
  122. C1.Free;
  123. C2.Free;
  124. C3.Free;
  125. end;
  126. end;
  127. Function TComponentList_TestInsert : TTestString;
  128. var
  129. L: TComponentList;
  130. C1, C2, C3: TComponent;
  131. begin
  132. Result:='';
  133. L := TComponentList.Create(False);
  134. try
  135. C1 := TComponent.Create(nil);
  136. C2 := TComponent.Create(nil);
  137. C3 := TComponent.Create(nil);
  138. L.Add(C1);
  139. L.Add(C2);
  140. L.Insert(1, C3);
  141. AssertEquals('Count should be 3 after inserting a component', 3, L.Count);
  142. AssertSame('Item at index 1 should be C3', C3, L.Items[1]);
  143. AssertSame('Item at index 2 should be C2', C2, L.Items[2]);
  144. finally
  145. L.Free;
  146. C1.Free;
  147. C2.Free;
  148. C3.Free;
  149. end;
  150. end;
  151. Function TComponentList_TestFirstLast : TTestString;
  152. var
  153. L: TComponentList;
  154. C1, C2: TComponent;
  155. begin
  156. Result:='';
  157. L := TComponentList.Create(False);
  158. try
  159. C1 := TComponent.Create(nil);
  160. C2 := TComponent.Create(nil);
  161. L.Add(C1);
  162. L.Add(C2);
  163. AssertSame('First component should be C1', C1, L.First);
  164. AssertSame('Last component should be C2', C2, L.Last);
  165. finally
  166. L.Free;
  167. C1.Free;
  168. C2.Free;
  169. end;
  170. end;
  171. Function TComponentList_TestOwnsObjects : TTestString;
  172. var
  173. L: TComponentList;
  174. C1: TMyComponent;
  175. Freed: Boolean;
  176. begin
  177. Result:='';
  178. L := TComponentList.Create(True);
  179. Freed := False;
  180. C1 := TMyComponent.Create(nil);
  181. C1.IsFreed := @Freed;
  182. L.Add(C1);
  183. L.Free; // This should free C1 as well
  184. AssertTrue('Component should be freed when OwnsObjects is true and list is freed', Freed);
  185. end;
  186. procedure RegisterTests;
  187. begin
  188. AddSuite('TComponentListTests');
  189. AddTest('TestCreate', @TComponentList_TestCreate, 'TComponentListTests');
  190. AddTest('TestAdd', @TComponentList_TestAdd, 'TComponentListTests');
  191. AddTest('TestExtract', @TComponentList_TestExtract, 'TComponentListTests');
  192. AddTest('TestRemove', @TComponentList_TestRemove, 'TComponentListTests');
  193. AddTest('TestIndexOf', @TComponentList_TestIndexOf, 'TComponentListTests');
  194. AddTest('TestInsert', @TComponentList_TestInsert, 'TComponentListTests');
  195. AddTest('TestFirstLast', @TComponentList_TestFirstLast, 'TComponentListTests');
  196. AddTest('TestOwnsObjects', @TComponentList_TestOwnsObjects, 'TComponentListTests');
  197. end;
  198. end.