gcov2x 0.5.1 → 0.5.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/file.rb +25 -3
- data/lib/line.rb +27 -6
- data/lib/project.rb +51 -31
- data/lib/version.rb +1 -1
- data/spec/gcov2x/file_spec.rb +36 -2
- data/spec/gcov2x/line_spec.rb +44 -0
- data/spec/gcov2x/project_spec.rb +38 -6
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 740237ee0abec57ac7be4ed0fed51ef80f4f8f17
|
4
|
+
data.tar.gz: 047ebd3dbd900b8f3e15e0628c45ef68d0eadcc3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40f12f5c19bbfa268264084d33095a9b2212e0f6861bfdabeb0458c642a82d32be8a482d2e92cf0b8125dc1495b4e428251f96d4bcab09f9a19de94df2559aa6
|
7
|
+
data.tar.gz: bbd4542d5b4c06ab00269cb546838215147f60dac19b0b3e171fcac965242d2b05c3168cf72806df82208f797329600058d5e8ab043f4f46b1583923210e2a4b
|
data/lib/file.rb
CHANGED
@@ -22,12 +22,17 @@ module GCOV
|
|
22
22
|
def initialize name
|
23
23
|
fail "name required" unless name and name.is_a? String
|
24
24
|
@name = name
|
25
|
-
@lines =
|
25
|
+
@lines = {}
|
26
26
|
@meta = {}
|
27
27
|
@stats = {}
|
28
28
|
_update_stats
|
29
29
|
end
|
30
30
|
|
31
|
+
# return lines as array, in order by number
|
32
|
+
def lines
|
33
|
+
@lines.sort.map{|key,val|val}
|
34
|
+
end
|
35
|
+
|
31
36
|
def add_lines &block
|
32
37
|
fail "add_lines requires a block" unless block_given?
|
33
38
|
@adding = true
|
@@ -48,7 +53,7 @@ module GCOV
|
|
48
53
|
:hits_per_line => 0.0
|
49
54
|
}
|
50
55
|
|
51
|
-
@lines.each do |line|
|
56
|
+
@lines.each do |index,line|
|
52
57
|
@stats[:missed_lines] += (line.state == :missed).to_i
|
53
58
|
@stats[:exec_lines] += (line.state == :exec).to_i
|
54
59
|
@stats[:total_exec] += (line.count.is_a?(Integer) ? line.count : 0 )
|
@@ -76,7 +81,7 @@ module GCOV
|
|
76
81
|
key,val = /([^:]+):(.*)$/.match(line.text).to_a[1..2]
|
77
82
|
@meta[key] = val
|
78
83
|
else
|
79
|
-
@lines
|
84
|
+
@lines[line.number] = line
|
80
85
|
end
|
81
86
|
end
|
82
87
|
|
@@ -122,6 +127,23 @@ module GCOV
|
|
122
127
|
result
|
123
128
|
end
|
124
129
|
|
130
|
+
def merge! other
|
131
|
+
other.lines.each do |line|
|
132
|
+
if @lines.has_key? line.number
|
133
|
+
@lines[line.number].merge! line
|
134
|
+
else
|
135
|
+
@lines[line.number] = line
|
136
|
+
end
|
137
|
+
end
|
138
|
+
_update_stats
|
139
|
+
end
|
140
|
+
|
141
|
+
def merge other
|
142
|
+
result = self.dup
|
143
|
+
result.merge! other
|
144
|
+
result
|
145
|
+
end
|
146
|
+
|
125
147
|
end # class File
|
126
148
|
|
127
149
|
end
|
data/lib/line.rb
CHANGED
@@ -3,17 +3,20 @@ module GCOV
|
|
3
3
|
|
4
4
|
class Line
|
5
5
|
|
6
|
-
attr_reader :number, :count, :text
|
6
|
+
attr_reader :number, :count, :text
|
7
7
|
|
8
8
|
def initialize number, count, text
|
9
9
|
@number = number
|
10
10
|
@count = count
|
11
11
|
@text = text
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
12
|
+
end
|
13
|
+
|
14
|
+
def state
|
15
|
+
case @count
|
16
|
+
when :missed then :missed
|
17
|
+
when :none then :none
|
18
|
+
else :exec
|
19
|
+
end
|
17
20
|
end
|
18
21
|
|
19
22
|
def self.parse line
|
@@ -29,6 +32,24 @@ module GCOV
|
|
29
32
|
GCOV::Line.new number,count,text
|
30
33
|
end
|
31
34
|
|
35
|
+
def merge! other
|
36
|
+
if other.count.is_a? Integer and @count.is_a? Integer
|
37
|
+
@count += other.count
|
38
|
+
elsif other.count.is_a? Integer
|
39
|
+
@count = other.count
|
40
|
+
elsif @count.is_a? Integer
|
41
|
+
nil
|
42
|
+
elsif other.count == :missed or @count == :missed
|
43
|
+
@count = :missed
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def merge other
|
48
|
+
result = self.dup
|
49
|
+
result.merge! other
|
50
|
+
result
|
51
|
+
end
|
52
|
+
|
32
53
|
end
|
33
54
|
|
34
55
|
end
|
data/lib/project.rb
CHANGED
@@ -10,15 +10,30 @@ module GCOV
|
|
10
10
|
|
11
11
|
def initialize name=""
|
12
12
|
@name = name
|
13
|
-
@files =
|
13
|
+
@files = {}
|
14
14
|
@adding = false
|
15
15
|
end
|
16
16
|
|
17
17
|
def <<(file)
|
18
|
-
@files
|
18
|
+
if @files.has_key?file.name
|
19
|
+
@files[file.name].merge! file
|
20
|
+
else
|
21
|
+
@files[file.name] = file
|
22
|
+
end
|
19
23
|
_update_stats unless @adding
|
20
24
|
end
|
21
25
|
|
26
|
+
def files
|
27
|
+
@files.sort{|a,b|
|
28
|
+
if ::File.basename(a[0]) < ::File.basename(b[0])
|
29
|
+
-1
|
30
|
+
elsif ::File.basename(a[0]) == ::File.basename(b[0])
|
31
|
+
0
|
32
|
+
else
|
33
|
+
1
|
34
|
+
end }.map{|key,val|val}
|
35
|
+
end
|
36
|
+
|
22
37
|
def add_files &block
|
23
38
|
# suspend stat updates until done adding files
|
24
39
|
fail "add_files requires a block" unless block_given?
|
@@ -45,7 +60,7 @@ module GCOV
|
|
45
60
|
:hits_per_line => 0
|
46
61
|
}
|
47
62
|
|
48
|
-
@files.each do |file|
|
63
|
+
@files.each do |name,file|
|
49
64
|
@stats[:missed_lines] += file.stats[:missed_lines]
|
50
65
|
@stats[:exec_lines] += file.stats[:exec_lines]
|
51
66
|
@stats[:total_exec] += file.stats[:total_exec]
|
@@ -68,39 +83,44 @@ module GCOV
|
|
68
83
|
|
69
84
|
end
|
70
85
|
|
71
|
-
def
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
86
|
+
def _add_file path, hash_={}
|
87
|
+
hash = hash_.dup
|
88
|
+
|
89
|
+
# legacy support
|
90
|
+
if !hash[:filter].nil? and ( hash[:filter].is_a? Regexp )
|
91
|
+
hash[:filter] = [ hash[:filter] ]
|
92
|
+
end
|
93
|
+
|
94
|
+
files = GCOV::File.load(path)
|
78
95
|
|
79
|
-
|
80
|
-
if
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
96
|
+
files.each do |file|
|
97
|
+
if hash[:filter].nil? or hash[:filter].empty? or hash[:filter].select{|f| f.match(::Pathname.new(file.meta['Source']).cleanpath.to_s) }.empty?
|
98
|
+
self << file
|
99
|
+
end # if
|
100
|
+
end #each file
|
101
|
+
end
|
102
|
+
|
103
|
+
def add_dir path, hash_={}
|
104
|
+
hash = hash_.dup
|
105
|
+
if hash[:recursive] == true
|
106
|
+
filenames = Dir["#{path}/**/*.gcov"]
|
107
|
+
else
|
108
|
+
filenames = Dir["#{path}/*.gcov"]
|
109
|
+
end
|
110
|
+
|
111
|
+
add_files do
|
112
|
+
filenames.each do |filename|
|
113
|
+
_add_file filename, hash
|
114
|
+
end # each filename
|
91
115
|
end # add_files
|
92
116
|
end # #add_dir
|
93
|
-
|
94
|
-
def add_file path,
|
117
|
+
|
118
|
+
def add_file path, hash_={}
|
119
|
+
hash = hash_.dup
|
95
120
|
add_files do
|
96
|
-
|
97
|
-
files.each do |file|
|
98
|
-
if hash[:filter].nil? or hash[:filter].empty? or hash[:filter].select{|f| f.match(::Pathname.new(file.meta['Source']).cleanpath.to_s) }.empty?
|
99
|
-
self << file
|
100
|
-
end # if
|
101
|
-
end # each file
|
121
|
+
_add_file path, hash
|
102
122
|
end # add_files
|
103
|
-
end # add_file
|
123
|
+
end # #add_file
|
104
124
|
|
105
125
|
def self.load_dir path, hash={}
|
106
126
|
project = GCOV::Project.new
|
data/lib/version.rb
CHANGED
data/spec/gcov2x/file_spec.rb
CHANGED
@@ -62,11 +62,11 @@ describe GCOV::File do
|
|
62
62
|
expect(file.lines.count).to eq(0)
|
63
63
|
end
|
64
64
|
|
65
|
-
it "
|
65
|
+
it "should return the lines it was given, sorted by number" do
|
66
66
|
file = GCOV::File.new "myfile.cpp"
|
67
67
|
file.add_lines do
|
68
|
-
file << GCOV::Line.new(1,4,"line 1")
|
69
68
|
file << GCOV::Line.new(2,23,"line 2")
|
69
|
+
file << GCOV::Line.new(1,4,"line 1")
|
70
70
|
end
|
71
71
|
expect(file.lines.count).to eq(2)
|
72
72
|
expect(file.lines[0].number).to eq(1)
|
@@ -103,4 +103,38 @@ describe GCOV::File do
|
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
106
|
+
describe "#merge" do
|
107
|
+
|
108
|
+
it "should merge the counts of each line and recompute stats" do
|
109
|
+
file = GCOV::File.new "myfile.cpp"
|
110
|
+
file.add_lines do
|
111
|
+
file << GCOV::Line.new(1,4,"line 1")
|
112
|
+
file << GCOV::Line.new(2,23,"line 2")
|
113
|
+
file << GCOV::Line.new(3,:none,"line 3")
|
114
|
+
file << GCOV::Line.new(4,:missed,"line 4")
|
115
|
+
file << GCOV::Line.new(5,:missed,"line 5")
|
116
|
+
end
|
117
|
+
|
118
|
+
file2 = GCOV::File.new "myfile.cpp"
|
119
|
+
file2.add_lines do
|
120
|
+
file2 << GCOV::Line.new(1,1,"line 1")
|
121
|
+
file2 << GCOV::Line.new(2,:missed,"line 2")
|
122
|
+
file2 << GCOV::Line.new(3,:none,"line 3")
|
123
|
+
file2 << GCOV::Line.new(4,4,"line 4")
|
124
|
+
file2 << GCOV::Line.new(5,:missed,"line 5")
|
125
|
+
end
|
126
|
+
|
127
|
+
file3 = file.merge file2
|
128
|
+
|
129
|
+
expect(file3.stats[:lines]).to eq(4)
|
130
|
+
expect(file3.stats[:total_lines]).to eq(5)
|
131
|
+
expect(file3.stats[:total_exec]).to eq(32)
|
132
|
+
expect(file3.stats[:empty_lines]).to eq(1)
|
133
|
+
expect(file3.stats[:exec_lines]).to eq(3)
|
134
|
+
expect(file3.stats[:missed_lines]).to eq(1)
|
135
|
+
expect(file3.stats[:coverage]).to eq(0.75)
|
136
|
+
expect(file3.stats[:hits_per_line]).to eq(32.0/4)
|
137
|
+
|
138
|
+
end # it
|
139
|
+
end # describe
|
106
140
|
end
|
data/spec/gcov2x/line_spec.rb
CHANGED
@@ -46,4 +46,48 @@ describe GCOV::Line do
|
|
46
46
|
|
47
47
|
end
|
48
48
|
|
49
|
+
describe "#state" do
|
50
|
+
it "should return :exec if it has positive count" do
|
51
|
+
line = GCOV::Line.new 3,5,"line x"
|
52
|
+
expect(line.state).to eq(:exec)
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should return :missed if it was missed" do
|
56
|
+
line = GCOV::Line.new 3,:missed,"line x"
|
57
|
+
expect(line.state).to eq(:missed)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should return :none if it is not relevant" do
|
61
|
+
line = GCOV::Line.new 3,:none,"line x"
|
62
|
+
expect(line.state).to eq(:none)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#merge" do
|
67
|
+
it "should add hit counts" do
|
68
|
+
line = GCOV::Line.new 3,4, "abcdef"
|
69
|
+
line2 = GCOV::Line.new 3,1, "abcdef"
|
70
|
+
line3 = line.merge line2
|
71
|
+
expect(line3.count).to eq(5)
|
72
|
+
|
73
|
+
line = GCOV::Line.new 3,:missed, "abcdef"
|
74
|
+
line2 = GCOV::Line.new 3,1, "abcdef"
|
75
|
+
line3 = line.merge line2
|
76
|
+
expect(line3.count).to eq(1)
|
77
|
+
|
78
|
+
line = GCOV::Line.new 3,1, "abcdef"
|
79
|
+
line2 = GCOV::Line.new 3,:missed, "abcdef"
|
80
|
+
line3 = line.merge line2
|
81
|
+
expect(line3.count).to eq(1)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should give missed (0) presedence over none" do
|
85
|
+
line = GCOV::Line.new 3,:missed, "abcdef"
|
86
|
+
line2 = GCOV::Line.new 3,:none, "abcdef"
|
87
|
+
line3 = line.merge line2
|
88
|
+
expect(line3.count).to eq(:missed)
|
89
|
+
end
|
90
|
+
|
91
|
+
end # describe #merge
|
92
|
+
|
49
93
|
end
|
data/spec/gcov2x/project_spec.rb
CHANGED
@@ -32,8 +32,8 @@ describe GCOV::Project do
|
|
32
32
|
project << GCOV::File.new("foobar.cpp")
|
33
33
|
project << GCOV::File.new("boofar.cpp")
|
34
34
|
expect(project.files.count).to eq(2)
|
35
|
-
expect(project.files
|
36
|
-
expect(project.files
|
35
|
+
expect(project.files.map(&:name)).to include(a_string_ending_with("foobar.cpp"))
|
36
|
+
expect(project.files.map(&:name)).to include(a_string_ending_with("boofar.cpp"))
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -55,7 +55,7 @@ describe GCOV::Project do
|
|
55
55
|
end
|
56
56
|
|
57
57
|
describe "#add_file" do
|
58
|
-
it "
|
58
|
+
it "should add the given file" do
|
59
59
|
project = GCOV::Project.new
|
60
60
|
project.add_file(File.join(File.dirname(__FILE__),"data","test2.cpp.gcov"))
|
61
61
|
expect(project.files.count).to eq(1)
|
@@ -70,7 +70,6 @@ describe GCOV::Project do
|
|
70
70
|
expect(project.files.map(&:name)).to include( "test1.cpp" )
|
71
71
|
end
|
72
72
|
|
73
|
-
|
74
73
|
it "should filter using given array of expressions" do
|
75
74
|
project = GCOV::Project.new
|
76
75
|
project.add_file(File.join(File.dirname(__FILE__),"data","test2.cpp.gcov"), :filter => [/test2\.cpp/,/test3\.cpp/])
|
@@ -92,7 +91,40 @@ describe GCOV::Project do
|
|
92
91
|
expect(project.files.map(&:name)).to include( a_string_ending_with("test.cpp") )
|
93
92
|
expect(project.files.map(&:name)).to include( a_string_ending_with("test1.cpp") )
|
94
93
|
end
|
95
|
-
|
94
|
+
|
95
|
+
it "should merge file stats for identical filenames" do
|
96
|
+
project = GCOV::Project.new
|
97
|
+
project.add_files do
|
98
|
+
file = GCOV::File.new "myfile.cpp"
|
99
|
+
file.add_lines do
|
100
|
+
file << GCOV::Line.new(0,:none,"Source:myfile.cpp")
|
101
|
+
file << GCOV::Line.new(1,4,"line 1")
|
102
|
+
file << GCOV::Line.new(2,23,"line 2")
|
103
|
+
file << GCOV::Line.new(3,:none,"line 3")
|
104
|
+
file << GCOV::Line.new(4,:missed,"line 4")
|
105
|
+
file << GCOV::Line.new(5,:none,"line 5")
|
106
|
+
end
|
107
|
+
|
108
|
+
project << file
|
109
|
+
|
110
|
+
file = GCOV::File.new "myfile.cpp"
|
111
|
+
file.add_lines do
|
112
|
+
file << GCOV::Line.new(0,:none,"Source:myfile.cpp")
|
113
|
+
file << GCOV::Line.new(1,:missed,"line 1")
|
114
|
+
file << GCOV::Line.new(2,40,"line 2")
|
115
|
+
file << GCOV::Line.new(3,:none,"line 3")
|
116
|
+
file << GCOV::Line.new(4,:none,"line 4")
|
117
|
+
end
|
118
|
+
|
119
|
+
project << file
|
120
|
+
|
121
|
+
end # add_files
|
122
|
+
|
123
|
+
expect(project.files.count).to eq(1)
|
124
|
+
|
125
|
+
end # it
|
126
|
+
|
127
|
+
end # describe
|
96
128
|
|
97
129
|
describe "#add_dir" do
|
98
130
|
it "adds all files in the given directory" do
|
@@ -162,7 +194,7 @@ describe GCOV::Project do
|
|
162
194
|
|
163
195
|
project << file
|
164
196
|
|
165
|
-
file = GCOV::File.new "
|
197
|
+
file = GCOV::File.new "myfile2.cpp"
|
166
198
|
file.add_lines do
|
167
199
|
file << GCOV::Line.new(1,:missed,"line 1")
|
168
200
|
file << GCOV::Line.new(2,40,"line 2")
|