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