compiler/tests/PEGFsaChoiceDeterminizationTest.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sat, 19 Mar 2016 00:12:47 +0100
changeset 556 51c6afba5c91
parent 515 b5316ef15274
permissions -rw-r--r--
CI: Use VM provided by Pharo team on both Linux and Windows. Hand-crafter Pharo VM is no longer needed as the Linux slave in SWING build farm has been upgraded so it has compatible GLIBC. This makes CI scripts simpler and more usable for other people.

"{ Package: 'stx:goodies/petitparser/compiler/tests' }"

"{ NameSpace: Smalltalk }"

TestCase subclass:#PEGFsaChoiceDeterminizationTest
	instanceVariableNames:'fsa a b c result d interpreter e t1 t2 state anotherState parser
		generator'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Tests-FSA'
!

!PEGFsaChoiceDeterminizationTest methodsFor:'as yet unclassified'!

assert: anFsa fail: input
    | stream |
    stream := input asPetitStream.

    result := interpreter interpret: anFsa on: stream.

    self assert: result isEmpty.
    ^ result
!

assert: anFsa parse: input
    ^ self assert: anFsa parse: input end: input size
!

assert: anFsa parse: input end: end
    | stream |
    stream := input asPetitStream.

    result := interpreter interpret: anFsa on: stream.

    self assert: result size = 1.
    self assert: ((result anyOne) = end) description: 'wrong position'.
    
    ^ result anyOne
!

determinizator
    ^ PEGFsaChoiceDeterminizator new
!

determinize: anFsa
    ^ self determinizator determinize: anFsa
!

fsaFrom: aNode
    ^ (aNode accept: generator)
        yourself
!

joinState: s1 with: s2
    ^ self determinizator joinState: s1 with: s2 
!

setUp
    a := PEGFsaState new name: #a; retval: #token; yourself.
    b := PEGFsaState new name: #b; retval: #token; yourself.
    c := PEGFsaState new name: #c; retval: #token; yourself.
    d := PEGFsaState new name: #d; retval: #token; yourself.
    e := PEGFsaState new name: #e; retval: #token; yourself.

    state := PEGFsaState new name: #state; retval: #token; yourself.
    anotherState := PEGFsaState new name: #anotherState; retval: #token; yourself.

    t1 := PEGFsaCharacterTransition new.
    t2 := PEGFsaCharacterTransition new.

    fsa := PEGFsa new.
    generator := PEGFsaGenerator new.

    interpreter := PEGFsaInterpret new
        yourself.
!

testAAorA
    parser := 'aa' asParser / 'a' asParser.
    fsa := self fsaFrom: parser asCompilerTree.
    
"	self assert: fsa states size = 2."
    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self assert: fsa parse: 'a'.
    self assert: fsa parse: 'aa'.
    self assert: fsa fail: 'b'.
!

testAorAA
    parser := 'a' asParser / 'aa' asParser.
    fsa := self fsaFrom: parser asCompilerTree.
    
"	self assert: fsa states size = 2."
    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self assert: fsa parse: 'a'.
    self assert: fsa parse: 'aa' end: 1.
    self assert: fsa fail: 'b'.
!

testDeterminizeFsa
    fsa addState: a.
    fsa addState: b.
    fsa addState: c.
    fsa addState: d.
    fsa addState: e.
    fsa startState: a.
    fsa finalState: c.
    fsa finalState: e.
    
    fsa addTransitionFrom: a to: b on: $a.
    fsa addTransitionFrom: b to: c on: $b.

    b final: true.
    b priority: 0.
    c final: true.
    c priority: 0.
    c failure: true.

    fsa addTransitionFrom: a to: d on: $a priority: -1.
    fsa addTransitionFrom: d to: e on: $a priority: -1.

    d priority: -1.
    e final: true.
    e priority: -1.
    e failure: true.


    self determinize: fsa.
        
    self assert: fsa states size = 3.
    self assert: a transitions size = 1.	
    self assert: a destination isFinal.
    self assert: a destination destination isFinal.
!

testDeterminizeFsa2
    fsa addState: a.
    fsa addState: b.
    fsa addState: c.
    fsa addState: d.
    fsa addState: e.
    fsa startState: a.
    fsa finalState: c.
    fsa finalState: e.
    
    fsa addTransitionFrom: a to: b on: $a.
    fsa addTransitionFrom: b to: c on: $b.

    b final: true.
    b priority: 0.
    c final: true.
    c priority: 0.
    c failure: true.

    fsa addTransitionFrom: a to: d on: $a priority: -1.
    fsa addTransitionFrom: d to: e on: $b priority: -1.

    d priority: -1.
    e final: true.
    e priority: -1.
    e failure: true.

    self determinize: fsa.
        
    self assert: fsa states size = 3.
    self assert: a transitions size = 1.	
    self assert: a destination isFinal.
    self assert: a destination transitions size = 1.
    self assert: a destination destination isFsaFailure.
!

testNot
    parser := ('aa' asParser, 'aa' asParser not) / ('aa' asParser, 'aa' asParser).
    fsa := self fsaFrom: parser asCompilerTree.
    

"	self assert: fsa states size = 2."
    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self assert: fsa parse: 'aabc' end: 2.
    self assert: fsa parse: 'aaa' end: 2.
    self assert: fsa parse: 'aa'.

    self assert: fsa parse: 'aaaa'.
    self assert: fsa parse: 'aaaaa' end: 4.

    self assert: fsa fail: 'ab'.
! !