compiler/tests/PPCNodeTest.st
changeset 391 553a5456963b
child 392 9b297f0d949c
equal deleted inserted replaced
390:17ba167b8ee1 391:553a5456963b
       
     1 "{ Package: 'stx:goodies/petitparser/compiler/tests' }"
       
     2 
       
     3 TestCase subclass:#PPCNodeTest
       
     4 	instanceVariableNames:''
       
     5 	classVariableNames:''
       
     6 	poolDictionaries:''
       
     7 	category:'PetitCompiler-Tests-Nodes'
       
     8 !
       
     9 
       
    10 PPCNodeTest comment:''
       
    11 !
       
    12 
       
    13 !PPCNodeTest methodsFor:'as yet unclassified'!
       
    14 
       
    15 testCopy
       
    16 	| n1 n2 |
       
    17 	n1 := PPCDelegateNode new
       
    18 		child: #foo;
       
    19 		yourself.
       
    20 	n2 := n1 copy.
       
    21 	self assert: (n1 = n2).
       
    22 	
       
    23 	n2 child: #bar.
       
    24 	self assert: (n1 = n2) not.
       
    25 !
       
    26 
       
    27 testCopy2
       
    28 	| n1 n2 |
       
    29 	n1 := PPCSequenceNode new
       
    30 		children: (Array with: #foo with: #bar);
       
    31 		yourself.
       
    32 	n2 := n1 copy.
       
    33 	self assert: (n1 = n2).
       
    34 	
       
    35 	n2 children at: 1 put: #zorg.
       
    36 	self assert: (n1 = n2) not.
       
    37 !
       
    38 
       
    39 testEquals
       
    40 	self assert: (PPCNode new = PPCNode new).
       
    41 !
       
    42 
       
    43 testEquals2
       
    44 	| n1 n2 n3 |
       
    45 	n1 := PPCDelegateNode new
       
    46 		child: #foo;
       
    47 		yourself.
       
    48 	n2 := PPCDelegateNode new
       
    49 		child: #bar;
       
    50 		yourself.
       
    51 	n3 := PPCDelegateNode new
       
    52 		child: #foo;
       
    53 		yourself.
       
    54 		
       
    55 	self assert: (n1 = n3).
       
    56 	self assert: (n1 = n2) not.
       
    57 ! !
       
    58 
       
    59 !PPCNodeTest methodsFor:'test support'!
       
    60 
       
    61 assert: object type: class
       
    62 	self assert: object class == class
       
    63 ! !
       
    64 
       
    65 !PPCNodeTest methodsFor:'tests - converting'!
       
    66 
       
    67 testConvertBlock
       
    68 	| parser tree |
       
    69 	parser := [ :ctx | [ctx atEnd] whileFalse ] asParser.
       
    70 	tree := parser asCompilerTree.
       
    71 	
       
    72 	self assert: tree type: PPCPluggableNode.
       
    73 	self assert: tree block asString = '[ :ctx | [ ctx atEnd ] whileFalse ]'.
       
    74 !
       
    75 
       
    76 testConvertChoice
       
    77 	| parser tree |
       
    78 	parser := 'foo' asParser / $b asParser.
       
    79 	tree := parser asCompilerTree.
       
    80 	
       
    81 	self assert: tree type: PPCChoiceNode.
       
    82 	self assert: tree children size = 2.
       
    83 	self assert: tree children first type: PPCLiteralNode.
       
    84 	self assert: tree children second type: PPCCharacterNode.
       
    85 !
       
    86 
       
    87 testConvertNil
       
    88 	| parser tree |
       
    89 	parser := nil asParser.
       
    90 	tree := parser asCompilerTree.
       
    91 	
       
    92 	self assert: tree type: PPCNilNode.
       
    93 !
       
    94 
       
    95 testConvertSequence
       
    96 	| parser tree |
       
    97 	parser := 'foo' asParser, $b asParser.
       
    98 	tree := parser asCompilerTree.
       
    99 	
       
   100 	self assert: tree type: PPCSequenceNode.
       
   101 	self assert: tree children size = 2.
       
   102 	self assert: tree children first type: PPCLiteralNode.
       
   103 	self assert: tree children second type: PPCCharacterNode.
       
   104 !
       
   105 
       
   106 testConvertToken
       
   107 	| parser tree |
       
   108 	parser := 'foo' asParser token.
       
   109 	tree := parser asCompilerTree.
       
   110 	
       
   111 	self assert: tree type: PPCTokenNode.
       
   112 	self assert: tree child type: PPCLiteralNode.
       
   113 
       
   114 	parser := ('foo' asParser, $b asParser) token.
       
   115 	tree := parser asCompilerTree.
       
   116 	
       
   117 	self assert: tree type: PPCTokenNode.
       
   118 	self assert: tree child type: PPCSequenceNode.
       
   119 	
       
   120 	parser := $d asParser token star.
       
   121 	tree := parser asCompilerTree.
       
   122 	
       
   123 	self assert: tree type: PPCStarNode.
       
   124 	self assert: tree child type: PPCTokenNode.
       
   125 	self assert: tree child child type: PPCCharacterNode.
       
   126 !
       
   127 
       
   128 testConvertTrimmingToken
       
   129 	| parser tree |
       
   130 	parser := 'foo' asParser trimmingToken.
       
   131 	tree := parser asCompilerTree optimizeTree.
       
   132 	
       
   133 	self assert: tree type: PPCTrimmingTokenNode.
       
   134 	self assert: tree child type: PPCInlineLiteralNode.
       
   135 	self assert: (tree whitespace allNodes allSatisfy: [ :n | n isKindOf: PPCNode ]).
       
   136 
       
   137 	parser := ('foo' asParser, $b asParser) trimmingToken.
       
   138 	tree := parser asCompilerTree optimizeTree.
       
   139 	
       
   140 	self assert: tree type: PPCTrimmingTokenNode.
       
   141 	self assert: tree child type: PPCTokenSequenceNode.
       
   142 	self assert: tree whitespace type: PPCTokenStarMessagePredicateNode.
       
   143 	
       
   144 	parser := $d asParser trimmingToken star.
       
   145 	tree := parser asCompilerTree optimizeTree.
       
   146 	
       
   147 	self assert: tree type: PPCStarNode.
       
   148 	self assert: tree child type: PPCTrimmingTokenNode.
       
   149 	self assert: tree child child type: PPCInlineCharacterNode.
       
   150 ! !
       
   151 
       
   152 !PPCNodeTest methodsFor:'tests - epsilon'!
       
   153 
       
   154 testActionAcceptsEpsilon
       
   155 	| tree |
       
   156 	tree := ('foo' asParser token optional ==> [ :e | e ]) asCompilerTree.
       
   157 	self assert: tree acceptsEpsilon.
       
   158 !
       
   159 
       
   160 testChoiceAcceptsEpsilon
       
   161 	| tree |
       
   162 	tree := ($a asParser / $b asParser star) asCompilerTree.
       
   163 	self assert: tree acceptsEpsilon.
       
   164 !
       
   165 
       
   166 testLiteralAcceptsEpsilon
       
   167 	| tree |
       
   168 	tree := 'foo' asParser asCompilerTree.
       
   169 	self assert: tree acceptsEpsilon not.
       
   170 	
       
   171 	tree := '' asParser asCompilerTree.
       
   172 	self assert: tree acceptsEpsilon.
       
   173 !
       
   174 
       
   175 testPlusAcceptsEpsilon
       
   176 	| tree |
       
   177 	tree := ($b asParser plus) asCompilerTree.
       
   178 	self assert: tree acceptsEpsilon not.
       
   179 	
       
   180 	tree := #letter asParser plus asCompilerTree.
       
   181 	self assert: tree acceptsEpsilon not.
       
   182 !
       
   183 
       
   184 testSequenceAcceptsEpsilon
       
   185 	| tree parser |
       
   186 	parser := 'foo' asParser token optional, 'bar' asParser token star, ($a asParser / $b asParser star).
       
   187 	tree := parser asCompilerTree.
       
   188 	self assert: tree acceptsEpsilon.
       
   189 !
       
   190 
       
   191 testStarAcceptsEpsilon
       
   192 	| tree |
       
   193 	tree := $b asParser star asCompilerTree.
       
   194 	self assert: tree acceptsEpsilon.
       
   195 !
       
   196 
       
   197 testTokenAcceptsEpsilon
       
   198 	| tree |
       
   199 	tree := ($a asParser / $b asParser plus) token asCompilerTree.
       
   200 	self assert: tree acceptsEpsilon not.
       
   201 	
       
   202 	tree := ($a asParser / $b asParser star) token asCompilerTree.
       
   203 	self assert: tree acceptsEpsilon.
       
   204 ! !
       
   205