simplecov 0.10.0 → 0.11.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 (75) hide show
  1. checksums.yaml +7 -7
  2. data/.rspec +3 -1
  3. data/.rubocop.yml +6 -5
  4. data/CHANGELOG.md +16 -2
  5. data/Gemfile +14 -14
  6. data/README.md +28 -12
  7. data/Rakefile +5 -8
  8. data/features/config_formatters.feature +1 -1
  9. data/features/config_tracked_files.feature +29 -0
  10. data/features/step_definitions/transformers.rb +1 -1
  11. data/features/support/env.rb +6 -3
  12. data/lib/simplecov.rb +19 -2
  13. data/lib/simplecov/configuration.rb +24 -4
  14. data/lib/simplecov/defaults.rb +28 -5
  15. data/lib/simplecov/file_list.rb +11 -0
  16. data/lib/simplecov/filter.rb +1 -1
  17. data/lib/simplecov/formatter/multi_formatter.rb +17 -13
  18. data/lib/simplecov/result.rb +1 -1
  19. data/lib/simplecov/source_file.rb +6 -3
  20. data/lib/simplecov/version.rb +1 -1
  21. data/spec/1_8_fallbacks_spec.rb +29 -0
  22. data/spec/command_guesser_spec.rb +46 -0
  23. data/spec/deleted_source_spec.rb +12 -0
  24. data/{test → spec}/faked_project/Gemfile +0 -0
  25. data/{test → spec}/faked_project/Rakefile +0 -0
  26. data/{test → spec}/faked_project/cucumber.yml +0 -0
  27. data/{test → spec}/faked_project/features/step_definitions/my_steps.rb +0 -0
  28. data/{test → spec}/faked_project/features/support/env.rb +0 -0
  29. data/{test → spec}/faked_project/features/test_stuff.feature +0 -0
  30. data/{test → spec}/faked_project/lib/faked_project.rb +1 -1
  31. data/{test → spec}/faked_project/lib/faked_project/framework_specific.rb +0 -0
  32. data/{test → spec}/faked_project/lib/faked_project/meta_magic.rb +0 -0
  33. data/{test → spec}/faked_project/lib/faked_project/some_class.rb +0 -0
  34. data/spec/faked_project/lib/faked_project/untested_class.rb +11 -0
  35. data/{test → spec}/faked_project/spec/faked_spec.rb +0 -0
  36. data/{test → spec}/faked_project/spec/forking_spec.rb +0 -0
  37. data/{test → spec}/faked_project/spec/meta_magic_spec.rb +0 -0
  38. data/{test → spec}/faked_project/spec/some_class_spec.rb +0 -0
  39. data/{test → spec}/faked_project/spec/spec_helper.rb +0 -0
  40. data/{test → spec}/faked_project/test/faked_test.rb +0 -0
  41. data/{test → spec}/faked_project/test/meta_magic_test.rb +0 -0
  42. data/{test → spec}/faked_project/test/some_class_test.rb +0 -0
  43. data/{test → spec}/faked_project/test/test_helper.rb +0 -0
  44. data/spec/file_list_spec.rb +48 -0
  45. data/spec/filters_spec.rb +96 -0
  46. data/{test → spec}/fixtures/app/controllers/sample_controller.rb +0 -0
  47. data/{test → spec}/fixtures/app/models/user.rb +0 -0
  48. data/{test → spec}/fixtures/deleted_source_sample.rb +0 -0
  49. data/{test → spec}/fixtures/frameworks/rspec_bad.rb +0 -0
  50. data/{test → spec}/fixtures/frameworks/rspec_good.rb +0 -0
  51. data/{test → spec}/fixtures/frameworks/testunit_bad.rb +0 -0
  52. data/{test → spec}/fixtures/frameworks/testunit_good.rb +0 -0
  53. data/{test → spec}/fixtures/iso-8859.rb +0 -0
  54. data/{test → spec}/fixtures/resultset1.rb +0 -0
  55. data/{test → spec}/fixtures/resultset2.rb +0 -0
  56. data/{test → spec}/fixtures/sample.rb +0 -0
  57. data/{test → spec}/fixtures/utf-8.rb +0 -0
  58. data/{test → spec}/helper.rb +3 -7
  59. data/spec/merge_helpers_spec.rb +108 -0
  60. data/spec/result_spec.rb +207 -0
  61. data/spec/return_codes_spec.rb +37 -0
  62. data/spec/source_file_line_spec.rb +153 -0
  63. data/spec/source_file_spec.rb +75 -0
  64. metadata +163 -149
  65. data/test/shoulda_macros.rb +0 -19
  66. data/test/test_1_8_fallbacks.rb +0 -31
  67. data/test/test_command_guesser.rb +0 -19
  68. data/test/test_deleted_source.rb +0 -14
  69. data/test/test_file_list.rb +0 -23
  70. data/test/test_filters.rb +0 -94
  71. data/test/test_merge_helpers.rb +0 -112
  72. data/test/test_result.rb +0 -175
  73. data/test/test_return_codes.rb +0 -41
  74. data/test/test_source_file.rb +0 -73
  75. data/test/test_source_file_line.rb +0 -106
