compiler/tests/PEGFsaInterpretTest.st
changeset 502 1e45d3c96ec5
child 515 b5316ef15274
equal deleted inserted replaced
464:f6d77fee9811 502:1e45d3c96ec5
       
     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