mutant 0.5.26 → 0.6.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 +4 -4
- data/.rspec +1 -0
- data/.travis.yml +1 -0
- data/Changelog.md +16 -3
- data/Gemfile +0 -2
- data/Gemfile.devtools +2 -2
- data/README.md +9 -15
- data/bin/mutant +0 -1
- data/config/flay.yml +1 -1
- data/config/flog.yml +1 -1
- data/config/mutant.yml +1 -1
- data/config/reek.yml +14 -11
- data/config/rubocop.yml +1 -1
- data/lib/mutant.rb +22 -21
- data/lib/mutant/ast.rb +47 -0
- data/lib/mutant/cli.rb +7 -4
- data/lib/mutant/config.rb +1 -0
- data/lib/mutant/context.rb +1 -1
- data/lib/mutant/diff.rb +38 -7
- data/lib/mutant/env.rb +22 -3
- data/lib/mutant/expression.rb +15 -4
- data/lib/mutant/integration.rb +1 -1
- data/lib/mutant/isolation.rb +2 -4
- data/lib/mutant/matcher.rb +1 -1
- data/lib/mutant/matcher/method.rb +1 -1
- data/lib/mutant/matcher/method/singleton.rb +1 -1
- data/lib/mutant/matcher/methods.rb +0 -2
- data/lib/mutant/meta/example.rb +0 -2
- data/lib/mutant/meta/example/dsl.rb +1 -1
- data/lib/mutant/mutator.rb +1 -1
- data/lib/mutant/mutator/node.rb +3 -3
- data/lib/mutant/mutator/node/begin.rb +1 -1
- data/lib/mutant/mutator/node/block.rb +16 -3
- data/lib/mutant/mutator/node/if.rb +1 -1
- data/lib/mutant/mutator/node/literal/fixnum.rb +1 -1
- data/lib/mutant/mutator/node/resbody.rb +0 -2
- data/lib/mutant/mutator/node/send.rb +17 -7
- data/lib/mutant/mutator/node/send/index.rb +0 -2
- data/lib/mutant/mutator/registry.rb +1 -1
- data/lib/mutant/mutator/util.rb +1 -1
- data/lib/mutant/mutator/util/array.rb +1 -1
- data/lib/mutant/reporter.rb +13 -3
- data/lib/mutant/reporter/cli.rb +54 -8
- data/lib/mutant/reporter/cli/format.rb +197 -0
- data/lib/mutant/reporter/cli/printer.rb +402 -22
- data/lib/mutant/reporter/cli/tput.rb +27 -0
- data/lib/mutant/reporter/null.rb +4 -34
- data/lib/mutant/reporter/trace.rb +6 -38
- data/lib/mutant/result.rb +44 -56
- data/lib/mutant/runner.rb +99 -52
- data/lib/mutant/runner/collector.rb +134 -0
- data/lib/mutant/subject/method/instance.rb +12 -4
- data/lib/mutant/version.rb +1 -1
- data/lib/mutant/warning_filter.rb +0 -2
- data/lib/mutant/zombifier/file.rb +1 -1
- data/meta/block.rb +17 -1
- data/meta/send.rb +123 -1
- data/mutant-rspec.gemspec +3 -3
- data/mutant.gemspec +1 -1
- data/spec/integration/mutant/corpus_spec.rb +4 -195
- data/spec/integration/mutant/null_spec.rb +1 -3
- data/spec/integration/mutant/rspec_spec.rb +1 -3
- data/spec/integration/mutant/test_mutator_handles_types_spec.rb +1 -3
- data/spec/integration/mutant/zombie_spec.rb +1 -3
- data/spec/integrations.yml +7 -0
- data/spec/shared/method_matcher_behavior.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/support/compress_helper.rb +1 -0
- data/spec/support/corpus.rb +239 -0
- data/spec/support/mutation_verifier.rb +2 -4
- data/spec/unit/mutant/cli_spec.rb +20 -13
- data/spec/unit/mutant/context/root_spec.rb +1 -3
- data/spec/unit/mutant/context/scope/root_spec.rb +1 -3
- data/spec/unit/mutant/context/scope/unqualified_name_spec.rb +1 -3
- data/spec/unit/mutant/diff_spec.rb +37 -19
- data/spec/unit/mutant/expression/method_spec.rb +5 -7
- data/spec/unit/mutant/expression/methods_spec.rb +5 -7
- data/spec/unit/mutant/expression/namespace/flat_spec.rb +6 -8
- data/spec/unit/mutant/expression/namespace/recursive_spec.rb +6 -7
- data/spec/unit/mutant/expression_spec.rb +14 -5
- data/spec/unit/mutant/integration_spec.rb +14 -3
- data/spec/unit/mutant/isolation_spec.rb +2 -4
- data/spec/unit/mutant/loader/eval_spec.rb +1 -3
- data/spec/unit/mutant/matcher/chain_spec.rb +1 -3
- data/spec/unit/mutant/matcher/compiler/subject_prefix_spec.rb +21 -0
- data/spec/unit/mutant/matcher/compiler_spec.rb +28 -3
- data/spec/unit/mutant/matcher/filter_spec.rb +1 -3
- data/spec/unit/mutant/matcher/method/instance_spec.rb +3 -5
- data/spec/unit/mutant/matcher/method/singleton_spec.rb +22 -4
- data/spec/unit/mutant/matcher/methods/instance_spec.rb +7 -6
- data/spec/unit/mutant/matcher/methods/singleton_spec.rb +4 -6
- data/spec/unit/mutant/matcher/namespace_spec.rb +1 -3
- data/spec/unit/mutant/matcher/null_spec.rb +1 -3
- data/spec/unit/mutant/mutation_spec.rb +1 -3
- data/spec/unit/mutant/mutator/node_spec.rb +1 -3
- data/spec/unit/mutant/reporter/cli_spec.rb +444 -206
- data/spec/unit/mutant/reporter/null_spec.rb +1 -3
- data/spec/unit/mutant/require_highjack_spec.rb +1 -3
- data/spec/unit/mutant/runner_spec.rb +42 -28
- data/spec/unit/mutant/subject/context_spec.rb +1 -3
- data/spec/unit/mutant/subject/method/instance_spec.rb +27 -19
- data/spec/unit/mutant/subject/method/singleton_spec.rb +49 -17
- data/spec/unit/mutant/subject_spec.rb +1 -3
- data/spec/unit/mutant/test_spec.rb +1 -3
- data/spec/unit/mutant/warning_expectation.rb +1 -3
- data/spec/unit/mutant/warning_filter_spec.rb +1 -3
- data/spec/unit/mutant_spec.rb +13 -3
- data/test_app/Gemfile.devtools +2 -2
- data/test_app/spec/unit/test_app/literal/string_spec.rb +1 -1
- metadata +10 -21
- data/lib/mutant/matcher/method/finder.rb +0 -72
- data/lib/mutant/reporter/cli/progress.rb +0 -10
- data/lib/mutant/reporter/cli/progress/config.rb +0 -30
- data/lib/mutant/reporter/cli/progress/env.rb +0 -30
- data/lib/mutant/reporter/cli/progress/noop.rb +0 -27
- data/lib/mutant/reporter/cli/progress/result.rb +0 -12
- data/lib/mutant/reporter/cli/progress/result/mutation.rb +0 -45
- data/lib/mutant/reporter/cli/progress/result/subject.rb +0 -54
- data/lib/mutant/reporter/cli/progress/subject.rb +0 -27
- data/lib/mutant/reporter/cli/registry.rb +0 -81
- data/lib/mutant/reporter/cli/report.rb +0 -10
- data/lib/mutant/reporter/cli/report/env.rb +0 -92
- data/lib/mutant/reporter/cli/report/mutation.rb +0 -103
- data/lib/mutant/reporter/cli/report/subject.rb +0 -32
- data/lib/mutant/reporter/cli/report/test.rb +0 -28
- data/lib/mutant/walker.rb +0 -53
- data/spec/shared/mutator_behavior.rb +0 -55
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: b4c622c635f57a57ea3d7463d71da71c84450a8e
|
|
4
|
+
data.tar.gz: 4147047e1dd38d1115f415e5cb8e2eebba932c6d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fd80ff4f0469e2bf182c5060fe4696ce48373c014dd76dc083fc1a210812908c201c344afa6f34ec066c5714e0ad1a6f94ca436eb5c31fb9cf92d76b072c8467
|
|
7
|
+
data.tar.gz: 54779c5e90ebc0f5f909ae8b485eecb92da095e0abaf9f28d214d500ee2f0ea4d8e836b8cc17d9abe8a9b034b89de5651487ceeb25dd347c1e0a9864d5c444cb
|
data/.rspec
CHANGED
data/.travis.yml
CHANGED
data/Changelog.md
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
|
+
# v0.6.0 2014-07-17
|
|
2
|
+
|
|
3
|
+
* Parallel execution / reporting.
|
|
4
|
+
* Add -j, --jobs flag to control concurrency.
|
|
5
|
+
* Fix blind spots on send with block.
|
|
6
|
+
* Add mutation from `foo { bar }` to `bar`
|
|
7
|
+
* Add mutation from `#reverse_merge` to `#merge`
|
|
8
|
+
* Add mutation from `#<=` to `#<`, `#==`, `#eql?`, `#equal?`
|
|
9
|
+
* Add mutation from `#>=` to `#>`, `#==`, `#eql?`, `#equal?`
|
|
10
|
+
* Add mutation from `#>` to `#==`, `#eql?`, `#equal?`
|
|
11
|
+
* Add mutation from `#<` to `#==`, `#eql?`, `#equal?`
|
|
12
|
+
* Fix reporting of diff errors to include context [tjchambers]
|
|
13
|
+
|
|
1
14
|
# v0.5.26 2014-07-07
|
|
2
15
|
|
|
3
16
|
* Fix exceptions generation matcher errors
|
|
@@ -63,7 +76,7 @@ Changes:
|
|
|
63
76
|
|
|
64
77
|
* Report selected tests in progress runner
|
|
65
78
|
* Fix scope of rspec selections to include meaningful parents.
|
|
66
|
-
* Add short
|
|
79
|
+
* Add short circuits on already dead mutations under multiple test selections.
|
|
67
80
|
|
|
68
81
|
# v0.5.16 2014-05-27
|
|
69
82
|
|
|
@@ -90,7 +103,7 @@ Changes:
|
|
|
90
103
|
|
|
91
104
|
Changes:
|
|
92
105
|
|
|
93
|
-
*
|
|
106
|
+
* Improve reporting of isolation problems
|
|
94
107
|
* Centralize test selection
|
|
95
108
|
* Report selected tests
|
|
96
109
|
* Report rspec output on noop failures
|
|
@@ -109,7 +122,7 @@ Changes:
|
|
|
109
122
|
* Fix crash on while and until without body
|
|
110
123
|
* Better require highjack based zombifier
|
|
111
124
|
* Do not mutate nthref $1 to gvar $0
|
|
112
|
-
* Use faster duplicate guarding hashing AST::Node
|
|
125
|
+
* Use faster duplicate guarding hashing AST::Node instances
|
|
113
126
|
* Fix lots of shadowed invalid ASTs
|
|
114
127
|
* Fix undefine initialize warnings, Closes #175
|
|
115
128
|
|
data/Gemfile
CHANGED
data/Gemfile.devtools
CHANGED
data/README.md
CHANGED
|
@@ -12,9 +12,8 @@ Mutant is a mutation testing tool for ruby.
|
|
|
12
12
|
The idea is that if code can be changed and your tests do not notice, either that code isn't being covered
|
|
13
13
|
or it does not have a speced side effect.
|
|
14
14
|
|
|
15
|
-
Mutant supports MRI and RBX 1.9 and 2.
|
|
15
|
+
Mutant supports MRI and RBX 1.9, 2.0 and 2.1, while support for jruby is planned.
|
|
16
16
|
It should also work under any ruby engine that supports POSIX-fork(2) semantics.
|
|
17
|
-
Support for MRI 2.1 is unstable, because this MRI release segfaults on basic metaprogramming mutants dependencies do.
|
|
18
17
|
|
|
19
18
|
Mutant uses a pure ruby [parser](https://github.com/whitequark/parser) and an [unparser](https://github.com/mbj/unparser)
|
|
20
19
|
to do its magic.
|
|
@@ -37,11 +36,6 @@ Blog-Posts
|
|
|
37
36
|
* http://www.sitepoint.com/mutation-testing-mutant/
|
|
38
37
|
* http://solnic.eu/2013/01/23/mutation-testing-with-mutant.html
|
|
39
38
|
|
|
40
|
-
Integrations
|
|
41
|
-
------------
|
|
42
|
-
|
|
43
|
-
rspec2 and rspec-3 are supported currently. Minitest support is still *planned*.
|
|
44
|
-
|
|
45
39
|
Projects using Mutant
|
|
46
40
|
---------------------
|
|
47
41
|
|
|
@@ -78,6 +72,8 @@ Please add an explicit dependency to `rspec-core` for the rspec version you want
|
|
|
78
72
|
gem install mutant-rspec
|
|
79
73
|
```
|
|
80
74
|
|
|
75
|
+
The minitest integration is still in the works.
|
|
76
|
+
|
|
81
77
|
Mutations
|
|
82
78
|
---------
|
|
83
79
|
|
|
@@ -143,20 +139,18 @@ Example for a subject like `Foo::Bar#baz` it will run all example groups with de
|
|
|
143
139
|
`Foo::Bar#baz`, `Foo::Bar` and `Foo`. The order is important, so if mutant finds example groups in the
|
|
144
140
|
current prefix level, these example groups *must* kill the mutation.
|
|
145
141
|
|
|
146
|
-
This test selection strategy is compatible with the old `--rspec-dm2` and `--rspec-unit` strategy.
|
|
147
|
-
The old flags were removed. It allows to define very fine grained specs, or coarse grained - as you like.
|
|
148
|
-
|
|
149
142
|
Support
|
|
150
143
|
-------
|
|
151
144
|
|
|
152
|
-
I'm very happy to receive/answer feedback/questions and
|
|
145
|
+
I'm very happy to receive/answer feedback/questions and criticism.
|
|
153
146
|
|
|
154
147
|
Your options:
|
|
155
148
|
|
|
156
|
-
* GitHub Issues
|
|
157
|
-
* Ping me on https://twitter.com/_m_b_j_
|
|
158
|
-
|
|
159
|
-
|
|
149
|
+
* [GitHub Issues](https://github.com/mbj/mutant/issues)
|
|
150
|
+
* Ping me on [twitter](https://twitter.com/_m_b_j_)
|
|
151
|
+
|
|
152
|
+
There is also the [#mutant] channel on freenode. As my OSS time budged is very limited I cannot
|
|
153
|
+
join it often. Please prefer to use github issues with a 'Question: ' prefix in title.
|
|
160
154
|
|
|
161
155
|
Credits
|
|
162
156
|
-------
|
data/bin/mutant
CHANGED
data/config/flay.yml
CHANGED
data/config/flog.yml
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
---
|
|
2
|
-
threshold:
|
|
2
|
+
threshold: 30.6
|
data/config/mutant.yml
CHANGED
|
@@ -5,7 +5,7 @@ expect_coverage: 62.08
|
|
|
5
5
|
ignore_subjects:
|
|
6
6
|
# Mutation causes infinite runtime
|
|
7
7
|
- Mutant::Runner.lookup
|
|
8
|
-
# Suboptimal test selection
|
|
8
|
+
# Suboptimal test selection strategy (will be fixed soon) causes timeouts on CI
|
|
9
9
|
- Mutant::Zombifier*
|
|
10
10
|
- Mutant::Reporter*
|
|
11
11
|
- Mutant::CLI*
|
data/config/reek.yml
CHANGED
|
@@ -12,6 +12,7 @@ ControlParameter:
|
|
|
12
12
|
enabled: true
|
|
13
13
|
exclude:
|
|
14
14
|
- Mutant::Expression#match_length
|
|
15
|
+
- Mutant::Reporter::CLI::Printer::SubjectProgress#print_mutation_result
|
|
15
16
|
DataClump:
|
|
16
17
|
enabled: true
|
|
17
18
|
exclude: []
|
|
@@ -28,9 +29,10 @@ FeatureEnvy:
|
|
|
28
29
|
# Nature of OptionParser :(
|
|
29
30
|
- Mutant::CLI#add_environment_options
|
|
30
31
|
- Mutant::Env#scope_name
|
|
32
|
+
- Mutant::Diff#minimized_hunks
|
|
31
33
|
- Mutant::Integration::Rspec#run
|
|
32
|
-
- Mutant::Integration::Rspec2#full_description
|
|
33
|
-
- Mutant::Integration::Rspec3#full_description
|
|
34
|
+
- Mutant::Integration::Rspec::Rspec2#full_description
|
|
35
|
+
- Mutant::Integration::Rspec::Rspec3#full_description
|
|
34
36
|
- Mutant::Matcher::Method::Instance#match?
|
|
35
37
|
- Mutant::Matcher::Method::Singleton#receiver?
|
|
36
38
|
- Mutant::Mutation::Evil#success?
|
|
@@ -39,6 +41,8 @@ FeatureEnvy:
|
|
|
39
41
|
- Mutant::Meta::Example::Verification#format_mutation
|
|
40
42
|
- Mutant::Reporter::CLI#subject_results
|
|
41
43
|
- Mutant::Runner#run_mutation_test
|
|
44
|
+
- Mutant::Runner#kill_mutation
|
|
45
|
+
- Mutant::Runner#finish
|
|
42
46
|
IrresponsibleModule:
|
|
43
47
|
enabled: true
|
|
44
48
|
exclude: []
|
|
@@ -46,6 +50,7 @@ LongParameterList:
|
|
|
46
50
|
enabled: true
|
|
47
51
|
exclude:
|
|
48
52
|
- Mutant::Matcher::Method::Instance#self.build?
|
|
53
|
+
- Mutant::Runner#finish # API client of parallel, one gets _ignored.
|
|
49
54
|
- Mutant::Runner#self.run
|
|
50
55
|
max_params: 2
|
|
51
56
|
LongYieldList:
|
|
@@ -61,10 +66,8 @@ NestedIterators:
|
|
|
61
66
|
- Mutant::Mutator::Util::Array::Element#dispatch
|
|
62
67
|
- Mutant::Mutator::Node::Resbody#mutate_captures
|
|
63
68
|
- Mutant::Mutator::Node::Arguments#emit_argument_mutations
|
|
64
|
-
- Mutant::Reporter::CLI::Report::Env#generic_stats
|
|
65
69
|
- Mutant::RequireHighjack#infect
|
|
66
70
|
- Mutant::RequireHighjack#desinfect
|
|
67
|
-
- Mutant::Reporter::CLI::Registry#included
|
|
68
71
|
- Mutant::Subject#tests
|
|
69
72
|
- Parser::Lexer#self.new
|
|
70
73
|
max_allowed_nesting: 1
|
|
@@ -81,9 +84,8 @@ RepeatedConditional:
|
|
|
81
84
|
TooManyInstanceVariables:
|
|
82
85
|
enabled: true
|
|
83
86
|
exclude:
|
|
84
|
-
- Mutant::CLI # 4 vars
|
|
85
|
-
- Mutant::Killer # 4 vars
|
|
86
87
|
- Mutant::Mutator # 4 vars
|
|
88
|
+
- Mutant::Runner # 4 vars
|
|
87
89
|
max_instance_variables: 3
|
|
88
90
|
TooManyMethods:
|
|
89
91
|
enabled: true
|
|
@@ -99,9 +101,9 @@ TooManyStatements:
|
|
|
99
101
|
exclude:
|
|
100
102
|
- Mutant#self.singleton_subclass_instance
|
|
101
103
|
- Mutant::Integration::Rspec#run
|
|
102
|
-
- Mutant::Reporter::CLI::Report::Env#run
|
|
103
|
-
- Mutant::Reporter::CLI::Registry#included
|
|
104
104
|
- Mutant::Reporter::CLI#colorized_diff
|
|
105
|
+
- Mutant::Reporter::CLI::Printer::EnvProgress#run
|
|
106
|
+
- Mutant::Reporter::CLI::Printer::Config#run
|
|
105
107
|
- Mutant::RequireHighjack#infect
|
|
106
108
|
- Mutant::Rspec::Killer#run
|
|
107
109
|
- Mutant::Runner#visit_collection
|
|
@@ -156,11 +158,12 @@ UtilityFunction:
|
|
|
156
158
|
- Mutant::CLI#reporter
|
|
157
159
|
- Mutant::Integration::Rspec#configuration
|
|
158
160
|
- Mutant::Integration::Rspec#options
|
|
159
|
-
- Mutant::Integration::Rspec2#full_description
|
|
160
|
-
- Mutant::Integration::Rspec2#new_reporter
|
|
161
|
-
- Mutant::Integration::Rspec3#full_description
|
|
161
|
+
- Mutant::Integration::Rspec::Rspec2#full_description
|
|
162
|
+
- Mutant::Integration::Rspec::Rspec2#new_reporter
|
|
163
|
+
- Mutant::Integration::Rspec::Rspec3#full_description
|
|
162
164
|
- Mutant::Meta::Example::Verification#format_mutation
|
|
163
165
|
- Mutant::Mutation::Evil#success?
|
|
164
166
|
- Mutant::Mutation::Neutral#success?
|
|
167
|
+
- Mutant::Reporter::CLI::Format::Progressive#new_buffer
|
|
165
168
|
- Mutant::Runner#run_mutation_test
|
|
166
169
|
max_helper_calls: 0
|
data/config/rubocop.yml
CHANGED
data/lib/mutant.rb
CHANGED
|
@@ -17,6 +17,7 @@ require 'anima'
|
|
|
17
17
|
require 'concord'
|
|
18
18
|
require 'morpher'
|
|
19
19
|
require 'parallel'
|
|
20
|
+
require 'open3'
|
|
20
21
|
|
|
21
22
|
# Library namespace
|
|
22
23
|
module Mutant
|
|
@@ -27,6 +28,16 @@ module Mutant
|
|
|
27
28
|
|
|
28
29
|
SCOPE_OPERATOR = '::'.freeze
|
|
29
30
|
|
|
31
|
+
# Test if CI is detected via environment
|
|
32
|
+
#
|
|
33
|
+
# @return [Boolean]
|
|
34
|
+
#
|
|
35
|
+
# @api private
|
|
36
|
+
#
|
|
37
|
+
def self.ci?
|
|
38
|
+
ENV.key?('CI')
|
|
39
|
+
end
|
|
40
|
+
|
|
30
41
|
# Lookup constant for location
|
|
31
42
|
#
|
|
32
43
|
# @param [String] location
|
|
@@ -91,7 +102,6 @@ require 'mutant/cache'
|
|
|
91
102
|
require 'mutant/delegator'
|
|
92
103
|
require 'mutant/warning_filter'
|
|
93
104
|
require 'mutant/warning_expectation'
|
|
94
|
-
require 'mutant/walker'
|
|
95
105
|
require 'mutant/require_highjack'
|
|
96
106
|
require 'mutant/isolation'
|
|
97
107
|
require 'mutant/mutator'
|
|
@@ -167,7 +177,6 @@ require 'mutant/matcher/config'
|
|
|
167
177
|
require 'mutant/matcher/compiler'
|
|
168
178
|
require 'mutant/matcher/chain'
|
|
169
179
|
require 'mutant/matcher/method'
|
|
170
|
-
require 'mutant/matcher/method/finder'
|
|
171
180
|
require 'mutant/matcher/method/singleton'
|
|
172
181
|
require 'mutant/matcher/method/instance'
|
|
173
182
|
require 'mutant/matcher/methods'
|
|
@@ -184,43 +193,35 @@ require 'mutant/integration'
|
|
|
184
193
|
require 'mutant/cli'
|
|
185
194
|
require 'mutant/color'
|
|
186
195
|
require 'mutant/diff'
|
|
196
|
+
require 'mutant/runner'
|
|
197
|
+
require 'mutant/runner/collector'
|
|
187
198
|
require 'mutant/result'
|
|
188
199
|
require 'mutant/reporter'
|
|
189
200
|
require 'mutant/reporter/null'
|
|
190
201
|
require 'mutant/reporter/trace'
|
|
191
202
|
require 'mutant/reporter/cli'
|
|
192
|
-
require 'mutant/reporter/cli/registry'
|
|
193
203
|
require 'mutant/reporter/cli/printer'
|
|
194
|
-
require 'mutant/reporter/cli/
|
|
195
|
-
require 'mutant/reporter/cli/
|
|
196
|
-
require 'mutant/reporter/cli/report/subject'
|
|
197
|
-
require 'mutant/reporter/cli/report/mutation'
|
|
198
|
-
require 'mutant/reporter/cli/report/test'
|
|
199
|
-
require 'mutant/reporter/cli/progress'
|
|
200
|
-
require 'mutant/reporter/cli/progress/env'
|
|
201
|
-
require 'mutant/reporter/cli/progress/config'
|
|
202
|
-
require 'mutant/reporter/cli/progress/subject'
|
|
203
|
-
require 'mutant/reporter/cli/progress/noop'
|
|
204
|
-
require 'mutant/reporter/cli/progress/result'
|
|
205
|
-
require 'mutant/reporter/cli/progress/result/mutation'
|
|
206
|
-
require 'mutant/reporter/cli/progress/result/subject'
|
|
207
|
-
require 'mutant/runner'
|
|
204
|
+
require 'mutant/reporter/cli/tput'
|
|
205
|
+
require 'mutant/reporter/cli/format'
|
|
208
206
|
require 'mutant/zombifier'
|
|
209
207
|
require 'mutant/zombifier/file'
|
|
210
208
|
|
|
211
209
|
module Mutant
|
|
212
|
-
#
|
|
210
|
+
# Reopen class to initialize constant to avoid dep circle
|
|
213
211
|
class Config
|
|
212
|
+
CI_DEFAULT_PROCESSOR_COUNT = 2
|
|
213
|
+
|
|
214
214
|
DEFAULT = new(
|
|
215
215
|
debug: false,
|
|
216
216
|
fail_fast: false,
|
|
217
217
|
integration: Integration::Null.new,
|
|
218
218
|
matcher_config: Matcher::Config::DEFAULT,
|
|
219
|
-
includes:
|
|
220
|
-
requires:
|
|
219
|
+
includes: EMPTY_ARRAY,
|
|
220
|
+
requires: EMPTY_ARRAY,
|
|
221
221
|
isolation: Mutant::Isolation::Fork,
|
|
222
|
-
reporter: Reporter::CLI.
|
|
222
|
+
reporter: Reporter::CLI.build($stdout),
|
|
223
223
|
zombie: false,
|
|
224
|
+
processes: Mutant.ci? ? CI_DEFAULT_PROCESSOR_COUNT : Parallel.processor_count,
|
|
224
225
|
expected_coverage: 100.0
|
|
225
226
|
)
|
|
226
227
|
end # Config
|
data/lib/mutant/ast.rb
CHANGED
|
@@ -1,5 +1,52 @@
|
|
|
1
1
|
module Mutant
|
|
2
2
|
# AST helpers
|
|
3
3
|
module AST
|
|
4
|
+
|
|
5
|
+
# Walk all ast nodes
|
|
6
|
+
#
|
|
7
|
+
# @param [Parser::AST::Node]
|
|
8
|
+
#
|
|
9
|
+
# @yield [Parser::AST::Node]
|
|
10
|
+
# all nodes recursively including root
|
|
11
|
+
#
|
|
12
|
+
# @return [self]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def self.walk(node, &block)
|
|
17
|
+
raise ArgumentError, 'block expected' unless block_given?
|
|
18
|
+
|
|
19
|
+
block.call(node)
|
|
20
|
+
node.children.grep(Parser::AST::Node).each do |child|
|
|
21
|
+
walk(child, &block)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
self
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Find last node satisfing predicate (as block)
|
|
28
|
+
#
|
|
29
|
+
# @return [Parser::AST::Node]
|
|
30
|
+
# if satisfing node is found
|
|
31
|
+
#
|
|
32
|
+
# @yield [Parser::AST::Node]
|
|
33
|
+
#
|
|
34
|
+
# @yieldreturn [Boolean]
|
|
35
|
+
# true in case node satisfies predicate
|
|
36
|
+
#
|
|
37
|
+
# @return [nil]
|
|
38
|
+
# otherwise
|
|
39
|
+
#
|
|
40
|
+
# @api private
|
|
41
|
+
#
|
|
42
|
+
def self.find_last(node, &predicate)
|
|
43
|
+
raise ArgumentError, 'block expected' unless block_given?
|
|
44
|
+
neddle = nil
|
|
45
|
+
walk(node) do |candidate|
|
|
46
|
+
neddle = candidate if predicate.call(candidate, &predicate)
|
|
47
|
+
end
|
|
48
|
+
neddle
|
|
49
|
+
end
|
|
50
|
+
|
|
4
51
|
end # AST
|
|
5
52
|
end # Mutant
|
data/lib/mutant/cli.rb
CHANGED
|
@@ -2,11 +2,11 @@ require 'optparse'
|
|
|
2
2
|
|
|
3
3
|
module Mutant
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# Commandline parser
|
|
6
6
|
class CLI
|
|
7
7
|
include Adamantium::Flat, Equalizer.new(:config), Procto.call(:config)
|
|
8
8
|
|
|
9
|
-
# Error
|
|
9
|
+
# Error failed when CLI argv is invalid
|
|
10
10
|
Error = Class.new(RuntimeError)
|
|
11
11
|
|
|
12
12
|
EXIT_FAILURE = 1
|
|
@@ -79,7 +79,7 @@ module Mutant
|
|
|
79
79
|
|
|
80
80
|
# Parse matchers
|
|
81
81
|
#
|
|
82
|
-
# @param [Array<String>]
|
|
82
|
+
# @param [Array<String>] expressions
|
|
83
83
|
#
|
|
84
84
|
# @return [undefined]
|
|
85
85
|
#
|
|
@@ -112,6 +112,9 @@ module Mutant
|
|
|
112
112
|
opts.on('-r', '--require NAME', 'Require file with NAME') do |name|
|
|
113
113
|
add(:requires, name)
|
|
114
114
|
end
|
|
115
|
+
opts.on('-j', '--jobs NUMBER', 'Number of kill processes. Defaults to number of processors.') do |number|
|
|
116
|
+
update(processes: Integer(number))
|
|
117
|
+
end
|
|
115
118
|
end
|
|
116
119
|
|
|
117
120
|
# Use integration
|
|
@@ -124,7 +127,7 @@ module Mutant
|
|
|
124
127
|
#
|
|
125
128
|
def setup_integration(name)
|
|
126
129
|
require "mutant/integration/#{name}"
|
|
127
|
-
update(integration: Integration.lookup(name)
|
|
130
|
+
update(integration: Integration.lookup(name))
|
|
128
131
|
end
|
|
129
132
|
|
|
130
133
|
# Add options
|