ruby-prof 1.7.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGES → CHANGELOG.md} +118 -176
  3. data/README.md +5 -5
  4. data/bin/ruby-prof +1 -4
  5. data/docs/advanced-usage.md +132 -0
  6. data/docs/alternatives.md +98 -0
  7. data/docs/architecture.md +122 -0
  8. data/docs/best-practices.md +27 -0
  9. data/docs/getting-started.md +130 -0
  10. data/docs/history.md +11 -0
  11. data/docs/index.md +45 -0
  12. data/docs/profiling-rails.md +64 -0
  13. data/docs/public/examples/example.rb +33 -0
  14. data/docs/public/examples/generate_reports.rb +92 -0
  15. data/docs/public/examples/reports/call_info.txt +27 -0
  16. data/docs/public/examples/reports/call_stack.html +835 -0
  17. data/docs/public/examples/reports/callgrind.out +150 -0
  18. data/docs/public/examples/reports/flame_graph.html +408 -0
  19. data/docs/public/examples/reports/flat.txt +45 -0
  20. data/docs/public/examples/reports/graph.dot +129 -0
  21. data/docs/public/examples/reports/graph.html +1319 -0
  22. data/docs/public/examples/reports/graph.txt +100 -0
  23. data/docs/public/examples/reports/graphviz_viewer.html +1 -0
  24. data/docs/public/images/call_stack.png +0 -0
  25. data/docs/public/images/class_diagram.png +0 -0
  26. data/docs/public/images/dot_printer.png +0 -0
  27. data/docs/public/images/flame_graph.png +0 -0
  28. data/docs/public/images/flat.png +0 -0
  29. data/docs/public/images/graph.png +0 -0
  30. data/docs/public/images/graph_html.png +0 -0
  31. data/docs/public/images/ruby-prof-logo.svg +1 -0
  32. data/docs/reports.md +150 -0
  33. data/docs/stylesheets/extra.css +80 -0
  34. data/ext/ruby_prof/extconf.rb +23 -22
  35. data/ext/ruby_prof/rp_allocation.c +0 -15
  36. data/ext/ruby_prof/rp_allocation.h +29 -33
  37. data/ext/ruby_prof/rp_call_tree.c +3 -0
  38. data/ext/ruby_prof/rp_call_tree.h +1 -4
  39. data/ext/ruby_prof/rp_call_trees.c +296 -296
  40. data/ext/ruby_prof/rp_call_trees.h +25 -28
  41. data/ext/ruby_prof/rp_measure_allocations.c +47 -47
  42. data/ext/ruby_prof/rp_measure_process_time.c +64 -66
  43. data/ext/ruby_prof/rp_measure_wall_time.c +52 -64
  44. data/ext/ruby_prof/rp_measurement.c +0 -5
  45. data/ext/ruby_prof/rp_measurement.h +49 -53
  46. data/ext/ruby_prof/rp_method.c +554 -551
  47. data/ext/ruby_prof/rp_method.h +1 -4
  48. data/ext/ruby_prof/rp_profile.c +1 -1
  49. data/ext/ruby_prof/rp_profile.h +1 -5
  50. data/ext/ruby_prof/rp_stack.c +212 -212
  51. data/ext/ruby_prof/rp_stack.h +50 -53
  52. data/ext/ruby_prof/rp_thread.h +1 -4
  53. data/ext/ruby_prof/ruby_prof.c +50 -50
  54. data/ext/ruby_prof/ruby_prof.h +4 -6
  55. data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
  56. data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
  57. data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
  58. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
  59. data/lib/ruby-prof/call_tree.rb +57 -57
  60. data/lib/ruby-prof/call_tree_visitor.rb +36 -36
  61. data/lib/ruby-prof/exclude_common_methods.rb +204 -204
  62. data/lib/ruby-prof/measurement.rb +17 -17
  63. data/lib/ruby-prof/printers/abstract_printer.rb +142 -138
  64. data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
  65. data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
  66. data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
  67. data/lib/ruby-prof/printers/dot_printer.rb +177 -132
  68. data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
  69. data/lib/ruby-prof/printers/flat_printer.rb +52 -52
  70. data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
  71. data/lib/ruby-prof/printers/graph_printer.rb +112 -113
  72. data/lib/ruby-prof/printers/multi_printer.rb +134 -127
  73. data/lib/ruby-prof/profile.rb +13 -0
  74. data/lib/ruby-prof/rack.rb +114 -105
  75. data/lib/ruby-prof/task.rb +147 -147
  76. data/lib/ruby-prof/thread.rb +20 -20
  77. data/lib/ruby-prof/version.rb +3 -3
  78. data/lib/ruby-prof.rb +50 -52
  79. data/lib/unprof.rb +10 -10
  80. data/ruby-prof.gemspec +66 -65
  81. data/test/abstract_printer_test.rb +25 -27
  82. data/test/alias_test.rb +203 -117
  83. data/test/call_tree_builder.rb +126 -126
  84. data/test/call_tree_visitor_test.rb +27 -27
  85. data/test/call_trees_test.rb +66 -66
  86. data/test/duplicate_names_test.rb +32 -32
  87. data/test/dynamic_method_test.rb +50 -62
  88. data/test/enumerable_test.rb +23 -21
  89. data/test/exceptions_test.rb +24 -24
  90. data/test/exclude_methods_test.rb +363 -257
  91. data/test/exclude_threads_test.rb +48 -48
  92. data/test/fiber_test.rb +195 -195
  93. data/test/gc_test.rb +104 -102
  94. data/test/inverse_call_tree_test.rb +174 -174
  95. data/test/line_number_test.rb +563 -289
  96. data/test/marshal_test.rb +144 -145
  97. data/test/measure_allocations.rb +26 -26
  98. data/test/measure_allocations_test.rb +1511 -1081
  99. data/test/measure_process_time_test.rb +3286 -2477
  100. data/test/measure_times.rb +56 -56
  101. data/test/measure_wall_time_test.rb +773 -568
  102. data/test/measurement_test.rb +82 -82
  103. data/test/merge_test.rb +146 -146
  104. data/test/method_info_test.rb +100 -95
  105. data/test/multi_printer_test.rb +52 -66
  106. data/test/no_method_class_test.rb +15 -15
  107. data/test/pause_resume_test.rb +171 -171
  108. data/test/prime.rb +54 -54
  109. data/test/prime_script.rb +5 -5
  110. data/test/printer_call_stack_test.rb +28 -27
  111. data/test/printer_call_tree_test.rb +30 -30
  112. data/test/printer_flame_graph_test.rb +82 -0
  113. data/test/printer_flat_test.rb +99 -99
  114. data/test/printer_graph_html_test.rb +62 -59
  115. data/test/printer_graph_test.rb +42 -40
  116. data/test/printers_test.rb +162 -135
  117. data/test/printing_recursive_graph_test.rb +81 -81
  118. data/test/profile_test.rb +101 -101
  119. data/test/rack_test.rb +103 -93
  120. data/test/recursive_test.rb +796 -622
  121. data/test/scheduler.rb +4 -0
  122. data/test/singleton_test.rb +39 -38
  123. data/test/stack_printer_test.rb +61 -61
  124. data/test/start_stop_test.rb +106 -106
  125. data/test/test_helper.rb +24 -20
  126. data/test/thread_test.rb +229 -231
  127. data/test/unique_call_path_test.rb +123 -136
  128. data/test/yarv_test.rb +56 -60
  129. metadata +68 -16
  130. data/ext/ruby_prof/rp_measure_memory.c +0 -46
  131. data/lib/ruby-prof/compatibility.rb +0 -113
  132. data/test/compatibility_test.rb +0 -49
  133. data/test/crash2.rb +0 -144
  134. data/test/measure_memory_test.rb +0 -1456
