tests.generics.trees.pas 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2018 by Maciej Izak (hnb),
  4. member of the Free Pascal development team
  5. It contains tests for the Free Pascal generics library
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. Acknowledgment
  12. Thanks to Sphere 10 Software (http://sphere10.com) for sponsoring
  13. many new types, tests and major refactoring of entire library
  14. **********************************************************************}
  15. unit tests.generics.trees;
  16. {$mode delphi}
  17. interface
  18. uses
  19. fpcunit, testregistry, testutils, tests.generics.utils,
  20. Classes, SysUtils, Generics.Collections;
  21. type
  22. { TTestArrayHelper }
  23. { TTestTrees }
  24. TTestTrees = class(TTestCollections)
  25. published
  26. procedure Test_IndexedAVLTree_Add_General;
  27. procedure Test_IndexedAVLTree_Add;
  28. procedure Test_IndexedAVLTree_Delete;
  29. procedure Test_TAVLTreeMap_Notification;
  30. end;
  31. implementation
  32. type
  33. TStringsTree = TIndexedAVLTree<string>;
  34. { TTestTrees }
  35. procedure TTestTrees.Test_IndexedAVLTree_Add_General;
  36. const
  37. _COUNT = 999;
  38. var
  39. LNumbers: THashSet<Integer>;
  40. i, j: Integer;
  41. LTree: TStringsTree;
  42. LNodes: TList<TStringsTree.PNode>;
  43. n: TStringsTree.PNode;
  44. begin
  45. LNumbers := THashSet<Integer>.Create;
  46. LTree := TStringsTree.Create;
  47. LNodes := TList<TStringsTree.PNode>.Create;
  48. try
  49. // check consistency of adding new nodes to Indexed AVL
  50. for i := 0 to _COUNT do
  51. begin
  52. LNodes.Add(LTree.Add('0'+i.ToString));
  53. LNumbers.Clear;
  54. for n in LTree.Nodes do
  55. Check(LNumbers.Add(LTree.NodeToIndex(n)), 'Wrong index (duplicate) of '+ i.ToString + ' for node ' + n.Key);
  56. for j := 0 to LNodes.Count - 1 do
  57. Check(LNumbers.Contains(j), 'Missing index ' + j.ToString + ' for i = ' + i.ToString);
  58. LTree.ConsistencyCheck;
  59. CheckEquals(i+1, LTree.Count, 'Wrong tree count');
  60. end;
  61. finally
  62. LNodes.Free;
  63. LTree.Free;
  64. LNumbers.Free;
  65. end;
  66. end;
  67. procedure TTestTrees.Test_IndexedAVLTree_Add;
  68. var
  69. LTree: TStringsTree;
  70. begin
  71. LTree := TStringsTree.Create;
  72. try
  73. LTree.Duplicates:=dupAccept;
  74. LTree.Add('Aaa');
  75. finally
  76. LTree.Free;
  77. end;
  78. end;
  79. procedure TTestTrees.Test_IndexedAVLTree_Delete;
  80. const
  81. _COUNT = 999;
  82. var
  83. LNumbers: THashSet<Integer>;
  84. i, j: Integer;
  85. LTree: TStringsTree;
  86. LNodes: TList<TStringsTree.PNode>;
  87. n: TStringsTree.PNode;
  88. begin
  89. LNumbers := THashSet<Integer>.Create;
  90. LTree := TStringsTree.Create;
  91. LNodes := TList<TStringsTree.PNode>.Create;
  92. try
  93. for i := 0 to _COUNT do
  94. LNodes.Add(LTree.Add('0'+i.ToString));
  95. // check consistency of deleting nodes from Indexed AVL
  96. for i := 0 to _COUNT do
  97. begin
  98. LTree.Delete(LNodes.ExtractIndex(Random(LNodes.count)));
  99. LNumbers.Clear;
  100. for n in LTree.Nodes do
  101. Check(LNumbers.Add(LTree.NodeToIndex(n)), 'Wrong index (duplicate) of '+ i.ToString + ' for node ' + n.Key);
  102. for j := 0 to LNodes.Count - 1 do
  103. Check(LNumbers.Contains(j), 'Missing index ' + j.ToString + ' for i = ' + i.ToString);
  104. LTree.ConsistencyCheck;
  105. CheckEquals(_COUNT-i, LTree.Count, 'Wrong tree count');
  106. end;
  107. finally
  108. LNodes.Free;
  109. LTree.Free;
  110. LNumbers.Free;
  111. end;
  112. end;
  113. procedure TTestTrees.Test_TAVLTreeMap_Notification;
  114. var
  115. LTree: TAVLTreeMap<string, string>;
  116. LNode, LA, LC: TAVLTreeMap<string, string>.PNode;
  117. begin
  118. LTree := TAVLTreeMap<string, string>.Create;
  119. LTree.OnKeyNotify := NotifyTestStr;
  120. LTree.OnValueNotify := NotifyTestStr;
  121. LTree.OnNodeNotify := NotifyTestNodeStr;
  122. try
  123. // simple add
  124. NotificationAdd(LTree, ['Aaa', 'Bbb'], cnAdded);
  125. NotificationAdd(LTree, 'Aaa', 'Bbb', nil, cnAdded, false, true);
  126. LA := LTree.Add('Aaa', 'Bbb');
  127. AssertNotificationsExecutedNodeStr;
  128. AssertNotificationsExecutedStr;
  129. // pair add
  130. NotificationAdd(LTree, ['Ccc', 'Ddd'], cnAdded);
  131. NotificationAdd(LTree, 'Ccc', 'Ddd', nil, cnAdded, false, true);
  132. LC := LTree.Add(TAVLTreeMap<string, string>.TTreePair.Create('Ccc', 'Ddd'));
  133. AssertNotificationsExecutedNodeStr;
  134. AssertNotificationsExecutedStr;
  135. // AddNode;
  136. LNode := LTree.NewNode;
  137. LNode.Key := 'Eee';
  138. LNode.Value := 'Fff';
  139. NotificationAdd(LTree, ['Eee', 'Fff'], cnAdded);
  140. NotificationAdd(LTree, 'Eee', 'Fff', LNode, cnAdded, false, false);
  141. AssertTrue(LTree.AddNode(LNode));
  142. AssertNotificationsExecutedNodeStr;
  143. AssertNotificationsExecutedStr;
  144. // Delete
  145. NotificationAdd(LTree, ['Eee', 'Fff'], cnRemoved);
  146. NotificationAdd(LTree, 'Eee', 'Fff', LNode, cnRemoved, false, false);
  147. LTree.Delete(LNode, false);
  148. AssertNotificationsExecutedNodeStr;
  149. AssertNotificationsExecutedStr;
  150. LTree.DisposeNode(LNode);
  151. // remove
  152. NotificationAdd(LTree, ['Aaa', 'Bbb'], cnRemoved);
  153. NotificationAdd(LTree, 'Aaa', 'Bbb', LA, cnRemoved, true, false);
  154. LTree.Remove('Aaa');
  155. AssertNotificationsExecutedNodeStr;
  156. AssertNotificationsExecutedStr;
  157. // free
  158. NotificationAdd(LTree, ['Ccc', 'Ddd'], cnRemoved);
  159. NotificationAdd(LTree, 'Ccc', 'Ddd', LC, cnRemoved, true, false);
  160. finally
  161. LTree.Free;
  162. AssertNotificationsExecutedNodeStr;
  163. AssertNotificationsExecutedStr;
  164. end;
  165. end;
  166. begin
  167. RegisterTest(TTestTrees);
  168. end.