utcstack.pp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. unit utcStack;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, contnrs, punit;
  6. procedure RegisterTests;
  7. implementation
  8. Function TStack_TestCreate : TTestString;
  9. var
  10. S: TStack;
  11. begin
  12. Result:='';
  13. S := TStack.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 TStack_TestPush : TTestString;
  22. var
  23. S: TStack;
  24. P1, P2, Res: Pointer;
  25. begin
  26. Result:='';
  27. S := TStack.Create;
  28. try
  29. P1 := Pointer(1);
  30. P2 := Pointer(2);
  31. Res := S.Push(P1);
  32. AssertEquals('Push should return the pushed item', P1, Res);
  33. AssertEquals('Count should be 1', 1, S.Count);
  34. AssertEquals('Peek should return the pushed item', P1, S.Peek);
  35. Res := S.Push(P2);
  36. AssertEquals('Push should return the pushed item', P2, Res);
  37. AssertEquals('Count should be 2', 2, S.Count);
  38. AssertEquals('Peek should return the last pushed item', P2, S.Peek);
  39. finally
  40. S.Free;
  41. end;
  42. end;
  43. Function TStack_TestPop : TTestString;
  44. var
  45. S: TStack;
  46. P1, P2, Res: Pointer;
  47. begin
  48. Result:='';
  49. S := TStack.Create;
  50. try
  51. P1 := Pointer(1);
  52. P2 := Pointer(2);
  53. S.Push(P1);
  54. S.Push(P2);
  55. Res := S.Pop;
  56. AssertEquals('Pop should return the last pushed item (LIFO)', P2, Res);
  57. AssertEquals('Count should be 1', 1, S.Count);
  58. Res := S.Pop;
  59. AssertEquals('Pop should return the first pushed item', P1, Res);
  60. AssertEquals('Count should be 0', 0, S.Count);
  61. Res := S.Pop;
  62. AssertEquals('Pop on an empty stack should return nil', nil, Res);
  63. finally
  64. S.Free;
  65. end;
  66. end;
  67. Function TStack_TestPeek : TTestString;
  68. var
  69. S: TStack;
  70. P1, P2: Pointer;
  71. begin
  72. Result:='';
  73. S := TStack.Create;
  74. try
  75. P1 := Pointer(1);
  76. P2 := Pointer(2);
  77. S.Push(P1);
  78. AssertEquals('Peek should return the pushed item', P1, S.Peek);
  79. AssertEquals('Count should still be 1 after Peek', 1, S.Count);
  80. S.Push(P2);
  81. AssertEquals('Peek should return the last pushed item', P2, S.Peek);
  82. AssertEquals('Count should still be 2 after Peek', 2, S.Count);
  83. S.Pop;
  84. AssertEquals('Peek should return the remaining item', P1, S.Peek);
  85. S.Pop;
  86. AssertEquals('Peek on an empty stack should return nil', nil, S.Peek);
  87. finally
  88. S.Free;
  89. end;
  90. end;
  91. procedure RegisterTests;
  92. begin
  93. AddSuite('TStackTests');
  94. AddTest('TestCreate', @TStack_TestCreate, 'TStackTests');
  95. AddTest('TestPush', @TStack_TestPush, 'TStackTests');
  96. AddTest('TestPop', @TStack_TestPop, 'TStackTests');
  97. AddTest('TestPeek', @TStack_TestPeek, 'TStackTests');
  98. end;
  99. end.