TreeHelperTest.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. <?php
  2. App::uses('TreeHelper', 'Tools.View/Helper');
  3. App::uses('MyCakeTestCase', 'Tools.TestSuite');
  4. App::uses('View', 'View');
  5. class TreeHelperTest extends MyCakeTestCase {
  6. public $fixtures = array('core.after_tree');
  7. public $Model;
  8. /**
  9. * Initial Tree
  10. *
  11. * - One
  12. * -- One-SubA
  13. * - Two
  14. * -- Two-SubA
  15. * --- Two-SubA-1
  16. * ---- Two-SubA-1-1
  17. * - Three
  18. * - Four
  19. * -- Four-SubA
  20. *
  21. */
  22. public function setUp() {
  23. parent::setUp();
  24. $this->Tree = new TreeHelper(new View(null));
  25. $this->Model = ClassRegistry::init('AfterTree');
  26. $this->Model->Behaviors->load('Tree');
  27. $this->Model->truncate();
  28. $data = array(
  29. array('name' => 'One'),
  30. array('name' => 'Two'),
  31. array('name' => 'Three'),
  32. array('name' => 'Four'),
  33. array('name' => 'One-SubA', 'parent_id' => 1),
  34. array('name' => 'Two-SubA', 'parent_id' => 2),
  35. array('name' => 'Four-SubA', 'parent_id' => 4),
  36. array('name' => 'Two-SubA-1', 'parent_id' => 6),
  37. array('name' => 'Two-SubA-1-1', 'parent_id' => 8),
  38. );
  39. foreach ($data as $row) {
  40. $this->Model->create();
  41. $this->Model->save($row);
  42. }
  43. }
  44. public function tearDown() {
  45. parent::tearDown();
  46. }
  47. /**
  48. * TreeHelperTest::testObject()
  49. *
  50. * @return void
  51. */
  52. public function testObject() {
  53. $this->assertInstanceOf('TreeHelper', $this->Tree);
  54. }
  55. /**
  56. * TreeHelperTest::testGenerate()
  57. *
  58. * @return void
  59. */
  60. public function testGenerate() {
  61. $tree = $this->Model->find('threaded');
  62. $output = $this->Tree->generate($tree);
  63. $expected = <<<TEXT
  64. <ul>
  65. <li>One
  66. <ul>
  67. <li>One-SubA</li>
  68. </ul>
  69. </li>
  70. <li>Two
  71. <ul>
  72. <li>Two-SubA
  73. <ul>
  74. <li>Two-SubA-1
  75. <ul>
  76. <li>Two-SubA-1-1</li>
  77. </ul>
  78. </li>
  79. </ul>
  80. </li>
  81. </ul>
  82. </li>
  83. <li>Three</li>
  84. <li>Four
  85. <ul>
  86. <li>Four-SubA</li>
  87. </ul>
  88. </li>
  89. </ul>
  90. TEXT;
  91. $this->assertTextEquals($expected, $output);
  92. $this->assertTrue(substr_count($output, '<ul>') === substr_count($output, '</ul>'));
  93. $this->assertTrue(substr_count($output, '<li>') === substr_count($output, '</li>'));
  94. }
  95. /**
  96. * TreeHelperTest::testGenerateWithFindAll()
  97. *
  98. * @return void
  99. */
  100. public function testGenerateWithFindAll() {
  101. $tree = $this->Model->find('all', array('order' => array('lft' => 'ASC')));
  102. $output = $this->Tree->generate($tree);
  103. //debug($output); return;
  104. $expected = <<<TEXT
  105. <ul>
  106. <li>One
  107. <ul>
  108. <li>One-SubA</li>
  109. </ul>
  110. </li>
  111. <li>Two
  112. <ul>
  113. <li>Two-SubA
  114. <ul>
  115. <li>Two-SubA-1
  116. <ul>
  117. <li>Two-SubA-1-1</li>
  118. </ul>
  119. </li>
  120. </ul>
  121. </li>
  122. </ul>
  123. </li>
  124. <li>Three</li>
  125. <li>Four
  126. <ul>
  127. <li>Four-SubA</li>
  128. </ul>
  129. </li>
  130. </ul>
  131. TEXT;
  132. $output = str_replace(array("\t", "\r", "\n"), '', $output);
  133. $expected = str_replace(array("\t", "\r", "\n"), '', $expected);
  134. $this->assertTextEquals($expected, $output);
  135. }
  136. /**
  137. * TreeHelperTest::testGenerateWithDepth()
  138. *
  139. * @return void
  140. */
  141. public function testGenerateWithDepth() {
  142. $tree = $this->Model->find('threaded');
  143. $output = $this->Tree->generate($tree, array('depth' => 1));
  144. $expected = <<<TEXT
  145. <ul>
  146. <li>One
  147. <ul>
  148. <li>One-SubA</li>
  149. </ul>
  150. </li>
  151. <li>Two
  152. <ul>
  153. <li>Two-SubA
  154. <ul>
  155. <li>Two-SubA-1
  156. <ul>
  157. <li>Two-SubA-1-1</li>
  158. </ul>
  159. </li>
  160. </ul>
  161. </li>
  162. </ul>
  163. </li>
  164. <li>Three</li>
  165. <li>Four
  166. <ul>
  167. <li>Four-SubA</li>
  168. </ul>
  169. </li>
  170. </ul>
  171. TEXT;
  172. $this->assertTextEquals($expected, $output);
  173. }
  174. /**
  175. * TreeHelperTest::testGenerateWithSettings()
  176. *
  177. * @return void
  178. */
  179. public function testGenerateWithSettings() {
  180. $tree = $this->Model->find('threaded');
  181. $output = $this->Tree->generate($tree, array('class' => 'navi', 'id' => 'main', 'type' => 'ol'));
  182. $expected = <<<TEXT
  183. <ol class="navi" id="main">
  184. <li>One
  185. <ol>
  186. <li>One-SubA</li>
  187. </ol>
  188. </li>
  189. <li>Two
  190. <ol>
  191. <li>Two-SubA
  192. <ol>
  193. <li>Two-SubA-1
  194. <ol>
  195. <li>Two-SubA-1-1</li>
  196. </ol>
  197. </li>
  198. </ol>
  199. </li>
  200. </ol>
  201. </li>
  202. <li>Three</li>
  203. <li>Four
  204. <ol>
  205. <li>Four-SubA</li>
  206. </ol>
  207. </li>
  208. </ol>
  209. TEXT;
  210. $this->assertTextEquals($expected, $output);
  211. }
  212. /**
  213. * TreeHelperTest::testGenerateWithMaxDepth()
  214. *
  215. * @return void
  216. */
  217. public function testGenerateWithMaxDepth() {
  218. $tree = $this->Model->find('threaded');
  219. $output = $this->Tree->generate($tree, array('maxDepth' => 2));
  220. $expected = <<<TEXT
  221. <ul>
  222. <li>One
  223. <ul>
  224. <li>One-SubA</li>
  225. </ul>
  226. </li>
  227. <li>Two
  228. <ul>
  229. <li>Two-SubA
  230. <ul>
  231. <li>Two-SubA-1</li>
  232. </ul>
  233. </li>
  234. </ul>
  235. </li>
  236. <li>Three</li>
  237. <li>Four
  238. <ul>
  239. <li>Four-SubA</li>
  240. </ul>
  241. </li>
  242. </ul>
  243. TEXT;
  244. $this->assertTextEquals($expected, $output);
  245. }
  246. /**
  247. * TreeHelperTest::testGenerateWithAutoPath()
  248. *
  249. * @return void
  250. */
  251. public function testGenerateWithAutoPath() {
  252. $tree = $this->Model->find('threaded');
  253. //debug($tree);
  254. $output = $this->Tree->generate($tree, array('autoPath' => array(7, 10))); // Two-SubA-1
  255. //debug($output);
  256. $expected = <<<TEXT
  257. <ul>
  258. <li>One
  259. <ul>
  260. <li>One-SubA</li>
  261. </ul>
  262. </li>
  263. <li class="active">Two
  264. <ul>
  265. <li class="active">Two-SubA
  266. <ul>
  267. <li class="active">Two-SubA-1
  268. <ul>
  269. <li>Two-SubA-1-1</li>
  270. </ul>
  271. </li>
  272. </ul>
  273. </li>
  274. </ul>
  275. </li>
  276. <li>Three</li>
  277. <li>Four
  278. <ul>
  279. <li>Four-SubA</li>
  280. </ul>
  281. </li>
  282. </ul>
  283. TEXT;
  284. $this->assertTextEquals($expected, $output);
  285. $output = $this->Tree->generate($tree, array('autoPath' => array(8, 9))); // Two-SubA-1-1
  286. //debug($output);
  287. $expected = <<<TEXT
  288. <ul>
  289. <li>One
  290. <ul>
  291. <li>One-SubA</li>
  292. </ul>
  293. </li>
  294. <li class="active">Two
  295. <ul>
  296. <li class="active">Two-SubA
  297. <ul>
  298. <li class="active">Two-SubA-1
  299. <ul>
  300. <li class="active">Two-SubA-1-1</li>
  301. </ul>
  302. </li>
  303. </ul>
  304. </li>
  305. </ul>
  306. </li>
  307. <li>Three</li>
  308. <li>Four
  309. <ul>
  310. <li>Four-SubA</li>
  311. </ul>
  312. </li>
  313. </ul>
  314. TEXT;
  315. $this->assertTextEquals($expected, $output);
  316. }
  317. /**
  318. *
  319. * - One
  320. * -- One-SubA
  321. * - Two
  322. * -- Two-SubA
  323. * --- Two-SubA-1
  324. * ---- Two-SubA-1-1
  325. * -- Two-SubB
  326. * -- Two-SubC
  327. * - Three
  328. * - Four
  329. * -- Four-SubA
  330. */
  331. public function testGenerateWithAutoPathAndHideUnrelated() {
  332. $data = array(
  333. array('name' => 'Two-SubB', 'parent_id' => 2),
  334. array('name' => 'Two-SubC', 'parent_id' => 2),
  335. );
  336. foreach ($data as $row) {
  337. $this->Model->create();
  338. $this->Model->save($row);
  339. }
  340. $tree = $this->Model->find('threaded');
  341. $id = 6;
  342. $path = $this->Model->getPath($id);
  343. //$this->_hideUnrelated($tree, $path);
  344. $output = $this->Tree->generate($tree, array('autoPath' => array(6, 11), 'hideUnrelated' => true, 'treePath' => $path, 'callback' => array($this, '_myCallback'))); // Two-SubA
  345. //debug($output);
  346. $expected = <<<TEXT
  347. <ul>
  348. <li>One</li>
  349. <li class="active">Two (active)
  350. <ul>
  351. <li class="active">Two-SubA (active)
  352. <ul>
  353. <li>Two-SubA-1</li>
  354. </ul>
  355. </li>
  356. <li>Two-SubB</li>
  357. <li>Two-SubC</li>
  358. </ul>
  359. </li>
  360. <li>Three</li>
  361. <li>Four</li>
  362. </ul>
  363. TEXT;
  364. $output = str_replace(array("\t", "\r", "\n"), '', $output);
  365. $expected = str_replace(array("\t", "\r", "\n"), '', $expected);
  366. //debug($output);
  367. //debug($expected);
  368. $this->assertTextEquals($expected, $output);
  369. }
  370. /**
  371. *
  372. * - One
  373. * -- One-SubA
  374. * - Two
  375. * -- Two-SubA
  376. * --- Two-SubA-1
  377. * ---- Two-SubA-1-1
  378. * -- Two-SubB
  379. * -- Two-SubC
  380. * - Three
  381. * - Four
  382. * -- Four-SubA
  383. */
  384. public function testGenerateWithAutoPathAndHideUnrelatedAndSiblings() {
  385. $data = array(
  386. array('name' => 'Two-SubB', 'parent_id' => 2),
  387. array('name' => 'Two-SubC', 'parent_id' => 2),
  388. );
  389. foreach ($data as $row) {
  390. $this->Model->create();
  391. $this->Model->save($row);
  392. }
  393. $tree = $this->Model->find('threaded');
  394. $id = 6;
  395. $path = $this->Model->getPath($id);
  396. $output = $this->Tree->generate($tree, array(
  397. 'autoPath' => array(6, 11), 'hideUnrelated' => true, 'treePath' => $path,
  398. 'callback' => array($this, '_myCallbackSiblings'))); // Two-SubA
  399. //debug($output);
  400. $expected = <<<TEXT
  401. <ul>
  402. <li>One (sibling)</li>
  403. <li class="active">Two (active)
  404. <ul>
  405. <li class="active">Two-SubA (active)
  406. <ul>
  407. <li>Two-SubA-1</li>
  408. </ul>
  409. </li>
  410. <li>Two-SubB</li>
  411. <li>Two-SubC</li>
  412. </ul>
  413. </li>
  414. <li>Three (sibling)</li>
  415. <li>Four (sibling)</li>
  416. </ul>
  417. TEXT;
  418. $output = str_replace(array("\t", "\r", "\n"), '', $output);
  419. $expected = str_replace(array("\t", "\r", "\n"), '', $expected);
  420. //debug($output);
  421. //debug($expected);
  422. $this->assertTextEquals($expected, $output);
  423. }
  424. public function _myCallback($data) {
  425. if (!empty($data['data']['AfterTree']['hide'])) {
  426. return;
  427. }
  428. return $data['data']['AfterTree']['name'] . ($data['activePathElement'] ? ' (active)' : '');
  429. }
  430. public function _myCallbackSiblings($data) {
  431. if (!empty($data['data']['AfterTree']['hide'])) {
  432. return;
  433. }
  434. if ($data['depth'] == 0 && $data['isSibling']) {
  435. return $data['data']['AfterTree']['name'] . ' (sibling)';
  436. }
  437. return $data['data']['AfterTree']['name'] . ($data['activePathElement'] ? ' (active)' : '');
  438. }
  439. /**
  440. * TreeHelperTest::testGenerateProductive()
  441. *
  442. * @return void
  443. */
  444. public function testGenerateProductive() {
  445. $tree = $this->Model->find('threaded');
  446. $output = $this->Tree->generate($tree, array('indent' => false));
  447. $expected = '<ul><li>One<ul><li>One-SubA</li></ul></li><li>Two<ul><li>Two-SubA<ul><li>Two-SubA-1<ul><li>Two-SubA-1-1</li></ul></li></ul></li></ul></li><li>Three</li><li>Four<ul><li>Four-SubA</li></ul></li></ul>';
  448. $this->assertTextEquals($expected, $output);
  449. }
  450. }