test-extensions-wrapfunction.py
79 lines
| 2.1 KiB
| text/x-python
|
PythonLexer
/ tests / test-extensions-wrapfunction.py
Jun Wu
|
r29765 | from __future__ import absolute_import, print_function | ||
from mercurial import extensions | ||||
Augie Fackler
|
r43346 | |||
Jun Wu
|
r29765 | def genwrapper(x): | ||
def f(orig, *args, **kwds): | ||||
return [x] + orig(*args, **kwds) | ||||
Augie Fackler
|
r43346 | |||
Jun Wu
|
r29765 | f.x = x | ||
return f | ||||
Augie Fackler
|
r43346 | |||
Jun Wu
|
r29765 | def getid(wrapper): | ||
return getattr(wrapper, 'x', '-') | ||||
Augie Fackler
|
r43346 | |||
Jun Wu
|
r29765 | wrappers = [genwrapper(i) for i in range(5)] | ||
Augie Fackler
|
r43346 | |||
Jun Wu
|
r29765 | class dummyclass(object): | ||
def getstack(self): | ||||
return ['orig'] | ||||
Augie Fackler
|
r43346 | |||
Jun Wu
|
r29765 | dummy = dummyclass() | ||
Augie Fackler
|
r43346 | |||
Jun Wu
|
r29765 | def batchwrap(wrappers): | ||
for w in wrappers: | ||||
extensions.wrapfunction(dummy, 'getstack', w) | ||||
print('wrap %d: %s' % (getid(w), dummy.getstack())) | ||||
Augie Fackler
|
r43346 | |||
Jun Wu
|
r29765 | def batchunwrap(wrappers): | ||
for w in wrappers: | ||||
result = None | ||||
try: | ||||
result = extensions.unwrapfunction(dummy, 'getstack', w) | ||||
msg = str(dummy.getstack()) | ||||
except (ValueError, IndexError) as e: | ||||
msg = e.__class__.__name__ | ||||
print('unwrap %s: %s: %s' % (getid(w), getid(result), msg)) | ||||
Augie Fackler
|
r43346 | |||
Jun Wu
|
r29765 | batchwrap(wrappers + [wrappers[0]]) | ||
Augie Fackler
|
r43346 | batchunwrap( | ||
[ | ||||
(wrappers[i] if i is not None and i >= 0 else None) | ||||
for i in [3, None, 0, 4, 0, 2, 1, None] | ||||
] | ||||
) | ||||
Martin von Zweigbergk
|
r34016 | |||
wrap0 = extensions.wrappedfunction(dummy, 'getstack', wrappers[0]) | ||||
wrap1 = extensions.wrappedfunction(dummy, 'getstack', wrappers[1]) | ||||
# Use them in a different order from how they were created to check that | ||||
# the wrapping happens in __enter__, not in __init__ | ||||
print('context manager', dummy.getstack()) | ||||
with wrap1: | ||||
print('context manager', dummy.getstack()) | ||||
with wrap0: | ||||
print('context manager', dummy.getstack()) | ||||
# Bad programmer forgets to unwrap the function, but the context | ||||
# managers still unwrap their wrappings. | ||||
extensions.wrapfunction(dummy, 'getstack', wrappers[2]) | ||||
print('context manager', dummy.getstack()) | ||||
print('context manager', dummy.getstack()) | ||||
print('context manager', dummy.getstack()) | ||||
Yuya Nishihara
|
r34130 | |||
# Wrap callable object which has no __name__ | ||||
class callableobj(object): | ||||
def __call__(self): | ||||
return ['orig'] | ||||
Augie Fackler
|
r43346 | |||
Yuya Nishihara
|
r34130 | dummy.cobj = callableobj() | ||
extensions.wrapfunction(dummy, 'cobj', wrappers[0]) | ||||
print('wrap callable object', dummy.cobj()) | ||||