<?php

/**
 * PHP TableOfContents Library
 *
 * @license http://opensource.org/licenses/MIT
 * @link https://github.com/caseyamcl/toc
 * @version 1.0
 * @package caseyamcl/toc
 * @author Casey McLaughlin <caseyamcl@gmail.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 *
 * ------------------------------------------------------------------
 */

namespace TOC;

use TOC\Util\TOCTestUtils;

/**
 * Class TocGeneratorTest
 *
 * @author Casey McLaughlin <caseyamcl@gmail.com>
 */
class TocGeneratorTest extends \PHPUnit_Framework_TestCase
{
    public function testInstantiateSucceeds()
    {
        $obj = new TocGenerator();
        $this->assertInstanceOf('\TOC\TocGenerator', $obj);
    }

    // ---------------------------------------------------------------

    public function testGetMenuTraversesLevelsCorrectly()
    {
        $obj = new TocGenerator();

        $html = "
            <h1 id='a'>A-Header</h1><p>Foobar</p>
            <h2 id='b'>B-Header</h2>
            <h2 id='c'>C-Header</h2>
            <h3 id='d'>D-Header</h3>
            <h4 id='e'>E-Header</h4>
            <h2 id='f'>F-Header</h2>
            <h5 id='g'>G-Header</h5>
            <h1 id='h'>H-Header</h1><div>Hi</div>
        ";

        $fixture = array_filter(array_map('trim', file(__DIR__ . '/fixtures/testHtmlList.html')));
        $actual  = array_filter(array_map('trim', explode(PHP_EOL, $obj->getHtmlMenu($html, 1, 6))));

        $this->assertEquals($fixture, $actual);
    }

    // ---------------------------------------------------------------

    public function testGetMenuMatchesOnlyElementsWithIDs()
    {
        $html = "
            <h1 id='a'>A-Header</h1><p>Foobar</p>
            <h1 id='b'>B-Header</h1>
            <h1>C-Header</h1>
        ";

        $obj = new TocGenerator();
        $menu = $obj->getMenu($html, 1);

        $this->assertCount(2, $menu);
        $this->assertEquals('A-Header', $menu->getFirstChild()->getLabel());
        $this->assertEquals('B-Header', $menu->getLastChild()->getLabel());
    }

    // ---------------------------------------------------------------

    public function testGetMenuUsesTitleForDisplayTextWhenAvailableAndPlainTextWhenNot()
    {
        $obj = new TocGenerator();

        $html  = '<h1 id="a" title="Foo Bar!">A Header</h1>';
        $html .= '<h2 id="b">B Header</h2>';
        $html .= '<h3 id="c" title="Baz Biz~">C Header</h3>';

        $menu = $obj->getMenu($html, 1, 3);
        $arr = TOCTestUtils::flattenMenuItems($menu);

        $this->assertEquals('Foo Bar!', $arr[0]->getLabel());
        $this->assertEquals('B Header', $arr[1]->getLabel());
        $this->assertEquals('Baz Biz~', $arr[2]->getLabel());
    }

    // ---------------------------------------------------------------

    public function testGetMenuGetsOnlyHeaderLevelsSpecified()
    {
        $obj = new TocGenerator();

        $html  = '<h1 id="a" title="Foo Bar!">A Header</h1>';
        $html .= '<h2 id="b">B Header</h2>';
        $html .= '<h3 id="c" title="Baz Biz~">C Header</h3>';
        $html .= '<h4 id="d" title="Bal Baf#">D Header</h4>';
        $html .= '<h5 id="e" title="Cak Coy%">E Header</h5>';
        $html .= '<h6 id="f" title="Dar Dul^">F Header</h6>';

        $this->assertCount(1, TOCTestUtils::flattenMenuItems($obj->getMenu($html, 5, 1)));
        $this->assertCount(2, TOCTestUtils::flattenMenuItems($obj->getMenu($html, 5, 5)));

        // What's up with this?
        //$this->assertCount(6, TOCTestUtils::flattenMenuItems($obj->getMenu($html, -1, 20)));
    }

    // ---------------------------------------------------------------

    public function testGetMenuReturnsAnEmptyArrayWhenNoContentOrMatches()
    {
        $obj = new TocGenerator();
        $this->assertEquals(0, count($obj->getMenu("<h1>Boo</h1><h2>Bar</h2>")));
        $this->assertEquals(0, count($obj->getMenu("")));
    }
}

/* EOF: TocGeneratorTest.php */