PaginatorTest.php 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153
  1. <?php
  2. /**
  3. * Zend Framework
  4. *
  5. * LICENSE
  6. *
  7. * This source file is subject to the new BSD license that is bundled
  8. * with this package in the file LICENSE.txt.
  9. * It is also available through the world-wide-web at this URL:
  10. * http://framework.zend.com/license/new-bsd
  11. * If you did not receive a copy of the license and are unable to
  12. * obtain it through the world-wide-web, please send an email
  13. * to license@zend.com so we can send you a copy immediately.
  14. *
  15. * @category Zend
  16. * @package Zend_Paginator
  17. * @subpackage UnitTests
  18. * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
  19. * @license http://framework.zend.com/license/new-bsd New BSD License
  20. * @version $Id$
  21. */
  22. // Call Zend_PaginatorTest::main() if this source file is executed directly.
  23. if (!defined('PHPUnit_MAIN_METHOD')) {
  24. define('PHPUnit_MAIN_METHOD', 'Zend_PaginatorTest::main');
  25. }
  26. /**
  27. * @see Zend_Paginator
  28. */
  29. require_once 'Zend/Paginator.php';
  30. /**
  31. * @see Zend_Paginator_AdapterAggregate
  32. */
  33. require_once 'Zend/Paginator/AdapterAggregate.php';
  34. /**
  35. * @see PHPUnit_Framework_TestCase
  36. */
  37. /**
  38. * @see Zend_Config_Xml
  39. */
  40. require_once 'Zend/Config/Xml.php';
  41. /**
  42. * @see Zend_Db_Adapter_Pdo_Sqlite
  43. */
  44. require_once 'Zend/Db/Adapter/Pdo/Sqlite.php';
  45. /**
  46. * @see Zend_View
  47. */
  48. require_once 'Zend/View.php';
  49. /**
  50. * @see Zend_Controller_Action_HelperBroker
  51. */
  52. require_once 'Zend/Controller/Action/HelperBroker.php';
  53. /**
  54. * @see Zend_View_Helper_PaginationControl
  55. */
  56. require_once 'Zend/View/Helper/PaginationControl.php';
  57. /**
  58. * @see Zf4207
  59. */
  60. require_once 'Zend/Paginator/_files/Zf4207.php';
  61. /**
  62. * @see TestTable
  63. */
  64. require_once 'Zend/Paginator/_files/TestTable.php';
  65. /**
  66. * @see Zend_Cache
  67. */
  68. require_once 'Zend/Cache.php';
  69. /**
  70. * @see Zend_Filter_Callback
  71. */
  72. require_once 'Zend/Filter/Callback.php';
  73. /**
  74. * @see Zend_Paginator_Adapter_DbSelect
  75. */
  76. require_once 'Zend/Paginator/Adapter/DbSelect.php';
  77. /**
  78. * @category Zend
  79. * @package Zend_Paginator
  80. * @subpackage UnitTests
  81. * @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
  82. * @license http://framework.zend.com/license/new-bsd New BSD License
  83. * @group Zend_Paginator
  84. */
  85. class Zend_PaginatorTest extends PHPUnit_Framework_TestCase
  86. {
  87. /**
  88. * Runs the test methods of this class.
  89. *
  90. * @return void
  91. */
  92. public static function main()
  93. {
  94. $suite = new PHPUnit_Framework_TestSuite(__CLASS__);
  95. $result = PHPUnit_TextUI_TestRunner::run($suite);
  96. }
  97. /**
  98. * Paginator instance
  99. *
  100. * @var Zend_Paginator
  101. */
  102. protected $_paginator = null;
  103. protected $_testCollection = null;
  104. protected $_cache;
  105. protected $_query = null;
  106. protected $_config = null;
  107. protected $_adapter = null;
  108. protected function setUp()
  109. {
  110. if (!extension_loaded('pdo_sqlite')) {
  111. $this->markTestSkipped('Pdo_Sqlite extension is not loaded');
  112. }
  113. $this->_adapter = new Zend_Db_Adapter_Pdo_Sqlite(array(
  114. 'dbname' => dirname(__FILE__) . '/Paginator/_files/test.sqlite'
  115. ));
  116. $this->_query = $this->_adapter->select()->from('test');
  117. $this->_testCollection = range(1, 101);
  118. $this->_paginator = Zend_Paginator::factory($this->_testCollection);
  119. $this->_config = new Zend_Config_Xml(dirname(__FILE__) . '/Paginator/_files/config.xml');
  120. // get a fresh new copy of ViewRenderer in each tests
  121. Zend_Controller_Action_HelperBroker::resetHelpers();
  122. $fO = array('lifetime' => 3600, 'automatic_serialization' => true);
  123. $bO = array('cache_dir'=> $this->_getTmpDir());
  124. $this->_cache = Zend_Cache::factory('Core', 'File', $fO, $bO);
  125. Zend_Paginator::setCache($this->_cache);
  126. $this->_restorePaginatorDefaults();
  127. }
  128. protected function tearDown()
  129. {
  130. $this->_dbConn = null;
  131. $this->_testCollection = null;
  132. $this->_paginator = null;
  133. }
  134. protected function _getTmpDir()
  135. {
  136. $tmpDir = rtrim(sys_get_temp_dir(), '/\\') . DIRECTORY_SEPARATOR . 'zend_paginator';
  137. if (file_exists($tmpDir)) {
  138. $this->_rmDirRecursive($tmpDir);
  139. }
  140. mkdir($tmpDir);
  141. $this->cacheDir = $tmpDir;
  142. return $tmpDir;
  143. }
  144. protected function _rmDirRecursive($path)
  145. {
  146. $dir = new DirectoryIterator($path);
  147. foreach ($dir as $file) {
  148. if (!$file->isDir()) {
  149. unlink($file->getPathname());
  150. } elseif (!in_array($file->getFilename(), array('.', '..'))) {
  151. $this->_rmDirRecursive($file->getPathname());
  152. }
  153. }
  154. unset($file, $dir); // required on windows to remove file handle
  155. if (!rmdir($path)) {
  156. throw new Exception('Unable to remove temporary directory ' . $path
  157. . '; perhaps it has a nested structure?');
  158. }
  159. }
  160. protected function _restorePaginatorDefaults()
  161. {
  162. $this->_paginator->setItemCountPerPage(10);
  163. $this->_paginator->setCurrentPageNumber(1);
  164. $this->_paginator->setPageRange(10);
  165. $this->_paginator->setView();
  166. Zend_Paginator::setDefaultScrollingStyle();
  167. Zend_View_Helper_PaginationControl::setDefaultViewPartial(null);
  168. Zend_Paginator::setConfig($this->_config->default);
  169. $loader = Zend_Paginator::getScrollingStyleLoader();
  170. $loader->clearPaths();
  171. $loader->addPrefixPath('Zend_Paginator_ScrollingStyle', 'Zend/Paginator/ScrollingStyle');
  172. $this->_cache->clean();
  173. $this->_paginator->setCacheEnabled(true);
  174. }
  175. public function testFactoryReturnsArrayAdapter()
  176. {
  177. $paginator = Zend_Paginator::factory($this->_testCollection);
  178. $this->assertTrue($paginator->getAdapter() instanceof Zend_Paginator_Adapter_Array);
  179. }
  180. public function testFactoryReturnsDbSelectAdapter()
  181. {
  182. $paginator = Zend_Paginator::factory($this->_query);
  183. $this->assertTrue($paginator->getAdapter() instanceof Zend_Paginator_Adapter_DbSelect);
  184. }
  185. // ZF-4607
  186. public function testFactoryReturnsDbTableSelectAdapter()
  187. {
  188. $table = new TestTable($this->_adapter);
  189. $paginator = Zend_Paginator::factory($table->select());
  190. $this->assertTrue($paginator->getAdapter() instanceof Zend_Paginator_Adapter_DbSelect);
  191. }
  192. public function testFactoryReturnsIteratorAdapter()
  193. {
  194. $paginator = Zend_Paginator::factory(new ArrayIterator($this->_testCollection));
  195. $this->assertTrue($paginator->getAdapter() instanceof Zend_Paginator_Adapter_Iterator);
  196. }
  197. public function testFactoryReturnsNullAdapter()
  198. {
  199. $paginator = Zend_Paginator::factory(101);
  200. $this->assertTrue($paginator->getAdapter() instanceof Zend_Paginator_Adapter_Null);
  201. }
  202. public function testFactoryThrowsInvalidClassExceptionAdapter()
  203. {
  204. try {
  205. $paginator = Zend_Paginator::factory(new stdClass());
  206. } catch (Exception $e) {
  207. $this->assertTrue($e instanceof Zend_Paginator_Exception);
  208. $this->assertContains('stdClass', $e->getMessage());
  209. }
  210. }
  211. public function testFactoryThrowsInvalidTypeExceptionAdapter()
  212. {
  213. try {
  214. $paginator = Zend_Paginator::factory('invalid argument');
  215. } catch (Exception $e) {
  216. $this->assertTrue($e instanceof Zend_Paginator_Exception);
  217. $this->assertContains('string', $e->getMessage());
  218. }
  219. }
  220. public function testAddsSingleScrollingStylePrefixPath()
  221. {
  222. Zend_Paginator::addScrollingStylePrefixPath('prefix1', 'path1');
  223. $loader = Zend_Paginator::getScrollingStyleLoader();
  224. $paths = $loader->getPaths();
  225. $this->assertArrayHasKey('prefix1_', $paths);
  226. $this->assertEquals($paths['prefix1_'], array('path1/'));
  227. $loader->clearPaths('prefix1');
  228. }
  229. public function testAddsSingleScrollingStylePrefixPathWithArray()
  230. {
  231. Zend_Paginator::addScrollingStylePrefixPaths(array('prefix' => 'prefix2',
  232. 'path' => 'path2'));
  233. $loader = Zend_Paginator::getScrollingStyleLoader();
  234. $paths = $loader->getPaths();
  235. $this->assertArrayHasKey('prefix2_', $paths);
  236. $this->assertEquals($paths['prefix2_'], array('path2/'));
  237. $loader->clearPaths('prefix2');
  238. }
  239. public function testAddsMultipleScrollingStylePrefixPaths()
  240. {
  241. $paths = array('prefix3' => 'path3',
  242. 'prefix4' => 'path4',
  243. 'prefix5' => 'path5');
  244. Zend_Paginator::addScrollingStylePrefixPaths($paths);
  245. $loader = Zend_Paginator::getScrollingStyleLoader();
  246. $paths = $loader->getPaths();
  247. for ($i = 3; $i <= 5; $i++) {
  248. $prefix = 'prefix' . $i . '_';
  249. $this->assertArrayHasKey($prefix, $paths);
  250. $this->assertEquals($paths[$prefix], array('path' . $i . '/'));
  251. }
  252. $loader->clearPaths('prefix3');
  253. $loader->clearPaths('prefix4');
  254. $loader->clearPaths('prefix5');
  255. }
  256. public function testAddsSingleAdapterPrefixPath()
  257. {
  258. Zend_Paginator::addAdapterPrefixPath('prefix1', 'path1');
  259. $loader = Zend_Paginator::getAdapterLoader();
  260. $paths = $loader->getPaths();
  261. $this->assertArrayHasKey('prefix1_', $paths);
  262. $this->assertEquals($paths['prefix1_'], array('path1/'));
  263. $loader->clearPaths('prefix1');
  264. }
  265. public function testAddsSingleAdapterPrefixPathWithArray()
  266. {
  267. Zend_Paginator::addAdapterPrefixPaths(array('prefix' => 'prefix2',
  268. 'path' => 'path2'));
  269. $loader = Zend_Paginator::getAdapterLoader();
  270. $paths = $loader->getPaths();
  271. $this->assertArrayHasKey('prefix2_', $paths);
  272. $this->assertEquals($paths['prefix2_'], array('path2/'));
  273. $loader->clearPaths('prefix2');
  274. }
  275. public function testAddsMultipleAdapterPrefixPaths()
  276. {
  277. $paths = array('prefix3' => 'path3',
  278. 'prefix4' => 'path4',
  279. 'prefix5' => 'path5');
  280. Zend_Paginator::addAdapterPrefixPaths($paths);
  281. $loader = Zend_Paginator::getAdapterLoader();
  282. $paths = $loader->getPaths();
  283. for ($i = 3; $i <= 5; $i++) {
  284. $prefix = 'prefix' . $i . '_';
  285. $this->assertArrayHasKey($prefix, $paths);
  286. $this->assertEquals($paths[$prefix], array('path' . $i . '/'));
  287. }
  288. $loader->clearPaths('prefix3');
  289. $loader->clearPaths('prefix4');
  290. $loader->clearPaths('prefix5');
  291. }
  292. public function testGetsAndSetsDefaultScrollingStyle()
  293. {
  294. $this->assertEquals(Zend_Paginator::getDefaultScrollingStyle(), 'Sliding');
  295. Zend_Paginator::setDefaultScrollingStyle('Scrolling');
  296. $this->assertEquals(Zend_Paginator::getDefaultScrollingStyle(), 'Scrolling');
  297. Zend_Paginator::setDefaultScrollingStyle('Sliding');
  298. }
  299. public function testHasCorrectCountAfterInit()
  300. {
  301. $paginator = Zend_Paginator::factory(range(1, 101));
  302. $this->assertEquals(11, $paginator->count());
  303. }
  304. public function testHasCorrectCountOfAllItemsAfterInit()
  305. {
  306. $paginator = Zend_Paginator::factory(range(1, 101));
  307. $this->assertEquals(101, $paginator->getTotalItemCount());
  308. }
  309. public function testAddCustomAdapterPathsInConstructor()
  310. {
  311. $paginator = Zend_Paginator::factory(range(1, 101), Zend_Paginator::INTERNAL_ADAPTER, array('My_Paginator_Adapter' => 'My/Paginator/Adapter'));
  312. $loader = Zend_Paginator::getAdapterLoader();
  313. $paths = $loader->getPaths();
  314. $this->assertEquals(2, count($paths));
  315. $this->assertEquals(array('Zend_Paginator_Adapter_' => array('Zend/Paginator/Adapter/'),
  316. 'My_Paginator_Adapter_' => array('My/Paginator/Adapter/')), $paths);
  317. $loader->clearPaths('My_Paginator_Adapter');
  318. }
  319. public function testLoadsFromConfig()
  320. {
  321. Zend_Paginator::setConfig($this->_config->testing);
  322. $this->assertEquals('Scrolling', Zend_Paginator::getDefaultScrollingStyle());
  323. $paths = array(
  324. 'prefix6' => 'path6',
  325. 'prefix7' => 'path7',
  326. 'prefix8' => 'path8'
  327. );
  328. $loader = Zend_Paginator::getScrollingStyleLoader();
  329. $paths = $loader->getPaths();
  330. for ($i = 6; $i <= 8; $i++) {
  331. $prefix = 'prefix' . $i . '_';
  332. $this->assertArrayHasKey($prefix, $paths);
  333. $this->assertEquals($paths[$prefix], array('path' . $i . '/'));
  334. }
  335. $loader->clearPaths('prefix6');
  336. $loader->clearPaths('prefix7');
  337. $loader->clearPaths('prefix8');
  338. $loader = Zend_Paginator::getAdapterLoader();
  339. $paths = $loader->getPaths();
  340. for ($i = 6; $i <= 8; $i++) {
  341. $prefix = 'prefix' . $i . '_';
  342. $this->assertArrayHasKey($prefix, $paths);
  343. $this->assertEquals($paths[$prefix], array('path' . $i . '/'));
  344. }
  345. $loader->clearPaths('prefix6');
  346. $loader->clearPaths('prefix7');
  347. $loader->clearPaths('prefix8');
  348. $paginator = Zend_Paginator::factory(range(1, 101));
  349. $this->assertEquals(3, $paginator->getItemCountPerPage());
  350. $this->assertEquals(7, $paginator->getPageRange());
  351. }
  352. public function testGetsPagesForPageOne()
  353. {
  354. $expected = new stdClass();
  355. $expected->pageCount = 11;
  356. $expected->itemCountPerPage = 10;
  357. $expected->first = 1;
  358. $expected->current = 1;
  359. $expected->last = 11;
  360. $expected->next = 2;
  361. $expected->pagesInRange = array_combine(range(1, 10), range(1, 10));
  362. $expected->firstPageInRange = 1;
  363. $expected->lastPageInRange = 10;
  364. $expected->currentItemCount = 10;
  365. $expected->totalItemCount = 101;
  366. $expected->firstItemNumber = 1;
  367. $expected->lastItemNumber = 10;
  368. $actual = $this->_paginator->getPages();
  369. $this->assertEquals($expected, $actual);
  370. }
  371. public function testGetsPagesForPageTwo()
  372. {
  373. $expected = new stdClass();
  374. $expected->pageCount = 11;
  375. $expected->itemCountPerPage = 10;
  376. $expected->first = 1;
  377. $expected->current = 2;
  378. $expected->last = 11;
  379. $expected->previous = 1;
  380. $expected->next = 3;
  381. $expected->pagesInRange = array_combine(range(1, 10), range(1, 10));
  382. $expected->firstPageInRange = 1;
  383. $expected->lastPageInRange = 10;
  384. $expected->currentItemCount = 10;
  385. $expected->totalItemCount = 101;
  386. $expected->firstItemNumber = 11;
  387. $expected->lastItemNumber = 20;
  388. $this->_paginator->setCurrentPageNumber(2);
  389. $actual = $this->_paginator->getPages();
  390. $this->assertEquals($expected, $actual);
  391. }
  392. public function testRendersWithoutPartial()
  393. {
  394. $this->_paginator->setView(new Zend_View());
  395. $string = @$this->_paginator->__toString();
  396. $this->assertEquals('', $string);
  397. }
  398. public function testRendersWithPartial()
  399. {
  400. $view = new Zend_View();
  401. $view->addBasePath(dirname(__FILE__) . '/Paginator/_files');
  402. $view->addHelperPath(dirname(__FILE__) . '/../../../trunk/library/Zend/View/Helper', 'Zend_View_Helper');
  403. Zend_View_Helper_PaginationControl::setDefaultViewPartial('partial.phtml');
  404. $this->_paginator->setView($view);
  405. $string = $this->_paginator->__toString();
  406. $this->assertEquals('partial rendered successfully', $string);
  407. }
  408. public function testGetsPageCount()
  409. {
  410. $this->assertEquals(11, $this->_paginator->count());
  411. }
  412. public function testGetsAndSetsItemCountPerPage()
  413. {
  414. Zend_Paginator::setConfig(new Zend_Config(array()));
  415. $this->_paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array(range(1, 101)));
  416. $this->assertEquals(10, $this->_paginator->getItemCountPerPage());
  417. $this->_paginator->setItemCountPerPage(15);
  418. $this->assertEquals(15, $this->_paginator->getItemCountPerPage());
  419. $this->_paginator->setItemCountPerPage(10);
  420. }
  421. /**
  422. * @group ZF-5376
  423. */
  424. public function testGetsAndSetsItemCounterPerPageOfNegativeOne()
  425. {
  426. Zend_Paginator::setConfig(new Zend_Config(array()));
  427. $this->_paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array(range(1, 101)));
  428. $this->_paginator->setItemCountPerPage(-1);
  429. $this->assertEquals(101, $this->_paginator->getItemCountPerPage());
  430. $this->_paginator->setItemCountPerPage(10);
  431. }
  432. /**
  433. * @group ZF-5376
  434. */
  435. public function testGetsAndSetsItemCounterPerPageOfZero()
  436. {
  437. Zend_Paginator::setConfig(new Zend_Config(array()));
  438. $this->_paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array(range(1, 101)));
  439. $this->_paginator->setItemCountPerPage(0);
  440. $this->assertEquals(101, $this->_paginator->getItemCountPerPage());
  441. $this->_paginator->setItemCountPerPage(10);
  442. }
  443. /**
  444. * @group ZF-5376
  445. */
  446. public function testGetsAndSetsItemCounterPerPageOfNull()
  447. {
  448. Zend_Paginator::setConfig(new Zend_Config(array()));
  449. $this->_paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array(range(1, 101)));
  450. $this->_paginator->setItemCountPerPage();
  451. $this->assertEquals(101, $this->_paginator->getItemCountPerPage());
  452. $this->_paginator->setItemCountPerPage(10);
  453. }
  454. public function testGetsCurrentItemCount()
  455. {
  456. $this->_paginator->setItemCountPerPage(10);
  457. $this->_paginator->setPageRange(10);
  458. $this->assertEquals(10, $this->_paginator->getCurrentItemCount());
  459. $this->_paginator->setCurrentPageNumber(11);
  460. $this->assertEquals(1, $this->_paginator->getCurrentItemCount());
  461. $this->_paginator->setCurrentPageNumber(1);
  462. }
  463. public function testGetsCurrentItems()
  464. {
  465. $items = $this->_paginator->getCurrentItems();
  466. $this->assertTrue($items instanceof ArrayIterator);
  467. $count = 0;
  468. foreach ($items as $item) {
  469. $count++;
  470. }
  471. $this->assertEquals(10, $count);
  472. }
  473. public function testGetsIterator()
  474. {
  475. $items = $this->_paginator->getIterator();
  476. $this->assertTrue($items instanceof ArrayIterator);
  477. $count = 0;
  478. foreach ($items as $item) {
  479. $count++;
  480. }
  481. $this->assertEquals(10, $count);
  482. }
  483. public function testGetsAndSetsCurrentPageNumber()
  484. {
  485. $this->assertEquals(1, $this->_paginator->getCurrentPageNumber());
  486. $this->_paginator->setCurrentPageNumber(-1);
  487. $this->assertEquals(1, $this->_paginator->getCurrentPageNumber());
  488. $this->_paginator->setCurrentPageNumber(11);
  489. $this->assertEquals(11, $this->_paginator->getCurrentPageNumber());
  490. $this->_paginator->setCurrentPageNumber(111);
  491. $this->assertEquals(11, $this->_paginator->getCurrentPageNumber());
  492. $this->_paginator->setCurrentPageNumber(1);
  493. $this->assertEquals(1, $this->_paginator->getCurrentPageNumber());
  494. }
  495. public function testGetsAbsoluteItemNumber()
  496. {
  497. $this->assertEquals(1, $this->_paginator->getAbsoluteItemNumber(1));
  498. $this->assertEquals(11, $this->_paginator->getAbsoluteItemNumber(1, 2));
  499. $this->assertEquals(24, $this->_paginator->getAbsoluteItemNumber(4, 3));
  500. }
  501. public function testGetsItem()
  502. {
  503. $this->assertEquals(1, $this->_paginator->getItem(1));
  504. $this->assertEquals(11, $this->_paginator->getItem(1, 2));
  505. $this->assertEquals(24, $this->_paginator->getItem(4, 3));
  506. }
  507. public function testThrowsExceptionWhenCollectionIsEmpty()
  508. {
  509. $paginator = Zend_Paginator::factory(array());
  510. try {
  511. $paginator->getItem(1);
  512. } catch (Exception $e) {
  513. $this->assertTrue($e instanceof Zend_Paginator_Exception);
  514. $this->assertContains('Page 1 does not exist', $e->getMessage());
  515. }
  516. }
  517. public function testThrowsExceptionWhenRetrievingNonexistentItemFromLastPage()
  518. {
  519. try {
  520. $this->_paginator->getItem(10, 11);
  521. } catch (Exception $e) {
  522. $this->assertTrue($e instanceof Zend_Paginator_Exception);
  523. $this->assertContains('Page 11 does not contain item number 10', $e->getMessage());
  524. }
  525. }
  526. public function testNormalizesPageNumber()
  527. {
  528. $this->assertEquals(1, $this->_paginator->normalizePageNumber(0));
  529. $this->assertEquals(1, $this->_paginator->normalizePageNumber(1));
  530. $this->assertEquals(2, $this->_paginator->normalizePageNumber(2));
  531. $this->assertEquals(5, $this->_paginator->normalizePageNumber(5));
  532. $this->assertEquals(10, $this->_paginator->normalizePageNumber(10));
  533. $this->assertEquals(11, $this->_paginator->normalizePageNumber(11));
  534. $this->assertEquals(11, $this->_paginator->normalizePageNumber(12));
  535. }
  536. public function testNormalizesItemNumber()
  537. {
  538. $this->assertEquals(1, $this->_paginator->normalizeItemNumber(0));
  539. $this->assertEquals(1, $this->_paginator->normalizeItemNumber(1));
  540. $this->assertEquals(2, $this->_paginator->normalizeItemNumber(2));
  541. $this->assertEquals(5, $this->_paginator->normalizeItemNumber(5));
  542. $this->assertEquals(9, $this->_paginator->normalizeItemNumber(9));
  543. $this->assertEquals(10, $this->_paginator->normalizeItemNumber(10));
  544. $this->assertEquals(10, $this->_paginator->normalizeItemNumber(11));
  545. }
  546. /**
  547. * @group ZF-8656
  548. */
  549. public function testNormalizesPageNumberWhenGivenAFloat()
  550. {
  551. $this->assertEquals(1, $this->_paginator->normalizePageNumber(0.5));
  552. $this->assertEquals(1, $this->_paginator->normalizePageNumber(1.99));
  553. $this->assertEquals(2, $this->_paginator->normalizePageNumber(2.3));
  554. $this->assertEquals(5, $this->_paginator->normalizePageNumber(5.1));
  555. $this->assertEquals(10, $this->_paginator->normalizePageNumber(10.06));
  556. $this->assertEquals(11, $this->_paginator->normalizePageNumber(11.5));
  557. $this->assertEquals(11, $this->_paginator->normalizePageNumber(12.7889));
  558. }
  559. /**
  560. * @group ZF-8656
  561. */
  562. public function testNormalizesItemNumberWhenGivenAFloat()
  563. {
  564. $this->assertEquals(1, $this->_paginator->normalizeItemNumber(0.5));
  565. $this->assertEquals(1, $this->_paginator->normalizeItemNumber(1.99));
  566. $this->assertEquals(2, $this->_paginator->normalizeItemNumber(2.3));
  567. $this->assertEquals(5, $this->_paginator->normalizeItemNumber(5.1));
  568. $this->assertEquals(9, $this->_paginator->normalizeItemNumber(9.06));
  569. $this->assertEquals(10, $this->_paginator->normalizeItemNumber(10.5));
  570. $this->assertEquals(10, $this->_paginator->normalizeItemNumber(11.7889));
  571. }
  572. public function testGetsPagesInSubsetRange()
  573. {
  574. $actual = $this->_paginator->getPagesInRange(3, 8);
  575. $this->assertEquals(array_combine(range(3, 8), range(3, 8)), $actual);
  576. }
  577. public function testGetsPagesInOutOfBoundsRange()
  578. {
  579. $actual = $this->_paginator->getPagesInRange(-1, 12);
  580. $this->assertEquals(array_combine(range(1, 11), range(1, 11)), $actual);
  581. }
  582. public function testGetsItemsByPage()
  583. {
  584. $expected = new ArrayIterator(range(1, 10));
  585. $page1 = $this->_paginator->getItemsByPage(1);
  586. $this->assertEquals($page1, $expected);
  587. $this->assertEquals($page1, $this->_paginator->getItemsByPage(1));
  588. }
  589. public function testGetsItemCount()
  590. {
  591. $this->assertEquals(101, $this->_paginator->getItemCount(range(1, 101)));
  592. $limitIterator = new LimitIterator(new ArrayIterator(range(1, 101)));
  593. $this->assertEquals(101, $this->_paginator->getItemCount($limitIterator));
  594. }
  595. public function testGetsViewFromViewRenderer()
  596. {
  597. $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
  598. $viewRenderer->setView(new Zend_View());
  599. $this->assertTrue($this->_paginator->getView() instanceof Zend_View_Interface);
  600. }
  601. public function testGeneratesViewIfNonexistent()
  602. {
  603. $this->assertTrue($this->_paginator->getView() instanceof Zend_View_Interface);
  604. }
  605. public function testGetsAndSetsView()
  606. {
  607. $this->_paginator->setView(new Zend_View());
  608. $this->assertTrue($this->_paginator->getView() instanceof Zend_View_Interface);
  609. }
  610. public function testRenders()
  611. {
  612. try {
  613. $this->_paginator->render(new Zend_View());
  614. } catch (Exception $e) {
  615. $this->assertTrue($e instanceof Zend_View_Exception);
  616. $this->assertEquals('No view partial provided and no default set', $e->getMessage());
  617. }
  618. }
  619. public function testGetsAndSetsPageRange()
  620. {
  621. $this->assertEquals(10, $this->_paginator->getPageRange());
  622. $this->_paginator->setPageRange(15);
  623. $this->assertEquals(15, $this->_paginator->getPageRange());
  624. }
  625. /**
  626. * @group ZF-3720
  627. */
  628. public function testGivesCorrectItemCount()
  629. {
  630. $paginator = Zend_Paginator::factory(range(1, 101));
  631. $paginator->setCurrentPageNumber(5)
  632. ->setItemCountPerPage(5);
  633. $expected = new ArrayIterator(range(21, 25));
  634. $this->assertEquals($expected, $paginator->getCurrentItems());
  635. }
  636. /**
  637. * @group ZF-3737
  638. */
  639. public function testKeepsCurrentPageNumberAfterItemCountPerPageSet()
  640. {
  641. $paginator = Zend_Paginator::factory(array('item1', 'item2'));
  642. $paginator->setCurrentPageNumber(2)
  643. ->setItemCountPerPage(1);
  644. $items = $paginator->getCurrentItems();
  645. $this->assertEquals('item2', $items[0]);
  646. }
  647. /**
  648. * @group ZF-4193
  649. */
  650. public function testCastsIntegerValuesToInteger()
  651. {
  652. // Current page number
  653. $this->_paginator->setCurrentPageNumber(3.3);
  654. $this->assertTrue($this->_paginator->getCurrentPageNumber() == 3);
  655. // Item count per page
  656. $this->_paginator->setItemCountPerPage(3.3);
  657. $this->assertTrue($this->_paginator->getItemCountPerPage() == 3);
  658. // Page range
  659. $this->_paginator->setPageRange(3.3);
  660. $this->assertTrue($this->_paginator->getPageRange() == 3);
  661. }
  662. /**
  663. * @group ZF-4207
  664. */
  665. public function testAcceptsTraversableInstanceFromAdapter()
  666. {
  667. $paginator = new Zend_Paginator(new Zf4207());
  668. $this->assertTrue($paginator->getCurrentItems() instanceof ArrayObject);
  669. }
  670. public function testCachedItem()
  671. {
  672. $this->_paginator->setCurrentPageNumber(1)->getCurrentItems();
  673. $this->_paginator->setCurrentPageNumber(2)->getCurrentItems();
  674. $this->_paginator->setCurrentPageNumber(3)->getCurrentItems();
  675. $pageItems = $this->_paginator->getPageItemCache();
  676. $expected = array(
  677. 1 => new ArrayIterator(range(1, 10)),
  678. 2 => new ArrayIterator(range(11, 20)),
  679. 3 => new ArrayIterator(range(21, 30))
  680. );
  681. $this->assertEquals($expected, $pageItems);
  682. }
  683. public function testClearPageItemCache()
  684. {
  685. $this->_paginator->setCurrentPageNumber(1)->getCurrentItems();
  686. $this->_paginator->setCurrentPageNumber(2)->getCurrentItems();
  687. $this->_paginator->setCurrentPageNumber(3)->getCurrentItems();
  688. // clear only page 2 items
  689. $this->_paginator->clearPageItemCache(2);
  690. $pageItems = $this->_paginator->getPageItemCache();
  691. $expected = array(
  692. 1 => new ArrayIterator(range(1, 10)),
  693. 3 => new ArrayIterator(range(21, 30))
  694. );
  695. $this->assertEquals($expected, $pageItems);
  696. // clear all
  697. $this->_paginator->clearPageItemCache();
  698. $pageItems = $this->_paginator->getPageItemCache();
  699. $this->assertEquals(array(), $pageItems);
  700. }
  701. public function testWithCacheDisabled()
  702. {
  703. $this->_paginator->setCacheEnabled(false);
  704. $this->_paginator->setCurrentPageNumber(1)->getCurrentItems();
  705. $cachedPageItems = $this->_paginator->getPageItemCache();
  706. $expected = new ArrayIterator(range(1, 10));
  707. $this->assertEquals(array(), $cachedPageItems);
  708. $pageItems = $this->_paginator->getCurrentItems();
  709. $this->assertEquals($expected, $pageItems);
  710. }
  711. public function testCacheDoesNotDisturbResultsWhenChangingParam()
  712. {
  713. $this->_paginator->setCurrentPageNumber(1)->getCurrentItems();
  714. $pageItems = $this->_paginator->setItemCountPerPage(5)->getCurrentItems();
  715. $expected = new ArrayIterator(range(1, 5));
  716. $this->assertEquals($expected, $pageItems);
  717. $pageItems = $this->_paginator->getItemsByPage(2);
  718. $expected = new ArrayIterator(range(6, 10));
  719. $this->assertEquals($expected, $pageItems);
  720. // change the inside Paginator scale
  721. $pageItems = $this->_paginator->setItemCountPerPage(8)->setCurrentPageNumber(3)->getCurrentItems();
  722. $pageItems = $this->_paginator->getPageItemCache();
  723. $expected = array(3 => new ArrayIterator(range(17, 24)));
  724. $this->assertEquals($expected, $pageItems);
  725. // get back to already cached data
  726. $this->_paginator->setItemCountPerPage(5);
  727. $pageItems = $this->_paginator->getPageItemCache();
  728. $expected =array(1 => new ArrayIterator(range(1, 5)),
  729. 2 => new ArrayIterator(range(6, 10)));
  730. $this->assertEquals($expected, $pageItems);
  731. }
  732. public function testToJson()
  733. {
  734. $this->_paginator->setCurrentPageNumber(1);
  735. $json = $this->_paginator->toJson();
  736. $expected = '"0":1,"1":2,"2":3,"3":4,"4":5,"5":6,"6":7,"7":8,"8":9,"9":10';
  737. $this->assertContains($expected, $json);
  738. }
  739. // ZF-5519
  740. public function testFilter()
  741. {
  742. $filter = new Zend_Filter_Callback(array($this, 'filterCallback'));
  743. $paginator = Zend_Paginator::factory(range(1, 10));
  744. $paginator->setFilter($filter);
  745. $page = $paginator->getCurrentItems();
  746. $this->assertEquals(new ArrayIterator(range(10, 100, 10)), $page);
  747. }
  748. public function filterCallback($value)
  749. {
  750. $data = array();
  751. foreach ($value as $number) {
  752. $data[] = ($number * 10);
  753. }
  754. return $data;
  755. }
  756. /**
  757. * @group ZF-5785
  758. */
  759. public function testGetSetDefaultItemCountPerPage()
  760. {
  761. Zend_Paginator::setConfig(new Zend_Config(array()));
  762. $paginator = Zend_Paginator::factory(range(1, 10));
  763. $this->assertEquals(10, $paginator->getItemCountPerPage());
  764. Zend_Paginator::setDefaultItemCountPerPage(20);
  765. $this->assertEquals(20, Zend_Paginator::getDefaultItemCountPerPage());
  766. $paginator = Zend_Paginator::factory(range(1, 10));
  767. $this->assertEquals(20, $paginator->getItemCountPerPage());
  768. $this->_restorePaginatorDefaults();
  769. }
  770. /**
  771. * @group ZF-7207
  772. */
  773. public function testItemCountPerPageByDefault()
  774. {
  775. $paginator = Zend_Paginator::factory(range(1,20));
  776. $this->assertEquals(2, $paginator->count());
  777. }
  778. /**
  779. * @group ZF-5427
  780. */
  781. public function testNegativeItemNumbers()
  782. {
  783. $this->assertEquals(10, $this->_paginator->getItem(-1, 1));
  784. $this->assertEquals(9, $this->_paginator->getItem(-2, 1));
  785. $this->assertEquals(101, $this->_paginator->getItem(-1, -1));
  786. }
  787. /**
  788. * @group ZF-7602
  789. */
  790. public function testAcceptAndHandlePaginatorAdapterAggregateDataInFactory()
  791. {
  792. $p = Zend_Paginator::factory(new Zend_Paginator_TestArrayAggregate());
  793. $this->assertEquals(1, count($p));
  794. $this->assertTrue($p->getAdapter() instanceof Zend_Paginator_Adapter_Array);
  795. $this->assertEquals(4, count($p->getAdapter()));
  796. }
  797. /**
  798. * @group ZF-7602
  799. */
  800. public function testAcceptAndHandlePaginatorAdapterAggreageInConstructor()
  801. {
  802. $p = new Zend_Paginator(new Zend_Paginator_TestArrayAggregate());
  803. $this->assertEquals(1, count($p));
  804. $this->assertTrue($p->getAdapter() instanceof Zend_Paginator_Adapter_Array);
  805. $this->assertEquals(4, count($p->getAdapter()));
  806. }
  807. /**
  808. * @group ZF-7602
  809. */
  810. public function testInvalidDataInConstructor_ThrowsException()
  811. {
  812. $this->setExpectedException("Zend_Paginator_Exception");
  813. $p = new Zend_Paginator(array());
  814. }
  815. /**
  816. * @group ZF-9396
  817. */
  818. public function testArrayAccessInClassSerializableLimitIterator()
  819. {
  820. $iterator = new ArrayIterator(array('zf9396', 'foo', null));
  821. $paginator = Zend_Paginator::factory($iterator);
  822. $this->assertEquals('zf9396', $paginator->getItem(1));
  823. $items = $paginator->getAdapter()
  824. ->getItems(0, 10);
  825. $this->assertEquals('foo', $items[1]);
  826. $this->assertEquals(0, $items->key());
  827. $this->assertFalse(isset($items[2]));
  828. $this->assertTrue(isset($items[1]));
  829. $this->assertFalse(isset($items[3]));
  830. $this->assertEquals(0, $items->key());
  831. }
  832. /**
  833. * @group ZF-9174
  834. */
  835. public function testSetDefaultPageRange()
  836. {
  837. Zend_Paginator::setConfig(new Zend_Config(array()));
  838. $paginator = Zend_Paginator::factory(range(1, 10));
  839. $this->assertEquals(10, $paginator->getPageRange());
  840. Zend_Paginator::setDefaultPageRange(20);
  841. $this->assertEquals(20, Zend_Paginator::getDefaultPageRange());
  842. $paginator = Zend_Paginator::factory(range(1, 10));
  843. $this->assertEquals(20, $paginator->getPageRange());
  844. $this->_restorePaginatorDefaults();
  845. }
  846. /**
  847. * @group ZF-6989
  848. */
  849. public function testCurrentItemCountIsRetrievedFromCacheIfCachingIsEnabled()
  850. {
  851. $dbAdapter = $this->getMockForAbstractClass('Zend_Db_Adapter_Abstract', array(''), '', false);
  852. $select = new Zend_Db_Select($dbAdapter);
  853. $select->from('ZF_6989');
  854. $paginatorAdapter = new Zend_Paginator_Adapter_DbSelect($select);
  855. $paginatorAdapter->setRowCount(6989);
  856. $paginator = new Zend_Paginator_TestCache($paginatorAdapter);
  857. $expectedCacheId = md5($paginator->getCacheInternalId() . '_itemCount');
  858. $cache = $this->getMock('Zend_Cache_Core', array('load'), array(), '', false);
  859. $cache->expects($this->once())
  860. ->method('load')
  861. ->with($expectedCacheId)
  862. ->will($this->returnValue(6989));
  863. $paginator->setCacheEnabled(true)
  864. ->setCache($cache);
  865. $this->assertSame(6989, $paginator->getTotalItemCount(), 'Total item count incorrect!');
  866. }
  867. /**
  868. * @group ZF-6989
  869. */
  870. public function testPaginatorGeneratesSameCacheIdentifierForDbSelectAdaptersWithIdenticalSqlStatements()
  871. {
  872. $dbAdapterOne = $this->getMockForAbstractClass('Zend_Db_Adapter_Abstract', array(''),
  873. __FUNCTION__ . 'DbAdapterOne', false);
  874. $selectOne = new Zend_Db_Select($dbAdapterOne);
  875. $selectOne->from('ZF_6989');
  876. $paginatorAdapterOne = new Zend_Paginator_Adapter_DbSelect($selectOne);
  877. $paginatorAdapterOne->setRowCount(6989);
  878. $paginatorOne = new Zend_Paginator_TestCache($paginatorAdapterOne);
  879. $dbAdapterTwo = $this->getMockForAbstractClass('Zend_Db_Adapter_Abstract', array(''),
  880. __FUNCTION__ . 'DbAdapterTwo', false);
  881. $selectTwo = new Zend_Db_Select($dbAdapterTwo);
  882. $selectTwo->from('ZF_6989');
  883. $paginatorAdapterTwo = new Zend_Paginator_Adapter_DbSelect($selectTwo);
  884. $paginatorAdapterTwo->setRowCount(6989);
  885. $paginatorTwo = new Zend_Paginator_TestCache($paginatorAdapterTwo);
  886. $this->assertSame($paginatorOne->getCacheInternalId(), $paginatorTwo->getCacheInternalId(),
  887. 'DbSelect adapters with identical select statements should have the same cache internal IDs!');
  888. }
  889. /**
  890. * @group ZF-6989
  891. */
  892. public function testPaginatorGeneratesSameCacheIdentifierForDbTableSelectAdaptersWithIdenticalSqlStatements()
  893. {
  894. $dbAdapterOne = $this->getMockForAbstractClass('Zend_Db_Adapter_Abstract', array(''),
  895. __FUNCTION__ . 'DbAdapterOne', false);
  896. $selectOne = new Zend_Db_Select($dbAdapterOne);
  897. $selectOne->from('ZF_6989');
  898. $paginatorAdapterOne = new Zend_Paginator_Adapter_DbSelect($selectOne);
  899. $paginatorAdapterOne->setRowCount(6989);
  900. $paginatorOne = new Zend_Paginator_TestCache($paginatorAdapterOne);
  901. $dbAdapterTwo = $this->getMockForAbstractClass('Zend_Db_Adapter_Abstract', array(''),
  902. __FUNCTION__ . 'DbAdapterTwo', false);
  903. $selectTwo = new Zend_Db_Select($dbAdapterTwo);
  904. $selectTwo->from('ZF_6989');
  905. $paginatorAdapterTwo = new Zend_Paginator_Adapter_DbSelect($selectTwo);
  906. $paginatorAdapterTwo->setRowCount(6989);
  907. $paginatorTwo = new Zend_Paginator_TestCache($paginatorAdapterTwo);
  908. $this->assertSame($paginatorOne->getCacheInternalId(), $paginatorTwo->getCacheInternalId(),
  909. 'DbSelect adapters with identical select statements should have the same cache internal IDs!');
  910. }
  911. }
  912. class Zend_Paginator_TestArrayAggregate implements Zend_Paginator_AdapterAggregate
  913. {
  914. public function getPaginatorAdapter()
  915. {
  916. return new Zend_Paginator_Adapter_Array(array(1, 2, 3, 4));
  917. }
  918. }
  919. /**
  920. * Wrapper around Zend_Paginator to provide access to cache internal ID method
  921. * for testing purposes.
  922. */
  923. class Zend_Paginator_TestCache extends Zend_Paginator
  924. {
  925. /**
  926. * Returns the cache internal ID.
  927. * @return string
  928. */
  929. public function getCacheInternalId()
  930. {
  931. return $this->_getCacheInternalId();
  932. }
  933. }
  934. // Call Zend_PaginatorTest::main() if this source file is executed directly.
  935. if (PHPUnit_MAIN_METHOD === 'Zend_PaginatorTest::main') {
  936. Zend_PaginatorTest::main();
  937. }