tests.generics.trees.pas 5.4 KB

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