Example #1
0
 /**
  * @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);
 }
 /**
  * @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());
                 }
             }
         }
     }
     $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);
 }