1 from lepl.stream.core import s_next
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 '''
32 Tests for the lepl.matchers.derived module.
33 '''
34
35
36 from unittest import TestCase
37
38 from lepl.matchers.monitor import Trace
39 from lepl.matchers.derived import Repeat, Space, SkipTo, Newline, String, \
40 SkipString, SingleLineString, UnsignedInteger, SignedInteger, \
41 UnsignedReal, SignedReal, UnsignedEReal, SignedEReal, UnsignedFloat, \
42 SignedFloat, UnsignedEFloat, SignedEFloat, Optional, Add, Reduce, Star
43 from lepl.stream.maxdepth import FullFirstMatchException
44 from lepl.matchers.core import Any
45 from lepl._test.base import BaseTest
46 from lepl.matchers.support import OperatorMatcher
47 from lepl.core.parser import tagged
48 from lepl.support.warn import silence
49
50 silence('UnsignedFloat')
51 silence('SignedFloat')
52 silence('UnsignedEFloat')
53 silence('SignedEFloat')
59
61
62 self.assert_simple([1], 1, 1, 'd', ['0'])
63 self.assert_simple([1], 1, 2, 'd', ['0'])
64 self.assert_simple([2], 1, 1, 'd', ['0','1'])
65 self.assert_simple([2], 1, 2, 'd', ['0','1'])
66 self.assert_simple([2], 0, 2, 'd', ['0','1',''])
67 self.assert_simple([1,2], 1, 1, 'd', ['0'])
68 self.assert_simple([1,2], 1, 2, 'd', ['00','01','0'])
69 self.assert_simple([1,2], 2, 2, 'd', ['00','01'])
70 self.assert_simple([1,2], 1, 2, 'b', ['0','00','01'])
71 self.assert_simple([1,2], 1, 2, 'g', ['00','01','0'])
72
80
82
83 r = RangeMatch()
84 self.assert_mixin(r[1:1], [1], ['0'])
85 self.assert_mixin(r[1:2], [1], ['0'])
86 self.assert_mixin(r[1:1], [2], ['0','1'])
87 self.assert_mixin(r[1:2], [2], ['0','1'])
88 self.assert_mixin(r[0:], [2], ['0','1', ''])
89 self.assert_mixin(r[:], [2], ['0','1', ''])
90 self.assert_mixin(r[0:2], [2], ['0','1', ''])
91 self.assert_mixin(r[1], [1,2], ['0'])
92 self.assert_mixin(r[1:2], [1,2], ['00','01', '0'])
93 self.assert_mixin(r[2], [1,2], ['00','01'])
94 self.assert_mixin(r[1:2:'b'], [1,2], ['0', '00','01'])
95 self.assert_mixin(r[1:2:'d'], [1,2], ['00', '01','0'])
96 try:
97 self.assert_mixin(r[1::'x'], [1,2,3], [])
98 assert False, 'expected error'
99 except KeyError:
100 pass
101
107
109
110 self.assert_separator('a', 1, 1, 'd', ['a'])
111 self.assert_separator('a', 1, 1, 'b', ['a'])
112 self.assert_separator('a,a', 1, 2, 'd', ['a,a', 'a'])
113 self.assert_separator('a,a', 1, 2, 'b', ['a', 'a,a'])
114 self.assert_separator('a,a,a,a', 2, 3, 'd', ['a,a,a', 'a,a'])
115 self.assert_separator('a,a,a,a', 2, 3, 'b', ['a,a', 'a,a,a'])
116
124
126
127 abc = Any('abc')
128 self.assert_separator_mixin(abc[1:1:'d',','], 'a', ['a'])
129 self.assert_separator_mixin(abc[1:1:'b',','], 'a', ['a'])
130 self.assert_separator_mixin(abc[1:2:'d',','], 'a,b', ['a,b', 'a'])
131 self.assert_separator_mixin(abc[1:2:'b',','], 'a,b', ['a', 'a,b'])
132 self.assert_separator_mixin(abc[2:3:'d',','], 'a,b,c,a', ['a,b,c', 'a,b'])
133 self.assert_separator_mixin(abc[2:3:'b',','], 'a,b,c,a', ['a,b', 'a,b,c'])
134
139
142 '''
143 We test repetition by looking at "strings" of integers, where the
144 matcher for any particular value returns all values less than the
145 current value.
146 '''
147
150
151 @tagged
153 (value, next_stream) = s_next(stream)
154 for i in range(value[0]):
155 yield ([i], next_stream)
156
165
168
170 self.assert_direct(' ', Space(), [[' ']])
171 self.assert_direct(' ', Space()[0:], [[' ', ' '], [' '], []])
172 self.assert_direct(' ', Space()[0:,...], [[' '], [' '], []])
173
175 ab = Any('ab')
176 self.assert_direct('ab', ab / ab, [['a', 'b']])
177 self.assert_direct('a b', ab / ab, [['a', ' ', 'b']])
178 self.assert_direct('a b', ab / ab, [['a', ' ', 'b']])
179 self.assert_direct('ab', ab // ab, [])
180 self.assert_direct('a b', ab // ab, [['a', ' ', 'b']])
181 self.assert_direct('a b', ab // ab, [['a', ' ', 'b']])
182
194
197
199 self.assert_direct('"abc"', String(), [['abc']])
200 self.assert_direct('"abc"d', String(), [['abc']])
201 self.assert_direct('"abc"', SingleLineString(), [['abc']])
202 self.assert_direct('"abc"d', SingleLineString(), [['abc']])
203 self.assert_direct('"abc"', SkipString(), [['abc']])
204 self.assert_direct('"abc"d', SkipString(), [['abc']])
205
209
212
217
220
226
229
230 - def do_test(self, matcher, good, bad):
237 for value in good: test(value, True)
238 for value in bad: test(value, False)
239
241 self.do_test(UnsignedInteger(),
242 ['1'],
243 ['-1',
244 '1.', '-1.',
245 '1.2', '-1.2',
246 '1e3', '-1e3', '1e-3', '-1e-3',
247 '1.e3', '-1.e3', '1.e-3', '-1.e-3',
248 '1.2e3', '-1.2e3', '1.2e-3', '-1.2e-3'])
249 self.do_test(SignedInteger(),
250 ['1', '-1'],
251 ['1.', '-1.',
252 '1.2', '-1.2',
253 '1e3', '-1e3', '1e-3', '-1e-3',
254 '1.e3', '-1.e3', '1.e-3', '-1.e-3',
255 '1.2e3', '-1.2e3', '1.2e-3', '-1.2e-3'])
256 self.do_test(UnsignedReal(),
257 ['1', '1.', '1.2'],
258 ['-1', '-1.', '-1.2',
259 '1e3', '-1e3', '1e-3', '-1e-3',
260 '1.e3', '-1.e3', '1.e-3', '-1.e-3',
261 '1.2e3', '-1.2e3', '1.2e-3', '-1.2e-3'])
262 self.do_test(SignedReal(),
263 ['1', '-1',
264 '1.', '-1.',
265 '1.2', '-1.2'],
266 ['1e3', '-1e3', '1e-3', '-1e-3',
267 '1.e3', '-1.e3', '1.e-3', '-1.e-3',
268 '1.2e3', '-1.2e3', '1.2e-3', '-1.2e-3'])
269 self.do_test(UnsignedEReal(),
270 ['1', '1.', '1.2',
271 '1e3', '1e-3', '1.e3', '1.e-3',
272 '1.2e3', '1.2e-3'],
273 ['-1', '-1.', '-1.2',
274 '-1e3', '-1e-3', '-1.e3', '-1.e-3',
275 '-1.2e3', '-1.2e-3'])
276 self.do_test(SignedEReal(),
277 ['1', '1.', '1.2',
278 '1e3', '1e-3', '1.e3', '1.e-3',
279 '1.2e3', '1.2e-3',
280 '-1', '-1.', '-1.2',
281 '-1e3', '-1e-3', '-1.e3', '-1.e-3',
282 '-1.2e3', '-1.2e-3'],
283 [])
284 self.do_test(UnsignedFloat(),
285 ['1.', '1.2'],
286 ['1', '-1', '-1.', '-1.2',
287 '1e3', '-1e3', '1e-3', '-1e-3',
288 '1.e3', '-1.e3', '1.e-3', '-1.e-3',
289 '1.2e3', '-1.2e3', '1.2e-3', '-1.2e-3'])
290 self.do_test(SignedFloat(),
291 ['1.', '-1.',
292 '1.2', '-1.2'],
293 ['1', '-1',
294 '1e3', '-1e3', '1e-3', '-1e-3',
295 '1.e3', '-1.e3', '1.e-3', '-1.e-3',
296 '1.2e3', '-1.2e3', '1.2e-3', '-1.2e-3'])
297 self.do_test(UnsignedEFloat(),
298 ['1.', '1.2',
299 '1e3', '1e-3', '1.e3', '1.e-3',
300 '1.2e3', '1.2e-3'],
301 ['1', '-1', '-1.', '-1.2',
302 '-1e3', '-1e-3', '-1.e3', '-1.e-3',
303 '-1.2e3', '-1.2e-3'])
304 self.do_test(SignedEFloat(),
305 ['1.', '1.2',
306 '1e3', '1e-3', '1.e3', '1.e-3',
307 '1.2e3', '1.2e-3',
308 '-1.', '-1.2',
309 '-1e3', '-1e-3', '-1.e3', '-1.e-3',
310 '-1.2e3', '-1.2e-3'],
311 ['1', '-1'])
312