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