PPExpressionParserTest.st
author Jan Vrany <jan.vrany@fit.cvut.cz>
Mon, 22 Apr 2013 15:26:46 +0200
changeset 142 76aa9cf6568e
parent 13 57c26569b92b
child 187 7532226d6389
permissions -rw-r--r--
initial checkin

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

PPArithmeticParserTest subclass:#PPExpressionParserTest
	instanceVariableNames:''
	classVariableNames:''
	poolDictionaries:''
	category:'PetitTests-Tests'
!


!PPExpressionParserTest class methodsFor:'testing'!

shouldInheritSelectors
	^ true
! !

!PPExpressionParserTest methodsFor:'accessing'!

parserInstance
	| expression parens number |
	expression := PPExpressionParser new.
	parens := $( asParser token trim , expression , $) asParser token trim
		==> [ :nodes | nodes second ].
	number := (#digit asParser plus , ($. asParser , #digit asParser plus) optional) token trim
		==> [ :token | token value asNumber ].
	expression term: parens / number.
	expression
		group: [ :g |
			g prefix: $- asParser token trim do: [ :op :a | a negated ] ];
		group: [ :g |
			g postfix: '++' asParser token trim do: [ :a :op | a + 1 ].
			g postfix: '--' asParser token trim do: [ :a :op | a - 1 ] ];
		group: [ :g |
			g right: $^ asParser token trim do: [ :a :op :b | a raisedTo: b ] ];
		group: [ :g |
			g left: $* asParser token trim do: [ :a :op :b | a * b ].
			g left: $/ asParser token trim do: [ :a :op :b | a / b ] ];
		group: [ :g |
			g left: $+ asParser token trim do: [ :a :op :b | a + b ].
			g left: $- asParser token trim do: [ :a :op :b | a - b ] ].
	^ expression end
! !

!PPExpressionParserTest methodsFor:'testing'!

testPostfixAdd
	self assert: '0++' is: 1.
	self assert: '0++++' is: 2.
	self assert: '0++++++' is: 3.

	self assert: '0+++1' is: 2.
	self assert: '0+++++1' is: 3.
	self assert: '0+++++++1' is: 4
!

testPostfixSub
	self assert: '1--' is: 0.
	self assert: '2----' is: 0.
	self assert: '3------' is: 0.

	self assert: '2---1' is: 0.
	self assert: '3-----1' is: 0.
	self assert: '4-------1' is: 0.
!

testPrefixNegate
	self assert: '1' is: 1.
	self assert: '-1' is: -1.
	self assert: '--1' is: 1.
	self assert: '---1' is: -1
! !

!PPExpressionParserTest class methodsFor:'documentation'!

version
    ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPExpressionParserTest.st,v 1.3 2012-05-04 21:59:27 vrany Exp $'
!

version_CVS
    ^ '$Header: /cvs/stx/stx/goodies/petitparser/PPExpressionParserTest.st,v 1.3 2012-05-04 21:59:27 vrany Exp $'
!

version_SVN
    ^ '§Id: PPExpressionParserTest.st 4 2010-12-18 17:02:23Z kursjan §'
! !