compiler/tests/PEGFsaDeterminizationTest.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:#PEGFsaDeterminizationTest
       
     6 	instanceVariableNames:'fsa a b c result d interpreter e'
       
     7 	classVariableNames:''
       
     8 	poolDictionaries:''
       
     9 	category:'PetitCompiler-Tests-FSA'
       
    10 !
       
    11 
       
    12 !PEGFsaDeterminizationTest 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 retval: name
       
    25     ^ self assert: anFsa parse: input retval: name end: input size
       
    26 !
       
    27 
       
    28 assert: anFsa parse: input retval: name end: end
       
    29     | stream |
       
    30     stream := input asPetitStream.
       
    31 
       
    32     result := interpreter interpret: anFsa on: stream.
       
    33 
       
    34     self assert: result isEmpty not.
       
    35     self assert: ((result at: name) = end) description: 'wrong position'.
       
    36     
       
    37     ^ result
       
    38 !
       
    39 
       
    40 assertFail: name
       
    41     self assert: (result includesKey: name) not
       
    42 !
       
    43 
       
    44 assertPass: name
       
    45     self assert: (result includesKey: name)
       
    46 !
       
    47 
       
    48 setUp
       
    49     a := PEGFsaState new name: #a; retval: #a; yourself.
       
    50     b := PEGFsaState new name: #b; retval: #b; yourself.
       
    51     c := PEGFsaState new name: #c; retval: #c; yourself.
       
    52     d := PEGFsaState new name: #d; retval: #d; yourself.
       
    53     e := PEGFsaState new name: #e; retval: #e; yourself.
       
    54 
       
    55     fsa := PEGFsa new.
       
    56 
       
    57     interpreter := PEGFsaInterpret new
       
    58         yourself.
       
    59 !
       
    60 
       
    61 testAAplusA
       
    62     fsa addState: a.
       
    63     fsa addState: b.
       
    64     fsa addState: c.
       
    65     fsa addState: d.
       
    66     fsa addState: e.
       
    67     fsa startState: a.
       
    68     fsa finalState: e.
       
    69     
       
    70     fsa addTransitionFrom: a to: b on: $a.
       
    71     fsa addTransitionFrom: b to: c on: $a.
       
    72     fsa addTransitionFrom: c to: a.	
       
    73     fsa addTransitionFrom: c to: d priority: -1. 
       
    74     fsa addTransitionFrom: d to: e on: $a.
       
    75     
       
    76     c priority: 0.
       
    77     
       
    78     fsa determinize.
       
    79 
       
    80 "	self assert: fsa states size = 3."
       
    81     self assert: fsa isDeterministic.
       
    82     self assert: fsa isWithoutEpsilons.	
       
    83     
       
    84     self assert: fsa fail: 'a'.
       
    85     self assert: fsa fail: 'aa'.
       
    86     self assert: fsa fail: 'aaaa'.
       
    87 
       
    88     self assert: fsa parse: 'aaa' retval: #e.
       
    89     self assert: fsa parse: 'aaaaa' retval: #e.
       
    90     self assert: fsa parse: 'aaaaaaa' retval: #e.
       
    91 !
       
    92 
       
    93 testAB
       
    94     fsa addState: a.
       
    95     fsa addState: b.
       
    96     fsa addState: c.
       
    97     fsa addState: d.
       
    98     fsa startState: a.
       
    99     fsa finalState: d.
       
   100     
       
   101     fsa addTransitionFrom: a to: b on: $a.
       
   102     fsa addTransitionFrom: c to: d on: $b.	
       
   103     fsa addTransitionFrom: b to: c priority: -1. 
       
   104     
       
   105     fsa determinize.
       
   106 
       
   107     self assert: fsa states size = 3.
       
   108     self assert: fsa isDeterministic.
       
   109     self assert: fsa isWithoutEpsilons.	
       
   110     
       
   111     self assert: fsa parse: 'ab' retval: #d.
       
   112     self assert: fsa parse: 'abc' retval: #d end: 2.
       
   113     
       
   114     self assert: fsa fail: 'ac'.
       
   115 !
       
   116 
       
   117 testAPlusA
       
   118     fsa addState: a.
       
   119     fsa addState: b.
       
   120     fsa addState: c.
       
   121     fsa addState: d.
       
   122     fsa startState: a.
       
   123     fsa finalState: d.
       
   124     
       
   125     fsa addTransitionFrom: a to: b on: $a.
       
   126     fsa addTransitionFrom: b to: a.	
       
   127     fsa addTransitionFrom: b to: c priority: -1. 
       
   128     fsa addTransitionFrom: c to: d on: $a.
       
   129     
       
   130     b priority: 0.
       
   131     
       
   132     fsa determinize.
       
   133 
       
   134 "	self assert: fsa states size = 2."
       
   135     self assert: fsa isDeterministic.
       
   136     self assert: fsa isWithoutEpsilons.	
       
   137     
       
   138     self assert: fsa fail: 'a'.
       
   139     self assert: fsa fail: 'aa'.
       
   140     self assert: fsa fail: 'b'.
       
   141 !
       
   142 
       
   143 testAPlusB
       
   144     fsa addState: a.
       
   145     fsa addState: b.
       
   146     fsa addState: c.
       
   147     fsa addState: d.
       
   148     fsa startState: a.
       
   149     fsa finalState: d.
       
   150     
       
   151     fsa addTransitionFrom: a to: b on: $a.
       
   152     fsa addTransitionFrom: b to: a.	
       
   153     fsa addTransitionFrom: b to: c priority: -1. 
       
   154     fsa addTransitionFrom: c to: d on: $b.
       
   155     
       
   156     fsa determinize.
       
   157 
       
   158     self assert: fsa states size = 3.
       
   159     self assert: fsa isDeterministic.
       
   160     self assert: fsa isWithoutEpsilons.	
       
   161     
       
   162     self assert: fsa parse: 'ab' retval: #d.
       
   163     self assert: fsa parse: 'aaaab' retval: #d.
       
   164     self assert: fsa parse: 'aaaabc' retval: #d end: 5.
       
   165     
       
   166     self assert: fsa fail: 'b'.
       
   167 !
       
   168 
       
   169 testAorA
       
   170     fsa addState: a.
       
   171     fsa addState: b.
       
   172     fsa addState: c.
       
   173     fsa addState: d.
       
   174     fsa addState: e.
       
   175     fsa startState: a.
       
   176     fsa finalState: c.
       
   177     fsa finalState: e.
       
   178     
       
   179     fsa addTransitionFrom: a to: b.
       
   180     fsa addTransitionFrom: a to: d.	
       
   181     fsa addTransitionFrom: b to: c on: $a. 
       
   182     fsa addTransitionFrom: d to: e on: $a. 
       
   183     
       
   184     c priority: 0.
       
   185     e priority: 0.
       
   186     
       
   187     fsa determinize.
       
   188 
       
   189     self assert: fsa states size = 2.
       
   190     self assert: fsa isDeterministic.
       
   191     self assert: fsa isWithoutEpsilons.	
       
   192     
       
   193     self assert: fsa parse: 'a' retval: #c.
       
   194     self assert: fsa parse: 'a' retval: #e.
       
   195     self assert: (a transitions allSatisfy: [:t | t priority = 0]).
       
   196     
       
   197     self assert: fsa fail: 'b'.
       
   198 !
       
   199 
       
   200 testApriorityOrA
       
   201     fsa addState: a.
       
   202     fsa addState: b.
       
   203     fsa addState: c.
       
   204     fsa addState: d.
       
   205     fsa addState: e.
       
   206     fsa startState: a.
       
   207     fsa finalState: c.
       
   208     fsa finalState: e.
       
   209     
       
   210     c priority: 0.
       
   211     e priority: 0.
       
   212     
       
   213     fsa addTransitionFrom: a to: b priority: -1.
       
   214     fsa addTransitionFrom: a to: d.	
       
   215     fsa addTransitionFrom: b to: c on: $a. 
       
   216     fsa addTransitionFrom: d to: e on: $a. 
       
   217     
       
   218     fsa determinize.
       
   219 
       
   220     self assert: fsa states size = 2.
       
   221     self assert: fsa isDeterministic.
       
   222     self assert: fsa isWithoutEpsilons.	
       
   223     
       
   224     self assert: fsa parse: 'a' retval: #e.
       
   225     self assertFail: #c.
       
   226     
       
   227     self assert: fsa fail: 'b'.
       
   228 !
       
   229 
       
   230 testApriorityOrA2
       
   231     fsa addState: a.
       
   232     fsa addState: b.
       
   233     fsa addState: c.
       
   234     fsa addState: d.
       
   235     fsa addState: e.
       
   236     fsa startState: a.
       
   237     fsa finalState: c.
       
   238     fsa finalState: e.
       
   239     
       
   240     c priority: 0.
       
   241     e priority: 0.
       
   242     
       
   243     fsa addTransitionFrom: a to: b.
       
   244     fsa addTransitionFrom: a to: d priority: -1.	
       
   245     fsa addTransitionFrom: b to: c on: $a. 
       
   246     fsa addTransitionFrom: d to: e on: $a. 
       
   247     
       
   248     fsa determinize.
       
   249 
       
   250     self assert: fsa states size = 2.
       
   251     self assert: fsa isDeterministic.
       
   252     self assert: fsa isWithoutEpsilons.	
       
   253     
       
   254     self assert: fsa parse: 'a' retval: #c.
       
   255     self assertFail: #e.
       
   256     
       
   257     self assert: fsa fail: 'b'.
       
   258 ! !
       
   259