ruby-prof 0.18.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +44 -1
  3. data/LICENSE +2 -2
  4. data/README.rdoc +1 -483
  5. data/Rakefile +3 -6
  6. data/bin/ruby-prof +111 -128
  7. data/ext/ruby_prof/extconf.rb +6 -38
  8. data/ext/ruby_prof/rp_aggregate_call_tree.c +41 -0
  9. data/ext/ruby_prof/rp_aggregate_call_tree.h +13 -0
  10. data/ext/ruby_prof/rp_allocation.c +259 -0
  11. data/ext/ruby_prof/rp_allocation.h +31 -0
  12. data/ext/ruby_prof/rp_call_tree.c +353 -0
  13. data/ext/ruby_prof/rp_call_tree.h +43 -0
  14. data/ext/ruby_prof/rp_call_trees.c +266 -0
  15. data/ext/ruby_prof/rp_call_trees.h +29 -0
  16. data/ext/ruby_prof/rp_measure_allocations.c +25 -51
  17. data/ext/ruby_prof/rp_measure_memory.c +21 -56
  18. data/ext/ruby_prof/rp_measure_process_time.c +37 -43
  19. data/ext/ruby_prof/rp_measure_wall_time.c +40 -21
  20. data/ext/ruby_prof/rp_measurement.c +221 -0
  21. data/ext/ruby_prof/rp_measurement.h +50 -0
  22. data/ext/ruby_prof/rp_method.c +279 -439
  23. data/ext/ruby_prof/rp_method.h +33 -45
  24. data/ext/ruby_prof/rp_profile.c +902 -0
  25. data/ext/ruby_prof/rp_profile.h +36 -0
  26. data/ext/ruby_prof/rp_stack.c +163 -132
  27. data/ext/ruby_prof/rp_stack.h +18 -28
  28. data/ext/ruby_prof/rp_thread.c +192 -124
  29. data/ext/ruby_prof/rp_thread.h +18 -8
  30. data/ext/ruby_prof/ruby_prof.c +36 -778
  31. data/ext/ruby_prof/ruby_prof.h +11 -45
  32. data/ext/ruby_prof/vc/ruby_prof.vcxproj +18 -12
  33. data/lib/ruby-prof.rb +4 -21
  34. data/lib/ruby-prof/assets/call_stack_printer.html.erb +710 -0
  35. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  36. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -0
  37. data/lib/ruby-prof/call_tree.rb +57 -0
  38. data/lib/ruby-prof/call_tree_visitor.rb +36 -0
  39. data/lib/ruby-prof/compatibility.rb +37 -107
  40. data/lib/ruby-prof/exclude_common_methods.rb +198 -0
  41. data/lib/ruby-prof/measurement.rb +17 -0
  42. data/lib/ruby-prof/method_info.rb +47 -90
  43. data/lib/ruby-prof/printers/abstract_printer.rb +73 -50
  44. data/lib/ruby-prof/printers/call_info_printer.rb +24 -12
  45. data/lib/ruby-prof/printers/call_stack_printer.rb +66 -152
  46. data/lib/ruby-prof/printers/call_tree_printer.rb +20 -12
  47. data/lib/ruby-prof/printers/dot_printer.rb +5 -5
  48. data/lib/ruby-prof/printers/flat_printer.rb +6 -24
  49. data/lib/ruby-prof/printers/graph_html_printer.rb +6 -192
  50. data/lib/ruby-prof/printers/graph_printer.rb +11 -14
  51. data/lib/ruby-prof/printers/multi_printer.rb +66 -23
  52. data/lib/ruby-prof/profile.rb +10 -3
  53. data/lib/ruby-prof/thread.rb +5 -20
  54. data/lib/ruby-prof/version.rb +1 -1
  55. data/ruby-prof.gemspec +9 -2
  56. data/test/abstract_printer_test.rb +0 -27
  57. data/test/alias_test.rb +126 -0
  58. data/test/basic_test.rb +1 -86
  59. data/test/call_tree_visitor_test.rb +32 -0
  60. data/test/call_trees_test.rb +66 -0
  61. data/test/dynamic_method_test.rb +0 -2
  62. data/test/exclude_methods_test.rb +17 -12
  63. data/test/fiber_test.rb +214 -23
  64. data/test/gc_test.rb +105 -0
  65. data/test/inverse_call_tree_test.rb +175 -0
  66. data/test/line_number_test.rb +118 -40
  67. data/test/marshal_test.rb +115 -0
  68. data/test/measure_allocations.rb +30 -0
  69. data/test/measure_allocations_test.rb +361 -12
  70. data/test/measure_allocations_trace_test.rb +375 -0
  71. data/test/measure_memory_trace_test.rb +1101 -0
  72. data/test/measure_process_time_test.rb +757 -33
  73. data/test/measure_times.rb +56 -0
  74. data/test/measure_wall_time_test.rb +329 -149
  75. data/test/multi_printer_test.rb +1 -34
  76. data/test/pause_resume_test.rb +24 -15
  77. data/test/prime.rb +1 -1
  78. data/test/prime_script.rb +6 -0
  79. data/test/printer_call_stack_test.rb +28 -0
  80. data/test/printer_call_tree_test.rb +31 -0
  81. data/test/printer_flat_test.rb +68 -0
  82. data/test/printer_graph_html_test.rb +60 -0
  83. data/test/printer_graph_test.rb +41 -0
  84. data/test/printers_test.rb +32 -166
  85. data/test/printing_recursive_graph_test.rb +26 -72
  86. data/test/recursive_test.rb +68 -77
  87. data/test/stack_printer_test.rb +2 -15
  88. data/test/start_stop_test.rb +22 -25
  89. data/test/test_helper.rb +6 -261
  90. data/test/thread_test.rb +11 -54
  91. data/test/unique_call_path_test.rb +25 -107
  92. data/test/yarv_test.rb +1 -0
  93. metadata +43 -41
  94. data/examples/flat.txt +0 -50
  95. data/examples/graph.dot +0 -84
  96. data/examples/graph.html +0 -823
  97. data/examples/graph.txt +0 -139
  98. data/examples/multi.flat.txt +0 -23
  99. data/examples/multi.graph.html +0 -760
  100. data/examples/multi.grind.dat +0 -114
  101. data/examples/multi.stack.html +0 -547
  102. data/examples/stack.html +0 -547
  103. data/ext/ruby_prof/rp_call_info.c +0 -425
  104. data/ext/ruby_prof/rp_call_info.h +0 -53
  105. data/ext/ruby_prof/rp_measure.c +0 -40
  106. data/ext/ruby_prof/rp_measure.h +0 -45
  107. data/ext/ruby_prof/rp_measure_cpu_time.c +0 -136
  108. data/ext/ruby_prof/rp_measure_gc_runs.c +0 -73
  109. data/ext/ruby_prof/rp_measure_gc_time.c +0 -60
  110. data/lib/ruby-prof/aggregate_call_info.rb +0 -76
  111. data/lib/ruby-prof/assets/call_stack_printer.css.html +0 -117
  112. data/lib/ruby-prof/assets/call_stack_printer.js.html +0 -385
  113. data/lib/ruby-prof/call_info.rb +0 -115
  114. data/lib/ruby-prof/call_info_visitor.rb +0 -40
  115. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +0 -83
  116. data/lib/ruby-prof/profile/exclude_common_methods.rb +0 -207
  117. data/lib/ruby-prof/profile/legacy_method_elimination.rb +0 -50
  118. data/test/aggregate_test.rb +0 -136
  119. data/test/block_test.rb +0 -74
  120. data/test/call_info_test.rb +0 -78
  121. data/test/call_info_visitor_test.rb +0 -31
  122. data/test/issue137_test.rb +0 -63
  123. data/test/measure_cpu_time_test.rb +0 -212
  124. data/test/measure_gc_runs_test.rb +0 -32
  125. data/test/measure_gc_time_test.rb +0 -36
  126. data/test/measure_memory_test.rb +0 -33
  127. data/test/method_elimination_test.rb +0 -84
  128. data/test/module_test.rb +0 -45
  129. data/test/stack_test.rb +0 -138
