-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_rewrite_basic.py
More file actions
106 lines (83 loc) · 2.69 KB
/
test_rewrite_basic.py
File metadata and controls
106 lines (83 loc) · 2.69 KB
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
"""
Tests/examples for wrapping different kinds if functions and methods.
"""
import logging
import pytest
from recompyle import wrap_calls
log = logging.getLogger(__name__)
def basic_wrapper(__call, _, *args, **kwargs):
"""Basic wrapper that creates two logs per call."""
log.info(f"Before {__call.__qualname__}")
try:
return __call(*args, **kwargs)
finally:
log.info(f"After {__call.__qualname__}")
@wrap_calls(wrapper=basic_wrapper)
def example_function(count, secondary):
for _ in (int(v) for v in range(count)):
pass
return secondary()
def secondary_function():
return True
class ExampleClass:
@wrap_calls(wrapper=basic_wrapper)
def example_method(self, count, secondary):
for _ in (int(v) for v in range(count)):
pass
return secondary()
def secondary_method(self):
return True
@classmethod
@wrap_calls(wrapper=basic_wrapper)
def example_classmethod(cls, count, secondary):
for _ in (int(v) for v in range(count)):
pass
return secondary()
@classmethod
def secondary_classmethod(cls):
return True
@staticmethod
@wrap_calls(wrapper=basic_wrapper)
def example_staticmethod(count, secondary):
for _ in (int(v) for v in range(count)):
pass
return secondary()
@staticmethod
def secondary_staticmethod():
return True
def outer_nested():
@wrap_calls(wrapper=basic_wrapper)
def inner_nested():
return int(1.23)
return inner_nested()
class TestBasicWrapper:
COUNT = 5
@pytest.mark.parametrize(
"func",
[
example_function,
ExampleClass().example_method,
ExampleClass.example_classmethod,
ExampleClass.example_staticmethod,
],
)
@pytest.mark.parametrize(
"secondary",
[
secondary_function,
ExampleClass().secondary_method,
ExampleClass.secondary_classmethod,
ExampleClass.secondary_staticmethod,
],
)
def test_wrap_secondary_combinations(self, func, secondary, caplog):
"""Verify wrapped functions run and create the expected number of logs."""
with caplog.at_level(logging.INFO):
assert func(TestBasicWrapper.COUNT, secondary)
assert len(caplog.records) == (TestBasicWrapper.COUNT * 2) + 4
def test_wrap_nested(self, caplog):
"""Nested functions can be wrapped if they don't use nonlocals."""
with caplog.at_level(logging.INFO):
assert outer_nested() == 1
assert caplog.records[0].message == "Before int"
assert caplog.records[1].message == "After int"