285 lines
8.0 KiB

  1. //
  2. // Lol Engine
  3. //
  4. // Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net>
  5. // (c) 2013-2014 Benjamin "Touky" Huet <huet.benjamin@gmail.com>
  6. // (c) 2013-2014 Guillaume Bittoun <guillaume.bittoun@gmail.com>
  7. // This program is free software; you can redistribute it and/or
  8. // modify it under the terms of the Do What The Fuck You Want To
  9. // Public License, Version 2, as published by Sam Hocevar. See
  10. // http://www.wtfpl.net/ for more details.
  11. //
  12. #include <lol/engine-internal.h>
  13. #include <lolunit.h>
  14. namespace lol
  15. {
  16. class test_tree : public avl_tree<int, int>
  17. {
  18. public:
  19. virtual ~test_tree() {}
  20. int GetRootBalance()
  21. {
  22. return this->m_root->GetBalance();
  23. }
  24. };
  25. lolunit_declare_fixture(AvlTreeTest)
  26. {
  27. void SetUp() {}
  28. void TearDown() {}
  29. lolunit_declare_test(AvlTreeInsert)
  30. {
  31. test_tree tree;
  32. lolunit_assert_equal(tree.Insert(1, 1), true);
  33. lolunit_assert_equal(tree.Insert(2, 3), true);
  34. lolunit_assert_equal(tree.Insert(2, 0), false);
  35. }
  36. lolunit_declare_test(AvlTreeBalanceCheck)
  37. {
  38. test_tree tree;
  39. lolunit_assert_equal(tree.Insert(10, 1), true);
  40. lolunit_assert_equal(tree.GetRootBalance(), 0);
  41. lolunit_assert_equal(tree.Insert(20, 1), true);
  42. lolunit_assert_equal(tree.GetRootBalance(), 1);
  43. lolunit_assert_equal(tree.Insert(30, 1), true);
  44. lolunit_assert_equal(tree.GetRootBalance(), 0);
  45. lolunit_assert_equal(tree.Insert(00, 1), true);
  46. lolunit_assert_equal(tree.GetRootBalance(), -1);
  47. lolunit_assert_equal(tree.Insert(-10, 1), true);
  48. lolunit_assert_equal(tree.GetRootBalance(), -1);
  49. lolunit_assert_equal(tree.Insert(-20, 1), true);
  50. lolunit_assert_equal(tree.GetRootBalance(), 0);
  51. lolunit_assert_equal(tree.Insert(-20, 1), false);
  52. lolunit_assert_equal(tree.GetRootBalance(), 0);
  53. lolunit_assert_equal(tree.Insert(11, 1), true);
  54. lolunit_assert_equal(tree.GetRootBalance(), 1);
  55. lolunit_assert_equal(tree.Insert(13, 2), true);
  56. lolunit_assert_equal(tree.GetRootBalance(), 1);
  57. }
  58. lolunit_declare_test(AvlTreeDeletion)
  59. {
  60. test_tree tree;
  61. lolunit_assert_equal(tree.Insert(10, 1), true);
  62. lolunit_assert_equal(tree.GetRootBalance(), 0);
  63. lolunit_assert_equal(tree.Insert(20, 1), true);
  64. lolunit_assert_equal(tree.GetRootBalance(), 1);
  65. lolunit_assert_equal(tree.Insert(30, 1), true);
  66. lolunit_assert_equal(tree.GetRootBalance(), 0);
  67. lolunit_assert_equal(tree.GetCount(), 3);
  68. lolunit_assert_equal(tree.Erase(30), true);
  69. int test = 0;
  70. for (auto iterator : tree)
  71. {
  72. test += 10;
  73. lolunit_assert_equal(iterator.key, test);
  74. }
  75. lolunit_assert_equal(tree.GetCount(), 2);
  76. lolunit_assert_equal(tree.Insert(30, 1), true);
  77. lolunit_assert_equal(tree.Erase(20), true);
  78. lolunit_assert_equal(tree.Insert(20, 1), true);
  79. lolunit_assert_equal(tree.Exists(10), true);
  80. test = 0;
  81. for (auto iterator : tree)
  82. {
  83. test += 10;
  84. lolunit_assert_equal(iterator.key, test);
  85. }
  86. }
  87. lolunit_declare_test(AvlTreeExistence)
  88. {
  89. test_tree tree;
  90. lolunit_assert_equal(tree.Insert(10, 1), true);
  91. lolunit_assert_equal(tree.GetRootBalance(), 0);
  92. lolunit_assert_equal(tree.Insert(20, 1), true);
  93. lolunit_assert_equal(tree.GetRootBalance(), 1);
  94. lolunit_assert_equal(tree.Erase(10), true);
  95. lolunit_assert_equal(tree.Exists(20), true);
  96. lolunit_assert_equal(tree.Exists(10), false);
  97. lolunit_assert_equal(tree.Insert(10, 1), true);
  98. lolunit_assert_equal(tree.GetRootBalance(), -1);
  99. lolunit_assert_equal(tree.Insert(30, 1), true);
  100. lolunit_assert_equal(tree.GetRootBalance(), 0);
  101. lolunit_assert_equal(tree.Insert(40, 1), true);
  102. lolunit_assert_equal(tree.GetRootBalance(), 1);
  103. lolunit_assert_equal(tree.Insert(50, 1), true);
  104. lolunit_assert_equal(tree.GetRootBalance(), 1);
  105. lolunit_assert_equal(tree.Erase(30), true);
  106. lolunit_assert_equal(tree.Exists(40), true);
  107. lolunit_assert_equal(tree.Exists(50), true);
  108. }
  109. lolunit_declare_test(AvlTreeGetValue)
  110. {
  111. test_tree tree;
  112. lolunit_assert_equal(tree.Insert(10, 1), true);
  113. lolunit_assert_equal(tree.GetRootBalance(), 0);
  114. lolunit_assert_equal(tree.Insert(20, 1), true);
  115. lolunit_assert_equal(tree.GetRootBalance(), 1);
  116. lolunit_assert_equal(tree.Insert(30, 1), true);
  117. lolunit_assert_equal(tree.GetRootBalance(), 0);
  118. lolunit_assert_equal(tree.Insert(00, 1), true);
  119. lolunit_assert_equal(tree.GetRootBalance(), -1);
  120. lolunit_assert_equal(tree.Insert(-10, 1), true);
  121. lolunit_assert_equal(tree.GetRootBalance(), -1);
  122. lolunit_assert_equal(tree.Insert(-20, 1), true);
  123. lolunit_assert_equal(tree.GetRootBalance(), 0);
  124. lolunit_assert_equal(tree.Insert(-20, 1), false);
  125. lolunit_assert_equal(tree.GetRootBalance(), 0);
  126. lolunit_assert_equal(tree.Insert(11, 2), true);
  127. lolunit_assert_equal(tree.GetRootBalance(), 1);
  128. lolunit_assert_equal(tree.Insert(13, 3), true);
  129. lolunit_assert_equal(tree.GetRootBalance(), 1);
  130. int * value_ptr = nullptr;
  131. lolunit_assert_equal(tree.TryGetValue(-10, value_ptr), true);
  132. lolunit_assert_equal(*value_ptr, 1);
  133. lolunit_assert_equal(tree.TryGetValue(11, value_ptr), true);
  134. lolunit_assert_equal(*value_ptr, 2);
  135. lolunit_assert_equal(tree.TryGetValue(13, value_ptr), true);
  136. lolunit_assert_equal(*value_ptr, 3);
  137. lolunit_assert_equal(tree.TryGetValue(67, value_ptr), false);
  138. lolunit_assert_equal(*value_ptr, 3);
  139. }
  140. lolunit_declare_test(AvlTreeTestIteratorRead)
  141. {
  142. test_tree tree;
  143. for (int i = 1 ; i < 100 ; ++i)
  144. tree.Insert(i, 2 * i + i % 3);
  145. int tmp = 0;
  146. for (auto iterator : tree)
  147. {
  148. lolunit_assert_equal(iterator.key > tmp, true);
  149. lolunit_assert_equal(iterator.value == (iterator.key * 2 + iterator.key % 3), true);
  150. tmp = iterator.key;
  151. }
  152. lolunit_assert_equal(tree.GetCount(), 99);
  153. }
  154. lolunit_declare_test(AvlTreeTestIteratorCopy)
  155. {
  156. test_tree tree;
  157. for (int i = 1 ; i < 100 ; ++i)
  158. tree.Insert(i, 2 * i + i % 3);
  159. test_tree other = tree;
  160. int tmp = 0;
  161. for (auto iterator : other)
  162. {
  163. lolunit_assert_equal(iterator.key > tmp, true);
  164. lolunit_assert_equal(iterator.value == (iterator.key * 2 + iterator.key % 3), true);
  165. tmp = iterator.key;
  166. }
  167. lolunit_assert_equal(other.GetCount(), 99);
  168. }
  169. lolunit_declare_test(AvlTreeTestCopy)
  170. {
  171. avl_tree<int, int> test1, test2;
  172. for (int i = 0 ; i < 10 ; ++i)
  173. test1.Insert(i, 2*i);
  174. for (int i = 10 ; i < 15 ; ++i)
  175. test2.Insert(i, 3*i);
  176. lolunit_assert_equal(test1.GetCount(), 10);
  177. lolunit_assert_equal(test2.GetCount(), 5);
  178. int i = -1;
  179. for (auto iterator : test1)
  180. {
  181. ++i;
  182. lolunit_assert_equal(iterator.key, i);
  183. lolunit_assert_equal(iterator.value, 2*i);
  184. }
  185. for (auto iterator : test2)
  186. {
  187. ++i;
  188. lolunit_assert_equal(iterator.key, i);
  189. lolunit_assert_equal(iterator.value, 3*i);
  190. }
  191. test2 = test1;
  192. auto it1 = test1.begin();
  193. auto it2 = test2.begin();
  194. for ( ; it1 != test1.end() && it2 != test2.end() ; ++it1 , ++it2)
  195. {
  196. lolunit_assert_equal((*it1).key, (*it2).key);
  197. lolunit_assert_equal((*it1).value, (*it2).value);
  198. }
  199. lolunit_assert(!(it1 != test1.end()));
  200. lolunit_assert(!(it2 != test2.end()));
  201. lolunit_assert_equal(test1.GetCount(), 10);
  202. lolunit_assert_equal(test2.GetCount(), 10);
  203. }
  204. };
  205. }