xref: /dokuwiki/_test/tests/inc/parser/lexer.test.php (revision f8369d7d6e37248d6523fdac6e1d760fca4f1b52)
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