mergulhao-rcov 0.8.1.3.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.
@@ -0,0 +1,7 @@
1
+ a = 1
2
+ if a == 2
3
+ b = 1
4
+ else
5
+ b = 2
6
+ end
7
+ 10.times{ b += 1 }
@@ -0,0 +1,5 @@
1
+ module Rcov; module Test; module Temporary; module Sample02
2
+ def self.foo(a,b)
3
+ a + b
4
+ end
5
+ end end end end
@@ -0,0 +1,20 @@
1
+
2
+ module Rcov; module Test; module Temporary; class Sample03
3
+ def f1 # MUST NOT CHANGE the position or the tests will break
4
+ 10.times { f2 }
5
+ end
6
+
7
+ def f2; 1 end
8
+
9
+ def f3
10
+ 10.times{ f1 }
11
+ 100.times{ f2 }
12
+ end
13
+
14
+ def self.g1
15
+ 10.times{ g2 }
16
+ end
17
+
18
+ def self.g2; 1 end
19
+ # safe from here ...
20
+ end end end end
@@ -0,0 +1,10 @@
1
+ $: << File.dirname(__FILE__)
2
+ require 'sample_03'
3
+
4
+ klass = Rcov::Test::Temporary::Sample03
5
+ obj = klass.new
6
+ obj.f1
7
+ obj.f2
8
+ obj.f3
9
+ #klass.g1 uncovered
10
+ klass.g2
@@ -0,0 +1,17 @@
1
+ def d(x)
2
+ 4*x
3
+ end
4
+
5
+ def a
6
+ b 10
7
+ end
8
+
9
+ def b(x)
10
+ x*10
11
+ end
12
+
13
+ def c(x)
14
+ 3*x
15
+ end
16
+
17
+ a()
@@ -0,0 +1,13 @@
1
+ def a
2
+ b 10
3
+ end
4
+
5
+ def b(x)
6
+ x*10
7
+ end
8
+
9
+ def c(x)
10
+ 3*x
11
+ end
12
+
13
+ a()
@@ -0,0 +1,17 @@
1
+ def d(x)
2
+ 4*x
3
+ end
4
+
5
+ def a
6
+ b 10
7
+ end
8
+
9
+ def b(x)
10
+ x*10
11
+ end
12
+
13
+ def c(x)
14
+ 3*x
15
+ end
16
+
17
+ a()
@@ -0,0 +1,192 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class TestCallSiteAnalyzer < Test::Unit::TestCase
4
+
5
+ sample_file = File.join(File.dirname(__FILE__), "assets/sample_03.rb")
6
+ load sample_file
7
+
8
+ def setup
9
+ @a = Rcov::CallSiteAnalyzer.new
10
+ @o = Rcov::Test::Temporary::Sample03.new
11
+ end
12
+
13
+ def verify_callsites_equal(expected, actual)
14
+ callsites = expected.inject({}) do |s,(backtrace, count)|
15
+ unless $".any?{|x| %r{\brcovrt\b} =~ x}
16
+ backtrace = backtrace.map{|_, mid, file, line| [nil, mid, file, line] }
17
+ end
18
+ s[Rcov::CallSiteAnalyzer::CallSite.new(backtrace)] = count
19
+ s
20
+ end
21
+ assert_equal(callsites, actual)
22
+ end
23
+
24
+ def verify_defsite_equal(expected, actual)
25
+ assert_equal(Rcov::CallSiteAnalyzer::DefSite.new(*expected), actual)
26
+ end
27
+
28
+ def test_callsite_compute_raw_difference
29
+ src = [
30
+ { ["Foo", "foo"] => {"bar" => 1},
31
+ ["Foo", "bar"] => {"baz" => 10} },
32
+ { ["Foo", "foo"] => ["foo.rb", 10] }
33
+ ]
34
+ dst = [
35
+ { ["Foo", "foo"] => {"bar" => 1, "fubar" => 10},
36
+ ["Foo", "baz"] => {"baz" => 10} },
37
+ { ["Foo", "foo"] => ["fooredef.rb", 10],
38
+ ["Foo", "baz"] => ["foo.rb", 20]}
39
+ ]
40
+ expected = [
41
+ { ["Foo", "foo"] => {"fubar" => 10},
42
+ ["Foo", "baz"] => {"baz" => 10} },
43
+ { ["Foo", "foo"] => ["fooredef.rb", 10],
44
+ ["Foo", "baz"] => ["foo.rb", 20] }
45
+ ]
46
+
47
+ assert_equal(expected,
48
+ @a.instance_eval{ compute_raw_data_difference(src, dst) } )
49
+ end
50
+
51
+ def test_return_values_when_no_match
52
+ @a.run_hooked{ @o.f1 }
53
+ assert_equal(nil, @a.defsite("Foobar#bogus"))
54
+ assert_equal(nil, @a.defsite("Foobar", "bogus"))
55
+ assert_equal(nil, @a.callsites("Foobar", "bogus"))
56
+ assert_equal(nil, @a.callsites("Foobar.bogus"))
57
+ assert_equal(nil, @a.callsites("<Class:Foobar>", "bogus"))
58
+ end
59
+
60
+ def test_basic_defsite_recording
61
+ @a.run_hooked{ @o.f1 }
62
+ verify_defsite_equal(["./test/assets/sample_03.rb", 3],
63
+ @a.defsite("Rcov::Test::Temporary::Sample03", "f1"))
64
+ verify_defsite_equal(["./test/assets/sample_03.rb", 7],
65
+ @a.defsite("Rcov::Test::Temporary::Sample03", "f2"))
66
+ verify_defsite_equal(["./test/assets/sample_03.rb", 7],
67
+ @a.defsite("Rcov::Test::Temporary::Sample03#f2"))
68
+ end
69
+
70
+ def test_basic_callsite_recording
71
+ @a.run_hooked{ @o.f1 }
72
+ assert(@a.analyzed_classes.include?("Rcov::Test::Temporary::Sample03"))
73
+ assert_equal(%w[f1 f2], @a.analyzed_methods("Rcov::Test::Temporary::Sample03"))
74
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1, "./test/assets/sample_03.rb", 4]] => 10},
75
+ @a.callsites("Rcov::Test::Temporary::Sample03", "f2"))
76
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1, "./test/assets/sample_03.rb", 4]] => 10},
77
+ @a.callsites("Rcov::Test::Temporary::Sample03#f2"))
78
+ #verify_callsites_equal({["./test/sample_03.rb:4:in `f1'"] => 10},
79
+ # @a.callsites("Rcov::Test::Temporary::Sample03", "f2"))
80
+ #verify_callsites_equal({["./test/sample_03.rb:4:in `f1'"] => 10},
81
+ # @a.callsites("Rcov::Test::Temporary::Sample03#f2"))
82
+ end
83
+
84
+ def test_basic_callsite_recording_API
85
+ @a.run_hooked{ @o.f1 }
86
+ assert(@a.analyzed_classes.include?("Rcov::Test::Temporary::Sample03"))
87
+ assert_equal(%w[f1 f2], @a.analyzed_methods("Rcov::Test::Temporary::Sample03"))
88
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1,
89
+ "./test/assets/sample_03.rb", 4]] => 10},
90
+ @a.callsites("Rcov::Test::Temporary::Sample03", "f2"))
91
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1, "./test/assets/sample_03.rb", 4]] => 10},
92
+ @a.callsites("Rcov::Test::Temporary::Sample03", "f2"))
93
+ callsites = @a.callsites("Rcov::Test::Temporary::Sample03", "f2")
94
+ callsite = callsites.keys[0]
95
+ assert_equal("./test/assets/sample_03.rb", callsite.file)
96
+ assert_equal(4, callsite.line)
97
+ assert_equal(:f1, callsite.calling_method)
98
+ end
99
+
100
+
101
+ def test_basic_callsite_recording_with_singleton_classes
102
+ @a.run_hooked{ @o.class.g1 }
103
+ assert(@a.analyzed_classes.include?("#<Class:Rcov::Test::Temporary::Sample03>"))
104
+ assert_equal(%w[g1 g2], @a.analyzed_methods("#<Class:Rcov::Test::Temporary::Sample03>"))
105
+ verify_callsites_equal({[[class << Rcov::Test::Temporary::Sample03; self end,
106
+ :g1, "./test/assets/sample_03.rb", 15]] => 10},
107
+ @a.callsites("Rcov::Test::Temporary::Sample03.g2"))
108
+ verify_callsites_equal({[[class << Rcov::Test::Temporary::Sample03; self end,
109
+ :g1, "./test/assets/sample_03.rb", 15]] => 10},
110
+ @a.callsites("#<Class:Rcov::Test::Temporary::Sample03>","g2"))
111
+ end
112
+
113
+
114
+ def test_differential_callsite_recording
115
+ @a.run_hooked{ @o.f1 }
116
+ assert(@a.analyzed_classes.include?("Rcov::Test::Temporary::Sample03"))
117
+ assert_equal(%w[f1 f2], @a.analyzed_methods("Rcov::Test::Temporary::Sample03"))
118
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1,
119
+ "./test/assets/sample_03.rb", 4]] => 10},
120
+ @a.callsites("Rcov::Test::Temporary::Sample03", "f2"))
121
+
122
+ @a.run_hooked{ @o.f1 }
123
+ assert(@a.analyzed_classes.include?("Rcov::Test::Temporary::Sample03"))
124
+ assert_equal(%w[f1 f2], @a.analyzed_methods("Rcov::Test::Temporary::Sample03"))
125
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1,
126
+ "./test/assets/sample_03.rb", 4]] => 20},
127
+ @a.callsites("Rcov::Test::Temporary::Sample03", "f2"))
128
+
129
+ @a.run_hooked{ @o.f3 }
130
+ assert_equal(%w[f1 f2 f3], @a.analyzed_methods("Rcov::Test::Temporary::Sample03"))
131
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1,
132
+ "./test/assets/sample_03.rb", 4]] => 120,
133
+ [[Rcov::Test::Temporary::Sample03, :f3,
134
+ "./test/assets/sample_03.rb", 11]]=>100 },
135
+ @a.callsites("Rcov::Test::Temporary::Sample03", "f2"))
136
+ end
137
+
138
+ def test_reset
139
+ @a.run_hooked do
140
+ 10.times{ @o.f1 }
141
+ @a.reset
142
+ @o.f1
143
+ end
144
+ assert(@a.analyzed_classes.include?("Rcov::Test::Temporary::Sample03"))
145
+ assert_equal(%w[f1 f2], @a.analyzed_methods("Rcov::Test::Temporary::Sample03"))
146
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1,
147
+ "./test/assets/sample_03.rb", 4]] => 10},
148
+ @a.callsites("Rcov::Test::Temporary::Sample03", "f2"))
149
+
150
+ end
151
+
152
+ def test_nested_callsite_recording
153
+ a = Rcov::CallSiteAnalyzer.new
154
+ b = Rcov::CallSiteAnalyzer.new
155
+ a.run_hooked do
156
+ b.run_hooked { @o.f1 }
157
+ assert(b.analyzed_classes.include?("Rcov::Test::Temporary::Sample03"))
158
+ assert_equal(%w[f1 f2], b.analyzed_methods("Rcov::Test::Temporary::Sample03"))
159
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1,
160
+ "./test/assets/sample_03.rb", 4]] => 10},
161
+ b.callsites("Rcov::Test::Temporary::Sample03", "f2"))
162
+
163
+ @o.f1
164
+ assert_equal(%w[f1 f2], b.analyzed_methods("Rcov::Test::Temporary::Sample03"))
165
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1,
166
+ "./test/assets/sample_03.rb", 4]] => 10},
167
+ b.callsites("Rcov::Test::Temporary::Sample03", "f2"))
168
+
169
+ assert(a.analyzed_classes.include?("Rcov::Test::Temporary::Sample03"))
170
+ assert_equal(%w[f1 f2], a.analyzed_methods("Rcov::Test::Temporary::Sample03"))
171
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1,
172
+ "./test/assets/sample_03.rb", 4]] => 20},
173
+ a.callsites("Rcov::Test::Temporary::Sample03", "f2"))
174
+ end
175
+ b.run_hooked{ @o.f3 }
176
+ assert_equal(%w[f1 f2 f3], b.analyzed_methods("Rcov::Test::Temporary::Sample03"))
177
+ verify_callsites_equal({[[Rcov::Test::Temporary::Sample03, :f1,
178
+ "./test/assets/sample_03.rb", 4]] => 110,
179
+ [[Rcov::Test::Temporary::Sample03, :f3,
180
+ "./test/assets/sample_03.rb", 11]]=>100 },
181
+ b.callsites("Rcov::Test::Temporary::Sample03", "f2"))
182
+ end
183
+
184
+ def test_expand_name
185
+ assert_equal(["Foo", "foo"], @a.instance_eval{ expand_name("Foo#foo") })
186
+ assert_equal(["Foo", "foo"], @a.instance_eval{ expand_name("Foo", "foo") })
187
+ assert_equal(["#<Class:Foo>", "foo"],
188
+ @a.instance_eval{ expand_name("Foo.foo") })
189
+ assert_equal(["#<Class:Foo>", "foo"],
190
+ @a.instance_eval{ expand_name("#<Class:Foo>", "foo") })
191
+ end
192
+ end
@@ -0,0 +1,181 @@
1
+ require File.dirname(__FILE__) + '/test_helper'
2
+
3
+ class TestCodeCoverageAnalyzer < Test::Unit::TestCase
4
+ LINES = <<-EOF.to_a
5
+ puts 1
6
+ if foo
7
+ bar
8
+ baz
9
+ end
10
+ 5.times do
11
+ foo
12
+ bar if baz
13
+ end
14
+ EOF
15
+
16
+ def setup
17
+ if defined? Rcov::Test::Temporary
18
+ Rcov::Test::Temporary.constants.each do |name|
19
+ Rcov::Test::Temporary.module_eval{ remove_const(name) }
20
+ end
21
+ end
22
+ end
23
+
24
+ def test_refine_coverage_info
25
+ analyzer = Rcov::CodeCoverageAnalyzer.new
26
+ cover = [1, 1, nil, nil, 0, 5, 5, 5, 0]
27
+ line_info, marked_info,
28
+ count_info = analyzer.instance_eval{ refine_coverage_info(LINES, cover) }
29
+ assert_equal(LINES, line_info)
30
+ assert_equal([true] * 2 + [false] * 3 + [true] * 3 + [false], marked_info)
31
+ assert_equal([1, 1, 0, 0, 0, 5, 5, 5, 0], count_info)
32
+ end
33
+
34
+ def test_analyzed_files_no_analysis
35
+ analyzer = Rcov::CodeCoverageAnalyzer.new
36
+ assert_equal([], analyzer.analyzed_files)
37
+ end
38
+
39
+ def test_raw_coverage_info
40
+ sample_file = File.join(File.dirname(__FILE__), "assets/sample_01.rb")
41
+ lines = File.readlines(sample_file)
42
+ analyzer = Rcov::CodeCoverageAnalyzer.new
43
+ analyzer.run_hooked{ load sample_file }
44
+
45
+ assert_equal(lines, SCRIPT_LINES__[sample_file][0, lines.size])
46
+ assert(analyzer.analyzed_files.include?(sample_file))
47
+ line_info, cov_info, count_info = analyzer.data(sample_file)
48
+ assert_equal(lines, line_info)
49
+ assert_equal([true, true, false, false, true, false, true], cov_info)
50
+ assert_equal([1, 2, 0, 0, 1, 0, 11], count_info)
51
+ analyzer.reset
52
+ assert_equal(nil, analyzer.data(sample_file))
53
+ assert_equal([], analyzer.analyzed_files)
54
+ end
55
+
56
+ def test_script_lines_workaround_detects_correctly
57
+ analyzer = Rcov::CodeCoverageAnalyzer.new
58
+ lines = ["puts a", "foo", "bar"] * 3
59
+ coverage = [true] * 3 + [false] * 6
60
+ counts = [1] * 3 + [0] * 6
61
+ nlines, ncoverage, ncounts = analyzer.instance_eval do
62
+ script_lines_workaround(lines, coverage, counts)
63
+ end
64
+
65
+ assert_equal(["puts a", "foo", "bar"], nlines)
66
+ assert_equal([true, true, true], ncoverage)
67
+ assert_equal([1, 1, 1], ncounts)
68
+ end
69
+
70
+ def test_script_lines_workaround_no_false_positives
71
+ analyzer = Rcov::CodeCoverageAnalyzer.new
72
+ lines = ["puts a", "foo", "bar"] * 2 + ["puts a", "foo", "baz"]
73
+ coverage = [true] * 9
74
+ counts = [1] * 9
75
+ nlines, ncoverage, ncounts = analyzer.instance_eval do
76
+ script_lines_workaround(lines, coverage, counts)
77
+ end
78
+ assert_equal(lines, nlines)
79
+ assert_equal(coverage, ncoverage)
80
+ assert_equal(counts, ncounts)
81
+ end
82
+
83
+ def test_differential_coverage_data
84
+ sample_file = File.join(File.dirname(__FILE__), "assets/sample_01.rb")
85
+ lines = File.readlines(sample_file)
86
+ analyzer = Rcov::CodeCoverageAnalyzer.new
87
+ analyzer.run_hooked{ load sample_file }
88
+ line_info, cov_info, count_info = analyzer.data(sample_file)
89
+ assert_equal([1, 2, 0, 0, 1, 0, 11], count_info)
90
+
91
+ analyzer.reset
92
+
93
+ sample_file = File.join(File.dirname(__FILE__), "assets/sample_02.rb")
94
+ analyzer.run_hooked{ load sample_file }
95
+ line_info, cov_info, count_info = analyzer.data(sample_file)
96
+ assert_equal([8, 1, 0, 0, 0], count_info)
97
+
98
+ analyzer.reset
99
+ assert_equal([], analyzer.analyzed_files)
100
+ analyzer.run_hooked{ Rcov::Test::Temporary::Sample02.foo(1, 1) }
101
+ line_info, cov_info, count_info = analyzer.data(sample_file)
102
+ assert_equal([0, 1, 1, 1, 0], count_info)
103
+ analyzer.run_hooked do
104
+ 10.times{ Rcov::Test::Temporary::Sample02.foo(1, 1) }
105
+ end
106
+ line_info, cov_info, count_info = analyzer.data(sample_file)
107
+ assert_equal([0, 11, 11, 11, 0], count_info)
108
+ 10.times{ analyzer.run_hooked{ Rcov::Test::Temporary::Sample02.foo(1, 1) } }
109
+ line_info, cov_info, count_info = analyzer.data(sample_file)
110
+ assert_equal([0, 21, 21, 21, 0], count_info)
111
+
112
+ count_info2 = nil
113
+ 10.times do |i|
114
+ analyzer.run_hooked do
115
+ Rcov::Test::Temporary::Sample02.foo(1, 1)
116
+ line_info, cov_info, count_info = analyzer.data(sample_file) if i == 3
117
+ line_info2, cov_info2, count_info2 = analyzer.data(sample_file)
118
+ end
119
+ end
120
+ assert_equal([0, 25, 25, 25, 0], count_info)
121
+ assert_equal([0, 31, 31, 31, 0], count_info2)
122
+ end
123
+
124
+ def test_nested_analyzer_blocks
125
+ a1 = Rcov::CodeCoverageAnalyzer.new
126
+ a2 = Rcov::CodeCoverageAnalyzer.new
127
+
128
+ sample_file = File.join(File.dirname(__FILE__), "assets/sample_02.rb")
129
+ load sample_file
130
+
131
+ a1.run_hooked do
132
+ 100.times{ Rcov::Test::Temporary::Sample02.foo(1, 1) }
133
+ a2.run_hooked do
134
+ 10.times{ Rcov::Test::Temporary::Sample02.foo(1, 1) }
135
+ end
136
+ 100.times{ Rcov::Test::Temporary::Sample02.foo(1, 1) }
137
+ end
138
+
139
+ a2.run_hooked do
140
+ 100.times{ Rcov::Test::Temporary::Sample02.foo(1, 1) }
141
+ 10.times{ a1.run_hooked { Rcov::Test::Temporary::Sample02.foo(1, 1) } }
142
+ end
143
+
144
+ a1.install_hook
145
+ Rcov::Test::Temporary::Sample02.foo(1, 1)
146
+ a1.remove_hook
147
+
148
+ a2.install_hook
149
+ Rcov::Test::Temporary::Sample02.foo(1, 1)
150
+ a2.remove_hook
151
+
152
+ _, _, counts1 = a1.data(sample_file)
153
+ _, _, counts2 = a2.data(sample_file)
154
+ assert_equal([0, 221, 221, 221, 0], counts1)
155
+ assert_equal([0, 121, 121, 121, 0], counts2)
156
+ end
157
+
158
+ def test_reset
159
+ a1 = Rcov::CodeCoverageAnalyzer.new
160
+
161
+ sample_file = File.join(File.dirname(__FILE__), "assets/sample_02.rb")
162
+ load sample_file
163
+
164
+ a1.run_hooked do
165
+ 100.times do |i|
166
+ Rcov::Test::Temporary::Sample02.foo(1, 1)
167
+ a1.reset if i == 49
168
+ end
169
+ end
170
+
171
+ assert_equal([0, 50, 50, 50, 0], a1.data(sample_file)[2])
172
+ end
173
+
174
+ def test_compute_raw_difference
175
+ first = {"a" => [1,1,1,1,1]}
176
+ last = {"a" => [2,1,5,2,1], "b" => [1,2,3,4,5]}
177
+ a = Rcov::CodeCoverageAnalyzer.new
178
+ assert_equal({"a" => [1,0,4,1,0], "b" => [1,2,3,4,5]},
179
+ a.instance_eval{ compute_raw_data_difference(first, last)} )
180
+ end
181
+ end