ruby-prof 1.8.0-x64-mswin64-140

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 (108) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGES +665 -0
  3. data/LICENSE +25 -0
  4. data/README.md +5 -0
  5. data/Rakefile +98 -0
  6. data/bin/ruby-prof +341 -0
  7. data/bin/ruby-prof-check-trace +45 -0
  8. data/ext/ruby_prof/extconf.rb +23 -0
  9. data/ext/ruby_prof/rp_allocation.c +327 -0
  10. data/ext/ruby_prof/rp_allocation.h +32 -0
  11. data/ext/ruby_prof/rp_call_tree.c +502 -0
  12. data/ext/ruby_prof/rp_call_tree.h +47 -0
  13. data/ext/ruby_prof/rp_call_trees.c +296 -0
  14. data/ext/ruby_prof/rp_call_trees.h +28 -0
  15. data/ext/ruby_prof/rp_measure_allocations.c +47 -0
  16. data/ext/ruby_prof/rp_measure_memory.c +46 -0
  17. data/ext/ruby_prof/rp_measure_process_time.c +64 -0
  18. data/ext/ruby_prof/rp_measure_wall_time.c +52 -0
  19. data/ext/ruby_prof/rp_measurement.c +359 -0
  20. data/ext/ruby_prof/rp_measurement.h +52 -0
  21. data/ext/ruby_prof/rp_method.c +551 -0
  22. data/ext/ruby_prof/rp_method.h +66 -0
  23. data/ext/ruby_prof/rp_profile.c +933 -0
  24. data/ext/ruby_prof/rp_profile.h +36 -0
  25. data/ext/ruby_prof/rp_stack.c +212 -0
  26. data/ext/ruby_prof/rp_stack.h +53 -0
  27. data/ext/ruby_prof/rp_thread.c +433 -0
  28. data/ext/ruby_prof/rp_thread.h +39 -0
  29. data/ext/ruby_prof/ruby_prof.c +50 -0
  30. data/ext/ruby_prof/ruby_prof.h +35 -0
  31. data/ext/ruby_prof/vc/ruby_prof.sln +39 -0
  32. data/ext/ruby_prof/vc/ruby_prof.vcxproj +158 -0
  33. data/lib/ruby-prof/assets/call_stack_printer.html.erb +711 -0
  34. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  35. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -0
  36. data/lib/ruby-prof/call_tree.rb +57 -0
  37. data/lib/ruby-prof/call_tree_visitor.rb +36 -0
  38. data/lib/ruby-prof/compatibility.rb +113 -0
  39. data/lib/ruby-prof/exclude_common_methods.rb +204 -0
  40. data/lib/ruby-prof/measurement.rb +17 -0
  41. data/lib/ruby-prof/method_info.rb +87 -0
  42. data/lib/ruby-prof/printers/abstract_printer.rb +156 -0
  43. data/lib/ruby-prof/printers/call_info_printer.rb +53 -0
  44. data/lib/ruby-prof/printers/call_stack_printer.rb +180 -0
  45. data/lib/ruby-prof/printers/call_tree_printer.rb +145 -0
  46. data/lib/ruby-prof/printers/dot_printer.rb +132 -0
  47. data/lib/ruby-prof/printers/flat_printer.rb +53 -0
  48. data/lib/ruby-prof/printers/graph_html_printer.rb +63 -0
  49. data/lib/ruby-prof/printers/graph_printer.rb +113 -0
  50. data/lib/ruby-prof/printers/multi_printer.rb +127 -0
  51. data/lib/ruby-prof/profile.rb +70 -0
  52. data/lib/ruby-prof/rack.rb +105 -0
  53. data/lib/ruby-prof/task.rb +147 -0
  54. data/lib/ruby-prof/thread.rb +20 -0
  55. data/lib/ruby-prof/version.rb +3 -0
  56. data/lib/ruby-prof.rb +52 -0
  57. data/lib/unprof.rb +10 -0
  58. data/ruby-prof.gemspec +67 -0
  59. data/test/abstract_printer_test.rb +27 -0
  60. data/test/alias_test.rb +117 -0
  61. data/test/call_tree_builder.rb +126 -0
  62. data/test/call_tree_test.rb +94 -0
  63. data/test/call_tree_visitor_test.rb +27 -0
  64. data/test/call_trees_test.rb +66 -0
  65. data/test/compatibility_test.rb +49 -0
  66. data/test/duplicate_names_test.rb +32 -0
  67. data/test/dynamic_method_test.rb +50 -0
  68. data/test/enumerable_test.rb +23 -0
  69. data/test/exceptions_test.rb +24 -0
  70. data/test/exclude_methods_test.rb +363 -0
  71. data/test/exclude_threads_test.rb +48 -0
  72. data/test/fiber_test.rb +195 -0
  73. data/test/gc_test.rb +104 -0
  74. data/test/inverse_call_tree_test.rb +174 -0
  75. data/test/line_number_test.rb +426 -0
  76. data/test/marshal_test.rb +145 -0
  77. data/test/measure_allocations.rb +26 -0
  78. data/test/measure_allocations_test.rb +1172 -0
  79. data/test/measure_process_time_test.rb +3330 -0
  80. data/test/measure_times.rb +56 -0
  81. data/test/measure_wall_time_test.rb +635 -0
  82. data/test/measurement_test.rb +82 -0
  83. data/test/merge_test.rb +146 -0
  84. data/test/method_info_test.rb +100 -0
  85. data/test/multi_printer_test.rb +66 -0
  86. data/test/no_method_class_test.rb +15 -0
  87. data/test/pause_resume_test.rb +171 -0
  88. data/test/prime.rb +54 -0
  89. data/test/prime_script.rb +6 -0
  90. data/test/printer_call_stack_test.rb +27 -0
  91. data/test/printer_call_tree_test.rb +30 -0
  92. data/test/printer_flat_test.rb +99 -0
  93. data/test/printer_graph_html_test.rb +59 -0
  94. data/test/printer_graph_test.rb +40 -0
  95. data/test/printers_test.rb +178 -0
  96. data/test/printing_recursive_graph_test.rb +81 -0
  97. data/test/profile_test.rb +101 -0
  98. data/test/rack_test.rb +93 -0
  99. data/test/recursive_test.rb +796 -0
  100. data/test/scheduler.rb +363 -0
  101. data/test/singleton_test.rb +38 -0
  102. data/test/stack_printer_test.rb +61 -0
  103. data/test/start_stop_test.rb +106 -0
  104. data/test/test_helper.rb +21 -0
  105. data/test/thread_test.rb +229 -0
  106. data/test/unique_call_path_test.rb +123 -0
  107. data/test/yarv_test.rb +56 -0
  108. metadata +228 -0
