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