tests/PPExpressionParserTest.st
changeset 375 e2b2f08d054e
parent 187 7532226d6389
child 376 a2656b27cace
equal deleted inserted replaced
374:1ba87229ee7e 375:e2b2f08d054e
       
     1 "{ Package: 'stx:goodies/petitparser' }"
       
     2 
       
     3 PPArithmeticParserTest subclass:#PPExpressionParserTest
       
     4 	instanceVariableNames:''
       
     5 	classVariableNames:''
       
     6 	poolDictionaries:''
       
     7 	category:'PetitTests-Tests'
       
     8 !
       
     9 
       
    10 
       
    11 !PPExpressionParserTest class methodsFor:'testing'!
       
    12 
       
    13 shouldInheritSelectors
       
    14 	^ true
       
    15 ! !
       
    16 
       
    17 !PPExpressionParserTest methodsFor:'accessing'!
       
    18 
       
    19 parserInstance
       
    20 	| expression parens number |
       
    21 	expression := PPExpressionParser new.
       
    22 	parens := $( asParser trim , expression , $) asParser trim
       
    23 		==> [ :value | value second ].
       
    24 	number := (#digit asParser plus , ($. asParser , #digit asParser plus) optional) flatten trim
       
    25 		==> [ :value | value asNumber ].
       
    26 	expression term: parens / number.
       
    27 	expression
       
    28 		group: [ :g |
       
    29 			g prefix: $- asParser trim do: [ :op :a | a negated ] ];
       
    30 		group: [ :g |
       
    31 			g postfix: '++' asParser trim do: [ :a :op | a + 1 ].
       
    32 			g postfix: '--' asParser trim do: [ :a :op | a - 1 ] ];
       
    33 		group: [ :g |
       
    34 			g right: $^ asParser trim do: [ :a :op :b | a raisedTo: b ] ];
       
    35 		group: [ :g |
       
    36 			g left: $* asParser trim do: [ :a :op :b | a * b ].
       
    37 			g left: $/ asParser trim do: [ :a :op :b | a / b ] ];
       
    38 		group: [ :g |
       
    39 			g left: $+ asParser trim do: [ :a :op :b | a + b ].
       
    40 			g left: $- asParser trim do: [ :a :op :b | a - b ] ].
       
    41 	^ expression end
       
    42 ! !
       
    43 
       
    44 !PPExpressionParserTest methodsFor:'testing'!
       
    45 
       
    46 testPostfixAdd
       
    47 	self assert: '0++' is: 1.
       
    48 	self assert: '0++++' is: 2.
       
    49 	self assert: '0++++++' is: 3.
       
    50 
       
    51 	self assert: '0+++1' is: 2.
       
    52 	self assert: '0+++++1' is: 3.
       
    53 	self assert: '0+++++++1' is: 4
       
    54 !
       
    55 
       
    56 testPostfixSub
       
    57 	self assert: '1--' is: 0.
       
    58 	self assert: '2----' is: 0.
       
    59 	self assert: '3------' is: 0.
       
    60 
       
    61 	self assert: '2---1' is: 0.
       
    62 	self assert: '3-----1' is: 0.
       
    63 	self assert: '4-------1' is: 0.
       
    64 !
       
    65 
       
    66 testPrefixNegate
       
    67 	self assert: '1' is: 1.
       
    68 	self assert: '-1' is: -1.
       
    69 	self assert: '--1' is: 1.
       
    70 	self assert: '---1' is: -1
       
    71 ! !
       
    72 
       
    73 !PPExpressionParserTest class methodsFor:'documentation'!
       
    74 
       
    75 version
       
    76     ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPExpressionParserTest.st,v 1.4 2014-03-04 14:34:13 cg Exp $'
       
    77 !
       
    78 
       
    79 version_CVS
       
    80     ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPExpressionParserTest.st,v 1.4 2014-03-04 14:34:13 cg Exp $'
       
    81 !
       
    82 
       
    83 version_SVN
       
    84     ^ '$Id: PPExpressionParserTest.st,v 1.4 2014-03-04 14:34:13 cg Exp $'
       
    85 ! !
       
    86