@@ -0,0 +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
+ 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)
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
+ 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)
629
+ assert_in_delta(0, method.self_time, 0.01)
630
+ assert_in_delta(0, method.wait_time, 0.01)
631
+ assert_in_delta(5, method.children_time, 0.1)
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)
645
+ assert_in_delta(0, method.self_time, 0.01)
646
+ assert_in_delta(0, method.wait_time, 0.01)
647
+ assert_in_delta(5, method.children_time, 0.1)
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)
663
+ assert_in_delta(0, method.self_time, 0.1)
664
+ assert_in_delta(0, method.wait_time, 0.1)
665
+ assert_in_delta(5, method.children_time, 0.1)
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)
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)
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)
710
+ assert_in_delta(0, method.self_time, 0.1)
711
+ assert_in_delta(0, method.wait_time, 0.01)
712
+ assert_in_delta(5, method.children_time, 0.1)
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)
737
+ assert_in_delta(5, method.self_time, 0.1)
738
+ assert_in_delta(0, method.wait_time, 0.01)
739
+ assert_in_delta(0, method.children_time, 0.01)
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)
753
+ assert_in_delta(0, method.self_time, 0.1)
754
+ assert_in_delta(0, method.wait_time, 0.01)
755
+ assert_in_delta(0, method.children_time, 0.01)
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)
769
+ assert_in_delta(0, method.self_time, 0.1)
770
+ assert_in_delta(0, method.wait_time, 0.01)
771
+ assert_in_delta(0, method.children_time, 0.01)
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)
785
+ assert_in_delta(0, method.self_time, 0.1)
786
+ assert_in_delta(0, method.wait_time, 0.01)
787
+ assert_in_delta(0, method.children_time, 0.01)
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