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