NestedTreePositionTest.php 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  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 testTreeChildPositionMove()
  49. {
  50. $this->populate();
  51. $repo = $this->em->getRepository(self::ROOT_CATEGORY);
  52. $oranges = $repo->findOneByTitle('Oranges');
  53. $fruits = $repo->findOneByTitle('Fruits');
  54. $this->assertEquals(2, $oranges->getLevel());
  55. $repo->persistAsNextSiblingOf($oranges, $fruits);
  56. $this->em->flush();
  57. $this->assertEquals(1, $oranges->getLevel());
  58. $this->assertEquals(1, count($repo->children($fruits, true)));
  59. }
  60. public function testOnRootCategory()
  61. {
  62. // need to check if this does not produce errors
  63. $repo = $this->em->getRepository(self::ROOT_CATEGORY);
  64. $fruits = new RootCategory;
  65. $fruits->setTitle('Fruits');
  66. $vegitables = new RootCategory;
  67. $vegitables->setTitle('Vegitables');
  68. $milk = new RootCategory;
  69. $milk->setTitle('Milk');
  70. $meat = new RootCategory;
  71. $meat->setTitle('Meat');
  72. $repo
  73. ->persistAsFirstChild($fruits)
  74. ->persistAsFirstChild($vegitables)
  75. ->persistAsLastChild($milk)
  76. ->persistAsLastChild($meat);
  77. $cookies = new RootCategory;
  78. $cookies->setTitle('Cookies');
  79. $drinks = new RootCategory;
  80. $drinks->setTitle('Drinks');
  81. $repo
  82. ->persistAsNextSibling($cookies)
  83. ->persistAsPrevSibling($drinks);
  84. $this->em->flush();
  85. $dql = 'SELECT COUNT(c) FROM ' . self::ROOT_CATEGORY . ' c';
  86. $dql .= ' WHERE c.lft = 1 AND c.rgt = 2 AND c.parent IS NULL AND c.level = 0';
  87. $count = $this->em->createQuery($dql)->getSingleScalarResult();
  88. $this->assertEquals(6, $count);
  89. $repo = $this->em->getRepository(self::CATEGORY);
  90. $fruits = new Category;
  91. $fruits->setTitle('Fruits');
  92. $vegitables = new Category;
  93. $vegitables->setTitle('Vegitables');
  94. $milk = new Category;
  95. $milk->setTitle('Milk');
  96. $meat = new Category;
  97. $meat->setTitle('Meat');
  98. $repo
  99. ->persistAsFirstChild($fruits)
  100. ->persistAsFirstChild($vegitables)
  101. ->persistAsLastChild($milk)
  102. ->persistAsLastChild($meat);
  103. $cookies = new Category;
  104. $cookies->setTitle('Cookies');
  105. $drinks = new Category;
  106. $drinks->setTitle('Drinks');
  107. $repo
  108. ->persistAsNextSibling($cookies)
  109. ->persistAsPrevSibling($drinks);
  110. $this->em->flush();
  111. $dql = 'SELECT COUNT(c) FROM ' . self::CATEGORY . ' c';
  112. $dql .= ' WHERE c.parentId IS NULL AND c.level = 0';
  113. $dql .= ' AND c.lft BETWEEN 1 AND 11';
  114. $count = $this->em->createQuery($dql)->getSingleScalarResult();
  115. $this->assertEquals(6, $count);
  116. }
  117. public function testRootTreePositionedInserts()
  118. {
  119. $repo = $this->em->getRepository(self::ROOT_CATEGORY);
  120. // test child positioned inserts
  121. $food = new RootCategory;
  122. $food->setTitle('Food');
  123. $fruits = new RootCategory;
  124. $fruits->setTitle('Fruits');
  125. $vegitables = new RootCategory;
  126. $vegitables->setTitle('Vegitables');
  127. $milk = new RootCategory;
  128. $milk->setTitle('Milk');
  129. $meat = new RootCategory;
  130. $meat->setTitle('Meat');
  131. $repo
  132. ->persistAsFirstChild($food)
  133. ->persistAsFirstChildOf($fruits, $food)
  134. ->persistAsFirstChildOf($vegitables, $food)
  135. ->persistAsLastChildOf($milk, $food)
  136. ->persistAsLastChildOf($meat, $food);
  137. $this->em->flush();
  138. $this->assertEquals(4, $fruits->getLeft());
  139. $this->assertEquals(5, $fruits->getRight());
  140. $this->assertEquals(2, $vegitables->getLeft());
  141. $this->assertEquals(3, $vegitables->getRight());
  142. $this->assertEquals(6, $milk->getLeft());
  143. $this->assertEquals(7, $milk->getRight());
  144. $this->assertEquals(8, $meat->getLeft());
  145. $this->assertEquals(9, $meat->getRight());
  146. // test sibling positioned inserts
  147. $cookies = new RootCategory;
  148. $cookies->setTitle('Cookies');
  149. $drinks = new RootCategory;
  150. $drinks->setTitle('Drinks');
  151. $repo
  152. ->persistAsNextSiblingOf($cookies, $milk)
  153. ->persistAsPrevSiblingOf($drinks, $milk);
  154. $this->em->flush();
  155. $this->assertEquals(6, $drinks->getLeft());
  156. $this->assertEquals(7, $drinks->getRight());
  157. $this->assertEquals(10, $cookies->getLeft());
  158. $this->assertEquals(11, $cookies->getRight());
  159. $this->assertTrue($repo->verify());
  160. }
  161. public function testSimpleTreePositionedInserts()
  162. {
  163. $repo = $this->em->getRepository(self::CATEGORY);
  164. // test child positioned inserts
  165. $food = new Category;
  166. $food->setTitle('Food');
  167. $repo->persistAsFirstChild($food);
  168. $fruits = new Category;
  169. $fruits->setTitle('Fruits');
  170. $fruits->setParent($food);
  171. $repo->persistAsFirstChild($fruits);
  172. $vegitables = new Category;
  173. $vegitables->setTitle('Vegitables');
  174. $vegitables->setParent($food);
  175. $repo->persistAsFirstChild($vegitables);
  176. $milk = new Category;
  177. $milk->setTitle('Milk');
  178. $milk->setParent($food);
  179. $repo->persistAsLastChild($milk);
  180. $meat = new Category;
  181. $meat->setTitle('Meat');
  182. $meat->setParent($food);
  183. $repo->persistAsLastChild($meat);
  184. $this->em->flush();
  185. $this->assertEquals(4, $fruits->getLeft());
  186. $this->assertEquals(5, $fruits->getRight());
  187. $this->assertEquals(2, $vegitables->getLeft());
  188. $this->assertEquals(3, $vegitables->getRight());
  189. $this->assertEquals(6, $milk->getLeft());
  190. $this->assertEquals(7, $milk->getRight());
  191. $this->assertEquals(8, $meat->getLeft());
  192. $this->assertEquals(9, $meat->getRight());
  193. // test sibling positioned inserts
  194. $cookies = new Category;
  195. $cookies->setTitle('Cookies');
  196. $cookies->setParent($milk);
  197. $repo->persistAsNextSibling($cookies);
  198. $drinks = new Category;
  199. $drinks->setTitle('Drinks');
  200. $drinks->setParent($milk);
  201. $repo->persistAsPrevSibling($drinks);
  202. $this->em->flush();
  203. $this->assertEquals(6, $drinks->getLeft());
  204. $this->assertEquals(7, $drinks->getRight());
  205. $this->assertEquals(10, $cookies->getLeft());
  206. $this->assertEquals(11, $cookies->getRight());
  207. $this->assertTrue($repo->verify());
  208. }
  209. private function populate()
  210. {
  211. $repo = $this->em->getRepository(self::ROOT_CATEGORY);
  212. $food = new RootCategory;
  213. $food->setTitle('Food');
  214. $fruits = new RootCategory;
  215. $fruits->setTitle('Fruits');
  216. $vegitables = new RootCategory;
  217. $vegitables->setTitle('Vegitables');
  218. $milk = new RootCategory;
  219. $milk->setTitle('Milk');
  220. $meat = new RootCategory;
  221. $meat->setTitle('Meat');
  222. $oranges = new RootCategory;
  223. $oranges->setTitle('Oranges');
  224. $citrons = new RootCategory;
  225. $citrons->setTitle('Citrons');
  226. $repo
  227. ->persistAsFirstChild($food)
  228. ->persistAsFirstChildOf($fruits, $food)
  229. ->persistAsFirstChildOf($vegitables, $food)
  230. ->persistAsLastChildOf($milk, $food)
  231. ->persistAsLastChildOf($meat, $food)
  232. ->persistAsFirstChildOf($oranges, $fruits)
  233. ->persistAsFirstChildOf($citrons, $fruits);
  234. $this->em->flush();
  235. }
  236. protected function getUsedEntityFixtures()
  237. {
  238. return array(
  239. self::CATEGORY,
  240. self::ROOT_CATEGORY
  241. );
  242. }
  243. }