utcobjectstack.pp 2.8 KB

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