ruby-prof 1.7.1 → 1.7.2

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 (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +8 -0
  3. data/ext/ruby_prof/extconf.rb +23 -22
  4. data/ext/ruby_prof/rp_call_trees.c +296 -296
  5. data/ext/ruby_prof/rp_call_trees.h +28 -28
  6. data/ext/ruby_prof/rp_measure_allocations.c +47 -47
  7. data/ext/ruby_prof/rp_measure_process_time.c +64 -66
  8. data/ext/ruby_prof/rp_measure_wall_time.c +52 -64
  9. data/ext/ruby_prof/rp_method.c +551 -551
  10. data/ext/ruby_prof/rp_stack.c +212 -212
  11. data/ext/ruby_prof/ruby_prof.c +50 -50
  12. data/ext/ruby_prof/ruby_prof.h +3 -2
  13. data/ext/ruby_prof/vc/ruby_prof.vcxproj +3 -3
  14. data/lib/ruby-prof/compatibility.rb +113 -113
  15. data/lib/ruby-prof/exclude_common_methods.rb +204 -204
  16. data/lib/ruby-prof/printers/abstract_printer.rb +156 -138
  17. data/lib/ruby-prof/version.rb +3 -3
  18. data/ruby-prof.gemspec +66 -65
  19. data/test/dynamic_method_test.rb +9 -21
  20. data/test/enumerable_test.rb +23 -21
  21. data/test/exclude_methods_test.rb +363 -257
  22. data/test/fiber_test.rb +195 -195
  23. data/test/gc_test.rb +104 -102
  24. data/test/line_number_test.rb +426 -289
  25. data/test/measure_allocations_test.rb +1172 -1081
  26. data/test/measure_memory_test.rb +1193 -1456
  27. data/test/measure_process_time_test.rb +3330 -2477
  28. data/test/measure_wall_time_test.rb +634 -568
  29. data/test/merge_test.rb +146 -146
  30. data/test/method_info_test.rb +100 -95
  31. data/test/printers_test.rb +178 -135
  32. data/test/recursive_test.rb +796 -622
  33. data/test/start_stop_test.rb +4 -4
  34. data/test/test_helper.rb +20 -20
  35. data/test/thread_test.rb +229 -231
  36. data/test/unique_call_path_test.rb +9 -22
  37. data/test/yarv_test.rb +1 -5
  38. metadata +19 -9
  39. data/test/crash2.rb +0 -144
@@ -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)
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