xref: /dokuwiki/_test/tests/inc/parser/lexer.test.php (revision db5867f121b19818346eefca38c4fc13a71ff66c)
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 {
14926e22ab8SChristopher 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() {
161*db5867f1SAndreas Gohr        $handler = $this->createMock('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() {
167*db5867f1SAndreas Gohr        $handler = $this->createMock('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() {
174*db5867f1SAndreas Gohr        $handler = $this->createMock('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() {
197*db5867f1SAndreas Gohr        $handler = $this->createPartialMock('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() {
213*db5867f1SAndreas Gohr        $handler = $this->createMock('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() {
236*db5867f1SAndreas Gohr        $handler = $this->createMock('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() {
271*db5867f1SAndreas Gohr        $handler = $this->createMock('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() {
304*db5867f1SAndreas Gohr        $handler = $this->createMock('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() {
323*db5867f1SAndreas Gohr        $handler = $this->createMock('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() {
338*db5867f1SAndreas Gohr        $handler = $this->createMock('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
36726e22ab8SChristopher 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
379*db5867f1SAndreas Gohr        $handler = $this->createMock('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
405*db5867f1SAndreas Gohr        $handler = $this->createMock('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
431*db5867f1SAndreas Gohr        $handler = $this->createMock('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
457*db5867f1SAndreas Gohr        $handler = $this->createMock('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
483*db5867f1SAndreas Gohr        $handler = $this->createMock('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
514*db5867f1SAndreas Gohr        $handler = $this->createMock('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}
530