compiler/tests/PPCTokenVisitorTest.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 30 Apr 2015 23:43:14 +0200
changeset 438 20598d7ce9fa
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:#PPCTokenVisitorTest
	instanceVariableNames:'node result visitor'
	classVariableNames:''
	poolDictionaries:''
	category:'PetitCompiler-Tests-Visitors'
!

!PPCTokenVisitorTest methodsFor:'as yet unclassified'!

asNode: aPPParser
	self error: 'deprecated'.
	^ aPPParser asCompilerTree
!

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

setUp
	visitor := PPCTokenVisitor new.
!

testAction
	| letterNode |
	letterNode := PPCMessagePredicateNode new
		message: #isLetter;
		yourself.
	
	node := PPCActionNode new
		block: [ :nodes | #foo ];
		child: letterNode;
		yourself.
		
	result := visitor visit: node.
	self assert: result type: PPCMessagePredicateNode.
	self assert: result = letterNode.
!

testAction2
	| letterNode actionNode |
	
	letterNode := PPCMessagePredicateNode new
		predicate: #isLetter;
		yourself.
		
	actionNode := PPCActionNode new
		block:  #boo;
		child: letterNode;
		yourself.
	
	node := PPCTokenNode new
		child: actionNode;
		yourself.
	
	result := visitor visit: node.
	
	self assert: result type: PPCMessagePredicateNode.
	self assert: result = letterNode.
!

testAction3
	| letterNode actionNode |
	
	letterNode := PPCMessagePredicateNode new
		predicate: #isLetter;
		yourself.
		
	actionNode := PPCActionNode new
		block: #foo;
		child: letterNode;
		yourself.
	
	node := PPCActionNode new
		block: #foo;
		child: actionNode;
		yourself.
	
	result := visitor visit: node.
	
	self assert: result type: PPCMessagePredicateNode.
	self assert: result = letterNode.
!

testNotAction
	| literalNode actionNode |
	literalNode := PPCLiteralNode new
		literal: 'foo';
		yourself.
	
	actionNode := PPCActionNode new
		block: #foo;
		child: literalNode;
		yourself.
	
	node := PPCNotNode new
		child: actionNode;
		yourself.
		
	result := visitor visit: node.
	
	self assert: result type: PPCNotNode.
	self assert: result child type: PPCLiteralNode.
!

testNotAction2
	| literalNode actionNode seqNode |
	literalNode := PPCLiteralNode new
		literal: 'foo';
		yourself.
	
	seqNode := PPCSequenceNode new
		children: { literalNode . literalNode  };
		yourself.
	
	actionNode := PPCActionNode new
		block: #foo;
		child: seqNode;
		yourself.
	
	node := PPCNotNode new
		child: actionNode;
		yourself.
		
	result := visitor visit: node.
	
	self assert: result type: PPCNotNode.
	
	self assert: result child type: PPCTokenSequenceNode.
	self assert: result child firstChild type: PPCLiteralNode.
	self assert: result child secondChild type: PPCLiteralNode.	
!

testNotAction3
	| literalNode actionNode seqNode |
	literalNode := PPCLiteralNode new
		literal: 'foo';
		yourself.
	
	seqNode := PPCSequenceNode new
		children: { literalNode . literalNode  };
		yourself.
	
	actionNode := PPCSymbolActionNode new
		symbol: #second;
		child: seqNode;
		yourself.
	
	node := PPCNotNode new
		child: actionNode;
		yourself.
		
	result := visitor visit: node.
	
	self assert: result type: PPCNotNode.
	
	self assert: result child type: PPCTokenSequenceNode.
	self assert: result child firstChild type: PPCLiteralNode.
	self assert: result child secondChild type: PPCLiteralNode.		
!

testStarMessagePredicate
	| starNode |
	starNode := PPCStarMessagePredicateNode new
		message: #isLetter;
		yourself.
	
	node := PPCTokenNode new
		child: starNode;
		yourself.
	
	result := visitor visit: node.
	
	self assert: result type: PPCTokenStarMessagePredicateNode.
!

testTokenSequence1
	| letterNode1 letterNode2 |
	letterNode1 := PPCCharacterNode new character: $a.
	letterNode2 := PPCCharacterNode new character: $b.
	
	node := PPCSequenceNode new
		children: { letterNode1 . letterNode2 };
		yourself.
	result := visitor visit: node.
	
	self assert: result type: PPCTokenSequenceNode.
	self assert: result firstChild = letterNode1.
	self assert: result secondChild = letterNode2.
! !