1*f8369d7dSTobias Sarnowski<?php 2*f8369d7dSTobias Sarnowski/** 3*f8369d7dSTobias Sarnowski* @version $Id: lexer.todo.php,v 1.2 2005/03/25 21:00:22 harryf Exp $ 4*f8369d7dSTobias Sarnowski* @package Doku 5*f8369d7dSTobias Sarnowski* @subpackage Tests 6*f8369d7dSTobias Sarnowski*/ 7*f8369d7dSTobias Sarnowski 8*f8369d7dSTobias Sarnowski/** 9*f8369d7dSTobias Sarnowski* Includes 10*f8369d7dSTobias Sarnowski*/ 11*f8369d7dSTobias Sarnowskirequire_once DOKU_INC . 'inc/parser/lexer.php'; 12*f8369d7dSTobias Sarnowski 13*f8369d7dSTobias Sarnowski/** 14*f8369d7dSTobias Sarnowski* @package Doku 15*f8369d7dSTobias Sarnowski* @subpackage Tests 16*f8369d7dSTobias Sarnowski*/ 17*f8369d7dSTobias Sarnowskiclass TestOfLexerParallelRegex extends DokuWikiTest { 18*f8369d7dSTobias Sarnowski 19*f8369d7dSTobias Sarnowski function testNoPatterns() { 20*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(false); 21*f8369d7dSTobias Sarnowski $this->assertFalse($regex->match("Hello", $match)); 22*f8369d7dSTobias Sarnowski $this->assertEquals($match, ""); 23*f8369d7dSTobias Sarnowski } 24*f8369d7dSTobias Sarnowski function testNoSubject() { 25*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(false); 26*f8369d7dSTobias Sarnowski $regex->addPattern(".*"); 27*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("", $match)); 28*f8369d7dSTobias Sarnowski $this->assertEquals($match, ""); 29*f8369d7dSTobias Sarnowski } 30*f8369d7dSTobias Sarnowski function testMatchAll() { 31*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(false); 32*f8369d7dSTobias Sarnowski $regex->addPattern(".*"); 33*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("Hello", $match)); 34*f8369d7dSTobias Sarnowski $this->assertEquals($match, "Hello"); 35*f8369d7dSTobias Sarnowski } 36*f8369d7dSTobias Sarnowski function testCaseSensitive() { 37*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(true); 38*f8369d7dSTobias Sarnowski $regex->addPattern("abc"); 39*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("abcdef", $match)); 40*f8369d7dSTobias Sarnowski $this->assertEquals($match, "abc"); 41*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("AAABCabcdef", $match)); 42*f8369d7dSTobias Sarnowski $this->assertEquals($match, "abc"); 43*f8369d7dSTobias Sarnowski } 44*f8369d7dSTobias Sarnowski function testCaseInsensitive() { 45*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(false); 46*f8369d7dSTobias Sarnowski $regex->addPattern("abc"); 47*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("abcdef", $match)); 48*f8369d7dSTobias Sarnowski $this->assertEquals($match, "abc"); 49*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("AAABCabcdef", $match)); 50*f8369d7dSTobias Sarnowski $this->assertEquals($match, "ABC"); 51*f8369d7dSTobias Sarnowski } 52*f8369d7dSTobias Sarnowski function testMatchMultiple() { 53*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(true); 54*f8369d7dSTobias Sarnowski $regex->addPattern("abc"); 55*f8369d7dSTobias Sarnowski $regex->addPattern("ABC"); 56*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("abcdef", $match)); 57*f8369d7dSTobias Sarnowski $this->assertEquals($match, "abc"); 58*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("AAABCabcdef", $match)); 59*f8369d7dSTobias Sarnowski $this->assertEquals($match, "ABC"); 60*f8369d7dSTobias Sarnowski $this->assertFalse($regex->match("Hello", $match)); 61*f8369d7dSTobias Sarnowski } 62*f8369d7dSTobias Sarnowski function testPatternLabels() { 63*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(false); 64*f8369d7dSTobias Sarnowski $regex->addPattern("abc", "letter"); 65*f8369d7dSTobias Sarnowski $regex->addPattern("123", "number"); 66*f8369d7dSTobias Sarnowski $this->assertEquals($regex->match("abcdef", $match), "letter"); 67*f8369d7dSTobias Sarnowski $this->assertEquals($match, "abc"); 68*f8369d7dSTobias Sarnowski $this->assertEquals($regex->match("0123456789", $match), "number"); 69*f8369d7dSTobias Sarnowski $this->assertEquals($match, "123"); 70*f8369d7dSTobias Sarnowski } 71*f8369d7dSTobias Sarnowski function testMatchMultipleWithLookaheadNot() { 72*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(true); 73*f8369d7dSTobias Sarnowski $regex->addPattern("abc"); 74*f8369d7dSTobias Sarnowski $regex->addPattern("ABC"); 75*f8369d7dSTobias Sarnowski $regex->addPattern("a(?!\n).{1}"); 76*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("abcdef", $match)); 77*f8369d7dSTobias Sarnowski $this->assertEquals($match, "abc"); 78*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("AAABCabcdef", $match)); 79*f8369d7dSTobias Sarnowski $this->assertEquals($match, "ABC"); 80*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("a\nab", $match)); 81*f8369d7dSTobias Sarnowski $this->assertEquals($match, "ab"); 82*f8369d7dSTobias Sarnowski $this->assertFalse($regex->match("Hello", $match)); 83*f8369d7dSTobias Sarnowski } 84*f8369d7dSTobias Sarnowski function testMatchSetOptionCaseless() { 85*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(true); 86*f8369d7dSTobias Sarnowski $regex->addPattern("a(?i)b(?i)c"); 87*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("aBc", $match)); 88*f8369d7dSTobias Sarnowski $this->assertEquals($match, "aBc"); 89*f8369d7dSTobias Sarnowski } 90*f8369d7dSTobias Sarnowski function testMatchSetOptionUngreedy() { 91*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(true); 92*f8369d7dSTobias Sarnowski $regex->addPattern("(?U)\w+"); 93*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("aaaaaa", $match)); 94*f8369d7dSTobias Sarnowski $this->assertEquals($match, "a"); 95*f8369d7dSTobias Sarnowski } 96*f8369d7dSTobias Sarnowski function testMatchLookaheadEqual() { 97*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(true); 98*f8369d7dSTobias Sarnowski $regex->addPattern("\w(?=c)"); 99*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("xbyczd", $match)); 100*f8369d7dSTobias Sarnowski $this->assertEquals($match, "y"); 101*f8369d7dSTobias Sarnowski } 102*f8369d7dSTobias Sarnowski function testMatchLookaheadNot() { 103*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(true); 104*f8369d7dSTobias Sarnowski $regex->addPattern("\w(?!b|c)"); 105*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("xbyczd", $match)); 106*f8369d7dSTobias Sarnowski $this->assertEquals($match, "b"); 107*f8369d7dSTobias Sarnowski } 108*f8369d7dSTobias Sarnowski function testMatchLookbehindEqual() { 109*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(true); 110*f8369d7dSTobias Sarnowski $regex->addPattern("(?<=c)\w"); 111*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("xbyczd", $match)); 112*f8369d7dSTobias Sarnowski $this->assertEquals($match, "z"); 113*f8369d7dSTobias Sarnowski } 114*f8369d7dSTobias Sarnowski function testMatchLookbehindNot() { 115*f8369d7dSTobias Sarnowski $regex = new Doku_LexerParallelRegex(true); 116*f8369d7dSTobias Sarnowski $regex->addPattern("(?<!\A|x|b)\w"); 117*f8369d7dSTobias Sarnowski $this->assertTrue($regex->match("xbyczd", $match)); 118*f8369d7dSTobias Sarnowski $this->assertEquals($match, "c"); 119*f8369d7dSTobias Sarnowski } 120*f8369d7dSTobias Sarnowski} 121*f8369d7dSTobias Sarnowski 122*f8369d7dSTobias Sarnowski 123*f8369d7dSTobias Sarnowskiclass TestOfLexerStateStack extends DokuWikiTest { 124*f8369d7dSTobias Sarnowski function testStartState() { 125*f8369d7dSTobias Sarnowski $stack = new Doku_LexerStateStack("one"); 126*f8369d7dSTobias Sarnowski $this->assertEquals($stack->getCurrent(), "one"); 127*f8369d7dSTobias Sarnowski } 128*f8369d7dSTobias Sarnowski function testExhaustion() { 129*f8369d7dSTobias Sarnowski $stack = new Doku_LexerStateStack("one"); 130*f8369d7dSTobias Sarnowski $this->assertFalse($stack->leave()); 131*f8369d7dSTobias Sarnowski } 132*f8369d7dSTobias Sarnowski function testStateMoves() { 133*f8369d7dSTobias Sarnowski $stack = new Doku_LexerStateStack("one"); 134*f8369d7dSTobias Sarnowski $stack->enter("two"); 135*f8369d7dSTobias Sarnowski $this->assertEquals($stack->getCurrent(), "two"); 136*f8369d7dSTobias Sarnowski $stack->enter("three"); 137*f8369d7dSTobias Sarnowski $this->assertEquals($stack->getCurrent(), "three"); 138*f8369d7dSTobias Sarnowski $this->assertTrue($stack->leave()); 139*f8369d7dSTobias Sarnowski $this->assertEquals($stack->getCurrent(), "two"); 140*f8369d7dSTobias Sarnowski $stack->enter("third"); 141*f8369d7dSTobias Sarnowski $this->assertEquals($stack->getCurrent(), "third"); 142*f8369d7dSTobias Sarnowski $this->assertTrue($stack->leave()); 143*f8369d7dSTobias Sarnowski $this->assertTrue($stack->leave()); 144*f8369d7dSTobias Sarnowski $this->assertEquals($stack->getCurrent(), "one"); 145*f8369d7dSTobias Sarnowski } 146*f8369d7dSTobias Sarnowski} 147*f8369d7dSTobias Sarnowski 148*f8369d7dSTobias Sarnowskiclass TestParser { 149*f8369d7dSTobias Sarnowski function TestParser() { 150*f8369d7dSTobias Sarnowski } 151*f8369d7dSTobias Sarnowski function accept() { 152*f8369d7dSTobias Sarnowski } 153*f8369d7dSTobias Sarnowski function a() { 154*f8369d7dSTobias Sarnowski } 155*f8369d7dSTobias Sarnowski function b() { 156*f8369d7dSTobias Sarnowski } 157*f8369d7dSTobias Sarnowski} 158*f8369d7dSTobias Sarnowski 159*f8369d7dSTobias Sarnowskiclass TestOfLexer extends DokuWikiTest { 160*f8369d7dSTobias Sarnowski function testNoPatterns() { 161*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParser'); 162*f8369d7dSTobias Sarnowski $handler->expects($this->never())->method('accept'); 163*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler); 164*f8369d7dSTobias Sarnowski $this->assertFalse($lexer->parse("abcdef")); 165*f8369d7dSTobias Sarnowski } 166*f8369d7dSTobias Sarnowski function testEmptyPage() { 167*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParser'); 168*f8369d7dSTobias Sarnowski $handler->expects($this->never())->method('accept'); 169*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler); 170*f8369d7dSTobias Sarnowski $lexer->addPattern("a+"); 171*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse("")); 172*f8369d7dSTobias Sarnowski } 173*f8369d7dSTobias Sarnowski function testSinglePattern() { 174*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParser'); 175*f8369d7dSTobias Sarnowski $handler->expects($this->at(0))->method('accept') 176*f8369d7dSTobias Sarnowski ->with("aaa", DOKU_LEXER_MATCHED, 0)->will($this->returnValue(true)); 177*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('accept') 178*f8369d7dSTobias Sarnowski ->with("x", DOKU_LEXER_UNMATCHED, 3)->will($this->returnValue(true)); 179*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('accept') 180*f8369d7dSTobias Sarnowski ->with("a", DOKU_LEXER_MATCHED, 4)->will($this->returnValue(true)); 181*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('accept') 182*f8369d7dSTobias Sarnowski ->with("yyy", DOKU_LEXER_UNMATCHED, 5)->will($this->returnValue(true)); 183*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('accept') 184*f8369d7dSTobias Sarnowski ->with("a", DOKU_LEXER_MATCHED, 8)->will($this->returnValue(true)); 185*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('accept') 186*f8369d7dSTobias Sarnowski ->with("x", DOKU_LEXER_UNMATCHED, 9)->will($this->returnValue(true)); 187*f8369d7dSTobias Sarnowski $handler->expects($this->at(6))->method('accept') 188*f8369d7dSTobias Sarnowski ->with("aaa", DOKU_LEXER_MATCHED, 10)->will($this->returnValue(true)); 189*f8369d7dSTobias Sarnowski $handler->expects($this->at(7))->method('accept') 190*f8369d7dSTobias Sarnowski ->with("z", DOKU_LEXER_UNMATCHED, 13)->will($this->returnValue(true)); 191*f8369d7dSTobias Sarnowski 192*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler); 193*f8369d7dSTobias Sarnowski $lexer->addPattern("a+"); 194*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse("aaaxayyyaxaaaz")); 195*f8369d7dSTobias Sarnowski } 196*f8369d7dSTobias Sarnowski function testMultiplePattern() { 197*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParser', array('accept')); 198*f8369d7dSTobias Sarnowski $target = array("a", "b", "a", "bb", "x", "b", "a", "xxxxxx", "a", "x"); 199*f8369d7dSTobias Sarnowski $positions = array(0, 1, 2, 3, 5, 6, 7, 8, 14, 15); 200*f8369d7dSTobias Sarnowski for ($i = 0; $i < count($target); $i++) { 201*f8369d7dSTobias Sarnowski $handler->expects($this->at($i))->method('accept') 202*f8369d7dSTobias Sarnowski ->with($target[$i], $this->anything(), $positions[$i])->will($this->returnValue(true)); 203*f8369d7dSTobias Sarnowski } 204*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler); 205*f8369d7dSTobias Sarnowski $lexer->addPattern("a+"); 206*f8369d7dSTobias Sarnowski $lexer->addPattern("b+"); 207*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse("ababbxbaxxxxxxax")); 208*f8369d7dSTobias Sarnowski } 209*f8369d7dSTobias Sarnowski} 210*f8369d7dSTobias Sarnowski 211*f8369d7dSTobias Sarnowskiclass TestOfLexerModes extends DokuWikiTest { 212*f8369d7dSTobias Sarnowski function testIsolatedPattern() { 213*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParser'); 214*f8369d7dSTobias Sarnowski $handler->expects($this->at(0))->method('a') 215*f8369d7dSTobias Sarnowski ->with("a", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true)); 216*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('a') 217*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_UNMATCHED,1)->will($this->returnValue(true)); 218*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('a') 219*f8369d7dSTobias Sarnowski ->with("aa", DOKU_LEXER_MATCHED,2)->will($this->returnValue(true)); 220*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('a') 221*f8369d7dSTobias Sarnowski ->with("bxb", DOKU_LEXER_UNMATCHED,4)->will($this->returnValue(true)); 222*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('a') 223*f8369d7dSTobias Sarnowski ->with("aaa", DOKU_LEXER_MATCHED,7)->will($this->returnValue(true)); 224*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('a') 225*f8369d7dSTobias Sarnowski ->with("x", DOKU_LEXER_UNMATCHED,10)->will($this->returnValue(true)); 226*f8369d7dSTobias Sarnowski $handler->expects($this->at(6))->method('a') 227*f8369d7dSTobias Sarnowski ->with("aaaa", DOKU_LEXER_MATCHED,11)->will($this->returnValue(true)); 228*f8369d7dSTobias Sarnowski $handler->expects($this->at(7))->method('a') 229*f8369d7dSTobias Sarnowski ->with("x", DOKU_LEXER_UNMATCHED,15)->will($this->returnValue(true)); 230*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "a"); 231*f8369d7dSTobias Sarnowski $lexer->addPattern("a+", "a"); 232*f8369d7dSTobias Sarnowski $lexer->addPattern("b+", "b"); 233*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse("abaabxbaaaxaaaax")); 234*f8369d7dSTobias Sarnowski } 235*f8369d7dSTobias Sarnowski function testModeChange() { 236*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParser'); 237*f8369d7dSTobias Sarnowski $handler->expects($this->at(0))->method('a') 238*f8369d7dSTobias Sarnowski ->with("a", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true)); 239*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('a') 240*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_UNMATCHED,1)->will($this->returnValue(true)); 241*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('a') 242*f8369d7dSTobias Sarnowski ->with("aa", DOKU_LEXER_MATCHED,2)->will($this->returnValue(true)); 243*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('a') 244*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_UNMATCHED,4)->will($this->returnValue(true)); 245*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('a') 246*f8369d7dSTobias Sarnowski ->with("aaa", DOKU_LEXER_MATCHED,5)->will($this->returnValue(true)); 247*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('b') 248*f8369d7dSTobias Sarnowski ->with(":", DOKU_LEXER_ENTER,8)->will($this->returnValue(true)); 249*f8369d7dSTobias Sarnowski $handler->expects($this->at(6))->method('b') 250*f8369d7dSTobias Sarnowski ->with("a", DOKU_LEXER_UNMATCHED,9)->will($this->returnValue(true)); 251*f8369d7dSTobias Sarnowski $handler->expects($this->at(7))->method('b') 252*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_MATCHED, 10)->will($this->returnValue(true)); 253*f8369d7dSTobias Sarnowski $handler->expects($this->at(8))->method('b') 254*f8369d7dSTobias Sarnowski ->with("a", DOKU_LEXER_UNMATCHED,11)->will($this->returnValue(true)); 255*f8369d7dSTobias Sarnowski $handler->expects($this->at(9))->method('b') 256*f8369d7dSTobias Sarnowski ->with("bb", DOKU_LEXER_MATCHED,12)->will($this->returnValue(true)); 257*f8369d7dSTobias Sarnowski $handler->expects($this->at(10))->method('b') 258*f8369d7dSTobias Sarnowski ->with("a", DOKU_LEXER_UNMATCHED,14)->will($this->returnValue(true)); 259*f8369d7dSTobias Sarnowski $handler->expects($this->at(11))->method('b') 260*f8369d7dSTobias Sarnowski ->with("bbb", DOKU_LEXER_MATCHED,15)->will($this->returnValue(true)); 261*f8369d7dSTobias Sarnowski $handler->expects($this->at(12))->method('b') 262*f8369d7dSTobias Sarnowski ->with("a", DOKU_LEXER_UNMATCHED,18)->will($this->returnValue(true)); 263*f8369d7dSTobias Sarnowski 264*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "a"); 265*f8369d7dSTobias Sarnowski $lexer->addPattern("a+", "a"); 266*f8369d7dSTobias Sarnowski $lexer->addEntryPattern(":", "a", "b"); 267*f8369d7dSTobias Sarnowski $lexer->addPattern("b+", "b"); 268*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse("abaabaaa:ababbabbba")); 269*f8369d7dSTobias Sarnowski } 270*f8369d7dSTobias Sarnowski function testNesting() { 271*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParser'); 272*f8369d7dSTobias Sarnowski $handler->expects($this->at(0))->method('a') 273*f8369d7dSTobias Sarnowski ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true)); 274*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('a') 275*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_UNMATCHED,2)->will($this->returnValue(true)); 276*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('a') 277*f8369d7dSTobias Sarnowski ->with("aa", DOKU_LEXER_MATCHED,3)->will($this->returnValue(true)); 278*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('a') 279*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_UNMATCHED,5)->will($this->returnValue(true)); 280*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('b') 281*f8369d7dSTobias Sarnowski ->with("(", DOKU_LEXER_ENTER,6)->will($this->returnValue(true)); 282*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('b') 283*f8369d7dSTobias Sarnowski ->with("bb", DOKU_LEXER_MATCHED,7)->will($this->returnValue(true)); 284*f8369d7dSTobias Sarnowski $handler->expects($this->at(6))->method('b') 285*f8369d7dSTobias Sarnowski ->with("a", DOKU_LEXER_UNMATCHED,9)->will($this->returnValue(true)); 286*f8369d7dSTobias Sarnowski $handler->expects($this->at(7))->method('b') 287*f8369d7dSTobias Sarnowski ->with("bb", DOKU_LEXER_MATCHED,10)->will($this->returnValue(true)); 288*f8369d7dSTobias Sarnowski $handler->expects($this->at(8))->method('b') 289*f8369d7dSTobias Sarnowski ->with(")", DOKU_LEXER_EXIT,12)->will($this->returnValue(true)); 290*f8369d7dSTobias Sarnowski $handler->expects($this->at(9))->method('a') 291*f8369d7dSTobias Sarnowski ->with("aa", DOKU_LEXER_MATCHED,13)->will($this->returnValue(true)); 292*f8369d7dSTobias Sarnowski $handler->expects($this->at(10))->method('a') 293*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_UNMATCHED,15)->will($this->returnValue(true)); 294*f8369d7dSTobias Sarnowski 295*f8369d7dSTobias Sarnowski 296*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "a"); 297*f8369d7dSTobias Sarnowski $lexer->addPattern("a+", "a"); 298*f8369d7dSTobias Sarnowski $lexer->addEntryPattern("(", "a", "b"); 299*f8369d7dSTobias Sarnowski $lexer->addPattern("b+", "b"); 300*f8369d7dSTobias Sarnowski $lexer->addExitPattern(")", "b"); 301*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse("aabaab(bbabb)aab")); 302*f8369d7dSTobias Sarnowski } 303*f8369d7dSTobias Sarnowski function testSingular() { 304*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParser'); 305*f8369d7dSTobias Sarnowski $handler->expects($this->at(0))->method('a') 306*f8369d7dSTobias Sarnowski ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true)); 307*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('b') 308*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_SPECIAL,2)->will($this->returnValue(true)); 309*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('a') 310*f8369d7dSTobias Sarnowski ->with("aa", DOKU_LEXER_MATCHED,3)->will($this->returnValue(true)); 311*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('a') 312*f8369d7dSTobias Sarnowski ->with("xx", DOKU_LEXER_UNMATCHED,5)->will($this->returnValue(true)); 313*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('b') 314*f8369d7dSTobias Sarnowski ->with("bbb", DOKU_LEXER_SPECIAL,7)->will($this->returnValue(true)); 315*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('a') 316*f8369d7dSTobias Sarnowski ->with("xx", DOKU_LEXER_UNMATCHED,10)->will($this->returnValue(true)); 317*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "a"); 318*f8369d7dSTobias Sarnowski $lexer->addPattern("a+", "a"); 319*f8369d7dSTobias Sarnowski $lexer->addSpecialPattern("b+", "a", "b"); 320*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse("aabaaxxbbbxx")); 321*f8369d7dSTobias Sarnowski } 322*f8369d7dSTobias Sarnowski function testUnwindTooFar() { 323*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParser'); 324*f8369d7dSTobias Sarnowski $handler->expects($this->at(0))->method('a') 325*f8369d7dSTobias Sarnowski ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true)); 326*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('a') 327*f8369d7dSTobias Sarnowski ->with(")", DOKU_LEXER_EXIT,2)->will($this->returnValue(true)); 328*f8369d7dSTobias Sarnowski 329*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "a"); 330*f8369d7dSTobias Sarnowski $lexer->addPattern("a+", "a"); 331*f8369d7dSTobias Sarnowski $lexer->addExitPattern(")", "a"); 332*f8369d7dSTobias Sarnowski $this->assertFalse($lexer->parse("aa)aa")); 333*f8369d7dSTobias Sarnowski } 334*f8369d7dSTobias Sarnowski} 335*f8369d7dSTobias Sarnowski 336*f8369d7dSTobias Sarnowskiclass TestOfLexerHandlers extends DokuWikiTest { 337*f8369d7dSTobias Sarnowski function testModeMapping() { 338*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParser'); 339*f8369d7dSTobias Sarnowski $handler->expects($this->at(0))->method('a') 340*f8369d7dSTobias Sarnowski ->with("aa", DOKU_LEXER_MATCHED,0)->will($this->returnValue(true)); 341*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('a') 342*f8369d7dSTobias Sarnowski ->with("(", DOKU_LEXER_ENTER,2)->will($this->returnValue(true)); 343*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('a') 344*f8369d7dSTobias Sarnowski ->with("bb", DOKU_LEXER_MATCHED,3)->will($this->returnValue(true)); 345*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('a') 346*f8369d7dSTobias Sarnowski ->with("a", DOKU_LEXER_UNMATCHED,5)->will($this->returnValue(true)); 347*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('a') 348*f8369d7dSTobias Sarnowski ->with("bb", DOKU_LEXER_MATCHED,6)->will($this->returnValue(true)); 349*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('a') 350*f8369d7dSTobias Sarnowski ->with(")", DOKU_LEXER_EXIT,8)->will($this->returnValue(true)); 351*f8369d7dSTobias Sarnowski $handler->expects($this->at(6))->method('a') 352*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_UNMATCHED,9)->will($this->returnValue(true)); 353*f8369d7dSTobias Sarnowski 354*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "mode_a"); 355*f8369d7dSTobias Sarnowski $lexer->addPattern("a+", "mode_a"); 356*f8369d7dSTobias Sarnowski $lexer->addEntryPattern("(", "mode_a", "mode_b"); 357*f8369d7dSTobias Sarnowski $lexer->addPattern("b+", "mode_b"); 358*f8369d7dSTobias Sarnowski $lexer->addExitPattern(")", "mode_b"); 359*f8369d7dSTobias Sarnowski $lexer->mapHandler("mode_a", "a"); 360*f8369d7dSTobias Sarnowski $lexer->mapHandler("mode_b", "a"); 361*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse("aa(bbabb)b")); 362*f8369d7dSTobias Sarnowski } 363*f8369d7dSTobias Sarnowski} 364*f8369d7dSTobias Sarnowski 365*f8369d7dSTobias Sarnowskiclass TestParserByteIndex { 366*f8369d7dSTobias Sarnowski 367*f8369d7dSTobias Sarnowski function TestParserByteIndex() {} 368*f8369d7dSTobias Sarnowski 369*f8369d7dSTobias Sarnowski function ignore() {} 370*f8369d7dSTobias Sarnowski 371*f8369d7dSTobias Sarnowski function caught() {} 372*f8369d7dSTobias Sarnowski} 373*f8369d7dSTobias Sarnowski 374*f8369d7dSTobias Sarnowskiclass TestOfLexerByteIndices extends DokuWikiTest { 375*f8369d7dSTobias Sarnowski 376*f8369d7dSTobias Sarnowski function testIndex() { 377*f8369d7dSTobias Sarnowski $doc = "aaa<file>bcd</file>eee"; 378*f8369d7dSTobias Sarnowski 379*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParserByteIndex'); 380*f8369d7dSTobias Sarnowski $handler->expects($this->any())->method('ignore')->will($this->returnValue(true)); 381*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('caught') 382*f8369d7dSTobias Sarnowski ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true)); 383*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('caught') 384*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true)); 385*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('caught') 386*f8369d7dSTobias Sarnowski ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true)); 387*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('caught') 388*f8369d7dSTobias Sarnowski ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true)); 389*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('caught') 390*f8369d7dSTobias Sarnowski ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true)); 391*f8369d7dSTobias Sarnowski 392*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "ignore"); 393*f8369d7dSTobias Sarnowski $lexer->addEntryPattern("<file>", "ignore", "caught"); 394*f8369d7dSTobias Sarnowski $lexer->addExitPattern("</file>", "caught"); 395*f8369d7dSTobias Sarnowski $lexer->addSpecialPattern('b','caught','special'); 396*f8369d7dSTobias Sarnowski $lexer->mapHandler('special','caught'); 397*f8369d7dSTobias Sarnowski $lexer->addPattern('c','caught'); 398*f8369d7dSTobias Sarnowski 399*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse($doc)); 400*f8369d7dSTobias Sarnowski } 401*f8369d7dSTobias Sarnowski 402*f8369d7dSTobias Sarnowski function testIndexLookaheadEqual() { 403*f8369d7dSTobias Sarnowski $doc = "aaa<file>bcd</file>eee"; 404*f8369d7dSTobias Sarnowski 405*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParserByteIndex'); 406*f8369d7dSTobias Sarnowski $handler->expects($this->any())->method('ignore')->will($this->returnValue(true)); 407*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('caught') 408*f8369d7dSTobias Sarnowski ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true)); 409*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('caught') 410*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true)); 411*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('caught') 412*f8369d7dSTobias Sarnowski ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true)); 413*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('caught') 414*f8369d7dSTobias Sarnowski ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true)); 415*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('caught') 416*f8369d7dSTobias Sarnowski ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true)); 417*f8369d7dSTobias Sarnowski 418*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "ignore"); 419*f8369d7dSTobias Sarnowski $lexer->addEntryPattern('<file>(?=.*</file>)', "ignore", "caught"); 420*f8369d7dSTobias Sarnowski $lexer->addExitPattern("</file>", "caught"); 421*f8369d7dSTobias Sarnowski $lexer->addSpecialPattern('b','caught','special'); 422*f8369d7dSTobias Sarnowski $lexer->mapHandler('special','caught'); 423*f8369d7dSTobias Sarnowski $lexer->addPattern('c','caught'); 424*f8369d7dSTobias Sarnowski 425*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse($doc)); 426*f8369d7dSTobias Sarnowski } 427*f8369d7dSTobias Sarnowski 428*f8369d7dSTobias Sarnowski function testIndexLookaheadNotEqual() { 429*f8369d7dSTobias Sarnowski $doc = "aaa<file>bcd</file>eee"; 430*f8369d7dSTobias Sarnowski 431*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParserByteIndex'); 432*f8369d7dSTobias Sarnowski $handler->expects($this->any())->method('ignore')->will($this->returnValue(true)); 433*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('caught') 434*f8369d7dSTobias Sarnowski ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true)); 435*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('caught') 436*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true)); 437*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('caught') 438*f8369d7dSTobias Sarnowski ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true)); 439*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('caught') 440*f8369d7dSTobias Sarnowski ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true)); 441*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('caught') 442*f8369d7dSTobias Sarnowski ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true)); 443*f8369d7dSTobias Sarnowski 444*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "ignore"); 445*f8369d7dSTobias Sarnowski $lexer->addEntryPattern('<file>(?!foo)', "ignore", "caught"); 446*f8369d7dSTobias Sarnowski $lexer->addExitPattern("</file>", "caught"); 447*f8369d7dSTobias Sarnowski $lexer->addSpecialPattern('b','caught','special'); 448*f8369d7dSTobias Sarnowski $lexer->mapHandler('special','caught'); 449*f8369d7dSTobias Sarnowski $lexer->addPattern('c','caught'); 450*f8369d7dSTobias Sarnowski 451*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse($doc)); 452*f8369d7dSTobias Sarnowski } 453*f8369d7dSTobias Sarnowski 454*f8369d7dSTobias Sarnowski function testIndexLookbehindEqual() { 455*f8369d7dSTobias Sarnowski $doc = "aaa<file>bcd</file>eee"; 456*f8369d7dSTobias Sarnowski 457*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParserByteIndex'); 458*f8369d7dSTobias Sarnowski $handler->expects($this->any())->method('ignore')->will($this->returnValue(true)); 459*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('caught') 460*f8369d7dSTobias Sarnowski ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true)); 461*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('caught') 462*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true)); 463*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('caught') 464*f8369d7dSTobias Sarnowski ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true)); 465*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('caught') 466*f8369d7dSTobias Sarnowski ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true)); 467*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('caught') 468*f8369d7dSTobias Sarnowski ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true)); 469*f8369d7dSTobias Sarnowski 470*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "ignore"); 471*f8369d7dSTobias Sarnowski $lexer->addEntryPattern('<file>', "ignore", "caught"); 472*f8369d7dSTobias Sarnowski $lexer->addExitPattern("(?<=d)</file>", "caught"); 473*f8369d7dSTobias Sarnowski $lexer->addSpecialPattern('b','caught','special'); 474*f8369d7dSTobias Sarnowski $lexer->mapHandler('special','caught'); 475*f8369d7dSTobias Sarnowski $lexer->addPattern('c','caught'); 476*f8369d7dSTobias Sarnowski 477*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse($doc)); 478*f8369d7dSTobias Sarnowski } 479*f8369d7dSTobias Sarnowski 480*f8369d7dSTobias Sarnowski function testIndexLookbehindNotEqual() { 481*f8369d7dSTobias Sarnowski $doc = "aaa<file>bcd</file>eee"; 482*f8369d7dSTobias Sarnowski 483*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParserByteIndex'); 484*f8369d7dSTobias Sarnowski $handler->expects($this->any())->method('ignore')->will($this->returnValue(true)); 485*f8369d7dSTobias Sarnowski $handler->expects($this->at(1))->method('caught') 486*f8369d7dSTobias Sarnowski ->with("<file>", DOKU_LEXER_ENTER, strpos($doc,'<file>'))->will($this->returnValue(true)); 487*f8369d7dSTobias Sarnowski $handler->expects($this->at(2))->method('caught') 488*f8369d7dSTobias Sarnowski ->with("b", DOKU_LEXER_SPECIAL, strpos($doc,'b'))->will($this->returnValue(true)); 489*f8369d7dSTobias Sarnowski $handler->expects($this->at(3))->method('caught') 490*f8369d7dSTobias Sarnowski ->with("c", DOKU_LEXER_MATCHED, strpos($doc,'c'))->will($this->returnValue(true)); 491*f8369d7dSTobias Sarnowski $handler->expects($this->at(4))->method('caught') 492*f8369d7dSTobias Sarnowski ->with("d", DOKU_LEXER_UNMATCHED, strpos($doc,'d'))->will($this->returnValue(true)); 493*f8369d7dSTobias Sarnowski $handler->expects($this->at(5))->method('caught') 494*f8369d7dSTobias Sarnowski ->with("</file>", DOKU_LEXER_EXIT, strpos($doc,'</file>'))->will($this->returnValue(true)); 495*f8369d7dSTobias Sarnowski 496*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, 'ignore'); 497*f8369d7dSTobias Sarnowski $lexer->addEntryPattern('<file>', 'ignore', 'caught'); 498*f8369d7dSTobias Sarnowski $lexer->addExitPattern('(?<!c)</file>', 'caught'); 499*f8369d7dSTobias Sarnowski $lexer->addSpecialPattern('b','caught','special'); 500*f8369d7dSTobias Sarnowski $lexer->mapHandler('special','caught'); 501*f8369d7dSTobias Sarnowski $lexer->addPattern('c','caught'); 502*f8369d7dSTobias Sarnowski 503*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse($doc)); 504*f8369d7dSTobias Sarnowski } 505*f8369d7dSTobias Sarnowski 506*f8369d7dSTobias Sarnowski /** 507*f8369d7dSTobias Sarnowski * This test is primarily to ensure the correct match is chosen 508*f8369d7dSTobias Sarnowski * when there are non-captured elements in the pattern. 509*f8369d7dSTobias Sarnowski */ 510*f8369d7dSTobias Sarnowski function testIndexSelectCorrectMatch() { 511*f8369d7dSTobias Sarnowski $doc = "ALL FOOLS ARE FOO"; 512*f8369d7dSTobias Sarnowski $pattern = '\bFOO\b'; 513*f8369d7dSTobias Sarnowski 514*f8369d7dSTobias Sarnowski $handler = $this->getMock('TestParserByteIndex'); 515*f8369d7dSTobias Sarnowski $handler->expects($this->any())->method('ignore')->will($this->returnValue(true)); 516*f8369d7dSTobias Sarnowski 517*f8369d7dSTobias Sarnowski $matches = array(); 518*f8369d7dSTobias Sarnowski preg_match('/'.$pattern.'/',$doc,$matches,PREG_OFFSET_CAPTURE); 519*f8369d7dSTobias Sarnowski 520*f8369d7dSTobias Sarnowski $handler->expects($this->once())->method('caught') 521*f8369d7dSTobias Sarnowski ->with("FOO", DOKU_LEXER_SPECIAL, $matches[0][1])->will($this->returnValue(true)); 522*f8369d7dSTobias Sarnowski 523*f8369d7dSTobias Sarnowski $lexer = new Doku_Lexer($handler, "ignore"); 524*f8369d7dSTobias Sarnowski $lexer->addSpecialPattern($pattern,'ignore','caught'); 525*f8369d7dSTobias Sarnowski 526*f8369d7dSTobias Sarnowski $this->assertTrue($lexer->parse($doc)); 527*f8369d7dSTobias Sarnowski } 528*f8369d7dSTobias Sarnowski 529*f8369d7dSTobias Sarnowski} 530*f8369d7dSTobias Sarnowski 531*f8369d7dSTobias Sarnowski?> 532