simplecov 0.15.0 → 0.16.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 (134) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +26 -2
  3. data/CONTRIBUTING.md +12 -9
  4. data/ISSUE_TEMPLATE.md +23 -0
  5. data/README.md +42 -16
  6. data/doc/alternate-formatters.md +16 -1
  7. data/lib/simplecov/command_guesser.rb +2 -0
  8. data/lib/simplecov/configuration.rb +2 -0
  9. data/lib/simplecov/defaults.rb +9 -80
  10. data/lib/simplecov/exit_codes.rb +2 -0
  11. data/lib/simplecov/file_list.rb +2 -0
  12. data/lib/simplecov/filter.rb +3 -1
  13. data/lib/simplecov/formatter/multi_formatter.rb +2 -0
  14. data/lib/simplecov/formatter/simple_formatter.rb +2 -0
  15. data/lib/simplecov/formatter.rb +2 -0
  16. data/lib/simplecov/jruby_fix.rb +2 -0
  17. data/lib/simplecov/last_run.rb +2 -0
  18. data/lib/simplecov/lines_classifier.rb +19 -3
  19. data/lib/simplecov/load_global_config.rb +2 -0
  20. data/lib/simplecov/no_defaults.rb +2 -0
  21. data/lib/simplecov/profiles/bundler_filter.rb +5 -0
  22. data/lib/simplecov/profiles/rails.rb +18 -0
  23. data/lib/simplecov/profiles/root_filter.rb +10 -0
  24. data/lib/simplecov/profiles/test_frameworks.rb +8 -0
  25. data/lib/simplecov/profiles.rb +2 -0
  26. data/lib/simplecov/railtie.rb +2 -0
  27. data/lib/simplecov/railties/tasks.rake +2 -0
  28. data/lib/simplecov/raw_coverage.rb +2 -0
  29. data/lib/simplecov/result.rb +2 -0
  30. data/lib/simplecov/result_merger.rb +2 -0
  31. data/lib/simplecov/source_file.rb +3 -1
  32. data/lib/simplecov/version.rb +3 -1
  33. data/lib/simplecov.rb +91 -0
  34. metadata +22 -117
  35. data/.gitignore +0 -31
  36. data/.rspec +0 -3
  37. data/.rubocop.yml +0 -88
  38. data/.travis.yml +0 -29
  39. data/.yardopts +0 -1
  40. data/Gemfile +0 -38
  41. data/MIT-LICENSE +0 -20
  42. data/Rakefile +0 -41
  43. data/cucumber.yml +0 -13
  44. data/features/config_autoload.feature +0 -46
  45. data/features/config_command_name.feature +0 -45
  46. data/features/config_coverage_dir.feature +0 -33
  47. data/features/config_deactivate_merging.feature +0 -42
  48. data/features/config_formatters.feature +0 -77
  49. data/features/config_merge_timeout.feature +0 -39
  50. data/features/config_nocov_token.feature +0 -79
  51. data/features/config_profiles.feature +0 -44
  52. data/features/config_project_name.feature +0 -27
  53. data/features/config_styles.feature +0 -121
  54. data/features/config_tracked_files.feature +0 -29
  55. data/features/config_tracked_files_relevant_lines.feature +0 -31
  56. data/features/cucumber_basic.feature +0 -29
  57. data/features/maximum_coverage_drop.feature +0 -89
  58. data/features/merging_test_unit_and_rspec.feature +0 -44
  59. data/features/minimum_coverage.feature +0 -59
  60. data/features/refuse_coverage_drop.feature +0 -95
  61. data/features/rspec_basic.feature +0 -32
  62. data/features/rspec_fails_on_initialization.feature +0 -14
  63. data/features/rspec_groups_and_filters_basic.feature +0 -29
  64. data/features/rspec_groups_and_filters_complex.feature +0 -37
  65. data/features/rspec_groups_using_filter_class.feature +0 -41
  66. data/features/rspec_without_simplecov.feature +0 -20
  67. data/features/skipping_code_blocks_manually.feature +0 -70
  68. data/features/step_definitions/html_steps.rb +0 -44
  69. data/features/step_definitions/simplecov_steps.rb +0 -68
  70. data/features/step_definitions/transformers.rb +0 -13
  71. data/features/step_definitions/web_steps.rb +0 -64
  72. data/features/support/aruba_freedom_patch.rb +0 -53
  73. data/features/support/env.rb +0 -50
  74. data/features/test_unit_basic.feature +0 -34
  75. data/features/test_unit_groups_and_filters_basic.feature +0 -29
  76. data/features/test_unit_groups_and_filters_complex.feature +0 -35
  77. data/features/test_unit_groups_using_filter_class.feature +0 -40
  78. data/features/test_unit_without_simplecov.feature +0 -20
  79. data/features/unicode_compatiblity.feature +0 -67
  80. data/simplecov.gemspec +0 -27
  81. data/spec/1_8_fallbacks_spec.rb +0 -31
  82. data/spec/command_guesser_spec.rb +0 -48
  83. data/spec/config_loader_spec.rb +0 -14
  84. data/spec/configuration_spec.rb +0 -35
  85. data/spec/deleted_source_spec.rb +0 -12
  86. data/spec/faked_project/Gemfile +0 -6
  87. data/spec/faked_project/Rakefile +0 -8
  88. data/spec/faked_project/cucumber.yml +0 -13
  89. data/spec/faked_project/features/step_definitions/my_steps.rb +0 -22
  90. data/spec/faked_project/features/support/env.rb +0 -12
  91. data/spec/faked_project/features/test_stuff.feature +0 -6
  92. data/spec/faked_project/lib/faked_project/framework_specific.rb +0 -18
  93. data/spec/faked_project/lib/faked_project/meta_magic.rb +0 -24
  94. data/spec/faked_project/lib/faked_project/some_class.rb +0 -28
  95. data/spec/faked_project/lib/faked_project/untested_class.rb +0 -11
  96. data/spec/faked_project/lib/faked_project.rb +0 -11
  97. data/spec/faked_project/spec/faked_spec.rb +0 -11
  98. data/spec/faked_project/spec/forking_spec.rb +0 -8
  99. data/spec/faked_project/spec/meta_magic_spec.rb +0 -15
  100. data/spec/faked_project/spec/some_class_spec.rb +0 -13
  101. data/spec/faked_project/spec/spec_helper.rb +0 -11
  102. data/spec/faked_project/test/faked_test.rb +0 -11
  103. data/spec/faked_project/test/meta_magic_test.rb +0 -13
  104. data/spec/faked_project/test/some_class_test.rb +0 -15
  105. data/spec/faked_project/test/test_helper.rb +0 -12
  106. data/spec/file_list_spec.rb +0 -50
  107. data/spec/filters_spec.rb +0 -172
  108. data/spec/fixtures/app/controllers/sample_controller.rb +0 -10
  109. data/spec/fixtures/app/models/user.rb +0 -10
  110. data/spec/fixtures/deleted_source_sample.rb +0 -15
  111. data/spec/fixtures/frameworks/rspec_bad.rb +0 -9
  112. data/spec/fixtures/frameworks/rspec_good.rb +0 -9
  113. data/spec/fixtures/frameworks/testunit_bad.rb +0 -9
  114. data/spec/fixtures/frameworks/testunit_good.rb +0 -9
  115. data/spec/fixtures/iso-8859.rb +0 -3
  116. data/spec/fixtures/never.rb +0 -2
  117. data/spec/fixtures/resultset1.rb +0 -4
  118. data/spec/fixtures/resultset2.rb +0 -4
  119. data/spec/fixtures/sample.rb +0 -16
  120. data/spec/fixtures/skipped.rb +0 -4
  121. data/spec/fixtures/skipped_and_executed.rb +0 -8
  122. data/spec/fixtures/utf-8.rb +0 -3
  123. data/spec/helper.rb +0 -26
  124. data/spec/last_run_spec.rb +0 -48
  125. data/spec/lines_classifier_spec.rb +0 -103
  126. data/spec/multi_formatter_spec.rb +0 -20
  127. data/spec/raw_coverage_spec.rb +0 -92
  128. data/spec/result_merger_spec.rb +0 -171
  129. data/spec/result_spec.rb +0 -209
  130. data/spec/return_codes_spec.rb +0 -34
  131. data/spec/simplecov_spec.rb +0 -109
  132. data/spec/source_file_line_spec.rb +0 -155
  133. data/spec/source_file_spec.rb +0 -145
  134. data/spec/support/fail_rspec_on_ruby_warning.rb +0 -75
