utcobjectqueue.pp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. unit utcObjectQueue;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, contnrs, punit;
  6. procedure RegisterTests;
  7. implementation
  8. Function TObjectQueue_TestCreate : TTestString;
  9. var
  10. Q: TObjectQueue;
  11. begin
  12. Result:='';
  13. Q := TObjectQueue.Create;
  14. try
  15. AssertNotNull('Queue should be created', Q);
  16. AssertEquals('Count should be 0 on creation', 0, Q.Count);
  17. finally
  18. Q.Free;
  19. end;
  20. end;
  21. Function TObjectQueue_TestPush : TTestString;
  22. var
  23. Q: TObjectQueue;
  24. O1, O2, Res: TObject;
  25. begin
  26. Result:='';
  27. Q := TObjectQueue.Create;
  28. try
  29. O1 := TObject.Create;
  30. O2 := TObject.Create;
  31. Res := Q.Push(O1);
  32. AssertSame('Push should return the pushed object', O1, Res);
  33. AssertEquals('Count should be 1', 1, Q.Count);
  34. AssertSame('Peek should return the pushed object', O1, Q.Peek);
  35. Res := Q.Push(O2);
  36. AssertSame('Push should return the pushed object', O2, Res);
  37. AssertEquals('Count should be 2', 2, Q.Count);
  38. AssertSame('Peek should return the first pushed object', O1, Q.Peek);
  39. finally
  40. Q.Free;
  41. O1.Free;
  42. O2.Free;
  43. end;
  44. end;
  45. Function TObjectQueue_TestPop : TTestString;
  46. var
  47. Q: TObjectQueue;
  48. O1, O2, Res: TObject;
  49. begin
  50. Result:='';
  51. Q := TObjectQueue.Create;
  52. try
  53. O1 := TObject.Create;
  54. O2 := TObject.Create;
  55. Q.Push(O1);
  56. Q.Push(O2);
  57. Res := Q.Pop;
  58. AssertSame('Pop should return the first pushed object (FIFO)', O1, Res);
  59. AssertEquals('Count should be 1', 1, Q.Count);
  60. Res := Q.Pop;
  61. AssertSame('Pop should return the second pushed object', O2, Res);
  62. AssertEquals('Count should be 0', 0, Q.Count);
  63. Res := Q.Pop;
  64. AssertEquals('Pop on an empty queue should return nil', nil, Res);
  65. finally
  66. Q.Free;
  67. O1.Free;
  68. O2.Free;
  69. end;
  70. end;
  71. Function TObjectQueue_TestPeek : TTestString;
  72. var
  73. Q: TObjectQueue;
  74. O1, O2: TObject;
  75. begin
  76. Result:='';
  77. Q := TObjectQueue.Create;
  78. try
  79. O1 := TObject.Create;
  80. O2 := TObject.Create;
  81. Q.Push(O1);
  82. AssertSame('Peek should return the pushed object', O1, Q.Peek);
  83. AssertEquals('Count should still be 1 after Peek', 1, Q.Count);
  84. Q.Push(O2);
  85. AssertSame('Peek should return the first pushed object', O1, Q.Peek);
  86. AssertEquals('Count should still be 2 after Peek', 2, Q.Count);
  87. Q.Pop;
  88. AssertSame('Peek should return the remaining object', O2, Q.Peek);
  89. Q.Pop;
  90. AssertEquals('Peek on an empty queue should return nil', nil, Q.Peek);
  91. finally
  92. Q.Free;
  93. O1.Free;
  94. O2.Free;
  95. end;
  96. end;
  97. procedure RegisterTests;
  98. begin
  99. AddSuite('TObjectQueueTests');
  100. AddTest('TestCreate', @TObjectQueue_TestCreate, 'TObjectQueueTests');
  101. AddTest('TestPush', @TObjectQueue_TestPush, 'TObjectQueueTests');
  102. AddTest('TestPop', @TObjectQueue_TestPop, 'TObjectQueueTests');
  103. AddTest('TestPeek', @TObjectQueue_TestPeek, 'TObjectQueueTests');
  104. end;
  105. end.