@@ -0,0 +1,105 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class GcTest < TestCase
7
+ def setup
8
+ GC.stress = true
9
+ end
10
+
11
+ def teardown
12
+ GC.stress = false
13
+ end
14
+
15
+ def some_method
16
+ Array.new(3 * 4)
17
+ end
18
+
19
+ def run_profile
20
+ RubyProf.profile do
21
+ self.some_method
22
+ end
23
+ end
24
+
25
+ def test_hold_onto_thread
26
+ threads = 5.times.reduce(Array.new) do |array, i|
27
+ array.concat(run_profile.threads)
28
+ array
29
+ end
30
+
31
+ threads.each do |thread|
32
+ error = assert_raises(RuntimeError) do
33
+ thread.id
34
+ end
35
+ assert_match(/has already been freed/, error.message)
36
+ end
37
+ assert(true)
38
+ end
39
+
40
+ def test_hold_onto_root_call_info
41
+ call_trees = 5.times.reduce(Array.new) do |array, i|
42
+ array.concat(run_profile.threads.map(&:call_tree))
43
+ array
44
+ end
45
+
46
+ call_trees.each do |call_tree|
47
+ error = assert_raises(RuntimeError) do
48
+ call_tree.source_file
49
+ end
50
+ assert_match(/has already been freed/, error.message)
51
+ end
52
+ assert(true)
53
+ end
54
+
55
+ def test_hold_onto_method
56
+ methods = 5.times.reduce(Array.new) do |array, i|
57
+ profile = run_profile
58
+ methods_2 = profile.threads.map(&:methods).flatten
59
+ array.concat(methods_2)
60
+ array
61
+ end
62
+
63
+ methods.each do |method|
64
+ error = assert_raises(RuntimeError) do
65
+ method.method_name
66
+ end
67
+ assert_match(/has already been freed/, error.message)
68
+ end
69
+ assert(true)
70
+ end
71
+
72
+ def test_hold_onto_call_trees
73
+ method_call_infos = 5.times.reduce(Array.new) do |array, i|
74
+ profile = run_profile
75
+ call_trees = profile.threads.map(&:methods).flatten.map(&:call_trees).flatten
76
+ array.concat(call_trees)
77
+ array
78
+ end
79
+
80
+ method_call_infos.each do |call_trees|
81
+ error = assert_raises(RuntimeError) do
82
+ call_trees.call_trees
83
+ end
84
+ assert_match(/has already been freed/, error.message)
85
+ end
86
+ assert(true)
87
+ end
88
+
89
+ def test_hold_onto_measurements
90
+ measurements = 5.times.reduce(Array.new) do |array, i|
91
+ profile = run_profile
92
+ measurements = profile.threads.map(&:methods).flatten.map(&:measurement)
93
+ array.concat(measurements)
94
+ array
95
+ end
96
+
97
+ measurements.each do |measurement|
98
+ error = assert_raises(RuntimeError) do
99
+ measurement.total_time
100
+ end
101
+ assert_match(/has already been freed/, error.message)
102
+ end
103
+ assert(true)
104
+ end
105
+ end
@@ -0,0 +1,175 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ require File.expand_path('../test_helper', __FILE__)
5
+
6
+ class InverseCallTreeTest < TestCase
7
+ INVERSE_DEPTH = 5
8
+
9
+ def setup
10
+ # Need to use wall time for this test due to the sleep calls
11
+ RubyProf::measure_mode = RubyProf::WALL_TIME
12
+ end
13
+
14
+ INVERSE_DEPTH.times do |i|
15
+ if i == 0
16
+ define_method("method_#{i}") do
17
+ sleep_amount = (i + 1) * 0.05
18
+ RubyProf.start
19
+ sleep(sleep_amount)
20
+ end
21
+ else
22
+ define_method("method_#{i}") do
23
+ method_name = "method_#{i-1}"
24
+ sleep_amount = (i + 1) * 0.05
25
+ self.send(method_name.to_sym)
26
+ sleep(sleep_amount)
27
+ end
28
+ end
29
+ end
30
+
31
+ def test_inverse
32
+ method_name = "method_#{INVERSE_DEPTH - 1}"
33
+ self.send(method_name.to_sym)
34
+ result = profile = RubyProf.stop
35
+
36
+ assert_equal(1, profile.threads.count)
37
+
38
+ thread = profile.threads.first
39
+ assert_in_delta(0.79, thread.total_time, 0.05)
40
+
41
+ assert_equal(7, thread.methods.length)
42
+ methods = thread.methods.sort.reverse
43
+
44
+ # InverseCallTreeTest#test_inverse
45
+ method = methods[0]
46
+ assert_equal('InverseCallTreeTest#test_inverse', method.full_name)
47
+ assert_equal(34, method.line)
48
+
49
+ assert_equal(0, method.call_trees.callers.count)
50
+
51
+ assert_equal(1, method.call_trees.callees.count)
52
+ call_tree = method.call_trees.callees[0]
53
+ assert_equal('InverseCallTreeTest#method_4', call_tree.target.full_name)
54
+ assert_equal(26, call_tree.line)
55
+
56
+ # InverseCallTreeTest#method_4
57
+ method = methods[1]
58
+ assert_equal('InverseCallTreeTest#method_4', method.full_name)
59
+ assert_equal(26, method.line)
60
+
61
+ assert_equal(1, method.call_trees.callers.count)
62
+ call_tree = method.call_trees.callers[0]
63
+ assert_equal('InverseCallTreeTest#test_inverse', call_tree.parent.target.full_name)
64
+ assert_equal(26, call_tree.line)
65
+
66
+ assert_equal(2, method.call_trees.callees.count)
67
+ call_tree = method.call_trees.callees[0]
68
+ assert_equal('InverseCallTreeTest#method_3', call_tree.target.full_name)
69
+ assert_equal(26, call_tree.line)
70
+
71
+ # Kernel#sleep
72
+ method = methods[2]
73
+ assert_equal('Kernel#sleep', method.full_name)
74
+ assert_equal(0, method.line)
75
+
76
+ assert_equal(5, method.call_trees.callers.count)
77
+ call_tree = method.call_trees.callers[0]
78
+ assert_equal('InverseCallTreeTest#method_0', call_tree.parent.target.full_name)
79
+ assert_equal(19, call_tree.line)
80
+
81
+ call_tree = method.call_trees.callers[1]
82
+ assert_equal('InverseCallTreeTest#method_1', call_tree.parent.target.full_name)
83
+ assert_equal(26, call_tree.line)
84
+
85
+ call_tree = method.call_trees.callers[2]
86
+ assert_equal('InverseCallTreeTest#method_2', call_tree.parent.target.full_name)
87
+ assert_equal(26, call_tree.line)
88
+ call_tree = method.call_trees.callers[3]
89
+
90
+ assert_equal('InverseCallTreeTest#method_3', call_tree.parent.target.full_name)
91
+ assert_equal(26, call_tree.line)
92
+
93
+ call_tree = method.call_trees.callers[4]
94
+ assert_equal('InverseCallTreeTest#method_4', call_tree.parent.target.full_name)
95
+ assert_equal(26, call_tree.line)
96
+
97
+ assert_equal(0, method.call_trees.callees.count)
98
+
99
+ # InverseCallTreeTest#method_3
100
+ method = methods[3]
101
+ assert_equal('InverseCallTreeTest#method_3', method.full_name)
102
+ assert_equal(26, method.line)
103
+
104
+ assert_equal(1, method.call_trees.callers.count)
105
+ call_tree = method.call_trees.callers[0]
106
+ assert_equal('InverseCallTreeTest#method_4', call_tree.parent.target.full_name)
107
+ assert_equal(26, call_tree.line)
108
+
109
+ assert_equal(2, method.call_trees.callees.count)
110
+ call_tree = method.call_trees.callees[0]
111
+ assert_equal('InverseCallTreeTest#method_2', call_tree.target.full_name)
112
+ assert_equal(26, call_tree.line)
113
+
114
+ call_tree = method.call_trees.callees[1]
115
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
116
+ assert_equal(26, call_tree.line)
117
+
118
+ # InverseCallTreeTest#method_2
119
+ method = methods[4]
120
+ assert_equal('InverseCallTreeTest#method_2', method.full_name)
121
+ assert_equal(26, method.line)
122
+
123
+ assert_equal(1, method.call_trees.callers.count)
124
+ call_tree = method.call_trees.callers[0]
125
+ assert_equal('InverseCallTreeTest#method_3', call_tree.parent.target.full_name)
126
+ assert_equal(26, call_tree.line)
127
+
128
+ assert_equal(2, method.call_trees.callees.count)
129
+ call_tree = method.call_trees.callees[0]
130
+ assert_equal('InverseCallTreeTest#method_1', call_tree.target.full_name)
131
+ assert_equal(26, call_tree.line)
132
+
133
+ call_tree = method.call_trees.callees[1]
134
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
135
+ assert_equal(26, call_tree.line)
136
+
137
+ call_tree = method.call_trees.callees[1]
138
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
139
+ assert_equal(26, call_tree.line)
140
+
141
+ # InverseCallTreeTest#method_1
142
+ method = methods[5]
143
+ assert_equal('InverseCallTreeTest#method_1', method.full_name)
144
+ assert_equal(26, method.line)
145
+
146
+ assert_equal(1, method.call_trees.callers.count)
147
+ call_tree = method.call_trees.callers[0]
148
+ assert_equal('InverseCallTreeTest#method_2', call_tree.parent.target.full_name)
149
+ assert_equal(26, call_tree.line)
150
+
151
+ assert_equal(2, method.call_trees.callees.count)
152
+ call_tree = method.call_trees.callees[0]
153
+ assert_equal('InverseCallTreeTest#method_0', call_tree.target.full_name)
154
+ assert_equal(19, call_tree.line)
155
+
156
+ call_tree = method.call_trees.callees[1]
157
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
158
+ assert_equal(26, call_tree.line)
159
+
160
+ # InverseCallTreeTest#method_0
161
+ method = methods[6]
162
+ assert_equal('InverseCallTreeTest#method_0', method.full_name)
163
+ assert_equal(19, method.line)
164
+
165
+ assert_equal(1, method.call_trees.callers.count)
166
+ call_tree = method.call_trees.callers[0]
167
+ assert_equal('InverseCallTreeTest#method_1', call_tree.parent.target.full_name)
168
+ assert_equal(19, call_tree.line)
169
+
170
+ assert_equal(1, method.call_trees.callees.count)
171
+ call_tree = method.call_trees.callees[0]
172
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
173
+ assert_equal(19, call_tree.line)
174
+ end
175
+ end
@@ -4,15 +4,27 @@
4
4
  require File.expand_path('../test_helper', __FILE__)
