--- /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'.
+! !
+