1<?php
2
3use dokuwiki\Parsing\ParserMode\Acronym;
4use dokuwiki\Parsing\ParserMode\Entity;
5use dokuwiki\Parsing\ParserMode\Hr;
6use dokuwiki\Parsing\ParserMode\Multiplyentity;
7use dokuwiki\Parsing\ParserMode\Smiley;
8use dokuwiki\Parsing\ParserMode\Wordblock;
9
10require_once 'parser.inc.php';
11
12class TestOfDoku_Parser_Replacements extends TestOfDoku_Parser {
13
14    function testSingleAcronym() {
15        $this->P->addMode('acronym',new Acronym(array('FOOBAR')));
16        $this->P->parse('abc FOOBAR xyz');
17
18        $calls = array (
19            array('document_start',array()),
20            array('p_open',array()),
21            array('cdata',array("\n".'abc ')),
22            array('acronym',array('FOOBAR')),
23            array('cdata',array(' xyz')),
24            array('p_close',array()),
25            array('document_end',array()),
26        );
27
28        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
29    }
30
31    function testAlmostAnAcronym() {
32        $this->P->addMode('acronym',new Acronym(array('FOOBAR')));
33        $this->P->parse('abcFOOBARxyz');
34
35        $calls = array (
36            array('document_start',array()),
37            array('p_open',array()),
38            array('cdata',array("\n".'abcFOOBARxyz')),
39            array('p_close',array()),
40            array('document_end',array()),
41        );
42
43        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
44    }
45
46    function testPickAcronymCorrectly() {
47        $this->P->addMode('acronym',new Acronym(array('FOO')));
48        $this->P->parse('FOOBAR FOO');
49
50        $calls = array (
51            array('document_start',array()),
52            array('p_open',array()),
53            array('cdata',array("\n".'FOOBAR ')),
54            array('acronym',array('FOO')),
55            array('cdata',array('')),
56            array('p_close',array()),
57            array('document_end',array()),
58        );
59
60        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
61    }
62
63    function testMultipleAcronyms() {
64        $this->P->addMode('acronym',new Acronym(array('FOO','BAR')));
65        $this->P->parse('abc FOO def BAR xyz');
66
67        $calls = array (
68            array('document_start',array()),
69            array('p_open',array()),
70            array('cdata',array("\n".'abc ')),
71            array('acronym',array('FOO')),
72            array('cdata',array(' def ')),
73            array('acronym',array('BAR')),
74            array('cdata',array(' xyz')),
75            array('p_close',array()),
76            array('document_end',array()),
77        );
78
79        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
80
81    }
82
83    function testMultipleAcronymsWithSubset1() {
84        $this->P->addMode('acronym',new Acronym(array('FOO','A.FOO','FOO.1','A.FOO.1')));
85        $this->P->parse('FOO A.FOO FOO.1 A.FOO.1');
86
87        $calls = array (
88            array('document_start',array()),
89            array('p_open',array()),
90            array('cdata',array("\n")),
91            array('acronym',array('FOO')),
92            array('cdata',array(" ")),
93            array('acronym',array('A.FOO')),
94            array('cdata',array(" ")),
95            array('acronym',array('FOO.1')),
96            array('cdata',array(" ")),
97            array('acronym',array('A.FOO.1')),
98            array('cdata',array('')),
99            array('p_close',array()),
100            array('document_end',array()),
101        );
102
103        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
104    }
105
106    function testMultipleAcronymsWithSubset2() {
107        $this->P->addMode('acronym',new Acronym(array('A.FOO.1','FOO.1','A.FOO','FOO')));
108        $this->P->parse('FOO A.FOO FOO.1 A.FOO.1');
109
110        $calls = array (
111            array('document_start',array()),
112            array('p_open',array()),
113            array('cdata',array("\n")),
114            array('acronym',array('FOO')),
115            array('cdata',array(" ")),
116            array('acronym',array('A.FOO')),
117            array('cdata',array(" ")),
118            array('acronym',array('FOO.1')),
119            array('cdata',array(" ")),
120            array('acronym',array('A.FOO.1')),
121            array('cdata',array('')),
122            array('p_close',array()),
123            array('document_end',array()),
124        );
125
126        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
127    }
128
129    function testSingleSmileyFail() {
130        $this->P->addMode('smiley',new Smiley(array(':-)')));
131        $this->P->parse('abc:-)xyz');
132
133        $calls = array (
134            array('document_start',array()),
135            array('p_open',array()),
136            array('cdata',array("\nabc:-)xyz")),
137            array('p_close',array()),
138            array('document_end',array()),
139        );
140
141        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
142    }
143
144    function testSingleSmiley() {
145        $this->P->addMode('smiley',new Smiley(array(':-)')));
146        $this->P->parse('abc :-) xyz');
147
148        $calls = array (
149            array('document_start',array()),
150            array('p_open',array()),
151            array('cdata',array("\n".'abc ')),
152            array('smiley',array(':-)')),
153            array('cdata',array(' xyz')),
154            array('p_close',array()),
155            array('document_end',array()),
156        );
157
158        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
159    }
160
161    function testMultipleSmileysFail() {
162        $this->P->addMode('smiley',new Smiley(array(':-)','^_^')));
163        $this->P->parse('abc:-)x^_^yz');
164
165        $calls = array (
166            array('document_start',array()),
167            array('p_open',array()),
168            array('cdata',array("\nabc:-)x^_^yz")),
169            array('p_close',array()),
170            array('document_end',array()),
171        );
172
173        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
174    }
175
176    function testMultipleSmileys() {
177        $this->P->addMode('smiley',new Smiley(array(':-)','^_^')));
178        $this->P->parse('abc :-) x ^_^ yz');
179
180        $calls = array (
181            array('document_start',array()),
182            array('p_open',array()),
183            array('cdata',array("\n".'abc ')),
184            array('smiley',array(':-)')),
185            array('cdata',array(' x ')),
186            array('smiley',array('^_^')),
187            array('cdata',array(' yz')),
188            array('p_close',array()),
189            array('document_end',array()),
190        );
191
192        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
193    }
194
195    function testBackslashSmileyFail() {
196        // This smiley is really :-\\ but escaping makes like interesting
197        $this->P->addMode('smiley',new Smiley(array(':-\\\\')));
198        $this->P->parse('abc:-\\\xyz');
199
200        $calls = array (
201            array('document_start',array()),
202            array('p_open',array()),
203            array('cdata',array("\nabc".':-\\\\'."xyz")),
204            array('p_close',array()),
205            array('document_end',array()),
206        );
207
208        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
209    }
210
211    function testBackslashSmiley() {
212        // This smiley is really :-\\ but escaping makes like interesting
213        $this->P->addMode('smiley',new Smiley(array(':-\\\\')));
214        $this->P->parse('abc :-\\\ xyz');
215
216        $calls = array (
217            array('document_start',array()),
218            array('p_open',array()),
219            array('cdata',array("\n".'abc ')),
220            array('smiley',array(':-\\\\')),
221            array('cdata',array(' xyz')),
222            array('p_close',array()),
223            array('document_end',array()),
224        );
225
226        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
227    }
228
229    function testSingleWordblock() {
230        $this->P->addMode('wordblock',new Wordblock(array('CAT')));
231        $this->P->parse('abc CAT xyz');
232
233        $calls = array (
234            array('document_start',array()),
235            array('p_open',array()),
236            array('cdata',array("\n".'abc ')),
237            array('wordblock',array('CAT')),
238            array('cdata',array(' xyz')),
239            array('p_close',array()),
240            array('document_end',array()),
241        );
242
243        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
244    }
245
246    function testWordblockCase() {
247        $this->P->addMode('wordblock',new Wordblock(array('CAT')));
248        $this->P->parse('abc cat xyz');
249
250        $calls = array (
251            array('document_start',array()),
252            array('p_open',array()),
253            array('cdata',array("\n".'abc ')),
254            array('wordblock',array('cat')),
255            array('cdata',array(' xyz')),
256            array('p_close',array()),
257            array('document_end',array()),
258        );
259
260        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
261    }
262
263    function testMultipleWordblock() {
264        $this->P->addMode('wordblock',new Wordblock(array('CAT','dog')));
265        $this->P->parse('abc cat x DOG yz');
266
267        $calls = array (
268            array('document_start',array()),
269            array('p_open',array()),
270            array('cdata',array("\n".'abc ')),
271            array('wordblock',array('cat')),
272            array('cdata',array(' x ')),
273            array('wordblock',array('DOG')),
274            array('cdata',array(' yz')),
275            array('p_close',array()),
276            array('document_end',array()),
277        );
278
279        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
280    }
281
282    function testSingleEntity() {
283        $this->P->addMode('entity',new Entity(array('->')));
284        $this->P->parse('x -> y');
285
286        $calls = array (
287            array('document_start',array()),
288            array('p_open',array()),
289            array('cdata',array("\n".'x ')),
290            array('entity',array('->')),
291            array('cdata',array(' y')),
292            array('p_close',array()),
293            array('document_end',array()),
294        );
295
296        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
297    }
298
299    function testMultipleEntities() {
300        $this->P->addMode('entity',new Entity(array('->','<-')));
301        $this->P->parse('x -> y <- z');
302
303        $calls = array (
304            array('document_start',array()),
305            array('p_open',array()),
306            array('cdata',array("\n".'x ')),
307            array('entity',array('->')),
308            array('cdata',array(' y ')),
309            array('entity',array('<-')),
310            array('cdata',array(' z')),
311            array('p_close',array()),
312            array('document_end',array()),
313        );
314
315        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
316    }
317
318    function testMultiplyEntity() {
319        $this->P->addMode('multiplyentity',new Multiplyentity());
320        $this->P->parse('Foo 10x20 Bar');
321
322        $calls = array (
323            array('document_start',array()),
324            array('p_open',array()),
325            array('cdata',array("\n".'Foo ')),
326            array('multiplyentity',array(10,20)),
327            array('cdata',array(' Bar')),
328            array('p_close',array()),
329            array('document_end',array()),
330        );
331
332        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
333    }
334
335    function testMultiplyEntityHex() {
336    	// the multiply entity pattern should not match hex numbers, eg. 0x123
337        $this->P->addMode('multiplyentity',new Multiplyentity());
338        $this->P->parse('Foo 0x123 Bar');
339
340        $calls = array (
341            array('document_start',array()),
342            array('p_open',array()),
343            array('cdata',array("\n".'Foo 0x123 Bar')),
344            array('p_close',array()),
345            array('document_end',array()),
346        );
347
348        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
349    }
350
351    function testHR() {
352        $this->P->addMode('hr',new Hr());
353        $this->P->parse("Foo \n ---- \n Bar");
354
355        $calls = array (
356            array('document_start',array()),
357            array('p_open',array()),
358            array('cdata',array("\n".'Foo ')),
359            array('p_close',array()),
360            array('hr',array()),
361            array('p_open',array()),
362            array('cdata',array("\n Bar")),
363            array('p_close',array()),
364            array('document_end',array()),
365        );
366        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
367    }
368
369    function testHREol() {
370        $this->P->addMode('hr',new Hr());
371        $this->P->parse("Foo \n----\n Bar");
372
373        $calls = array (
374            array('document_start',array()),
375            array('p_open',array()),
376            array('cdata',array("\n".'Foo ')),
377            array('p_close',array()),
378            array('hr',array()),
379            array('p_open',array()),
380            array('cdata',array("\n Bar")),
381            array('p_close',array()),
382            array('document_end',array()),
383        );
384        $this->assertEquals(array_map('stripbyteindex',$this->H->calls),$calls);
385    }
386}
387
388