5
5
 
6
6
  class LineNumbers
7
- def method1
7
+ def method_1
8
+ method_2
9
+ filler = 1
10
+ method_3
8
11
  end
9
12
 
10
- def method2
11
- method1
13
+ def method_2
14
+ filler = 1
15
+ 2.times do |i|
16
+ filler = 2
17
+ method_3
18
+ end
19
+ end
20
+
21
+ def method_3
22
+ sleep(0.3)
23
+ method_4
12
24
  end
13
25
 
14
- def method3
15
- sleep(1)
26
+ def method_4
27
+ sleep(1.2)
16
28
  end
17
29
  end
18
30
 
@@ -22,59 +34,125 @@ class LineNumbersTest < TestCase
22
34
  numbers = LineNumbers.new
23
35
 
24
36
  result = RubyProf.profile do
25
- numbers.method2
37
+ numbers.method_1
26
38
  end
27
39
 
28
40
  methods = result.threads.first.methods.sort.reverse
29
- assert_equal(3, methods.length)
41
+ assert_equal(7, methods.length)
30
42
 
43
+ # Method 0
31
44
  method = methods[0]
32
45
  assert_equal('LineNumbersTest#test_function_line_no', method.full_name)
33
- assert_equal(25, method.line)
46
+ assert_equal(37, method.line)
34
47
 
