tests/PPObjectTest.st
changeset 568 f63668a781b1
equal deleted inserted replaced
567:3e129388a1a6 568:f63668a781b1
       
     1 "{ Package: 'stx:goodies/petitparser/tests' }"
       
     2 
       
     3 "{ NameSpace: Smalltalk }"
       
     4 
       
     5 PPAbstractParserTest subclass:#PPObjectTest
       
     6 	instanceVariableNames:''
       
     7 	classVariableNames:''
       
     8 	poolDictionaries:''
       
     9 	category:'PetitTests-Tests'
       
    10 !
       
    11 
       
    12 
       
    13 !PPObjectTest methodsFor:'parsers'!
       
    14 
       
    15 integer
       
    16 	^ PPPredicateObjectParser
       
    17 		on: [ :each | each isInteger ]
       
    18 		message: 'integer expected'
       
    19 !
       
    20 
       
    21 string
       
    22 	^ PPPredicateObjectParser
       
    23 		on: [ :each | each isString ]
       
    24 		message: 'string expected'
       
    25 ! !
       
    26 
       
    27 !PPObjectTest methodsFor:'testing'!
       
    28 
       
    29 testInteger
       
    30 	self assert: self integer parse: #(123) to: 123.
       
    31 	self assert: self integer fail: #('abc')
       
    32 !
       
    33 
       
    34 testString
       
    35 	self assert: self string parse: #('abc') to: 'abc'.
       
    36 	self assert: self string fail: #(123)
       
    37 ! !
       
    38 
       
    39 !PPObjectTest methodsFor:'testing-fancy'!
       
    40 
       
    41 testFibonacci
       
    42 	"This parser accepts fibonacci sequences with arbitrary start pairs."
       
    43 	
       
    44 	| parser |
       
    45 	parser := ((self integer , self integer) end ==> [ :pair | pair first + pair last ])
       
    46 		/ (self integer , (self integer , self integer) and >=> [ :stream :continuation |
       
    47 			| result |
       
    48 			result := continuation value.
       
    49 			(result isPetitFailure or: [ result first + result last first ~= result last last ])
       
    50 				ifFalse: [ parser parseOn: stream ]
       
    51 				ifTrue: [ PPFailure message: 'invalid fibonacci sequence' at: stream position ] ]).
       
    52 	self assert: parser parse: #(1 1) to: 2.
       
    53 	self assert: parser parse: #(1 1 2) to: 3.
       
    54 	self assert: parser parse: #(1 1 2 3) to: 5.
       
    55 	self assert: parser parse: #(1 1 2 3 5) to: 8.
       
    56 	self assert: parser parse: #(1 1 2 3 5 8) to: 13.
       
    57 	self assert: parser parse: #(1 1 2 3 5 8 13) to: 21.
       
    58 	self assert: parser fail: #().
       
    59 	self assert: parser fail: #(1).
       
    60 	self assert: parser fail: #(1 2 3 4) end: 2
       
    61 	
       
    62 ! !
       
    63 
       
    64 !PPObjectTest methodsFor:'testing-operators'!
       
    65 
       
    66 testChoice
       
    67 	| parser |
       
    68 	parser := self integer / self string.
       
    69 	self assert: parser parse: #(123) to: 123.
       
    70 	self assert: parser parse: #('abc') to: 'abc'
       
    71 !
       
    72 
       
    73 testSequence
       
    74 	| parser |
       
    75 	parser := self integer , self string.
       
    76 	self assert: parser parse: #(123 'abc') to: #(123 'abc').
       
    77 	self assert: parser fail: #(123 456).
       
    78 	self assert: parser fail: #('abc' 'def').
       
    79 	self assert: parser fail: #('abc' 123)
       
    80 	
       
    81 ! !
       
    82 
       
    83 !PPObjectTest class methodsFor:'documentation'!
       
    84 
       
    85 version
       
    86     ^ '$Header$'
       
    87 !
       
    88 
       
    89 version_CVS
       
    90     ^ '$Header$'
       
    91 ! !
       
    92