2022-12-07 01:05:22 +00:00
|
|
|
<?php
|
|
|
|
/**
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License along
|
|
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
* http://www.gnu.org/copyleft/gpl.html
|
|
|
|
*
|
|
|
|
* @file
|
|
|
|
* @since 1.35
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace MediaWiki\Skins\Vector\Tests\Unit\Components;
|
|
|
|
|
2022-12-13 20:28:22 +00:00
|
|
|
use HashConfig;
|
2022-12-07 01:05:22 +00:00
|
|
|
use MediaWiki\Skins\Vector\Components\VectorComponentTableOfContents;
|
2022-12-13 20:28:22 +00:00
|
|
|
use Message;
|
|
|
|
use MessageLocalizer;
|
2022-12-07 01:05:22 +00:00
|
|
|
|
|
|
|
/**
|
|
|
|
* @group Vector
|
|
|
|
* @group Components
|
|
|
|
* @coversDefaultClass \MediaWiki\Skins\Vector\Components\VectorComponentTableOfContents
|
|
|
|
*/
|
|
|
|
class VectorComponentTableOfContentsTest extends \MediaWikiUnitTestCase {
|
2022-12-13 20:28:22 +00:00
|
|
|
|
|
|
|
public function provideGetTocData() {
|
|
|
|
$config = [
|
|
|
|
'VectorTableOfContentsBeginning' => true,
|
|
|
|
'VectorTableOfContentsCollapseAtCount' => 1
|
|
|
|
];
|
|
|
|
$tocData = [
|
|
|
|
'number-section-count' => 2,
|
|
|
|
'array-sections' => [
|
|
|
|
[
|
|
|
|
'toclevel' => 1,
|
|
|
|
'level' => '2',
|
|
|
|
'line' => 'A',
|
|
|
|
'number' => '1',
|
|
|
|
'index' => '1',
|
|
|
|
'fromtitle' => 'Test',
|
|
|
|
'byteoffset' => 231,
|
|
|
|
'anchor' => 'A',
|
|
|
|
'linkAnchor' => 'A',
|
|
|
|
'array-sections' => [],
|
|
|
|
'is-top-level-section' => true,
|
|
|
|
'is-parent-section' => false,
|
|
|
|
],
|
|
|
|
[
|
|
|
|
'toclevel' => 1,
|
|
|
|
'level' => '4',
|
|
|
|
'line' => 'B',
|
|
|
|
'number' => '2',
|
|
|
|
'index' => '2',
|
|
|
|
'fromtitle' => 'Test',
|
|
|
|
'byteoffset' => 245,
|
|
|
|
'anchor' => 'B',
|
|
|
|
'linkAnchor' => 'B',
|
|
|
|
'array-sections' => [],
|
|
|
|
'is-top-level-section' => true,
|
|
|
|
'is-parent-section' => false,
|
|
|
|
]
|
|
|
|
]
|
|
|
|
];
|
|
|
|
$nestedTocData = [
|
|
|
|
'number-section-count' => 2,
|
|
|
|
'array-sections' => [
|
|
|
|
[
|
|
|
|
'toclevel' => 1,
|
|
|
|
'level' => '2',
|
|
|
|
'line' => 'A',
|
|
|
|
'number' => '1',
|
|
|
|
'index' => '1',
|
|
|
|
'fromtitle' => 'Test',
|
|
|
|
'byteoffset' => 231,
|
|
|
|
'anchor' => 'A',
|
|
|
|
'linkAnchor' => 'A',
|
|
|
|
'vector-button-label' => 'vector-toc-toggle-button-label',
|
|
|
|
'array-sections' => [
|
|
|
|
'toclevel' => 2,
|
|
|
|
'level' => '4',
|
|
|
|
'line' => 'A1',
|
|
|
|
'number' => '1.1',
|
|
|
|
'index' => '2',
|
|
|
|
'fromtitle' => 'Test',
|
|
|
|
'byteoffset' => 245,
|
|
|
|
'anchor' => 'A1',
|
|
|
|
'linkAnchor' => 'A1',
|
|
|
|
'array-sections' => [],
|
|
|
|
'is-top-level-section' => false,
|
|
|
|
'is-parent-section' => false,
|
|
|
|
],
|
|
|
|
'is-top-level-section' => true,
|
|
|
|
'is-parent-section' => true,
|
|
|
|
],
|
|
|
|
]
|
|
|
|
];
|
|
|
|
|
|
|
|
$expectedConfigData = [
|
|
|
|
'is-vector-toc-beginning-enabled' => $config[ 'VectorTableOfContentsBeginning' ],
|
|
|
|
'vector-is-collapse-sections-enabled' =>
|
|
|
|
$tocData[ 'number-section-count' ] >= $config[ 'VectorTableOfContentsCollapseAtCount' ],
|
|
|
|
'data-pinnable-header' => [
|
|
|
|
'is-pinned' => true,
|
|
|
|
'data-name' => 'vector-toc',
|
|
|
|
'data-feature-name' => null,
|
|
|
|
'label' => 'vector-toc-label',
|
|
|
|
'unpin-label' => 'vector-unpin-element-label',
|
|
|
|
'pin-label' => 'vector-pin-element-label',
|
|
|
|
'label-tag-name' => 'h2'
|
|
|
|
],
|
|
|
|
'is-pinned' => true,
|
|
|
|
'id' => 'vector-toc'
|
|
|
|
];
|
|
|
|
$expectedNestedTocData = array_merge( $nestedTocData, $expectedConfigData );
|
|
|
|
|
|
|
|
return [
|
|
|
|
// When zero sections
|
|
|
|
[
|
|
|
|
[],
|
|
|
|
$config,
|
|
|
|
// TOC data is empty when given an empty array
|
|
|
|
[]
|
|
|
|
],
|
|
|
|
// When number of multiple sections is lower than configured value
|
|
|
|
[
|
|
|
|
$tocData,
|
|
|
|
array_merge( $config, [ 'VectorTableOfContentsCollapseAtCount' => 3 ] ),
|
|
|
|
// 'vector-is-collapse-sections-enabled' value is false
|
|
|
|
array_merge( $tocData, $expectedConfigData, [
|
|
|
|
'vector-is-collapse-sections-enabled' => false
|
|
|
|
] )
|
|
|
|
],
|
|
|
|
// When number of multiple sections is equal to the configured value
|
|
|
|
[
|
|
|
|
$tocData,
|
|
|
|
array_merge( $config, [ 'VectorTableOfContentsCollapseAtCount' => 2 ] ),
|
|
|
|
// 'vector-is-collapse-sections-enabled' value is true
|
|
|
|
array_merge( $tocData, $expectedConfigData )
|
|
|
|
],
|
|
|
|
// When number of multiple sections is higher than configured value
|
|
|
|
[
|
|
|
|
$tocData,
|
|
|
|
array_merge( $config, [ 'VectorTableOfContentsCollapseAtCount' => 1 ] ),
|
|
|
|
// 'vector-is-collapse-sections-enabled' value is true
|
|
|
|
array_merge( $tocData, $expectedConfigData )
|
|
|
|
],
|
|
|
|
// When "Beginning" TOC section is configured to be turned off
|
|
|
|
[
|
|
|
|
$tocData,
|
|
|
|
array_merge( $config, [ 'VectorTableOfContentsBeginning' => false ] ),
|
|
|
|
// 'is-vector-toc-beginning-enabled' value is false
|
|
|
|
array_merge( $tocData, $expectedConfigData, [
|
|
|
|
'is-vector-toc-beginning-enabled' => false
|
|
|
|
] )
|
|
|
|
],
|
|
|
|
// When TOC has sections with top level parent sections
|
|
|
|
[
|
|
|
|
$nestedTocData,
|
|
|
|
$config,
|
|
|
|
// 'vector-button-label' is provided for top level parent sections
|
|
|
|
$expectedNestedTocData
|
|
|
|
],
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
2022-12-07 01:05:22 +00:00
|
|
|
/**
|
|
|
|
* @covers ::getTemplateData
|
2022-12-13 20:28:22 +00:00
|
|
|
* @dataProvider provideGetTOCData
|
2022-12-07 01:05:22 +00:00
|
|
|
*/
|
2022-12-13 20:28:22 +00:00
|
|
|
public function testGetTemplateData(
|
|
|
|
array $tocData,
|
|
|
|
array $config,
|
|
|
|
array $expected
|
|
|
|
) {
|
|
|
|
$localizer = $this->createMock( MessageLocalizer::class );
|
|
|
|
$localizer->method( 'msg' )->willReturnCallback( function ( $key, ...$params ) {
|
|
|
|
$msg = $this->createMock( Message::class );
|
|
|
|
$msg->method( '__toString' )->willReturn( $key );
|
|
|
|
$msg->method( 'text' )->willReturn( $key );
|
|
|
|
return $msg;
|
|
|
|
} );
|
|
|
|
|
|
|
|
$toc = new VectorComponentTableOfContents(
|
|
|
|
$tocData,
|
|
|
|
$localizer,
|
|
|
|
new HashConfig( $config )
|
2022-12-07 01:05:22 +00:00
|
|
|
);
|
2022-12-13 20:28:22 +00:00
|
|
|
$this->assertEquals( $expected, $toc->getTemplateData() );
|
2022-12-07 01:05:22 +00:00
|
|
|
}
|
|
|
|
}
|