-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathtest_builder.py
72 lines (61 loc) · 3.12 KB
/
test_builder.py
1
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# -*- coding: utf-8 -*-
import re
from glob import glob
from srl.builder import Builder
from srl.srl import SRL
def test_simple_phone_number_format():
regex = Builder().literally('+').digit().between(1, 3) \
.literally(' ').number().between(3, 4) \
.literally('-').digit().once_or_more() \
.must_end().get()
assert re.match(regex, '+49 123-45')
assert re.match(regex, '+492 1235-45')
assert not re.match(regex, '+49 123 45')
assert not re.match(regex, '49 123-45')
assert not re.match(regex, 'a+49 123-45')
assert not re.match(regex, '+49 123-45b')
def test_simple_email_format():
reg = Builder().any_of(
lambda q: q.digit().letter().one_of('._%+-')
).once_or_more().literally('@').either_of(
lambda q: q.digit().letter().one_of('.-')
).once_or_more().literally('.').letter().at_least(2) \
.must_end().case_insensitive()
regex = reg.get()
assert reg.is_valid()
assert reg.is_matching('[email protected]')
assert not reg.is_matching('sample.example.com')
assert re.match(regex, '[email protected]')
assert re.match(regex, '[email protected]', reg.flags)
assert not re.match(regex, 'sample.example.com')
assert not re.match(regex, 'missing@tld')
assert not re.match(regex, 'hav [email protected]')
assert not re.match(regex, '[email protected]')
assert not re.match(regex, '[email protected]')
def test_capture_group():
builder = Builder()
query = builder.literally('colo').optional('u').literally('r').any_of(lambda q: q.literally(':') & (lambda q: q.literally(' is'))).whitespace().capture(lambda q: q.letter().once_or_more(), 'color').literally('.')
assert query.get_matches('my favorite color: blue.') == ['blue']
assert query.get_matches('my favorite colour is green.') == ['green']
assert not query.get_matches('my favorite colour is green!')
assert query.findall('my favorite colour is green. And my favorite color: yellow.') == ['green', 'yellow']
def test_replace():
query = Builder().capture(lambda q: q.any_character().once_or_more()) \
.whitespace().capture(lambda q: q.digit().once_or_more()) \
.literally(', ').capture(lambda q: q.digit().once_or_more()) \
.case_insensitive()
assert query.replace(r'\1 1, \3', 'April 15, 2003') == 'April 1, 2003'
def test_filter():
query = Builder().capture(lambda q: q.uppercase_letter())
assert query.filter(r'A:\g<0>', 'a1AB') == ('a1A:AA:B', 2)
def test_replace_callback():
query = Builder().capture(lambda q: q.any_character().once_or_more()) \
.whitespace().capture(lambda q: q.digit().once_or_more()) \
.literally(', ').capture(lambda q: q.digit().once_or_more()) \
.case_insensitive()
assert query.replace(lambda params: 'invoked', 'April 15, 2003') == 'invoked'
def test_laziness():
regex = Builder().literally(',').twice().whitespace().optional().first_match()
assert regex.split('sample,one,, two,,three') == ['sample,one', ' two', 'three']
def test_raw():
assert Builder().literally('foo').raw('b[a-z]r').is_valid()