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.
- checksums.yaml +5 -5
- data/CHANGELOG.md +26 -2
- data/CONTRIBUTING.md +12 -9
- data/ISSUE_TEMPLATE.md +23 -0
- data/README.md +42 -16
- data/doc/alternate-formatters.md +16 -1
- data/lib/simplecov/command_guesser.rb +2 -0
- data/lib/simplecov/configuration.rb +2 -0
- data/lib/simplecov/defaults.rb +9 -80
- data/lib/simplecov/exit_codes.rb +2 -0
- data/lib/simplecov/file_list.rb +2 -0
- data/lib/simplecov/filter.rb +3 -1
- data/lib/simplecov/formatter/multi_formatter.rb +2 -0
- data/lib/simplecov/formatter/simple_formatter.rb +2 -0
- data/lib/simplecov/formatter.rb +2 -0
- data/lib/simplecov/jruby_fix.rb +2 -0
- data/lib/simplecov/last_run.rb +2 -0
- data/lib/simplecov/lines_classifier.rb +19 -3
- data/lib/simplecov/load_global_config.rb +2 -0
- data/lib/simplecov/no_defaults.rb +2 -0
- data/lib/simplecov/profiles/bundler_filter.rb +5 -0
- data/lib/simplecov/profiles/rails.rb +18 -0
- data/lib/simplecov/profiles/root_filter.rb +10 -0
- data/lib/simplecov/profiles/test_frameworks.rb +8 -0
- data/lib/simplecov/profiles.rb +2 -0
- data/lib/simplecov/railtie.rb +2 -0
- data/lib/simplecov/railties/tasks.rake +2 -0
- data/lib/simplecov/raw_coverage.rb +2 -0
- data/lib/simplecov/result.rb +2 -0
- data/lib/simplecov/result_merger.rb +2 -0
- data/lib/simplecov/source_file.rb +3 -1
- data/lib/simplecov/version.rb +3 -1
- data/lib/simplecov.rb +91 -0
- metadata +22 -117
- data/.gitignore +0 -31
- data/.rspec +0 -3
- data/.rubocop.yml +0 -88
- data/.travis.yml +0 -29
- data/.yardopts +0 -1
- data/Gemfile +0 -38
- data/MIT-LICENSE +0 -20
- data/Rakefile +0 -41
- data/cucumber.yml +0 -13
- data/features/config_autoload.feature +0 -46
- data/features/config_command_name.feature +0 -45
- data/features/config_coverage_dir.feature +0 -33
- data/features/config_deactivate_merging.feature +0 -42
- data/features/config_formatters.feature +0 -77
- data/features/config_merge_timeout.feature +0 -39
- data/features/config_nocov_token.feature +0 -79
- data/features/config_profiles.feature +0 -44
- data/features/config_project_name.feature +0 -27
- data/features/config_styles.feature +0 -121
- data/features/config_tracked_files.feature +0 -29
- data/features/config_tracked_files_relevant_lines.feature +0 -31
- data/features/cucumber_basic.feature +0 -29
- data/features/maximum_coverage_drop.feature +0 -89
- data/features/merging_test_unit_and_rspec.feature +0 -44
- data/features/minimum_coverage.feature +0 -59
- data/features/refuse_coverage_drop.feature +0 -95
- data/features/rspec_basic.feature +0 -32
- data/features/rspec_fails_on_initialization.feature +0 -14
- data/features/rspec_groups_and_filters_basic.feature +0 -29
- data/features/rspec_groups_and_filters_complex.feature +0 -37
- data/features/rspec_groups_using_filter_class.feature +0 -41
- data/features/rspec_without_simplecov.feature +0 -20
- data/features/skipping_code_blocks_manually.feature +0 -70
- data/features/step_definitions/html_steps.rb +0 -44
- data/features/step_definitions/simplecov_steps.rb +0 -68
- data/features/step_definitions/transformers.rb +0 -13
- data/features/step_definitions/web_steps.rb +0 -64
- data/features/support/aruba_freedom_patch.rb +0 -53
- data/features/support/env.rb +0 -50
- data/features/test_unit_basic.feature +0 -34
- data/features/test_unit_groups_and_filters_basic.feature +0 -29
- data/features/test_unit_groups_and_filters_complex.feature +0 -35
- data/features/test_unit_groups_using_filter_class.feature +0 -40
- data/features/test_unit_without_simplecov.feature +0 -20
- data/features/unicode_compatiblity.feature +0 -67
- data/simplecov.gemspec +0 -27
- data/spec/1_8_fallbacks_spec.rb +0 -31
- data/spec/command_guesser_spec.rb +0 -48
- data/spec/config_loader_spec.rb +0 -14
- data/spec/configuration_spec.rb +0 -35
- data/spec/deleted_source_spec.rb +0 -12
- data/spec/faked_project/Gemfile +0 -6
- data/spec/faked_project/Rakefile +0 -8
- data/spec/faked_project/cucumber.yml +0 -13
- data/spec/faked_project/features/step_definitions/my_steps.rb +0 -22
- data/spec/faked_project/features/support/env.rb +0 -12
- data/spec/faked_project/features/test_stuff.feature +0 -6
- data/spec/faked_project/lib/faked_project/framework_specific.rb +0 -18
- data/spec/faked_project/lib/faked_project/meta_magic.rb +0 -24
- data/spec/faked_project/lib/faked_project/some_class.rb +0 -28
- data/spec/faked_project/lib/faked_project/untested_class.rb +0 -11
- data/spec/faked_project/lib/faked_project.rb +0 -11
- data/spec/faked_project/spec/faked_spec.rb +0 -11
- data/spec/faked_project/spec/forking_spec.rb +0 -8
- data/spec/faked_project/spec/meta_magic_spec.rb +0 -15
- data/spec/faked_project/spec/some_class_spec.rb +0 -13
- data/spec/faked_project/spec/spec_helper.rb +0 -11
- data/spec/faked_project/test/faked_test.rb +0 -11
- data/spec/faked_project/test/meta_magic_test.rb +0 -13
- data/spec/faked_project/test/some_class_test.rb +0 -15
- data/spec/faked_project/test/test_helper.rb +0 -12
- data/spec/file_list_spec.rb +0 -50
- data/spec/filters_spec.rb +0 -172
- data/spec/fixtures/app/controllers/sample_controller.rb +0 -10
- data/spec/fixtures/app/models/user.rb +0 -10
- data/spec/fixtures/deleted_source_sample.rb +0 -15
- data/spec/fixtures/frameworks/rspec_bad.rb +0 -9
- data/spec/fixtures/frameworks/rspec_good.rb +0 -9
- data/spec/fixtures/frameworks/testunit_bad.rb +0 -9
- data/spec/fixtures/frameworks/testunit_good.rb +0 -9
- data/spec/fixtures/iso-8859.rb +0 -3
- data/spec/fixtures/never.rb +0 -2
- data/spec/fixtures/resultset1.rb +0 -4
- data/spec/fixtures/resultset2.rb +0 -4
- data/spec/fixtures/sample.rb +0 -16
- data/spec/fixtures/skipped.rb +0 -4
- data/spec/fixtures/skipped_and_executed.rb +0 -8
- data/spec/fixtures/utf-8.rb +0 -3
- data/spec/helper.rb +0 -26
- data/spec/last_run_spec.rb +0 -48
- data/spec/lines_classifier_spec.rb +0 -103
- data/spec/multi_formatter_spec.rb +0 -20
- data/spec/raw_coverage_spec.rb +0 -92
- data/spec/result_merger_spec.rb +0 -171
- data/spec/result_spec.rb +0 -209
- data/spec/return_codes_spec.rb +0 -34
- data/spec/simplecov_spec.rb +0 -109
- data/spec/source_file_line_spec.rb +0 -155
- data/spec/source_file_spec.rb +0 -145
- 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
|
data/spec/raw_coverage_spec.rb
DELETED
|
@@ -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
|
data/spec/result_merger_spec.rb
DELETED
|
@@ -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
|
data/spec/return_codes_spec.rb
DELETED
|
@@ -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
|