<?php
// $Id: pager_test.php,v 1.13 2005/06/02 10:10:51 quipo Exp $

require_once 'simple_include.php';
require_once 'pager_include.php';

class TestOfPager extends UnitTestCase {
    var $pager;
    var $baseurl;
    function TestOfPager($name='Test of Pager') {
        $this->UnitTestCase($name);
    }
    function setUp() {
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
        );
        $this->pager = Pager::factory($options);
        $this->baseurl = substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'));
    }
    function tearDown() {
        unset($this->pager);
    }
    function testCurrentPageID () {
        $this->assertEqual(1, $this->pager->getCurrentPageID());
    }
    function testNextPageID () {
        $this->assertEqual(2, $this->pager->getNextPageID());
    }
    function testPrevPageID () {
        $this->assertEqual(false, $this->pager->getPreviousPageID());
    }
    function testNumItems () {
        $this->assertEqual(10, $this->pager->numItems());
    }
    function testNumPages () {
        $this->assertEqual(2, $this->pager->numPages());
    }
    function testFirstPage () {
        $this->assertEqual(true, $this->pager->isFirstPage());
    }
    function testLastPage () {
        $this->assertEqual(false, $this->pager->isLastPage());
    }
    function testLastPageComplete () {
        $this->assertEqual(true, $this->pager->isLastPageComplete());
    }
    function testOffsetByPageId1() {
        $this->assertEqual(array(1, 5), $this->pager->getOffsetByPageId(1));
    }
    function testOffsetByPageId2() {
        $this->assertEqual(array(6, 10), $this->pager->getOffsetByPageId(2));
    }
    function testOffsetByPageId_outOfRange() {
        $this->assertEqual(array(0, 0), $this->pager->getOffsetByPageId(20));
    }
    function testGetPageData() {
        $this->assertEqual(array(0=>1, 1=>2, 2=>3, 3=>4, 4=>5), $this->pager->getPageData());
    }
    function testGetPageData2() {
        $this->assertEqual(array(5=>6, 6=>7, 7=>8, 8=>9, 9=>10), $this->pager->getPageData(2));
    }
    function testGetPageData_OutOfRange() {
        $this->assertEqual(false, $this->pager->getPageData(3));
    }
    function testSelectBox() {
        $selectBox  = '<select name="'.$this->pager->_sessionVar.'">';
        $selectBox .= '<option value="5" selected="selected">5</option>';
        $selectBox .= '<option value="10">10</option>';
        $selectBox .= '<option value="15">15</option>';
        $selectBox .= '</select>';
        $this->assertEqual($selectBox, $this->pager->getPerPageSelectBox(5, 15, 5));
    }
    function testSelectBoxWithString() {
        $selectBox  = '<select name="'.$this->pager->_sessionVar.'">';
        $selectBox .= '<option value="5" selected="selected">5 bugs</option>';
        $selectBox .= '<option value="10">10 bugs</option>';
        $selectBox .= '<option value="15">15 bugs</option>';
        $selectBox .= '</select>';
        $this->assertEqual($selectBox, $this->pager->getPerPageSelectBox(5, 15, 5, false, '%d bugs'));
    }
    function testSelectBoxWithShowAll() {
        $selectBox  = '<select name="'.$this->pager->_sessionVar.'">';
        $selectBox .= '<option value="3">3</option>';
        $selectBox .= '<option value="4">4</option>';
        $selectBox .= '<option value="5" selected="selected">5</option>';
        $selectBox .= '<option value="6">6</option>';
        $selectBox .= '<option value="10">10</option>';
        $selectBox .= '</select>';
        $this->assertEqual($selectBox, $this->pager->getPerPageSelectBox(3, 6, 1, true));
    }
    function testSelectBoxWithShowAllAndText() {
        $this->pager->_showAllText = 'Show All';
        $selectBox  = '<select name="'.$this->pager->_sessionVar.'">';
        $selectBox .= '<option value="3">3 bugs</option>';
        $selectBox .= '<option value="4">4 bugs</option>';
        $selectBox .= '<option value="5" selected="selected">5 bugs</option>';
        $selectBox .= '<option value="6">6 bugs</option>';
        $selectBox .= '<option value="10">Show All</option>';
        $selectBox .= '</select>';
        $this->assertEqual($selectBox, $this->pager->getPerPageSelectBox(3, 6, 1, true, '%d bugs'));
    }
    function testSelectBoxWithShowAllWithExtraAttribs() {
        $this->pager->_showAllText = 'Show All';
        $selectBox  = '<select name="'.$this->pager->_sessionVar.'" onmouseover="doSth">';
        $selectBox .= '<option value="3">3 bugs</option>';
        $selectBox .= '<option value="4">4 bugs</option>';
        $selectBox .= '<option value="5" selected="selected">5 bugs</option>';
        $selectBox .= '<option value="6">6 bugs</option>';
        $selectBox .= '<option value="10">Show All</option>';
        $selectBox .= '</select>';
        $params = array('optionText' => '%d bugs', 'attributes' => 'onmouseover="doSth"');
        $this->assertEqual($selectBox, $this->pager->getPerPageSelectBox(3, 6, 1, true, $params));
    }
    function testSelectBoxInvalid() {
        $err = $this->pager->getPerPageSelectBox(5, 15, 5, false, '%s bugs');
        $this->assertEqual(ERROR_PAGER_INVALID_PLACEHOLDER, $err->getCode());
    }
    function testAppendInvalid() {
        $options = array(
            'totalItems' => 10,
            'append'     => false,
            'fileName'   => 'invalidFileName'
        );
        $err =& Pager::factory($options);  //ERROR_PAGER_INVALID_USAGE
        $this->assertError();
    }
    function testAppendValid() {
        $options = array(
            'totalItems' => 10,
            'append'     => false,
            'fileName'   => 'valid_%d_FileName'
        );
        $err =& Pager::factory($options);
        $this->assertNoErrors();
    }
    function testEscapeEntities() {
        //encode special chars
        $options = array(
            'extraVars' => array(
                'request' => array('aRequest'),
                'escape'    => 'дц%<>+',
            ),
            'perPage' => 5,
        );
        $this->pager =& Pager::factory($options);
        //$expected = '?request[]=aRequest&amp;escape=&auml;&ouml;%&lt;&gt;+&amp;pageID=';
        //$this->assertEqual($expected, $this->pager->_getLinksUrl());

        $expected = '<a href="'.$_SERVER['PHP_SELF'].'?request[0]=aRequest&amp;escape=&auml;&ouml;%&lt;&gt;+" title=""></a>';
        $actual = $this->pager->_renderLink('', '');
        $this->assertEqual($expected, $actual);

        //don't encode slashes
        $options = array(
            'extraVars' => array(
                'request' => 'cat/subcat',
            ),
            'perPage' => 5,
        );
        $this->pager =& Pager::factory($options);
        //$expected = '?request=cat/subcat&amp;pageID=';
        //$this->assertEqual($expected, $this->pager->_getLinksUrl());
        $expected = '<a href="'.$_SERVER['PHP_SELF'].'?request=cat/subcat" title=""></a>';
        $actual = $this->pager->_renderLink('', '');
        $this->assertEqual($expected, $actual);
    }
    function testCurrentPage() {
        $options = array(
            'itemData'    => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'     => 2,
            'currentPage' => 2,
        );
        $this->pager =& Pager::factory($options);
        $this->assertEqual(3, $this->pager->getNextPageID());
        $this->assertEqual(1, $this->pager->getPreviousPageID());
        $this->assertEqual(2, $this->pager->_currentPage);
    }
    function testArrayExtraVars() {
        $arr = array(
            'apple',
            'orange',
        );
        $options = array(
            'itemData'    => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'     => 5,
            'extraVars'   => array('arr' => $arr, 'no' => 'test'),
        );
        $this->pager =& Pager::factory($options);
        /*
        //old
        $expected = '?arr[0]=apple&amp;arr[1]=orange&amp;pageID=';
        $this->assertEqual($expected, $this->pager->_getLinksUrl());
        */
        $expected = $options['extraVars'];
        $this->assertEqual($expected, $this->pager->_getLinksData());

        $expected = '<a href="'.$_SERVER['PHP_SELF'].'?arr[0]=apple&amp;arr[1]=orange&amp;no=test&amp;pageID=2" title=""></a>';
        $actual = $this->pager->_renderLink('', '');
        $this->assertEqual($expected, $actual);
    }
    function testExcludeVars() {
        $arr = array(
            'apple',
            'orange',
        );
        $options = array(
            'itemData'    => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'     => 5,
            'extraVars'   => array('arr' => $arr, 'no' => 'test'),
            'excludeVars' => array('no'),
        );
        $this->pager =& Pager::factory($options);
        $expected = array(
            'arr' => array(
                0 => 'apple',
                1 => 'orange'
            ),
        );
        $actual = $this->pager->_getLinksData();
        $this->assertEqual($expected, $this->pager->_getLinksData());

        $expected = '<a href="'.$_SERVER['PHP_SELF'].'?arr[0]=apple&amp;arr[1]=orange&amp;pageID=2" title=""></a>';
        $actual = $this->pager->_renderLink('', '');
        $this->assertEqual($expected, $actual);
    }
    function testArgSeparator() {
        $bkp_arg_separator = ini_get('arg_separator.output');
        ini_set('arg_separator.output', '&amp;');

        $options = array(
            'itemData'    => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'     => 5,
            'extraVars'   => array('apple'  => 1),
        );
        $this->pager =& Pager::factory($options);

        $expected = '<a href="'.$_SERVER['PHP_SELF'].'?apple=1&amp;pageID=2" title=""></a>';
        $actual = $this->pager->_renderLink('', '');
        $this->assertEqual($expected, $actual);

        ini_set('arg_separator.output', $bkp_arg_separator);
    }
    function testImportQuery() {
        //add some fake url vars
        $_GET['arr'] = array(
            'apple',
            'orange',
        );
        $options = array(
            'itemData'    => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'     => 5,
            'importQuery' => false,
        );
        $this->pager =& Pager::factory($options);
        $expected = array();
        $actual = $this->pager->_getLinksData();
        $this->assertEqual($expected, $this->pager->_getLinksData());

        $expected = '<a href="'.$_SERVER['PHP_SELF'].'?pageID=2" title=""></a>';
        $actual = $this->pager->_renderLink('', '');
        $this->assertEqual($expected, $actual);
        //remove fake url vars
        unset($_GET['arr']);
    }
    function testGetNextLinkTag() {
        //append = true
        $expected = '<link rel="next" href="'.$_SERVER['PHP_SELF'].'?pageID=2" title="next page" />'."\n";
        $this->assertEqual($expected, $this->pager->_getNextLinkTag());
        
        //append = false
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'currentPage' => 1,
            'append'   => false,
            'fileName' => 'myfile.%d.php',
        );
        $this->pager = Pager::factory($options);
        $expected = '<link rel="next" href="'.$this->baseurl.'/myfile.2.php" title="next page" />'."\n";
        $this->assertEqual($expected, $this->pager->_getNextLinkTag());
        
        //test empty tag
        $options['currentPage'] = 2;
        $this->pager = Pager::factory($options);
        $this->assertEqual('', $this->pager->_getNextLinkTag());
    }
    function testGetLastLinkTag() {
        //append = true
        $expected = '<link rel="last" href="'.$_SERVER['PHP_SELF'].'?pageID=2" title="last page" />'."\n";
        $this->assertEqual($expected, $this->pager->_getLastLinkTag());

        //append = false
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'currentPage' => 1,
            'append'   => false,
            'fileName' => 'myfile.%d.php',
        );
        $this->pager = Pager::factory($options);
        $expected = '<link rel="last" href="'.$this->baseurl.'/myfile.2.php" title="last page" />'."\n";
        $this->assertEqual($expected, $this->pager->_getLastLinkTag());

        //test empty tag
        $options['currentPage'] = 2;
        $this->pager = Pager::factory($options);
        $this->assertEqual('', $this->pager->_getLastLinkTag());
    }
    function testGetFirstLinkTag() {
        //append = true
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'currentPage' => 2,
        );
        $this->pager = Pager::factory($options);
        $expected = '<link rel="first" href="'.$_SERVER['PHP_SELF'].'?pageID=1" title="first page" />'."\n";
        $this->assertEqual($expected, $this->pager->_getFirstLinkTag());

        //append = false
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'currentPage' => 2,
            'append'   => false,
            'fileName' => 'myfile.%d.php',
        );
        $this->pager = Pager::factory($options);
        $expected = '<link rel="first" href="'.$this->baseurl.'/myfile.1.php" title="first page" />'."\n";
        $this->assertEqual($expected, $this->pager->_getFirstLinkTag());

        //test empty tag
        $options['currentPage'] = 1;
        $this->pager = Pager::factory($options);
        $this->assertEqual('', $this->pager->_getFirstLinkTag());
    }
    function testGetPrevLinkTag() {
        //append = true
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'currentPage' => 2,
        );
        $this->pager = Pager::factory($options);
        $expected = '<link rel="previous" href="'.$_SERVER['PHP_SELF'].'?pageID=1" title="previous page" />'."\n";
        $this->assertEqual($expected, $this->pager->_getPrevLinkTag());

        //append = false
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'currentPage' => 2,
            'append'   => false,
            'fileName' => 'myfile.%d.php',
        );
        $this->pager = Pager::factory($options);
        $expected = '<link rel="previous" href="'.$this->baseurl.'/myfile.1.php" title="previous page" />'."\n";
        $this->assertEqual($expected, $this->pager->_getPrevLinkTag());

        //test empty tag
        $options['currentPage'] = 1;
        $this->pager = Pager::factory($options);
        $this->assertEqual('', $this->pager->_getPrevLinkTag());
    }
    function testPrintFirstPage() {
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'currentPage' => 2,
        );
        $this->pager = Pager::factory($options);
        $expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=1" title="first page">[1]</a>&nbsp;';
        $this->assertEqual($expected, $this->pager->_printFirstPage());

        $this->pager->_firstPageText = 'FIRST';
        $expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=1" title="first page">[FIRST]</a>&nbsp;';
        $this->assertEqual($expected, $this->pager->_printFirstPage());

        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'currentPage' => 2,
            'altFirst' => 'page %d',
        );
        $this->pager = Pager::factory($options);
        $expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=1" title="page 1">[1]</a>&nbsp;';
        $this->assertEqual($expected, $this->pager->_printFirstPage());
    }
    function testPrintLastPage() {
        $expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=2" title="last page">[2]</a>';
        $this->assertEqual($expected, $this->pager->_printLastPage());

        $this->pager->_lastPageText = 'LAST';
        $expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=2" title="last page">[LAST]</a>';
        $this->assertEqual($expected, $this->pager->_printLastPage());

        $this->pager->_altLast = 'page %d';
        $expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=2" title="page 2">[LAST]</a>';
        $this->assertEqual($expected, $this->pager->_printLastPage());
    }
    function testGetBackLink() {
        $img = '&laquo;';
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'currentPage' => 2,
            'prevImg' => $img,
        );
        $this->pager = Pager::factory($options);
        $expected = '<a href="' . $_SERVER['PHP_SELF'] . '?pageID=1" title="previous page">'.$img.'</a>&nbsp;';
        $this->assertEqual($expected, $this->pager->_getBackLink());
    }
    function testGetNexLink() {
        $img = '&raquo;';
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'currentPage' => 1,
            'nextImg' => $img,
        );
        $this->pager = Pager::factory($options);
        $expected = '&nbsp;<a href="' . $_SERVER['PHP_SELF'] . '?pageID=2" title="next page">'.$img.'</a>&nbsp;';
        $this->assertEqual($expected, $this->pager->_getNextLink());
    }
    function testHttpMethodAutoDetect() {
        $_POST['pageID'] = 3;
        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
        );
        $this->pager = Pager::factory($options);
        $this->assertEqual('POST', $this->pager->_httpMethod);

        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'httpMethod' => 'GET',
        );
        $this->pager = Pager::factory($options);
        $this->assertEqual('GET', $this->pager->_httpMethod);

        unset($_POST['pageID']);

        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
            'httpMethod' => 'POST',
        );
        $this->pager = Pager::factory($options);
        $this->assertEqual('POST', $this->pager->_httpMethod);

        $options = array(
            'itemData' => array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
            'perPage'  => 5,
        );
        $this->pager = Pager::factory($options);
        $this->assertEqual('GET', $this->pager->_httpMethod);
    }
}
?>