assertEquals(0, $list->getPageStart(), 'The start defaults to 0.'); $list->setPageStart(10); $this->assertEquals(10, $list->getPageStart(), 'You can set the page start.'); $list = new PaginatedList(new ArrayList(), array('start' => 50)); $this->assertEquals(50, $list->getPageStart(), 'The page start can be read from the request.'); } public function testGetTotalItems() { $list = new PaginatedList(new ArrayList()); $this->assertEquals(0, $list->getTotalItems()); $list->setTotalItems(10); $this->assertEquals(10, $list->getTotalItems()); $list = new PaginatedList( new ArrayList( array( new ArrayData(array()), new ArrayData(array()) ) ) ); $this->assertEquals(2, $list->getTotalItems()); } public function testSetPaginationFromQuery() { $query = $this->getMockBuilder(SQLSelect::class)->getMock(); $query->expects($this->once()) ->method('getLimit') ->will($this->returnValue(array('limit' => 15, 'start' => 30))); $query->expects($this->once()) ->method('unlimitedRowCount') ->will($this->returnValue(100)); $list = new PaginatedList(new ArrayList()); $list->setPaginationFromQuery($query); $this->assertEquals(15, $list->getPageLength()); $this->assertEquals(30, $list->getPageStart()); $this->assertEquals(100, $list->getTotalItems()); } public function testSetCurrentPage() { $list = new PaginatedList(new ArrayList()); $list->setPageLength(10); $list->setCurrentPage(10); $this->assertEquals(10, $list->CurrentPage()); $this->assertEquals(90, $list->getPageStart()); // Test disabled paging $list->setPageLength(0); $this->assertEquals(1, $list->CurrentPage()); } public function testGetIterator() { $list = new PaginatedList( new ArrayList([ new DataObject(array('Num' => 1)), new DataObject(array('Num' => 2)), new DataObject(array('Num' => 3)), new DataObject(array('Num' => 4)), new DataObject(array('Num' => 5)), ]) ); $list->setPageLength(2); $this->assertListEquals( array(array('Num' => 1), array('Num' => 2)), ArrayList::create($list->getIterator()->getInnerIterator()->getArrayCopy()) ); $list->setCurrentPage(2); $this->assertListEquals( array(array('Num' => 3), array('Num' => 4)), ArrayList::create($list->getIterator()->getInnerIterator()->getArrayCopy()) ); $list->setCurrentPage(3); $this->assertListEquals( array(array('Num' => 5)), ArrayList::create($list->getIterator()->getInnerIterator()->getArrayCopy()) ); $list->setCurrentPage(999); $this->assertListEquals( array(), ArrayList::create($list->getIterator()->getInnerIterator()->getArrayCopy()) ); // Test disabled paging $list->setPageLength(0); $list->setCurrentPage(1); $this->assertListEquals( [ array('Num' => 1), array('Num' => 2), array('Num' => 3), array('Num' => 4), array('Num' => 5), ], ArrayList::create($list->getIterator()->getInnerIterator()->getArrayCopy()) ); // Test with dataobjectset $players = Player::get(); $list = new PaginatedList($players); $list->setPageLength(1); $list->getIterator(); $this->assertEquals( 4, $list->getTotalItems(), 'Getting an iterator should not trim the list to the page length.' ); } public function testPages() { $list = new PaginatedList(new ArrayList()); $list->setPageLength(10); $list->setTotalItems(50); $this->assertCount(5, $list->Pages()); $this->assertCount(3, $list->Pages(3)); $this->assertCount(5, $list->Pages(15)); $list->setCurrentPage(3); $expectAll = array( array('PageNum' => 1), array('PageNum' => 2), array('PageNum' => 3, 'CurrentBool' => true), array('PageNum' => 4), array('PageNum' => 5), ); $this->assertListEquals($expectAll, $list->Pages()); $expectLimited = array( array('PageNum' => 2), array('PageNum' => 3, 'CurrentBool' => true), array('PageNum' => 4), ); $this->assertListEquals($expectLimited, $list->Pages(3)); // Disable paging $list->setPageLength(0); $expectAll = array( array('PageNum' => 1, 'CurrentBool' => true), ); $this->assertListEquals($expectAll, $list->Pages()); } public function testPaginationSummary() { $list = new PaginatedList(new ArrayList()); $list->setPageLength(10); $list->setTotalItems(250); $list->setCurrentPage(6); $expect = array( array('PageNum' => 1), array('PageNum' => null), array('PageNum' => 4), array('PageNum' => 5), array('PageNum' => 6, 'CurrentBool' => true), array('PageNum' => 7), array('PageNum' => 8), array('PageNum' => null), array('PageNum' => 25), ); $this->assertListEquals($expect, $list->PaginationSummary(4)); // Disable paging $list->setPageLength(0); $expect = array( array('PageNum' => 1, 'CurrentBool' => true) ); $this->assertListEquals($expect, $list->PaginationSummary(4)); } public function testLimitItems() { $list = new ArrayList(range(1, 50)); $list = new PaginatedList($list); $list->setCurrentPage(3); $this->assertCount(10, $list->getIterator()->getInnerIterator()); $list->setLimitItems(false); $this->assertCount(50, $list->getIterator()->getInnerIterator()); } public function testCurrentPage() { $list = new PaginatedList(new ArrayList()); $list->setTotalItems(50); $this->assertEquals(1, $list->CurrentPage()); $list->setPageStart(10); $this->assertEquals(2, $list->CurrentPage()); $list->setPageStart(40); $this->assertEquals(5, $list->CurrentPage()); // Disable paging $list->setPageLength(0); $this->assertEquals(1, $list->CurrentPage()); } public function testTotalPages() { $list = new PaginatedList(new ArrayList()); $list->setPageLength(1); $this->assertEquals(0, $list->TotalPages()); $list->setTotalItems(1); $this->assertEquals(1, $list->TotalPages()); $list->setTotalItems(5); $this->assertEquals(5, $list->TotalPages()); // Disable paging $list->setPageLength(0); $this->assertEquals(1, $list->TotalPages()); $list->setTotalItems(0); $this->assertEquals(0, $list->TotalPages()); } public function testMoreThanOnePage() { $list = new PaginatedList(new ArrayList()); $list->setPageLength(1); $list->setTotalItems(1); $this->assertFalse($list->MoreThanOnePage()); $list->setTotalItems(2); $this->assertTrue($list->MoreThanOnePage()); // Disable paging $list->setPageLength(0); $this->assertFalse($list->MoreThanOnePage()); } public function testNotFirstPage() { $list = new PaginatedList(new ArrayList()); $this->assertFalse($list->NotFirstPage()); $list->setCurrentPage(2); $this->assertTrue($list->NotFirstPage()); } public function testNotLastPage() { $list = new PaginatedList(new ArrayList()); $list->setTotalItems(50); $this->assertTrue($list->NotLastPage()); $list->setCurrentPage(5); $this->assertFalse($list->NotLastPage()); } public function testFirstItem() { $list = new PaginatedList(new ArrayList()); $this->assertEquals(1, $list->FirstItem()); $list->setPageStart(10); $this->assertEquals(11, $list->FirstItem()); } public function testLastItem() { $list = new PaginatedList(new ArrayList()); $list->setPageLength(10); $list->setTotalItems(25); $list->setCurrentPage(1); $this->assertEquals(10, $list->LastItem()); $list->setCurrentPage(2); $this->assertEquals(20, $list->LastItem()); $list->setCurrentPage(3); $this->assertEquals(25, $list->LastItem()); // Disable paging $list->setPageLength(0); $this->assertEquals(25, $list->LastItem()); } public function testFirstLink() { $list = new PaginatedList(new ArrayList()); $this->assertContains('start=0', $list->FirstLink()); } public function testFirstLinkContainsCurrentGetParameters() { $request = new HTTPRequest( 'GET', 'http://example.com/my-cool-page', ['awesomeness' => 'nextLevel', 'start' => 20] ); $list = new PaginatedList(new ArrayList(), $request); $list->setTotalItems(50); $list->setPageLength(10); // check the query string has correct parameters $queryString = parse_url($list->FirstLink(), PHP_URL_QUERY); parse_str($queryString, $queryParams); $this->assertArrayHasKey('awesomeness', $queryParams); $this->assertequals('nextLevel', $queryParams['awesomeness']); $this->assertArrayHasKey('start', $queryParams); $this->assertequals(0, $queryParams['start']); } public function testLastLink() { $list = new PaginatedList(new ArrayList()); $list->setPageLength(10); $list->setTotalItems(100); $this->assertContains('start=90', $list->LastLink()); // Disable paging $list->setPageLength(0); $this->assertContains('start=0', $list->LastLink()); } public function testLastLinkContainsCurrentGetParameters() { $request = new HTTPRequest( 'GET', 'http://example.com/my-cool-page', ['awesomeness' => 'nextLevel'] ); $list = new PaginatedList(new ArrayList(), $request); $list->setTotalItems(50); $list->setPageLength(10); // check the query string has correct parameters $queryString = parse_url($list->LastLink(), PHP_URL_QUERY); parse_str($queryString, $queryParams); $this->assertArrayHasKey('awesomeness', $queryParams); $this->assertequals('nextLevel', $queryParams['awesomeness']); $this->assertArrayHasKey('start', $queryParams); $this->assertequals(40, $queryParams['start']); } public function testNextLink() { $list = new PaginatedList(new ArrayList()); $list->setTotalItems(50); $this->assertContains('start=10', $list->NextLink()); $list->setCurrentPage(2); $this->assertContains('start=20', $list->NextLink()); $list->setCurrentPage(3); $this->assertContains('start=30', $list->NextLink()); $list->setCurrentPage(4); $this->assertContains('start=40', $list->NextLink()); $list->setCurrentPage(5); $this->assertNull($list->NextLink()); // Disable paging $list->setCurrentPage(1); $list->setPageLength(0); $this->assertNull($list->NextLink()); } public function testNextLinkContainsCurrentGetParameters() { $request = new HTTPRequest( 'GET', 'http://example.com/my-cool-page', ['awesomeness' => 'nextLevel'] ); $list = new PaginatedList(new ArrayList(), $request); $list->setTotalItems(50); $list->setPageLength(10); // check the query string has correct parameters $queryString = parse_url($list->NextLink(), PHP_URL_QUERY); parse_str($queryString, $queryParams); $this->assertArrayHasKey('awesomeness', $queryParams); $this->assertequals('nextLevel', $queryParams['awesomeness']); $this->assertArrayHasKey('start', $queryParams); $this->assertequals(10, $queryParams['start']); } public function testPrevLink() { $list = new PaginatedList(new ArrayList()); $list->setTotalItems(50); $this->assertNull($list->PrevLink()); $list->setCurrentPage(2); $this->assertContains('start=0', $list->PrevLink()); $list->setCurrentPage(3); $this->assertContains('start=10', $list->PrevLink()); $list->setCurrentPage(5); $this->assertContains('start=30', $list->PrevLink()); // Disable paging $list->setPageLength(0); $this->assertNull($list->PrevLink()); } public function testPrevLinkContainsCurrentGetParameters() { $request = new HTTPRequest( 'GET', 'http://example.com/my-cool-page', ['awesomeness' => 'nextLevel', 'start' => '30'] ); $list = new PaginatedList(new ArrayList(), $request); $list->setTotalItems(50); $list->setPageLength(10); // check the query string has correct parameters $queryString = parse_url($list->PrevLink(), PHP_URL_QUERY); parse_str($queryString, $queryParams); $this->assertArrayHasKey('awesomeness', $queryParams); $this->assertequals('nextLevel', $queryParams['awesomeness']); $this->assertArrayHasKey('start', $queryParams); $this->assertequals(20, $queryParams['start']); } }