@@ -1,103 +0,0 @@
1
- require "helper"
2
- require "simplecov/lines_classifier"
3
-
4
- describe SimpleCov::LinesClassifier do
5
- describe "#classify" do
6
- describe "relevant lines" do
7
- it "determines code as relevant" do
8
- classified_lines = subject.classify [
9
- "module Foo",
10
- " class Baz",
11
- " def Bar",
12
- " puts 'hi'",
13
- " end",
14
- " end",
15
- "end",
16
- ]
17
-
18
- expect(classified_lines.length).to eq 7
19
- expect(classified_lines).to all be_relevant
20
- end
21
- end
22
-
23
- describe "not-relevant lines" do
24
- it "determines whitespace is not-relevant" do
25
- classified_lines = subject.classify [
26
- "",
27
- " ",
28
- "\t\t",
29
- ]
30
-
31
- expect(classified_lines.length).to eq 3
32
- expect(classified_lines).to all be_irrelevant
33
- end
34
-
35
- describe "comments" do
36
- it "determines comments are not-relevant" do
37
- classified_lines = subject.classify [
38
- "#Comment",
39
- " # Leading space comment",
40
- "\t# Leading tab comment",
41
- ]
42
-
43
- expect(classified_lines.length).to eq 3
44
- expect(classified_lines).to all be_irrelevant
45
- end
46
-
47
- it "doesn't mistake interpolation as a comment" do
48
- classified_lines = subject.classify [
49
- 'puts "#{var}"',
50
- ]
51
-
52
- expect(classified_lines.length).to eq 1
53
- expect(classified_lines).to all be_relevant
54
- end
55
- end
56
-
57
- describe ":nocov: blocks" do
58
- it "determines :nocov: blocks are not-relevant" do
59
- classified_lines = subject.classify [
60
- "# :nocov:",
61
- "def hi",
62
- "end",
63
- "# :nocov:",
64
- ]
65
-
66
- expect(classified_lines.length).to eq 4
67
- expect(classified_lines).to all be_irrelevant
68
- end
69
-
70
- it "determines all lines after a non-closing :nocov: as not-relevant" do
71
- classified_lines = subject.classify [
72
- "# :nocov:",
73
- "puts 'Not relevant'",
74
- "# :nocov:",
75
- "puts 'Relevant again'",
76
- "puts 'Still relevant'",
77
- "# :nocov:",
78
- "puts 'Not relevant till the end'",
79
- "puts 'Ditto'",
80
- ]
81
-
82
- expect(classified_lines.length).to eq 8
83
-
84
- expect(classified_lines[0..2]).to all be_irrelevant
85
- expect(classified_lines[3..4]).to all be_relevant
86
- expect(classified_lines[5..7]).to all be_irrelevant
87
- end
88
- end
89
- end
90
- end
91
-
92
- RSpec::Matchers.define :be_relevant do
93
- match do |actual|
94
- actual == SimpleCov::LinesClassifier::RELEVANT
95
- end
96
- end
97
-
98
- RSpec::Matchers.define :be_irrelevant do
99
- match do |actual|
100
- actual == SimpleCov::LinesClassifier::NOT_RELEVANT
101
- end
102
- end
103
- end
@@ -1,20 +0,0 @@
1
- require "helper"
2
-
3
- require "simplecov/formatter/multi_formatter"
4
-
5
- describe SimpleCov::Formatter::MultiFormatter do
6
- describe ".[]" do
7
- # Regression test for https://github.com/colszowka/simplecov/issues/428
8
- it "constructs a formatter with multiple children" do
9
- # Silence deprecation warnings.
10
- allow(described_class).to receive(:warn)
11
-
12
- children = [
13
- SimpleCov::Formatter::SimpleFormatter,
14
- SimpleCov::Formatter::SimpleFormatter,
15
- ]
16
-
17
- expect(described_class[*children].new.formatters).to eq(children)
18
- end
19
- end
20
- end
@@ -1,92 +0,0 @@
1
- require "helper"
2
-
3
- if SimpleCov.usable?
4
- describe SimpleCov::RawCoverage do
5
- describe "with two faked coverage resultsets" do
6
- before do
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
- source_fixture("parallel_tests.rb") => [nil, 0, nil, 0],
13
- source_fixture("conditionally_loaded_1.rb") => [nil, 0, 1], # loaded only in the first resultset
14
- source_fixture("three.rb") => [nil, 1, 1],
15
- }
16
-
17
- @resultset2 = {
18
- source_fixture("sample.rb") => [1, nil, 1, 1, nil, nil, 1, 1, nil, nil],
19
- source_fixture("app/models/user.rb") => [nil, 1, 5, 1, nil, nil, 1, 0, nil, nil],
20
- source_fixture("app/controllers/sample_controller.rb") => [nil, 3, 1, nil, nil, nil, 1, 0, nil, nil],
21
- source_fixture("resultset2.rb") => [nil, 1, 1, nil],
22
- source_fixture("parallel_tests.rb") => [nil, nil, 0, 0],
23
- source_fixture("conditionally_loaded_2.rb") => [nil, 0, 1], # loaded only in the second resultset
24
- source_fixture("three.rb") => [nil, 1, 4],
25
- }
26
-
27
- @resultset3 = {
28
- source_fixture("three.rb") => [nil, 1, 2],
29
- }
30
- end
31
-
32
- context "a merge" do
33
- subject do
34
- SimpleCov::RawCoverage.merge_results(@resultset1, @resultset2, @resultset3)
35
- end
36
-
37
- it "has proper results for sample.rb" do
38
- expect(subject[source_fixture("sample.rb")]).to eq([1, 1, 2, 2, nil, nil, 2, 2, nil, nil])
39
- end
40
-
41
- it "has proper results for user.rb" do
42
- expect(subject[source_fixture("app/models/user.rb")]).to eq([nil, 2, 6, 2, nil, nil, 2, 0, nil, nil])
43
- end
44
-
45
- it "has proper results for sample_controller.rb" do
46
- expect(subject[source_fixture("app/controllers/sample_controller.rb")]).to eq([nil, 4, 2, 1, nil, nil, 2, 0, nil, nil])
47
- end
48
-
49
- it "has proper results for resultset1.rb" do
50
- expect(subject[source_fixture("resultset1.rb")]).to eq([1, 1, 1, 1])
51
- end
52
-
53
- it "has proper results for resultset2.rb" do
54
- expect(subject[source_fixture("resultset2.rb")]).to eq([nil, 1, 1, nil])
55
- end
56
-
57
- it "has proper results for parallel_tests.rb" do
58
- expect(subject[source_fixture("parallel_tests.rb")]).to eq([nil, nil, nil, 0])
59
- end
60
-
61
- it "has proper results for conditionally_loaded_1.rb" do
62
- expect(subject[source_fixture("conditionally_loaded_1.rb")]).to eq([nil, 0, 1])
63
- end
64
-
65
- it "has proper results for conditionally_loaded_2.rb" do
66
- expect(subject[source_fixture("conditionally_loaded_2.rb")]).to eq([nil, 0, 1])
67
- end
68
-
69
- it "has proper results for three.rb" do
70
- expect(subject[source_fixture("three.rb")]).to eq([nil, 3, 7])
71
- end
72
- end
73
- end
74
-
75
- it "merges frozen resultsets" do
76
- resultset1 = {
77
- source_fixture("sample.rb").freeze => [nil, 1, 1, 1, nil, nil, 1, 1, nil, nil].freeze,
78
- source_fixture("app/models/user.rb").freeze => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil].freeze,
79
- }.freeze
80
-
81
- resultset2 = {
82
- source_fixture("sample.rb").freeze => [1, nil, 1, 1, nil, nil, 1, 1, nil, nil].freeze,
83
- }.freeze
84
-
85
- merged_result = SimpleCov::RawCoverage.merge_results(resultset1, resultset2)
86
- expect(merged_result.keys).to eq(resultset1.keys)
87
- expect(merged_result.values.map(&:frozen?)).to eq([false, false])
88
- expect(merged_result[source_fixture("sample.rb")]).to eq([1, 1, 2, 2, nil, nil, 2, 2, nil, nil])
89
- expect(merged_result[source_fixture("app/models/user.rb")]).to eq([nil, 1, 1, 1, nil, nil, 1, 0, nil, nil])
90
- end
91
- end
92
- end
@@ -1,171 +0,0 @@
1
- require "helper"
2
- require "tempfile"
3
- require "timeout"
4
-
5
- if SimpleCov.usable?
6
- describe SimpleCov::ResultMerger do
7
- before do
8
- SimpleCov::ResultMerger.clear_resultset
9
- File.delete(SimpleCov::ResultMerger.resultset_path) if File.exist?(SimpleCov::ResultMerger.resultset_path)
10
- end
11
-
12
- describe "with two faked coverage resultsets" do
13
- before do
14
- @resultset1 = {
15
- source_fixture("sample.rb") => [nil, 1, 1, 1, nil, nil, 1, 1, nil, nil],
16
- source_fixture("app/models/user.rb") => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil],
17
- source_fixture("app/controllers/sample_controller.rb") => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil],
18
- source_fixture("resultset1.rb") => [1, 1, 1, 1],
19
- source_fixture("parallel_tests.rb") => [nil, 0, nil, 0],
20
- source_fixture("conditionally_loaded_1.rb") => [nil, 0, 1], # loaded only in the first resultset
21
- }
22
-
23
- @resultset2 = {
24
- source_fixture("sample.rb") => [1, nil, 1, 1, nil, nil, 1, 1, nil, nil],
25
- source_fixture("app/models/user.rb") => [nil, 1, 5, 1, nil, nil, 1, 0, nil, nil],
26
- source_fixture("app/controllers/sample_controller.rb") => [nil, 3, 1, nil, nil, nil, 1, 0, nil, nil],
27
- source_fixture("resultset2.rb") => [nil, 1, 1, nil],
28
- source_fixture("parallel_tests.rb") => [nil, nil, 0, 0],
29
- source_fixture("conditionally_loaded_2.rb") => [nil, 0, 1], # loaded only in the second resultset
30
- }
31
- end
32
-
33
- # See Github issue #6
34
- it "returns an empty hash when the resultset cache file is empty" do
35
- File.open(SimpleCov::ResultMerger.resultset_path, "w+") { |f| f.puts "" }
36
- expect(SimpleCov::ResultMerger.resultset).to be_empty
37
- end
38
-
39
- # See Github issue #6
40
- it "returns an empty hash when the resultset cache file is not present" do
41
- system "rm #{SimpleCov::ResultMerger.resultset_path}" if File.exist?(SimpleCov::ResultMerger.resultset_path)
42
- expect(SimpleCov::ResultMerger.resultset).to be_empty
43
- end
44
-
45
- context "and results generated from those" do
46
- before do
47
- system "rm #{SimpleCov::ResultMerger.resultset_path}" if File.exist?(SimpleCov::ResultMerger.resultset_path)
48
- @result1 = SimpleCov::Result.new(@resultset1)
49
- @result1.command_name = "result1"
50
- @result2 = SimpleCov::Result.new(@resultset2)
51
- @result2.command_name = "result2"
52
- end
53
-
54
- context "with stored results" do
55
- before do
56
- SimpleCov::ResultMerger.store_result(@result1)
57
- SimpleCov::ResultMerger.store_result(@result2)
58
- end
59
-
60
- it "has stored data in resultset_path JSON file" do
61
- expect(File.readlines(SimpleCov::ResultMerger.resultset_path).length).to be > 50
62
- end
63
-
64
- it "returns a hash containing keys ['result1' and 'result2'] for resultset" do
65
- expect(SimpleCov::ResultMerger.resultset.keys.sort).to eq %w[result1 result2]
66
- end
67
-
68
- it "returns proper values for merged_result" do
69
- 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])
70
- end
71
-
72
- context "with second result way above the merge_timeout" do
73
- before do
74
- @result2.created_at = Time.now - 172_800 # two days ago
75
- SimpleCov::ResultMerger.store_result(@result2)
76
- end
77
-
78
- it "has only one result in SimpleCov::ResultMerger.results" do
79
- expect(SimpleCov::ResultMerger.results.length).to eq(1)
80
- end
81
- end
82
- end
83
- end
84
- end
85
-
86
- describe ".store_result" do
87
- it "refreshes the resultset" do
88
- set = SimpleCov::ResultMerger.resultset
89
- SimpleCov::ResultMerger.store_result({})
90
- new_set = SimpleCov::ResultMerger.resultset
91
- expect(new_set).not_to be(set)
92
- end
93
-
94
- it "persists to disk" do
95
- SimpleCov::ResultMerger.store_result("a" => [1])
96
- SimpleCov::ResultMerger.clear_resultset
97
- new_set = SimpleCov::ResultMerger.resultset
98
- expect(new_set).to eq("a" => [1])
99
- end
100
-
101
- it "synchronizes writes" do
102
- expect(SimpleCov::ResultMerger).to receive(:synchronize_resultset)
103
- SimpleCov::ResultMerger.store_result({})
104
- end
105
- end
106
-
107
- describe ".resultset" do
108
- it "caches" do
109
- set = SimpleCov::ResultMerger.resultset
110
- new_set = SimpleCov::ResultMerger.resultset
111
- expect(new_set).to be(set)
112
- end
113
-
114
- it "synchronizes reads" do
115
- expect(SimpleCov::ResultMerger).to receive(:synchronize_resultset)
116
- SimpleCov::ResultMerger.resultset
117
- end
118
- end
119
-
120
- describe ".synchronize_resultset" do
121
- it "is reentrant (i.e. doesn't block its own process)" do
122
- # without @resultset_locked, this spec would fail and
123
- # `.store_result` wouldn't work
124
- expect do
125
- Timeout.timeout(1) do
126
- SimpleCov::ResultMerger.synchronize_resultset do
127
- SimpleCov::ResultMerger.synchronize_resultset do
128
- end
129
- end
130
- end
131
- end.not_to raise_error
132
- end
133
-
134
- it "blocks other processes" do
135
- file = Tempfile.new("foo")
136
-
137
- other_process = open("|ruby -e " + Shellwords.escape(<<-CODE) + " 2>/dev/null")
138
- require "simplecov"
139
- SimpleCov.coverage_dir(#{SimpleCov.coverage_dir.inspect})
140
-
141
- # ensure the parent process has enough time to get a
142
- # lock before we do
143
- sleep 0.5
144
-
145
- $stdout.sync = true
146
- puts "running" # see `sleep`s in parent process
147
-
148
- SimpleCov::ResultMerger.synchronize_resultset do
149
- File.open(#{file.path.inspect}, "a") { |f| f.write("process 2\n") }
150
- end
151
- CODE
152
-
153
- SimpleCov::ResultMerger.synchronize_resultset do
154
- # wait until the child process is going, and then wait some more
155
- # so we can be sure it blocks on the lock we already have.
156
- sleep 0.1 until other_process.gets == "running\n"
157
- sleep 1
158
-
159
- # despite the sleeps, this will be written first since we got
160
- # the first lock
161
- File.open(file.path, "a") { |f| f.write("process 1\n") }
162
- end
163
-
164
- # wait for it to finish
165
- other_process.gets
166
-
167
- expect(file.read).to eq("process 1\nprocess 2\n")
168
- end
169
- end
170
- end
171
- end
data/spec/result_spec.rb DELETED
@@ -1,209 +0,0 @@
1
- require "helper"
2
-
3
- if SimpleCov.usable?
4
- describe "result" do
5
- context "with a (mocked) Coverage.result" do
6
- before do
7
- @prev_filters = SimpleCov.filters
8
- SimpleCov.filters = []
9
- @prev_groups = SimpleCov.groups
10
- SimpleCov.groups = {}
11
- @prev_formatter = SimpleCov.formatter
12
- SimpleCov.formatter = nil
13
- end
14
-
15
- after do
16
- SimpleCov.filters = @prev_filters
17
- SimpleCov.groups = @prev_groups
18
- SimpleCov.formatter = @prev_formatter
19
- end
20
-
21
- let(:original_result) do
22
- {
23
- source_fixture("sample.rb") => [nil, 1, 1, 1, nil, nil, 1, 1, nil, nil],
24
- source_fixture("app/models/user.rb") => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil],
25
- source_fixture("app/controllers/sample_controller.rb") => [nil, 1, 1, 1, nil, nil, 1, 0, nil, nil],
26
- }
27
- end
28
-
29
- context "a simple cov result initialized from that" do
30
- subject { SimpleCov::Result.new(original_result) }
31
-
32
- it "has 3 filenames" do
33
- expect(subject.filenames.count).to eq(3)
34
- end
35
-
36
- it "has 3 source files" do
37
- expect(subject.source_files.count).to eq(3)
38
- subject.source_files.each do |source_file|
39
- expect(source_file).to be_a SimpleCov::SourceFile
40
- end
41
- end
42
-
43
- it "returns an instance of SimpleCov::FileList for source_files and files" do
44
- expect(subject.files).to be_a SimpleCov::FileList
45
- expect(subject.source_files).to be_a SimpleCov::FileList
46
- end
47
-
48
- it "has files equal to source_files" do
49
- expect(subject.files).to eq(subject.source_files)
50
- end
51
-
52
- it "has accurate covered percent" do
53
- # in our fixture, there are 13 covered line (result in 1) in all 15 relevant line (result in non-nil)
54
- expect(subject.covered_percent).to eq(86.66666666666667)
55
- end
56
-
57
- it "has accurate covered percentages" do
58
- expect(subject.covered_percentages).to eq([80.0, 80.0, 100.0])
59
- end
60
-
61
- it "has accurate least covered file" do
62
- expect(subject.least_covered_file).to match(/sample_controller.rb/)
63
- end
64
-
65
- [:covered_percent, :covered_percentages, :least_covered_file, :covered_strength, :covered_lines, :missed_lines, :total_lines].each do |msg|
66
- it "responds to #{msg}" do
67
- expect(subject).to respond_to(msg)
68
- end
69
- end
70
-
71
- context "dumped with to_hash" do
72
- it "is a hash" do
73
- expect(subject.to_hash).to be_a Hash
74
- end
75
-
76
- context "loaded back with from_hash" do
77
- let(:dumped_result) do
78
- SimpleCov::Result.from_hash(subject.to_hash)
79
- end
80
-
81
- it "has 3 source files" do
82
- expect(dumped_result.source_files.count).to eq(subject.source_files.count)
83
- end
84
-
85
- it "has the same covered_percent" do
86
- expect(dumped_result.covered_percent).to eq(subject.covered_percent)
87
- end
88
-
89
- it "has the same covered_percentages" do
90
- expect(dumped_result.covered_percentages).to eq(subject.covered_percentages)
91
- end
92
-
93
- it "has the same timestamp" do
94
- expect(dumped_result.created_at.to_i).to eq(subject.created_at.to_i)
95
- end
96
-
97
- it "has the same command_name" do
98
- expect(dumped_result.command_name).to eq(subject.command_name)
99
- end
100
-
101
- it "has the same original_result" do
102
- expect(dumped_result.original_result).to eq(subject.original_result)
103
- end
104
- end
105
- end
106
- end
107
-
108
- context "with some filters set up" do
109
- before do
110
- SimpleCov.add_filter "sample.rb"
111
- end
112
-
113
- it "has 2 files in a new simple cov result" do
114
- expect(SimpleCov::Result.new(original_result).source_files.length).to eq(2)
115
- end
116
-
117
- it "has 80 covered percent" do
118
- expect(SimpleCov::Result.new(original_result).covered_percent).to eq(80)
119
- end
120
-
121
- it "has [80.0, 80.0] covered percentages" do
122
- expect(SimpleCov::Result.new(original_result).covered_percentages).to eq([80.0, 80.0])
123
- end
124
- end
125
-
126
- context "with groups set up for all files" do
127
- before do
128
- SimpleCov.add_group "Models", "app/models"
129
- SimpleCov.add_group "Controllers", ["app/controllers"]
130
- SimpleCov.add_group "Other" do |src_file|
131
- File.basename(src_file.filename) == "sample.rb"
132
- end
133
- end
134
-
135
- subject do
136
- SimpleCov::Result.new(original_result)
137
- end
138
-
139
- it "has 3 groups" do
140
- expect(subject.groups.length).to eq(3)
141
- end
142
-
143
- it "has user.rb in 'Models' group" do
144
- expect(File.basename(subject.groups["Models"].first.filename)).to eq("user.rb")
145
- end
146
-
147
- it "has sample_controller.rb in 'Controllers' group" do
148
- expect(File.basename(subject.groups["Controllers"].first.filename)).to eq("sample_controller.rb")
149
- end
150
-
151
- context "and simple formatter being used" do
152
- before do
153
- SimpleCov.formatter = SimpleCov::Formatter::SimpleFormatter
154
- end
155
-
156
- it "returns a formatted string with result.format!" do
157
- expect(subject.format!).to be_a String
158
- end
159
- end
160
-
161
- context "and multi formatter being used" do
162
- before do
163
- SimpleCov.formatters = [
164
- SimpleCov::Formatter::SimpleFormatter,
165
- SimpleCov::Formatter::SimpleFormatter,
166
- ]
167
- end
168
-
169
- it "returns an array containing formatted string with result.format!" do
170
- formatted = subject.format!
171
- expect(formatted.count).to eq(2)
172
- expect(formatted.first).to be_a String
173
- end
174
- end
175
- end
176
-
177
- context "with groups set up that do not match all files" do
178
- before do
179
- SimpleCov.configure do
180
- add_group "Models", "app/models"
181
- add_group "Controllers", "app/controllers"
182
- end
183
- end
184
-
185
- subject { SimpleCov::Result.new(original_result) }
186
-
187
- it "has 3 groups" do
188
- expect(subject.groups.length).to eq(3)
189
- end
190
-
191
- it "has 1 item per group" do
192
- subject.groups.each_value do |files|
193
- expect(files.length).to eq(1)
194
- end
195
- end
196
-
197
- it 'has sample.rb in "Ungrouped" group' do
198
- expect(File.basename(subject.groups["Ungrouped"].first.filename)).to eq("sample.rb")
199
- end
200
-
201
- it "returns all groups as instances of SimpleCov::FileList" do
202
- subject.groups.each_value do |files|
203
- expect(files).to be_a SimpleCov::FileList
204
- end
205
- end
206
- end
207
- end
208
- end
209
- end
@@ -1,34 +0,0 @@
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
- around do |test|
8
- Dir.chdir(File.join(File.dirname(__FILE__), "fixtures", "frameworks")) do
9
- FileUtils.rm_rf("./coverage")
10
- test.call
11
- end
12
- end
13
-
14
- it "has return code 0 when running testunit_good.rb" do
15
- `ruby testunit_good.rb`
16
- expect($?.exitstatus).to be_zero
17
- end
18
-
19
- it "has return code 0 when running rspec_good.rb" do
20
- `rspec rspec_good.rb`
21
- expect($?.exitstatus).to be_zero
22
- end
23
-
24
- it "has non-0 return code when running testunit_bad.rb" do
25
- `ruby testunit_bad.rb`
26
- expect($?.exitstatus).not_to be_zero
27
- end
28
-
29
- it "has return code 1 when running rspec_bad.rb" do
30
- `rspec rspec_bad.rb`
31
- expect($?.exitstatus).not_to be_zero
32
- end
33
- end
34
- end