66 assertPass: name |
66 assertPass: name |
67 self assert: (result includesKey: name) |
67 self assert: (result includesKey: name) |
68 ! |
68 ! |
69 |
69 |
70 setUp |
70 setUp |
71 a := PEGFsaState new name: #a; retval: #a; yourself. |
71 a := PEGFsaState new name: #a; retval: #token; yourself. |
72 b := PEGFsaState new name: #b; retval: #b; yourself. |
72 b := PEGFsaState new name: #b; retval: #token; yourself. |
73 c := PEGFsaState new name: #c; retval: #c; yourself. |
73 c := PEGFsaState new name: #c; retval: #token; yourself. |
74 d := PEGFsaState new name: #d; retval: #d; yourself. |
74 d := PEGFsaState new name: #d; retval: #token; yourself. |
75 e := PEGFsaState new name: #e; retval: #e; yourself. |
75 e := PEGFsaState new name: #e; retval: #token; yourself. |
76 |
76 |
77 fsa := PEGFsa new. |
77 fsa := PEGFsa new. |
78 |
78 |
79 interpreter := PEGFsaInterpret new |
79 interpreter := PEGFsaInterpret new |
80 yourself. |
80 yourself. |
|
81 ! ! |
|
82 |
|
83 !PEGFsaInterpretTest methodsFor:'tests'! |
|
84 |
|
85 testA |
|
86 fsa addState: a. |
|
87 fsa addState: b. |
|
88 fsa startState: a. |
|
89 fsa finalState: b. |
|
90 |
|
91 fsa addTransitionFrom: a to: b on: $a. |
|
92 |
|
93 self assert: fsa parse: 'a'. |
|
94 self assert: fsa parse: 'abc' end: 1. |
|
95 |
|
96 self assert: fsa fail: 'b'. |
81 ! |
97 ! |
82 |
98 |
83 testAB |
99 testAB |
84 fsa addState: a. |
100 fsa addState: a. |
85 fsa addState: b. |
101 fsa addState: b. |
187 self assert: fsa parse: 'c'. |
195 self assert: fsa parse: 'c'. |
188 |
196 |
189 self assert: fsa fail: 'a' |
197 self assert: fsa fail: 'a' |
190 ! |
198 ! |
191 |
199 |
192 testChoice2 |
200 testEmpty |
|
201 fsa addState: a. |
|
202 fsa startState: a. |
|
203 fsa finalState: a. |
|
204 |
|
205 " fsa addTransitionFrom: a to: b. |
|
206 " |
|
207 self assert: fsa parse: '' retval: #token. |
|
208 ! ! |
|
209 |
|
210 !PEGFsaInterpretTest methodsFor:'tests - multivalues'! |
|
211 |
|
212 testEpsilonChoice |
|
213 fsa addState: a. |
|
214 fsa addState: b. |
|
215 fsa addState: c. |
|
216 fsa addState: d. |
|
217 fsa addState: e. |
|
218 fsa startState: a. |
|
219 fsa finalState: c. |
|
220 fsa finalState: e. |
|
221 |
|
222 fsa addTransitionFrom: b to: c on: $c. |
|
223 fsa addTransitionFrom: d to: e on: $e. |
|
224 |
|
225 fsa addTransitionFrom: a to: b. |
|
226 fsa addTransitionFrom: a to: d. |
|
227 |
|
228 c retval: #c. |
|
229 e retval: #e. |
|
230 |
|
231 self assert: fsa parse: 'c' retval: #c. |
|
232 self assert: fsa parse: 'e' retval: #e. |
|
233 |
|
234 self assert: fsa fail: 'a' |
|
235 ! |
|
236 |
|
237 testEpsilonChoice2 |
|
238 fsa addState: a. |
|
239 fsa addState: b. |
|
240 fsa addState: c. |
|
241 fsa addState: d. |
|
242 fsa addState: e. |
|
243 fsa startState: a. |
|
244 fsa finalState: c. |
|
245 fsa finalState: e. |
|
246 |
|
247 fsa addTransitionFrom: b to: c on: $a. |
|
248 fsa addTransitionFrom: d to: e on: $a. |
|
249 |
|
250 fsa addTransitionFrom: a to: b. |
|
251 fsa addTransitionFrom: a to: d. |
|
252 |
|
253 c retval: #c. |
|
254 e retval: #e. |
|
255 |
|
256 self assert: fsa parse: 'a'. |
|
257 self assert: #c position: 1. |
|
258 self assert: #e position: 1. |
|
259 |
|
260 self assert: fsa fail: 'b' |
|
261 ! |
|
262 |
|
263 testMultivalueChoice |
193 fsa addState: a. |
264 fsa addState: a. |
194 fsa addState: b. |
265 fsa addState: b. |
195 fsa addState: c. |
266 fsa addState: c. |
196 fsa startState: a. |
267 fsa startState: a. |
197 fsa finalState: b. |
268 fsa finalState: b. |
198 fsa finalState: c. |
269 fsa finalState: c. |
199 |
270 |
200 fsa addTransitionFrom: a to: b on: $a. |
271 fsa addTransitionFrom: a to: b on: $a. |
201 fsa addTransitionFrom: a to: c on: $a. |
272 fsa addTransitionFrom: a to: c on: $a. |
|
273 |
|
274 b retval: #b. |
|
275 c retval: #c. |
202 |
276 |
203 self assert: fsa parse: 'a'. |
277 self assert: fsa parse: 'a'. |
204 self assert: #b position: 1. |
278 self assert: #b position: 1. |
205 self assert: #c position: 1. |
279 self assert: #c position: 1. |
206 |
280 |
207 self assert: fsa fail: 'b' |
281 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 ! ! |
282 ! ! |
442 |
283 |