@@ -0,0 +1,108 @@
1
+ require "helper"
2
+
3
+ describe "merge helpers" do
4
+ describe "with two faked coverage resultsets" do
5
+ before do
6
+ SimpleCov.use_merging true
7
+ @resultset1 = {
8
+ source_fixture("sample.rb") => [nil, 1, 1, 1, nil, nil, 1, 1, nil, nil],
9
+ source_fixture("app/models/user.rb") => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil],
10
+ source_fixture("app/controllers/sample_controller.rb") => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil],
11
+ source_fixture("resultset1.rb") => [1, 1, 1, 1],
12
+ }
13
+
14
+ @resultset2 = {
15
+ source_fixture("sample.rb") => [1, nil, 1, 1, nil, nil, 1, 1, nil, nil],
16
+ source_fixture("app/models/user.rb") => [nil, 1, 5, 1, nil, nil, 1, 0, nil, nil],
17
+ source_fixture("app/controllers/sample_controller.rb") => [nil, 3, 1, nil, nil, nil, 1, 0, nil, nil],
18
+ source_fixture("resultset2.rb") => [nil, 1, 1, nil],
19
+ }
20
+ end
21
+
22
+ context "a merge" do
23
+ subject do
24
+ @resultset1.merge_resultset(@resultset2)
25
+ end
26
+
27
+ it "has proper results for sample.rb" do
28
+ expect(subject[source_fixture("sample.rb")]).to eq([1, 1, 2, 2, nil, nil, 2, 2, nil, nil])
29
+ end
30
+
31
+ it "has proper results for user.rb" do
32
+ expect(subject[source_fixture("app/models/user.rb")]).to eq([nil, 2, 6, 2, nil, nil, 2, 0, nil, nil])
33
+ end
34
+
35
+ it "has proper results for sample_controller.rb" do
36
+ expect(subject[source_fixture("app/controllers/sample_controller.rb")]).to eq([nil, 4, 2, 1, nil, nil, 2, 0, nil, nil])
37
+ end
38
+
39
+ it "has proper results for resultset1.rb" do
40
+ expect(subject[source_fixture("resultset1.rb")]).to eq([1, 1, 1, 1])
41
+ end
42
+
43
+ it "has proper results for resultset2.rb" do
44
+ expect(subject[source_fixture("resultset2.rb")]).to eq([nil, 1, 1, nil])
45
+ end
46
+ end
47
+
48
+ # See Github issue #6
49
+ it "returns an empty hash when the resultset cache file is empty" do
50
+ File.open(SimpleCov::ResultMerger.resultset_path, "w+") { |f| f.puts "" }
51
+ expect(SimpleCov::ResultMerger.resultset).to be_empty
52
+ end
53
+
54
+ # See Github issue #6
55
+ it "returns an empty hash when the resultset cache file is not present" do
56
+ system "rm #{SimpleCov::ResultMerger.resultset_path}" if File.exist?(SimpleCov::ResultMerger.resultset_path)
57
+ expect(SimpleCov::ResultMerger.resultset).to be_empty
58
+ end
59
+
60
+ context "and results generated from those" do
61
+ before do
62
+ system "rm #{SimpleCov::ResultMerger.resultset_path}" if File.exist?(SimpleCov::ResultMerger.resultset_path)
63
+ @result1 = SimpleCov::Result.new(@resultset1)
64
+ @result1.command_name = "result1"
65
+ @result2 = SimpleCov::Result.new(@resultset2)
66
+ @result2.command_name = "result2"
67
+ end
68
+
69
+ context "with stored results" do
70
+ before do
71
+ SimpleCov::ResultMerger.store_result(@result1)
72
+ SimpleCov::ResultMerger.store_result(@result2)
73
+ end
74
+
75
+ it "has stored data in resultset_path JSON file" do
76
+ expect(File.readlines(SimpleCov::ResultMerger.resultset_path).length).to be > 50
77
+ end
78
+
79
+ it "returns a hash containing keys ['result1' and 'result2'] for resultset" do
80
+ expect(SimpleCov::ResultMerger.resultset.keys.sort).to eq %w(result1 result2)
81
+ end
82
+
83
+ it "returns proper values for merged_result" do
84
+ expect(SimpleCov::ResultMerger.merged_result.source_files.find { |s| s.filename =~ /user/ }.lines.map(&:coverage)).to eq([nil, 2, 6, 2, nil, nil, 2, 0, nil, nil])
85
+ end
86
+
87
+ context "with second result way above the merge_timeout" do
88
+ before do
89
+ @result2.created_at = Time.now - 172_800 # two days ago
90
+ SimpleCov::ResultMerger.store_result(@result2)
91
+ end
92
+
93
+ it "has only one result in SimpleCov::ResultMerger.results" do
94
+ expect(SimpleCov::ResultMerger.results.length).to eq(1)
95
+ end
96
+ end
97
+
98
+ context "with merging disabled" do
99
+ before { SimpleCov.use_merging false }
100
+
101
+ it "returns nil for SimpleCov.result" do
102
+ expect(SimpleCov.result).to be_nil
103
+ end
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end if SimpleCov.usable?
@@ -0,0 +1,207 @@
1
+ require "helper"
2
+
3
+ describe "result" do
4
+ context "with a (mocked) Coverage.result" do
5
+ before do
6
+ @prev_filters = SimpleCov.filters
7
+ SimpleCov.filters = []
8
+ @prev_groups = SimpleCov.groups
9
+ SimpleCov.groups = {}
10
+ @prev_formatter = SimpleCov.formatter
11
+ SimpleCov.formatter = nil
12
+ end
13
+
14
+ after do
15
+ SimpleCov.filters = @prev_filters
16
+ SimpleCov.groups = @prev_groups
17
+ SimpleCov.formatter = @prev_formatter
18
+ end
19
+
20
+ let(:original_result) do
21
+ {
22
+ source_fixture("sample.rb") => [nil, 1, 1, 1, nil, nil, 1, 1, nil, nil],
23
+ source_fixture("app/models/user.rb") => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil],
24
+ source_fixture("app/controllers/sample_controller.rb") => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil],
25
+ }
26
+ end
27
+
28
+ context "a simple cov result initialized from that" do
29
+ subject { SimpleCov::Result.new(original_result) }
30
+
31
+ it "has 3 filenames" do
32
+ expect(subject.filenames.count).to eq(3)
33
+ end
34
+
35
+ it "has 3 source files" do
36
+ expect(subject.source_files.count).to eq(3)
37
+ subject.source_files.each do |source_file|
38
+ expect(source_file).to be_a SimpleCov::SourceFile
39
+ end
40
+ end
41
+
42
+ it "returns an instance of SimpleCov::FileList for source_files and files" do
43
+ expect(subject.files).to be_a SimpleCov::FileList
44
+ expect(subject.source_files).to be_a SimpleCov::FileList
45
+ end
46
+
47
+ it "has files equal to source_files" do
48
+ expect(subject.files).to eq(subject.source_files)
49
+ end
50
+
51
+ it "has accurate covered percent" do
52
+ # in our fixture, there are 13 covered line (result in 1) in all 15 relevant line (result in non-nil)
53
+ expect(subject.covered_percent).to eq(86.66666666666667)
54
+ end
55
+
56
+ it "has accurate covered percentages" do
57
+ expect(subject.covered_percentages).to eq([80.0, 80.0, 100.0])
58
+ end
59
+
60
+ it "has accurate least covered file" do
61
+ expect(subject.least_covered_file).to match(/sample_controller.rb/)
62
+ end
63
+
64
+ [:covered_percent, :covered_percentages, :least_covered_file, :covered_strength, :covered_lines, :missed_lines, :total_lines].each do |msg|
65
+ it "responds to #{msg}" do
66
+ expect(subject).to respond_to(msg)
67
+ end
68
+ end
69
+
70
+ context "dumped with to_hash" do
71
+ it "is a hash" do
72
+ expect(subject.to_hash).to be_a Hash
73
+ end
74
+
75
+ context "loaded back with from_hash" do
76
+ let(:dumped_result) do
77
+ SimpleCov::Result.from_hash(subject.to_hash)
78
+ end
79
+
80
+ it "has 3 source files" do
81
+ expect(dumped_result.source_files.count).to eq(subject.source_files.count)
82
+ end
83
+
84
+ it "has the same covered_percent" do
85
+ expect(dumped_result.covered_percent).to eq(subject.covered_percent)
86
+ end
87
+
88
+ it "has the same covered_percentages" do
89
+ expect(dumped_result.covered_percentages).to eq(subject.covered_percentages)
90
+ end
91
+
92
+ it "has the same timestamp" do
93
+ expect(dumped_result.created_at.to_i).to eq(subject.created_at.to_i)
94
+ end
95
+
96
+ it "has the same command_name" do
97
+ expect(dumped_result.command_name).to eq(subject.command_name)
98
+ end
99
+
100
+ it "has the same original_result" do
101
+ expect(dumped_result.original_result).to eq(subject.original_result)
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ context "with some filters set up" do
108
+ before do
109
+ SimpleCov.add_filter "sample.rb"
110
+ end
111
+
112
+ it "has 2 files in a new simple cov result" do
113
+ expect(SimpleCov::Result.new(original_result).source_files.length).to eq(2)
114
+ end
115
+
116
+ it "has 80 covered percent" do
117
+ expect(SimpleCov::Result.new(original_result).covered_percent).to eq(80)
118
+ end
119
+
120
+ it "has [80.0, 80.0] covered percentages" do
121
+ expect(SimpleCov::Result.new(original_result).covered_percentages).to eq([80.0, 80.0])
122
+ end
123
+ end
124
+
125
+ context "with groups set up for all files" do
126
+ before do
127
+ SimpleCov.add_group "Models", "app/models"
128
+ SimpleCov.add_group "Controllers", ["app/controllers"]
129
+ SimpleCov.add_group "Other" do |src_file|
130
+ File.basename(src_file.filename) == "sample.rb"
131
+ end
132
+ end
133
+
134
+ subject do
135
+ SimpleCov::Result.new(original_result)
136
+ end
137
+
138
+ it "has 3 groups" do
139
+ expect(subject.groups.length).to eq(3)
140
+ end
141
+
142
+ it "has user.rb in 'Models' group" do
143
+ expect(File.basename(subject.groups["Models"].first.filename)).to eq("user.rb")
144
+ end
145
+
146
+ it "has sample_controller.rb in 'Controllers' group" do
147
+ expect(File.basename(subject.groups["Controllers"].first.filename)).to eq("sample_controller.rb")
148
+ end
149
+
150
+ context "and simple formatter being used" do
151
+ before do
152
+ SimpleCov.formatter = SimpleCov::Formatter::SimpleFormatter
153
+ end
154
+
155
+ it "returns a formatted string with result.format!" do
156
+ expect(subject.format!).to be_a String
157
+ end
158
+ end
159
+
160
+ context "and multi formatter being used" do
161
+ before do
162
+ SimpleCov.formatters = [
163
+ SimpleCov::Formatter::SimpleFormatter,
164
+ SimpleCov::Formatter::SimpleFormatter,
165
+ ]
166
+ end
167
+
168
+ it "returns an array containing formatted string with result.format!" do
169
+ formatted = subject.format!
170
+ expect(formatted.count).to eq(2)
171
+ expect(formatted.first).to be_a String
172
+ end
173
+ end
174
+ end
175
+
176
+ context "with groups set up that do not match all files" do
177
+ before do
178
+ SimpleCov.configure do
179
+ add_group "Models", "app/models"
180
+ add_group "Controllers", "app/controllers"
181
+ end
182
+ end
183
+
184
+ subject { SimpleCov::Result.new(original_result) }
185
+
186
+ it "has 3 groups" do
187
+ expect(subject.groups.length).to eq(3)
188
+ end
189
+
190
+ it "has 1 item per group" do
191
+ subject.groups.each_value do |files|
192
+ expect(files.length).to eq(1)
193
+ end
194
+ end
195
+
196
+ it 'has sample.rb in "Ungrouped" group' do
197
+ expect(File.basename(subject.groups["Ungrouped"].first.filename)).to eq("sample.rb")
198
+ end
199
+
200
+ it "returns all groups as instances of SimpleCov::FileList" do
201
+ subject.groups.each_value do |files|
202
+ expect(files).to be_a SimpleCov::FileList
203
+ end
204
+ end
205
+ end
206
+ end
207
+ end if SimpleCov.usable?
@@ -0,0 +1,37 @@
1
+ require "helper"
2
+
3
+ # Make sure that exit codes of tests are propagated properly
4
+ # See https://github.com/colszowka/simplecov/issues/5
5
+ describe "return codes" do
6
+ context "inside fixtures/frameworks" do
7
+ before do
8
+ @current_dir = Dir.getwd
9
+ Dir.chdir(File.join(File.dirname(__FILE__), "fixtures", "frameworks"))
10
+ FileUtils.rm_rf("./coverage")
11
+ end
12
+
13
+ after do
14
+ Dir.chdir(@current_dir)
15
+ end
16
+
17
+ it "has return code 0 when running testunit_good.rb" do
18
+ `ruby testunit_good.rb`
19
+ expect($?.exitstatus).to be_zero
20
+ end
21
+
22
+ it "has return code 0 when running rspec_good.rb" do
23
+ `rspec rspec_good.rb`
24
+ expect($?.exitstatus).to be_zero
25
+ end
26
+
27
+ it "has non-0 return code when running testunit_bad.rb" do
28
+ `ruby testunit_bad.rb`
29
+ expect($?.exitstatus).not_to be_zero
30
+ end
31
+
32
+ it "has return code 1 when running rspec_bad.rb" do
33
+ `rspec rspec_bad.rb`
34
+ expect($?.exitstatus).not_to be_zero
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,153 @@
1
+ require "helper"
2
+
3
+ describe SimpleCov::SourceFile::Line do
4
+ context "a source line" do
5
+ subject do
6
+ SimpleCov::SourceFile::Line.new("# the ruby source", 5, 3)
7
+ end
8
+
9
+ it 'returns "# the ruby source" as src' do
10
+ expect(subject.src).to eq("# the ruby source")
11
+ end
12
+
13
+ it "returns the same for source as for src" do
14
+ expect(subject.src).to eq(subject.source)
15
+ end
16
+
17
+ it "has line number 5" do
18
+ expect(subject.line_number).to eq(5)
19
+ end
20
+
21
+ it "has equal line_number, line and number" do
22
+ expect(subject.line).to eq(subject.line_number)
23
+ expect(subject.number).to eq(subject.line_number)
24
+ end
25
+
26
+ context "flagged as skipped!" do
27
+ before do
28
+ subject.skipped!
29
+ end
30
+ it "is not covered" do
31
+ expect(subject).not_to be_covered
32
+ end
33
+
34
+ it "is skipped" do
35
+ expect(subject).to be_skipped
36
+ end
37
+
38
+ it "is not missed" do
39
+ expect(subject).not_to be_missed
40
+ end
41
+
42
+ it "is not never" do
43
+ expect(subject).not_to be_never
44
+ end
45
+
46
+ it "status is skipped" do
47
+ expect(subject.status).to eq("skipped")
48
+ end
49
+ end
50
+ end
51
+
52
+ context "A source line with coverage" do
53
+ subject do
54
+ SimpleCov::SourceFile::Line.new("# the ruby source", 5, 3)
55
+ end
56
+
57
+ it "has coverage of 3" do
58
+ expect(subject.coverage).to eq(3)
59
+ end
60
+
61
+ it "is covered" do
62
+ expect(subject).to be_covered
63
+ end
64
+
65
+ it "is not skipped" do
66
+ expect(subject).not_to be_skipped
67
+ end
68
+
69
+ it "is not missed" do
70
+ expect(subject).not_to be_missed
71
+ end
72
+
73
+ it "is not never" do
74
+ expect(subject).not_to be_never
75
+ end
76
+
77
+ it "status is covered" do
78
+ expect(subject.status).to eq("covered")
79
+ end
80
+ end
81
+
82
+ context "A source line without coverage" do
83
+ subject do
84
+ SimpleCov::SourceFile::Line.new("# the ruby source", 5, 0)
85
+ end
86
+
87
+ it "has coverage of 0" do
88
+ expect(subject.coverage).to be_zero
89
+ end
90
+
91
+ it "is not covered" do
92
+ expect(subject).not_to be_covered
93
+ end
94
+
95
+ it "is not skipped" do
96
+ expect(subject).not_to be_skipped
97
+ end
98
+
99
+ it "is missed" do
100
+ expect(subject).to be_missed
101
+ end
102
+
103
+ it "is not never" do
104
+ expect(subject).not_to be_never
105
+ end
106
+
107
+ it "status is missed" do
108
+ expect(subject.status).to eq("missed")
109
+ end
110
+ end
111
+
112
+ context "A source line with no code" do
113
+ subject do
114
+ SimpleCov::SourceFile::Line.new("# the ruby source", 5, nil)
115
+ end
116
+
117
+ it "has nil coverage" do
118
+ expect(subject.coverage).to be_nil
119
+ end
120
+
121
+ it "is not covered" do
122
+ expect(subject).not_to be_covered
123
+ end
124
+
125
+ it "is not skipped" do
126
+ expect(subject).not_to be_skipped
127
+ end
128
+
129
+ it "is not missed" do
130
+ expect(subject).not_to be_missed
131
+ end
132
+
133
+ it "is never" do
134
+ expect(subject).to be_never
135
+ end
136
+
137
+ it "status is never" do
138
+ expect(subject.status).to eq("never")
139
+ end
140
+ end
141
+
142
+ it "raises ArgumentError when initialized with invalid src" do
143
+ expect { SimpleCov::SourceFile::Line.new(:symbol, 5, 3) }.to raise_error(ArgumentError)
144
+ end
145
+
146
+ it "raises ArgumentError when initialized with invalid line_number" do
147
+ expect { SimpleCov::SourceFile::Line.new("some source", "five", 3) }.to raise_error(ArgumentError)
148
+ end
149
+
150
+ it "raises ArgumentError when initialized with invalid coverage" do
151
+ expect { SimpleCov::SourceFile::Line.new("some source", 5, "three") }.to raise_error(ArgumentError)
152
+ end
153
+ end if SimpleCov.usable?