compiler/tests/PEGFsaScannerIntegrationTest.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Fri, 24 Jul 2015 15:06:54 +0100
changeset 502 1e45d3c96ec5
child 515 b5316ef15274
permissions -rw-r--r--
Updated to PetitCompiler-JanVrany.135, PetitCompiler-Tests-JanKurs.93, PetitCompiler-Extras-Tests-JanVrany.16, PetitCompiler-Benchmarks-JanKurs.12 Name: PetitCompiler-JanVrany.135 Author: JanVrany Time: 22-07-2015, 06:53:29.127 PM UUID: 890178b5-275d-46af-a2ad-1738998f07cb Ancestors: PetitCompiler-JanVrany.134 Name: PetitCompiler-Tests-JanKurs.93 Author: JanKurs Time: 20-07-2015, 11:30:10.283 PM UUID: 6473e671-ad70-42ca-b6c3-654b78edc531 Ancestors: PetitCompiler-Tests-JanKurs.92 Name: PetitCompiler-Extras-Tests-JanVrany.16 Author: JanVrany Time: 22-07-2015, 05:18:22.387 PM UUID: 8f6f9129-dbba-49b1-9402-038470742f98 Ancestors: PetitCompiler-Extras-Tests-JanKurs.15 Name: PetitCompiler-Benchmarks-JanKurs.12 Author: JanKurs Time: 06-07-2015, 02:10:06.901 PM UUID: cb24f1ac-46a4-494d-9780-64576f0f0dba Ancestors: PetitCompiler-Benchmarks-JanKurs.11, PetitCompiler-Benchmarks-JanVrany.e29bd90f388e.20150619081300

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

"{ NameSpace: Smalltalk }"

TestCase subclass:#PEGFsaScannerIntegrationTest
	instanceVariableNames:'fsa fsaGenerator parser scanner result compiled'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Tests-Scanner'
!

!PEGFsaScannerIntegrationTest methodsFor:'as yet unclassified'!