@@ -1,622 +1,796 @@
1
- #!/usr/bin/env ruby
2
- # encoding: UTF-8
3
-
4
- require File.expand_path('../test_helper', __FILE__)
5
-
6
- module SimpleRecursion
7
- # Simple recursive test
8
- def simple(n)
9
- sleep(1)
10
- return if n == 0
11
- simple(n-1)
12
- end
13
-
14
- # More complicated recursive test
15
- def render_partial(i)
16
- sleep(1)
17
- case i
18
- when 0
19
- render_partial(10)
20
- when 1
21
- 2.times do |j|
22
- render_partial(j + 10)
23
- end
24
- end
25
- end
26
-
27
- def render
28
- 2.times do |i|
29
- render_partial(i)
30
- end
31
- end
32
- end
33
-
34
- # -- Tests ----
35
- class RecursiveTest < TestCase
36
- include SimpleRecursion
37
-
38
- def test_simple
39
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
40
- simple(1)
41
- end
42
-
43
- methods = result.threads.first.methods.sort.reverse
44
-
45
- if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.1')
46
- assert_equal(3, methods.length)
47
-
48
- # Method 0: RecursiveTest#test_simple
49
- method = methods[0]
50
- assert_equal('RecursiveTest#test_simple', method.full_name)
51
- assert_equal(1, method.called)
52
- refute(method.recursive?)
53
- assert_in_delta(2, method.total_time, 0.1)
54
- assert_in_delta(0, method.self_time, 0.01)
55
- assert_in_delta(0, method.wait_time, 0.01)
56
- assert_in_delta(2, method.children_time, 0.1)
57
-
58
- assert_equal(0, method.call_trees.callers.length)
59
-
60
- assert_equal(1, method.call_trees.callees.length)
61
- call_tree = method.call_trees.callees[0]
62
- assert_equal('SimpleRecursion#simple', call_tree.target.full_name)
63
-
64
- # Method 1: SimpleRecursion#simple
65
- method = methods[1]
66
- assert_equal('SimpleRecursion#simple', method.full_name)
67
- assert_equal(2, method.called)
68
- assert(method.recursive?)
69
- assert_in_delta(2, method.total_time, 0.1)
70
- assert_in_delta(0, method.self_time, 0.1)
71
- assert_in_delta(0, method.wait_time, 0.1)
72
- assert_in_delta(2, method.children_time, 0.1)
73
-
74
- assert_equal(2, method.call_trees.callers.length)
75
- call_tree = method.call_trees.callers[0]
76
- assert_equal('RecursiveTest#test_simple', call_tree.parent.target.full_name)
77
-
78
- call_tree = method.call_trees.callers[1]
79
- assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
80
-
81
- assert_equal(2, method.call_trees.callees.length)
82
- call_tree = method.call_trees.callees[0]
83
- assert_equal('Kernel#sleep', call_tree.target.full_name)
84
-
85
- call_tree = method.call_trees.callees[1]
86
- assert_equal('SimpleRecursion#simple', call_tree.target.full_name)
87
-
88
- # Method 2: Kernel#sleep
89
- method = methods[2]
90
- assert_equal('Kernel#sleep', method.full_name)
91
- assert_equal(2, method.called)
92
- refute(method.recursive?)
93
-
94
- assert_in_delta(2, method.total_time, 0.1)
95
- assert_in_delta(2, method.self_time, 0.1)
96
- assert_in_delta(0, method.wait_time, 0.1)
97
- assert_in_delta(0, method.children_time, 0.1)
98
-
99
- assert_equal(1, method.call_trees.callers.length)
100
- call_tree = method.call_trees.callers[0]
101
- assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
102
- assert_equal(0, method.call_trees.callees.length)
103
-
104
- assert_equal(0, method.call_trees.callees.length)
105
- else
106
- assert_equal(5, methods.length)
107
-
108
- # Method 0: RecursiveTest#test_simple
109
- method = methods[0]
110
- assert_equal('RecursiveTest#test_simple', method.full_name)
111
- assert_equal(1, method.called)
112
- refute(method.recursive?)
113
- assert_in_delta(2, method.total_time, 0.1)
114
- assert_in_delta(0, method.self_time, 0.01)
115
- assert_in_delta(0, method.wait_time, 0.01)
116
- assert_in_delta(2, method.children_time, 0.1)
117
-
118
- assert_equal(0, method.call_trees.callers.length)
119
-
120
- assert_equal(1, method.call_trees.callees.length)
121
- call_tree = method.call_trees.callees[0]
122
- assert_equal('SimpleRecursion#simple', call_tree.target.full_name)
123
-
124
- # Method 1: SimpleRecursion#simple
125
- method = methods[1]
126
- assert_equal('SimpleRecursion#simple', method.full_name)
127
- assert_equal(2, method.called)
128
- assert(method.recursive?)
129
- assert_in_delta(2, method.total_time, 0.1)
130
- assert_in_delta(0, method.self_time, 0.1)
131
- assert_in_delta(0, method.wait_time, 0.1)
132
- assert_in_delta(2, method.children_time, 0.1)
133
-
134
- assert_equal(2, method.call_trees.callers.length)
135
- call_tree = method.call_trees.callers[0]
136
- assert_equal('RecursiveTest#test_simple', call_tree.parent.target.full_name)
137
-
138
- call_tree = method.call_trees.callers[1]
139
- assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
140
-
141
- assert_equal(4, method.call_trees.callees.length)
142
- call_tree = method.call_trees.callees[0]
143
- assert_equal('Kernel#sleep', call_tree.target.full_name)
144
-
145
- call_tree = method.call_trees.callees[1]
146
- assert_equal('Integer#==', call_tree.target.full_name)
147
-
148
- call_tree = method.call_trees.callees[2]
149
- assert_equal('Integer#-', call_tree.target.full_name)
150
-
151
- call_tree = method.call_trees.callees[3]
152
- assert_equal('SimpleRecursion#simple', call_tree.target.full_name)
153
-
154
- # Method 2: Kernel#sleep
155
- method = methods[2]
156
- assert_equal('Kernel#sleep', method.full_name)
157
- assert_equal(2, method.called)
158
- refute(method.recursive?)
159
-
160
- assert_in_delta(2, method.total_time, 0.1)
161
- assert_in_delta(2, method.self_time, 0.1)
162
- assert_in_delta(0, method.wait_time, 0.1)
163
- assert_in_delta(0, method.children_time, 0.1)
164
-
165
- assert_equal(1, method.call_trees.callers.length)
166
- call_tree = method.call_trees.callers[0]
167
- assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
168
- assert_equal(0, method.call_trees.callees.length)
169
-
170
- assert_equal(0, method.call_trees.callees.length)
171
-
172
- # Method 3
173
- method = methods[3]
174
- assert_equal('Integer#==', method.full_name)
175
- assert_equal(2, method.called)
176
- refute(method.recursive?)
177
-
178
- assert_equal(1, method.call_trees.callers.length)
179
- call_tree = method.call_trees.callers[0]
180
- assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
181
-
182
- assert_equal(0, method.call_trees.callees.length)
183
-
184
- # Method 4
185
- method = methods[4]
186
- assert_equal('Integer#-', method.full_name)
187
- assert_equal(1, method.called)
188
- refute(method.recursive?)
189
-
190
- assert_equal(1, method.call_trees.callers.length)
191
- call_tree = method.call_trees.callers[0]
192
- assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
193
-
194
- assert_equal(0, method.call_trees.callees.length)
195
- end
196
- end
197
-
198
- def test_cycle
199
- result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
200
- render
201
- end
202
-
203
- methods = result.threads.first.methods.sort.reverse
204
-
205
- if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.1')
206
- assert_equal(5, methods.length)
207
-
208
- # Method 0
209
- method = methods[0]
210
- assert_equal('RecursiveTest#test_cycle', method.full_name)
211
- assert_equal(1, method.called)
212
- refute(method.recursive?)
213
- assert_in_delta(5, method.total_time, 0.1)
214
- assert_in_delta(0, method.self_time, 0.01)
215
- assert_in_delta(0, method.wait_time, 0.01)
216
- assert_in_delta(5, method.children_time, 0.1)
217
-
218
- assert_equal(0, method.call_trees.callers.length)
219
-
220
- assert_equal(1, method.call_trees.callees.length)
221
- call_tree = method.call_trees.callees[0]
222
- assert_equal('SimpleRecursion#render', call_tree.target.full_name)
223
-
224
- # Method 1
225
- method = methods[1]
226
- assert_equal('SimpleRecursion#render', method.full_name)
227
- assert_equal(1, method.called)
228
- refute(method.recursive?)
229
- assert_in_delta(5, method.total_time, 0.1)
230
- assert_in_delta(0, method.self_time, 0.01)
231
- assert_in_delta(0, method.wait_time, 0.01)
232
- assert_in_delta(5, method.children_time, 0.1)
233
-
234
- assert_equal(1, method.call_trees.callers.length)
235
- call_tree = method.call_trees.callers[0]
236
- assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name)
237
-
238
- assert_equal(1, method.call_trees.callees.length)
239
- call_tree = method.call_trees.callees[0]
240
- assert_equal('Integer#times', call_tree.target.full_name)
241
-
242
- # Method 2
243
- method = methods[2]
244
- assert_equal('Integer#times', method.full_name)
245
- assert_equal(2, method.called)
246
- assert(method.recursive?)
247
- assert_in_delta(5, method.total_time, 0.1)
248
- assert_in_delta(0, method.self_time, 0.1)
249
- assert_in_delta(0, method.wait_time, 0.1)
250
- assert_in_delta(5, method.children_time, 0.1)
251
-
252
- assert_equal(2, method.call_trees.callers.length)
253
- call_tree = method.call_trees.callers[0]
254
- assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name)
255
-
256
- call_tree = method.call_trees.callers[1]
257
- assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
258
-
259
- assert_equal(1, method.call_trees.callees.length)
260
- call_tree = method.call_trees.callees[0]
261
- assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
262
-
263
- # Method 3
264
- method = methods[3]
265
- assert_equal('SimpleRecursion#render_partial', method.full_name)
266
- assert_equal(5, method.called)
267
- assert(method.recursive?)
268
- assert_in_delta(5, method.total_time, 0.1)
269
- assert_in_delta(0, method.self_time, 0.1)
270
- assert_in_delta(0, method.wait_time, 0.01)
271
- assert_in_delta(5, method.children_time, 0.05)
272
-
273
- assert_equal(2, method.call_trees.callers.length)
274
- call_tree = method.call_trees.callers[0]
275
- assert_equal('Integer#times', call_tree.parent.target.full_name)
276
-
277
- call_tree = method.call_trees.callers[1]
278
- assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
279
-
280
- assert_equal(3, method.call_trees.callees.length)
281
- call_tree = method.call_trees.callees[0]
282
- assert_equal('Kernel#sleep', call_tree.target.full_name)
283
-
284
- call_tree = method.call_trees.callees[1]
285
- assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
286
-
287
- call_tree = method.call_trees.callees[2]
288
- assert_equal('Integer#times', call_tree.target.full_name)
289
-
290
- # Method 4
291
- method = methods[4]
292
- assert_equal('Kernel#sleep', method.full_name)
293
- assert_equal(5, method.called)
294
- refute(method.recursive?)
295
- assert_in_delta(5, method.total_time, 0.1)
296
- assert_in_delta(5, method.self_time, 0.1)
297
- assert_in_delta(0, method.wait_time, 0.01)
298
- assert_in_delta(0, method.children_time, 0.01)
299
-
300
- assert_equal(1, method.call_trees.callers.length)
301
- call_tree = method.call_trees.callers[0]
302
- assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
303
-
304
- assert_equal(0, method.call_trees.callees.length)
305
- elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3')
306
- assert_equal(6, methods.length)
307
-
308
- # Method 0
309
- method = methods[0]
310
- assert_equal('RecursiveTest#test_cycle', method.full_name)
311
- assert_equal(1, method.called)
312
- refute(method.recursive?)
313
- assert_in_delta(5, method.total_time, 0.1)
314
- assert_in_delta(0, method.self_time, 0.01)
315
- assert_in_delta(0, method.wait_time, 0.01)
316
- assert_in_delta(5, method.children_time, 0.1)
317
-
318
- assert_equal(0, method.call_trees.callers.length)
319
-
320
- assert_equal(1, method.call_trees.callees.length)
321
- call_tree = method.call_trees.callees[0]
322
- assert_equal('SimpleRecursion#render', call_tree.target.full_name)
323
-
324
- # Method 1
325
- method = methods[1]
326
- assert_equal('SimpleRecursion#render', method.full_name)
327
- assert_equal(1, method.called)
328
- refute(method.recursive?)
329
- assert_in_delta(5, method.total_time, 0.1)
330
- assert_in_delta(0, method.self_time, 0.01)
331
- assert_in_delta(0, method.wait_time, 0.01)
332
- assert_in_delta(5, method.children_time, 0.1)
333
-
334
- assert_equal(1, method.call_trees.callers.length)
335
- call_tree = method.call_trees.callers[0]
336
- assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name)
337
-
338
- assert_equal(1, method.call_trees.callees.length)
339
- call_tree = method.call_trees.callees[0]
340
- assert_equal('Integer#times', call_tree.target.full_name)
341
-
342
- # Method 2
343
- method = methods[2]
344
- assert_equal('Integer#times', method.full_name)
345
- assert_equal(2, method.called)
346
- assert(method.recursive?)
347
- assert_in_delta(5, method.total_time, 0.1)
348
- assert_in_delta(0, method.self_time, 0.1)
349
- assert_in_delta(0, method.wait_time, 0.1)
350
- assert_in_delta(5, method.children_time, 0.1)
351
-
352
- assert_equal(2, method.call_trees.callers.length)
353
- call_tree = method.call_trees.callers[0]
354
- assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name)
355
-
356
- call_tree = method.call_trees.callers[1]
357
- assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
358
-
359
- assert_equal(2, method.call_trees.callees.length)
360
- call_tree = method.call_trees.callees[0]
361
- assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
362
- call_tree = method.call_trees.callees[1]
363
- assert_equal('Integer#+', call_tree.target.full_name)
364
-
365
- # Method 3
366
- method = methods[3]
367
- assert_equal('SimpleRecursion#render_partial', method.full_name)
368
- assert_equal(5, method.called)
369
- assert(method.recursive?)
370
- assert_in_delta(5, method.total_time, 0.1)
371
- assert_in_delta(0, method.self_time, 0.1)
372
- assert_in_delta(0, method.wait_time, 0.01)
373
- assert_in_delta(5, method.children_time, 0.1)
374
-
375
- assert_equal(2, method.call_trees.callers.length)
376
- call_tree = method.call_trees.callers[0]
377
- assert_equal('Integer#times', call_tree.parent.target.full_name)
378
-
379
- call_tree = method.call_trees.callers[1]
380
- assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
381
-
382
- assert_equal(3, method.call_trees.callees.length)
383
- call_tree = method.call_trees.callees[0]
384
- assert_equal('Kernel#sleep', call_tree.target.full_name)
385
-
386
- call_tree = method.call_trees.callees[1]
387
- assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
388
-
389
- call_tree = method.call_trees.callees[2]
390
- assert_equal('Integer#times', call_tree.target.full_name)
391
-
392
- # Method 4
393
- method = methods[4]
394
- assert_equal('Kernel#sleep', method.full_name)
395
- assert_equal(5, method.called)
396
- refute(method.recursive?)
397
- assert_in_delta(5, method.total_time, 0.1)
398
- assert_in_delta(5, method.self_time, 0.1)
399
- assert_in_delta(0, method.wait_time, 0.01)
400
- assert_in_delta(0, method.children_time, 0.01)
401
-
402
- assert_equal(1, method.call_trees.callers.length)
403
- call_tree = method.call_trees.callers[0]
404
- assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
405
-
406
- assert_equal(0, method.call_trees.callees.length)
407
-
408
- # Method 5
409
- method = methods[5]
410
- assert_equal('Integer#+', method.full_name)
411
- assert_equal(2, method.called)
412
- refute(method.recursive?)
413
- assert_in_delta(0, method.total_time, 0.1)
414
- assert_in_delta(0, method.self_time, 0.1)
415
- assert_in_delta(0, method.wait_time, 0.01)
416
- assert_in_delta(0, method.children_time, 0.01)
417
-
418
- assert_equal(1, method.call_trees.callers.length)
419
- call_tree = method.call_trees.callers[0]
420
- assert_equal('Integer#times', call_tree.parent.target.full_name)
421
-
422
- assert_equal(0, method.call_trees.callees.length)
423
- else
424
- assert_equal(9, methods.length)
425
-
426
- # Method 0
427
- method = methods[0]
428
- assert_equal('RecursiveTest#test_cycle', method.full_name)
429
- assert_equal(1, method.called)
430
- refute(method.recursive?)
431
- assert_in_delta(5, method.total_time, 0.1)
432
- assert_in_delta(0, method.self_time, 0.01)
433
- assert_in_delta(0, method.wait_time, 0.01)
434
- assert_in_delta(5, method.children_time, 0.1)
435
-
436
- assert_equal(0, method.call_trees.callers.length)
437
-
438
- assert_equal(1, method.call_trees.callees.length)
439
- call_tree = method.call_trees.callees[0]
440
- assert_equal('SimpleRecursion#render', call_tree.target.full_name)
441
-
442
- # Method 1
443
- method = methods[1]
444
- assert_equal('SimpleRecursion#render', method.full_name)
445
- assert_equal(1, method.called)
446
- refute(method.recursive?)
447
- assert_in_delta(5, method.total_time, 0.1)
448
- assert_in_delta(0, method.self_time, 0.01)
449
- assert_in_delta(0, method.wait_time, 0.01)
450
- assert_in_delta(5, method.children_time, 0.1)
451
-
452
- assert_equal(1, method.call_trees.callers.length)
453
- call_tree = method.call_trees.callers[0]
454
- assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name)
455
-
456
- assert_equal(1, method.call_trees.callees.length)
457
- call_tree = method.call_trees.callees[0]
458
- assert_equal('Integer#times', call_tree.target.full_name)
459
-
460
- # Method 2
461
- method = methods[2]
462
- assert_equal('Integer#times', method.full_name)
463
- assert_equal(2, method.called)
464
- assert(method.recursive?)
465
- assert_in_delta(5, method.total_time, 0.1)
466
- assert_in_delta(0, method.self_time, 0.1)
467
- assert_in_delta(0, method.wait_time, 0.1)
468
- assert_in_delta(5, method.children_time, 0.1)
469
-
470
- assert_equal(2, method.call_trees.callers.length)
471
- call_tree = method.call_trees.callers[0]
472
- assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name)
473
-
474
- call_tree = method.call_trees.callers[1]
475
- assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
476
-
477
- assert_equal(5, method.call_trees.callees.length)
478
-
479
- call_tree = method.call_trees.callees[0]
480
- assert_equal('Kernel#block_given?', call_tree.target.full_name)
481
- assert_in_delta(0, call_tree.total_time)
482
- assert_in_delta(0, call_tree.wait_time)
483
- assert_in_delta(0, call_tree.self_time)
484
- assert_in_delta(0, call_tree.children_time)
485
-
486
- call_tree = method.call_trees.callees[1]
487
- assert_equal('Integer#<', call_tree.target.full_name)
488
- assert_in_delta(0, call_tree.total_time)
489
- assert_in_delta(0, call_tree.wait_time)
490
- assert_in_delta(0, call_tree.self_time)
491
- assert_in_delta(0, call_tree.children_time)
492
-
493
- call_tree = method.call_trees.callees[2]
494
- assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
495
- assert_in_delta(7.0, call_tree.total_time, 0.1)
496
- assert_in_delta(0, call_tree.wait_time)
497
- assert_in_delta(0, call_tree.self_time)
498
- assert_in_delta(7.0, call_tree.children_time, 0.1)
499
-
500
- call_tree = method.call_trees.callees[3]
501
- assert_equal('Integer#succ', call_tree.target.full_name)
502
- assert_in_delta(0, call_tree.total_time)
503
- assert_in_delta(0, call_tree.wait_time)
504
- assert_in_delta(0, call_tree.self_time)
505
- assert_in_delta(0, call_tree.children_time)
506
-
507
- call_tree = method.call_trees.callees[4]
508
- assert_equal('Integer#+', call_tree.target.full_name)
509
- assert_in_delta(0, call_tree.total_time)
510
- assert_in_delta(0, call_tree.wait_time)
511
- assert_in_delta(0, call_tree.self_time)
512
- assert_in_delta(0, call_tree.children_time)
513
-
514
- # Method 3
515
- method = methods[3]
516
- assert_equal('SimpleRecursion#render_partial', method.full_name)
517
- assert_equal(5, method.called)
518
- assert(method.recursive?)
519
- assert_in_delta(5, method.total_time, 0.1)
520
- assert_in_delta(0, method.self_time, 0.1)
521
- assert_in_delta(0, method.wait_time, 0.01)
522
- assert_in_delta(5, method.children_time, 0.1)
523
-
524
- assert_equal(2, method.call_trees.callers.length)
525
- call_tree = method.call_trees.callers[0]
526
- assert_equal('Integer#times', call_tree.parent.target.full_name)
527
-
528
- call_tree = method.call_trees.callers[1]
529
- assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
530
-
531
- assert_equal(3, method.call_trees.callees.length)
532
- call_tree = method.call_trees.callees[0]
533
- assert_equal('Kernel#sleep', call_tree.target.full_name)
534
-
535
- call_tree = method.call_trees.callees[1]
536
- assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
537
-
538
- call_tree = method.call_trees.callees[2]
539
- assert_equal('Integer#times', call_tree.target.full_name)
540
-
541
- # Method 4
542
- method = methods[4]
543
- assert_equal('Kernel#sleep', method.full_name)
544
- assert_equal(5, method.called)
545
- refute(method.recursive?)
546
- assert_in_delta(5, method.total_time, 0.1)
547
- assert_in_delta(5, method.self_time, 0.1)
548
- assert_in_delta(0, method.wait_time, 0.01)
549
- assert_in_delta(0, method.children_time, 0.01)
550
-
551
- assert_equal(1, method.call_trees.callers.length)
552
- call_tree = method.call_trees.callers[0]
553
- assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
554
-
555
- assert_equal(0, method.call_trees.callees.length)
556
-
557
- # Method 5
558
- method = methods[5]
559
- assert_equal('Kernel#block_given?', method.full_name)
560
- assert_equal(2, method.called)
561
- refute(method.recursive?)
562
- assert_in_delta(0, method.total_time, 0.1)
563
- assert_in_delta(0, method.self_time, 0.1)
564
- assert_in_delta(0, method.wait_time, 0.01)
565
- assert_in_delta(0, method.children_time, 0.01)
566
-
567
- assert_equal(1, method.call_trees.callers.length)
568
- call_tree = method.call_trees.callers[0]
569
- assert_equal('Integer#times', call_tree.parent.target.full_name)
570
-
571
- assert_equal(0, method.call_trees.callees.length)
572
-
573
- # Method 6
574
- method = methods[6]
575
- assert_equal('Integer#succ', method.full_name)
576
- assert_equal(4, method.called)
577
- refute(method.recursive?)
578
- assert_in_delta(0, method.total_time, 0.1)
579
- assert_in_delta(0, method.self_time, 0.1)
580
- assert_in_delta(0, method.wait_time, 0.01)
581
- assert_in_delta(0, method.children_time, 0.01)
582
-
583
- assert_equal(1, method.call_trees.callers.length)
584
- call_tree = method.call_trees.callers[0]
585
- assert_equal('Integer#times', call_tree.parent.target.full_name)
586
-
587
- assert_equal(0, method.call_trees.callees.length)
588
-
589
- # Method 7
590
- method = methods[7]
591
- assert_equal('Integer#<', method.full_name)
592
- assert_equal(6, method.called)
593
- refute(method.recursive?)
594
- assert_in_delta(0, method.total_time, 0.1)
595
- assert_in_delta(0, method.self_time, 0.1)
596
- assert_in_delta(0, method.wait_time, 0.01)
597
- assert_in_delta(0, method.children_time, 0.01)
598
-
599
- assert_equal(1, method.call_trees.callers.length)
600
- call_tree = method.call_trees.callers[0]
601
- assert_equal('Integer#times', call_tree.parent.target.full_name)
602
-
603
- assert_equal(0, method.call_trees.callees.length)
604
-
605
- # Method 8
606
- method = methods[8]
607
- assert_equal('Integer#+', method.full_name)
608
- assert_equal(2, method.called)
609
- refute(method.recursive?)
610
- assert_in_delta(0, method.total_time, 0.1)
611
- assert_in_delta(0, method.self_time, 0.1)
612
- assert_in_delta(0, method.wait_time, 0.01)
613
- assert_in_delta(0, method.children_time, 0.01)
614
-
615
- assert_equal(1, method.call_trees.callers.length)
616
- call_tree = method.call_trees.callers[0]
617
- assert_equal('Integer#times', call_tree.parent.target.full_name)
618
-
619
- assert_equal(0, method.call_trees.callees.length)
620
- end
621
- end
622
- end
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ module SimpleRecursion
7
+ # Simple recursive test
8
+ def simple(n)
9
+ sleep(1)
10
+ return if n == 0
11
+ simple(n-1)
12
+ end
13
+
14
+ # More complicated recursive test
15
+ def render_partial(i)
16
+ sleep(1)
17
+ case i
18
+ when 0
19
+ render_partial(10)
20
+ when 1
21
+ 2.times do |j|
22
+ render_partial(j + 10)
23
+ end
24
+ end
25
+ end
26
+
27
+ def render
28
+ 2.times do |i|
29
+ render_partial(i)
30
+ end
31
+ end
32
+ end
33
+
34
+ # -- Tests ----
35
+ class RecursiveTest < TestCase
36
+ include SimpleRecursion
37
+
38
+ def test_simple
39
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
40
+ simple(1)
41
+ end
42
+
43
+ methods = result.threads.first.methods.sort.reverse
44
+
45
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.1')
46
+ assert_equal(3, methods.length)
47
+
48
+ # Method 0: RecursiveTest#test_simple
49
+ method = methods[0]
50
+ assert_equal('RecursiveTest#test_simple', method.full_name)
51
+ assert_equal(1, method.called)
52
+ refute(method.recursive?)
53
+ assert_in_delta(2, method.total_time, 0.1 * delta_multiplier)
54
+ assert_in_delta(0, method.self_time, 0.01 * delta_multiplier)
55
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
56
+ assert_in_delta(2, method.children_time, 0.1 * delta_multiplier)
57
+
58
+ assert_equal(0, method.call_trees.callers.length)
59
+
60
+ assert_equal(1, method.call_trees.callees.length)
61
+ call_tree = method.call_trees.callees[0]
62
+ assert_equal('SimpleRecursion#simple', call_tree.target.full_name)
63
+
64
+ # Method 1: SimpleRecursion#simple
65
+ method = methods[1]
66
+ assert_equal('SimpleRecursion#simple', method.full_name)
67
+ assert_equal(2, method.called)
68
+ assert(method.recursive?)
69
+ assert_in_delta(2, method.total_time, 0.1 * delta_multiplier)
70
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
71
+ assert_in_delta(0, method.wait_time, 0.1 * delta_multiplier)
72
+ assert_in_delta(2, method.children_time, 0.1 * delta_multiplier)
73
+
74
+ assert_equal(2, method.call_trees.callers.length)
75
+ call_tree = method.call_trees.callers[0]
76
+ assert_equal('RecursiveTest#test_simple', call_tree.parent.target.full_name)
77
+
78
+ call_tree = method.call_trees.callers[1]
79
+ assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
80
+
81
+ assert_equal(2, method.call_trees.callees.length)
82
+ call_tree = method.call_trees.callees[0]
83
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
84
+
85
+ call_tree = method.call_trees.callees[1]
86
+ assert_equal('SimpleRecursion#simple', call_tree.target.full_name)
87
+
88
+ # Method 2: Kernel#sleep
89
+ method = methods[2]
90
+ assert_equal('Kernel#sleep', method.full_name)
91
+ assert_equal(2, method.called)
92
+ refute(method.recursive?)
93
+
94
+ assert_in_delta(2, method.total_time, 0.1 * delta_multiplier)
95
+ assert_in_delta(2, method.self_time, 0.1 * delta_multiplier)
96
+ assert_in_delta(0, method.wait_time, 0.1 * delta_multiplier)
97
+ assert_in_delta(0, method.children_time, 0.1 * delta_multiplier)
98
+
99
+ assert_equal(1, method.call_trees.callers.length)
100
+ call_tree = method.call_trees.callers[0]
101
+ assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
102
+ assert_equal(0, method.call_trees.callees.length)
103
+
104
+ assert_equal(0, method.call_trees.callees.length)
105
+ else
106
+ assert_equal(5, methods.length)
107
+
108
+ # Method 0: RecursiveTest#test_simple
109
+ method = methods[0]
110
+ assert_equal('RecursiveTest#test_simple', method.full_name)
111
+ assert_equal(1, method.called)
112
+ refute(method.recursive?)
113
+ assert_in_delta(2, method.total_time, 0.1 * delta_multiplier)
114
+ assert_in_delta(0, method.self_time, 0.01 * delta_multiplier)
115
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
116
+ assert_in_delta(2, method.children_time, 0.1 * delta_multiplier)
117
+
118
+ assert_equal(0, method.call_trees.callers.length)
119
+
120
+ assert_equal(1, method.call_trees.callees.length)
121
+ call_tree = method.call_trees.callees[0]
122
+ assert_equal('SimpleRecursion#simple', call_tree.target.full_name)
123
+
124
+ # Method 1: SimpleRecursion#simple
125
+ method = methods[1]
126
+ assert_equal('SimpleRecursion#simple', method.full_name)
127
+ assert_equal(2, method.called)
128
+ assert(method.recursive?)
129
+ assert_in_delta(2, method.total_time, 0.1 * delta_multiplier)
130
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
131
+ assert_in_delta(0, method.wait_time, 0.1 * delta_multiplier)
132
+ assert_in_delta(2, method.children_time, 0.1 * delta_multiplier)
133
+
134
+ assert_equal(2, method.call_trees.callers.length)
135
+ call_tree = method.call_trees.callers[0]
136
+ assert_equal('RecursiveTest#test_simple', call_tree.parent.target.full_name)
137
+
138
+ call_tree = method.call_trees.callers[1]
139
+ assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
140
+
141
+ assert_equal(4, method.call_trees.callees.length)
142
+ call_tree = method.call_trees.callees[0]
143
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
144
+
145
+ call_tree = method.call_trees.callees[1]
146
+ assert_equal('Integer#==', call_tree.target.full_name)
147
+
148
+ call_tree = method.call_trees.callees[2]
149
+ assert_equal('Integer#-', call_tree.target.full_name)
150
+
151
+ call_tree = method.call_trees.callees[3]
152
+ assert_equal('SimpleRecursion#simple', call_tree.target.full_name)
153
+
154
+ # Method 2: Kernel#sleep
155
+ method = methods[2]
156
+ assert_equal('Kernel#sleep', method.full_name)
157
+ assert_equal(2, method.called)
158
+ refute(method.recursive?)
159
+
160
+ assert_in_delta(2, method.total_time, 0.1 * delta_multiplier)
161
+ assert_in_delta(2, method.self_time, 0.1 * delta_multiplier)
162
+ assert_in_delta(0, method.wait_time, 0.1 * delta_multiplier)
163
+ assert_in_delta(0, method.children_time, 0.1 * delta_multiplier)
164
+
165
+ assert_equal(1, method.call_trees.callers.length)
166
+ call_tree = method.call_trees.callers[0]
167
+ assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
168
+ assert_equal(0, method.call_trees.callees.length)
169
+
170
+ assert_equal(0, method.call_trees.callees.length)
171
+
172
+ # Method 3
173
+ method = methods[3]
174
+ assert_equal('Integer#==', method.full_name)
175
+ assert_equal(2, method.called)
176
+ refute(method.recursive?)
177
+
178
+ assert_equal(1, method.call_trees.callers.length)
179
+ call_tree = method.call_trees.callers[0]
180
+ assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
181
+
182
+ assert_equal(0, method.call_trees.callees.length)
183
+
184
+ # Method 4
185
+ method = methods[4]
186
+ assert_equal('Integer#-', method.full_name)
187
+ assert_equal(1, method.called)
188
+ refute(method.recursive?)
189
+
190
+ assert_equal(1, method.call_trees.callers.length)
191
+ call_tree = method.call_trees.callers[0]
192
+ assert_equal('SimpleRecursion#simple', call_tree.parent.target.full_name)
193
+
194
+ assert_equal(0, method.call_trees.callees.length)
195
+ end
196
+ end
197
+
198
+ def test_cycle
199
+ result = RubyProf::Profile.profile(measure_mode: RubyProf::WALL_TIME) do
200
+ render
201
+ end
202
+
203
+ methods = result.threads.first.methods.sort.reverse
204
+
205
+ if Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.1')
206
+ assert_equal(5, methods.length)
207
+
208
+ # Method 0
209
+ method = methods[0]
210
+ assert_equal('RecursiveTest#test_cycle', method.full_name)
211
+ assert_equal(1, method.called)
212
+ refute(method.recursive?)
213
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
214
+ assert_in_delta(0, method.self_time, 0.01 * delta_multiplier)
215
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
216
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
217
+
218
+ assert_equal(0, method.call_trees.callers.length)
219
+
220
+ assert_equal(1, method.call_trees.callees.length)
221
+ call_tree = method.call_trees.callees[0]
222
+ assert_equal('SimpleRecursion#render', call_tree.target.full_name)
223
+
224
+ # Method 1
225
+ method = methods[1]
226
+ assert_equal('SimpleRecursion#render', method.full_name)
227
+ assert_equal(1, method.called)
228
+ refute(method.recursive?)
229
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
230
+ assert_in_delta(0, method.self_time, 0.01 * delta_multiplier)
231
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
232
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
233
+
234
+ assert_equal(1, method.call_trees.callers.length)
235
+ call_tree = method.call_trees.callers[0]
236
+ assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name)
237
+
238
+ assert_equal(1, method.call_trees.callees.length)
239
+ call_tree = method.call_trees.callees[0]
240
+ assert_equal('Integer#times', call_tree.target.full_name)
241
+
242
+ # Method 2
243
+ method = methods[2]
244
+ assert_equal('Integer#times', method.full_name)
245
+ assert_equal(2, method.called)
246
+ assert(method.recursive?)
247
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
248
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
249
+ assert_in_delta(0, method.wait_time, 0.1 * delta_multiplier)
250
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
251
+
252
+ assert_equal(2, method.call_trees.callers.length)
253
+ call_tree = method.call_trees.callers[0]
254
+ assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name)
255
+
256
+ call_tree = method.call_trees.callers[1]
257
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
258
+
259
+ assert_equal(1, method.call_trees.callees.length)
260
+ call_tree = method.call_trees.callees[0]
261
+ assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
262
+
263
+ # Method 3
264
+ method = methods[3]
265
+ assert_equal('SimpleRecursion#render_partial', method.full_name)
266
+ assert_equal(5, method.called)
267
+ assert(method.recursive?)
268
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
269
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
270
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
271
+ assert_in_delta(5, method.children_time, 0.05)
272
+
273
+ assert_equal(2, method.call_trees.callers.length)
274
+ call_tree = method.call_trees.callers[0]
275
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
276
+
277
+ call_tree = method.call_trees.callers[1]
278
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
279
+
280
+ assert_equal(3, method.call_trees.callees.length)
281
+ call_tree = method.call_trees.callees[0]
282
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
283
+
284
+ call_tree = method.call_trees.callees[1]
285
+ assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
286
+
287
+ call_tree = method.call_trees.callees[2]
288
+ assert_equal('Integer#times', call_tree.target.full_name)
289
+
290
+ # Method 4
291
+ method = methods[4]
292
+ assert_equal('Kernel#sleep', method.full_name)
293
+ assert_equal(5, method.called)
294
+ refute(method.recursive?)
295
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
296
+ assert_in_delta(5, method.self_time, 0.1 * delta_multiplier)
297
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
298
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
299
+
300
+ assert_equal(1, method.call_trees.callers.length)
301
+ call_tree = method.call_trees.callers[0]
302
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
303
+
304
+ assert_equal(0, method.call_trees.callees.length)
305
+ elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.3')
306
+ assert_equal(6, methods.length)
307
+
308
+ # Method 0
309
+ method = methods[0]
310
+ assert_equal('RecursiveTest#test_cycle', method.full_name)
311
+ assert_equal(1, method.called)
312
+ refute(method.recursive?)
313
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
314
+ assert_in_delta(0, method.self_time, 0.01 * delta_multiplier)
315
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
316
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
317
+
318
+ assert_equal(0, method.call_trees.callers.length)
319
+
320
+ assert_equal(1, method.call_trees.callees.length)
321
+ call_tree = method.call_trees.callees[0]
322
+ assert_equal('SimpleRecursion#render', call_tree.target.full_name)
323
+
324
+ # Method 1
325
+ method = methods[1]
326
+ assert_equal('SimpleRecursion#render', method.full_name)
327
+ assert_equal(1, method.called)
328
+ refute(method.recursive?)
329
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
330
+ assert_in_delta(0, method.self_time, 0.01 * delta_multiplier)
331
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
332
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
333
+
334
+ assert_equal(1, method.call_trees.callers.length)
335
+ call_tree = method.call_trees.callers[0]
336
+ assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name)
337
+
338
+ assert_equal(1, method.call_trees.callees.length)
339
+ call_tree = method.call_trees.callees[0]
340
+ assert_equal('Integer#times', call_tree.target.full_name)
341
+
342
+ # Method 2
343
+ method = methods[2]
344
+ assert_equal('Integer#times', method.full_name)
345
+ assert_equal(2, method.called)
346
+ assert(method.recursive?)
347
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
348
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
349
+ assert_in_delta(0, method.wait_time, 0.1 * delta_multiplier)
350
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
351
+
352
+ assert_equal(2, method.call_trees.callers.length)
353
+ call_tree = method.call_trees.callers[0]
354
+ assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name)
355
+
356
+ call_tree = method.call_trees.callers[1]
357
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
358
+
359
+ assert_equal(2, method.call_trees.callees.length)
360
+ call_tree = method.call_trees.callees[0]
361
+ assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
362
+ call_tree = method.call_trees.callees[1]
363
+ assert_equal('Integer#+', call_tree.target.full_name)
364
+
365
+ # Method 3
366
+ method = methods[3]
367
+ assert_equal('SimpleRecursion#render_partial', method.full_name)
368
+ assert_equal(5, method.called)
369
+ assert(method.recursive?)
370
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
371
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
372
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
373
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
374
+
375
+ assert_equal(2, method.call_trees.callers.length)
376
+ call_tree = method.call_trees.callers[0]
377
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
378
+
379
+ call_tree = method.call_trees.callers[1]
380
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
381
+
382
+ assert_equal(3, method.call_trees.callees.length)
383
+ call_tree = method.call_trees.callees[0]
384
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
385
+
386
+ call_tree = method.call_trees.callees[1]
387
+ assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
388
+
389
+ call_tree = method.call_trees.callees[2]
390
+ assert_equal('Integer#times', call_tree.target.full_name)
391
+
392
+ # Method 4
393
+ method = methods[4]
394
+ assert_equal('Kernel#sleep', method.full_name)
395
+ assert_equal(5, method.called)
396
+ refute(method.recursive?)
397
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
398
+ assert_in_delta(5, method.self_time, 0.1 * delta_multiplier)
399
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
400
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
401
+
402
+ assert_equal(1, method.call_trees.callers.length)
403
+ call_tree = method.call_trees.callers[0]
404
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
405
+
406
+ assert_equal(0, method.call_trees.callees.length)
407
+
408
+ # Method 5
409
+ method = methods[5]
410
+ assert_equal('Integer#+', method.full_name)
411
+ assert_equal(2, method.called)
412
+ refute(method.recursive?)
413
+ assert_in_delta(0, method.total_time, 0.1 * delta_multiplier)
414
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
415
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
416
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
417
+
418
+ assert_equal(1, method.call_trees.callers.length)
419
+ call_tree = method.call_trees.callers[0]
420
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
421
+
422
+ assert_equal(0, method.call_trees.callees.length)
423
+ elsif Gem::Version.new(RUBY_VERSION) < Gem::Version.new('3.4')
424
+ assert_equal(9, methods.length)
425
+
426
+ # Method 0
427
+ method = methods[0]
428
+ assert_equal('RecursiveTest#test_cycle', method.full_name)
429
+ assert_equal(1, method.called)
430
+ refute(method.recursive?)
431
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
432
+ assert_in_delta(0, method.self_time, 0.01 * delta_multiplier)
433
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
434
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
435
+
436
+ assert_equal(0, method.call_trees.callers.length)
437
+
438
+ assert_equal(1, method.call_trees.callees.length)
439
+ call_tree = method.call_trees.callees[0]
440
+ assert_equal('SimpleRecursion#render', call_tree.target.full_name)
441
+
442
+ # Method 1
443
+ method = methods[1]
444
+ assert_equal('SimpleRecursion#render', method.full_name)
445
+ assert_equal(1, method.called)
446
+ refute(method.recursive?)
447
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
448
+ assert_in_delta(0, method.self_time, 0.01 * delta_multiplier)
449
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
450
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
451
+
452
+ assert_equal(1, method.call_trees.callers.length)
453
+ call_tree = method.call_trees.callers[0]
454
+ assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name)
455
+
456
+ assert_equal(1, method.call_trees.callees.length)
457
+ call_tree = method.call_trees.callees[0]
458
+ assert_equal('Integer#times', call_tree.target.full_name)
459
+
460
+ # Method 2
461
+ method = methods[2]
462
+ assert_equal('Integer#times', method.full_name)
463
+ assert_equal(2, method.called)
464
+ assert(method.recursive?)
465
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
466
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
467
+ assert_in_delta(0, method.wait_time, 0.1 * delta_multiplier)
468
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
469
+
470
+ assert_equal(2, method.call_trees.callers.length)
471
+ call_tree = method.call_trees.callers[0]
472
+ assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name)
473
+
474
+ call_tree = method.call_trees.callers[1]
475
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
476
+
477
+ assert_equal(5, method.call_trees.callees.length)
478
+
479
+ call_tree = method.call_trees.callees[0]
480
+ assert_equal('Kernel#block_given?', call_tree.target.full_name)
481
+ assert_in_delta(0, call_tree.total_time)
482
+ assert_in_delta(0, call_tree.wait_time)
483
+ assert_in_delta(0, call_tree.self_time)
484
+ assert_in_delta(0, call_tree.children_time)
485
+
486
+ call_tree = method.call_trees.callees[1]
487
+ assert_equal('Integer#<', call_tree.target.full_name)
488
+ assert_in_delta(0, call_tree.total_time)
489
+ assert_in_delta(0, call_tree.wait_time)
490
+ assert_in_delta(0, call_tree.self_time)
491
+ assert_in_delta(0, call_tree.children_time)
492
+
493
+ call_tree = method.call_trees.callees[2]
494
+ assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
495
+ assert_in_delta(7.0, call_tree.total_time, 0.1 * delta_multiplier)
496
+ assert_in_delta(0, call_tree.wait_time)
497
+ assert_in_delta(0, call_tree.self_time)
498
+ assert_in_delta(7.0, call_tree.children_time, 0.1 * delta_multiplier)
499
+
500
+ call_tree = method.call_trees.callees[3]
501
+ assert_equal('Integer#succ', call_tree.target.full_name)
502
+ assert_in_delta(0, call_tree.total_time)
503
+ assert_in_delta(0, call_tree.wait_time)
504
+ assert_in_delta(0, call_tree.self_time)
505
+ assert_in_delta(0, call_tree.children_time)
506
+
507
+ call_tree = method.call_trees.callees[4]
508
+ assert_equal('Integer#+', call_tree.target.full_name)
509
+ assert_in_delta(0, call_tree.total_time)
510
+ assert_in_delta(0, call_tree.wait_time)
511
+ assert_in_delta(0, call_tree.self_time)
512
+ assert_in_delta(0, call_tree.children_time)
513
+
514
+ # Method 3
515
+ method = methods[3]
516
+ assert_equal('SimpleRecursion#render_partial', method.full_name)
517
+ assert_equal(5, method.called)
518
+ assert(method.recursive?)
519
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
520
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
521
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
522
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
523
+
524
+ assert_equal(2, method.call_trees.callers.length)
525
+ call_tree = method.call_trees.callers[0]
526
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
527
+
528
+ call_tree = method.call_trees.callers[1]
529
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
530
+
531
+ assert_equal(3, method.call_trees.callees.length)
532
+ call_tree = method.call_trees.callees[0]
533
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
534
+
535
+ call_tree = method.call_trees.callees[1]
536
+ assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
537
+
538
+ call_tree = method.call_trees.callees[2]
539
+ assert_equal('Integer#times', call_tree.target.full_name)
540
+
541
+ # Method 4
542
+ method = methods[4]
543
+ assert_equal('Kernel#sleep', method.full_name)
544
+ assert_equal(5, method.called)
545
+ refute(method.recursive?)
546
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
547
+ assert_in_delta(5, method.self_time, 0.1 * delta_multiplier)
548
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
549
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
550
+
551
+ assert_equal(1, method.call_trees.callers.length)
552
+ call_tree = method.call_trees.callers[0]
553
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
554
+
555
+ assert_equal(0, method.call_trees.callees.length)
556
+
557
+ # Method 5
558
+ method = methods[5]
559
+ assert_equal('Kernel#block_given?', method.full_name)
560
+ assert_equal(2, method.called)
561
+ refute(method.recursive?)
562
+ assert_in_delta(0, method.total_time, 0.1 * delta_multiplier)
563
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
564
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
565
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
566
+
567
+ assert_equal(1, method.call_trees.callers.length)
568
+ call_tree = method.call_trees.callers[0]
569
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
570
+
571
+ assert_equal(0, method.call_trees.callees.length)
572
+
573
+ # Method 6
574
+ method = methods[6]
575
+ assert_equal('Integer#succ', method.full_name)
576
+ assert_equal(4, method.called)
577
+ refute(method.recursive?)
578
+ assert_in_delta(0, method.total_time, 0.1 * delta_multiplier)
579
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
580
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
581
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
582
+
583
+ assert_equal(1, method.call_trees.callers.length)
584
+ call_tree = method.call_trees.callers[0]
585
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
586
+
587
+ assert_equal(0, method.call_trees.callees.length)
588
+
589
+ # Method 7
590
+ method = methods[7]
591
+ assert_equal('Integer#<', method.full_name)
592
+ assert_equal(6, method.called)
593
+ refute(method.recursive?)
594
+ assert_in_delta(0, method.total_time, 0.1 * delta_multiplier)
595
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
596
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
597
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
598
+
599
+ assert_equal(1, method.call_trees.callers.length)
600
+ call_tree = method.call_trees.callers[0]
601
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
602
+
603
+ assert_equal(0, method.call_trees.callees.length)
604
+
605
+ # Method 8
606
+ method = methods[8]
607
+ assert_equal('Integer#+', method.full_name)
608
+ assert_equal(2, method.called)
609
+ refute(method.recursive?)
610
+ assert_in_delta(0, method.total_time, 0.1 * delta_multiplier)
611
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
612
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
613
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
614
+
615
+ assert_equal(1, method.call_trees.callers.length)
616
+ call_tree = method.call_trees.callers[0]
617
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
618
+
619
+ assert_equal(0, method.call_trees.callees.length)
620
+ else
621
+ assert_equal(8, methods.length)
622
+
623
+ # Method 0
624
+ method = methods[0]
625
+ assert_equal('RecursiveTest#test_cycle', method.full_name)
626
+ assert_equal(1, method.called)
627
+ refute(method.recursive?)
628
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
629
+ assert_in_delta(0, method.self_time, 0.01 * delta_multiplier)
630
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
631
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
632
+
633
+ assert_equal(0, method.call_trees.callers.length)
634
+
635
+ assert_equal(1, method.call_trees.callees.length)
636
+ call_tree = method.call_trees.callees[0]
637
+ assert_equal('SimpleRecursion#render', call_tree.target.full_name)
638
+
639
+ # Method 1
640
+ method = methods[1]
641
+ assert_equal('SimpleRecursion#render', method.full_name)
642
+ assert_equal(1, method.called)
643
+ refute(method.recursive?)
644
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
645
+ assert_in_delta(0, method.self_time, 0.01 * delta_multiplier)
646
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
647
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
648
+
649
+ assert_equal(1, method.call_trees.callers.length)
650
+ call_tree = method.call_trees.callers[0]
651
+ assert_equal('RecursiveTest#test_cycle', call_tree.parent.target.full_name)
652
+
653
+ assert_equal(1, method.call_trees.callees.length)
654
+ call_tree = method.call_trees.callees[0]
655
+ assert_equal('Integer#times', call_tree.target.full_name)
656
+
657
+ # Method 2
658
+ method = methods[2]
659
+ assert_equal('Integer#times', method.full_name)
660
+ assert_equal(2, method.called)
661
+ assert(method.recursive?)
662
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
663
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
664
+ assert_in_delta(0, method.wait_time, 0.1 * delta_multiplier)
665
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
666
+
667
+ assert_equal(2, method.call_trees.callers.length)
668
+ call_tree = method.call_trees.callers[0]
669
+ assert_equal('SimpleRecursion#render', call_tree.parent.target.full_name)
670
+
671
+ call_tree = method.call_trees.callers[1]
672
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
673
+
674
+ assert_equal(4, method.call_trees.callees.length)
675
+
676
+ call_tree = method.call_trees.callees[0]
677
+ assert_equal('Integer#<', call_tree.target.full_name)
678
+ assert_in_delta(0, call_tree.total_time)
679
+ assert_in_delta(0, call_tree.wait_time)
680
+ assert_in_delta(0, call_tree.self_time)
681
+ assert_in_delta(0, call_tree.children_time)
682
+
683
+ call_tree = method.call_trees.callees[1]
684
+ assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
685
+ assert_in_delta(7.0, call_tree.total_time, 0.1 * delta_multiplier)
686
+ assert_in_delta(0, call_tree.wait_time)
687
+ assert_in_delta(0, call_tree.self_time)
688
+ assert_in_delta(7.0, call_tree.children_time, 0.1 * delta_multiplier)
689
+
690
+ call_tree = method.call_trees.callees[2]
691
+ assert_equal('Integer#succ', call_tree.target.full_name)
692
+ assert_in_delta(0, call_tree.total_time)
693
+ assert_in_delta(0, call_tree.wait_time)
694
+ assert_in_delta(0, call_tree.self_time)
695
+ assert_in_delta(0, call_tree.children_time)
696
+
697
+ call_tree = method.call_trees.callees[3]
698
+ assert_equal('Integer#+', call_tree.target.full_name)
699
+ assert_in_delta(0, call_tree.total_time)
700
+ assert_in_delta(0, call_tree.wait_time)
701
+ assert_in_delta(0, call_tree.self_time)
702
+ assert_in_delta(0, call_tree.children_time)
703
+
704
+ # Method 3
705
+ method = methods[3]
706
+ assert_equal('SimpleRecursion#render_partial', method.full_name)
707
+ assert_equal(5, method.called)
708
+ assert(method.recursive?)
709
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
710
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
711
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
712
+ assert_in_delta(5, method.children_time, 0.1 * delta_multiplier)
713
+
714
+ assert_equal(2, method.call_trees.callers.length)
715
+ call_tree = method.call_trees.callers[0]
716
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
717
+
718
+ call_tree = method.call_trees.callers[1]
719
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
720
+
721
+ assert_equal(3, method.call_trees.callees.length)
722
+ call_tree = method.call_trees.callees[0]
723
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
724
+
725
+ call_tree = method.call_trees.callees[1]
726
+ assert_equal('SimpleRecursion#render_partial', call_tree.target.full_name)
727
+
728
+ call_tree = method.call_trees.callees[2]
729
+ assert_equal('Integer#times', call_tree.target.full_name)
730
+
731
+ # Method 4
732
+ method = methods[4]
733
+ assert_equal('Kernel#sleep', method.full_name)
734
+ assert_equal(5, method.called)
735
+ refute(method.recursive?)
736
+ assert_in_delta(5, method.total_time, 0.1 * delta_multiplier)
737
+ assert_in_delta(5, method.self_time, 0.1 * delta_multiplier)
738
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
739
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
740
+
741
+ assert_equal(1, method.call_trees.callers.length)
742
+ call_tree = method.call_trees.callers[0]
743
+ assert_equal('SimpleRecursion#render_partial', call_tree.parent.target.full_name)
744
+
745
+ assert_equal(0, method.call_trees.callees.length)
746
+
747
+ # Method 5
748
+ method = methods[5]
749
+ assert_equal('Integer#succ', method.full_name)
750
+ assert_equal(4, method.called)
751
+ refute(method.recursive?)
752
+ assert_in_delta(0, method.total_time, 0.1 * delta_multiplier)
753
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
754
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
755
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
756
+
757
+ assert_equal(1, method.call_trees.callers.length)
758
+ call_tree = method.call_trees.callers[0]
759
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
760
+
761
+ assert_equal(0, method.call_trees.callees.length)
762
+
763
+ # Method 6
764
+ method = methods[6]
765
+ assert_equal('Integer#<', method.full_name)
766
+ assert_equal(6, method.called)
767
+ refute(method.recursive?)
768
+ assert_in_delta(0, method.total_time, 0.1 * delta_multiplier)
769
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
770
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
771
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
772
+
773
+ assert_equal(1, method.call_trees.callers.length)
774
+ call_tree = method.call_trees.callers[0]
775
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
776
+
777
+ assert_equal(0, method.call_trees.callees.length)
778
+
779
+ # Method 7
780
+ method = methods[7]
781
+ assert_equal('Integer#+', method.full_name)
782
+ assert_equal(2, method.called)
783
+ refute(method.recursive?)
784
+ assert_in_delta(0, method.total_time, 0.1 * delta_multiplier)
785
+ assert_in_delta(0, method.self_time, 0.1 * delta_multiplier)
786
+ assert_in_delta(0, method.wait_time, 0.01 * delta_multiplier)
787
+ assert_in_delta(0, method.children_time, 0.01 * delta_multiplier)
788
+
789
+ assert_equal(1, method.call_trees.callers.length)
790
+ call_tree = method.call_trees.callers[0]
791
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
792
+
793
+ assert_equal(0, method.call_trees.callees.length)
794
+ end
795
+ end
796
+ end