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 |
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'! |
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 ! ! |