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