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.

290 lines
9.0 KiB

  1. unit uutlQueueTests;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, TestFramework, contnrs, uTestHelper,
  6. uutlGenerics;
  7. type
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. TIntQueue = specialize TutlQueue<Integer>;
  10. TIntfQueue = specialize TutlQueue<IUnknown>;
  11. TObjQueue = specialize TutlQueue<TObject>;
  12. TutlQueueTests = class(TIntfObjOwner)
  13. private
  14. fIntQueue: TIntQueue;
  15. fIntfQueue: TIntfQueue;
  16. fObjQueue: TObjQueue;
  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_EnqueueDequeue1000Times;
  25. procedure Meth_EnqueueDequeue1000Items;
  26. procedure Meth_EnqueueDequeue1000Items1000Times;
  27. procedure Meth_EnqueueDequeue100Interfaces;
  28. procedure Meth_EnqueueDequeue100_ObjectOwned_WithFree;
  29. procedure Meth_EnqueueDequeue100_ObjectOwned_WithoutFree;
  30. procedure Meth_EnqueueDequeue100_ObjectNotOwned_WithFree;
  31. procedure Meth_EnqueueDequeue100_ObjectNotOwned_WithoutFree;
  32. procedure Enumerate;
  33. procedure Dtor_FreesAllItems;
  34. end;
  35. implementation
  36. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  37. //TutlQueueTests////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. procedure TutlQueueTests.SetUp;
  40. begin
  41. inherited SetUp;
  42. fIntQueue := TIntQueue.Create(true);
  43. fIntfQueue := TIntfQueue.Create(true);
  44. fObjQueue := TObjQueue.Create(true);
  45. end;
  46. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. procedure TutlQueueTests.TearDown;
  48. begin
  49. FreeAndNil(fIntQueue);
  50. FreeAndNil(fIntfQueue);
  51. FreeAndNil(fObjQueue);
  52. inherited TearDown;
  53. end;
  54. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. procedure TutlQueueTests.Prop_Count;
  56. begin
  57. AssertEquals(0, fIntQueue.Count);
  58. fIntQueue.Enqueue(123);
  59. AssertEquals(1, fIntQueue.Count);
  60. fIntQueue.Enqueue(234);
  61. AssertEquals(2, fIntQueue.Count);
  62. fIntQueue.Enqueue(345);
  63. AssertEquals(3, fIntQueue.Count);
  64. fIntQueue.Dequeue;
  65. AssertEquals(2, fIntQueue.Count);
  66. fIntQueue.Dequeue;
  67. AssertEquals(1, fIntQueue.Count);
  68. fIntQueue.Dequeue;
  69. AssertEquals(0, fIntQueue.Count);
  70. end;
  71. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  72. procedure TutlQueueTests.Prop_Empty;
  73. begin
  74. AssertEquals(true, fIntQueue.IsEmpty);
  75. fIntQueue.Enqueue(345);
  76. AssertEquals(false, fIntQueue.IsEmpty);
  77. fIntQueue.Dequeue;
  78. AssertEquals(true, fIntQueue.IsEmpty);
  79. end;
  80. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. procedure TutlQueueTests.Meth_Peek;
  82. begin
  83. fIntQueue.Enqueue(123);
  84. AssertEquals(123, fIntQueue.Peek);
  85. end;
  86. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87. procedure TutlQueueTests.Meth_EnqueueDequeue1000Times;
  88. var
  89. i, tmp: Integer;
  90. begin
  91. for i := 0 to 1000 do begin
  92. fIntQueue.Enqueue(i);
  93. tmp := fIntQueue.Dequeue;
  94. AssertEquals(i, tmp);
  95. end;
  96. end;
  97. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. procedure TutlQueueTests.Meth_EnqueueDequeue1000Items;
  99. var
  100. i, tmp: Integer;
  101. begin
  102. for i := 0 to 1000 do
  103. fIntQueue.Enqueue(i);
  104. for i := 0 to 1000 do begin
  105. tmp := fIntQueue.Dequeue;
  106. AssertEquals(i, tmp);
  107. end;
  108. end;
  109. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  110. procedure TutlQueueTests.Meth_EnqueueDequeue1000Items1000Times;
  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. fIntQueue.Enqueue(i);
  117. for i := 0 to 1000 do begin
  118. tmp := fIntQueue.Dequeue;
  119. AssertEquals(i, tmp);
  120. end;
  121. end;
  122. end;
  123. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  124. procedure TutlQueueTests.Meth_EnqueueDequeue100Interfaces;
  125. var
  126. i: Integer;
  127. begin
  128. for i := 0 to 100 do begin
  129. fIntfQueue.Enqueue(TIntfObj.Create(self));
  130. AssertEquals(i+1, IntfObjCounter);
  131. end;
  132. for i := 0 to 100 do begin
  133. fIntfQueue.Dequeue;
  134. AssertEquals(100 - i, IntfObjCounter);
  135. end;
  136. end;
  137. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  138. procedure TutlQueueTests.Meth_EnqueueDequeue100_ObjectOwned_WithFree;
  139. var
  140. i: Integer;
  141. begin
  142. for i := 0 to 100 do begin
  143. fObjQueue.Enqueue(TIntfObj.Create(self));
  144. AssertEquals(i+1, IntfObjCounter);
  145. end;
  146. for i := 0 to 100 do begin
  147. AssertNull('dequeue returned non-zero item', fObjQueue.Dequeue(true));
  148. AssertEquals(100 - i, IntfObjCounter);
  149. end;
  150. end;
  151. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  152. procedure TutlQueueTests.Meth_EnqueueDequeue100_ObjectOwned_WithoutFree;
  153. var
  154. i: Integer;
  155. lst: TObjectList;
  156. obj: TObject;
  157. begin
  158. for i := 0 to 100 do begin
  159. fObjQueue.Enqueue(TIntfObj.Create(self));
  160. AssertEquals(i+1, IntfObjCounter);
  161. end;
  162. for i := 0 to 100 do begin
  163. fObjQueue.Dequeue(true);
  164. AssertEquals(100 - i, IntfObjCounter);
  165. end;
  166. // free on dequeue
  167. for i := 0 to 100 do begin
  168. fObjQueue.Enqueue(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 := fObjQueue.Dequeue(false);
  175. AssertNotNull('dequeue 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 TutlQueueTests.Meth_EnqueueDequeue100_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. fObjQueue.Enqueue(obj);
  196. AssertEquals(i+1, IntfObjCounter);
  197. end;
  198. fObjQueue.OwnsItems := false;
  199. for i := 0 to 100 do begin
  200. AssertNull('dequeue returned non-zero item', fObjQueue.Dequeue(true));
  201. AssertEquals(101, IntfObjCounter);
  202. end;
  203. finally
  204. FreeAndNil(lst);
  205. end;
  206. end;
  207. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  208. procedure TutlQueueTests.Meth_EnqueueDequeue100_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. fObjQueue.Enqueue(obj);
  220. AssertEquals(i+1, IntfObjCounter);
  221. end;
  222. fObjQueue.OwnsItems := false;
  223. for i := 0 to 100 do begin
  224. AssertNotNull('dequeue returned zero item', fObjQueue.Dequeue(false));
  225. AssertEquals(101, IntfObjCounter);
  226. end;
  227. finally
  228. FreeAndNil(lst);
  229. end;
  230. end;
  231. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  232. procedure TutlQueueTests.Enumerate;
  233. var
  234. e: TIntQueue.IutlEnumerator;
  235. begin
  236. e := fIntQueue.GetUtlEnumerator;
  237. fIntQueue.Enqueue(1);
  238. fIntQueue.Enqueue(2);
  239. fIntQueue.Enqueue(3);
  240. fIntQueue.Enqueue(4);
  241. fIntQueue.Enqueue(5);
  242. fIntQueue.Dequeue;
  243. fIntQueue.Dequeue;
  244. fIntQueue[1] := 9;
  245. e.Reset;
  246. AssertTrue (e.MoveNext);
  247. AssertEquals(3, e.GetCurrent);
  248. AssertTrue (e.MoveNext);
  249. AssertEquals(9, e.GetCurrent);
  250. AssertTrue (e.MoveNext);
  251. AssertEquals(5, e.GetCurrent);
  252. AssertFalse (e.MoveNext);
  253. end;
  254. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  255. procedure TutlQueueTests.Dtor_FreesAllItems;
  256. begin
  257. fObjQueue.Enqueue(TIntfObj.Create(self));
  258. FreeAndNil(fObjQueue);
  259. AssertEquals(0, IntfObjCounter);
  260. end;
  261. initialization
  262. RegisterTest(TutlQueueTests.Suite);
  263. end.