compile
    | ppcTree |
    compiled ifTrue: [ ^ self ].
    ppcTree := parser asCompilerTree.
    fsa := ppcTree asFsa.
    fsa name: #nextToken.
    fsa finalStates do: [ :s | s isFailure ifFalse: [s retval: #token ]].

    scanner := ((PPCScannerCodeGenerator new)
        generate: fsa).

    compiled := true
!

failScan: stream
    self compile.

    scanner initialize.
    scanner stream: stream asPetitStream. 
    result := scanner nextToken.
        
    self assert: result isEmpty
!

scan: stream token: token
    self scan: stream token: token position: stream size.
!

scan: stream token: token position: position
    self compile.

    scanner initialize.
    scanner stream: stream asPetitStream. 
    result := scanner nextToken.
        
    self assert: result isCollection description: 'no collection returned as a result!!'.
    self assert: (result isEmpty not) description: 'no token found'.
    self assert: (result at: token) = position.
!

setUp
    compiled := false.
    fsaGenerator := PEGFsaGenerator new.
!

testA
    parser := 'a' asParser.
    
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self failScan: ''.
    self failScan: 'b'.

    self scan: 'a' token: #token position: 1.
    self scan: 'aaa' token: #token position: 1.
!

testAAA_Aplusnot
    parser := 'aaa' asParser not, $a asParser plus.
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	

    self scan: 'a' token: #token.
    self scan: 'aa' token: #token.

    self failScan: ''.
    self failScan: 'aaa'.
    self failScan: 'aaaa'.
    self failScan: 'aaaaa'.
!

testAAplus_A
    parser := 'aa' asParser plus, $a asParser.
    
    self scan: 'aaa' token: #token.
    self scan: 'aaaaa' token: #token.

    self failScan: 'a'.
    self failScan: 'aa'.
    self failScan: 'aaaa'.
!

testAAplus_B
    parser := 'aa' asParser plus, $b asParser.
    
    self scan: 'aab' token: #token.
    self scan: 'aaaab' token: #token.

    self failScan: 'ab'.
    self failScan: 'aaab'.
    self failScan: 'aac'.
!

testAAstar_A
    parser := 'aa' asParser star, $a asParser.
    
    self scan: 'a' token: #token.
    self scan: 'aaa' token: #token.
    self scan: 'aaaaa' token: #token.
    self scan: 'aaaaaaa' token: #token.


    self failScan: 'aa'.
    self failScan: 'aaaa'.
!

testAAstar_B
    parser := 'aa' asParser star, $b asParser.
    
    self scan: 'b' token: #token.
    self scan: 'aab' token: #token.
    self scan: 'aaaab' token: #token.
    self scan: 'aaaaaab' token: #token.


    self failScan: 'ab'.
    self failScan: 'aaa'.
!

testAB
    parser := 'ab' asParser.
    
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self failScan: ''.
    self failScan: 'b'.

    self scan: 'ab' token: #token position: 2.
    self scan: 'aba' token: #token position: 2.
!

testA_BCorCD_D
    parser := $a asParser, ('bc' asParser / 'cd' asParser), $d asParser.
    
    self scan: 'abcd' token: #token.
    self scan: 'acdd' token: #token.

    self failScan: 'abdd'.
    self failScan: 'ad'.
    self failScan: 'aacd'.
!

testA_BCorCDplus_D
    parser := $a asParser, ('bc' asParser / 'cd' asParser) plus, $d asParser.
    
    self scan: 'abcd' token: #token.
    self scan: 'acdd' token: #token.
    self scan: 'abcbccdd' token: #token.
    self scan: 'acdcdbcbcd' token: #token.

    self failScan: 'abdd'.
    self failScan: 'ad'.
    self failScan: 'abcccd'.
!

testA_BCorCDstar_D
    parser := $a asParser, ('bc' asParser / 'cd' asParser) star, $d asParser.
    
    self scan: 'ad' token: #token.
    self scan: 'abcd' token: #token.
    self scan: 'acdd' token: #token.
    self scan: 'abcbccdd' token: #token.
    self scan: 'acdcdbcbcd' token: #token.

    self failScan: 'abdd'.
    self failScan: 'abcccd'.
!

testA_Bnot
    parser := 'a' asParser, $b asParser not.
    
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self failScan: 'ab'.
    self failScan: 'bb'.

    self scan: 'a' token: #token position: 1.
    self scan: 'ac' token: #token position: 1.
!

testA_Boptional
    parser := $a asParser, $b asParser optional.
    
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self failScan: ''.
    self failScan: 'b'.

    self scan: 'ab' token: #token position: 2.
    self scan: 'ac' token: #token position: 1.
    self scan: 'a' token: #token position: 1.
!

testA_BorC_D
    parser := $a asParser, ($b asParser / $c asParser), $d asParser.
    
    self scan: 'abd' token: #token.
    self scan: 'acd' token: #token.

    self failScan: 'a'.
    self failScan: 'abc'.
    self failScan: 'add'.
!

testA_BorCplus_D
    parser := $a asParser, ($b asParser / $c asParser) plus, $d asParser.
    
    self scan: 'abd' token: #token.
    self scan: 'acd' token: #token.
    self scan: 'abcbcd' token: #token.
    self scan: 'acbcbcd' token: #token.

    self failScan: 'a'.
    self failScan: 'ad'.
    self failScan: 'abc'.
    self failScan: 'aad'.
!

testA_BorCstar_D
    parser := $a asParser, ($b asParser / $c asParser) star, $d asParser.
    
    self scan: 'ad' token: #token.
    self scan: 'abd' token: #token.
    self scan: 'acd' token: #token.
    self scan: 'abcbcd' token: #token.
    self scan: 'acbcbcd' token: #token.

    self failScan: 'a'.
    self failScan: 'abc'.
    self failScan: 'aad'.
!

testAorAA
    parser := 'a' asParser / 'aa' asParser.
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self failScan: ''.
    self failScan: 'b'.

    self scan: 'aa' token: #token position: 1.
    self scan: 'a' token: #token position: 1.
!

testAorAX_X
    parser := ('a' asParser / 'ax' asParser), $x asParser.
    
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self scan: 'ax' token: #token position: 2.
    self scan: 'axx' token: #token position: 2.	

    self failScan: 'a'.
    self failScan: 'x'.
    self failScan: ''.		
!

testAorB
    parser := $a asParser / $b asParser.
    
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self failScan: ''.
    self failScan: 'c'.

    self scan: 'aa' token: #token position: 1.
    self scan: 'bb' token: #token position: 1.
!

testAplus_B
    parser := $a asParser plus, $b asParser.
    
    self scan: 'ab' token: #token.
    self scan: 'aab' token: #token.
    self scan: 'aaab' token: #token.

    self failScan: 'b'.
    self failScan: 'ac'.
!

testAstar_A
    parser := $a asParser star, $a asParser.
    
    self failScan: 'a'.
    self failScan: 'aa'.
    self failScan: 'ac'.
!

testAstar_B
    parser := $a asParser star, $b asParser.
    
    self scan: 'b' token: #token.
    self scan: 'ab' token: #token.
    self scan: 'aab' token: #token.

    self failScan: ''.
    self failScan: 'ac'.
!

testAstar_Bnot
    parser := 'a' asParser star, $b asParser not.
    
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self failScan: 'aaab'.
    self failScan: 'b'.

    self scan: '' token: #token position: 0.
    self scan: 'a' token: #token position: 1.
    self scan: 'aac' token: #token position: 2.
    self scan: 'aaaac' token: #token position: 4.
!

testFoo
    parser := 'foo' asParser.
    
    self scan: 'foo' token: #token.
    self scan: 'foobar' token: #token position: 3.

    self failScan: 'bar'.
    self failScan: 'fo'.
!

testNumber
    parser := #digit asParser plus.
    
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	
    
    self failScan: ''.
    self failScan: 'b'.

    self scan: '12' token: #token position: 2.
    self scan: '2312' token: #token position: 4.
!

testSmalltalkIdentifier
    parser := #letter asParser, #word asParser star, $: asParser not.
    self compile.

    self assert: fsa isDeterministic.
    self assert: fsa isWithoutEpsilons.	

    self scan: 'a' token: #token.
    self scan: 'hithere' token: #token.
    self scan: 'hi123' token: #token.

    self failScan: ''.
    self failScan: 'aaa:'.
    self failScan: '123'.	
! !