compiler/tests/PPCCompilerTest.st
changeset 438 20598d7ce9fa
parent 422 116d2b2af905
child 452 9f4558b3be66
--- a/compiler/tests/PPCCompilerTest.st	Tue Apr 21 17:20:11 2015 +0100
+++ b/compiler/tests/PPCCompilerTest.st	Thu Apr 30 23:43:14 2015 +0200
@@ -3,57 +3,32 @@
 "{ NameSpace: Smalltalk }"
 
 PPAbstractParserTest subclass:#PPCCompilerTest
-	instanceVariableNames:'parser result context'
+	instanceVariableNames:'parser result context node compiler id node2 id2 id1 node1 node3
+		arguments configuration'
 	classVariableNames:''
 	poolDictionaries:''
 	category:'PetitCompiler-Tests-Core'
 !
 
 
-!PPCCompilerTest methodsFor:'context'!
-
-context	
-	^ context := PPCProfilingContext new
-! !
-
-!PPCCompilerTest methodsFor:'test support'!
+!PPCCompilerTest methodsFor:'as yet unclassified'!
 
 assert: p parse: whatever
 	^ result := super assert: p parse: whatever.
 !
 
-compile: aPPParser
-	| compiler |
-	compiler := PPCCompiler new.
-	compiler profile: true.
-	^ (compiler compile: aPPParser as: #PPGeneratedParser) new.
-!
-
-compile: aPPParser params: params
-	| compiler |
-	compiler := PPCCompiler new.
-	compiler profile: true.
-	^ (compiler compile: aPPParser as: #PPGeneratedParser params: params) new.
+context	
+	^ context := PPCProfilingContext new
 !
 
-compileInlining: aPPParser
-	| compiler |
-	compiler := PPCCompiler new.
-	compiler inlining: true.
-	compiler profile: true.
-	^ (compiler compile: aPPParser as: #PPGeneratedParser) new.
-!
-
-compileTree: tree params: params
-	| compiler mock |
-	compiler := PPCCompiler new.
-	compiler profile: true.
-	mock := nil asParser.
-	^ (compiler compileTree: tree as: #PPGeneratedParser parser: mock params: params) new.
-!
-
-parse: whatever
-	^ result := super parse: whatever.
+setUp
+	arguments := PPCArguments default
+		profile: true;
+		yourself.
+		
+	configuration := PPCFirstPrototype new
+		arguments: arguments;
+		yourself.
 !
 
 tearDown
@@ -65,462 +40,6 @@
 	].
 ! !
 
-!PPCCompilerTest methodsFor:'tests - compiling'!
-
-testCompileAnd
-	parser := #digit asParser and compile.
-	
-	self assert: parser parse: '1' to: $1 end: 0.
-	self assert: parser fail: 'a'.
-	self assert: parser fail: ''.
-
-	parser := ('foo' asParser, ($: asParser and)) compile.
-	self assert: parser parse: 'foo:' to: { 'foo'. $: } end: 3.
-!
-
-testCompileAny
-	parser := #any asParser compile.
-	
-	self assert: parser parse: 'a' to: $a.
-	self assert: parser parse: '_' to: $_.
-	self assert: parser parse: '
-' to: Character cr.
-!
-
-testCompileAnyStar
-	parser := #any asParser star compile.
-	
-	self assert: parser parse: 'aaa' to: { $a. $a . $a }.
-	self assert: parser parse: '' to: { }.
-	
-!
-
-testCompileBlock
-	parser := (#letter asParser) plus ==> [ :res | res collect: [:each | each asUppercase ]].
-	parser := parser compile.
-	
-	self assert: parser parse: 'foo' to: { $F . $O . $O}.
-	self assert: parser parse: 'bar' to: { $B . $A . $R}.
-	self assert: parser fail: ''.
-!
-
-testCompileCharacter
-	parser := $a asParser compile.
-	
-	self assert: parser parse: 'a'  to: $a.
-	self assert: parser fail: 'b'.
-
-	parser := $# asParser compile.
-	self assert: parser parse: '#'.
-!
-
-testCompileChoice
-	parser := (#digit asParser / #letter asParser) compile.
-	
-	self assert: parser parse: '1' to: $1.
-	self assert: parser parse: 'a' to: $a.
-	self assert: parser fail: '_'.
-	
-!
-
-testCompileLiteral
-	parser := 'foo' asParser compile.
-	
-	self assert: parser parse: 'foo'  to: 'foo'.
-	self assert: parser parse: 'foobar'  to: 'foo' end: 3.
-	self assert: parser fail: 'boo'.
-	
-	parser := '#[' asParser compile.
-	self assert: parser parse: '#[1]' to: '#[' end: 2.
-!
-
-testCompileLiteral2
-	| quote |
-	quote := '''' asParser.
-	parser := (quote, $a asParser )compile: #PPCompilerTest.	
-	self assert: parser parse: '''a'  to: {'''' . $a}.	
-!
-
-testCompileNegate
-	parser := #letter asParser negate star, #letter asParser.
-	parser := parser compile.
-	
-	self assert: parser parse: '...a' to: { { $. . $. . $. } . $a }.
-	self assert: parser parse: 'aaa' to: { {} . $a } end: 1.
-	self assert: parser fail: '...'.
-!
-
-testCompileNil
-	parser := nil asParser compile.
-	
-	self assert: parser parse: 'a' to: nil end: 0.
-	self assert: parser parse: '' to: nil end: 0.
-	
-	parser := nil asParser, 'foo' asParser.
-	self assert: parser parse: 'foo' to: { nil . 'foo' }
-!
-
-testCompileNot
-	parser := #digit asParser not compile.
-	
-	self assert: parser parse: 'a' to: nil end: 0.
-	self assert: parser fail: '1'.
-	self assert: parser parse: '' to: nil end: 0.
-
-	parser := 'foo' asParser, $: asParser not.
-	parser := parser compile: #PPCompilerTest.	
-	self assert: parser parse: 'foo' to: { 'foo'. nil } end: 3.
-	
-	parser := 'foo' asParser, $: asParser not, 'bar' asParser.
-	parser := parser compile: #PPCompilerTest.	
-	self assert: parser parse: 'foobar' to: { 'foo'. nil . 'bar' } end: 6.
-!
-
-testCompileNot2
-	parser := ($a asParser, $b asParser) not compile.
-		
-	self assert: parser parse: '' to: nil end: 0.
-	self assert: parser parse: 'a' to: nil end: 0.
-	self assert: parser parse: 'aa' to: nil end: 0.
-	self assert: parser fail: 'ab'.
-!
-
-testCompileNot3
-	parser := ('foo' asParser not, 'fee' asParser) compile.
-		
-	self assert: parser parse: 'fee' to: #(nil 'fee').
-	self assert: parser fail: 'foo'.
-!
-
-testCompileNotLiteral
-	parser := 'foo' asParser not compile.
-	self assert: parser class methodDictionary size = 2.
-
-	self assert: parser parse: 'bar' to: nil end: 0.
-		
-	self assert: parser fail: 'foo'.
-	self assert: parser parse: '' to: nil end: 0.
-
-	parser := '''' asParser not compile.
-	self assert: parser class methodDictionary size = 2.
-
-	self assert: parser parse: 'a' to: nil end: 0.
-	self assert: parser fail: ''''.
-	self assert: parser parse: '' to: nil end: 0.
-
-
-	parser := ('foo' asParser, 'bar' asParser not) compile.
-	self assert: parser parse: 'foofoo' to: { 'foo'. nil } end: 3.
-	
-	parser := ('foo' asParser, 'foo' asParser not, #any asParser star) compile.
-	self assert: parser parse: 'foobar' to: { 'foo'. nil . #($b $a $r) } end: 6.
-	self assert: parser fail: 'foofoo'.
-!
-
-testCompileOptional
-	parser := #digit asParser optional compile.
-	
-	self assert: parser parse: '1' to: $1.
-	self assert: parser parse: 'a' to: nil end: 0.
-	self assert: parser class parsers isEmpty.
-	
-	parser := (#digit asParser optional, #letter asParser) compile.
-	self assert: parser parse: '1a' to: { $1 . $a }.
-	self assert: parser parse: 'a' to: { nil . $a }.
-	self assert: parser class parsers isEmpty.
-!
-
-testCompilePlus
-	parser := #letter asParser plus compile: #PPCompilerTest.
-	
-	self assert: parser parse: 'lorem' to: {$l. $o. $r. $e. $m} .
-	self assert: parser parse: 'a123' to: {$a} end: 1.
-	self assert: parser parse: 'ab123' to: {$a . $b} end: 2.
-
-	self assert: parser fail: ''.
-	self assert: parser fail: '123'.
-!
-
-testCompilePredicate
-	parser := #digit asParser compile.
-	
-	self assert: parser parse: '1' to: $1.
-	self assert: parser parse: '0' to: $0.
-	self assert: parser fail: 'a'.
-!
-
-testCompilePredicate2
-	parser := #space asParser compile.
-	
-	self assert: parser parse: ' ' to: Character space.
-	self assert: parser fail: 'a'.
-!
-
-testCompileSequence
-	parser := (#digit asParser, #letter asParser) compile.
-	
-	self assert: parser parse: '1a' to: {$1 .$a}.
-	
-	
-!
-
-testCompileSequence2
-	parser := (#digit asParser, #space asParser, #letter asParser) compile: #PPCompilerTest.
-	
-	self assert: parser parse: '9 c' to: {$9 . Character space. $c }.	
-	self assert: parser fail: '9c'.
-	
-!
-
-testCompileSequence3
-	parser := (#any asParser, #any asParser, #any asParser) compile.
-	
-	self assert: parser parse: 'foo' to: #($f $o $o).	
-	self assert: parser fail: 'fo'.
-	
-!
-
-testCompileStar
-	parser := #letter asParser star compile.
-	
-	self assert: parser parse: 'lorem' to: {$l. $o. $r. $e. $m} .
-	self assert: parser parse: '' to: {}.
-	self assert: parser parse: '123' to: {} end: 0.
-	self assert: parser parse: 'ab123' to: {$a . $b} end: 2.
-!
-
-testCompileStarLiteral
-	parser := 'foo' asParser star compile.
-	
-	self assert: parser parse: 'foo' to: #('foo' ) .
-	self assert: parser parse: 'foofoo' to: #('foo' 'foo') .
-	self assert: parser parse: 'foofoofoo' to: #('foo' 'foo' 'foo') .
-	self assert: parser parse: '' to: #().
-	self assert: parser parse: 'bar' to: #() end: 0.
-!
-
-testCompileStarPredicate
-	parser := #letter asParser star compile.
-	
-	self assert: parser parse: 'foo' to: #($f $o $o ) .
-	self assert: parser parse: '' to: #().
-	self assert: parser parse: '123' to: #() end: 0.
-!
-
-testCompileSymbolBlock
-	parser := (#letter asParser) plus ==> #second.
-	parser := parser compile.
-	
-	self assert: parser parse: 'foo' to: $o.
-	self assert: parser parse: 'bar' to: $a.
-	self assert: parser fail: ''.
-	self should: [ parser parse: 'f' ] raise: Error.
-!
-
-testCompileTrimmingToken
-	| token1 token2 |
-	token1 := (#letter asParser) plus trimmingToken.
-	token2 := (#letter asParser) plus trimmingToken.
-	
-	parser := (token1, token2) compile.
-	
-	self assert: parser parse: 'foo bar'.
-	self assert: parser parse: ' foo bar '.
-!
-
-testCompileTrimmingToken2
-	| token1 token2 |
-	token1 := (#letter asParser) plus trimmingToken.
-	token2 := (#letter asParser) plus trimmingToken / 'foo' asParser trimmingToken.
-	
-	parser := (token1, token2) compile.
-	
-	self assert: parser parse: 'foo bar'.
-	self assert: parser parse: ' foo bar '.
-!
-
-testTrim
-	parser := self compile: $a asParser trim.
-	
-	self assert: parser fail: ''.
-	self assert: parser parse: 'a' to: $a.
-	self assert: parser parse: '   a' to: $a.
-	self assert: parser parse: 'a    ' to: $a.
-	self assert: parser parse: '  a    ' to: $a.
-! !
-
-!PPCCompilerTest methodsFor:'tests - extra'!
-
-testCompileSmalltalkToken
-	parser := (#letter asParser, ((#letter asParser / #digit asParser) star)) smalltalkToken compile.
-	
-	self assert: parser parse: 'foo'.
-	self assert: result inputValue = 'foo'.
-	self assert: parser parse: 'a'.
-	self assert: result inputValue = 'a'.
-	self assert: parser parse: 'f123a'.
-	self assert: result inputValue = 'f123a'.
-	
-	self assert: parser fail: ''.
-	self assert: parser fail: '12'.
-
-	self assert: parser parse: ' "comment" foo'.
-	self assert: result inputValue = 'foo'.
-	
-	self assert: parser parse: ' "comment" bar "another comment" '.
-	self assert: result inputValue = 'bar'.
-	self assert: parser parse: '
-		"b"
-		"b"
-		foo
-		"and yet, another comment"
-
-		"one more to make sure :)"
-	'.
-	self assert: result inputValue = 'foo'.
-!
-
-testCycle
-	| p1 block |
-	
-	p1 := PPDelegateParser new.
-	block := ${ asParser, p1, $} asParser / nil asParser.
-	p1 setParser: block.
-	
-	parser := block compile.
-	self assert: parser parse: '{}' to: { ${. nil . $} }.
-	self assert: parser parse: '{{}}' to: { ${. { ${ . nil . $} } . $} }.
-	
-!
-
-testSmalltalkToken
-	parser := (#letter asParser, (#digit asParser / #letter asParser) star) smalltalkToken compileWithParameters: {#profile -> true}.
-	
-	self assert: parser class methodDictionary size = 6.
-	self assert: parser parse: 'foo'.
-	self assert: result inputValue = 'foo'.
-	self assert: context invocationCount = 9.
-	self assert: context rememberCount = 0.
-	self assert: context lwRememberCount = 1.
-	self assert: context lwRestoreCount = 0.	
-!
-
-testSmalltalkToken2
-	|id|
-	id := (#letter asParser, (#digit asParser / #letter asParser) star)
-		name: 'identifier';
-		yourself.
-		
-	parser := (id wrapped, $: asParser) smalltalkToken 
-		name: 'kw';
-		yourself.
-	
-	parser := parser compileWithParameters: {#profile -> true}.
-	
-	self assert: parser parse: 'foo:'.
-	self assert: result inputValue = 'foo:'.
-!
-
-testToken
-	parser := (#letter asParser, (#digit asParser / #letter asParser) star) flatten compile.
-	
-	self assert: parser parse: 'foo' to: 'foo'.
-	self assert: parser parse: 'a' to: 'a'.
-	self assert: parser parse: 'f123a' to: 'f123a'.
-	self assert: parser fail: ''.
-!
-
-testToken2
-	parser := (#letter asParser, (#digit asParser / #letter asParser) star) token compileWithParameters: {#profile -> true}.
-	
-	self assert: parser class methodDictionary size = 5.
-	self assert: parser parse: 'foo'.
-	self assert: result inputValue = 'foo'.
-	self assert: context invocationCount = 7.
-	self assert: context rememberCount = 0.
-	self assert: context lwRememberCount = 1.
-	self assert: context lwRestoreCount = 0.	
-!
-
-testTrimmingToken
-	parser := (#letter asParser, (#digit asParser / #letter asParser) star) trimmingToken compileWithParameters: { #profile -> true }.
-
-	self assert: parser class methodDictionary size = 5.
-
-	self assert: parser parse: 'foo'.
-	self assert: result inputValue = 'foo'.
-
-	self assert: context invocationCount = 7.
-	self assert: context rememberCount = 0.
-	self assert: context lwRememberCount = 1.
-	self assert: context lwRestoreCount = 0.	
-
-	self assert: parser parse: ' foo '.
-	self assert: result inputValue = 'foo'.
-
-
-
-	self assert: parser fail: '123'.
-
-	self assert: context invocationCount = 2.
-	self assert: context rememberCount = 0.
-	self assert: context lwRememberCount = 0.
-	self assert: context lwRestoreCount = 0.	
-
-
-	self assert: parser fail: ''.
-!
-
-testTrimmingTokenNested
-	| identifier kw |
-	kw := 'false' asParser trimmingToken name: #kw.
-	identifier := (kw not, (#letter asParser, #word asParser star)) trimmingToken name: #identifier.
-	
-	parser := identifier / kw.
-	parser := parser compileWithParameters: { #profile -> true }.
-	self assert: parser class methodDictionary size = 6.
-
-	self assert: parser parse: 'foo'.
-	self assert: result inputValue = 'foo'.
-
-	self assert: parser parse: 'false'.
-	self assert: result inputValue = 'false'.
-!
-
-testTrimmingTokenNested2
-	| identifier kw |
-	kw := 'false' asParser trimmingToken name: #kw.
-	identifier := (kw not, (#letter asParser, #word asParser star)) trimmingToken name: #identifier.
-	
-	parser := identifier / kw.
-	parser := parser compileWithParameters: { #profile -> true }.
-	self assert: parser class methodDictionary size = 6.
-
-	self assert: parser parse: 'foo'.
-	self assert: result inputValue = 'foo'.
-
-	self assert: parser parse: 'false'.
-	self assert: result inputValue = 'false'.
-!
-
-testTrimmingTokenNested3
-	| identifier kw |
-	kw := ('false' asParser, #word asParser not) trimmingToken name: #kw.
-	identifier := (kw not, (#letter asParser, #word asParser star)) trimmingToken name: #identifier.
-	
-	parser := identifier / kw.
-	parser := parser compileWithParameters: { #profile -> true }.
-	self assert: parser class methodDictionary size = 9.
-	self assert: (parser class methods anySatisfy: [ :m | m selector = #kw ]).
-	self assert: (parser class methods anySatisfy: [ :m | m selector = #kw_fast ]).
-
-	self assert: parser parse: 'foo'.
-	self assert: result inputValue = 'foo'.
-
-	self assert: parser parse: 'false'.
-	self assert: result inputValue = 'false'.
-! !
-
 !PPCCompilerTest methodsFor:'tests - first set'!
 
 testFirstSetSuchThat
@@ -569,7 +88,7 @@
 
 testChoiceGuard
 	parser := ('foo' asParser trimmingToken / 'bar' asParser trimmingToken / $d asParser trimmingToken plus) 
-		compileWithParameters: {#profile -> true}.
+		compileWithConfiguration: configuration.
 	
 	self assert: parser parse: 'foo'.
 	self assert: result inputValue = 'foo'.	
@@ -594,7 +113,7 @@
 
 testEmptyChoiceGuard
 	parser := ('foo' asParser trimmingToken / 'bar' asParser trimmingToken / $d asParser trimmingToken star) 
-		compileWithParameters: {#profile -> true}.
+		compileWithConfiguration: configuration.
 	
 	self assert: parser parse: 'foo'.
 	self assert: result inputValue = 'foo'.	
@@ -614,7 +133,8 @@
 !
 
 testGuardSmalltlakToken
-	parser := (#letter asParser, #word asParser star) smalltalkToken compileWithParameters: { #profile -> true }.
+	parser := (#letter asParser, #word asParser star) smalltalkToken compileWithConfiguration: configuration.
+	
 	self assert: parser parse: 'bar'.
 	self assert: (context invocations anySatisfy: [ :e | e beginsWith: 'seq' ]).
 	
@@ -623,7 +143,7 @@
 !
 
 testSequenceGuard
-	parser := ((#any asParser, #any asParser) wrapped, (#any asParser, #any asParser)) compile.
+	parser := ((#any asParser, #any asParser) wrapped, (#any asParser, #any asParser)) compileWithConfiguration: configuration.
 	
 	self assert: parser parse: 'fooo' to: #(#($f $o) #($o $o)).	
 	self assert: parser parse: 'fo oo' to: #(#($f $o) #($  $o)) end: 4.	
@@ -632,12 +152,81 @@
 !
 
 testTrimmerGuard
-	parser := $a asParser trim, $b asParser compile: #PPGeneratedParser parameters: { #profile -> true }.
+	parser := $a asParser trim, $b asParser compileWithConfiguration: configuration.
 	
 	self assert: parser parse: 'ab'.
 	self assert: parser parse: ' ab'.
 ! !
 
+!PPCCompilerTest methodsFor:'tests - ids'!
+
+testId1
+	node := PPCNode new
+		name: 'foo'.
+	compiler := PPCCompiler new.
+	
+	id := compiler idFor: node.
+	
+	self assert: compiler ids size = 1.
+	self assert: id = 'foo'.
+!
+
+testId2
+	node1 := PPCNode new
+		name: 'foo'.
+	
+	node2 := PPCNode new
+		name: 'foo'.
+	compiler := PPCCompiler new.
+
+	id1 := compiler idFor: node1.
+	self assert: compiler ids size = 1.
+	self assert: id1 = 'foo'.
+	
+	id2 := compiler idFor: node2.
+	self assert: compiler ids size = 2.
+	self assert: id2 = 'foo_1'.	
+			
+	self assert: (id1 = id2) not.
+!
+
+testId3
+	node1 := PPCNode new
+		name: 'foo'.
+	
+	node2 := node1.
+	compiler := PPCCompiler new.
+		
+	id1 := compiler idFor: node1.
+	self assert: compiler ids size = 1.
+	self assert: id1 = 'foo'.
+	
+	id2 := compiler idFor: node2.
+	self assert: compiler ids size = 1.
+	self assert: id2 = 'foo'.	
+			
+	self assert: (id1 == id2).
+!
+
+testId4
+	node1 := PPCNode new
+		name: 'foo+='.
+	
+	node2 := PPCNode new
+		name: 'foo+='.
+	compiler := PPCCompiler new.
+		
+	id1 := compiler idFor: node1.
+	self assert: compiler ids size = 1.
+	self assert: id1 = 'foo'.
+	
+	id2 := compiler idFor: node2.
+	self assert: compiler ids size = 2.
+	self assert: id2 = 'foo_1'.	
+			
+	self assert: (id1 = id2) not.
+! !
+
 !PPCCompilerTest class methodsFor:'documentation'!
 
 version_HG