tests/PPLambdaParserTest.st
changeset 562 8e07a5704f6b
equal deleted inserted replaced
561:9885688dbd3b 562:8e07a5704f6b
       
     1 "{ Package: 'stx:goodies/petitparser/tests' }"
       
     2 
       
     3 "{ NameSpace: Smalltalk }"
       
     4 
       
     5 PPCompositeParserTest subclass:#PPLambdaParserTest
       
     6 	instanceVariableNames:''
       
     7 	classVariableNames:''
       
     8 	poolDictionaries:''
       
     9 	category:'PetitTests-Tests'
       
    10 !
       
    11 
       
    12 
       
    13 !PPLambdaParserTest methodsFor:'accessing'!
       
    14 
       
    15 parserClass
       
    16 	^ PPLambdaParser
       
    17 ! !
       
    18 
       
    19 !PPLambdaParserTest methodsFor:'testing'!
       
    20 
       
    21 testAbstraction
       
    22 	self assert: '\x.y' is: #('x' 'y').
       
    23 	self assert: '\x.\y.z' is: #('x' ('y' 'z'))
       
    24 !
       
    25 
       
    26 testApplication
       
    27 	self assert: '(x x)' is: #('x' 'x').
       
    28 	self assert: '(x y)' is: #('x' 'y').
       
    29 	self assert: '((x y) z)' is: #(('x' 'y') 'z').
       
    30 	self assert: '(x (y z))' is: #('x' ('y' 'z'))
       
    31 !
       
    32 
       
    33 testVariable
       
    34 	self assert: 'x' is: 'x'.
       
    35 	self assert: 'xy' is: 'xy'.
       
    36 	self assert: 'x12' is: 'x12'
       
    37 ! !
       
    38 
       
    39 !PPLambdaParserTest methodsFor:'testing-curch'!
       
    40 
       
    41 testAnd
       
    42 	self assert: self parserClass and = #('p' ('q' (('p' 'q') 'p')))
       
    43 !
       
    44 
       
    45 testFalse
       
    46 	self assert: self parserClass false = #('x' ('y' 'y'))
       
    47 !
       
    48 
       
    49 testIfThenElse
       
    50 	self assert: self parserClass ifthenelse = #('p' 'p')
       
    51 !
       
    52 
       
    53 testNot
       
    54 	self assert: self parserClass not = #('p' ('a' ('b' (('p' 'b') 'a'))))
       
    55 !
       
    56 
       
    57 testOr
       
    58 	self assert: self parserClass or = #('p' ('q' (('p' 'p') 'q')))
       
    59 !
       
    60 
       
    61 testTrue
       
    62 	self assert: self parserClass true = #('x' ('y' 'x'))
       
    63 ! !
       
    64 
       
    65 !PPLambdaParserTest methodsFor:'testing-utilities'!
       
    66 
       
    67 testParseOnError
       
    68 	| beenHere |
       
    69 	result := self parserClass
       
    70 		parse: '\x.y'
       
    71 		onError: [ self fail ].
       
    72 	self assert: result = #('x' 'y').
       
    73 
       
    74 	beenHere := false.
       
    75 	result := self parserClass
       
    76 		parse: '\x.'
       
    77 		onError: [ beenHere := true ].
       
    78 	self assert: beenHere.
       
    79 
       
    80 	beenHere := false.
       
    81 	result := self parserClass
       
    82 		parse: '\x.'
       
    83 		onError: [ :fail | beenHere := true. fail ].
       
    84 	self assert: beenHere.
       
    85 	self assert: (result message findString: '$(') > 0.
       
    86 	self assert: (result message findString: 'expected') > 0.
       
    87 	self assert: (result position = 0).
       
    88 
       
    89 	beenHere := false.
       
    90 	result := self parserClass
       
    91 		parse: '\x.'
       
    92 		onError: [ :msg :pos | 
       
    93 			self assert: (msg findString: '$(') > 0.
       
    94 			self assert: (msg findString: 'expected') > 0.
       
    95 			self assert: (pos = 0).
       
    96 			beenHere := true ].
       
    97 	self assert: result.
       
    98 	self assert: beenHere
       
    99 !
       
   100 
       
   101 testParseStartingAtOnError
       
   102 	| beenHere |
       
   103 	result := self parserClass
       
   104 		parse: 'x'
       
   105 		startingAt: #variable
       
   106 		onError: [ self fail ].
       
   107 	self assert: result = 'x'.
       
   108 	
       
   109 	beenHere := false.
       
   110 	result := self parserClass
       
   111 		parse: '\'
       
   112 		startingAt: #variable
       
   113 		onError: [ beenHere := true ].
       
   114 	self assert: beenHere.
       
   115 	
       
   116 	beenHere := false.
       
   117 	result := self parserClass
       
   118 		parse: '\'
       
   119 		startingAt: #variable
       
   120 		onError: [ :fail | beenHere := true. fail ].
       
   121 	self assert: beenHere.
       
   122 	self assert: result message = 'letter expected'.
       
   123 	self assert: result position = 0.
       
   124 
       
   125 	beenHere := false.
       
   126 	result := self parserClass
       
   127 		parse: '\'
       
   128 		startingAt: #variable
       
   129 		onError: [ :msg :pos | 
       
   130 			self assert: msg = 'letter expected'.
       
   131 			self assert: pos = 0.
       
   132 			beenHere := true ].
       
   133 	self assert: beenHere
       
   134 !
       
   135 
       
   136 testProductionAt
       
   137 	self assert: (parser productionAt: #foo) isNil.
       
   138 	self assert: (parser productionAt: #foo ifAbsent: [ true ]).
       
   139 	
       
   140 	self assert: (parser productionAt: #start) notNil.
       
   141 	self assert: (parser productionAt: #start ifAbsent: [ true ]) notNil.
       
   142 	
       
   143 	self assert: (parser productionAt: #variable) notNil.
       
   144 	self assert: (parser productionAt: #variable ifAbsent: [ true ]) notNil
       
   145 ! !
       
   146 
       
   147 !PPLambdaParserTest class methodsFor:'documentation'!
       
   148 
       
   149 version
       
   150     ^ '$Header$'
       
   151 !
       
   152 
       
   153 version_CVS
       
   154     ^ '$Header$'
       
   155 ! !
       
   156