You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

292 lines
8.9 KiB

  1. unit uutlStackTests;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, TestFramework, Contnrs,
  6. uTestHelper, uutlGenerics;
  7. type
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TIntStack = specialize TutlStack<Integer>;
  10. TIntfStack = specialize TutlStack<IUnknown>;
  11. TObjStack = specialize TutlStack<TObject>;
  12. TutlStackTests = class(TIntfObjOwner)
  13. private
  14. fIntStack: TIntStack;
  15. fIntfStack: TIntfStack;
  16. fObjStack: TObjStack;
  17. protected
  18. procedure SetUp; override;
  19. procedure TearDown; override;
  20. published
  21. procedure Prop_Count;
  22. procedure Prop_Empty;
  23. procedure Meth_Peek;
  24. procedure Meth_PushPop1000Times;
  25. procedure Meth_PushPop1000Items;
  26. procedure Meth_PushPop1000Items1000Times;
  27. procedure Meth_PushPop100Interfaces;
  28. procedure Meth_PushPop100_ObjectOwned_WithFree;
  29. procedure Meth_PushPop100_ObjectOwnedByStack_WithoutFree;
  30. procedure Meth_PushPop100_ObjectNotOwned_WithFree;
  31. procedure Meth_PushPop100_ObjectNotOwned_WithoutFree;
  32. procedure Enumerate;
  33. procedure Dtor_FreesAllItems;
  34. end;
  35. implementation
  36. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  37. //TutlStackTests////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. procedure TutlStackTests.SetUp;
  40. begin
  41. inherited SetUp;
  42. fIntStack := TIntStack.Create(true);
  43. fIntfStack := TIntfStack.Create(true);
  44. fObjStack := TObjStack.Create(true);
  45. end;
  46. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. procedure TutlStackTests.TearDown;
  48. begin
  49. FreeAndNil(fIntStack);
  50. FreeAndNil(fIntfStack);
  51. FreeAndNil(fObjStack);
  52. inherited TearDown;
  53. end;
  54. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. procedure TutlStackTests.Prop_Count;
  56. begin
  57. AssertEquals(0, fIntStack.Count);
  58. fIntStack.Push(123);
  59. AssertEquals(1, fIntStack.Count);
  60. fIntStack.Push(234);
  61. AssertEquals(2, fIntStack.Count);
  62. fIntStack.Push(345);
  63. AssertEquals(3, fIntStack.Count);
  64. fIntStack.Pop;
  65. AssertEquals(2, fIntStack.Count);
  66. fIntStack.Pop;
  67. AssertEquals(1, fIntStack.Count);
  68. fIntStack.Pop;
  69. AssertEquals(0, fIntStack.Count);
  70. end;
  71. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  72. procedure TutlStackTests.Prop_Empty;
  73. begin
  74. AssertEquals(true, fIntStack.IsEmpty);
  75. fIntStack.Push(345);
  76. AssertEquals(false, fIntStack.IsEmpty);
  77. fIntStack.Pop;
  78. AssertEquals(true, fIntStack.IsEmpty);
  79. end;
  80. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. procedure TutlStackTests.Meth_Peek;
  82. begin
  83. fIntStack.Push(123);
  84. AssertEquals(123, fIntStack.Peek);
  85. end;
  86. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87. procedure TutlStackTests.Meth_PushPop1000Times;
  88. var
  89. i, tmp: Integer;
  90. begin
  91. for i := 0 to 1000 do begin
  92. fIntStack.Push(i);
  93. tmp := fIntStack.Pop;
  94. AssertEquals(i, tmp);
  95. end;
  96. end;
  97. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. procedure TutlStackTests.Meth_PushPop1000Items;
  99. var
  100. i, tmp: Integer;
  101. begin
  102. for i := 0 to 1000 do
  103. fIntStack.Push(i);
  104. for i := 0 to 1000 do begin
  105. tmp := fIntStack.Pop;
  106. AssertEquals(1000-i, tmp);
  107. end;
  108. end;
  109. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  110. procedure TutlStackTests.Meth_PushPop1000Items1000Times;
  111. var
  112. i, j, tmp: Integer;
  113. begin
  114. for j := 0 to 1000 do begin
  115. for i := 0 to 1000 do
  116. fIntStack.Push(i);
  117. for i := 0 to 1000 do begin
  118. tmp := fIntStack.Pop;
  119. AssertEquals(1000-i, tmp);
  120. end;
  121. end;
  122. end;
  123. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  124. procedure TutlStackTests.Meth_PushPop100Interfaces;
  125. var
  126. i: Integer;
  127. begin
  128. for i := 0 to 100 do begin
  129. fIntfStack.Push(TIntfObj.Create(self));
  130. AssertEquals(i+1, IntfObjCounter);
  131. end;
  132. for i := 0 to 100 do begin
  133. fIntfStack.Pop;
  134. AssertEquals(100 - i, IntfObjCounter);
  135. end;
  136. end;
  137. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  138. procedure TutlStackTests.Meth_PushPop100_ObjectOwned_WithFree;
  139. var
  140. i: Integer;
  141. begin
  142. for i := 0 to 100 do begin
  143. fObjStack.Push(TIntfObj.Create(self));
  144. AssertEquals(i+1, IntfObjCounter);
  145. end;
  146. for i := 0 to 100 do begin
  147. AssertNull('Pop returned non-zero item', fObjStack.Pop(true));
  148. AssertEquals(100 - i, IntfObjCounter);
  149. end;
  150. end;
  151. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  152. procedure TutlStackTests.Meth_PushPop100_ObjectOwnedByStack_WithoutFree;
  153. var
  154. i: Integer;
  155. lst: TObjectList;
  156. obj: TObject;
  157. begin
  158. for i := 0 to 100 do begin
  159. fObjStack.Push(TIntfObj.Create(self));
  160. AssertEquals(i+1, IntfObjCounter);
  161. end;
  162. for i := 0 to 100 do begin
  163. fObjStack.Pop(true);
  164. AssertEquals(100 - i, IntfObjCounter);
  165. end;
  166. // free on Pop
  167. for i := 0 to 100 do begin
  168. fObjStack.Push(TIntfObj.Create(self));
  169. AssertEquals(i+1, IntfObjCounter);
  170. end;
  171. lst := TObjectList.Create(true);
  172. try
  173. for i := 0 to 100 do begin
  174. obj := fObjStack.Pop(false);
  175. AssertNotNull('Pop returned zero item', obj);
  176. lst.Add(obj);
  177. AssertEquals(101, IntfObjCounter);
  178. end;
  179. finally
  180. FreeAndNil(lst);
  181. end;
  182. end;
  183. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  184. procedure TutlStackTests.Meth_PushPop100_ObjectNotOwned_WithFree;
  185. var
  186. lst: TObjectList;
  187. obj: TObject;
  188. i: Integer;
  189. begin
  190. lst := TObjectList.Create(true);
  191. try
  192. for i := 0 to 100 do begin
  193. obj := TIntfObj.Create(self);
  194. lst.Add(obj);
  195. fObjStack.Push(obj);
  196. AssertEquals(i+1, IntfObjCounter);
  197. end;
  198. fObjStack.OwnsItems := false;
  199. for i := 0 to 100 do begin
  200. AssertNull('Pop returned non-zero item', fObjStack.Pop(true));
  201. AssertEquals(101, IntfObjCounter);
  202. end;
  203. finally
  204. FreeAndNil(lst);
  205. end;
  206. end;
  207. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  208. procedure TutlStackTests.Meth_PushPop100_ObjectNotOwned_WithoutFree;
  209. var
  210. lst: TObjectList;
  211. obj: TObject;
  212. i: Integer;
  213. begin
  214. lst := TObjectList.Create(true);
  215. try
  216. for i := 0 to 100 do begin
  217. obj := TIntfObj.Create(self);
  218. lst.Add(obj);
  219. fObjStack.Push(obj);
  220. AssertEquals(i+1, IntfObjCounter);
  221. end;
  222. fObjStack.OwnsItems := false;
  223. for i := 0 to 100 do begin
  224. AssertNotNull('Pop returned zero item', fObjStack.Pop(false));
  225. AssertEquals(101, IntfObjCounter);
  226. end;
  227. finally
  228. FreeAndNil(lst);
  229. end;
  230. end;
  231. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  232. procedure TutlStackTests.Enumerate;
  233. var
  234. e: TIntStack.IutlEnumerator;
  235. begin
  236. e := fIntStack.GetUtlEnumerator;
  237. fIntStack.Push(1);
  238. fIntStack.Push(2);
  239. fIntStack.Push(3);
  240. fIntStack.Push(4);
  241. fIntStack.Push(5);
  242. fIntStack[2] := 9;
  243. e.Reset;
  244. AssertTrue (e.MoveNext);
  245. AssertEquals(1, e.GetCurrent);
  246. AssertTrue (e.MoveNext);
  247. AssertEquals(2, e.GetCurrent);
  248. AssertTrue (e.MoveNext);
  249. AssertEquals(9, e.GetCurrent);
  250. AssertTrue (e.MoveNext);
  251. AssertEquals(4, e.GetCurrent);
  252. AssertTrue (e.MoveNext);
  253. AssertEquals(5, e.GetCurrent);
  254. AssertFalse (e.MoveNext);
  255. end;
  256. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  257. procedure TutlStackTests.Dtor_FreesAllItems;
  258. begin
  259. fObjStack.Push(TIntfObj.Create(self));
  260. FreeAndNil(fObjStack);
  261. AssertEquals(0, IntfObjCounter);
  262. end;
  263. initialization
  264. RegisterTest(TutlStackTests.Suite);
  265. end.