compiler/tests/PPCTokenDetectorTest.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 30 Apr 2015 23:43:14 +0200
changeset 438 20598d7ce9fa
child 452 9f4558b3be66
permissions -rw-r--r--
Updated to PetitCompiler-JanKurs.100, PetitCompiler-Tests-JanKurs.44 and PetitCompiler-Benchmarks-JanKurs.4 Name: PetitCompiler-JanKurs.100 Author: JanKurs Time: 30-04-2015, 10:48:52.165 AM UUID: 80196870-5921-46d9-ac20-a43bf5c2f3c2 Name: PetitCompiler-Tests-JanKurs.44 Author: JanKurs Time: 30-04-2015, 10:49:22.489 AM UUID: 348c02e8-18ce-48f6-885d-fcff4516a298 Name: PetitCompiler-Benchmarks-JanKurs.4 Author: JanKurs Time: 30-04-2015, 10:58:44.890 AM UUID: 18cadb42-f9ef-45fb-82e9-8469ade56c8b

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

"{ NameSpace: Smalltalk }"

TestCase subclass:#PPCTokenDetectorTest
	instanceVariableNames:'node result visitor'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Tests-Visitors'
!

!PPCTokenDetectorTest methodsFor:'as yet unclassified'!

assert: object type: class
	self assert: object class == class
!

setUp
	visitor := PPCTokenDetector new.
!

testActionNode
	| seq characterNode1 characterNode2 tokenNode |
	characterNode1 := PPCCharacterNode new.
	characterNode2 := PPCCharacterNode new.
	
	seq := PPCSequenceNode new
		children: { characterNode1 . characterNode1 };
		yourself.
	tokenNode := PPCTokenNode new
		child: seq;
		yourself.
		
	node := PPCActionNode new
		child: tokenNode;
		yourself.
	
		
	result := visitor visit: node.
	
	self assert: result type: PPCActionNode.
	self assert: result child type: PPCTokenNode.	
	self assert: result child child type: PPCTokenSequenceNode.	

	self assert: result == node.
	self assert: (result child child firstChild == characterNode1) not.
	self assert: (result child child firstChild = characterNode1).
	self assert: (result child child secondChild == characterNode1) not.
	self assert: (result child child secondChild = characterNode1).
	
!

testNestedTrimmingToken
	| characterNode token ws seq trimmingToken |
	characterNode := PPCCharacterNode new.
	token := PPCTokenNode new 
		child: characterNode;
		tokenClass: #foo;
		yourself.
	ws := PPCSentinelNode new.
	seq := PPCSequenceNode new
		children: { ws . token . ws };
		yourself.
	trimmingToken := PPCActionNode new
		child: seq;
		propertyAt: #trimmingToken put: true;
		yourself.

	node := PPCSequenceNode new
		children: { characterNode . trimmingToken  };
		yourself.
	
	result := visitor visit: node.
	
	self assert: result type: PPCSequenceNode.
	self assert: result firstChild == characterNode.
	
	self assert: result secondChild type: PPCTrimmingTokenNode.	
	self assert: result secondChild child = characterNode.	
	self assert: (result secondChild child == characterNode) not.		
!

testNestedTrimmingToken2
	| characterNode token1 ws seq1 seq2 seqWithToken trimmingToken1 token2 |
	characterNode := PPCCharacterNode new.
	ws := PPCSentinelNode new.

	token1 := PPCTokenNode new 
		child: characterNode;
		tokenClass: #foo;
		yourself.
	seq1 := PPCSequenceNode new
		children: { ws . token1 . ws };
		yourself.
	trimmingToken1 := PPCActionNode new
		child: seq1;
		propertyAt: #trimmingToken put: true;
		yourself.
	
	seqWithToken := PPCSequenceNode new
		children: { characterNode . trimmingToken1  };
		yourself.
	
	token2 := PPCTokenNode new 
		child: seqWithToken;
		tokenClass: #bar;
		yourself.
	seq2 := PPCSequenceNode new
		children: { ws . token2 . ws };
		yourself.		
	node := PPCActionNode new
		child: seq2;
		propertyAt: #trimmingToken put: true;
		yourself.
	result := visitor visit: node.
	
	self assert: result type: PPCTrimmingTokenNode .
	self assert: result child type: PPCTokenSequenceNode.
