compiler/tests/PPCTokenDetectorTest.st
changeset 438 20598d7ce9fa
child 452 9f4558b3be66
equal deleted inserted replaced
437:54b3bc9e3987 438:20598d7ce9fa
       
     1 "{ Package: 'stx:goodies/petitparser/compiler/tests' }"
       
     2 
       
     3 "{ NameSpace: Smalltalk }"
       
     4 
       
     5 TestCase subclass:#PPCTokenDetectorTest
       
     6 	instanceVariableNames:'node result visitor'
       
     7 	classVariableNames:''
       
     8 	poolDictionaries:''
       
     9 	category:'PetitCompiler-Tests-Visitors'
       
    10 !
       
    11 
       
    12 !PPCTokenDetectorTest methodsFor:'as yet unclassified'!
       
    13 
       
    14 assert: object type: class
       
    15 	self assert: object class == class
       
    16 !
       
    17 
       
    18 setUp
       
    19 	visitor := PPCTokenDetector new.
       
    20 !
       
    21 
       
    22 testActionNode
       
    23 	| seq characterNode1 characterNode2 tokenNode |
       
    24 	characterNode1 := PPCCharacterNode new.
       
    25 	characterNode2 := PPCCharacterNode new.
       
    26 	
       
    27 	seq := PPCSequenceNode new
       
    28 		children: { characterNode1 . characterNode1 };
       
    29 		yourself.
       
    30 	tokenNode := PPCTokenNode new
       
    31 		child: seq;
       
    32 		yourself.
       
    33 		
       
    34 	node := PPCActionNode new
       
    35 		child: tokenNode;
       
    36 		yourself.
       
    37 	
       
    38 		
       
    39 	result := visitor visit: node.
       
    40 	
       
    41 	self assert: result type: PPCActionNode.
       
    42 	self assert: result child type: PPCTokenNode.	
       
    43 	self assert: result child child type: PPCTokenSequenceNode.	
       
    44 
       
    45 	self assert: result == node.
       
    46 	self assert: (result child child firstChild == characterNode1) not.
       
    47 	self assert: (result child child firstChild = characterNode1).
       
    48 	self assert: (result child child secondChild == characterNode1) not.
       
    49 	self assert: (result child child secondChild = characterNode1).
       
    50 	
       
    51 !
       
    52 
       
    53 testNestedTrimmingToken
       
    54 	| characterNode token ws seq trimmingToken |
       
    55 	characterNode := PPCCharacterNode new.
       
    56 	token := PPCTokenNode new 
       
    57 		child: characterNode;
       
    58 		tokenClass: #foo;
       
    59 		yourself.
       
    60 	ws := PPCSentinelNode new.
       
    61 	seq := PPCSequenceNode new
       
    62 		children: { ws . token . ws };
       
    63 		yourself.
       
    64 	trimmingToken := PPCActionNode new
       
    65 		child: seq;
       
    66 		propertyAt: #trimmingToken put: true;
       
    67 		yourself.
       
    68 
       
    69 	node := PPCSequenceNode new
       
    70 		children: { characterNode . trimmingToken  };
       
    71 		yourself.
       
    72 	
       
    73 	result := visitor visit: node.
       
    74 	
       
    75 	self assert: result type: PPCSequenceNode.
       
    76 	self assert: result firstChild == characterNode.
       
    77 	
       
    78 	self assert: result secondChild type: PPCTrimmingTokenNode.	
       
    79 	self assert: result secondChild child = characterNode.	
       
    80 	self assert: (result secondChild child == characterNode) not.		
       
    81 !
       
    82 
       
    83 testNestedTrimmingToken2
       
    84 	| characterNode token1 ws seq1 seq2 seqWithToken trimmingToken1 token2 |
       
    85 	characterNode := PPCCharacterNode new.
       
    86 	ws := PPCSentinelNode new.
       
    87 
       
    88 	token1 := PPCTokenNode new 
       
    89 		child: characterNode;
       
    90 		tokenClass: #foo;
       
    91 		yourself.
       
    92 	seq1 := PPCSequenceNode new
       
    93 		children: { ws . token1 . ws };
       
    94 		yourself.
       
    95 	trimmingToken1 := PPCActionNode new
       
    96 		child: seq1;
       
    97 		propertyAt: #trimmingToken put: true;
       
    98 		yourself.
       
    99 	
       
   100 	seqWithToken := PPCSequenceNode new
       
   101 		children: { characterNode . trimmingToken1  };
       
   102 		yourself.
       
   103 	
       
   104 	token2 := PPCTokenNode new 
       
   105 		child: seqWithToken;
       
   106 		tokenClass: #bar;
       
   107 		yourself.
       
   108 	seq2 := PPCSequenceNode new
       
   109 		children: { ws . token2 . ws };
       
   110 		yourself.		
       
   111 	node := PPCActionNode new
       
   112 		child: seq2;
       
   113 		propertyAt: #trimmingToken put: true;
       
   114 		yourself.
       
   115 	result := visitor visit: node.
       
   116 	
       
   117 	self assert: result type: PPCTrimmingTokenNode .
       
   118 	self assert: result child type: PPCTokenSequenceNode.
       
   119 !
       
   120 
       
   121 testNestedTrimmingToken3
       
   122 	|         trueToken falseToken booleanLiteral literal abc notBoolean id idSeq javaToken resultId resultBooleanLiteral resultIdBooleanLiteral |
       
   123 	"
       
   124 	 This USE case is based on JavaToken
       
   125 	
       
   126 	 javaToken := id / literal
       
   127 	 id := (not booleanLiteral, 'abc') token
       
   128 	 literal := booleanLiteral
       
   129 	 booleanLiteral := 'true' token / 'false' token
       
   130 	"
       
   131 	trueToken := 'true' asParser token asCompilerTree.
       
   132 	falseToken := 'false' asParser token asCompilerTree.
       
   133 	abc := 'abc' asParser asCompilerTree.
       
   134 	
       
   135 	booleanLiteral := PPCChoiceNode new
       
   136 		children: { trueToken . falseToken }; yourself.
       
   137 
       
   138 	literal := PPCForwardNode new
       
   139 		name: #literal;
       
   140 		child: booleanLiteral; yourself.
       
   141 	notBoolean := PPCNotNode new
       
   142 		child: booleanLiteral; yourself.
       
   143 	idSeq := PPCSequenceNode new
       
   144 		children: { notBoolean . abc }; yourself.
       
   145 	id := PPCTokenNode new
       
   146 		child: idSeq; yourself.
       
   147 	javaToken := PPCChoiceNode new
       
   148 		children: { id . literal }; yourself.
       
   149 		
       
   150 	result := visitor visit: javaToken.	
       
   151 	resultId := result firstChild.
       
   152 	resultBooleanLiteral := result secondChild child.	
       
   153 	resultIdBooleanLiteral := resultId child firstChild  child.	
       
   154 		
       
   155 		
       
   156 		
       
   157 	self assert: result type: PPCChoiceNode.
       
   158 	self assert: resultId type: PPCTokenNode.
       
   159 	self assert: resultBooleanLiteral type: PPCChoiceNode.
       
   160 	
       
   161 	self assert: resultIdBooleanLiteral firstChild type: PPCLiteralNode.
       
   162 	self assert: resultIdBooleanLiteral secondChild type: PPCLiteralNode.
       
   163 	
       
   164 	self assert: resultBooleanLiteral firstChild type: PPCTokenNode.
       
   165 	self assert: resultBooleanLiteral secondChild type: PPCTokenNode.
       
   166 	
       
   167 	
       
   168 !
       
   169 
       
   170 testNodeCopy
       
   171 	| nilNode forwardNode |
       
   172 	nilNode := PPCNilNode new.
       
   173 	forwardNode := PPCForwardNode new
       
   174 		child: nilNode;
       
   175 		yourself.
       
   176 	node := PPCTokenNode new
       
   177 		child: forwardNode;
       
   178 		yourself.
       
   179 	
       
   180 	result := visitor visit: node.
       
   181 	
       
   182 	self assert: (result == node).
       
   183 	self assert: result child = forwardNode.
       
   184 	self assert: (result child == forwardNode) not.
       
   185 	self assert: (result child child = nilNode).
       
   186 	self assert: (result child child == nilNode) not.
       
   187 !
       
   188 
       
   189 testTokenSequence1
       
   190 	| seq characterNode1 characterNode2 |
       
   191 	characterNode1 := PPCCharacterNode new.
       
   192 	characterNode2 := PPCCharacterNode new.
       
   193 	
       
   194 	seq := PPCSequenceNode new
       
   195 		children: { characterNode1 . characterNode1 };
       
   196 		yourself.
       
   197 	node := PPCTokenNode new
       
   198 		child: seq;
       
   199 		yourself.
       
   200 	
       
   201 		
       
   202 	result := visitor visit: node.
       
   203 	
       
   204 	self assert: result type: PPCTokenNode.
       
   205 	self assert: result child type: PPCTokenSequenceNode.	
       
   206 
       
   207 	self assert: result == node.
       
   208 	self assert: (result child firstChild == characterNode1) not.
       
   209 	self assert: (result child firstChild = characterNode1).
       
   210 	self assert: (result child secondChild == characterNode1) not.
       
   211 	self assert: (result child secondChild = characterNode1).
       
   212 	
       
   213 !
       
   214 
       
   215 testTrimmingToken
       
   216 	| seq characterNode ws token |
       
   217 	characterNode := PPCCharacterNode new.
       
   218 	token := PPCTokenNode new 
       
   219 		child: characterNode;
       
   220 		tokenClass: #foo;
       
   221 		yourself.
       
   222 	ws := PPCSentinelNode new.
       
   223 	
       
   224 	seq := PPCSequenceNode new
       
   225 		children: { ws . token . ws };
       
   226 		yourself.
       
   227 	node := PPCActionNode new
       
   228 		child: seq;
       
   229 		propertyAt: #trimmingToken put: true;
       
   230 		yourself.
       
   231 		
       
   232 	result := visitor visit: node.
       
   233 	
       
   234 	self assert: result type: PPCTrimmingTokenNode.
       
   235 	self assert: result child type: PPCCharacterNode.
       
   236 	self assert: result child = characterNode.
       
   237 	self assert: (result child == characterNode) not.	
       
   238 ! !
       
   239