xref: /dokuwiki/_test/tests/Parsing/ModeRegistryTest.php (revision dba14ea3c4253d454e478f27d0ae9c47d2fa7aa6)
1*dba14ea3SAndreas Gohr<?php
2*dba14ea3SAndreas Gohr
3*dba14ea3SAndreas Gohrnamespace dokuwiki\test\Parsing;
4*dba14ea3SAndreas Gohr
5*dba14ea3SAndreas Gohruse dokuwiki\Parsing\ModeRegistry;
6*dba14ea3SAndreas Gohruse dokuwiki\Parsing\ParserMode\ModeInterface;
7*dba14ea3SAndreas Gohr
8*dba14ea3SAndreas Gohrclass ModeRegistryTest extends \DokuWikiTest
9*dba14ea3SAndreas Gohr{
10*dba14ea3SAndreas Gohr    /** @var ModeRegistry */
11*dba14ea3SAndreas Gohr    private $registry;
12*dba14ea3SAndreas Gohr
13*dba14ea3SAndreas Gohr    function setUp(): void
14*dba14ea3SAndreas Gohr    {
15*dba14ea3SAndreas Gohr        parent::setUp();
16*dba14ea3SAndreas Gohr        ModeRegistry::reset();
17*dba14ea3SAndreas Gohr        $this->registry = ModeRegistry::getInstance();
18*dba14ea3SAndreas Gohr    }
19*dba14ea3SAndreas Gohr
20*dba14ea3SAndreas Gohr    function tearDown(): void
21*dba14ea3SAndreas Gohr    {
22*dba14ea3SAndreas Gohr        ModeRegistry::reset();
23*dba14ea3SAndreas Gohr        parent::tearDown();
24*dba14ea3SAndreas Gohr    }
25*dba14ea3SAndreas Gohr
26*dba14ea3SAndreas Gohr    function testSingleton()
27*dba14ea3SAndreas Gohr    {
28*dba14ea3SAndreas Gohr        $this->assertSame(
29*dba14ea3SAndreas Gohr            ModeRegistry::getInstance(),
30*dba14ea3SAndreas Gohr            ModeRegistry::getInstance()
31*dba14ea3SAndreas Gohr        );
32*dba14ea3SAndreas Gohr    }
33*dba14ea3SAndreas Gohr
34*dba14ea3SAndreas Gohr    function testResetCreatesFreshInstance()
35*dba14ea3SAndreas Gohr    {
36*dba14ea3SAndreas Gohr        $first = ModeRegistry::getInstance();
37*dba14ea3SAndreas Gohr        ModeRegistry::reset();
38*dba14ea3SAndreas Gohr        $second = ModeRegistry::getInstance();
39*dba14ea3SAndreas Gohr        $this->assertNotSame($first, $second);
40*dba14ea3SAndreas Gohr    }
41*dba14ea3SAndreas Gohr
42*dba14ea3SAndreas Gohr    function testConstructorPopulatesGlobal()
43*dba14ea3SAndreas Gohr    {
44*dba14ea3SAndreas Gohr        global $PARSER_MODES;
45*dba14ea3SAndreas Gohr        $this->assertIsArray($PARSER_MODES);
46*dba14ea3SAndreas Gohr        $this->assertArrayHasKey('container', $PARSER_MODES);
47*dba14ea3SAndreas Gohr        $this->assertArrayHasKey('formatting', $PARSER_MODES);
48*dba14ea3SAndreas Gohr        $this->assertArrayHasKey('substition', $PARSER_MODES);
49*dba14ea3SAndreas Gohr        $this->assertArrayHasKey('protected', $PARSER_MODES);
50*dba14ea3SAndreas Gohr        $this->assertArrayHasKey('disabled', $PARSER_MODES);
51*dba14ea3SAndreas Gohr        $this->assertArrayHasKey('paragraphs', $PARSER_MODES);
52*dba14ea3SAndreas Gohr        $this->assertArrayHasKey('baseonly', $PARSER_MODES);
53*dba14ea3SAndreas Gohr    }
54*dba14ea3SAndreas Gohr
55*dba14ea3SAndreas Gohr    function testGetCategories()
56*dba14ea3SAndreas Gohr    {
57*dba14ea3SAndreas Gohr        global $PARSER_MODES;
58*dba14ea3SAndreas Gohr        $this->assertSame($PARSER_MODES, $this->registry->getCategories());
59*dba14ea3SAndreas Gohr    }
60*dba14ea3SAndreas Gohr
61*dba14ea3SAndreas Gohr    function testGetModesForSingleCategory()
62*dba14ea3SAndreas Gohr    {
63*dba14ea3SAndreas Gohr        $modes = $this->registry->getModesForCategories([ModeRegistry::CATEGORY_CONTAINER]);
64*dba14ea3SAndreas Gohr        $this->assertContains('listblock', $modes);
65*dba14ea3SAndreas Gohr        $this->assertContains('table', $modes);
66*dba14ea3SAndreas Gohr        $this->assertContains('quote', $modes);
67*dba14ea3SAndreas Gohr        $this->assertContains('hr', $modes);
68*dba14ea3SAndreas Gohr    }
69*dba14ea3SAndreas Gohr
70*dba14ea3SAndreas Gohr    function testGetModesForMultipleCategories()
71*dba14ea3SAndreas Gohr    {
72*dba14ea3SAndreas Gohr        $modes = $this->registry->getModesForCategories([
73*dba14ea3SAndreas Gohr            ModeRegistry::CATEGORY_CONTAINER,
74*dba14ea3SAndreas Gohr            ModeRegistry::CATEGORY_BASEONLY,
75*dba14ea3SAndreas Gohr        ]);
76*dba14ea3SAndreas Gohr        $this->assertContains('listblock', $modes);
77*dba14ea3SAndreas Gohr        $this->assertContains('header', $modes);
78*dba14ea3SAndreas Gohr    }
79*dba14ea3SAndreas Gohr
80*dba14ea3SAndreas Gohr    function testGetModesForCategoriesDeduplicates()
81*dba14ea3SAndreas Gohr    {
82*dba14ea3SAndreas Gohr        $modes = $this->registry->getModesForCategories([
83*dba14ea3SAndreas Gohr            ModeRegistry::CATEGORY_CONTAINER,
84*dba14ea3SAndreas Gohr            ModeRegistry::CATEGORY_CONTAINER,
85*dba14ea3SAndreas Gohr        ]);
86*dba14ea3SAndreas Gohr        $counts = array_count_values($modes);
87*dba14ea3SAndreas Gohr        foreach ($counts as $count) {
88*dba14ea3SAndreas Gohr            $this->assertEquals(1, $count);
89*dba14ea3SAndreas Gohr        }
90*dba14ea3SAndreas Gohr    }
91*dba14ea3SAndreas Gohr
92*dba14ea3SAndreas Gohr    function testGetModesForUnknownCategoryReturnsEmpty()
93*dba14ea3SAndreas Gohr    {
94*dba14ea3SAndreas Gohr        $modes = $this->registry->getModesForCategories(['nonexistent']);
95*dba14ea3SAndreas Gohr        $this->assertSame([], $modes);
96*dba14ea3SAndreas Gohr    }
97*dba14ea3SAndreas Gohr
98*dba14ea3SAndreas Gohr    function testRegisterMode()
99*dba14ea3SAndreas Gohr    {
100*dba14ea3SAndreas Gohr        global $PARSER_MODES;
101*dba14ea3SAndreas Gohr        $this->registry->registerMode(ModeRegistry::CATEGORY_CONTAINER, 'testmode');
102*dba14ea3SAndreas Gohr        $this->assertContains('testmode', $PARSER_MODES[ModeRegistry::CATEGORY_CONTAINER]);
103*dba14ea3SAndreas Gohr        $this->assertContains(
104*dba14ea3SAndreas Gohr            'testmode',
105*dba14ea3SAndreas Gohr            $this->registry->getModesForCategories([ModeRegistry::CATEGORY_CONTAINER])
106*dba14ea3SAndreas Gohr        );
107*dba14ea3SAndreas Gohr    }
108*dba14ea3SAndreas Gohr
109*dba14ea3SAndreas Gohr    function testGlobalModificationsAreVisible()
110*dba14ea3SAndreas Gohr    {
111*dba14ea3SAndreas Gohr        global $PARSER_MODES;
112*dba14ea3SAndreas Gohr        $PARSER_MODES[ModeRegistry::CATEGORY_FORMATTING][] = 'custom_format';
113*dba14ea3SAndreas Gohr        $modes = $this->registry->getModesForCategories([ModeRegistry::CATEGORY_FORMATTING]);
114*dba14ea3SAndreas Gohr        $this->assertContains('custom_format', $modes);
115*dba14ea3SAndreas Gohr    }
116*dba14ea3SAndreas Gohr
117*dba14ea3SAndreas Gohr    function testGetModesReturnsSortedArray()
118*dba14ea3SAndreas Gohr    {
119*dba14ea3SAndreas Gohr        $modes = $this->registry->getModes();
120*dba14ea3SAndreas Gohr        $this->assertNotEmpty($modes);
121*dba14ea3SAndreas Gohr
122*dba14ea3SAndreas Gohr        $sortValues = array_column($modes, 'sort');
123*dba14ea3SAndreas Gohr        $sorted = $sortValues;
124*dba14ea3SAndreas Gohr        sort($sorted);
125*dba14ea3SAndreas Gohr        $this->assertSame($sorted, $sortValues);
126*dba14ea3SAndreas Gohr    }
127*dba14ea3SAndreas Gohr
128*dba14ea3SAndreas Gohr    function testGetModesContainsExpectedKeys()
129*dba14ea3SAndreas Gohr    {
130*dba14ea3SAndreas Gohr        $modes = $this->registry->getModes();
131*dba14ea3SAndreas Gohr        foreach ($modes as $entry) {
132*dba14ea3SAndreas Gohr            $this->assertArrayHasKey('sort', $entry);
133*dba14ea3SAndreas Gohr            $this->assertArrayHasKey('mode', $entry);
134*dba14ea3SAndreas Gohr            $this->assertArrayHasKey('obj', $entry);
135*dba14ea3SAndreas Gohr            $this->assertIsInt($entry['sort']);
136*dba14ea3SAndreas Gohr            $this->assertIsString($entry['mode']);
137*dba14ea3SAndreas Gohr            $this->assertInstanceOf(ModeInterface::class, $entry['obj']);
138*dba14ea3SAndreas Gohr        }
139*dba14ea3SAndreas Gohr    }
140*dba14ea3SAndreas Gohr
141*dba14ea3SAndreas Gohr    function testGetModesContainsBuiltinModes()
142*dba14ea3SAndreas Gohr    {
143*dba14ea3SAndreas Gohr        $modes = $this->registry->getModes();
144*dba14ea3SAndreas Gohr        $modeNames = array_column($modes, 'mode');
145*dba14ea3SAndreas Gohr        $this->assertContains('strong', $modeNames);
146*dba14ea3SAndreas Gohr        $this->assertContains('header', $modeNames);
147*dba14ea3SAndreas Gohr        $this->assertContains('listblock', $modeNames);
148*dba14ea3SAndreas Gohr        $this->assertContains('eol', $modeNames);
149*dba14ea3SAndreas Gohr        $this->assertContains('smiley', $modeNames);
150*dba14ea3SAndreas Gohr        $this->assertContains('acronym', $modeNames);
151*dba14ea3SAndreas Gohr        $this->assertContains('entity', $modeNames);
152*dba14ea3SAndreas Gohr    }
153*dba14ea3SAndreas Gohr
154*dba14ea3SAndreas Gohr    function testSortModes()
155*dba14ea3SAndreas Gohr    {
156*dba14ea3SAndreas Gohr        $a = ['sort' => 10, 'mode' => 'a'];
157*dba14ea3SAndreas Gohr        $b = ['sort' => 20, 'mode' => 'b'];
158*dba14ea3SAndreas Gohr        $this->assertLessThan(0, ModeRegistry::sortModes($a, $b));
159*dba14ea3SAndreas Gohr        $this->assertGreaterThan(0, ModeRegistry::sortModes($b, $a));
160*dba14ea3SAndreas Gohr        $this->assertEquals(0, ModeRegistry::sortModes($a, $a));
161*dba14ea3SAndreas Gohr    }
162*dba14ea3SAndreas Gohr}
163