!

testNestedTrimmingToken3
	|         trueToken falseToken booleanLiteral literal abc notBoolean id idSeq javaToken resultId resultBooleanLiteral resultIdBooleanLiteral |
	"
	 This USE case is based on JavaToken
	
	 javaToken := id / literal
	 id := (not booleanLiteral, 'abc') token
	 literal := booleanLiteral
	 booleanLiteral := 'true' token / 'false' token
	"
	trueToken := 'true' asParser token asCompilerTree.
	falseToken := 'false' asParser token asCompilerTree.
	abc := 'abc' asParser asCompilerTree.
	
	booleanLiteral := PPCChoiceNode new
		children: { trueToken . falseToken }; yourself.

	literal := PPCForwardNode new
		name: #literal;
		child: booleanLiteral; yourself.
	notBoolean := PPCNotNode new
		child: booleanLiteral; yourself.
	idSeq := PPCSequenceNode new
		children: { notBoolean . abc }; yourself.
	id := PPCTokenNode new
		child: idSeq; yourself.
	javaToken := PPCChoiceNode new
		children: { id . literal }; yourself.
		
	result := visitor visit: javaToken.	
	resultId := result firstChild.
	resultBooleanLiteral := result secondChild child.	
	resultIdBooleanLiteral := resultId child firstChild  child.	
		
		
		
	self assert: result type: PPCChoiceNode.
	self assert: resultId type: PPCTokenNode.
	self assert: resultBooleanLiteral type: PPCChoiceNode.
	
	self assert: resultIdBooleanLiteral firstChild type: PPCLiteralNode.
	self assert: resultIdBooleanLiteral secondChild type: PPCLiteralNode.
	
	self assert: resultBooleanLiteral firstChild type: PPCTokenNode.
	self assert: resultBooleanLiteral secondChild type: PPCTokenNode.
	
	
!

testNodeCopy
	| nilNode forwardNode |
	nilNode := PPCNilNode new.
	forwardNode := PPCForwardNode new
		child: nilNode;
		yourself.
	node := PPCTokenNode new
		child: forwardNode;
		yourself.
	
	result := visitor visit: node.
	
	self assert: (result == node).
	self assert: result child = forwardNode.
	self assert: (result child == forwardNode) not.
	self assert: (result child child = nilNode).
	self assert: (result child child == nilNode) not.
!

testTokenSequence1
	| seq characterNode1 characterNode2 |
	characterNode1 := PPCCharacterNode new.
	characterNode2 := PPCCharacterNode new.
	
	seq := PPCSequenceNode new
		children: { characterNode1 . characterNode1 };
		yourself.
	node := PPCTokenNode new
		child: seq;
		yourself.
	
		
	result := visitor visit: node.
	
	self assert: result type: PPCTokenNode.
	self assert: result child type: PPCTokenSequenceNode.	

	self assert: result == node.
	self assert: (result child firstChild == characterNode1) not.
	self assert: (result child firstChild = characterNode1).
	self assert: (result child secondChild == characterNode1) not.
	self assert: (result child secondChild = characterNode1).
	
!

testTrimmingToken
	| seq characterNode ws token |
	characterNode := PPCCharacterNode new.
	token := PPCTokenNode new 
		child: characterNode;
		tokenClass: #foo;
		yourself.
	ws := PPCSentinelNode new.
	
	seq := PPCSequenceNode new
		children: { ws . token . ws };
		yourself.
	node := PPCActionNode new
		child: seq;
		propertyAt: #trimmingToken put: true;
		yourself.
		
	result := visitor visit: node.
	
	self assert: result type: PPCTrimmingTokenNode.
	self assert: result child type: PPCCharacterNode.
	self assert: result child = characterNode.
	self assert: (result child == characterNode) not.	
! !