2
0

utcorderedlist.pp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. unit utcOrderedList;
  2. {$mode objfpc}{$H+}
  3. interface
  4. uses
  5. Classes, SysUtils, contnrs, punit;
  6. procedure RegisterTests;
  7. implementation
  8. type
  9. TConcreteOrderedList = class(TOrderedList)
  10. protected
  11. procedure PushItem(AItem: Pointer); override;
  12. end;
  13. procedure TConcreteOrderedList.PushItem(AItem: Pointer);
  14. begin
  15. List.Add(AItem);
  16. end;
  17. Function TOrderedList_TestCreate : TTestString;
  18. var
  19. L: TConcreteOrderedList;
  20. begin
  21. Result:='';
  22. L := TConcreteOrderedList.Create;
  23. try
  24. AssertNotNull('List should be created', L);
  25. AssertEquals('Count should be 0 on creation', 0, L.Count);
  26. finally
  27. L.Free;
  28. end;
  29. end;
  30. Function TOrderedList_TestCount : TTestString;
  31. var
  32. L: TConcreteOrderedList;
  33. P: Pointer;
  34. begin
  35. Result:='';
  36. L := TConcreteOrderedList.Create;
  37. try
  38. AssertEquals('Count should be 0 initially', 0, L.Count);
  39. P := Pointer(1);
  40. L.Push(P);
  41. AssertEquals('Count should be 1 after pushing one item', 1, L.Count);
  42. P := Pointer(2);
  43. L.Push(P);
  44. AssertEquals('Count should be 2 after pushing another item', 2, L.Count);
  45. L.Pop;
  46. AssertEquals('Count should be 1 after popping an item', 1, L.Count);
  47. finally
  48. L.Free;
  49. end;
  50. end;
  51. Function TOrderedList_TestAtLeast : TTestString;
  52. var
  53. L: TConcreteOrderedList;
  54. P: Pointer;
  55. begin
  56. Result:='';
  57. L := TConcreteOrderedList.Create;
  58. try
  59. AssertTrue('AtLeast(0) should be true for an empty list', L.AtLeast(0));
  60. AssertFalse('AtLeast(1) should be false for an empty list', L.AtLeast(1));
  61. P := Pointer(1);
  62. L.Push(P);
  63. AssertTrue('AtLeast(1) should be true for a list with one item', L.AtLeast(1));
  64. finally
  65. L.Free;
  66. end;
  67. end;
  68. Function TOrderedList_TestPush : TTestString;
  69. var
  70. L: TConcreteOrderedList;
  71. P1, P2, Res: Pointer;
  72. begin
  73. Result:='';
  74. L := TConcreteOrderedList.Create;
  75. try
  76. P1 := Pointer(1);
  77. P2 := Pointer(2);
  78. Res := L.Push(P1);
  79. AssertEquals('Push should return the pushed item', P1, Res);
  80. AssertEquals('Count should be 1', 1, L.Count);
  81. AssertEquals('Peek should return the pushed item', P1, L.Peek);
  82. Res := L.Push(P2);
  83. AssertEquals('Push should return the pushed item', P2, Res);
  84. AssertEquals('Count should be 2', 2, L.Count);
  85. AssertEquals('Peek should return the last pushed item', P2, L.Peek);
  86. finally
  87. L.Free;
  88. end;
  89. end;
  90. Function TOrderedList_TestPop : TTestString;
  91. var
  92. L: TConcreteOrderedList;
  93. P1, P2, Res: Pointer;
  94. begin
  95. Result:='';
  96. L := TConcreteOrderedList.Create;
  97. try
  98. P1 := Pointer(1);
  99. P2 := Pointer(2);
  100. L.Push(P1);
  101. L.Push(P2);
  102. Res := L.Pop;
  103. AssertEquals('Pop should return the last pushed item', P2, Res);
  104. AssertEquals('Count should be 1', 1, L.Count);
  105. Res := L.Pop;
  106. AssertEquals('Pop should return the first pushed item', P1, Res);
  107. AssertEquals('Count should be 0', 0, L.Count);
  108. Res := L.Pop;
  109. AssertEquals('Pop on an empty list should return nil', nil, Res);
  110. finally
  111. L.Free;
  112. end;
  113. end;
  114. Function TOrderedList_TestPeek : TTestString;
  115. var
  116. L: TConcreteOrderedList;
  117. P1, P2: Pointer;
  118. begin
  119. Result:='';
  120. L := TConcreteOrderedList.Create;
  121. try
  122. P1 := Pointer(1);
  123. P2 := Pointer(2);
  124. L.Push(P1);
  125. AssertEquals('Peek should return the pushed item', P1, L.Peek);
  126. AssertEquals('Count should still be 1 after Peek', 1, L.Count);
  127. L.Push(P2);
  128. AssertEquals('Peek should return the last pushed item', P2, L.Peek);
  129. AssertEquals('Count should still be 2 after Peek', 2, L.Count);
  130. L.Pop;
  131. AssertEquals('Peek should return the remaining item', P1, L.Peek);
  132. L.Pop;
  133. AssertEquals('Peek on an empty list should return nil', nil, L.Peek);
  134. finally
  135. L.Free;
  136. end;
  137. end;
  138. procedure RegisterTests;
  139. begin
  140. AddSuite('TOrderedListTests');
  141. AddTest('TestCreate', @TOrderedList_TestCreate, 'TOrderedListTests');
  142. AddTest('TestCount', @TOrderedList_TestCount, 'TOrderedListTests');
  143. AddTest('TestAtLeast', @TOrderedList_TestAtLeast, 'TOrderedListTests');
  144. AddTest('TestPush', @TOrderedList_TestPush, 'TOrderedListTests');
  145. AddTest('TestPop', @TOrderedList_TestPop, 'TOrderedListTests');
  146. AddTest('TestPeek', @TOrderedList_TestPeek, 'TOrderedListTests');
  147. end;
  148. end.