1"""
2Input for test_profile.py and test_cprofile.py.
3
4IMPORTANT: This stuff is touchy. If you modify anything above the
5test class you'll have to regenerate the stats by running the two
6test files.
7
8*ALL* NUMBERS in the expected output are relevant.  If you change
9the formatting of pstats, please don't just regenerate the expected
10output without checking very carefully that not a single number has
11changed.
12"""
13
14import sys
15
16# In order to have reproducible time, we simulate a timer in the global
17# variable 'TICKS', which represents simulated time in milliseconds.
18# (We can't use a helper function increment the timer since it would be
19# included in the profile and would appear to consume all the time.)
20TICKS = 42000
21
22def timer():
23    return TICKS
24
25def testfunc():
26    # 1 call
27    # 1000 ticks total: 270 ticks local, 730 ticks in subfunctions
28    global TICKS
29    TICKS += 99
30    helper()                            # 300
31    helper()                            # 300
32    TICKS += 171
33    factorial(14)                       # 130
34
35def factorial(n):
36    # 23 calls total
37    # 170 ticks total, 150 ticks local
38    # 3 primitive calls, 130, 20 and 20 ticks total
39    # including 116, 17, 17 ticks local
40    global TICKS
41    if n > 0:
42        TICKS += n
43        return mul(n, factorial(n-1))
44    else:
45        TICKS += 11
46        return 1
47
48def mul(a, b):
49    # 20 calls
50    # 1 tick, local
51    global TICKS
52    TICKS += 1
53    return a * b
54
55def helper():
56    # 2 calls
57    # 300 ticks total: 20 ticks local, 260 ticks in subfunctions
58    global TICKS
59    TICKS += 1
60    helper1()                           # 30
61    TICKS += 2
62    helper1()                           # 30
63    TICKS += 6
64    helper2()                           # 50
65    TICKS += 3
66    helper2()                           # 50
67    TICKS += 2
68    helper2()                           # 50
69    TICKS += 5
70    helper2_indirect()                  # 70
71    TICKS += 1
72
73def helper1():
74    # 4 calls
75    # 30 ticks total: 29 ticks local, 1 tick in subfunctions
76    global TICKS
77    TICKS += 10
78    hasattr(C(), "foo")                 # 1
79    TICKS += 19
80    lst = []
81    lst.append(42)                      # 0
82    sys.exc_info()                      # 0
83
84def helper2_indirect():
85    helper2()                           # 50
86    factorial(3)                        # 20
87
88def helper2():
89    # 8 calls
90    # 50 ticks local: 39 ticks local, 11 ticks in subfunctions
91    global TICKS
92    TICKS += 11
93    hasattr(C(), "bar")                 # 1
94    TICKS += 13
95    subhelper()                         # 10
96    TICKS += 15
97
98def subhelper():
99    # 8 calls
100    # 10 ticks total: 8 ticks local, 2 ticks in subfunctions
101    global TICKS
102    TICKS += 2
103    for i in range(2):                  # 0
104        try:
105            C().foo                     # 1 x 2
106        except AttributeError:
107            TICKS += 3                  # 3 x 2
108
109class C:
110    def __getattr__(self, name):
111        # 28 calls
112        # 1 tick, local
113        global TICKS
114        TICKS += 1
115        raise AttributeError
116