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

!PPCInliningVisitorTest methodsFor:'as yet unclassified'!

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

setUp
	visitor := PPCInliningVisitor new.
!

testCharacterNode
	node := PPCCharacterNode new
		character: $a;
		yourself.
	result := visitor visit: node.
	
	self assert: result type: PPCCharacterNode.
	self assert: result isMarkedForInline not.
	self assert: result character = $a.
!

testCharacterNode2
	| charNode |
	charNode := PPCCharacterNode new
		character: $a;
		yourself.
	node := PPCStarNode new
		child: charNode;
		yourself.
	result := visitor visit: node.
	
	self assert: result child type: PPCCharacterNode.
	self assert: result child isMarkedForInline.
	self assert: result child character = $a.
!

testLiteralNode
	| literalNode |
	literalNode := PPCLiteralNode new
		literal: 'foo';
		yourself.
	node := PPCOptionalNode new
		child: literalNode;
		yourself.

	result := visitor visit: node.
	
	self assert: result child type: PPCLiteralNode.
	self assert: result child isMarkedForInline.
	self assert: result child literal = 'foo'.
!

testNil
	node := PPCNilNode new.
	result := visitor visit: node.

	self assert: result type: PPCNilNode.
	self assert: result isMarkedForInline not.
!

testNil2
	node := PPCStarNode new
		child: PPCNilNode new;
		yourself.
	result := visitor visit: node.

	self assert: result type: PPCStarNode.
	self assert: result child type: PPCNilNode.
	self assert: result child isMarkedForInline.
!

testNotLiteralNode
	| notLiteralNode |

	notLiteralNode := PPCNotLiteralNode new
		literal: 'foo';
		yourself.

	node := PPCOptionalNode new
		child: notLiteralNode;
		yourself.

	result := visitor visit: node.
	
	self assert: result child type: PPCNotLiteralNode.
	self assert: result child isMarkedForInline.
	self assert: result child literal = 'foo'.
!

testPluggable
	| pluggableNode |
	pluggableNode := PPCPluggableNode new
		block: [:ctx | nil] asParser.
	node := PPCSequenceNode new
		children: { pluggableNode  };
		yourself.

	result := visitor visit: node.
	    
	((Smalltalk respondsTo:#isSmalltalkX) and:[ Smalltalk isSmalltalkX ]) ifTrue:
	[  
		self skip: 'skipped test, inlining of pluggable nodes not supported!!'.
	].

	self assert: result children first type: PPCPluggableNode.
	self assert: result children first isMarkedForInline.

    "Modified: / 23-04-2015 / 12:18:34 / Jan Vrany <jan.vrany@fit.cvut.cz>"
!

testSequenceInline
	| charNode1 charNode2 |
	charNode1 := PPCCharacterNode new
		character: $a;
		yourself.
	charNode2 := PPCCharacterNode new
		character: $b;
		yourself.

	node := PPCSequenceNode new
		children: { charNode1 . charNode2 };
		yourself.
	result := visitor visit: node.
	
	self assert: result type: PPCSequenceNode .
	self assert: result children first type: PPCCharacterNode.
	self assert: result children second type: PPCCharacterNode.	
!

testTokenStarMessagePredicateNode
	| tokenNode |
	tokenNode := (PPCTokenStarMessagePredicateNode new)
		child: PPCSentinelNode new;
		yourself.
	node := PPCForwardNode new
		child: tokenNode;
		yourself.	
	result := visitor visit: node.
	
	self assert: result child type: PPCTokenStarMessagePredicateNode.
	self assert: result child isMarkedForInline.
!

testTokenStarSeparatorNode
	| tokenNode |
	tokenNode := (PPCTokenStarSeparatorNode new)
		name: #name;
		message: #message;
		child: PPCNilNode new;
		yourself.

	node := PPCForwardNode new
		child: tokenNode;
		yourself.	

		
	result := visitor visit: node.
	
	self assert: result child type: PPCTokenStarSeparatorNode.
	self assert: result child isMarkedForInline.
	self assert: result child child type: PPCNilNode.
! !