48
+ assert_equal(0, method.call_trees.callers.count)
49
+
50
+ assert_equal(1, method.call_trees.callees.count)
51
+ call_tree = method.call_trees.callees[0]
52
+ assert_equal('LineNumbers#method_1', call_tree.target.full_name)
53
+ assert_equal(37, call_tree.line)
54
+
55
+ # Method 1
35
56
  method = methods[1]
36
- assert_equal('LineNumbers#method2', method.full_name)
37
- if RUBY_VERSION < "2.5"
38
- assert_equal(10, method.line)
39
- else
40
- assert_equal(11, method.line)
41
- end
57
+ assert_equal('LineNumbers#method_1', method.full_name)
58
+ assert_equal(7, method.line)
59
+
60
+ assert_equal(1, method.call_trees.callers.count)
61
+ call_tree = method.call_trees.callers[0]
62
+ assert_equal('LineNumbersTest#test_function_line_no', call_tree.parent.target.full_name)
63
+ assert_equal(37, call_tree.line)
64
+
65
+ assert_equal(2, method.call_trees.callees.count)
66
+ call_tree = method.call_trees.callees[0]
67
+ assert_equal('LineNumbers#method_2', call_tree.target.full_name)
68
+ assert_equal(8, call_tree.line)
42
69
 
