NestedTreePositionTest.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <?php
  2. namespace Gedmo\Tree;
  3. use Doctrine\Common\EventManager;
  4. use Tool\BaseTestCaseORM;
  5. use Tree\Fixture\Category;
  6. use Tree\Fixture\RootCategory;
  7. /**
  8. * These are tests for Tree behavior
  9. *
  10. * @author Gediminas Morkevicius <gediminas.morkevicius@gmail.com>
  11. * @package Gedmo.Tree
  12. * @link http://www.gediminasm.org
  13. * @license MIT License (http://www.opensource.org/licenses/mit-license.php)
  14. */
  15. class NestedTreePositionTest extends BaseTestCaseORM
  16. {
  17. const CATEGORY = "Tree\\Fixture\\Category";
  18. const ROOT_CATEGORY = "Tree\\Fixture\\RootCategory";
  19. protected function setUp()
  20. {
  21. parent::setUp();
  22. $evm = new EventManager;
  23. $evm->addEventSubscriber(new TreeListener);
  24. $this->getMockSqliteEntityManager($evm);
  25. }
  26. public function testPositionedUpdates()
  27. {
  28. $this->populate();
  29. $repo = $this->em->getRepository(self::ROOT_CATEGORY);
  30. $citrons = $repo->findOneByTitle('Citrons');
  31. $vegitables = $repo->findOneByTitle('Vegitables');
  32. $repo->persistAsNextSiblingOf($vegitables, $citrons);
  33. $this->em->flush();
  34. $this->assertEquals(5, $vegitables->getLeft());
  35. $this->assertEquals(6, $vegitables->getRight());
  36. $this->assertEquals(2, $vegitables->getParent()->getId());
  37. $fruits = $repo->findOneByTitle('Fruits');
  38. $this->assertEquals(2, $fruits->getLeft());
  39. $this->assertEquals(9, $fruits->getRight());
  40. $milk = $repo->findOneByTitle('Milk');
  41. $repo->persistAsFirstChildOf($milk, $fruits);
  42. $this->em->flush();
  43. $this->assertEquals(3, $milk->getLeft());
  44. $this->assertEquals(4, $milk->getRight());
  45. $this->assertEquals(2, $fruits->getLeft());
  46. $this->assertEquals(11, $fruits->getRight());
  47. }
  48. public function testOnRootCategory()
  49. {
  50. // need to check if this does not produce errors
  51. $repo = $this->em->getRepository(self::ROOT_CATEGORY);
  52. $fruits = new RootCategory;
  53. $fruits->setTitle('Fruits');
  54. $vegitables = new RootCategory;
  55. $vegitables->setTitle('Vegitables');
  56. $milk = new RootCategory;
  57. $milk->setTitle('Milk');
  58. $meat = new RootCategory;
  59. $meat->setTitle('Meat');
  60. $repo
  61. ->persistAsFirstChild($fruits)
  62. ->persistAsFirstChild($vegitables)
  63. ->persistAsLastChild($milk)
  64. ->persistAsLastChild($meat);
  65. $cookies = new RootCategory;
  66. $cookies->setTitle('Cookies');
  67. $drinks = new RootCategory;
  68. $drinks->setTitle('Drinks');
  69. $repo
  70. ->persistAsNextSibling($cookies)
  71. ->persistAsPrevSibling($drinks);
  72. $this->em->flush();
  73. $dql = 'SELECT COUNT(c) FROM ' . self::ROOT_CATEGORY . ' c';
  74. $dql .= ' WHERE c.lft = 1 AND c.rgt = 2 AND c.parent IS NULL AND c.level = 0';
  75. $count = $this->em->createQuery($dql)->getSingleScalarResult();
  76. $this->assertEquals(6, $count);
  77. $repo = $this->em->getRepository(self::CATEGORY);
  78. $fruits = new Category;
  79. $fruits->setTitle('Fruits');
  80. $vegitables = new Category;
  81. $vegitables->setTitle('Vegitables');
  82. $milk = new Category;
  83. $milk->setTitle('Milk');
  84. $meat = new Category;
  85. $meat->setTitle('Meat');
  86. $repo
  87. ->persistAsFirstChild($fruits)
  88. ->persistAsFirstChild($vegitables)
  89. ->persistAsLastChild($milk)
  90. ->persistAsLastChild($meat);
  91. $cookies = new Category;
  92. $cookies->setTitle('Cookies');
  93. $drinks = new Category;
  94. $drinks->setTitle('Drinks');
  95. $repo
  96. ->persistAsNextSibling($cookies)
  97. ->persistAsPrevSibling($drinks);
  98. $this->em->flush();
  99. $dql = 'SELECT COUNT(c) FROM ' . self::CATEGORY . ' c';
  100. $dql .= ' WHERE c.parentId IS NULL AND c.level = 0';
  101. $dql .= ' AND c.lft BETWEEN 1 AND 11';
  102. $count = $this->em->createQuery($dql)->getSingleScalarResult();
  103. $this->assertEquals(6, $count);
  104. }
  105. public function testRootTreePositionedInserts()
  106. {
  107. $repo = $this->em->getRepository(self::ROOT_CATEGORY);
  108. // test child positioned inserts
  109. $food = new RootCategory;
  110. $food->setTitle('Food');
  111. $fruits = new RootCategory;
  112. $fruits->setTitle('Fruits');
  113. $vegitables = new RootCategory;
  114. $vegitables->setTitle('Vegitables');
  115. $milk = new RootCategory;
  116. $milk->setTitle('Milk');
  117. $meat = new RootCategory;
  118. $meat->setTitle('Meat');
  119. $repo
  120. ->persistAsFirstChild($food)
  121. ->persistAsFirstChildOf($fruits, $food)
  122. ->persistAsFirstChildOf($vegitables, $food)
  123. ->persistAsLastChildOf($milk, $food)
  124. ->persistAsLastChildOf($meat, $food);
  125. $this->em->flush();
  126. $this->assertEquals(4, $fruits->getLeft());
  127. $this->assertEquals(5, $fruits->getRight());
  128. $this->assertEquals(2, $vegitables->getLeft());
  129. $this->assertEquals(3, $vegitables->getRight());
  130. $this->assertEquals(6, $milk->getLeft());
  131. $this->assertEquals(7, $milk->getRight());
  132. $this->assertEquals(8, $meat->getLeft());
  133. $this->assertEquals(9, $meat->getRight());
  134. // test sibling positioned inserts
  135. $cookies = new RootCategory;
  136. $cookies->setTitle('Cookies');
  137. $drinks = new RootCategory;
  138. $drinks->setTitle('Drinks');
  139. $repo
  140. ->persistAsNextSiblingOf($cookies, $milk)
  141. ->persistAsPrevSiblingOf($drinks, $milk);
  142. $this->em->flush();
  143. $this->assertEquals(6, $drinks->getLeft());
  144. $this->assertEquals(7, $drinks->getRight());
  145. $this->assertEquals(10, $cookies->getLeft());
  146. $this->assertEquals(11, $cookies->getRight());
  147. $this->assertTrue($repo->verify());
  148. }
  149. public function testSimpleTreePositionedInserts()
  150. {
  151. $repo = $this->em->getRepository(self::CATEGORY);
  152. // test child positioned inserts
  153. $food = new Category;
  154. $food->setTitle('Food');
  155. $repo->persistAsFirstChild($food);
  156. $fruits = new Category;
  157. $fruits->setTitle('Fruits');
  158. $fruits->setParent($food);
  159. $repo->persistAsFirstChild($fruits);
  160. $vegitables = new Category;
  161. $vegitables->setTitle('Vegitables');
  162. $vegitables->setParent($food);
  163. $repo->persistAsFirstChild($vegitables);
  164. $milk = new Category;
  165. $milk->setTitle('Milk');
  166. $milk->setParent($food);
  167. $repo->persistAsLastChild($milk);
  168. $meat = new Category;
  169. $meat->setTitle('Meat');
  170. $meat->setParent($food);
  171. $repo->persistAsLastChild($meat);
  172. $this->em->flush();
  173. $this->assertEquals(4, $fruits->getLeft());
  174. $this->assertEquals(5, $fruits->getRight());
  175. $this->assertEquals(2, $vegitables->getLeft());
  176. $this->assertEquals(3, $vegitables->getRight());
  177. $this->assertEquals(6, $milk->getLeft());
  178. $this->assertEquals(7, $milk->getRight());
  179. $this->assertEquals(8, $meat->getLeft());
  180. $this->assertEquals(9, $meat->getRight());
  181. // test sibling positioned inserts
  182. $cookies = new Category;
  183. $cookies->setTitle('Cookies');
  184. $cookies->setParent($milk);
  185. $repo->persistAsNextSibling($cookies);
  186. $drinks = new Category;
  187. $drinks->setTitle('Drinks');
  188. $drinks->setParent($milk);
  189. $repo->persistAsPrevSibling($drinks);
  190. $this->em->flush();
  191. $this->assertEquals(6, $drinks->getLeft());
  192. $this->assertEquals(7, $drinks->getRight());
  193. $this->assertEquals(10, $cookies->getLeft());
  194. $this->assertEquals(11, $cookies->getRight());
  195. $this->assertTrue($repo->verify());
  196. }
  197. private function populate()
  198. {
  199. $repo = $this->em->getRepository(self::ROOT_CATEGORY);
  200. $food = new RootCategory;
  201. $food->setTitle('Food');
  202. $fruits = new RootCategory;
  203. $fruits->setTitle('Fruits');
  204. $vegitables = new RootCategory;
  205. $vegitables->setTitle('Vegitables');
  206. $milk = new RootCategory;
  207. $milk->setTitle('Milk');
  208. $meat = new RootCategory;
  209. $meat->setTitle('Meat');
  210. $oranges = new RootCategory;
  211. $oranges->setTitle('Oranges');
  212. $citrons = new RootCategory;
  213. $citrons->setTitle('Citrons');
  214. $repo
  215. ->persistAsFirstChild($food)
  216. ->persistAsFirstChildOf($fruits, $food)
  217. ->persistAsFirstChildOf($vegitables, $food)
  218. ->persistAsLastChildOf($milk, $food)
  219. ->persistAsLastChildOf($meat, $food)
  220. ->persistAsFirstChildOf($oranges, $fruits)
  221. ->persistAsFirstChildOf($citrons, $fruits);
  222. $this->em->flush();
  223. }
  224. protected function getUsedEntityFixtures()
  225. {
  226. return array(
  227. self::CATEGORY,
  228. self::ROOT_CATEGORY
  229. );
  230. }
  231. }