compiler/tests/PPCOptimizingTest.st
changeset 453 bd5107faf4d6
parent 451 989570319d14
parent 452 9f4558b3be66
child 454 a9cd5ea7cc36
equal deleted inserted replaced
451:989570319d14 453:bd5107faf4d6
     1 "{ Package: 'stx:goodies/petitparser/compiler/tests' }"
       
     2 
       
     3 "{ NameSpace: Smalltalk }"
       
     4 
       
     5 TestCase subclass:#PPCOptimizingTest
       
     6 	instanceVariableNames:''
       
     7 	classVariableNames:''
       
     8 	poolDictionaries:''
       
     9 	category:'PetitCompiler-Tests-Nodes'
       
    10 !
       
    11 
       
    12 
       
    13 !PPCOptimizingTest methodsFor:'test support'!
       
    14 
       
    15 assert: object type: class
       
    16 	self assert: (object isKindOf: class)
       
    17 !
       
    18 
       
    19 optimize: p
       
    20 	^ p asCompilerTree optimizeTree 
       
    21 !
       
    22 
       
    23 optimize: p parameters: parameters
       
    24 	^ p asCompilerTree optimizeTree: parameters 
       
    25 ! !
       
    26 
       
    27 !PPCOptimizingTest methodsFor:'tests'!
       
    28 
       
    29 testAnyPredicate
       
    30 	| tree |
       
    31 	tree := self optimize: #any asParser.
       
    32 	
       
    33 	self assert: tree type: PPCAnyNode.
       
    34 !
       
    35 
       
    36 testCharSetPredicate
       
    37 	| tree |
       
    38 	tree := self optimize: (PPPredicateObjectParser on: [:each | each = $b or: [each = $c] ] message: #foo).
       
    39 
       
    40 	self assert: tree type: PPCCharSetPredicateNode
       
    41 !
       
    42 
       
    43 testChoiceInlining
       
    44 	| tree |
       
    45 	tree := self optimize: $a asParser  / $b asParser.
       
    46 
       
    47 	self assert: tree type: PPCChoiceNode.
       
    48 	self assert: tree children first  type: PPCCharacterNode.
       
    49 	self assert: tree children first isMarkedForInline.
       
    50 	self assert: tree children second type: PPCCharacterNode.
       
    51 	self assert: tree children first isMarkedForInline.
       
    52 	
       
    53 !
       
    54 
       
    55 testForwarding
       
    56 	| tree p1 p2 |
       
    57 	p2 := $a asParser.
       
    58 	p1 := p2 wrapped.
       
    59 	p1 name: 'p1'.
       
    60 	tree := self optimize: p1.
       
    61 
       
    62 	self assert: tree type: PPCAbstractCharacterNode.
       
    63 	self assert: tree name = 'p1'.
       
    64 	
       
    65 	p2 name: 'p2'.
       
    66 	tree := self optimize: p1.
       
    67 	self assert: tree type: PPCForwardNode.
       
    68 	self assert: tree name = 'p1'.
       
    69 	self assert: tree child name = 'p2'.
       
    70 !
       
    71 
       
    72 testInlineCharacter
       
    73 	| tree |
       
    74 	tree := self optimize: $a asParser plus.
       
    75 
       
    76 	self assert: tree type: PPCPlusNode.
       
    77 	self assert: tree child type: PPCCharacterNode.
       
    78 	self assert: tree child isMarkedForInline.
       
    79 	self assert: tree child character = $a.
       
    80 !
       
    81 
       
    82 testInlineCharacter2
       
    83 	| tree |
       
    84 	tree := self optimize: $a asParser star.
       
    85 
       
    86 	self assert: tree type: PPCStarNode.
       
    87 	self assert: tree child type: PPCCharacterNode.
       
    88 	self assert: tree child isMarkedForInline.
       
    89 	self assert: tree child character = $a.
       
    90 !
       
    91 
       
    92 testInlineCharacter3
       
    93 	| tree |
       
    94 	tree := self optimize: $a asParser, $b asParser.
       
    95 
       
    96 	self assert: tree type: PPCSequenceNode.
       
    97 	self assert: tree children first type: PPCCharacterNode.
       
    98 	self assert: tree children first isMarkedForInline.
       
    99 	self assert: tree children first character = $a.
       
   100 	self assert: tree children second type: PPCCharacterNode.
       
   101 	self assert: tree children second isMarkedForInline.
       
   102 	self assert: tree children second character = $b.	
       
   103 !
       
   104 
       
   105 testInlineNil
       
   106 	| tree |
       
   107 	tree := self optimize: nil asParser star.
       
   108 
       
   109 	self assert: tree type: PPCStarNode.
       
   110 	self assert: tree child type: PPCNilNode.
       
   111 	self assert: tree child isMarkedForInline.
       
   112 !
       
   113 
       
   114 testInlineNotLiteral
       
   115 	| tree |
       
   116 	tree := self optimize: 'foo' asParser not star.
       
   117 
       
   118 	self assert: tree type: PPCStarNode.
       
   119 	self assert: tree child type: PPCNotLiteralNode.
       
   120 	self assert: tree child literal = 'foo'.
       
   121 	self assert: tree child isMarkedForInline.
       
   122 !
       
   123 
       
   124 testInlineNotPredicate
       
   125 	| tree |
       
   126 	tree := self optimize: (#letter asParser not, (PPPredicateObjectParser on: [ :e | e = $a or: [  e = $b ]] message: #foo) not).
       
   127 
       
   128 	self assert: tree type: PPCSequenceNode.
       
   129 	self assert: tree children first type: PPCNotMessagePredicateNode.
       
   130 	self assert: tree children first isMarkedForInline.
       
   131 	self assert: tree children second type: PPCNotCharSetPredicateNode.
       
   132 	self assert: tree children second isMarkedForInline.
       
   133 	
       
   134 !
       
   135 
       
   136 testInlinePluggable
       
   137 	| tree |
       
   138 	tree := self optimize: [:ctx | nil] asParser star.
       
   139 
       
   140 	((Smalltalk respondsTo:#isSmalltalkX) and:[ Smalltalk isSmalltalkX ]) 
       
   141 		ifTrue:[ self skipIf: true description: 'not supported in St/X' ].
       
   142 
       
   143 	self assert: tree type: PPCStarNode.
       
   144 	self assert: tree child type: PPCPluggableNode.
       
   145 	self assert: tree child isMarkedForInline.
       
   146 
       
   147     "Modified: / 23-04-2015 / 12:19:42 / Jan Vrany <jan.vrany@fit.cvut.cz>"
       
   148 !
       
   149 
       
   150 testInlinePredicate
       
   151 	| tree |
       
   152 	tree := self optimize: (#letter asParser, (PPPredicateObjectParser on: [ :e | e = $a or: [  e = $b ]] message: #foo)).
       
   153 
       
   154 	self assert: tree type: PPCSequenceNode.
       
   155 	self assert: tree children first type: PPCMessagePredicateNode.
       
   156 	self assert: tree children first isMarkedForInline.
       
   157 	self assert: tree children second type: PPCCharSetPredicateNode.
       
   158 	self assert: tree children second isMarkedForInline.
       
   159 	
       
   160 !
       
   161 
       
   162 testLetterPredicate
       
   163 	| tree |
       
   164 	tree := self optimize: #letter asParser.
       
   165 
       
   166 	self assert: tree type: PPCMessagePredicateNode.
       
   167 	self assert: tree message = #isLetter.
       
   168 !
       
   169 
       
   170 testNotAction
       
   171 	| tree |
       
   172 	tree := self optimize: (($f asParser, $o asParser) ==> #second) not.
       
   173 
       
   174 	self assert: tree type: PPCNotNode.
       
   175 	self assert: tree child type: PPCTokenSequenceNode.
       
   176 !
       
   177 
       
   178 testNotCharSetPredicate
       
   179 	| tree |
       
   180 	tree := self optimize: (PPPredicateObjectParser on: [:each | each = $b or: [each = $c] ] message: #foo) asParser not.
       
   181 
       
   182 	self assert: tree type: PPCNotCharSetPredicateNode.
       
   183 !
       
   184 
       
   185 testNotLiteral
       
   186 	| tree |
       
   187 	tree := self optimize: 'foo' asParser not.
       
   188 
       
   189 	self assert: tree type: PPCNotLiteralNode.
       
   190 	self assert: tree literal = 'foo'.
       
   191 !
       
   192 
       
   193 testNotMessagePredicate
       
   194 	| tree |
       
   195 	tree := self optimize: #letter asParser not.
       
   196 
       
   197 	self assert: tree type: PPCNotMessagePredicateNode.
       
   198 !
       
   199 
       
   200 testNotSequence
       
   201 	| tree |
       
   202 	tree := self optimize: ($f asParser, $o asParser) not.
       
   203 
       
   204 	self assert: tree type: PPCNotNode.
       
   205 	self assert: tree child type: PPCTokenSequenceNode.
       
   206 !
       
   207 
       
   208 testStarAny
       
   209 	| tree |
       
   210 	tree := self optimize: #any asParser star.
       
   211 
       
   212 	self assert: tree type: PPCStarAnyNode.
       
   213 !
       
   214 
       
   215 testStarCharSetPredicate
       
   216 	| tree |
       
   217 	tree := self optimize: (PPPredicateObjectParser on: [:each | each = $b or: [each = $c] ] message: #foo) star.
       
   218 
       
   219 	self assert: tree type: PPCStarCharSetPredicateNode
       
   220 !
       
   221 
       
   222 testStarMessagePredicate
       
   223 	| tree |
       
   224 	tree := self optimize: #letter asParser star.
       
   225 
       
   226 	self assert: tree type: PPCStarMessagePredicateNode.
       
   227 !
       
   228 
       
   229 testStarSeparator
       
   230 	| tree |
       
   231 	tree := self optimize: #space asParser star trimmingToken parameters: { #rewrite . #token }.
       
   232 
       
   233 	self assert: tree type: PPCTrimmingTokenNode.
       
   234 	self assert: tree child type: PPCTokenStarSeparatorNode.
       
   235 !
       
   236 
       
   237 testStarSeparator2
       
   238 	| tree |
       
   239 	tree := self optimize: (#space asParser star, 'whatever' asParser) trimmingToken.
       
   240 
       
   241 	self assert: tree type: PPCTrimmingTokenNode.
       
   242 	self assert: tree child type: PPCTokenSequenceNode.
       
   243 	self assert: tree child children first type: PPCTokenStarSeparatorNode.
       
   244 	self assert: tree child children first isMarkedForInline.
       
   245 !
       
   246 
       
   247 testSymbolAction
       
   248 	| tree |
       
   249 	tree := self optimize: (#letter asParser) ==> #second.
       
   250 
       
   251 	self assert: tree type: PPCSymbolActionNode.
       
   252 
       
   253 	tree := self optimize: (#letter asParser) ==> [:e | e second ].
       
   254 	self assert: tree type: PPCActionNode.
       
   255 !
       
   256 
       
   257 testToken
       
   258 	| tree |
       
   259 	tree := self optimize: ((#letter asParser, #word asParser star) token).
       
   260 
       
   261 	self assert: tree type: PPCTokenNode.
       
   262 	self assert: tree child type: PPCTokenSequenceNode.
       
   263 	self assert: tree child children size = 2.
       
   264 	self assert: tree child children first type: PPCMessagePredicateNode.
       
   265 	self assert: tree child children first isMarkedForInline.
       
   266 	self assert: tree child children second type: PPCTokenStarMessagePredicateNode.	
       
   267 	self assert: tree child children second isMarkedForInline.
       
   268 	
       
   269 !
       
   270 
       
   271 testTokenSequence2
       
   272 	| tree |
       
   273 	tree := self optimize: ($a asParser, $b asParser) token.
       
   274 
       
   275 	self assert: tree type: PPCTokenNode.
       
   276 	self assert: tree child type: PPCTokenSequenceNode.
       
   277 	
       
   278 	tree := self optimize: ($a asParser, $b asParser) trimmingToken.
       
   279 
       
   280 	self assert: tree type: PPCTrimmingTokenNode.
       
   281 	self assert: tree child type: PPCTokenSequenceNode.
       
   282 !
       
   283 
       
   284 testTrimmingToken
       
   285 	| tree |
       
   286 	tree := self optimize: ((#letter asParser, #word asParser star) trimmingToken).
       
   287 
       
   288 	self assert: tree type: PPCTrimmingTokenNode.
       
   289 	self assert: tree whitespace type: PPCTokenStarSeparatorNode.
       
   290 	self assert: tree whitespace isMarkedForInline.
       
   291 	
       
   292 	self assert: tree child type: PPCTokenSequenceNode.
       
   293 	self assert: tree child children size = 2.
       
   294 	self assert: tree child children first type: PPCMessagePredicateNode.
       
   295 	self assert: tree child children first isMarkedForInline.
       
   296 	self assert: tree child children second type: PPCTokenStarMessagePredicateNode.	
       
   297 	self assert: tree child children first isMarkedForInline.
       
   298 !
       
   299 
       
   300 testTrimmingToken2
       
   301 	| parser tree |
       
   302 	parser := 'foo' asParser trimmingToken.
       
   303 	tree := parser asCompilerTree optimizeTree.
       
   304 	
       
   305 	self assert: tree type: PPCTrimmingTokenNode.
       
   306 	self assert: tree child type: PPCLiteralNode.
       
   307 	self assert: tree child isMarkedForInline.
       
   308 	self assert: (tree whitespace allNodes allSatisfy: [ :n | n isKindOf: PPCNode ]).
       
   309 
       
   310 	parser := ('foo' asParser, $b asParser) trimmingToken.
       
   311 	tree := parser asCompilerTree optimizeTree.
       
   312 	
       
   313 	self assert: tree type: PPCTrimmingTokenNode.
       
   314 	self assert: tree child type: PPCTokenSequenceNode.
       
   315 	self assert: tree whitespace type: PPCTokenStarSeparatorNode.
       
   316 	self assert: tree whitespace isMarkedForInline.
       
   317 	
       
   318 	parser := $d asParser trimmingToken star.
       
   319 	tree := parser asCompilerTree optimizeTree.
       
   320 	
       
   321 	self assert: tree type: PPCStarNode.
       
   322 	self assert: tree child type: PPCTrimmingTokenNode.
       
   323 	self assert: tree child child type: PPCCharacterNode.
       
   324 	self assert: tree child child isMarkedForInline.
       
   325 !
       
   326 
       
   327 testTrimmingToken3
       
   328 	| parser tree |
       
   329 	parser := ('foo' asParser trimmingToken name: 'foo'), ('bar' asParser trimmingToken name: 'bar').
       
   330 	tree := parser asCompilerTree optimizeTree.
       
   331 	
       
   332 	self assert: tree type: PPCSequenceNode.
       
   333 	self assert: tree children first type: PPCTrimmingTokenNode.
       
   334 	self assert: tree children second type: PPCTrimmingTokenNode.
       
   335 !
       
   336 
       
   337 testTrimmingTokenNested
       
   338 	| parser tree foo|
       
   339 	foo := 'foo' asParser trimmingToken name: 'foo'.
       
   340 	parser := (foo not, 'bar' asParser) trimmingToken name: 'token'.
       
   341 	tree := self optimize: parser.
       
   342 	
       
   343 	self assert: tree type: PPCTrimmingTokenNode.
       
   344 	self assert: tree children second type: PPCTokenSequenceNode.
       
   345 	self assert: tree children second children first type: PPCNotLiteralNode.
       
   346 	self assert: tree children second children first isMarkedForInline.
       
   347 ! !
       
   348 
       
   349 !PPCOptimizingTest class methodsFor:'documentation'!
       
   350 
       
   351 version_HG
       
   352 
       
   353     ^ '$Changeset: <not expanded> $'
       
   354 ! !
       
   355