PPParserTest.st
changeset 4 90de244a7fa2
parent 0 739fe9b7253e
child 33 78c58a116921
equal deleted inserted replaced
3:e1b11f74e142 4:90de244a7fa2
     1 "{ Package: 'squeak:petitparser' }"
     1 "{ Package: 'stx:goodies/petitparser' }"
     2 
     2 
     3 PPAbstractParseTest subclass:#PPParserTest
     3 PPAbstractParseTest subclass:#PPParserTest
     4 	instanceVariableNames:''
     4 	instanceVariableNames:''
     5 	classVariableNames:''
     5 	classVariableNames:''
     6 	poolDictionaries:''
     6 	poolDictionaries:''
    21 !
    21 !
    22 
    22 
    23 testAnd
    23 testAnd
    24 	| parser |
    24 	| parser |
    25 	parser := 'foo' asParser flatten , 'bar' asParser flatten and.
    25 	parser := 'foo' asParser flatten , 'bar' asParser flatten and.
    26 	
    26 
    27 	self assert: parser parse: 'foobar' to: #('foo' 'bar') end: 3.
    27 	self assert: parser parse: 'foobar' to: #('foo' 'bar') end: 3.
    28 	self assert: parser fail: 'foobaz'.
    28 	self assert: parser fail: 'foobaz'.
    29 	
    29 
    30 	parser := 'foo' asParser and.
    30 	parser := 'foo' asParser and.
    31 	self assert: parser and = parser
    31 	self assert: parser and = parser
    32 !
    32 !
    33 
    33 
    34 testAnswer
    34 testAnswer
    35 	| parser |
    35 	| parser |
    36 	parser := $a asParser answer: $b.
    36 	parser := $a asParser answer: $b.
    37 	
    37 
    38 	self assert: parser parse: 'a' to: $b.
    38 	self assert: parser parse: 'a' to: $b.
    39 	
    39 
    40 	self assert: parser fail: ''.
    40 	self assert: parser fail: ''.
    41 	self assert: parser fail: 'b'
    41 	self assert: parser fail: 'b'
    42 !
    42 !
    43 
    43 
    44 testBlock
    44 testBlock
    45 	| parser |
    45 	| parser |
    46 	parser := [ :s | s next ] asParser.
    46 	parser := [ :s | s next ] asParser.
    47 	
    47 
    48 	self assert: parser parse: 'ab' to: $a end: 1.
    48 	self assert: parser parse: 'ab' to: $a end: 1.
    49 	self assert: parser parse: 'b' to: $b.
    49 	self assert: parser parse: 'b' to: $b.
    50 	self assert: parser parse: '' to: nil
    50 	self assert: parser parse: '' to: nil
    51 !
    51 !
    52 
    52 
    53 testChoice
    53 testChoice
    54 	| parser |
    54 	| parser |
    55 	parser := $a asParser / $b asParser.
    55 	parser := $a asParser / $b asParser.
    56 	
    56 
    57 	self assert: parser parse: 'a' to: $a.
    57 	self assert: parser parse: 'a' to: $a.
    58 	self assert: parser parse: 'b' to: $b.
    58 	self assert: parser parse: 'b' to: $b.
    59 
    59 
    60 	self assert: parser parse: 'ab' to: $a end: 1.
    60 	self assert: parser parse: 'ab' to: $a end: 1.
    61 	self assert: parser parse: 'ba' to: $b end: 1.
    61 	self assert: parser parse: 'ba' to: $b end: 1.
    66 !
    66 !
    67 
    67 
    68 testDelimitedBy
    68 testDelimitedBy
    69 	| parser |
    69 	| parser |
    70 	parser := $a asParser delimitedBy: $b asParser.
    70 	parser := $a asParser delimitedBy: $b asParser.
    71 	
    71 
    72 	self assert: parser parse: 'a' to: #($a).
    72 	self assert: parser parse: 'a' to: #($a).
    73 	self assert: parser parse: 'aba' to: #($a $b $a).
    73 	self assert: parser parse: 'aba' to: #($a $b $a).
    74 	self assert: parser parse: 'ababa' to: #($a $b $a $b $a).
    74 	self assert: parser parse: 'ababa' to: #($a $b $a $b $a).
    75 
    75 
    76 	self assert: parser parse: 'ab' to: #($a $b).
    76 	self assert: parser parse: 'ab' to: #($a $b).
    77 	self assert: parser parse: 'abab' to: #($a $b $a $b).
    77 	self assert: parser parse: 'abab' to: #($a $b $a $b).
    78 	self assert: parser parse: 'ababab' to: #($a $b $a $b $a $b).
    78 	self assert: parser parse: 'ababab' to: #($a $b $a $b $a $b).
    79 	
    79 
    80 	self assert: parser parse: 'ac' to: #($a) end: 1.
    80 	self assert: parser parse: 'ac' to: #($a) end: 1.
    81 	self assert: parser parse: 'abc' to: #($a $b) end: 2.
    81 	self assert: parser parse: 'abc' to: #($a $b) end: 2.
    82 	self assert: parser parse: 'abac' to: #($a $b $a) end: 3.
    82 	self assert: parser parse: 'abac' to: #($a $b $a) end: 3.
    83 	self assert: parser parse: 'ababc' to: #($a $b $a $b) end: 4.
    83 	self assert: parser parse: 'ababc' to: #($a $b $a $b) end: 4.
    84 	
    84 
    85 	self assert: parser fail: ''.
    85 	self assert: parser fail: ''.
    86 	self assert: parser fail: 'b'.
    86 	self assert: parser fail: 'b'.
    87 	self assert: parser fail: 'c'
    87 	self assert: parser fail: 'c'
    88 !
    88 !
    89 
    89 
    90 testEndOfInput
    90 testEndOfInput
    91 	| parser |
    91 	| parser |
    92 	parser := PPEndOfInputParser on: $a asParser.
    92 	parser := PPEndOfInputParser on: $a asParser.
    93 	self assert: parser end = parser.
    93 	self assert: parser end = parser.
    94 	
    94 
    95 	self assert: parser parse: 'a' to: $a.
    95 	self assert: parser parse: 'a' to: $a.
    96 	self assert: parser fail: ''.
    96 	self assert: parser fail: ''.
    97 	self assert: parser fail: 'aa'
    97 	self assert: parser fail: 'aa'
    98 !
    98 !
    99 
    99 
   106 !
   106 !
   107 
   107 
   108 testEpsilon
   108 testEpsilon
   109 	| parser |
   109 	| parser |
   110 	parser := nil asParser.
   110 	parser := nil asParser.
   111 	
   111 
   112 	self assert: parser parse: '' to: nil.
   112 	self assert: parser parse: '' to: nil.
   113 	
   113 
   114 	self assert: parser parse: 'a' to: nil end: 0.
   114 	self assert: parser parse: 'a' to: nil end: 0.
   115 	self assert: parser parse: 'ab' to: nil end: 0
   115 	self assert: parser parse: 'ab' to: nil end: 0
   116 !
   116 !
   117 
   117 
   118 testFailing
   118 testFailing
   119 	| parser result |
   119 	| parser result |
   120 	parser := PPFailingParser message: 'Plonk'.
   120 	parser := PPFailingParser message: 'Plonk'.
   121 	self assert: parser message = 'Plonk'.
   121 	self assert: parser message = 'Plonk'.
   122 	
   122 
   123 	self assert: parser fail: ''.
   123 	self assert: parser fail: ''.
   124 	self assert: parser fail: 'a'.
   124 	self assert: parser fail: 'a'.
   125 	self assert: parser fail: 'aa'.
   125 	self assert: parser fail: 'aa'.
   126 	
   126 
   127 	result := parser parse: 'a'.
   127 	result := parser parse: 'a'.
   128 	self assert: result message = 'Plonk'.
   128 	self assert: result message = 'Plonk'.
   129 	self assert: result printString = 'Plonk at 0'
   129 	self assert: result printString = 'Plonk at 0'
   130 !
   130 !
   131 
   131 
   132 testFlatten
   132 testFlatten
   133 	| parser |
   133 	| parser |
   134 	parser := $a asParser flatten.
   134 	parser := $a asParser flatten.
   135 	
   135 
   136 	self assert: parser parse: 'a' to: 'a'.
   136 	self assert: parser parse: 'a' to: 'a'.
   137 	self assert: parser parse: #($a) to: #($a).
   137 	self assert: parser parse: #($a) to: #($a).
   138 	
   138 
   139 	self assert: parser fail: ''.
   139 	self assert: parser fail: ''.
   140 	self assert: parser fail: 'b'
   140 	self assert: parser fail: 'b'
   141 !
   141 !
   142 
   142 
   143 testLiteralObject
   143 testLiteralObject
   144 	| parser |
   144 	| parser |
   145 	parser := PPLiteralObjectParser 
   145 	parser := PPLiteralObjectParser
   146 		on: $a
   146 		on: $a
   147 		message: 'letter "a" expected'.
   147 		message: 'letter "a" expected'.
   148 	self assert: parser literal = $a.
   148 	self assert: parser literal = $a.
   149 	self assert: parser message = 'letter "a" expected'.
   149 	self assert: parser message = 'letter "a" expected'.
   150 	
   150 
   151 	self assert: parser parse: 'a' to: $a.
   151 	self assert: parser parse: 'a' to: $a.
   152 	self assert: parser fail: 'b'
   152 	self assert: parser fail: 'b'
   153 	
   153 
   154 !
   154 !
   155 
   155 
   156 testLiteralObjectCaseInsensitive
   156 testLiteralObjectCaseInsensitive
   157 	| parser |
   157 	| parser |
   158 	parser := $a asParser caseInsensitive.
   158 	parser := $a asParser caseInsensitive.
   159 	
   159 
   160 	self assert: parser parse: 'a' to: $a.
   160 	self assert: parser parse: 'a' to: $a.
   161 	self assert: parser parse: 'A' to: $A.
   161 	self assert: parser parse: 'A' to: $A.
   162 
   162 
   163 	self assert: parser fail: ''.
   163 	self assert: parser fail: ''.
   164 	self assert: parser fail: 'b'.
   164 	self assert: parser fail: 'b'.
   165 	self assert: parser fail: 'B'
   165 	self assert: parser fail: 'B'
   166 	
   166 
   167 !
   167 !
   168 
   168 
   169 testLiteralSequence
   169 testLiteralSequence
   170 	| parser |
   170 	| parser |
   171 	parser := PPLiteralSequenceParser 
   171 	parser := PPLiteralSequenceParser
   172 		on: 'abc'
   172 		on: 'abc'
   173 		message: 'sequence "abc" expected'.
   173 		message: 'sequence "abc" expected'.
   174 	self assert: parser size = 3.
   174 	self assert: parser size = 3.
   175 	self assert: parser literal = 'abc'.
   175 	self assert: parser literal = 'abc'.
   176 	self assert: parser message = 'sequence "abc" expected'.
   176 	self assert: parser message = 'sequence "abc" expected'.
   177 	
   177 
   178 	self assert: parser parse: 'abc' to: 'abc'.
   178 	self assert: parser parse: 'abc' to: 'abc'.
   179 	self assert: parser fail: 'ab'.
   179 	self assert: parser fail: 'ab'.
   180 	self assert: parser fail: 'abd'
   180 	self assert: parser fail: 'abd'
   181 !
   181 !
   182 
   182 
   183 testLiteralSequenceCaseInsensitive
   183 testLiteralSequenceCaseInsensitive
   184 	| parser |
   184 	| parser |
   185 	parser := 'abc' asParser caseInsensitive.
   185 	parser := 'abc' asParser caseInsensitive.
   186 	
   186 
   187 	self assert: parser parse: 'abc' to: 'abc'.
   187 	self assert: parser parse: 'abc' to: 'abc'.
   188 	self assert: parser parse: 'ABC' to: 'ABC'.
   188 	self assert: parser parse: 'ABC' to: 'ABC'.
   189 	self assert: parser parse: 'abC' to: 'abC'.
   189 	self assert: parser parse: 'abC' to: 'abC'.
   190 	self assert: parser parse: 'AbC' to: 'AbC'.
   190 	self assert: parser parse: 'AbC' to: 'AbC'.
   191 	
   191 
   192 	self assert: parser fail: 'ab'.
   192 	self assert: parser fail: 'ab'.
   193 	self assert: parser fail: 'abd'
   193 	self assert: parser fail: 'abd'
   194 !
   194 !
   195 
   195 
   196 testMax
   196 testMax
   202 	self assert: parser parse: '' to: #().
   202 	self assert: parser parse: '' to: #().
   203 	self assert: parser parse: 'a' to: #($a).
   203 	self assert: parser parse: 'a' to: #($a).
   204 	self assert: parser parse: 'aa' to: #($a $a).
   204 	self assert: parser parse: 'aa' to: #($a $a).
   205 	self assert: parser parse: 'aaa' to: #($a $a) end: 2.
   205 	self assert: parser parse: 'aaa' to: #($a $a) end: 2.
   206 	self assert: parser parse: 'aaaa' to: #($a $a) end: 2.
   206 	self assert: parser parse: 'aaaa' to: #($a $a) end: 2.
   207 	
   207 
   208 	self assert: (parser printString endsWith: '[0, 2]')
   208 	self assert: (parser printString endsWith: '[0, 2]')
   209 !
   209 !
   210 
   210 
   211 testMemoized
   211 testMemoized
   212 	| count parser twice |
   212 	| count parser twice |
   213 	count := 0.
   213 	count := 0.
   214 	parser := [ :s | count := count + 1. s next ] asParser memoized.
   214 	parser := [ :s | count := count + 1. s next ] asParser memoized.
   215 	twice := parser and , parser.
   215 	twice := parser and , parser.
   216 	
   216 
   217 	count := 0.
   217 	count := 0.
   218 	self assert: parser parse: 'a' to: $a.
   218 	self assert: parser parse: 'a' to: $a.
   219 	self assert: count = 1.
   219 	self assert: count = 1.
   220 
   220 
   221 	count := 0.
   221 	count := 0.
   222 	self assert: twice parse: 'a' to: #($a $a).
   222 	self assert: twice parse: 'a' to: #($a $a).
   223 	self assert: count = 1.
   223 	self assert: count = 1.
   224 	
   224 
   225 	self assert: parser memoized = parser
   225 	self assert: parser memoized = parser
   226 !
   226 !
   227 
   227 
   228 testMin
   228 testMin
   229 	| parser |
   229 	| parser |
   230 	parser := $a asParser min: 2.
   230 	parser := $a asParser min: 2.
   231 	self assert: parser min = 2.
   231 	self assert: parser min = 2.
   232 	self assert: parser max > parser min.
   232 	self assert: parser max > parser min.
   233 	
   233 
   234 	self assert: parser fail: ''.
   234 	self assert: parser fail: ''.
   235 	self assert: parser fail: 'a'.
   235 	self assert: parser fail: 'a'.
   236 	self assert: parser parse: 'aa' to: #($a $a).
   236 	self assert: parser parse: 'aa' to: #($a $a).
   237 	self assert: parser parse: 'aaa' to: #($a $a $a).
   237 	self assert: parser parse: 'aaa' to: #($a $a $a).
   238 	self assert: parser parse: 'aaaa' to: #($a $a $a $a).
   238 	self assert: parser parse: 'aaaa' to: #($a $a $a $a).
   239 	
   239 
   240 	self assert: (parser printString endsWith: '[2, *]')
   240 	self assert: (parser printString endsWith: '[2, *]')
   241 !
   241 !
   242 
   242 
   243 testMinMax
   243 testMinMax
   244 	| parser |
   244 	| parser |
   245 	parser := $a asParser min: 2 max: 4.
   245 	parser := $a asParser min: 2 max: 4.
   246 	self assert: parser min = 2.
   246 	self assert: parser min = 2.
   247 	self assert: parser max = 4.
   247 	self assert: parser max = 4.
   248 	
   248 
   249 	self assert: parser fail: ''.
   249 	self assert: parser fail: ''.
   250 	self assert: parser fail: 'a'.
   250 	self assert: parser fail: 'a'.
   251 	self assert: parser parse: 'aa' to: #($a $a).
   251 	self assert: parser parse: 'aa' to: #($a $a).
   252 	self assert: parser parse: 'aaa' to: #($a $a $a).
   252 	self assert: parser parse: 'aaa' to: #($a $a $a).
   253 	self assert: parser parse: 'aaaa' to: #($a $a $a $a).
   253 	self assert: parser parse: 'aaaa' to: #($a $a $a $a).
   254 	self assert: parser parse: 'aaaaa' to: #($a $a $a $a) end: 4.
   254 	self assert: parser parse: 'aaaaa' to: #($a $a $a $a) end: 4.
   255 	self assert: parser parse: 'aaaaaa' to: #($a $a $a $a) end: 4.
   255 	self assert: parser parse: 'aaaaaa' to: #($a $a $a $a) end: 4.
   256 	
   256 
   257 	self assert: (parser printString endsWith: '[2, 4]')
   257 	self assert: (parser printString endsWith: '[2, 4]')
   258 !
   258 !
   259 
   259 
   260 testNegate
   260 testNegate
   261 	| parser |
   261 	| parser |
   262 	parser := 'foo' asParser negate.
   262 	parser := 'foo' asParser negate.
   263 	
   263 
   264 	self assert: parser parse: 'f' to: $f end: 1.
   264 	self assert: parser parse: 'f' to: $f end: 1.
   265 	self assert: parser parse: 'fo' to: $f end: 1.
   265 	self assert: parser parse: 'fo' to: $f end: 1.
   266 	self assert: parser parse: 'fob' to: $f end: 1.
   266 	self assert: parser parse: 'fob' to: $f end: 1.
   267 	self assert: parser parse: 'ffoo' to: $f end: 1.
   267 	self assert: parser parse: 'ffoo' to: $f end: 1.
   268 	
   268 
   269 	self assert: parser fail: ''.
   269 	self assert: parser fail: ''.
   270 	self assert: parser fail: 'foo'
   270 	self assert: parser fail: 'foo'
   271 !
   271 !
   272 
   272 
   273 testNot
   273 testNot
   274 	| parser |
   274 	| parser |
   275 	parser := 'foo' asParser flatten , 'bar' asParser flatten not.
   275 	parser := 'foo' asParser flatten , 'bar' asParser flatten not.
   276 	
   276 
   277 	self assert: parser parse: 'foobaz' to: #('foo' nil) end: 3.
   277 	self assert: parser parse: 'foobaz' to: #('foo' nil) end: 3.
   278 	self assert: parser fail: 'foobar'
   278 	self assert: parser fail: 'foobar'
   279 !
   279 !
   280 
   280 
   281 testOptional
   281 testOptional
   282 	| parser |
   282 	| parser |
   283 	parser := $a asParser optional.
   283 	parser := $a asParser optional.
   284 	
   284 
   285 	self assert: parser parse: '' to: nil.
   285 	self assert: parser parse: '' to: nil.
   286 	self assert: parser parse: 'a' to: $a.
   286 	self assert: parser parse: 'a' to: $a.
   287 	
   287 
   288 	self assert: parser parse: 'aa' to: $a end: 1.
   288 	self assert: parser parse: 'aa' to: $a end: 1.
   289 	self assert: parser parse: 'ab' to: $a end: 1.
   289 	self assert: parser parse: 'ab' to: $a end: 1.
   290 	self assert: parser parse: 'b' to: nil end: 0.
   290 	self assert: parser parse: 'b' to: nil end: 0.
   291 	self assert: parser parse: 'bb' to: nil end: 0.
   291 	self assert: parser parse: 'bb' to: nil end: 0.
   292 	self assert: parser parse: 'ba' to: nil end: 0
   292 	self assert: parser parse: 'ba' to: nil end: 0
   300 	self assert: (parser permutation: #(1)) parse: '123' to: #($1).
   300 	self assert: (parser permutation: #(1)) parse: '123' to: #($1).
   301 	self assert: (parser permutation: #(1 3)) parse: '123' to: #($1 $3).
   301 	self assert: (parser permutation: #(1 3)) parse: '123' to: #($1 $3).
   302 	self assert: (parser permutation: #(3 1)) parse: '123' to: #($3 $1).
   302 	self assert: (parser permutation: #(3 1)) parse: '123' to: #($3 $1).
   303 	self assert: (parser permutation: #(2 2)) parse: '123' to: #($2 $2).
   303 	self assert: (parser permutation: #(2 2)) parse: '123' to: #($2 $2).
   304 	self assert: (parser permutation: #(3 2 1)) parse: '123' to: #($3 $2 $1).
   304 	self assert: (parser permutation: #(3 2 1)) parse: '123' to: #($3 $2 $1).
   305 	
   305 
   306 	self should: [ parser permutation: #(0) ] raise: Error.
   306 	self should: [ parser permutation: #(0) ] raise: Error.
   307 	self should: [ parser permutation: #(4) ] raise: Error.
   307 	self should: [ parser permutation: #(4) ] raise: Error.
   308 	self should: [ parser permutation: #($2) ] raise: Error
   308 	self should: [ parser permutation: #($2) ] raise: Error
   309 !
   309 !
   310 
   310 
   318 testPlus
   318 testPlus
   319 	| parser |
   319 	| parser |
   320 	parser := $a asParser plus.
   320 	parser := $a asParser plus.
   321 	self assert: parser min = 1.
   321 	self assert: parser min = 1.
   322 	self assert: parser max > parser min.
   322 	self assert: parser max > parser min.
   323 	
   323 
   324 	self assert: parser parse: 'a' to: #($a).
   324 	self assert: parser parse: 'a' to: #($a).
   325 	self assert: parser parse: 'aa' to: #($a $a).
   325 	self assert: parser parse: 'aa' to: #($a $a).
   326 	self assert: parser parse: 'aaa' to: #($a $a $a).
   326 	self assert: parser parse: 'aaa' to: #($a $a $a).
   327 	
   327 
   328 	self assert: parser parse: 'ab' to: #($a) end: 1.
   328 	self assert: parser parse: 'ab' to: #($a) end: 1.
   329 	self assert: parser parse: 'aab' to: #($a $a) end: 2.
   329 	self assert: parser parse: 'aab' to: #($a $a) end: 2.
   330 	self assert: parser parse: 'aaab' to: #($a $a $a) end: 3.
   330 	self assert: parser parse: 'aaab' to: #($a $a $a) end: 3.
   331 	
   331 
   332 	self assert: parser fail: ''.
   332 	self assert: parser fail: ''.
   333 	self assert: parser fail: 'b'.
   333 	self assert: parser fail: 'b'.
   334 	self assert: parser fail: 'ba'
   334 	self assert: parser fail: 'ba'
   335 !
   335 !
   336 
   336 
   375 !
   375 !
   376 
   376 
   377 testSeparatedBy
   377 testSeparatedBy
   378 	| parser |
   378 	| parser |
   379 	parser := $a asParser separatedBy: $b asParser.
   379 	parser := $a asParser separatedBy: $b asParser.
   380 	
   380 
   381 	self assert: parser parse: 'a' to: #($a).
   381 	self assert: parser parse: 'a' to: #($a).
   382 	self assert: parser parse: 'aba' to: #($a $b $a).
   382 	self assert: parser parse: 'aba' to: #($a $b $a).
   383 	self assert: parser parse: 'ababa' to: #($a $b $a $b $a).
   383 	self assert: parser parse: 'ababa' to: #($a $b $a $b $a).
   384 	
   384 
   385 	self assert: parser parse: 'ab' to: #($a) end: 1.
   385 	self assert: parser parse: 'ab' to: #($a) end: 1.
   386 	self assert: parser parse: 'abab' to: #($a $b $a) end: 3.
   386 	self assert: parser parse: 'abab' to: #($a $b $a) end: 3.
   387 	self assert: parser parse: 'ac' to: #($a) end: 1.
   387 	self assert: parser parse: 'ac' to: #($a) end: 1.
   388 	self assert: parser parse: 'abac' to: #($a $b $a) end: 3.
   388 	self assert: parser parse: 'abac' to: #($a $b $a) end: 3.
   389 	
   389 
   390 	self assert: parser fail: ''.
   390 	self assert: parser fail: ''.
   391 	self assert: parser fail: 'c'
   391 	self assert: parser fail: 'c'
   392 !
   392 !
   393 
   393 
   394 testSequence
   394 testSequence
   395 	| parser |
   395 	| parser |
   396 	parser := $a asParser , $b asParser.
   396 	parser := $a asParser , $b asParser.
   397 	
   397 
   398 	self assert: parser parse: 'ab' to: #($a $b).
   398 	self assert: parser parse: 'ab' to: #($a $b).
   399 	
   399 
   400 	self assert: parser parse: 'aba' to: #($a $b) end: 2.
   400 	self assert: parser parse: 'aba' to: #($a $b) end: 2.
   401 	self assert: parser parse: 'abb' to: #($a $b) end: 2.
   401 	self assert: parser parse: 'abb' to: #($a $b) end: 2.
   402 	
   402 
   403 	self assert: parser fail: ''.
   403 	self assert: parser fail: ''.
   404 	self assert: parser fail: 'a'.
   404 	self assert: parser fail: 'a'.
   405 	self assert: parser fail: 'aa'.
   405 	self assert: parser fail: 'aa'.
   406 	self assert: parser fail: 'ba'.
   406 	self assert: parser fail: 'ba'.
   407 	self assert: parser fail: 'bab'
   407 	self assert: parser fail: 'bab'
   410 testStar
   410 testStar
   411 	| parser |
   411 	| parser |
   412 	parser := $a asParser star.
   412 	parser := $a asParser star.
   413 	self assert: parser min = 0.
   413 	self assert: parser min = 0.
   414 	self assert: parser max > parser min.
   414 	self assert: parser max > parser min.
   415 	
   415 
   416 	self assert: parser parse: '' to: #().
   416 	self assert: parser parse: '' to: #().
   417 	self assert: parser parse: 'a' to: #($a).
   417 	self assert: parser parse: 'a' to: #($a).
   418 	self assert: parser parse: 'aa' to: #($a $a).
   418 	self assert: parser parse: 'aa' to: #($a $a).
   419 	self assert: parser parse: 'aaa' to: #($a $a $a).
   419 	self assert: parser parse: 'aaa' to: #($a $a $a).
   420 	
   420 
   421 	self assert: parser parse: 'b' to: #() end: 0.
   421 	self assert: parser parse: 'b' to: #() end: 0.
   422 	self assert: parser parse: 'ab' to: #($a) end: 1.
   422 	self assert: parser parse: 'ab' to: #($a) end: 1.
   423 	self assert: parser parse: 'aab' to: #($a $a) end: 2.
   423 	self assert: parser parse: 'aab' to: #($a $a) end: 2.
   424 	self assert: parser parse: 'aaab' to: #($a $a $a) end: 3
   424 	self assert: parser parse: 'aaab' to: #($a $a $a) end: 3
   425 !
   425 !
   469 !
   469 !
   470 
   470 
   471 testTimes
   471 testTimes
   472 	| parser |
   472 	| parser |
   473 	parser := $a asParser times: 2.
   473 	parser := $a asParser times: 2.
   474 	
   474 
   475 	self assert: parser fail: ''.
   475 	self assert: parser fail: ''.
   476 	self assert: parser fail: 'a'.
   476 	self assert: parser fail: 'a'.
   477 	self assert: parser parse: 'aa' to: #($a $a).
   477 	self assert: parser parse: 'aa' to: #($a $a).
   478 	self assert: parser parse: 'aaa' to: #($a $a) end: 2
   478 	self assert: parser parse: 'aaa' to: #($a $a) end: 2
   479 !
   479 !
   480 
   480 
   481 testToken
   481 testToken
   482 	| parser |
   482 	| parser |
   483 	parser := $a asParser token.
   483 	parser := $a asParser token.
   484 	self assert: parser tokenClass = PPToken.
   484 	self assert: parser tokenClass = PPToken.
   485 	self assert: parser parse: 'a' toToken: 1 stop: 1.	
   485 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   486 	self assert: parser fail: 'b'.
   486 	self assert: parser fail: 'b'.
   487 	self assert: parser fail: ''.
   487 	self assert: parser fail: ''.
   488 	
   488 
   489 	parser := $a asParser token: PPToken.
   489 	parser := $a asParser token: PPToken.
   490 	self assert: parser tokenClass = PPToken.
   490 	self assert: parser tokenClass = PPToken.
   491 	self assert: parser parse: 'a' toToken: 1 stop: 1.	
   491 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   492 	self assert: parser fail: ''.
   492 	self assert: parser fail: ''.
   493 	self assert: parser fail: 'b'
   493 	self assert: parser fail: 'b'
   494 !
   494 !
   495 
   495 
   496 testTrim
   496 testTrim
   497 	| parser |
   497 	| parser |
   498 	parser := $a asParser token trim.
   498 	parser := $a asParser token trim.
   499 	self assert: parser trim = parser.
   499 	self assert: parser trim = parser.
   500 	
   500 
   501 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   501 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   502 	self assert: parser parse: 'a ' toToken: 1 stop: 1.
   502 	self assert: parser parse: 'a ' toToken: 1 stop: 1.
   503 	self assert: parser parse: 'a	' toToken: 1 stop: 1.
   503 	self assert: parser parse: 'a   ' toToken: 1 stop: 1.
   504 	self assert: parser parse: 'a  ' toToken: 1 stop: 1.
   504 	self assert: parser parse: 'a  ' toToken: 1 stop: 1.
   505 	self assert: parser parse: 'a 
   505 	self assert: parser parse: 'a
   506 	 ' toToken: 1 stop: 1.
   506 	 ' toToken: 1 stop: 1.
   507 		
   507 
   508 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   508 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   509 	self assert: parser parse: ' a' toToken: 2 stop: 2.
   509 	self assert: parser parse: ' a' toToken: 2 stop: 2.
   510 	self assert: parser parse: '	a' toToken: 2 stop: 2.
   510 	self assert: parser parse: '    a' toToken: 2 stop: 2.
   511 	self assert: parser parse: '    a' toToken: 5 stop: 5.
   511 	self assert: parser parse: '    a' toToken: 5 stop: 5.
   512 	self assert: parser parse: '   
   512 	self assert: parser parse: '
   513 a' toToken: 5 stop: 5.
   513 a' toToken: 5 stop: 5.
   514 	
   514 
   515 	self assert: parser parse: 'aa' toToken: 1 stop: 1 end: 1.
   515 	self assert: parser parse: 'aa' toToken: 1 stop: 1 end: 1.
   516 	self assert: parser parse: 'a	a' toToken: 1 stop: 1 end: 2.
   516 	self assert: parser parse: 'a   a' toToken: 1 stop: 1 end: 2.
   517 	self assert: parser parse: 'a  a' toToken: 1 stop: 1 end: 3.
   517 	self assert: parser parse: 'a  a' toToken: 1 stop: 1 end: 3.
   518 	
   518 
   519 	self assert: parser fail: ''.
   519 	self assert: parser fail: ''.
   520 	self assert: parser fail: 'b'
   520 	self assert: parser fail: 'b'
   521 !
   521 !
   522 
   522 
   523 testTrimBlanks
   523 testTrimBlanks
   524 	| parser |
   524 	| parser |
   525 	parser := $a asParser token trimBlanks.
   525 	parser := $a asParser token trimBlanks.
   526 	
   526 
   527 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   527 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   528 	self assert: parser parse: 'a ' toToken: 1 stop: 1.
   528 	self assert: parser parse: 'a ' toToken: 1 stop: 1.
   529 	self assert: parser parse: 'a	' toToken: 1 stop: 1.
   529 	self assert: parser parse: 'a   ' toToken: 1 stop: 1.
   530 	self assert: parser parse: 'a  ' toToken: 1 stop: 1.
   530 	self assert: parser parse: 'a  ' toToken: 1 stop: 1.
   531 	
   531 
   532 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   532 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   533 	self assert: parser parse: ' a' toToken: 2 stop: 2.
   533 	self assert: parser parse: ' a' toToken: 2 stop: 2.
   534 	self assert: parser parse: '	a' toToken: 2 stop: 2.
   534 	self assert: parser parse: '    a' toToken: 2 stop: 2.
   535 	self assert: parser parse: '    a' toToken: 5 stop: 5.
   535 	self assert: parser parse: '    a' toToken: 5 stop: 5.
   536 	
   536 
   537 	self assert: parser parse: 'aa' toToken: 1 stop: 1 end: 1.
   537 	self assert: parser parse: 'aa' toToken: 1 stop: 1 end: 1.
   538 	self assert: parser parse: 'a	a' toToken: 1 stop: 1 end: 2.
   538 	self assert: parser parse: 'a   a' toToken: 1 stop: 1 end: 2.
   539 	self assert: parser parse: 'a  a' toToken: 1 stop: 1 end: 3.
   539 	self assert: parser parse: 'a  a' toToken: 1 stop: 1 end: 3.
   540 	
   540 
   541 	self assert: parser fail: ''.
   541 	self assert: parser fail: ''.
   542 	self assert: parser fail: '
   542 	self assert: parser fail: '
   543 '.
   543 '.
   544 	self assert: parser fail: '
   544 	self assert: parser fail: '
   545 a'.
   545 a'.
   547 !
   547 !
   548 
   548 
   549 testTrimSpaces
   549 testTrimSpaces
   550 	| parser |
   550 	| parser |
   551 	parser := $a asParser token trimSpaces.
   551 	parser := $a asParser token trimSpaces.
   552 	
   552 
   553 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   553 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   554 	self assert: parser parse: 'a ' toToken: 1 stop: 1.
   554 	self assert: parser parse: 'a ' toToken: 1 stop: 1.
   555 	self assert: parser parse: 'a	' toToken: 1 stop: 1.
   555 	self assert: parser parse: 'a   ' toToken: 1 stop: 1.
   556 	self assert: parser parse: 'a  ' toToken: 1 stop: 1.
   556 	self assert: parser parse: 'a  ' toToken: 1 stop: 1.
   557 	self assert: parser parse: 'a 
   557 	self assert: parser parse: 'a
   558 	 ' toToken: 1 stop: 1.
   558 	 ' toToken: 1 stop: 1.
   559 		
   559 
   560 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   560 	self assert: parser parse: 'a' toToken: 1 stop: 1.
   561 	self assert: parser parse: ' a' toToken: 2 stop: 2.
   561 	self assert: parser parse: ' a' toToken: 2 stop: 2.
   562 	self assert: parser parse: '	a' toToken: 2 stop: 2.
   562 	self assert: parser parse: '    a' toToken: 2 stop: 2.
   563 	self assert: parser parse: '    a' toToken: 5 stop: 5.
   563 	self assert: parser parse: '    a' toToken: 5 stop: 5.
   564 	self assert: parser parse: '   
   564 	self assert: parser parse: '
   565 a' toToken: 5 stop: 5.
   565 a' toToken: 5 stop: 5.
   566 	
   566 
   567 	self assert: parser parse: 'aa' toToken: 1 stop: 1 end: 1.
   567 	self assert: parser parse: 'aa' toToken: 1 stop: 1 end: 1.
   568 	self assert: parser parse: 'a	a' toToken: 1 stop: 1 end: 2.
   568 	self assert: parser parse: 'a   a' toToken: 1 stop: 1 end: 2.
   569 	self assert: parser parse: 'a  a' toToken: 1 stop: 1 end: 3.
   569 	self assert: parser parse: 'a  a' toToken: 1 stop: 1 end: 3.
   570 	
   570 
   571 	self assert: parser fail: ''.
   571 	self assert: parser fail: ''.
   572 	self assert: parser fail: 'b'
   572 	self assert: parser fail: 'b'
   573 !
   573 !
   574 
   574 
   575 testUnresolved
   575 testUnresolved
   576 	| parser |
   576 	| parser |
   577 	parser := PPUnresolvedParser new.
   577 	parser := PPUnresolvedParser new.
   578 	
   578 
   579 	self assert: parser isUnresolved.
   579 	self assert: parser isUnresolved.
   580 	self should: [ parser parse: '' ] raise: Error.
   580 	self should: [ parser parse: '' ] raise: Error.
   581 	self should: [ parser parse: 'a' ] raise: Error.
   581 	self should: [ parser parse: 'a' ] raise: Error.
   582 	self should: [ parser parse: 'ab' ] raise: Error.
   582 	self should: [ parser parse: 'ab' ] raise: Error.
   583 	
   583 
   584 	parser := nil asParser.
   584 	parser := nil asParser.
   585 	self deny: parser isUnresolved
   585 	self deny: parser isUnresolved
   586 !
   586 !
   587 
   587 
   588 testWrapped
   588 testWrapped
   589 	| parser |
   589 	| parser |
   590 	parser := $a asParser wrapped.
   590 	parser := $a asParser wrapped.
   591 	
   591 
   592 	self assert: parser parse: 'a' to: $a.
   592 	self assert: parser parse: 'a' to: $a.
   593 	self assert: parser fail: 'b'.
   593 	self assert: parser fail: 'b'.
   594 	
   594 
   595 	parser := (($a asParser , $b asParser ) wrapped , $c asParser).
   595 	parser := (($a asParser , $b asParser ) wrapped , $c asParser).
   596 	self assert: parser parse: 'abc' to: #(#($a $b) $c)
   596 	self assert: parser parse: 'abc' to: #(#($a $b) $c)
   597 !
   597 !
   598 
   598 
   599 testWrapping
   599 testWrapping
   600 	| parser result |
   600 	| parser result |
   601 	parser := #digit asParser plus >=> [ :stream :cc | 
   601 	parser := #digit asParser plus >=> [ :stream :cc |
   602 		Array 
   602 		Array
   603 			with: stream position 
   603 			with: stream position
   604 			with: cc value 
   604 			with: cc value
   605 			with: stream position ].
   605 			with: stream position ].
   606 
   606 
   607 	self assert: parser parse: '1' to: #(0 ($1) 1).
   607 	self assert: parser parse: '1' to: #(0 ($1) 1).
   608 	self assert: parser parse: '12' to: #(0 ($1 $2) 2).
   608 	self assert: parser parse: '12' to: #(0 ($1 $2) 2).
   609 	self assert: parser parse: '123' to: #(0 ($1 $2 $3) 3).
   609 	self assert: parser parse: '123' to: #(0 ($1 $2 $3) 3).
   610 	
   610 
   611 	result := parser parse: 'a'.
   611 	result := parser parse: 'a'.
   612 	self assert: result first = 0.
   612 	self assert: result first = 0.
   613 	self assert: result second isPetitFailure.
   613 	self assert: result second isPetitFailure.
   614 	self assert: result last = 0
   614 	self assert: result last = 0
   615 !
   615 !
   616 
   616 
   617 testXor
   617 testXor
   618 	| parser |
   618 	| parser |
   619 	parser := ($a asParser / $b asParser)
   619 	parser := ($a asParser / $b asParser)
   620 			|  ($b asParser / $c asParser).
   620 			|  ($b asParser / $c asParser).
   621 	
   621 
   622 	self assert: parser parse: 'a' to: $a.
   622 	self assert: parser parse: 'a' to: $a.
   623 	self assert: parser parse: 'c' to: $c.
   623 	self assert: parser parse: 'c' to: $c.
   624 	
   624 
   625 	self assert: parser fail: ''.
   625 	self assert: parser fail: ''.
   626 	self assert: parser fail: 'b'.
   626 	self assert: parser fail: 'b'.
   627 	self assert: parser fail: 'd'.
   627 	self assert: parser fail: 'd'.
   628 	
   628 
   629 	" truly symmetric "
   629 	" truly symmetric "
   630 	parser := ($b asParser / $c asParser)
   630 	parser := ($b asParser / $c asParser)
   631 			|  ($a asParser / $b asParser).
   631 			|  ($a asParser / $b asParser).
   632 	
   632 
   633 	self assert: parser parse: 'a' to: $a.
   633 	self assert: parser parse: 'a' to: $a.
   634 	self assert: parser parse: 'c' to: $c.
   634 	self assert: parser parse: 'c' to: $c.
   635 	
   635 
   636 	self assert: parser fail: ''.
   636 	self assert: parser fail: ''.
   637 	self assert: parser fail: 'b'.
   637 	self assert: parser fail: 'b'.
   638 	self assert: parser fail: 'd'
   638 	self assert: parser fail: 'd'
   639 ! !
   639 ! !
   640 
   640 
   642 
   642 
   643 testNamed
   643 testNamed
   644 	| parser |
   644 	| parser |
   645 	parser := PPSequenceParser new.
   645 	parser := PPSequenceParser new.
   646 	self assert: parser name isNil.
   646 	self assert: parser name isNil.
   647 	
   647 
   648 	parser := PPChoiceParser named: 'choice'.
   648 	parser := PPChoiceParser named: 'choice'.
   649 	self assert: parser name = 'choice'.
   649 	self assert: parser name = 'choice'.
   650 	
   650 
   651 	parser := $* asParser name: 'star'.
   651 	parser := $* asParser name: 'star'.
   652 	self assert: parser name = 'star'
   652 	self assert: parser name = 'star'
   653 !
   653 !
   654 
   654 
   655 testPrint
   655 testPrint
   656         | parser |
   656 	| parser |
   657         parser := PPParser new.
   657 	parser := PPParser new.
   658         self assert: (parser printString includesSubString: 'PPParser').
   658 	self assert: (parser printString includesSubString: 'PPParser').
   659         
   659 
   660         parser := PPParser named: 'choice'.
   660 	parser := PPParser named: 'choice'.
   661         self assert: (parser printString includesSubString: 'PPParser(choice').
   661 	self assert: (parser printString includesSubString: 'PPParser(choice').
   662         
   662 
   663         parser := PPLiteralObjectParser on: $a.
   663 	parser := PPLiteralObjectParser on: $a.
   664 "/        self assert: (parser printString includesSubString: '$a').
   664 "/        self assert: (parser printString includesSubString: '$a').
   665         self assert: (parser printString includesSubString: 'a').
   665 	self assert: (parser printString includesSubString: 'a').
   666         
   666 
   667         parser := PPFailingParser message: 'error'.
   667 	parser := PPFailingParser message: 'error'.
   668         self assert: (parser printString includesSubString: 'error').
   668 	self assert: (parser printString includesSubString: 'error').
   669         
   669 
   670         parser := PPPredicateObjectParser on: [ :c | true ] message: 'error'.
   670 	parser := PPPredicateObjectParser on: [ :c | true ] message: 'error'.
   671         self assert: (parser printString includesSubString: 'error')
   671 	self assert: (parser printString includesSubString: 'error')
   672 
   672 
   673     "Modified: / 19-12-2010 / 18:30:54 / Jan Kurs <kurs.jan@post.cz>"
   673     "Modified: / 19-12-2010 / 18:30:54 / Jan Kurs <kurs.jan@post.cz>"
   674 ! !
   674 ! !
   675 
   675 
   676 !PPParserTest methodsFor:'testing-fixtures'!
   676 !PPParserTest methodsFor:'testing-fixtures'!
   680 
   680 
   681 	| p1 p2 p3 |
   681 	| p1 p2 p3 |
   682 	p1 := $a asParser.
   682 	p1 := $a asParser.
   683 	p2 := p1 / $b asParser.
   683 	p2 := p1 / $b asParser.
   684 	p3 := p1 / $c asParser.
   684 	p3 := p1 / $c asParser.
   685 	
   685 
   686 	self assert: p1 parse: 'a'.
   686 	self assert: p1 parse: 'a'.
   687 	self assert: p1 fail: 'b'.
   687 	self assert: p1 fail: 'b'.
   688 	self assert: p1 fail: 'c'.
   688 	self assert: p1 fail: 'c'.
   689 	
   689 
   690 	self assert: p2 parse: 'a'.
   690 	self assert: p2 parse: 'a'.
   691 	self assert: p2 parse: 'b'.
   691 	self assert: p2 parse: 'b'.
   692 	self assert: p2 fail: 'c'.
   692 	self assert: p2 fail: 'c'.
   693 	
   693 
   694 	self assert: p3 parse: 'a'.
   694 	self assert: p3 parse: 'a'.
   695 	self assert: p3 fail: 'b'.
   695 	self assert: p3 fail: 'b'.
   696 	self assert: p3 parse: 'c'
   696 	self assert: p3 parse: 'c'
   697 !
   697 !
   698 
   698 
   699 testSideEffectListCopy
   699 testSideEffectListCopy
   700 	| old new |
   700 	| old new |
   701 	old := $a asParser , $b asParser.
   701 	old := $a asParser , $b asParser.
   702 	new := old copy.
   702 	new := old copy.
   703 	
   703 
   704 	self deny: old == new.
   704 	self deny: old == new.
   705 	self deny: old children == new children.
   705 	self deny: old children == new children.
   706 	self assert: old children first == new children first.
   706 	self assert: old children first == new children first.
   707 	self assert: old children last == new children last
   707 	self assert: old children last == new children last
   708 !
   708 !
   712 
   712 
   713 	| p1 p2 p3 |
   713 	| p1 p2 p3 |
   714 	p1 := $a asParser.
   714 	p1 := $a asParser.
   715 	p2 := p1 , $b asParser.
   715 	p2 := p1 , $b asParser.
   716 	p3 := p1 , $c asParser.
   716 	p3 := p1 , $c asParser.
   717 	
   717 
   718 	self assert: p1 parse: 'a'.	
   718 	self assert: p1 parse: 'a'.
   719 	self assert: p1 parse: 'ab' end: 1.
   719 	self assert: p1 parse: 'ab' end: 1.
   720 	self assert: p1 parse: 'ac' end: 1.
   720 	self assert: p1 parse: 'ac' end: 1.
   721 	
   721 
   722 	self assert: p2 fail: 'a'.	
   722 	self assert: p2 fail: 'a'.
   723 	self assert: p2 parse: 'ab'.
   723 	self assert: p2 parse: 'ab'.
   724 	self assert: p2 fail: 'ac'.
   724 	self assert: p2 fail: 'ac'.
   725 
   725 
   726 	self assert: p3 fail: 'a'.	
   726 	self assert: p3 fail: 'a'.
   727 	self assert: p3 fail: 'ab'.
   727 	self assert: p3 fail: 'ab'.
   728 	self assert: p3 parse: 'ac'
   728 	self assert: p3 parse: 'ac'
   729 ! !
   729 ! !
   730 
   730 
   731 !PPParserTest methodsFor:'testing-properties'!
   731 !PPParserTest methodsFor:'testing-properties'!
   801 !
   801 !
   802 
   802 
   803 testFailure
   803 testFailure
   804 	| failure |
   804 	| failure |
   805 	failure := PPFailure message: 'Error' at: 3.
   805 	failure := PPFailure message: 'Error' at: 3.
   806 	
   806 
   807 	self assert: failure message = 'Error'.
   807 	self assert: failure message = 'Error'.
   808 	self assert: failure position = 3.
   808 	self assert: failure position = 3.
   809 	self assert: failure isPetitFailure.
   809 	self assert: failure isPetitFailure.
   810 
   810 
   811 	self deny: 4 isPetitFailure.
   811 	self deny: 4 isPetitFailure.
   815 testListConstructor
   815 testListConstructor
   816 	| p1 p2 p3 |
   816 	| p1 p2 p3 |
   817 	p1 := PPChoiceParser with: $a asParser.
   817 	p1 := PPChoiceParser with: $a asParser.
   818 	p2 := PPChoiceParser with: $a asParser with: $b asParser.
   818 	p2 := PPChoiceParser with: $a asParser with: $b asParser.
   819 	p3 := PPChoiceParser withAll: (Array with: $a asParser with: $b asParser with: $c asParser).
   819 	p3 := PPChoiceParser withAll: (Array with: $a asParser with: $b asParser with: $c asParser).
   820 	
   820 
   821 	self assert: p1 children size = 1.
   821 	self assert: p1 children size = 1.
   822 	self assert: p2 children size = 2.
   822 	self assert: p2 children size = 2.
   823 	self assert: p3 children size = 3
   823 	self assert: p3 children size = 3
   824 !
   824 !
   825 
   825 
   826 testMatches
   826 testMatches
   827 	| parser |
   827 	| parser |
   828 	parser := $a asParser.
   828 	parser := $a asParser.
   829 	
   829 
   830 	self assert: (parser matches: 'a').
   830 	self assert: (parser matches: 'a').
   831 	self deny: (parser matches: 'b').
   831 	self deny: (parser matches: 'b').
   832 	
   832 
   833 	self assert: (parser matches: 'a' readStream).
   833 	self assert: (parser matches: 'a' readStream).
   834 	self deny: (parser matches: 'b' readStream)
   834 	self deny: (parser matches: 'b' readStream)
   835 !
   835 !
   836 
   836 
   837 testMatchesIn
   837 testMatchesIn
   838 	| parser result |
   838 	| parser result |
   839 	parser := $a asParser.
   839 	parser := $a asParser.
   840 	
   840 
   841 	result := parser matchesIn: 'abba'.
   841 	result := parser matchesIn: 'abba'.
   842 	self assert: result size = 2.
   842 	self assert: result size = 2.
   843 	self assert: result first = $a.
   843 	self assert: result first = $a.
   844 	self assert: result last = $a.
   844 	self assert: result last = $a.
   845 	
   845 
   846 	result := parser matchesIn: 'baaah'.
   846 	result := parser matchesIn: 'baaah'.
   847 	self assert: result size = 3.
   847 	self assert: result size = 3.
   848 	self assert: result first = $a.
   848 	self assert: result first = $a.
   849 	self assert: result last = $a
   849 	self assert: result last = $a
   850 !
   850 !
   852 testMatchesInEmpty
   852 testMatchesInEmpty
   853 	"Empty matches should properly advance and match at each position and at the end."
   853 	"Empty matches should properly advance and match at each position and at the end."
   854 
   854 
   855 	| parser result |
   855 	| parser result |
   856 	parser := [ :stream | stream position ] asParser.
   856 	parser := [ :stream | stream position ] asParser.
   857 	
   857 
   858 	result := parser matchesIn: '123'.
   858 	result := parser matchesIn: '123'.
   859 	self assert: result asArray = #(0 1 2 3)
   859 	self assert: result asArray = #(0 1 2 3)
   860 !
   860 !
   861 
   861 
   862 testMatchesInOverlapping
   862 testMatchesInOverlapping
   863 	"Matches that overlap should be properly reported."
   863 	"Matches that overlap should be properly reported."
   864 
   864 
   865 	| parser result |
   865 	| parser result |
   866 	parser := #digit asParser , #digit asParser.
   866 	parser := #digit asParser , #digit asParser.
   867 	
   867 
   868 	result := parser matchesIn: 'a123b'.
   868 	result := parser matchesIn: 'a123b'.
   869 	self assert: result size = 2.
   869 	self assert: result size = 2.
   870 	self assert: result first = #($1 $2).
   870 	self assert: result first = #($1 $2).
   871 	self assert: result last = #($2 $3)
   871 	self assert: result last = #($2 $3)
   872 !
   872 !
   879 	self assert: result size = 3.
   879 	self assert: result size = 3.
   880 	result do: [ :each | self assert: (parser matches: (input copyFrom: each first to: each last)) ]
   880 	result do: [ :each | self assert: (parser matches: (input copyFrom: each first to: each last)) ]
   881 !
   881 !
   882 
   882 
   883 testParse
   883 testParse
   884         | parser result |
   884 	| parser result |
   885         parser := $a asParser.
   885 	parser := $a asParser.
   886         
   886 
   887         self assert: (parser parse: 'a') = $a.
   887 	self assert: (parser parse: 'a') = $a.
   888         self assert: (result := parser parse: 'b') isPetitFailure.
   888 	self assert: (result := parser parse: 'b') isPetitFailure.
   889         "is it Character printString differs: we return only 'a', not '$a'"
   889 	"is it Character printString differs: we return only 'a', not '$a'"
   890         self breakPoint: #petitparser.
   890 	self breakPoint: #petitparser.
   891 "/        self assert: (result message includesSubString: '$a').
   891 "/        self assert: (result message includesSubString: '$a').
   892         self assert: (result message includesSubString: 'a').
   892 	self assert: (result message includesSubString: 'a').
   893         self assert: (result message includesSubString: 'expected').
   893 	self assert: (result message includesSubString: 'expected').
   894         self assert: (result position = 0).
   894 	self assert: (result position = 0).
   895         
   895 
   896         self assert: (parser parse: 'a' readStream) = $a.
   896 	self assert: (parser parse: 'a' readStream) = $a.
   897         self assert: (result := parser parse: 'b' readStream) isPetitFailure.
   897 	self assert: (result := parser parse: 'b' readStream) isPetitFailure.
   898 "/        self assert: (result message includesSubString: '$a').
   898 "/        self assert: (result message includesSubString: '$a').
   899         self assert: (result message includesSubString: 'a').
   899 	self assert: (result message includesSubString: 'a').
   900         self assert: (result message includesSubString: 'expected').
   900 	self assert: (result message includesSubString: 'expected').
   901         self assert: (result position = 0)
   901 	self assert: (result position = 0)
   902 
   902 
   903     "Modified: / 18-12-2010 / 17:05:13 / Jan Kurs <kurs.jan@post.cz>"
   903     "Modified: / 18-12-2010 / 17:05:13 / Jan Kurs <kurs.jan@post.cz>"
   904 !
   904 !
   905 
   905 
   906 testParseOnError0
   906 testParseOnError0
   914 	self assert: result.
   914 	self assert: result.
   915 	self assert: seen
   915 	self assert: seen
   916 !
   916 !
   917 
   917 
   918 testParseOnError1
   918 testParseOnError1
   919         | parser result seen |
   919 	| parser result seen |
   920         parser := $a asParser.
   920 	parser := $a asParser.
   921         
   921 
   922         result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ].
   922 	result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ].
   923         self assert: result = $a.
   923 	self assert: result = $a.
   924         
   924 
   925         result := parser parse: 'b' onError: [ :failure | 
   925 	result := parser parse: 'b' onError: [ :failure |
   926                 self assert: (failure position = 0).
   926 		self assert: (failure position = 0).
   927                 "We don't use $ in ST/X for Characters"
   927 		"We don't use $ in ST/X for Characters"
   928                 self assert: (failure message includesSubString: 'a').
   928 		self assert: (failure message includesSubString: 'a').
   929 "/                self assert: (failure message includesSubString: '$a').
   929 "/                self assert: (failure message includesSubString: '$a').
   930                 self assert: (failure message includesSubString: 'expected').
   930 		self assert: (failure message includesSubString: 'expected').
   931                 seen := true ].
   931 		seen := true ].
   932         self assert: result.
   932 	self assert: result.
   933         self assert: seen
   933 	self assert: seen
   934 
   934 
   935     "Modified: / 19-12-2010 / 18:18:01 / Jan Kurs <kurs.jan@post.cz>"
   935     "Modified: / 19-12-2010 / 18:18:01 / Jan Kurs <kurs.jan@post.cz>"
   936 !
   936 !
   937 
   937 
   938 testParseOnError2
   938 testParseOnError2
   939         | parser result seen |
   939 	| parser result seen |
   940         parser := $a asParser.
   940 	parser := $a asParser.
   941         
   941 
   942         result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ].
   942 	result := parser parse: 'a' onError: [ self signalFailure: 'Not supposed to report an error' ].
   943         self assert: result = $a.
   943 	self assert: result = $a.
   944 
   944 
   945         result := parser parse: 'b' onError: [ :msg :pos | 
   945 	result := parser parse: 'b' onError: [ :msg :pos |
   946                 "We don't use $ in ST/X for Characters"
   946 		"We don't use $ in ST/X for Characters"
   947                 self assert: (msg includesSubString: 'a').
   947 		self assert: (msg includesSubString: 'a').
   948 "/                self assert: (msg includesSubString: '$a').
   948 "/                self assert: (msg includesSubString: '$a').
   949                 self assert: (msg includesSubString: 'expected').
   949 		self assert: (msg includesSubString: 'expected').
   950                 self assert: pos = 0.
   950 		self assert: pos = 0.
   951                 seen := true ].
   951 		seen := true ].
   952         self assert: result.
   952 	self assert: result.
   953         self assert: seen
   953 	self assert: seen
   954 
   954 
   955     "Modified: / 19-12-2010 / 18:18:31 / Jan Kurs <kurs.jan@post.cz>"
   955     "Modified: / 19-12-2010 / 18:18:31 / Jan Kurs <kurs.jan@post.cz>"
   956 !
   956 !
   957 
   957 
   958 testParser
   958 testParser
   959 	| parser |
   959 	| parser |
   960 	parser := PPParser new.
   960 	parser := PPParser new.
   961 	
   961 
   962 	self assert: parser isPetitParser.
   962 	self assert: parser isPetitParser.
   963 
   963 
   964 	self deny: 4 isPetitParser.
   964 	self deny: 4 isPetitParser.
   965 	self deny: 'foo' isPetitParser
   965 	self deny: 'foo' isPetitParser
   966 ! !
   966 ! !
   967 
   967 
   968 !PPParserTest class methodsFor:'documentation'!
   968 !PPParserTest class methodsFor:'documentation'!
   969 
   969 
   970 version_SVN
   970 version_SVN
   971     ^ '$Id: PPParserTest.st,v 1.1 2011-08-18 18:56:17 cg Exp $'
   971     ^ '$Id: PPParserTest.st,v 1.2 2012-01-13 11:22:50 cg Exp $'
   972 ! !
   972 ! !