compiler/tests/PEGFsaDeterminizationTest.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sat, 19 Mar 2016 00:12:47 +0100
changeset 556 51c6afba5c91
parent 519 1563dce3c5b4
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:#PEGFsaDeterminizationTest
	instanceVariableNames:'parser1 parser2 fsa generator'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Tests-FSA'
!


!PEGFsaDeterminizationTest methodsFor:'as yet unclassified'!

determinizator
    ^ PEGFsaDeterminizator new
!

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

merge
    | startState fsa1 fsa2 |
    fsa := PEGFsa new.
    startState := PEGFsaState new.

    fsa addState: startState.	
    fsa startState: startState.

    fsa1 := self fsaFrom: parser1 asCompilerTree.
    fsa1 retval: #token1.
    fsa adopt: fsa1.
    fsa addTransitionFrom: startState to: fsa1 startState.
    

    fsa2 := self fsaFrom: parser2 asCompilerTree.
    fsa2 retval: #token2.
    fsa adopt: fsa2.
    fsa addTransitionFrom: startState to: fsa2 startState.
    
    self determinizator determinize: fsa 
!

setUp
    super setUp.
    generator := PEGFsaGenerator new.
!

testA_A
    parser1 := 'a' asParser.
    parser2 := 'a' asParser.
    
    self merge.
    
    self assert: fsa states size = 2.
    self assert: fsa finalStates size = 1.
    self assert: fsa finalStates anyOne retvals size = 2.
    self assert: (fsa finalStates anyOne retvals includes: #token1).	
    self assert: (fsa finalStates anyOne retvals includes: #token2).		
!

testA_AB
    parser1 := 'a' asParser.
    parser2 := 'ab' asParser.
    
    self merge.
    
    self assert: fsa states size = 3.
    self assert: fsa finalStates size = 2.
    self assert: fsa startState destination retvals size = 1.
    self assert: fsa startState destination retval = #token1.

    self assert: fsa startState destination destination retvals size = 1.
    self assert: fsa startState destination destination retval = #token2.
!

testID_KW
    parser1 := #word asParser plus.
    parser2 := #word asParser plus, $: asParser.
    
    self merge.
    
    self assert: fsa states size = 3.
    self assert: fsa finalStates size = 2.

    self assert: (fsa finalStates anySatisfy: [ :fs | fs retvals includes: #token1 ]).	
    self assert: (fsa finalStates anySatisfy: [ :fs | fs retvals includes: #token2 ]).	
    
!

testTrue_ID
    parser1 := 'true' asParser.
    parser2 := #word asParser plus.
    
    self merge.
    
    self assert: fsa states size = 6.
    self assert: fsa finalStates size = 5.
    "Only 1 state with both #token1 and #token2"
    self assert: ((fsa finalStates select: [:fs | fs retvals size = 2]) size = 1).	
!

testTrue_True
    parser1 := 'true' asParser.
    parser2 := 'true' asParser.
    
    self merge.
    
    self assert: fsa states size = 5.
    self assert: fsa finalStates size = 1.
    self assert: fsa finalStates anyOne retvals size = 2.
    self assert: (fsa finalStates anyOne retvals includes: #token1).	
    self assert: (fsa finalStates anyOne retvals includes: #token2).		
! !

!PEGFsaDeterminizationTest class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
! !