/** * @dataProvider paginatorDataProvider */ public function testPaginator($uri, $pageNumber, $postCount) { $siteRoot = 'http://example.org/'; $pc = new MockPieCrust(); $pc->getConfig()->setValue('site/root', $siteRoot); $pc->getConfig()->setValue('site/pretty_urls', true); $pc->getConfig()->setValue('blog/posts_per_page', 5); $pc->getConfig()->setValue('blog/date_format', 'F j, Y'); $page = new MockPage($pc); $page->uri = $uri; $page->pageNumber = $pageNumber; $paginator = new Paginator($page); $paginator->setPaginationDataSource($this->buildPaginationDataSource($pc, $postCount)); $this->assertNotNull($paginator->getPaginationDataSource()); $posts = $paginator->posts(); $this->assertNotNull($posts); if ($postCount <= 5) { // All posts fit on the page. $this->assertNull($paginator->prev_page_number()); $this->assertNull($paginator->prev_page()); $this->assertEquals(1, $paginator->this_page_number()); $this->assertEquals($siteRoot . $uri, $paginator->this_page()); $this->assertNull($paginator->next_page_number()); $this->assertNull($paginator->next_page()); } else { if ($pageNumber <= 1) { // Lots of posts, but this is the first page. $this->assertNull($paginator->prev_page_number()); $this->assertNull($paginator->prev_page()); $this->assertEquals(1, $paginator->this_page_number()); $this->assertEquals($siteRoot . $uri, $paginator->this_page()); $this->assertEquals(2, $paginator->next_page_number()); $this->assertEquals($siteRoot . ($uri == '' ? '2' : $uri . '/2'), $paginator->next_page()); } else { if ($pageNumber * 5 > $postCount) { // Lots of posts, and this is a page somewhere in the middle, or // the last page. if ($pageNumber >= 2) { $this->assertEquals($pageNumber - 1, $paginator->prev_page_number()); $prevPage = $uri == '' ? (string) ($pageNumber - 1) : $uri . '/' . ($pageNumber - 1); if ($pageNumber - 1 <= 1) { $prevPage = $uri; } $this->assertEquals($siteRoot . $prevPage, $paginator->prev_page()); } else { $this->assertNull($paginator->prev_page_number()); $this->assertNull($paginator->prev_page()); } $this->assertEquals($pageNumber, $paginator->this_page_number()); $this->assertEquals($siteRoot . ($uri == '' ? (string) $pageNumber : $uri . '/' . $pageNumber), $paginator->this_page()); if ($pageNumber * 5 > $postCount) { $this->assertNull($paginator->next_page_number()); $this->assertNull($paginator->next_page()); } else { $this->assertEquals($pageNumber + 1, $paginator->next_page_number()); $this->assertEquals($siteRoot . ($uri == '' ? (string) ($pageNumber + 1) : $uri . '/' . ($pageNumber + 1)), $paginator->next_page()); } } } } $this->assertEquals($postCount, $paginator->total_post_count()); $pageCount = (int) ceil((double) $postCount / 5.0); $this->assertEquals($pageCount, $paginator->total_page_count()); if ($pageCount == 0) { $this->assertEquals(array(), $paginator->all_page_numbers()); } else { $this->assertEquals(range(1, $pageCount), $paginator->all_page_numbers()); } foreach (range(1, 7) as $radius) { $numberCount = $radius * 2 + 1; if ($pageCount == 0) { $pageNumbers = array(); } else { $pageNumbers = range($pageNumber - $radius, $pageNumber + $radius); $pageNumbers = array_filter($pageNumbers, function ($i) use($pageCount) { return $i >= 1 && $i <= $pageCount; }); $pageNumbers = array_values($pageNumbers); if (count($pageNumbers) < $numberCount) { $toAdd = $numberCount - count($pageNumbers); if ($pageNumbers[0] > 1) { $cur = $pageNumbers[0] - 1; foreach (range(1, $toAdd) as $i) { array_unshift($pageNumbers, $cur); if (--$cur <= 1) { break; } } } else { if ($pageNumbers[count($pageNumbers) - 1] < $pageCount) { $cur = $pageNumbers[count($pageNumbers) - 1] + 1; foreach (range(1, $toAdd) as $i) { $pageNumbers[] = $cur; if (++$cur >= $pageCount) { break; } } } } } } $this->assertEquals($pageNumbers, $paginator->all_page_numbers($radius), "Wrong result for {$numberCount} page numbers around page {$pageNumber} out of {$pageCount} total pages."); } $expectedCount = $postCount; if ($postCount > 5) { if ($pageNumber * 5 <= $postCount) { $expectedCount = 5; } else { $expectedCount = $postCount % 5; } } $expectedIndices = array(); if ($postCount > 0) { $allIndices = array_reverse(range(0, $postCount - 1)); $expectedIndices = array_slice($allIndices, 5 * ($pageNumber - 1), $expectedCount); } $this->assertExpectedPostsData($expectedIndices, $posts); }