compiler/tests/PEGFsaInterpretTest.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:#PEGFsaInterpretTest
	instanceVariableNames:'fsa a b c result d interpreter e'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Tests-FSA'
!

!PEGFsaInterpretTest 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.
    anFsa fixFinalStatePriorities.

    result := interpreter interpret: anFsa on: stream.

    self assert: result isEmpty not.
    self assert: (result values anySatisfy: [ :pos | pos = end ]) description: 'wrong position'.
    
    ^ result
!

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

assert: anFsa parse: input retval: name end: end
    | stream |
    stream := input asPetitStream.
    anFsa fixFinalStatePriorities.
    
    result := interpreter interpret: anFsa on: stream.

    self assert: result isEmpty not.
    self assert: ((result at: name) = end) description: 'wrong position'.
    
    ^ result
!

assert: name position: pos
    ^ self assert: ((result at: name) = pos)
!

assertFail: name
    self assert: (result includesKey: name) not
!

assertPass: name
    self assert: (result includesKey: name)
!

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.

    fsa := PEGFsa new.

    interpreter := PEGFsaInterpret new
        yourself.
! !

!PEGFsaInterpretTest methodsFor:'tests'!

testA
    fsa addState: a.
    fsa addState: b.
    fsa startState: a.
    fsa finalState: b.
    
    fsa addTransitionFrom: a to: b on: $a.
    
    self assert: fsa parse: 'a'.
    self assert: fsa parse: 'abc' end: 1.
    
    self assert: fsa fail: 'b'.
!

testAB
    fsa addState: a.
    fsa addState: b.
    fsa addState: c.
    fsa startState: a.
    fsa finalState: c.
    
    fsa addTransitionFrom: a to: b on: $a.
    fsa addTransitionFrom: b to: c on: $b.	
    
    self assert: fsa parse: 'ab' retval: #token.
    self assert: fsa parse: 'abc' retval: #token end: 2.
    
    self assert: fsa fail: 'ac'.
!

testABPlus
    fsa addState: a.
    fsa addState: b.
    fsa addState: c.
    fsa startState: a.
    fsa finalState: c.
    
    fsa addTransitionFrom: a to: b on: $a.
    fsa addTransitionFrom: b to: a on: $b.	
    fsa addTransitionFrom: b to: c on: $b.	
    
    self assert: fsa parse: 'ab'.
    self assert: fsa parse: 'ababab'.
    self assert: fsa parse: 'abababc' end: 6.
    
    self assert: fsa fail: 'ac'.
!

testAOptional
    fsa addState: a.
    fsa addState: b.
    fsa startState: a.
    fsa finalState: a.
    fsa finalState: b.
    
    fsa addTransitionFrom: a to: b on: $a.
    
    self assert: fsa parse: 'a'.
    self assert: fsa parse: 'ab' end: 1.
    self assert: fsa parse: 'b' end: 0.
!

testAPlusB
    fsa addState: a.
    fsa addState: b.
    fsa startState: a.
    fsa finalState: b.
    
    fsa addTransitionFrom: a to: a on: $a.
    fsa addTransitionFrom: a to: b on: $b.	
    
    self assert: fsa parse: 'ab'.
    self assert: fsa parse: 'aaaab'.
    self assert: fsa parse: 'abc' end: 2.
    
    self assert: fsa fail: 'ac'.
!

testA_Bnot
    fsa addState: a.
    fsa addState: b.
    fsa addState: c.
    fsa startState: a.
    fsa finalState: b.
    fsa finalState: c.
    
    fsa addTransitionFrom: a to: b on: $a.
    fsa addTransitionFrom: b to: c on: $b.	
    
    c retval: #token.
    c failure: true.
    
    self assert: fsa parse: 'ac' retval: #token end: 1.
    self assert: fsa parse: 'aaa' retval: #token end: 1.
    
    self assert: fsa fail: 'ab'.
!

testChoice
    fsa addState: a.
    fsa addState: b.
    fsa addState: c.
    fsa startState: a.
    fsa finalState: b.
    fsa finalState: c.
    
    fsa addTransitionFrom: a to: b on: $b.
    fsa addTransitionFrom: a to: c on: $c.	
    
    self assert: fsa parse: 'b'.
    self assert: fsa parse: 'c'.

    self assert: fsa fail: 'a'
!

testEmpty
    fsa addState: a.
    fsa startState: a.
    fsa finalState: a.
    
"	fsa addTransitionFrom: a to: b.
"	
    self assert: fsa parse: '' retval: #token.
! !

!PEGFsaInterpretTest methodsFor:'tests - multivalues'!

testEpsilonChoice
    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: b to: c on: $c.
    fsa addTransitionFrom: d to: e on: $e.	
    
    fsa addTransitionFrom: a to: b.
    fsa addTransitionFrom: a to: d.

    c retval: #c.
    e retval: #e.
    
    self assert: fsa parse: 'c' retval: #c.
    self assert: fsa parse: 'e' retval: #e.

    self assert: fsa fail: 'a'
!

testEpsilonChoice2
    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: b to: c on: $a.
    fsa addTransitionFrom: d to: e on: $a.	
    
    fsa addTransitionFrom: a to: b.
    fsa addTransitionFrom: a to: d.

    c retval: #c.
    e retval: #e.	
    
    self assert: fsa parse: 'a'.
    self assert: #c position: 1.
    self assert: #e position: 1.

    self assert: fsa fail: 'b'
!

testMultivalueChoice
    fsa addState: a.
    fsa addState: b.
    fsa addState: c.
    fsa startState: a.
    fsa finalState: b.
    fsa finalState: c.
    
    fsa addTransitionFrom: a to: b on: $a.
    fsa addTransitionFrom: a to: c on: $a.	
    
    b retval: #b.
    c retval: #c.
    
    self assert: fsa parse: 'a'.
    self assert: #b position: 1.
    self assert: #c position: 1.
    
    self assert: fsa fail: 'b'
! !