1<?php 2 3namespace dokuwiki\test\Treebuilder; 4 5use dokuwiki\TreeBuilder\ControlPageBuilder; 6use DokuWikiTest; 7 8class ControlPageBuilderTest extends DokuWikiTest 9{ 10 public static function setUpBeforeClass(): void 11 { 12 parent::setUpBeforeClass(); 13 saveWikiText('simple', file_get_contents(__DIR__ . '/cp/simple.txt'), 'test'); 14 saveWikiText('foo:complex', file_get_contents(__DIR__ . '/cp/complex.txt'), 'test'); 15 } 16 17 public function testSimpleParsing() 18 { 19 $control = new ControlPageBuilder('simple'); 20 $control->generate(); 21 22 $expected = [ 23 '+briefs:start', 24 '+qhsr:start', 25 '++qhsr:q', 26 '++qhsr:cert', 27 '++qhsr:hse:start', 28 '++qhsr:engsystems', 29 '++qhsr:performance', 30 '++qhsr:competence', 31 '++qhsr:ashford', 32 '++qhsr:training', 33 '+tech:start', 34 '+https://homepage.company.com' 35 ]; 36 37 $result = explode("\n", (string)$control); 38 sort($expected); 39 sort($result); 40 41 $this->assertEquals($expected, $result); 42 43 // Additional structure tests 44 $top = $control->getTop(); 45 $this->assertEquals(4, count($top->getChildren())); 46 $this->assertEquals(1, count($top->getChildren()[0]->getParents())); 47 $this->assertEquals(4, count($top->getChildren()[1]->getSiblings())); 48 $this->assertEquals(8, count($top->getChildren()[1]->getChildren())); 49 50 $this->assertEquals(12, count($control->getAll())); 51 $this->assertEquals(11, count($control->getLeaves())); 52 $this->assertEquals(1, count($control->getBranches())); 53 } 54 55 /** 56 * Parse the complex example with different flags 57 * 58 * @return array[] 59 * @see testComplexParsing 60 */ 61 public function complexProvider() 62 { 63 return [ 64 'No flags' => [ 65 'flags' => 0, 66 'expected' => [ 67 '+content', 68 '+foo:this', 69 '+foo:bar', 70 '+foo:another_link', 71 '+https://www.google.com', 72 '+relativeup', 73 '+foo2:this', 74 '++foo2:deeper:item', 75 '+++foo2:deeper:evendeeper:item', 76 '+foo:blarg:down', 77 '+toplevel', 78 '+foo:link', 79 ] 80 ], 81 'FLAG_NOEXTERNAL' => [ 82 'flags' => ControlPageBuilder::FLAG_NOEXTERNAL, 83 'expected' => [ 84 '+content', 85 '+foo:this', 86 '+foo:bar', 87 '+foo:another_link', 88 '+relativeup', 89 '+foo2:this', 90 '++foo2:deeper:item', 91 '+++foo2:deeper:evendeeper:item', 92 '+foo:blarg:down', 93 '+toplevel', 94 '+foo:link', 95 ] 96 ], 97 'FLAG_NOINTERNAL' => [ 98 'flags' => ControlPageBuilder::FLAG_NOINTERNAL, 99 'expected' => [ 100 '+https://www.google.com', 101 ] 102 ], 103 ]; 104 } 105 106 /** 107 * @dataProvider complexProvider 108 * @param int $flags 109 * @param array $expected 110 * @return void 111 */ 112 public function testComplexParsing(int $flags, array $expected) 113 { 114 $control = new ControlPageBuilder('foo:complex'); 115 $control->addFlag($flags); 116 $control->generate(); 117 118 $result = explode("\n", (string)$control); 119 sort($expected); 120 sort($result); 121 122 $this->assertEquals($expected, $result); 123 } 124 125 public function testNonExisting() 126 { 127 $this->expectException(\RuntimeException::class); 128 $control = new ControlPageBuilder('does:not:exist'); 129 $control->generate(); 130 $foo = $control->getAll(); 131 } 132} 133