1<?php 2 3namespace dokuwiki\test\Parsing; 4 5use dokuwiki\Parsing\Handler; 6use dokuwiki\Parsing\ParserMode\ModeInterface; 7 8class HandlerTest extends \DokuWikiTest 9{ 10 function testGetModeNameReturnsOriginalName() 11 { 12 $handler = new Handler(); 13 14 // create a simple mode that records what getModeName() returns 15 $mode = new class extends \dokuwiki\Parsing\ParserMode\AbstractMode { 16 public $receivedModeName = ''; 17 public function getSort() { return 0; } 18 public function handle($match, $state, $pos, Handler $handler) 19 { 20 $this->receivedModeName = $handler->getModeName(); 21 return true; 22 } 23 }; 24 25 $handler->registerModeObject('resolved', $mode); 26 27 // simulate dispatch with a remapped name (original differs from resolved) 28 $handler->handleToken('resolved', 'test', DOKU_LEXER_SPECIAL, 0, 'original'); 29 30 $this->assertSame('original', $mode->receivedModeName); 31 } 32 33 function testGetModeNameFallsBackToModeName() 34 { 35 $handler = new Handler(); 36 37 $mode = new class extends \dokuwiki\Parsing\ParserMode\AbstractMode { 38 public $receivedModeName = ''; 39 public function getSort() { return 0; } 40 public function handle($match, $state, $pos, Handler $handler) 41 { 42 $this->receivedModeName = $handler->getModeName(); 43 return true; 44 } 45 }; 46 47 $handler->registerModeObject('mymode', $mode); 48 49 // no original name passed — should fall back to the resolved name 50 $handler->handleToken('mymode', 'test', DOKU_LEXER_SPECIAL, 0); 51 52 $this->assertSame('mymode', $mode->receivedModeName); 53 } 54 55 function testResetClearsCallsAndStatusAndCurrentMode() 56 { 57 $handler = new Handler(); 58 59 // dirty the handler: append a call, mutate status, and prime 60 // currentModeName via a token dispatch. 61 $handler->calls[] = ['cdata', ['x'], 0]; 62 63 self::setInaccessibleProperty($handler, 'status', [ 64 'section' => true, 'doublequote' => 3, 'footnote' => true, 65 ]); 66 67 $mode = new class extends \dokuwiki\Parsing\ParserMode\AbstractMode { 68 public function getSort() { return 0; } 69 public function handle($match, $state, $pos, Handler $handler) { return true; } 70 }; 71 $handler->registerModeObject('m', $mode); 72 $handler->handleToken('m', 'x', DOKU_LEXER_SPECIAL, 0, 'm'); 73 $this->assertSame('m', $handler->getModeName()); 74 75 $writerBefore = self::getInaccessibleProperty($handler, 'callWriter'); 76 77 $handler->reset(); 78 79 $this->assertSame([], $handler->calls); 80 $this->assertSame('', $handler->getModeName()); 81 $this->assertSame( 82 ['section' => false, 'doublequote' => 0, 'footnote' => false], 83 self::getInaccessibleProperty($handler, 'status') 84 ); 85 // reset reinstalls a fresh CallWriter — must be a new instance 86 $writerAfter = self::getInaccessibleProperty($handler, 'callWriter'); 87 $this->assertNotSame($writerBefore, $writerAfter); 88 $this->assertInstanceOf(\dokuwiki\Parsing\Handler\CallWriter::class, $writerAfter); 89 } 90} 91