1 "{ Package: 'stx:goodies/petitparser' }" |
|
2 |
|
3 PPAbstractParserTest subclass:#PPParserTest |
|
4 instanceVariableNames:'' |
|
5 classVariableNames:'' |
|
6 poolDictionaries:'' |
|
7 category:'PetitTests-Tests' |
|
8 ! |
|
9 |
|
10 |
|
11 !PPParserTest methodsFor:'testing'! |
|
12 |
|
13 testAnd |
|
14 | parser | |
|
15 parser := 'foo' asParser flatten , 'bar' asParser flatten and. |
|
16 |
|
17 self assert: parser parse: 'foobar' to: #('foo' 'bar') end: 3. |
|
18 self assert: parser fail: 'foobaz'. |
|
19 |
|
20 parser := 'foo' asParser and. |
|
21 self assert: parser and = parser |
|
22 ! |
|
23 |
|
24 testBlock |
|
25 | parser | |
|
26 parser := [ :s | s next ] asParser. |
|
27 |
|
28 self assert: parser parse: 'ab' to: $a end: 1. |
|
29 self assert: parser parse: 'b' to: $b. |
|
30 self assert: parser parse: '' to: nil |
|
31 ! |
|
32 |
|
33 testChoice |
|
34 | parser | |
|
35 parser := $a asParser / $b asParser. |
|
36 |
|
37 self assert: parser parse: 'a' to: $a. |
|
38 self assert: parser parse: 'b' to: $b. |
|
39 |
|
40 self assert: parser parse: 'ab' to: $a end: 1. |
|
41 self assert: parser parse: 'ba' to: $b end: 1. |
|
42 |
|
43 self assert: parser fail: ''. |
|
44 self assert: parser fail: 'c'. |
|
45 self assert: parser fail: 'ca' |
|
46 ! |
|
47 |
|
48 testDelimitedBy |
|
49 | parser | |
|
50 parser := $a asParser delimitedBy: $b asParser. |
|
51 |
|
52 self assert: parser parse: 'a' to: #($a). |
|
53 self assert: parser parse: 'aba' to: #($a $b $a). |
|
54 self assert: parser parse: 'ababa' to: #($a $b $a $b $a). |
|
55 |
|
56 self assert: parser parse: 'ab' to: #($a $b). |
|
57 self assert: parser parse: 'abab' to: #($a $b $a $b). |
|
58 self assert: parser parse: 'ababab' to: #($a $b $a $b $a $b). |
|
59 |
|
60 self assert: parser parse: 'ac' to: #($a) end: 1. |
|
61 self assert: parser parse: 'abc' to: #($a $b) end: 2. |
|
62 self assert: parser parse: 'abac' to: #($a $b $a) end: 3. |
|
63 self assert: parser parse: 'ababc' to: #($a $b $a $b) end: 4. |
|
64 |
|
65 self assert: parser fail: ''. |
|
66 self assert: parser fail: 'b'. |
|
67 self assert: parser fail: 'c' |
|
68 ! |
|
69 |
|
70 testDelimitedByWithoutSeparators |
|
71 | parser | |
|
72 parser := ($a asParser delimitedBy: $b asParser) |
|
73 withoutSeparators. |
|
74 |
|
75 self assert: parser parse: 'a' to: #($a). |
|
76 self assert: parser parse: 'aba' to: #($a $a). |
|
77 self assert: parser parse: 'ababa' to: #($a $a $a). |
|
78 |
|
79 self assert: parser parse: 'ab' to: #($a). |
|
80 self assert: parser parse: 'abab' to: #($a $a). |
|
81 self assert: parser parse: 'ababab' to: #($a $a $a). |
|
82 |
|
83 self assert: parser parse: 'ac' to: #($a) end: 1. |
|
84 self assert: parser parse: 'abc' to: #($a) end: 2. |
|
85 self assert: parser parse: 'abac' to: #($a $a) end: 3. |
|
86 self assert: parser parse: 'ababc' to: #($a $a) end: 4. |
|
87 |
|
88 self assert: parser fail: ''. |
|
89 self assert: parser fail: 'b'. |
|
90 self assert: parser fail: 'c' |
|
91 ! |
|
92 |
|
93 testEndOfInput |
|
94 | parser | |
|
95 parser := PPEndOfInputParser on: $a asParser. |
|
96 self assert: parser end = parser. |
|
97 |
|
98 self assert: parser parse: 'a' to: $a. |
|
99 self assert: parser fail: ''. |
|
100 self assert: parser fail: 'aa' |
|
101 ! |
|
102 |
|
103 testEndOfInputAfterMatch |
|
104 | parser | |
|
105 parser := 'stuff' asParser end. |
|
106 self assert: parser parse: 'stuff' to: 'stuff'. |
|
107 self assert: parser fail: 'stufff'. |
|
108 self assert: parser fail: 'fluff' |
|
109 ! |
|
110 |
|
111 testEpsilon |
|
112 | parser | |
|
113 parser := nil asParser. |
|
114 |
|
115 self assert: parser parse: '' to: nil. |
|
116 |
|
117 self assert: parser parse: 'a' to: nil end: 0. |
|
118 self assert: parser parse: 'ab' to: nil end: 0 |
|
119 ! |
|
120 |
|
121 testFailing |
|
122 | parser result | |
|
123 parser := PPFailingParser message: 'Plonk'. |
|
124 self assert: parser message = 'Plonk'. |
|
125 |
|
126 self assert: parser fail: ''. |
|
127 self assert: parser fail: 'a'. |
|
128 self assert: parser fail: 'aa'. |
|
129 |
|
130 result := parser parse: 'a'. |
|
131 self assert: result message = 'Plonk'. |
|
132 self assert: result printString = 'Plonk at 0' |
|
133 ! |
|
134 |
|
135 testLiteralObject |
|
136 | parser | |
|
137 parser := PPLiteralObjectParser |
|
138 on: $a |
|
139 message: 'letter "a" expected'. |
|
140 self assert: parser literal = $a. |
|
141 self assert: parser message = 'letter "a" expected'. |
|
142 |
|
143 self assert: parser parse: 'a' to: $a. |
|
144 self assert: parser fail: 'b' |
|
145 |
|
146 ! |
|
147 |
|
148 testLiteralObjectCaseInsensitive |
|
149 | parser | |
|
150 parser := $a asParser caseInsensitive. |
|
151 |
|
152 self assert: parser parse: 'a' to: $a. |
|
153 self assert: parser parse: 'A' to: $A. |
|
154 |
|
155 self assert: parser fail: ''. |
|
156 self assert: parser fail: 'b'. |
|
157 self assert: parser fail: 'B' |
|
158 |
|
159 ! |
|
160 |
|
161 testLiteralSequence |
|
162 | parser | |
|
163 parser := PPLiteralSequenceParser |
|
164 on: 'abc' |
|
165 message: 'sequence "abc" expected'. |
|
166 self assert: parser size = 3. |
|
167 self assert: parser literal = 'abc'. |
|
168 self assert: parser message = 'sequence "abc" expected'. |
|
169 |
|
170 self assert: parser parse: 'abc' to: 'abc'. |
|
171 self assert: parser fail: 'ab'. |
|
172 self assert: parser fail: 'abd' |
|
173 ! |
|
174 |
|
175 testLiteralSequenceCaseInsensitive |
|
176 | parser | |
|
177 parser := 'abc' asParser caseInsensitive. |
|
178 |
|
179 self assert: parser parse: 'abc' to: 'abc'. |
|
180 self assert: parser parse: 'ABC' to: 'ABC'. |
|
181 self assert: parser parse: 'abC' to: 'abC'. |
|
182 self assert: parser parse: 'AbC' to: 'AbC'. |
|
183 |
|
184 self assert: parser fail: 'ab'. |
|
185 self assert: parser fail: 'abd' |
|
186 ! |
|
187 |
|
188 testMax |
|
189 | parser | |
|
190 parser := $a asParser max: 2. |
|
191 self assert: parser min = 0. |
|
192 self assert: parser max = 2. |
|
193 |
|
194 self assert: parser parse: '' to: #(). |
|
195 self assert: parser parse: 'a' to: #($a). |
|
196 self assert: parser parse: 'aa' to: #($a $a). |
|
197 self assert: parser parse: 'aaa' to: #($a $a) end: 2. |
|
198 self assert: parser parse: 'aaaa' to: #($a $a) end: 2. |
|
199 |
|
200 self assert: (parser printString endsWith: '[0, 2]') |
|
201 ! |
|
202 |
|
203 testMaxGreedy |
|
204 | parser | |
|
205 parser := #word asParser max: 2 greedy: #digit asParser. |
|
206 |
|
207 self assert: parser fail: ''. |
|
208 self assert: parser fail: 'abc'. |
|
209 |
|
210 self assert: parser parse: '1' to: #() end: 0. |
|
211 self assert: parser parse: 'a1' to: #($a) end: 1. |
|
212 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
|
213 self assert: parser fail: 'abc1'. |
|
214 |
|
215 self assert: parser parse: '12' to: #($1) end: 1. |
|
216 self assert: parser parse: 'a12' to: #($a $1) end: 2. |
|
217 self assert: parser parse: 'ab12' to: #($a $b) end: 2. |
|
218 self assert: parser fail: 'abc12'. |
|
219 |
|
220 self assert: parser parse: '123' to: #($1 $2) end: 2. |
|
221 self assert: parser parse: 'a123' to: #($a $1) end: 2. |
|
222 self assert: parser parse: 'ab123' to: #($a $b) end: 2. |
|
223 self assert: parser fail: 'abc123' |
|
224 ! |
|
225 |
|
226 testMaxLazy |
|
227 | parser | |
|
228 parser := #word asParser max: 2 lazy: #digit asParser. |
|
229 |
|
230 self assert: parser fail: ''. |
|
231 self assert: parser fail: 'abc'. |
|
232 |
|
233 self assert: parser parse: '1' to: #() end: 0. |
|
234 self assert: parser parse: 'a1' to: #($a) end: 1. |
|
235 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
|
236 self assert: parser fail: 'abc1'. |
|
237 |
|
238 self assert: parser parse: '12' to: #() end: 0. |
|
239 self assert: parser parse: 'a12' to: #($a) end: 1. |
|
240 self assert: parser parse: 'ab12' to: #($a $b) end: 2. |
|
241 self assert: parser fail: 'abc12'. |
|
242 |
|
243 self assert: parser parse: '123' to: #() end: 0. |
|
244 self assert: parser parse: 'a123' to: #($a) end: 1. |
|
245 self assert: parser parse: 'ab123' to: #($a $b) end: 2. |
|
246 self assert: parser fail: 'abc123' |
|
247 ! |
|
248 |
|
249 testMemoized |
|
250 | count parser twice | |
|
251 count := 0. |
|
252 parser := [ :s | count := count + 1. s next ] asParser memoized. |
|
253 twice := parser and , parser. |
|
254 |
|
255 count := 0. |
|
256 self assert: parser parse: 'a' to: $a. |
|
257 self assert: count = 1. |
|
258 |
|
259 count := 0. |
|
260 self assert: twice parse: 'a' to: #($a $a). |
|
261 self assert: count = 1. |
|
262 |
|
263 self assert: parser memoized = parser |
|
264 ! |
|
265 |
|
266 testMin |
|
267 | parser | |
|
268 parser := $a asParser min: 2. |
|
269 self assert: parser min = 2. |
|
270 self assert: parser max > parser min. |
|
271 |
|
272 self assert: parser fail: ''. |
|
273 self assert: parser fail: 'a'. |
|
274 self assert: parser parse: 'aa' to: #($a $a). |
|
275 self assert: parser parse: 'aaa' to: #($a $a $a). |
|
276 self assert: parser parse: 'aaaa' to: #($a $a $a $a). |
|
277 |
|
278 self assert: (parser printString endsWith: '[2, *]') |
|
279 ! |
|
280 |
|
281 testMinGreedy |
|
282 | parser | |
|
283 parser := #word asParser min: 2 greedy: #digit asParser. |
|
284 |
|
285 self assert: parser fail: ''. |
|
286 self assert: parser fail: 'abcde'. |
|
287 |
|
288 self assert: parser fail: '1'. |
|
289 self assert: parser fail: 'a1'. |
|
290 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
|
291 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
|
292 self assert: parser parse: 'abcd1' to: #($a $b $c $d) end: 4. |
|
293 self assert: parser parse: 'abcde1' to: #($a $b $c $d $e) end: 5. |
|
294 |
|
295 self assert: parser fail: '12'. |
|
296 self assert: parser parse: 'a12' to: #($a $1) end: 2. |
|
297 self assert: parser parse: 'ab12' to: #($a $b $1) end: 3. |
|
298 self assert: parser parse: 'abc12' to: #($a $b $c $1) end: 4. |
|
299 self assert: parser parse: 'abcd12' to: #($a $b $c $d $1) end: 5. |
|
300 self assert: parser parse: 'abcde12' to: #($a $b $c $d $e $1) end: 6. |
|
301 |
|
302 self assert: parser parse: '123' to: #($1 $2) end: 2. |
|
303 self assert: parser parse: 'a123' to: #($a $1 $2) end: 3. |
|
304 self assert: parser parse: 'ab123' to: #($a $b $1 $2) end: 4. |
|
305 self assert: parser parse: 'abc123' to: #($a $b $c $1 $2) end: 5. |
|
306 self assert: parser parse: 'abcd123' to: #($a $b $c $d $1 $2) end: 6. |
|
307 self assert: parser parse: 'abcde123' to: #($a $b $c $d $e $1 $2) end: 7. |
|
308 |
|
309 self assert: parser parse: '1234' to: #($1 $2 $3) end: 3. |
|
310 self assert: parser parse: 'a1234' to: #($a $1 $2 $3) end: 4. |
|
311 self assert: parser parse: 'ab1234' to: #($a $b $1 $2 $3) end: 5. |
|
312 self assert: parser parse: 'abc1234' to: #($a $b $c $1 $2 $3) end: 6. |
|
313 self assert: parser parse: 'abcd1234' to: #($a $b $c $d $1 $2 $3) end: 7. |
|
314 self assert: parser parse: 'abcde1234' to: #($a $b $c $d $e $1 $2 $3) end: 8 |
|
315 ! |
|
316 |
|
317 testMinLazy |
|
318 | parser | |
|
319 parser := #word asParser min: 2 lazy: #digit asParser. |
|
320 |
|
321 self assert: parser fail: ''. |
|
322 self assert: parser fail: 'abcde'. |
|
323 |
|
324 self assert: parser fail: '1'. |
|
325 self assert: parser fail: 'a1'. |
|
326 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
|
327 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
|
328 self assert: parser parse: 'abcd1' to: #($a $b $c $d) end: 4. |
|
329 self assert: parser parse: 'abcde1' to: #($a $b $c $d $e) end: 5. |
|
330 |
|
331 self assert: parser fail: '12'. |
|
332 self assert: parser parse: 'a12' to: #($a $1) end: 2. |
|
333 self assert: parser parse: 'ab12' to: #($a $b) end: 2. |
|
334 self assert: parser parse: 'abc12' to: #($a $b $c) end: 3. |
|
335 self assert: parser parse: 'abcd12' to: #($a $b $c $d) end: 4. |
|
336 self assert: parser parse: 'abcde12' to: #($a $b $c $d $e) end: 5. |
|
337 |
|
338 self assert: parser parse: '123' to: #($1 $2) end: 2. |
|
339 self assert: parser parse: 'a123' to: #($a $1) end: 2. |
|
340 self assert: parser parse: 'ab123' to: #($a $b) end: 2. |
|
341 self assert: parser parse: 'abc123' to: #($a $b $c) end: 3. |
|
342 self assert: parser parse: 'abcd123' to: #($a $b $c $d) end: 4. |
|
343 self assert: parser parse: 'abcde123' to: #($a $b $c $d $e) end: 5. |
|
344 |
|
345 self assert: parser parse: '1234' to: #($1 $2) end: 2. |
|
346 self assert: parser parse: 'a1234' to: #($a $1) end: 2. |
|
347 self assert: parser parse: 'ab1234' to: #($a $b) end: 2. |
|
348 self assert: parser parse: 'abc1234' to: #($a $b $c) end: 3. |
|
349 self assert: parser parse: 'abcd1234' to: #($a $b $c $d) end: 4. |
|
350 self assert: parser parse: 'abcde1234' to: #($a $b $c $d $e) end: 5 |
|
351 ! |
|
352 |
|
353 testMinMax |
|
354 | parser | |
|
355 parser := $a asParser min: 2 max: 4. |
|
356 self assert: parser min = 2. |
|
357 self assert: parser max = 4. |
|
358 |
|
359 self assert: parser fail: ''. |
|
360 self assert: parser fail: 'a'. |
|
361 self assert: parser parse: 'aa' to: #($a $a). |
|
362 self assert: parser parse: 'aaa' to: #($a $a $a). |
|
363 self assert: parser parse: 'aaaa' to: #($a $a $a $a). |
|
364 self assert: parser parse: 'aaaaa' to: #($a $a $a $a) end: 4. |
|
365 self assert: parser parse: 'aaaaaa' to: #($a $a $a $a) end: 4. |
|
366 |
|
367 self assert: (parser printString endsWith: '[2, 4]') |
|
368 ! |
|
369 |
|
370 testMinMaxGreedy |
|
371 | parser | |
|
372 parser := #word asParser min: 2 max: 4 greedy: #digit asParser. |
|
373 |
|
374 self assert: parser fail: ''. |
|
375 self assert: parser fail: 'abcde'. |
|
376 |
|
377 self assert: parser fail: '1'. |
|
378 self assert: parser fail: 'a1'. |
|
379 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
|
380 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
|
381 self assert: parser parse: 'abcd1' to: #($a $b $c $d) end: 4. |
|
382 self assert: parser fail: 'abcde1'. |
|
383 |
|
384 self assert: parser fail: '12'. |
|
385 self assert: parser parse: 'a12' to: #($a $1) end: 2. |
|
386 self assert: parser parse: 'ab12' to: #($a $b $1) end: 3. |
|
387 self assert: parser parse: 'abc12' to: #($a $b $c $1) end: 4. |
|
388 self assert: parser parse: 'abcd12' to: #($a $b $c $d) end: 4. |
|
389 self assert: parser fail: 'abcde12'. |
|
390 |
|
391 self assert: parser parse: '123' to: #($1 $2) end: 2. |
|
392 self assert: parser parse: 'a123' to: #($a $1 $2) end: 3. |
|
393 self assert: parser parse: 'ab123' to: #($a $b $1 $2) end: 4. |
|
394 self assert: parser parse: 'abc123' to: #($a $b $c $1) end: 4. |
|
395 self assert: parser parse: 'abcd123' to: #($a $b $c $d) end: 4. |
|
396 self assert: parser fail: 'abcde123'. |
|
397 |
|
398 self assert: parser parse: '1234' to: #($1 $2 $3) end: 3. |
|
399 self assert: parser parse: 'a1234' to: #($a $1 $2 $3) end: 4. |
|
400 self assert: parser parse: 'ab1234' to: #($a $b $1 $2) end: 4. |
|
401 self assert: parser parse: 'abc1234' to: #($a $b $c $1) end: 4. |
|
402 self assert: parser parse: 'abcd1234' to: #($a $b $c $d) end: 4. |
|
403 self assert: parser fail: 'abcde1234' |
|
404 ! |
|
405 |
|
406 testMinMaxLazy |
|
407 | parser | |
|
408 parser := #word asParser min: 2 max: 4 lazy: #digit asParser. |
|
409 |
|
410 self assert: parser fail: ''. |
|
411 self assert: parser fail: 'abcde'. |
|
412 |
|
413 self assert: parser fail: '1'. |
|
414 self assert: parser fail: 'a1'. |
|
415 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
|
416 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
|
417 self assert: parser parse: 'abcd1' to: #($a $b $c $d) end: 4. |
|
418 self assert: parser fail: 'abcde1'. |
|
419 |
|
420 self assert: parser fail: '12'. |
|
421 self assert: parser parse: 'a12' to: #($a $1) end: 2. |
|
422 self assert: parser parse: 'ab12' to: #($a $b) end: 2. |
|
423 self assert: parser parse: 'abc12' to: #($a $b $c) end: 3. |
|
424 self assert: parser parse: 'abcd12' to: #($a $b $c $d) end: 4. |
|
425 self assert: parser fail: 'abcde12'. |
|
426 |
|
427 self assert: parser parse: '123' to: #($1 $2) end: 2. |
|
428 self assert: parser parse: 'a123' to: #($a $1) end: 2. |
|
429 self assert: parser parse: 'ab123' to: #($a $b) end: 2. |
|
430 self assert: parser parse: 'abc123' to: #($a $b $c) end: 3. |
|
431 self assert: parser parse: 'abcd123' to: #($a $b $c $d) end: 4. |
|
432 self assert: parser fail: 'abcde123'. |
|
433 |
|
434 self assert: parser parse: '1234' to: #($1 $2) end: 2. |
|
435 self assert: parser parse: 'a1234' to: #($a $1) end: 2. |
|
436 self assert: parser parse: 'ab1234' to: #($a $b) end: 2. |
|
437 self assert: parser parse: 'abc1234' to: #($a $b $c) end: 3. |
|
438 self assert: parser parse: 'abcd1234' to: #($a $b $c $d) end: 4. |
|
439 self assert: parser fail: 'abcde1234' |
|
440 ! |
|
441 |
|
442 testNegate |
|
443 | parser | |
|
444 parser := 'foo' asParser negate. |
|
445 |
|
446 self assert: parser parse: 'f' to: $f end: 1. |
|
447 self assert: parser parse: 'fo' to: $f end: 1. |
|
448 self assert: parser parse: 'fob' to: $f end: 1. |
|
449 self assert: parser parse: 'ffoo' to: $f end: 1. |
|
450 |
|
451 self assert: parser fail: ''. |
|
452 self assert: parser fail: 'foo' |
|
453 ! |
|
454 |
|
455 testNot |
|
456 | parser | |
|
457 parser := 'foo' asParser flatten , 'bar' asParser flatten not. |
|
458 |
|
459 self assert: parser parse: 'foobaz' to: #('foo' nil) end: 3. |
|
460 self assert: parser fail: 'foobar' |
|
461 ! |
|
462 |
|
463 testOptional |
|
464 | parser | |
|
465 parser := $a asParser optional. |
|
466 |
|
467 self assert: parser parse: '' to: nil. |
|
468 self assert: parser parse: 'a' to: $a. |
|
469 |
|
470 self assert: parser parse: 'aa' to: $a end: 1. |
|
471 self assert: parser parse: 'ab' to: $a end: 1. |
|
472 self assert: parser parse: 'b' to: nil end: 0. |
|
473 self assert: parser parse: 'bb' to: nil end: 0. |
|
474 self assert: parser parse: 'ba' to: nil end: 0 |
|
475 ! |
|
476 |
|
477 testPluggable |
|
478 | block parser | |
|
479 block := [ :stream | stream position ]. |
|
480 parser := block asParser. |
|
481 self assert: parser block = block |
|
482 ! |
|
483 |
|
484 testPlus |
|
485 | parser | |
|
486 parser := $a asParser plus. |
|
487 |
|
488 self assert: parser min = 1. |
|
489 self assert: parser max > parser min. |
|
490 |
|
491 self assert: parser parse: 'a' to: #($a). |
|
492 self assert: parser parse: 'aa' to: #($a $a). |
|
493 self assert: parser parse: 'aaa' to: #($a $a $a). |
|
494 |
|
495 self assert: parser parse: 'ab' to: #($a) end: 1. |
|
496 self assert: parser parse: 'aab' to: #($a $a) end: 2. |
|
497 self assert: parser parse: 'aaab' to: #($a $a $a) end: 3. |
|
498 |
|
499 self assert: parser fail: ''. |
|
500 self assert: parser fail: 'b'. |
|
501 self assert: parser fail: 'ba' |
|
502 ! |
|
503 |
|
504 testPlusGreedy |
|
505 | limit parser | |
|
506 limit := #digit asParser. |
|
507 parser := #word asParser plusGreedy: limit. |
|
508 |
|
509 self assert: parser min = 1. |
|
510 self assert: parser max > parser min. |
|
511 self assert: parser limit = limit. |
|
512 self assert: parser children size = 2. |
|
513 self assert: parser children last = limit. |
|
514 |
|
515 self assert: parser fail: ''. |
|
516 self assert: parser fail: '1'. |
|
517 self assert: parser fail: 'a'. |
|
518 self assert: parser fail: 'ab'. |
|
519 |
|
520 self assert: parser parse: 'a1' to: #($a) end: 1. |
|
521 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
|
522 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
|
523 self assert: parser parse: 'a12' to: #($a $1) end: 2. |
|
524 self assert: parser parse: 'ab12' to: #($a $b $1) end: 3. |
|
525 self assert: parser parse: 'abc12' to: #($a $b $c $1) end: 4. |
|
526 self assert: parser parse: 'a123' to: #($a $1 $2) end: 3. |
|
527 self assert: parser parse: 'ab123' to: #($a $b $1 $2) end: 4. |
|
528 self assert: parser parse: 'abc123' to: #($a $b $c $1 $2) end: 5. |
|
529 ! |
|
530 |
|
531 testPlusLazy |
|
532 | limit parser | |
|
533 limit := #digit asParser. |
|
534 parser := #word asParser plusLazy: limit. |
|
535 |
|
536 self assert: parser min = 1. |
|
537 self assert: parser max > parser min. |
|
538 self assert: parser limit = limit. |
|
539 self assert: parser children size = 2. |
|
540 self assert: parser children last = limit. |
|
541 |
|
542 self assert: parser fail: ''. |
|
543 self assert: parser fail: '1'. |
|
544 self assert: parser fail: 'a'. |
|
545 self assert: parser fail: 'ab'. |
|
546 |
|
547 self assert: parser parse: 'a1' to: #($a) end: 1. |
|
548 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
|
549 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
|
550 self assert: parser parse: 'a12' to: #($a) end: 1. |
|
551 self assert: parser parse: 'ab12' to: #($a $b) end: 2. |
|
552 self assert: parser parse: 'abc12' to: #($a $b $c) end: 3. |
|
553 self assert: parser parse: 'a123' to: #($a) end: 1. |
|
554 self assert: parser parse: 'ab123' to: #($a $b) end: 2. |
|
555 self assert: parser parse: 'abc123' to: #($a $b $c) end: 3 |
|
556 ! |
|
557 |
|
558 testSeparatedBy |
|
559 | parser | |
|
560 parser := $a asParser separatedBy: $b asParser. |
|
561 |
|
562 self assert: parser parse: 'a' to: #($a). |
|
563 self assert: parser parse: 'aba' to: #($a $b $a). |
|
564 self assert: parser parse: 'ababa' to: #($a $b $a $b $a). |
|
565 |
|
566 self assert: parser parse: 'ab' to: #($a) end: 1. |
|
567 self assert: parser parse: 'abab' to: #($a $b $a) end: 3. |
|
568 self assert: parser parse: 'ac' to: #($a) end: 1. |
|
569 self assert: parser parse: 'abac' to: #($a $b $a) end: 3. |
|
570 |
|
571 self assert: parser fail: ''. |
|
572 self assert: parser fail: 'c' |
|
573 ! |
|
574 |
|
575 testSeparatedByWithoutSeparators |
|
576 | parser | |
|
577 parser := ($a asParser separatedBy: $b asParser) |
|
578 withoutSeparators. |
|
579 |
|
580 self assert: parser parse: 'a' to: #($a). |
|
581 self assert: parser parse: 'aba' to: #($a $a). |
|
582 self assert: parser parse: 'ababa' to: #($a $a $a). |
|
583 |
|
584 self assert: parser parse: 'ab' to: #($a) end: 1. |
|
585 self assert: parser parse: 'abab' to: #($a $a) end: 3. |
|
586 self assert: parser parse: 'ac' to: #($a) end: 1. |
|
587 self assert: parser parse: 'abac' to: #($a $a) end: 3. |
|
588 |
|
589 self assert: parser fail: ''. |
|
590 self assert: parser fail: 'c' |
|
591 ! |
|
592 |
|
593 testSequence |
|
594 | parser | |
|
595 parser := $a asParser , $b asParser. |
|
596 |
|
597 self assert: parser parse: 'ab' to: #($a $b). |
|
598 |
|
599 self assert: parser parse: 'aba' to: #($a $b) end: 2. |
|
600 self assert: parser parse: 'abb' to: #($a $b) end: 2. |
|
601 |
|
602 self assert: parser fail: ''. |
|
603 self assert: parser fail: 'a'. |
|
604 self assert: parser fail: 'aa'. |
|
605 self assert: parser fail: 'ba'. |
|
606 self assert: parser fail: 'bab' |
|
607 ! |
|
608 |
|
609 testStar |
|
610 | parser | |
|
611 parser := $a asParser star. |
|
612 |
|
613 self assert: parser min = 0. |
|
614 self assert: parser max > parser min. |
|
615 |
|
616 self assert: parser parse: '' to: #(). |
|
617 self assert: parser parse: 'a' to: #($a). |
|
618 self assert: parser parse: 'aa' to: #($a $a). |
|
619 self assert: parser parse: 'aaa' to: #($a $a $a). |
|
620 |
|
621 self assert: parser parse: 'b' to: #() end: 0. |
|
622 self assert: parser parse: 'ab' to: #($a) end: 1. |
|
623 self assert: parser parse: 'aab' to: #($a $a) end: 2. |
|
624 self assert: parser parse: 'aaab' to: #($a $a $a) end: 3 |
|
625 ! |
|
626 |
|
627 testStarGreedy |
|
628 | limit parser | |
|
629 limit := #digit asParser. |
|
630 parser := #word asParser starGreedy: limit. |
|
631 |
|
632 self assert: parser min = 0. |
|
633 self assert: parser max > parser min. |
|
634 self assert: parser limit = limit. |
|
635 self assert: parser children size = 2. |
|
636 self assert: parser children last = limit. |
|
637 |
|
638 self assert: parser fail: ''. |
|
639 self assert: parser fail: 'a'. |
|
640 self assert: parser fail: 'ab'. |
|
641 |
|
642 self assert: parser parse: '1' to: #() end: 0. |
|
643 self assert: parser parse: 'a1' to: #($a) end: 1. |
|
644 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
|
645 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
|
646 self assert: parser parse: '12' to: #($1) end: 1. |
|
647 self assert: parser parse: 'a12' to: #($a $1) end: 2. |
|
648 self assert: parser parse: 'ab12' to: #($a $b $1) end: 3. |
|
649 self assert: parser parse: 'abc12' to: #($a $b $c $1) end: 4. |
|
650 self assert: parser parse: '123' to: #($1 $2) end: 2. |
|
651 self assert: parser parse: 'a123' to: #($a $1 $2) end: 3. |
|
652 self assert: parser parse: 'ab123' to: #($a $b $1 $2) end: 4. |
|
653 self assert: parser parse: 'abc123' to: #($a $b $c $1 $2) end: 5 |
|
654 ! |
|
655 |
|
656 testStarLazy |
|
657 | limit parser | |
|
658 limit := #digit asParser. |
|
659 parser := #word asParser starLazy: limit. |
|
660 |
|
661 self assert: parser min = 0. |
|
662 self assert: parser max > parser min. |
|
663 self assert: parser limit = limit. |
|
664 self assert: parser children size = 2. |
|
665 self assert: parser children last = limit. |
|
666 |
|
667 self assert: parser fail: ''. |
|
668 self assert: parser fail: 'a'. |
|
669 self assert: parser fail: 'ab'. |
|
670 |
|
671 self assert: parser parse: '1' to: #() end: 0. |
|
672 self assert: parser parse: 'a1' to: #($a) end: 1. |
|
673 self assert: parser parse: 'ab1' to: #($a $b) end: 2. |
|
674 self assert: parser parse: 'abc1' to: #($a $b $c) end: 3. |
|
675 self assert: parser parse: '12' to: #() end: 0. |
|
676 self assert: parser parse: 'a12' to: #($a) end: 1. |
|
677 self assert: parser parse: 'ab12' to: #($a $b) end: 2. |
|
678 self assert: parser parse: 'abc12' to: #($a $b $c) end: 3. |
|
679 self assert: parser parse: '123' to: #() end: 0. |
|
680 self assert: parser parse: 'a123' to: #($a) end: 1. |
|
681 self assert: parser parse: 'ab123' to: #($a $b) end: 2. |
|
682 self assert: parser parse: 'abc123' to: #($a $b $c) end: 3 |
|
683 ! |
|
684 |
|
685 testTimes |
|
686 | parser | |
|
687 parser := $a asParser times: 2. |
|
688 |
|
689 self assert: parser fail: ''. |
|
690 self assert: parser fail: 'a'. |
|
691 self assert: parser parse: 'aa' to: #($a $a). |
|
692 self assert: parser parse: 'aaa' to: #($a $a) end: 2 |
|
693 ! |
|
694 |
|
695 testUnresolved |
|
696 | parser | |
|
697 parser := PPUnresolvedParser new. |
|
698 |
|
699 self assert: parser isUnresolved. |
|
700 self should: [ parser parse: '' ] raise: Error. |
|
701 self should: [ parser parse: 'a' ] raise: Error. |
|
702 self should: [ parser parse: 'ab' ] raise: Error. |
|
703 |
|
704 parser := nil asParser. |
|
705 self deny: parser isUnresolved |
|
706 ! |
|
707 |
|
708 testWrapped |
|
709 | parser | |
|
710 parser := $a asParser wrapped. |
|
711 |
|
712 self assert: parser parse: 'a' to: $a. |
|
713 self assert: parser fail: 'b'. |
|
714 |
|
715 parser := (($a asParser , $b asParser ) wrapped , $c asParser). |
|
716 self assert: parser parse: 'abc' to: #(#($a $b) $c) |
|
717 ! |
|
718 |
|
719 testXor |
|
720 | parser | |
|
721 parser := ($a asParser / $b asParser) |
|
722 | ($b asParser / $c asParser). |
|
723 |
|
724 self assert: parser parse: 'a' to: $a. |
|
725 self assert: parser parse: 'c' to: $c. |
|
726 |
|
727 self assert: parser fail: ''. |
|
728 self assert: parser fail: 'b'. |
|
729 self assert: parser fail: 'd'. |
|
730 |
|
731 " truly symmetric " |
|
732 parser := ($b asParser / $c asParser) |
|
733 | ($a asParser / $b asParser). |
|
734 |
|
735 self assert: parser parse: 'a' to: $a. |
|
736 self assert: parser parse: 'c' to: $c. |
|
737 |
|
738 self assert: parser fail: ''. |
|
739 self assert: parser fail: 'b'. |
|
740 self assert: parser fail: 'd' |
|
741 ! ! |
|
742 |
|
743 !PPParserTest methodsFor:'testing-accessing'! |
|
744 |
|
745 testNamed |
|
746 | parser | |
|
747 parser := PPSequenceParser new. |
|
748 self assert: parser name isNil. |
|
749 |
|
750 parser := PPChoiceParser named: 'choice'. |
|
751 self assert: parser name = 'choice'. |
|
752 |
|
753 parser := $* asParser name: 'star'. |
|
754 self assert: parser name = 'star' |
|
755 ! |
|
756 |
|
757 testPrint |
|
758 | parser | |
|
759 parser := PPParser new. |
|
760 self assert: (parser printString findString: 'PPParser') > 0. |
|
761 |
|
762 parser := PPParser named: 'choice'. |
|
763 self assert: (parser printString findString: 'PPParser(choice') > 0. |
|
764 |
|
765 parser := PPLiteralObjectParser on: $a. |
|
766 self assert: (parser printString findString: '$a') > 0. |
|
767 |
|
768 parser := PPFailingParser message: 'error'. |
|
769 self assert: (parser printString findString: 'error') > 0. |
|
770 |
|
771 parser := PPPredicateObjectParser on: [ :c | true ] message: 'error'. |
|
772 self assert: (parser printString findString: 'error') > 0 |
|
773 ! ! |
|
774 |
|
775 !PPParserTest methodsFor:'testing-fixtures'! |
|
776 |
|
777 testSideEffectChoice |
|
778 "Adding another element to a choice should create a copy, otherwise we get unwanted side-effects." |
|
779 |
|
780 | p1 p2 p3 | |
|
781 p1 := $a asParser. |
|
782 p2 := p1 / $b asParser. |
|
783 p3 := p1 / $c asParser. |
|
784 |
|
785 self assert: p1 parse: 'a'. |
|
786 self assert: p1 fail: 'b'. |
|
787 self assert: p1 fail: 'c'. |
|
788 |
|
789 self assert: p2 parse: 'a'. |
|
790 self assert: p2 parse: 'b'. |
|
791 self assert: p2 fail: 'c'. |
|
792 |
|
793 self assert: p3 parse: 'a'. |
|
794 self assert: p3 fail: 'b'. |
|
795 self assert: p3 parse: 'c' |
|
796 ! |
|
797 |
|
798 testSideEffectListCopy |
|
799 | old new | |
|
800 old := $a asParser , $b asParser. |
|
801 new := old copy. |
|
802 |
|
803 self deny: old == new. |
|
804 self deny: old children == new children. |
|
805 self assert: old children first == new children first. |
|
806 self assert: old children last == new children last |
|
807 ! |
|
808 |
|
809 testSideEffectSequence |
|
810 "Adding another element to a sequence should create a copy, otherwise we get unwanted side-effects." |
|
811 |
|
812 | p1 p2 p3 | |
|
813 p1 := $a asParser. |
|
814 p2 := p1 , $b asParser. |
|
815 p3 := p1 , $c asParser. |
|
816 |
|
817 self assert: p1 parse: 'a'. |
|
818 self assert: p1 parse: 'ab' end: 1. |
|
819 self assert: p1 parse: 'ac' end: 1. |
|
820 |
|
821 self assert: p2 fail: 'a'. |
|
822 self assert: p2 parse: 'ab'. |
|
823 self assert: p2 fail: 'ac'. |
|
824 |
|
825 self assert: p3 fail: 'a'. |
|
826 self assert: p3 fail: 'ab'. |
|
827 self assert: p3 parse: 'ac' |
|
828 ! ! |
|
829 |
|
830 !PPParserTest methodsFor:'testing-mapping'! |
|
831 |
|
832 testAction |
|
833 | block parser | |
|
834 block := [ :char | char asUppercase ]. |
|
835 parser := #any asParser ==> block. |
|
836 self assert: parser block = block. |
|
837 |
|
838 self assert: parser parse: 'a' to: $A. |
|
839 self assert: parser parse: 'b' to: $B |
|
840 ! |
|
841 |
|
842 testAnswer |
|
843 | parser | |
|
844 parser := $a asParser answer: $b. |
|
845 |
|
846 self assert: parser parse: 'a' to: $b. |
|
847 |
|
848 self assert: parser fail: ''. |
|
849 self assert: parser fail: 'b' |
|
850 ! |
|
851 |
|
852 testFlatten |
|
853 | parser | |
|
854 parser := $a asParser flatten. |
|
855 |
|
856 self assert: parser parse: 'a' to: 'a'. |
|
857 self assert: parser parse: #($a) to: #($a). |
|
858 |
|
859 self assert: parser fail: ''. |
|
860 self assert: parser fail: 'b' |
|
861 ! |
|
862 |
|
863 testFoldLeft2 |
|
864 | parser | |
|
865 parser := #any asParser star |
|
866 foldLeft: [ :a :b | Array with: a with: b ]. |
|
867 |
|
868 self assert: parser parse: #(a) to: #a. |
|
869 self assert: parser parse: #(a b) to: #(a b). |
|
870 self assert: parser parse: #(a b c) to: #((a b) c). |
|
871 self assert: parser parse: #(a b c d) to: #(((a b) c) d). |
|
872 self assert: parser parse: #(a b c d e) to: #((((a b) c) d) e) |
|
873 ! |
|
874 |
|
875 testFoldLeft3 |
|
876 | parser | |
|
877 parser := #any asParser star |
|
878 foldLeft: [ :a :b :c | Array with: a with: b with: c ]. |
|
879 |
|
880 self assert: parser parse: #(a) to: #a. |
|
881 self assert: parser parse: #(a b c) to: #(a b c). |
|
882 self assert: parser parse: #(a b c d e) to: #((a b c) d e) |
|
883 ! |
|
884 |
|
885 testFoldRight2 |
|
886 | parser | |
|
887 parser := #any asParser star |
|
888 foldRight: [ :a :b | Array with: a with: b ]. |
|
889 |
|
890 self assert: parser parse: #(a) to: #a. |
|
891 self assert: parser parse: #(a b) to: #(a b). |
|
892 self assert: parser parse: #(a b c) to: #(a (b c)). |
|
893 self assert: parser parse: #(a b c d) to: #(a (b (c d))). |
|
894 self assert: parser parse: #(a b c d e) to: #(a (b (c (d e)))) |
|
895 ! |
|
896 |
|
897 testFoldRight3 |
|
898 | parser | |
|
899 parser := #any asParser star |
|
900 foldRight: [ :a :b :c | Array with: a with: b with: c ]. |
|
901 |
|
902 self assert: parser parse: #(a) to: #a. |
|
903 self assert: parser parse: #(a b c) to: #(a b c). |
|
904 self assert: parser parse: #(a b c d e) to: #(a b (c d e)) |
|
905 ! |
|
906 |
|
907 testMap1 |
|
908 | parser | |
|
909 parser := #any asParser |
|
910 map: [ :a | Array with: a ]. |
|
911 |
|
912 self assert: parser parse: #(a) to: #(a) |
|
913 ! |
|
914 |
|
915 testMap2 |
|
916 | parser | |
|
917 parser := (#any asParser , #any asParser) |
|
918 map: [ :a :b | Array with: b with: a ]. |
|
919 |
|
920 self assert: parser parse: #(a b) to: #(b a) |
|
921 ! |
|
922 |
|
923 testMap3 |
|
924 | parser | |
|
925 parser := (#any asParser , #any asParser , #any asParser) |
|
926 map: [ :a :b :c | Array with: c with: b with: a ]. |
|
927 |
|
928 self assert: parser parse: #(a b c) to: #(c b a) |
|
929 ! |
|
930 |
|
931 testMapFail1 |
|
932 self |
|
933 should: [ #any asParser map: [ ] ] |
|
934 raise: Error. |
|
935 self |
|
936 should: [ #any asParser map: [ :a :b | ] ] |
|
937 raise: Error |
|
938 ! |
|
939 |
|
940 testMapFail2 |
|
941 self |
|
942 should: [ (#any asParser , #any asParser) map: [ :a | ] ] |
|
943 raise: Error. |
|
944 self |
|
945 should: [ (#any asParser , #any asParser) map: [ :a :b :c | ] ] |
|
946 raise: Error |
|
947 ! |
|
948 |
|
949 testPermutation |
|
950 | parser | |
|
951 parser := #any asParser , #any asParser , #any asParser. |
|
952 |
|
953 self assert: (parser permutation: #()) parse: '123' to: #(). |
|
954 self assert: (parser permutation: #(1)) parse: '123' to: #($1). |
|
955 self assert: (parser permutation: #(1 3)) parse: '123' to: #($1 $3). |
|
956 self assert: (parser permutation: #(3 1)) parse: '123' to: #($3 $1). |
|
957 self assert: (parser permutation: #(2 2)) parse: '123' to: #($2 $2). |
|
958 self assert: (parser permutation: #(3 2 1)) parse: '123' to: #($3 $2 $1). |
|
959 |
|
960 self should: [ parser permutation: #(0) ] raise: Error. |
|
961 self should: [ parser permutation: #(4) ] raise: Error. |
|
962 self should: [ parser permutation: #($2) ] raise: Error |
|
963 ! |
|
964 |
|
965 testToken |
|
966 | parser | |
|
967 parser := $a asParser token. |
|
968 self assert: parser tokenClass = PPToken. |
|
969 self assert: parser parse: 'a' toToken: 1 stop: 1. |
|
970 self assert: parser fail: 'b'. |
|
971 self assert: parser fail: ''. |
|
972 |
|
973 parser := $a asParser token: PPToken. |
|
974 self assert: parser tokenClass = PPToken. |
|
975 self assert: parser parse: 'a' toToken: 1 stop: 1. |
|
976 self assert: parser fail: ''. |
|
977 self assert: parser fail: 'b' |
|
978 ! |
|
979 |
|
980 testTrim |
|
981 | parser | |
|
982 parser := $a asParser token trim. |
|
983 |
|
984 self assert: parser parse: 'a' toToken: 1 stop: 1. |
|
985 self assert: parser parse: 'a ' toToken: 1 stop: 1. |
|
986 self assert: parser parse: 'a ' toToken: 1 stop: 1. |
|
987 self assert: parser parse: 'a ' toToken: 1 stop: 1. |
|
988 self assert: parser parse: 'a |
|
989 ' toToken: 1 stop: 1. |
|
990 |
|
991 self assert: parser parse: 'a' toToken: 1 stop: 1. |
|
992 self assert: parser parse: ' a' toToken: 2 stop: 2. |
|
993 self assert: parser parse: ' a' toToken: 2 stop: 2. |
|
994 self assert: parser parse: ' a' toToken: 5 stop: 5. |
|
995 self assert: parser parse: ' |
|
996 a' toToken: 5 stop: 5. |
|
997 |
|
998 self assert: parser parse: 'aa' toToken: 1 stop: 1 end: 1. |
|
999 self assert: parser parse: 'a a' toToken: 1 stop: 1 end: 2. |
|
1000 self assert: parser parse: 'a a' toToken: 1 stop: 1 end: 3. |
|
1001 |
|
1002 self assert: parser fail: ''. |
|
1003 self assert: parser fail: 'b' |
|
1004 ! |
|
1005 |
|
1006 testTrimBlanks |
|
1007 | parser | |
|
1008 parser := $a asParser token trimBlanks. |
|
1009 |
|
1010 self assert: parser parse: 'a' toToken: 1 stop: 1. |
|
1011 self assert: parser parse: 'a ' toToken: 1 stop: 1. |
|
1012 self assert: parser parse: 'a ' toToken: 1 stop: 1. |
|
1013 self assert: parser parse: 'a ' toToken: 1 stop: 1. |
|
1014 |
|
1015 self assert: parser parse: 'a' toToken: 1 stop: 1. |
|
1016 self assert: parser parse: ' a' toToken: 2 stop: 2. |
|
1017 self assert: parser parse: ' a' toToken: 2 stop: 2. |
|
1018 self assert: parser parse: ' a' toToken: 5 stop: 5. |
|
1019 |
|
1020 self assert: parser parse: 'aa' toToken: 1 stop: 1 end: 1. |
|
1021 self assert: parser parse: 'a a' toToken: 1 stop: 1 end: 2. |
|
1022 self assert: parser parse: 'a a' toToken: 1 stop: 1 end: 3. |
|
1023 |
|
1024 self assert: parser fail: ''. |
|
1025 self assert: parser fail: ' |
|
1026 '. |
|
1027 self assert: parser fail: ' |
|
1028 a'. |
|
1029 self assert: parser fail: 'b'. |
|
1030 ! |
|
1031 |
|
1032 testTrimCustom |
|
1033 | parser | |
|
1034 parser := $a asParser token trim: $b asParser. |
|
1035 |
|
1036 self assert: parser parse: 'a' toToken: 1 stop: 1. |
|
1037 self assert: parser parse: 'ab' toToken: 1 stop: 1. |
|
1038 self assert: parser parse: 'abb' toToken: 1 stop: 1. |
|
1039 |
|
1040 self assert: parser parse: 'a' toToken: 1 stop: 1. |
|
1041 self assert: parser parse: 'ba' toToken: 2 stop: 2. |
|
1042 self assert: parser parse: 'bba' toToken: 3 stop: 3. |
|
1043 |
|
1044 self assert: parser parse: 'aa' toToken: 1 stop: 1 end: 1. |
|
1045 self assert: parser parse: 'ab' toToken: 1 stop: 1 end: 2. |
|
1046 self assert: parser parse: 'abba' toToken: 1 stop: 1 end: 3. |
|
1047 |
|
1048 self assert: parser fail: ''. |
|
1049 self assert: parser fail: 'b' |
|
1050 ! |
|
1051 |
|
1052 testTrimSpaces |
|
1053 | parser | |
|
1054 parser := $a asParser token trimSpaces. |
|
1055 |
|
1056 self assert: parser parse: 'a' toToken: 1 stop: 1. |
|
1057 self assert: parser parse: 'a ' toToken: 1 stop: 1. |
|
1058 self assert: parser parse: 'a ' toToken: 1 stop: 1. |
|
1059 self assert: parser parse: 'a ' toToken: 1 stop: 1. |
|
1060 self assert: parser parse: 'a |
|
1061 ' toToken: 1 stop: 1. |
|
1062 |
|
1063 self assert: parser parse: 'a' toToken: 1 stop: 1. |
|
1064 self assert: parser parse: ' a' toToken: 2 stop: 2. |
|
1065 self assert: parser parse: ' a' toToken: 2 stop: 2. |
|
1066 self assert: parser parse: ' a' toToken: 5 stop: 5. |
|
1067 self assert: parser parse: ' |
|
1068 a' toToken: 5 stop: 5. |
|
1069 |
|
1070 self assert: parser parse: 'aa' toToken: 1 stop: 1 end: 1. |
|
1071 self assert: parser parse: 'a a' toToken: 1 stop: 1 end: 2. |
|
1072 self assert: parser parse: 'a a' toToken: 1 stop: 1 end: 3. |
|
1073 |
|
1074 self assert: parser fail: ''. |
|
1075 self assert: parser fail: 'b' |
|
1076 ! |
|
1077 |
|
1078 testWrapping |
|
1079 | parser result | |
|
1080 parser := #digit asParser plus >=> [ :stream :cc | |
|
1081 Array |
|
1082 with: stream position |
|
1083 with: cc value |
|
1084 with: stream position ]. |
|
1085 |
|
1086 self assert: parser parse: '1' to: #(0 ($1) 1). |
|
1087 self assert: parser parse: '12' to: #(0 ($1 $2) 2). |
|
1088 self assert: parser parse: '123' to: #(0 ($1 $2 $3) 3). |
|
1089 |
|
1090 result := parser parse: 'a'. |
|
1091 self assert: result first = 0. |
|
1092 self assert: result second isPetitFailure. |
|
1093 self assert: result last = 0 |
|
1094 ! ! |
|
1095 |
|
1096 !PPParserTest methodsFor:'testing-properties'! |
|
1097 |
|
1098 testHasProperty |
|
1099 | parser | |
|
1100 parser := PPParser new. |
|
1101 self deny: (parser hasProperty: #foo). |
|
1102 parser propertyAt: #foo put: 123. |
|
1103 self assert: (parser hasProperty: #foo) |
|
1104 ! |
|
1105 |
|
1106 testPostCopy |
|
1107 | parser copy | |
|
1108 parser := PPParser new. |
|
1109 parser propertyAt: #foo put: true. |
|
1110 copy := parser copy. |
|
1111 copy propertyAt: #foo put: false. |
|
1112 self assert: (parser propertyAt: #foo). |
|
1113 self deny: (copy propertyAt: #foo) |
|
1114 ! |
|
1115 |
|
1116 testPropertyAt |
|
1117 | parser | |
|
1118 parser := PPParser new. |
|
1119 self should: [ parser propertyAt: #foo ] raise: Error. |
|
1120 parser propertyAt: #foo put: true. |
|
1121 self assert: (parser propertyAt: #foo) |
|
1122 ! |
|
1123 |
|
1124 testPropertyAtIfAbsent |
|
1125 | parser | |
|
1126 parser := PPParser new. |
|
1127 self assert: (parser propertyAt: #foo ifAbsent: [ true ]). |
|
1128 parser propertyAt: #foo put: true. |
|
1129 self assert: (parser propertyAt: #foo ifAbsent: [ false ]) |
|
1130 ! |
|
1131 |
|
1132 testPropertyAtIfAbsentPut |
|
1133 | parser | |
|
1134 parser := PPParser new. |
|
1135 self assert: (parser propertyAt: #foo ifAbsentPut: [ true ]). |
|
1136 self assert: (parser propertyAt: #foo ifAbsentPut: [ false ]) |
|
1137 ! |
|
1138 |
|
1139 testRemoveProperty |
|
1140 | parser | |
|
1141 parser := PPParser new. |
|
1142 self should: [ parser removeProperty: #foo ] raise: Error. |
|
1143 parser propertyAt: #foo put: true. |
|
1144 self assert: (parser removeProperty: #foo) |
|
1145 ! |
|
1146 |
|
1147 testRemovePropertyIfAbsent |
|
1148 | parser | |
|
1149 parser := PPParser new. |
|
1150 self assert: (parser removeProperty: #foo ifAbsent: [ true ]). |
|
1151 parser propertyAt: #foo put: true. |
|
1152 self assert: (parser removeProperty: #foo ifAbsent: [ false ]) |
|
1153 ! ! |
|
1154 |
|
1155 !PPParserTest methodsFor:'testing-utilities'! |
|
1156 |
|
1157 testChildren |
|
1158 | p1 p2 p3 | |
|
1159 p1 := #lowercase asParser. |
|
1160 p2 := p1 ==> #asUppercase. |
|
1161 p3 := PPUnresolvedParser new. |
|
1162 p3 def: p2 / p3. |
|
1163 self assert: p1 children isEmpty. |
|
1164 self assert: p2 children size = 1. |
|
1165 self assert: p3 children size = 2 |
|
1166 ! |
|
1167 |
|
1168 testFailure |
|
1169 | failure | |
|
1170 failure := PPFailure message: 'Error' at: 3. |
|
1171 |
|
1172 self assert: failure message = 'Error'. |
|
1173 self assert: failure position = 3. |
|
1174 self assert: failure isPetitFailure. |
|
1175 |
|
1176 self deny: 4 isPetitFailure. |
|
1177 self deny: 'foo' isPetitFailure |
|
1178 ! |
|
1179 |
|
1180 testListConstructor |
|
1181 | p1 p2 p3 | |
|
1182 p1 := PPChoiceParser with: $a asParser. |
|
1183 p2 := PPChoiceParser with: $a asParser with: $b asParser. |
|
1184 p3 := PPChoiceParser withAll: (Array with: $a asParser with: $b asParser with: $c asParser). |
|
1185 |
|
1186 self assert: p1 children size = 1. |
|
1187 self assert: p2 children size = 2. |
|
1188 self assert: p3 children size = 3 |
|
1189 ! |
|
1190 |
|
1191 testMatches |
|
1192 | parser | |
|
1193 parser := $a asParser. |
|
1194 |
|
1195 self assert: (parser matches: 'a'). |
|
1196 self deny: (parser matches: 'b'). |
|
1197 |
|
1198 self assert: (parser matches: 'a' readStream). |
|
1199 self deny: (parser matches: 'b' readStream) |
|
1200 ! |
|
1201 |
|
1202 testMatchesIn |
|
1203 | parser result | |
|
1204 parser := $a asParser. |
|
1205 |
|
1206 result := parser matchesIn: 'abba'. |
|
1207 self assert: result size = 2. |
|
1208 self assert: result first = $a. |
|
1209 self assert: result last = $a. |
|
1210 |
|
1211 result := parser matchesIn: 'baaah'. |
|
1212 self assert: result size = 3. |
|
1213 self assert: result first = $a. |
|
1214 self assert: result last = $a |
|
1215 ! |
|
1216 |
|
1217 testMatchesInEmpty |
|
1218 "Empty matches should properly advance and match at each position and at the end." |
|
1219 |
|
1220 | parser result | |
|
1221 parser := [ :stream | stream position ] asParser. |
|
1222 |
|
1223 result := parser matchesIn: '123'. |
|
1224 self assert: result asArray = #(0 1 2 3) |
|
1225 ! |
|
1226 |
|
1227 testMatchesInOverlapping |
|
1228 "Matches that overlap should be properly reported." |
|
1229 |
|
1230 | parser result | |
|
1231 parser := #digit asParser , #digit asParser. |
|
1232 |
|
1233 result := parser matchesIn: 'a123b'. |
|
1234 self assert: result size = 2. |
|
1235 self assert: result first = #($1 $2). |
|
1236 self assert: result last = #($2 $3) |
|
1237 ! |
|
1238 |
|
1239 testMatchesSkipIn |
|
1240 | parser result | |
|
1241 parser := $a asParser. |
|
1242 |
|
1243 result := parser matchesSkipIn: 'abba'. |
|
1244 self assert: result size = 2. |
|
1245 self assert: result first = $a. |
|
1246 self assert: result last = $a. |
|
1247 |
|
1248 result := parser matchesSkipIn: 'baaah'. |
|
1249 self assert: result size = 3. |
|
1250 self assert: result first = $a. |
|
1251 self assert: result last = $a |
|
1252 ! |
|
1253 |
|
1254 testMatchesSkipInOverlapping |
|
1255 "Matches that overlap should be properly reported." |
|
1256 |
|
1257 | parser result | |
|
1258 parser := #digit asParser , #digit asParser. |
|
1259 |
|
1260 result := parser matchesSkipIn: 'a123b'. |
|
1261 self assert: result size = 1. |
|
1262 self assert: result first = #($1 $2) |
|
1263 ! |
|
1264 |
|
1265 testMatchingRangesIn |
|
1266 | input parser result | |
|
1267 input := 'a12b3'. |
|
1268 parser := #digit asParser plus. |
|
1269 result := parser matchingRangesIn: input. |
|
1270 result := result collect: [ :each | input copyFrom: each first to: each last ]. |
|
1271 self assert: result size = 3. |
|
1272 self assert: result first = '12'. |
|
1273 self assert: result second = '2'. |
|
1274 self assert: result last = '3' |
|
1275 ! |
|
1276 |
|
1277 testMatchingSkipRangesIn |
|
1278 | input parser result | |
|
1279 input := 'a12b3'. |
|
1280 parser := #digit asParser plus. |
|
1281 result := parser matchingSkipRangesIn: input. |
|
1282 result := result collect: [ :each | input copyFrom: each first to: each last ]. |
|
1283 self assert: result size = 2. |
|
1284 self assert: result first = '12'. |
|
1285 self assert: result last = '3' |
|
1286 ! |
|
1287 |
|
1288 testParse |
|
1289 | parser result | |
|
1290 parser := $a asParser. |
|
1291 |
|
1292 self assert: (parser parse: 'a') = $a. |
|
1293 self assert: (result := parser parse: 'b') isPetitFailure. |
|
1294 self assert: (result message findString: '$a') > 0. |
|
1295 self assert: (result message findString: 'expected') > 0. |
|
1296 self assert: (result position = 0). |
|
1297 |
|
1298 self assert: (parser parse: 'a' readStream) = $a. |
|
1299 self assert: (result := parser parse: 'b' readStream) isPetitFailure. |
|
1300 self assert: (result message findString: '$a') > 0. |
|
1301 self assert: (result message findString: 'expected') > 0. |
|
1302 self assert: (result position = 0) |
|
1303 ! |
|
1304 |
|
1305 testParseOnError0 |
|
1306 | parser result seen | |
|
1307 parser := $a asParser. |
|
1308 |
|
1309 result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ]. |
|
1310 self assert: result = $a. |
|
1311 |
|
1312 result := parser parse: 'b' onError: [ seen := true ]. |
|
1313 self assert: result. |
|
1314 self assert: seen |
|
1315 ! |
|
1316 |
|
1317 testParseOnError1 |
|
1318 | parser result seen | |
|
1319 parser := $a asParser. |
|
1320 |
|
1321 result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ]. |
|
1322 self assert: result = $a. |
|
1323 |
|
1324 result := parser parse: 'b' onError: [ :failure | |
|
1325 self assert: (failure position = 0). |
|
1326 self assert: (failure message findString: '$a') > 0. |
|
1327 self assert: (failure message findString: 'expected') > 0. |
|
1328 seen := true ]. |
|
1329 self assert: result. |
|
1330 self assert: seen |
|
1331 ! |
|
1332 |
|
1333 testParseOnError2 |
|
1334 | parser result seen | |
|
1335 parser := $a asParser. |
|
1336 |
|
1337 result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ]. |
|
1338 self assert: result = $a. |
|
1339 |
|
1340 result := parser parse: 'b' onError: [ :msg :pos | |
|
1341 self assert: (msg findString: '$a') > 0. |
|
1342 self assert: (msg findString: 'expected') > 0. |
|
1343 self assert: pos = 0. |
|
1344 seen := true ]. |
|
1345 self assert: result. |
|
1346 self assert: seen |
|
1347 ! |
|
1348 |
|
1349 testParser |
|
1350 | parser | |
|
1351 parser := PPParser new. |
|
1352 |
|
1353 self assert: parser isPetitParser. |
|
1354 |
|
1355 self deny: 4 isPetitParser. |
|
1356 self deny: 'foo' isPetitParser |
|
1357 ! ! |
|
1358 |
|
1359 !PPParserTest class methodsFor:'documentation'! |
|
1360 |
|
1361 version |
|
1362 ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPParserTest.st,v 1.4 2014-03-04 14:34:21 cg Exp $' |
|
1363 ! |
|
1364 |
|
1365 version_CVS |
|
1366 ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPParserTest.st,v 1.4 2014-03-04 14:34:21 cg Exp $' |
|
1367 ! |
|
1368 |
|
1369 version_SVN |
|
1370 ^ '$Id: PPParserTest.st,v 1.4 2014-03-04 14:34:21 cg Exp $' |
|
1371 ! ! |
|
1372 |
|