compiler/tests/PPCRecognizerComponentVisitorTest.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 24 Aug 2015 15:34:14 +0100
changeset 524 f6f68d32de73
parent 464 f6d77fee9811
permissions -rw-r--r--
Merged in PetitCompiler-JanVrany.170, PetitCompiler-Tests-JanKurs.116, PetitCompiler-Extras-Tests-JanKurs.29, PetitCompiler-Benchmarks-JanKurs.19 Name: PetitCompiler-JanVrany.170 Author: JanVrany Time: 24-08-2015, 03:19:51.340 PM UUID: c20a744f-3b41-4aaa-bb8a-71ce74a2a952 Name: PetitCompiler-Tests-JanKurs.116 Author: JanKurs Time: 24-08-2015, 11:37:54.332 AM UUID: 549e0927-358a-4a1b-8270-050ccfcb4217 Name: PetitCompiler-Extras-Tests-JanKurs.29 Author: JanKurs Time: 24-08-2015, 11:36:52.503 AM UUID: ea1dbb67-f884-4237-8f34-adb0677c0954 Name: PetitCompiler-Benchmarks-JanKurs.19 Author: JanKurs Time: 24-08-2015, 11:48:47.045 AM UUID: 1c342fdb-8ddd-4104-9c47-a8f589c51694

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

"{ NameSpace: Smalltalk }"

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


!PPCRecognizerComponentVisitorTest methodsFor:'as yet unclassified'!

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

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

setUp
    visitor := PPCRecognizerComponentVisitor 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: PPCRecognizingSequenceNode.
    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: PPCRecognizingSequenceNode.
    self assert: result child firstChild type: PPCLiteralNode.
    self assert: result child secondChild type: PPCLiteralNode.		
!

testRecognizingSequence1
    | 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: PPCRecognizingSequenceNode.
    self assert: result firstChild = letterNode1.
    self assert: result secondChild = letterNode2.
!

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

testStarMessagePredicate2
    | starNode |
    starNode := PPCStarMessagePredicateNode new
        message: #isSeparator;
        child: PPCSentinelNode instance;
        yourself.
    
    node := PPCTokenNode new
        child: starNode;
        yourself.
    
    result := visitor visit: node.
    
    self assert: result type: PPCTokenStarSeparatorNode.
!

testToken
    | letterNode |
    letterNode := PPCMessagePredicateNode new
        message: #isLetter;
        yourself.
    
    node := PPCTokenNode new
        child: letterNode;
        yourself.
        
    result := visitor visit: node.
    self assert: result type: PPCMessagePredicateNode.
    self assert: result = letterNode.
!

testTrimmingToken
    | letterNode tokenNode whitespaceNode |
    letterNode := PPCMessagePredicateNode new
        message: #isLetter;
        yourself.
    
    tokenNode := PPCTokenNode new
        child: letterNode;
        yourself.
    
    whitespaceNode := PPCActionNode new
        block: #foo;
        child: letterNode;	
            yourself.
        
    node := PPCTrimmingTokenNode new
        child: tokenNode;
        whitespace: whitespaceNode;
        yourself.
        
    result := visitor visit: node.
    self assert: result type: PPCTrimmingTokenNode.
    self assert: result child type: PPCMessagePredicateNode.
    self assert: result child = letterNode.
    self assert: result whitespace type: PPCMessagePredicateNode.
    self assert: result whitespace = letterNode.
! !

!PPCRecognizerComponentVisitorTest class methodsFor:'documentation'!

version_HG

    ^ '$Changeset: <not expanded> $'
! !