1d8ce5486SAndreas Gohr<?php 2d8ce5486SAndreas Gohr 3d8ce5486SAndreas Gohrnamespace dokuwiki\plugin\simplenavi\test; 4d8ce5486SAndreas Gohr 54c5e7fe5SAndreas Gohruse dokuwiki\TreeBuilder\PageTreeBuilder; 6d8ce5486SAndreas Gohruse DokuWikiTest; 7d8ce5486SAndreas Gohr 8d8ce5486SAndreas Gohr/** 9d8ce5486SAndreas Gohr * General tests for the simplenavi plugin 10d8ce5486SAndreas Gohr * 11d8ce5486SAndreas Gohr * @author Michael Große <grosse@cosmocode.de> 12d8ce5486SAndreas Gohr * 13d8ce5486SAndreas Gohr * @group plugin_simplenavi 14d8ce5486SAndreas Gohr * @group plugins 15d8ce5486SAndreas Gohr */ 16d8ce5486SAndreas Gohrclass SimplenaviTest extends DokuWikiTest 17d8ce5486SAndreas Gohr{ 18d8ce5486SAndreas Gohr 19d8ce5486SAndreas Gohr protected $pluginsEnabled = array('simplenavi'); 20d8ce5486SAndreas Gohr 21d8ce5486SAndreas Gohr public function setUp(): void 22d8ce5486SAndreas Gohr { 23d8ce5486SAndreas Gohr parent::setUp(); 24d8ce5486SAndreas Gohr saveWikiText('sidebar', '{{simplenavi>}}', 'create test sidebar'); 25e75a33bfSAndreas Gohr 26e75a33bfSAndreas Gohr $pages = [ 27e58e2f72SAndreas Gohr ['foo', 'Foo Page'], 28d418c031SAndreas Gohr ['simplenavi', 'Self Start'], 29e75a33bfSAndreas Gohr ['namespace1:start', 'ZZZ Namespace 1 Start'], 30e75a33bfSAndreas Gohr ['namespace2:foo', 'Namespace 2 Foo'], 31e75a33bfSAndreas Gohr ['namespace2', 'Namespace 2 Start'], 32e75a33bfSAndreas Gohr ['namespace12:foo', 'Namespace 12 Foo'], 33e75a33bfSAndreas Gohr ['namespace12:start', 'Namespace 12 Start'], 34e75a33bfSAndreas Gohr ['namespace123:namespace123', 'AAA Namespace 123 Start'], 35e75a33bfSAndreas Gohr ['namespace123:foo', 'Namespace 123 Foo'], 36e75a33bfSAndreas Gohr ['namespace123:deep:start', 'Namespace 123 Deep Start'], 37e75a33bfSAndreas Gohr ['namespace123:deep:foo', 'Namespace 123 Deep Foo'], 38e75a33bfSAndreas Gohr ['namespace21:foo', 'Namespace 21 Foo'], 39e75a33bfSAndreas Gohr ['namespace21:start', 'Namespace 21 Start'], 40e75a33bfSAndreas Gohr ]; 41e75a33bfSAndreas Gohr 42e75a33bfSAndreas Gohr foreach ($pages as $page) { 43e75a33bfSAndreas Gohr saveWikiText('simplenavi:' . $page[0], '====== ' . $page[1] . ' ======', 'create test page'); 44e75a33bfSAndreas Gohr } 45e75a33bfSAndreas Gohr 46e75a33bfSAndreas Gohr } 47e75a33bfSAndreas Gohr 48d418c031SAndreas Gohr public function dataProvider() 49d418c031SAndreas Gohr { 50e75a33bfSAndreas Gohr 51e75a33bfSAndreas Gohr yield [ 52e75a33bfSAndreas Gohr 'set' => 'by ID, all branches closed', 534c5e7fe5SAndreas Gohr 'sort' => 'id', 544c5e7fe5SAndreas Gohr 'usetitle' => false, 55d418c031SAndreas Gohr 'home' => false, 56e58e2f72SAndreas Gohr 'current' => 'simplenavi:page', 57e75a33bfSAndreas Gohr 'expect' => [ 584c5e7fe5SAndreas Gohr '+simplenavi:foo', 594c5e7fe5SAndreas Gohr '+simplenavi:namespace1:start', 604c5e7fe5SAndreas Gohr '+simplenavi:namespace12:start', 614c5e7fe5SAndreas Gohr '+simplenavi:namespace123:namespace123', 624c5e7fe5SAndreas Gohr '+simplenavi:namespace2', 634c5e7fe5SAndreas Gohr '+simplenavi:namespace21:start', 64e75a33bfSAndreas Gohr ] 65e75a33bfSAndreas Gohr ]; 66e75a33bfSAndreas Gohr 67e75a33bfSAndreas Gohr yield [ 68e75a33bfSAndreas Gohr 'set' => 'by ID, branch open', 694c5e7fe5SAndreas Gohr 'sort' => 'id', 704c5e7fe5SAndreas Gohr 'usetitle' => false, 71d418c031SAndreas Gohr 'home' => false, 72e75a33bfSAndreas Gohr 'current' => 'simplenavi:namespace123:deep:foo', 73e75a33bfSAndreas Gohr 'expect' => [ 744c5e7fe5SAndreas Gohr '+simplenavi:foo', 754c5e7fe5SAndreas Gohr '+simplenavi:namespace1:start', 764c5e7fe5SAndreas Gohr '+simplenavi:namespace12:start', 774c5e7fe5SAndreas Gohr '+simplenavi:namespace123:namespace123', 784c5e7fe5SAndreas Gohr '++simplenavi:namespace123:deep:start', 794c5e7fe5SAndreas Gohr '+++simplenavi:namespace123:deep:foo', 804c5e7fe5SAndreas Gohr '++simplenavi:namespace123:foo', 814c5e7fe5SAndreas Gohr '+simplenavi:namespace2', 824c5e7fe5SAndreas Gohr '+simplenavi:namespace21:start', 83e75a33bfSAndreas Gohr ] 84e75a33bfSAndreas Gohr ]; 85e75a33bfSAndreas Gohr 86e75a33bfSAndreas Gohr 87e75a33bfSAndreas Gohr yield [ 88e75a33bfSAndreas Gohr 'set' => 'by Title, Natural Search, all branches closed', 894c5e7fe5SAndreas Gohr 'sort' => 'title', 904c5e7fe5SAndreas Gohr 'usetitle' => true, 91d418c031SAndreas Gohr 'home' => false, 92e58e2f72SAndreas Gohr 'current' => 'simplenavi:page', 93e75a33bfSAndreas Gohr 'expect' => [ 944c5e7fe5SAndreas Gohr '+simplenavi:namespace123:namespace123', 954c5e7fe5SAndreas Gohr '+simplenavi:foo', 964c5e7fe5SAndreas Gohr '+simplenavi:namespace2', 974c5e7fe5SAndreas Gohr '+simplenavi:namespace12:start', 984c5e7fe5SAndreas Gohr '+simplenavi:namespace21:start', 994c5e7fe5SAndreas Gohr '+simplenavi:namespace1:start', 100e75a33bfSAndreas Gohr ] 101e75a33bfSAndreas Gohr ]; 102e75a33bfSAndreas Gohr 103e75a33bfSAndreas Gohr yield [ 104e75a33bfSAndreas Gohr 'set' => 'by Title, Natural Sort, branch open', 1054c5e7fe5SAndreas Gohr 'sort' => 'title', 1064c5e7fe5SAndreas Gohr 'usetitle' => true, 107d418c031SAndreas Gohr 'home' => false, 108e58e2f72SAndreas Gohr 'current' => 'simplenavi:namespace123:deep:foo', 109e58e2f72SAndreas Gohr 'expect' => [ 1104c5e7fe5SAndreas Gohr '+simplenavi:namespace123:namespace123', 1114c5e7fe5SAndreas Gohr '++simplenavi:namespace123:deep:start', 1124c5e7fe5SAndreas Gohr '+++simplenavi:namespace123:deep:foo', 1134c5e7fe5SAndreas Gohr '++simplenavi:namespace123:foo', 1144c5e7fe5SAndreas Gohr '+simplenavi:foo', 1154c5e7fe5SAndreas Gohr '+simplenavi:namespace2', 1164c5e7fe5SAndreas Gohr '+simplenavi:namespace12:start', 1174c5e7fe5SAndreas Gohr '+simplenavi:namespace21:start', 1184c5e7fe5SAndreas Gohr '+simplenavi:namespace1:start', 119e58e2f72SAndreas Gohr ] 120e58e2f72SAndreas Gohr ]; 121e58e2f72SAndreas Gohr 122e58e2f72SAndreas Gohr yield [ 123e58e2f72SAndreas Gohr 'set' => 'by Title, Natural Sort, NS first, branch open', 1244c5e7fe5SAndreas Gohr 'sort' => 'ns_title', 1254c5e7fe5SAndreas Gohr 'usetitle' => true, 126d418c031SAndreas Gohr 'home' => false, 127e75a33bfSAndreas Gohr 'current' => 'simplenavi:namespace123:deep:foo', 128e75a33bfSAndreas Gohr 'expect' => [ 1294c5e7fe5SAndreas Gohr '+simplenavi:namespace123:namespace123', 1304c5e7fe5SAndreas Gohr '++simplenavi:namespace123:deep:start', 1314c5e7fe5SAndreas Gohr '+++simplenavi:namespace123:deep:foo', 1324c5e7fe5SAndreas Gohr '++simplenavi:namespace123:foo', 1334c5e7fe5SAndreas Gohr '+simplenavi:namespace2', 1344c5e7fe5SAndreas Gohr '+simplenavi:namespace12:start', 1354c5e7fe5SAndreas Gohr '+simplenavi:namespace21:start', 1364c5e7fe5SAndreas Gohr '+simplenavi:namespace1:start', 1374c5e7fe5SAndreas Gohr '+simplenavi:foo', 138e75a33bfSAndreas Gohr ] 139e75a33bfSAndreas Gohr ]; 140d418c031SAndreas Gohr 141d418c031SAndreas Gohr yield [ 142d418c031SAndreas Gohr 'set' => 'by ID, branch open with home level', 1434c5e7fe5SAndreas Gohr 'sort' => 'id', 1444c5e7fe5SAndreas Gohr 'usetitle' => false, 145d418c031SAndreas Gohr 'home' => true, 146d418c031SAndreas Gohr 'current' => 'simplenavi:namespace123:deep:foo', 147d418c031SAndreas Gohr 'expect' => [ 1484c5e7fe5SAndreas Gohr '+simplenavi:simplenavi', 1494c5e7fe5SAndreas Gohr '++simplenavi:foo', 1504c5e7fe5SAndreas Gohr '++simplenavi:namespace1:start', 1514c5e7fe5SAndreas Gohr '++simplenavi:namespace12:start', 1524c5e7fe5SAndreas Gohr '++simplenavi:namespace123:namespace123', 1534c5e7fe5SAndreas Gohr '+++simplenavi:namespace123:deep:start', 1544c5e7fe5SAndreas Gohr '++++simplenavi:namespace123:deep:foo', 1554c5e7fe5SAndreas Gohr '+++simplenavi:namespace123:foo', 1564c5e7fe5SAndreas Gohr '++simplenavi:namespace2', 1574c5e7fe5SAndreas Gohr '++simplenavi:namespace21:start', 158d418c031SAndreas Gohr ] 159d418c031SAndreas Gohr ]; 160d8ce5486SAndreas Gohr } 161d8ce5486SAndreas Gohr 162d8ce5486SAndreas Gohr /** 163e75a33bfSAndreas Gohr * @dataProvider dataProvider 164d8ce5486SAndreas Gohr */ 1654c5e7fe5SAndreas Gohr public function testSorting($set, $sort, $usetitle, $home, $current, $expect) 166d8ce5486SAndreas Gohr { 167e75a33bfSAndreas Gohr $simpleNavi = new \syntax_plugin_simplenavi(); 1684c5e7fe5SAndreas Gohr 1694c5e7fe5SAndreas Gohr $simpleNavi->initState('simplenavi', $current, $usetitle, $sort, $home); 1704c5e7fe5SAndreas Gohr 1714c5e7fe5SAndreas Gohr /** @var PageTreeBuilder $tree */ 1724c5e7fe5SAndreas Gohr $tree = $this->callInaccessibleMethod($simpleNavi, 'getTree', []); 1734c5e7fe5SAndreas Gohr 1744c5e7fe5SAndreas Gohr 1754c5e7fe5SAndreas Gohr $this->assertSame(join("\n", $expect), (string) $tree, $set); 176d8ce5486SAndreas Gohr } 177d8ce5486SAndreas Gohr 178b1fcfa9fSAndreas Gohr (aider) /** 179*02d11b9cSAndreas Gohr (aider) * Data provider for isParent test 180b1fcfa9fSAndreas Gohr (aider) */ 181*02d11b9cSAndreas Gohr (aider) public function isParentDataProvider(): array 182b1fcfa9fSAndreas Gohr (aider) { 183*02d11b9cSAndreas Gohr (aider) return [ 184b1fcfa9fSAndreas Gohr (aider) // Test cases where parent is a parent of child 185*02d11b9cSAndreas Gohr (aider) 'parent of deep child' => [true, 'namespace1:namespace2:page', 'namespace1'], 186*02d11b9cSAndreas Gohr (aider) 'direct parent' => [true, 'namespace1:namespace2:page', 'namespace1:namespace2'], 187*02d11b9cSAndreas Gohr (aider) 'parent of page' => [true, 'namespace1:page', 'namespace1'], 188b1fcfa9fSAndreas Gohr (aider) 189b1fcfa9fSAndreas Gohr (aider) // Test cases where parent is not a parent of child 190*02d11b9cSAndreas Gohr (aider) 'different namespace' => [false, 'namespace1:page', 'namespace2'], 191*02d11b9cSAndreas Gohr (aider) 'sibling namespace' => [false, 'namespace1:namespace2:page', 'namespace1:namespace3'], 192b1fcfa9fSAndreas Gohr (aider) 193b1fcfa9fSAndreas Gohr (aider) // Test edge cases 194*02d11b9cSAndreas Gohr (aider) 'empty parent' => [true, 'page', ''], // Empty parent is parent of all 195*02d11b9cSAndreas Gohr (aider) 'self as parent' => [true, 'page', 'page'], // Page is parent of itself 196*02d11b9cSAndreas Gohr (aider) ]; 197*02d11b9cSAndreas Gohr (aider) } 198*02d11b9cSAndreas Gohr (aider) 199*02d11b9cSAndreas Gohr (aider) /** 200*02d11b9cSAndreas Gohr (aider) * Test the isParent method 201*02d11b9cSAndreas Gohr (aider) * @dataProvider isParentDataProvider 202*02d11b9cSAndreas Gohr (aider) */ 203*02d11b9cSAndreas Gohr (aider) public function testIsParent(bool $expected, string $child, string $parent): void 204*02d11b9cSAndreas Gohr (aider) { 205*02d11b9cSAndreas Gohr (aider) $simpleNavi = new \syntax_plugin_simplenavi(); 206*02d11b9cSAndreas Gohr (aider) $result = $this->callInaccessibleMethod($simpleNavi, 'isParent', [$child, $parent]); 207*02d11b9cSAndreas Gohr (aider) $this->assertSame($expected, $result); 208b1fcfa9fSAndreas Gohr (aider) } 209b1fcfa9fSAndreas Gohr (aider) 210d8ce5486SAndreas Gohr} 211d8ce5486SAndreas Gohr 212d8ce5486SAndreas Gohr 213d8ce5486SAndreas Gohr 214