|
1 "{ Package: 'stx:goodies/petitparser/compiler/tests' }" |
|
2 |
|
3 "{ NameSpace: Smalltalk }" |
|
4 |
|
5 TestCase subclass:#PEGFsaInterpretTest |
|
6 instanceVariableNames:'fsa a b c result d interpreter e' |
|
7 classVariableNames:'' |
|
8 poolDictionaries:'' |
|
9 category:'PetitCompiler-Tests-FSA' |
|
10 ! |
|
11 |
|
12 !PEGFsaInterpretTest methodsFor:'as yet unclassified'! |
|
13 |
|
14 assert: anFsa fail: input |
|
15 | stream | |
|
16 stream := input asPetitStream. |
|
17 |
|
18 result := interpreter interpret: anFsa on: stream. |
|
19 |
|
20 self assert: result isEmpty. |
|
21 ^ result |
|
22 ! |
|
23 |
|
24 assert: anFsa parse: input |
|
25 ^ self assert: anFsa parse: input end: input size |
|
26 ! |
|
27 |
|
28 assert: anFsa parse: input end: end |
|
29 | stream | |
|
30 stream := input asPetitStream. |
|
31 anFsa fixFinalStatePriorities. |
|
32 |
|
33 result := interpreter interpret: anFsa on: stream. |
|
34 |
|
35 self assert: result isEmpty not. |
|
36 self assert: (result values anySatisfy: [ :pos | pos = end ]) description: 'wrong position'. |
|
37 |
|
38 ^ result |
|
39 ! |
|
40 |
|
41 assert: anFsa parse: input retval: name |
|
42 ^ self assert: anFsa parse: input retval: name end: input size |
|
43 ! |
|
44 |
|
45 assert: anFsa parse: input retval: name end: end |
|
46 | stream | |
|
47 stream := input asPetitStream. |
|
48 anFsa fixFinalStatePriorities. |
|
49 |
|
50 result := interpreter interpret: anFsa on: stream. |
|
51 |
|
52 self assert: result isEmpty not. |
|
53 self assert: ((result at: name) = end) description: 'wrong position'. |
|
54 |
|
55 ^ result |
|
56 ! |
|
57 |
|
58 assert: name position: pos |
|
59 ^ self assert: ((result at: name) = pos) |
|
60 ! |
|
61 |
|
62 assertFail: name |
|
63 self assert: (result includesKey: name) not |
|
64 ! |
|
65 |
|
66 assertPass: name |
|
67 self assert: (result includesKey: name) |
|
68 ! |
|
69 |
|
70 setUp |
|
71 a := PEGFsaState new name: #a; retval: #a; yourself. |
|
72 b := PEGFsaState new name: #b; retval: #b; yourself. |
|
73 c := PEGFsaState new name: #c; retval: #c; yourself. |
|
74 d := PEGFsaState new name: #d; retval: #d; yourself. |
|
75 e := PEGFsaState new name: #e; retval: #e; yourself. |
|
76 |
|
77 fsa := PEGFsa new. |
|
78 |
|
79 interpreter := PEGFsaInterpret new |
|
80 yourself. |
|
81 ! |
|
82 |
|
83 testAB |
|
84 fsa addState: a. |
|
85 fsa addState: b. |
|
86 fsa addState: c. |
|
87 fsa startState: a. |
|
88 fsa finalState: c. |
|
89 |
|
90 fsa addTransitionFrom: a to: b on: $a. |
|
91 fsa addTransitionFrom: b to: c on: $b. |
|
92 |
|
93 self assert: fsa parse: 'ab' retval: #c. |
|
94 self assert: fsa parse: 'abc' retval: #c end: 2. |
|
95 |
|
96 self assert: fsa fail: 'ac'. |
|
97 ! |
|
98 |
|
99 testABPlus |
|
100 fsa addState: a. |
|
101 fsa addState: b. |
|
102 fsa addState: c. |
|
103 fsa startState: a. |
|
104 fsa finalState: c. |
|
105 |
|
106 fsa addTransitionFrom: a to: b on: $a. |
|
107 fsa addTransitionFrom: b to: a on: $b. |
|
108 fsa addTransitionFrom: b to: c on: $b. |
|
109 |
|
110 self assert: fsa parse: 'ab'. |
|
111 self assert: fsa parse: 'ababab'. |
|
112 self assert: fsa parse: 'abababc' end: 6. |
|
113 |
|
114 self assert: fsa fail: 'ac'. |
|
115 ! |
|
116 |
|
117 testAOptional |
|
118 fsa addState: a. |
|
119 fsa addState: b. |
|
120 fsa addState: c. |
|
121 fsa startState: a. |
|
122 fsa finalState: b. |
|
123 fsa finalState: c. |
|
124 |
|
125 c priority: -1. |
|
126 b priority: 0. |
|
127 |
|
128 fsa addTransitionFrom: a to: b on: $a. |
|
129 fsa addTransitionFrom: a to: c priority: -1. |
|
130 |
|
131 self assert: fsa parse: 'a'. |
|
132 self assert: fsa parse: 'ab' end: 1. |
|
133 self assert: fsa parse: 'b' end: 0. |
|
134 ! |
|
135 |
|
136 testAPlusA |
|
137 fsa addState: a. |
|
138 fsa addState: b. |
|
139 fsa addState: c. |
|
140 fsa addState: d. |
|
141 fsa startState: a. |
|
142 fsa finalState: d. |
|
143 |
|
144 fsa addTransitionFrom: a to: b on: $a. |
|
145 |
|
146 fsa addTransitionFrom: c to: d on: $a. |
|
147 fsa addTransitionFrom: c to: d on: $b. |
|
148 |
|
149 b priority: 0. |
|
150 d priority: -1. |
|
151 fsa addTransitionFrom: b to: a. "a-loop" |
|
152 fsa addTransitionFrom: b to: c priority: -1. "sequence" |
|
153 |
|
154 |
|
155 self assert: fsa parse: 'aaab'. |
|
156 self assert: fsa fail: 'aaaa'. |
|
157 ! |
|
158 |
|
159 testAPlusB |
|
160 fsa addState: a. |
|
161 fsa addState: b. |
|
162 fsa startState: a. |
|
163 fsa finalState: b. |
|
164 |
|
165 fsa addTransitionFrom: a to: a on: $a. |
|
166 fsa addTransitionFrom: a to: b on: $b. |
|
167 |
|
168 self assert: fsa parse: 'ab'. |
|
169 self assert: fsa parse: 'aaaab'. |
|
170 self assert: fsa parse: 'abc' end: 2. |
|
171 |
|
172 self assert: fsa fail: 'ac'. |
|
173 ! |
|
174 |
|
175 testChoice |
|
176 fsa addState: a. |
|
177 fsa addState: b. |
|
178 fsa addState: c. |
|
179 fsa startState: a. |
|
180 fsa finalState: b. |
|
181 fsa finalState: c. |
|
182 |
|
183 fsa addTransitionFrom: a to: b on: $b. |
|
184 fsa addTransitionFrom: a to: c on: $c. |
|
185 |
|
186 self assert: fsa parse: 'b'. |
|
187 self assert: fsa parse: 'c'. |
|
188 |
|
189 self assert: fsa fail: 'a' |
|
190 ! |
|
191 |
|
192 testChoice2 |
|
193 fsa addState: a. |
|
194 fsa addState: b. |
|
195 fsa addState: c. |
|
196 fsa startState: a. |
|
197 fsa finalState: b. |
|
198 fsa finalState: c. |
|
199 |
|
200 fsa addTransitionFrom: a to: b on: $a. |
|
201 fsa addTransitionFrom: a to: c on: $a. |
|
202 |
|
203 self assert: fsa parse: 'a'. |
|
204 self assert: #b position: 1. |
|
205 self assert: #c position: 1. |
|
206 |
|
207 self assert: fsa fail: 'b' |
|
208 ! |
|
209 |
|
210 testEmpty |
|
211 fsa addState: a. |
|
212 fsa startState: a. |
|
213 fsa finalState: a. |
|
214 |
|
215 " fsa addTransitionFrom: a to: b. |
|
216 " |
|
217 self assert: fsa parse: '' retval: #a. |
|
218 ! |
|
219 |
|
220 testEpsilonChoice |
|
221 fsa addState: a. |
|
222 fsa addState: b. |
|
223 fsa addState: c. |
|
224 fsa addState: d. |
|
225 fsa addState: e. |
|
226 fsa startState: a. |
|
227 fsa finalState: c. |
|
228 fsa finalState: e. |
|
229 |
|
230 fsa addTransitionFrom: b to: c on: $c. |
|
231 fsa addTransitionFrom: d to: e on: $e. |
|
232 |
|
233 fsa addTransitionFrom: a to: b. |
|
234 fsa addTransitionFrom: a to: d. |
|
235 |
|
236 self assert: fsa parse: 'c'. |
|
237 self assert: fsa parse: 'e'. |
|
238 |
|
239 self assert: fsa fail: 'a' |
|
240 ! |
|
241 |
|
242 testEpsilonChoice2 |
|
243 fsa addState: a. |
|
244 fsa addState: b. |
|
245 fsa addState: c. |
|
246 fsa addState: d. |
|
247 fsa addState: e. |
|
248 fsa startState: a. |
|
249 fsa finalState: c. |
|
250 fsa finalState: e. |
|
251 |
|
252 fsa addTransitionFrom: b to: c on: $a. |
|
253 fsa addTransitionFrom: d to: e on: $a. |
|
254 |
|
255 fsa addTransitionFrom: a to: b. |
|
256 fsa addTransitionFrom: a to: d. |
|
257 |
|
258 self assert: fsa parse: 'a'. |
|
259 self assert: #c position: 1. |
|
260 self assert: #e position: 1. |
|
261 |
|
262 self assert: fsa fail: 'b' |
|
263 ! |
|
264 |
|
265 testOverlap |
|
266 fsa addState: a. |
|
267 fsa addState: b. |
|
268 fsa addState: c. |
|
269 fsa startState: a. |
|
270 fsa finalState: b. |
|
271 fsa finalState: c. |
|
272 |
|
273 b priority: -1. |
|
274 c priority: -1. |
|
275 fsa addTransitionFrom: a to: b on: $a. |
|
276 fsa addTransitionFrom: b to: c on: $a priority: -1. |
|
277 |
|
278 self assert: fsa parse: 'aa'. |
|
279 self assertPass: #b. |
|
280 self assertPass: #c. |
|
281 |
|
282 self assert: fsa parse: 'ac' end: 1. |
|
283 self assertPass: #b. |
|
284 self assertFail: #c. |
|
285 ! |
|
286 |
|
287 testOverlap2 |
|
288 fsa addState: a. |
|
289 fsa addState: b. |
|
290 fsa addState: c. |
|
291 fsa startState: a. |
|
292 fsa finalState: b. |
|
293 fsa finalState: c. |
|
294 |
|
295 b priority: 0. |
|
296 c priority: -1. |
|
297 fsa addTransitionFrom: a to: b on: $a. |
|
298 fsa addTransitionFrom: b to: c on: $a priority: -1. |
|
299 |
|
300 self assert: fsa parse: 'aa' end: 1. |
|
301 self assertPass: #b. |
|
302 self assertFail: #c. |
|
303 |
|
304 self assert: fsa parse: 'ac' end: 1. |
|
305 self assertPass: #b. |
|
306 self assertFail: #c. |
|
307 ! |
|
308 |
|
309 testPriorityChoice |
|
310 fsa addState: a. |
|
311 fsa addState: b. |
|
312 fsa addState: c. |
|
313 fsa startState: a. |
|
314 fsa finalState: b. |
|
315 fsa finalState: c. |
|
316 |
|
317 b priority: 0. |
|
318 c priority: -1. |
|
319 fsa addTransitionFrom: a to: b on: $a. |
|
320 fsa addTransitionFrom: a to: c on: $a priority: -1. |
|
321 |
|
322 self assert: fsa parse: 'a'. |
|
323 self assert: #b position: 1. |
|
324 self assert: (result includesKey: #b). |
|
325 self assert: (result includesKey: #c) not. |
|
326 |
|
327 self assert: fsa fail: 'b' |
|
328 ! |
|
329 |
|
330 testPriorityChoice2 |
|
331 fsa addState: a. |
|
332 fsa addState: b. |
|
333 fsa addState: c. |
|
334 fsa startState: a. |
|
335 fsa finalState: b. |
|
336 fsa finalState: c. |
|
337 |
|
338 b priority: -1. |
|
339 c priority: 0. |
|
340 fsa addTransitionFrom: a to: b on: $a priority: -1. |
|
341 fsa addTransitionFrom: a to: c on: $a. |
|
342 |
|
343 self assert: fsa parse: 'a'. |
|
344 self assert: #c position: 1. |
|
345 self assert: (result includesKey: #b) not. |
|
346 self assert: (result includesKey: #c). |
|
347 |
|
348 self assert: fsa fail: 'b' |
|
349 ! |
|
350 |
|
351 testPriorityContinuation |
|
352 fsa addState: a. |
|
353 fsa addState: b. |
|
354 fsa addState: c. |
|
355 fsa startState: a. |
|
356 |
|
357 fsa finalState: b. |
|
358 fsa finalState: c. |
|
359 |
|
360 |
|
361 fsa addTransitionFrom: a to: b on: $a. |
|
362 fsa addTransitionFrom: b to: c on: $a priority: -1. |
|
363 |
|
364 b retval: PEGFsaFailure new. |
|
365 b priority: 0. |
|
366 c priority: -1. |
|
367 |
|
368 self assert: fsa fail: 'a'. |
|
369 self assert: fsa fail: 'aa' |
|
370 ! |
|
371 |
|
372 testPriorityEpsilonChoice |
|
373 fsa addState: a. |
|
374 fsa addState: b. |
|
375 fsa addState: c. |
|
376 fsa addState: d. |
|
377 fsa addState: e. |
|
378 fsa startState: a. |
|
379 fsa finalState: c. |
|
380 fsa finalState: e. |
|
381 |
|
382 fsa addTransitionFrom: b to: c on: $a. |
|
383 fsa addTransitionFrom: d to: e on: $a. |
|
384 |
|
385 c priority: 0. |
|
386 e priority: -1. |
|
387 fsa addTransitionFrom: a to: b. |
|
388 fsa addTransitionFrom: a to: d priority: -1. |
|
389 |
|
390 self assert: fsa parse: 'a'. |
|
391 self assert: #c position: 1. |
|
392 self assertPass: #c. |
|
393 self assertFail: #e. |
|
394 |
|
395 self assert: fsa fail: 'b' |
|
396 ! |
|
397 |
|
398 testPriorityEpsilonChoice2 |
|
399 fsa addState: a. |
|
400 fsa addState: b. |
|
401 fsa addState: c. |
|
402 fsa addState: d. |
|
403 fsa addState: e. |
|
404 fsa startState: a. |
|
405 fsa finalState: c. |
|
406 fsa finalState: e. |
|
407 |
|
408 fsa addTransitionFrom: b to: c on: $a. |
|
409 fsa addTransitionFrom: d to: e on: $a. |
|
410 |
|
411 c priority: -1. |
|
412 e priority: 0. |
|
413 fsa addTransitionFrom: a to: b priority: -1. |
|
414 fsa addTransitionFrom: a to: d. |
|
415 |
|
416 self assert: fsa parse: 'a'. |
|
417 self assert: #e position: 1. |
|
418 self assertPass: #e. |
|
419 self assertFail: #c. |
|
420 |
|
421 self assert: fsa fail: 'b' |
|
422 ! |
|
423 |
|
424 testPriorityReturn |
|
425 fsa addState: a. |
|
426 fsa addState: b. |
|
427 fsa addState: c. |
|
428 fsa startState: a. |
|
429 fsa finalState: b. |
|
430 |
|
431 fsa addTransitionFrom: a to: b on: $a. |
|
432 fsa addTransitionFrom: b to: c on: $a. |
|
433 |
|
434 b priority: -1. |
|
435 c priority: 0. |
|
436 |
|
437 self assert: fsa parse: 'a'. |
|
438 self assert: #b position: 1. |
|
439 |
|
440 self assert: fsa fail: 'aa' |
|
441 ! ! |
|
442 |