compiler/tests/PEGFsaScannerIntegrationTest.st
changeset 502 1e45d3c96ec5
child 515 b5316ef15274
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/compiler/tests/PEGFsaScannerIntegrationTest.st	Fri Jul 24 15:06:54 2015 +0100
@@ -0,0 +1,392 @@
+"{ 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'.	
+! !
+