NestedTreePositionTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  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 testOnRootCategory()
  27. {
  28. // need to check if this does not produce errors
  29. $repo = $this->em->getRepository(self::ROOT_CATEGORY);
  30. $fruits = new RootCategory;
  31. $fruits->setTitle('Fruits');
  32. $vegitables = new RootCategory;
  33. $vegitables->setTitle('Vegitables');
  34. $milk = new RootCategory;
  35. $milk->setTitle('Milk');
  36. $meat = new RootCategory;
  37. $meat->setTitle('Meat');
  38. $repo
  39. ->persistAsFirstChild($fruits)
  40. ->persistAsFirstChild($vegitables)
  41. ->persistAsLastChild($milk)
  42. ->persistAsLastChild($meat);
  43. $cookies = new RootCategory;
  44. $cookies->setTitle('Cookies');
  45. $drinks = new RootCategory;
  46. $drinks->setTitle('Drinks');
  47. $repo
  48. ->persistAsNextSibling($cookies)
  49. ->persistAsPrevSibling($drinks);
  50. $this->em->flush();
  51. $dql = 'SELECT COUNT(c) FROM ' . self::ROOT_CATEGORY . ' c';
  52. $dql .= ' WHERE c.lft = 1 AND c.rgt = 2 AND c.parent IS NULL AND c.level = 0';
  53. $count = $this->em->createQuery($dql)->getSingleScalarResult();
  54. $this->assertEquals(6, $count);
  55. $repo = $this->em->getRepository(self::CATEGORY);
  56. $fruits = new Category;
  57. $fruits->setTitle('Fruits');
  58. $vegitables = new Category;
  59. $vegitables->setTitle('Vegitables');
  60. $milk = new Category;
  61. $milk->setTitle('Milk');
  62. $meat = new Category;
  63. $meat->setTitle('Meat');
  64. $repo
  65. ->persistAsFirstChild($fruits)
  66. ->persistAsFirstChild($vegitables)
  67. ->persistAsLastChild($milk)
  68. ->persistAsLastChild($meat);
  69. $cookies = new Category;
  70. $cookies->setTitle('Cookies');
  71. $drinks = new Category;
  72. $drinks->setTitle('Drinks');
  73. $repo
  74. ->persistAsNextSibling($cookies)
  75. ->persistAsPrevSibling($drinks);
  76. $this->em->flush();
  77. $dql = 'SELECT COUNT(c) FROM ' . self::CATEGORY . ' c';
  78. $dql .= ' WHERE c.parentId IS NULL AND c.level = 0';
  79. $dql .= ' AND c.lft BETWEEN 1 AND 11';
  80. $count = $this->em->createQuery($dql)->getSingleScalarResult();
  81. $this->assertEquals(6, $count);
  82. }
  83. public function testRootTreePositionedInserts()
  84. {
  85. $repo = $this->em->getRepository(self::ROOT_CATEGORY);
  86. // test child positioned inserts
  87. $food = new RootCategory;
  88. $food->setTitle('Food');
  89. $fruits = new RootCategory;
  90. $fruits->setTitle('Fruits');
  91. $vegitables = new RootCategory;
  92. $vegitables->setTitle('Vegitables');
  93. $milk = new RootCategory;
  94. $milk->setTitle('Milk');
  95. $meat = new RootCategory;
  96. $meat->setTitle('Meat');
  97. $repo
  98. ->persistAsFirstChild($food)
  99. ->persistAsFirstChildOf($fruits, $food)
  100. ->persistAsFirstChildOf($vegitables, $food)
  101. ->persistAsLastChildOf($milk, $food)
  102. ->persistAsLastChildOf($meat, $food);
  103. $this->em->flush();
  104. $this->assertEquals(4, $fruits->getLeft());
  105. $this->assertEquals(5, $fruits->getRight());
  106. $this->assertEquals(2, $vegitables->getLeft());
  107. $this->assertEquals(3, $vegitables->getRight());
  108. $this->assertEquals(6, $milk->getLeft());
  109. $this->assertEquals(7, $milk->getRight());
  110. $this->assertEquals(8, $meat->getLeft());
  111. $this->assertEquals(9, $meat->getRight());
  112. // test sibling positioned inserts
  113. $cookies = new RootCategory;
  114. $cookies->setTitle('Cookies');
  115. $drinks = new RootCategory;
  116. $drinks->setTitle('Drinks');
  117. $repo
  118. ->persistAsNextSiblingOf($cookies, $milk)
  119. ->persistAsPrevSiblingOf($drinks, $milk);
  120. $this->em->flush();
  121. $this->assertEquals(6, $drinks->getLeft());
  122. $this->assertEquals(7, $drinks->getRight());
  123. $this->assertEquals(10, $cookies->getLeft());
  124. $this->assertEquals(11, $cookies->getRight());
  125. $this->assertTrue($repo->verify());
  126. }
  127. public function testSimpleTreePositionedInserts()
  128. {
  129. $repo = $this->em->getRepository(self::CATEGORY);
  130. // test child positioned inserts
  131. $food = new Category;
  132. $food->setTitle('Food');
  133. $repo->persistAsFirstChild($food);
  134. $fruits = new Category;
  135. $fruits->setTitle('Fruits');
  136. $fruits->setParent($food);
  137. $repo->persistAsFirstChild($fruits);
  138. $vegitables = new Category;
  139. $vegitables->setTitle('Vegitables');
  140. $vegitables->setParent($food);
  141. $repo->persistAsFirstChild($vegitables);
  142. $milk = new Category;
  143. $milk->setTitle('Milk');
  144. $milk->setParent($food);
  145. $repo->persistAsLastChild($milk);
  146. $meat = new Category;
  147. $meat->setTitle('Meat');
  148. $meat->setParent($food);
  149. $repo->persistAsLastChild($meat);
  150. $this->em->flush();
  151. $this->assertEquals(4, $fruits->getLeft());
  152. $this->assertEquals(5, $fruits->getRight());
  153. $this->assertEquals(2, $vegitables->getLeft());
  154. $this->assertEquals(3, $vegitables->getRight());
  155. $this->assertEquals(6, $milk->getLeft());
  156. $this->assertEquals(7, $milk->getRight());
  157. $this->assertEquals(8, $meat->getLeft());
  158. $this->assertEquals(9, $meat->getRight());
  159. // test sibling positioned inserts
  160. $cookies = new Category;
  161. $cookies->setTitle('Cookies');
  162. $cookies->setParent($milk);
  163. $repo->persistAsNextSibling($cookies);
  164. $drinks = new Category;
  165. $drinks->setTitle('Drinks');
  166. $drinks->setParent($milk);
  167. $repo->persistAsPrevSibling($drinks);
  168. $this->em->flush();
  169. $this->assertEquals(6, $drinks->getLeft());
  170. $this->assertEquals(7, $drinks->getRight());
  171. $this->assertEquals(10, $cookies->getLeft());
  172. $this->assertEquals(11, $cookies->getRight());
  173. $this->assertTrue($repo->verify());
  174. }
  175. protected function getUsedEntityFixtures()
  176. {
  177. return array(
  178. self::CATEGORY,
  179. self::ROOT_CATEGORY
  180. );
  181. }
  182. }