70
+ call_tree = method.call_trees.callees[1]
71
+ assert_equal('LineNumbers#method_3', call_tree.target.full_name)
72
+ assert_equal(10, call_tree.line)
73
+
74
+ # Method 2
43
75
  method = methods[2]
44
- assert_equal('LineNumbers#method1', method.full_name)
45
- assert_equal(7, method.line)
46
- end
76
+ assert_equal('LineNumbers#method_3', method.full_name)
77
+ assert_equal(21, method.line)
47
78
 
48
- def test_c_function
49
- numbers = LineNumbers.new
79
+ assert_equal(2, method.call_trees.callers.count)
80
+ call_tree = method.call_trees.callers[0]
81
+ assert_equal('Integer#times', call_tree.parent.target.full_name)
82
+ assert_equal(17, call_tree.line)
50
83
 
51
- result = RubyProf.profile do
52
- numbers.method3
53
- end
84
+ call_tree = method.call_trees.callers[1]
85
+ assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name)
86
+ assert_equal(10, call_tree.line)
54
87
 
55
- methods = result.threads.first.methods.sort_by {|method| method.full_name}
56
- assert_equal(3, methods.length)
88
+ assert_equal(2, method.call_trees.callees.count)
89
+ call_tree = method.call_trees.callees[0]
90
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
91
+ assert_equal(22, call_tree.line)
57
92
 
