17
17
"""Test that lazy regexes are not compiled right away"""
29
class TestErrors(tests.TestCase):
31
def test_invalid_pattern(self):
32
error = lazy_regex.InvalidPattern('Bad pattern msg.')
33
self.assertEqualDiff("Invalid pattern(s) found. Bad pattern msg.",
27
37
class InstrumentedLazyRegex(lazy_regex.LazyRegex):
28
38
"""Keep track of actions on the lazy regex"""
40
50
def _real_re_compile(self, *args, **kwargs):
41
51
self._actions.append(('_real_re_compile',
43
return super(InstrumentedLazyRegex, self)._real_re_compile(*args, **kwargs)
53
return super(InstrumentedLazyRegex, self)._real_re_compile(
46
57
class TestLazyRegex(tests.TestCase):
63
74
('_real_re_compile', ('foo',), {}),
77
def test_bad_pattern(self):
78
"""Ensure lazy regex handles bad patterns cleanly."""
79
p = lazy_regex.lazy_compile('RE:[')
80
# As p.match is lazy, we make it into a lambda so its handled
81
# by assertRaises correctly.
82
e = self.assertRaises(lazy_regex.InvalidPattern, lambda: p.match('foo'))
83
# Expect either old or new form of error message
84
self.assertContainsRe(e.msg, '^"RE:\\[" '
85
'(unexpected end of regular expression'
86
'|unterminated character set at position 3)$')
67
89
class TestLazyCompile(tests.TestCase):
102
124
self.assertEqual('fooo', pattern.search('fooo').group())
104
126
def test_split(self):
105
pattern = lazy_regex.lazy_compile('[,;]*')
127
pattern = lazy_regex.lazy_compile('[,;]+')
106
128
self.assertEqual(['x', 'y', 'z'], pattern.split('x,y;z'))
130
def test_pickle(self):
131
# When pickling, just compile the regex.
132
# Sphinx, which we use for documentation, pickles
133
# some compiled regexes.
134
lazy_pattern = lazy_regex.lazy_compile('[,;]+')
135
pickled = pickle.dumps(lazy_pattern)
136
unpickled_lazy_pattern = pickle.loads(pickled)
137
self.assertEqual(['x', 'y', 'z'],
138
unpickled_lazy_pattern.split('x,y;z'))
109
141
class TestInstallLazyCompile(tests.TestCase):
142
"""Tests for lazy compiled regexps.
112
super(TestInstallLazyCompile, self).setUp()
113
self.addCleanup(lazy_regex.reset_compile)
144
Other tests, and breezy in general, count on the lazy regexp compiler
145
being installed, and this is done by loading breezy. So these tests
146
assume it is installed, and leave it installed when they're done.
115
149
def test_install(self):
150
# Don't count on it being present
116
151
lazy_regex.install_lazy_compile()
117
152
pattern = re.compile('foo')
118
153
self.assertIsInstance(pattern, lazy_regex.LazyRegex)
120
155
def test_reset(self):
121
lazy_regex.install_lazy_compile()
122
156
lazy_regex.reset_compile()
157
self.addCleanup(lazy_regex.install_lazy_compile)
123
158
pattern = re.compile('foo')
124
self.failIf(isinstance(pattern, lazy_regex.LazyRegex),
125
'lazy_regex.reset_compile() did not restore the original'
126
' compile() function %s' % (type(pattern),))
159
self.assertFalse(isinstance(pattern, lazy_regex.LazyRegex),
160
'lazy_regex.reset_compile() did not restore the original'
161
' compile() function %s' % (type(pattern),))
127
162
# but the returned object should still support regex operations
128
163
m = pattern.match('foo')
129
164
self.assertEqual('foo', m.group())