58
- # Methods:
59
- # LineNumbers#method3
60
- # LineNumbersTest#test_c_function
61
- # Kernel#sleep
93
+ call_tree = method.call_trees.callees[1]
94
+ assert_equal('LineNumbers#method_4', call_tree.target.full_name)
95
+ assert_equal(23, call_tree.line)
62
96
 
63
- method = methods[0]
97
+ # Method 3
98
+ method = methods[3]
64
99
  assert_equal('Kernel#sleep', method.full_name)
65
100
  assert_equal(0, method.line)
66
101
 
67
- method = methods[1]
68
- assert_equal('LineNumbers#method3', method.full_name)
69
- if RUBY_VERSION < "2.5"
70
- assert_equal(14, method.line)
71
- else
72
- assert_equal(15, method.line)
73
- end
102
+ assert_equal(2, method.call_trees.callers.count)
103
+ call_tree = method.call_trees.callers[0]
104
+ assert_equal('LineNumbers#method_3', call_tree.parent.target.full_name)
105
+ assert_equal(22, call_tree.line)
106
+
107
+ call_tree = method.call_trees.callers[1]
108
+ assert_equal('LineNumbers#method_4', call_tree.parent.target.full_name)
109
+ assert_equal(27, call_tree.line)
110
+
111
+ assert_equal(0, method.call_trees.callees.count)
112
+
113
+ # Method 4
114
+ method = methods[4]
115
+ assert_equal('LineNumbers#method_4', method.full_name)
116
+ assert_equal(26, method.line)
117
+
118
+ assert_equal(1, method.call_trees.callers.count)
119
+ call_tree = method.call_trees.callers[0]
120
+ assert_equal('LineNumbers#method_3', call_tree.parent.target.full_name)
121
+ assert_equal(23, call_tree.line)
122
+
123
+ assert_equal(1, method.call_trees.callees.count)
124
+ call_tree = method.call_trees.callees[0]
125
+ assert_equal('Kernel#sleep', call_tree.target.full_name)
126
+ assert_equal(27, call_tree.line)
127
+
128
+ # Method 5
129
+ method = methods[5]
130
+ assert_equal('LineNumbers#method_2', method.full_name)
131
+ assert_equal(13, method.line)
132
+
133
+ assert_equal(1, method.call_trees.callers.count)
134
+ call_tree = method.call_trees.callers[0]
135
+ assert_equal('LineNumbers#method_1', call_tree.parent.target.full_name)
136
+ assert_equal(8, call_tree.line)
137
+
138
+ assert_equal(1, method.call_trees.callees.count)
139
+ call_tree = method.call_trees.callees[0]
140
+ assert_equal('Integer#times', call_tree.target.full_name)
141
+ assert_equal(15, call_tree.line)
142
+
143
+ # Method 6
144
+ method = methods[6]
145
+ assert_equal('Integer#times', method.full_name)
146
+ assert_equal(0, method.line)
74
147
 
75
- method = methods[2]
76
- assert_equal('LineNumbersTest#test_c_function', method.full_name)
77
- assert_equal(52, method.line)
78
- end
148
+ assert_equal(1, method.call_trees.callers.count)
149
+ call_tree = method.call_trees.callers[0]
150
+ assert_equal('LineNumbers#method_2', call_tree.parent.target.full_name)
151
+ assert_equal(15, call_tree.line)
79
152
 
153
+ assert_equal(1, method.call_trees.callees.count)
154
+ call_tree = method.call_trees.callees[0]
155
+ assert_equal('LineNumbers#method_3', call_tree.target.full_name)
156
+ assert_equal(17, call_tree.line)
157
+ end
80
158
  end