mutant 0.9.8 → 0.9.13
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/lib/mutant.rb +5 -2
- data/lib/mutant/ast.rb +0 -9
- data/lib/mutant/ast/find_metaclass_containing.rb +48 -0
- data/lib/mutant/ast/meta/send.rb +0 -6
- data/lib/mutant/bootstrap.rb +14 -37
- data/lib/mutant/cli.rb +11 -49
- data/lib/mutant/config.rb +0 -8
- data/lib/mutant/context.rb +0 -3
- data/lib/mutant/env.rb +0 -6
- data/lib/mutant/expression/method.rb +6 -6
- data/lib/mutant/expression/methods.rb +6 -6
- data/lib/mutant/expression/parser.rb +0 -6
- data/lib/mutant/integration.rb +0 -18
- data/lib/mutant/isolation.rb +1 -1
- data/lib/mutant/isolation/fork.rb +2 -24
- data/lib/mutant/isolation/none.rb +1 -1
- data/lib/mutant/license.rb +11 -0
- data/lib/mutant/matcher.rb +0 -14
- data/lib/mutant/matcher/config.rb +2 -11
- data/lib/mutant/matcher/method.rb +0 -31
- data/lib/mutant/matcher/method/instance.rb +0 -8
- data/lib/mutant/matcher/method/metaclass.rb +86 -0
- data/lib/mutant/matcher/method/singleton.rb +0 -25
- data/lib/mutant/matcher/methods.rb +17 -28
- data/lib/mutant/matcher/namespace.rb +0 -10
- data/lib/mutant/matcher/scope.rb +2 -4
- data/lib/mutant/meta/example/dsl.rb +0 -21
- data/lib/mutant/meta/example/verification.rb +0 -20
- data/lib/mutant/minitest/coverage.rb +53 -0
- data/lib/mutant/mutation.rb +0 -3
- data/lib/mutant/mutator.rb +1 -29
- data/lib/mutant/mutator/node.rb +1 -66
- data/lib/mutant/mutator/node/and_asgn.rb +0 -3
- data/lib/mutant/mutator/node/argument.rb +0 -15
- data/lib/mutant/mutator/node/arguments.rb +0 -20
- data/lib/mutant/mutator/node/begin.rb +0 -3
- data/lib/mutant/mutator/node/binary.rb +0 -23
- data/lib/mutant/mutator/node/block.rb +0 -15
- data/lib/mutant/mutator/node/block_pass.rb +29 -0
- data/lib/mutant/mutator/node/break.rb +0 -3
- data/lib/mutant/mutator/node/case.rb +0 -9
- data/lib/mutant/mutator/node/class.rb +0 -3
- data/lib/mutant/mutator/node/conditional_loop.rb +0 -3
- data/lib/mutant/mutator/node/const.rb +0 -3
- data/lib/mutant/mutator/node/define.rb +0 -11
- data/lib/mutant/mutator/node/defined.rb +0 -3
- data/lib/mutant/mutator/node/dstr.rb +0 -3
- data/lib/mutant/mutator/node/dsym.rb +0 -3
- data/lib/mutant/mutator/node/generic.rb +0 -3
- data/lib/mutant/mutator/node/if.rb +0 -12
- data/lib/mutant/mutator/node/index.rb +0 -27
- data/lib/mutant/mutator/node/kwbegin.rb +0 -3
- data/lib/mutant/mutator/node/literal.rb +0 -3
- data/lib/mutant/mutator/node/literal/array.rb +0 -6
- data/lib/mutant/mutator/node/literal/boolean.rb +0 -4
- data/lib/mutant/mutator/node/literal/float.rb +0 -9
- data/lib/mutant/mutator/node/literal/hash.rb +0 -9
- data/lib/mutant/mutator/node/literal/integer.rb +0 -9
- data/lib/mutant/mutator/node/literal/nil.rb +0 -3
- data/lib/mutant/mutator/node/literal/range.rb +4 -7
- data/lib/mutant/mutator/node/literal/regex.rb +0 -6
- data/lib/mutant/mutator/node/literal/string.rb +0 -3
- data/lib/mutant/mutator/node/literal/symbol.rb +0 -3
- data/lib/mutant/mutator/node/masgn.rb +0 -3
- data/lib/mutant/mutator/node/match_current_line.rb +0 -3
- data/lib/mutant/mutator/node/mlhs.rb +0 -3
- data/lib/mutant/mutator/node/named_value/access.rb +2 -14
- data/lib/mutant/mutator/node/named_value/constant_assignment.rb +0 -9
- data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -6
- data/lib/mutant/mutator/node/next.rb +0 -3
- data/lib/mutant/mutator/node/noop.rb +1 -4
- data/lib/mutant/mutator/node/nthref.rb +0 -3
- data/lib/mutant/mutator/node/op_asgn.rb +0 -3
- data/lib/mutant/mutator/node/or_asgn.rb +0 -3
- data/lib/mutant/mutator/node/procarg_zero.rb +0 -3
- data/lib/mutant/mutator/node/regopt.rb +0 -6
- data/lib/mutant/mutator/node/resbody.rb +0 -6
- data/lib/mutant/mutator/node/rescue.rb +2 -19
- data/lib/mutant/mutator/node/return.rb +0 -3
- data/lib/mutant/mutator/node/sclass.rb +20 -0
- data/lib/mutant/mutator/node/send.rb +26 -61
- data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -9
- data/lib/mutant/mutator/node/send/binary.rb +0 -11
- data/lib/mutant/mutator/node/send/conditional.rb +0 -3
- data/lib/mutant/mutator/node/splat.rb +0 -3
- data/lib/mutant/mutator/node/super.rb +0 -3
- data/lib/mutant/mutator/node/when.rb +0 -19
- data/lib/mutant/mutator/node/yield.rb +0 -3
- data/lib/mutant/mutator/node/zsuper.rb +0 -3
- data/lib/mutant/mutator/util/array.rb +0 -6
- data/lib/mutant/mutator/util/symbol.rb +0 -3
- data/lib/mutant/parallel.rb +0 -13
- data/lib/mutant/parallel/driver.rb +0 -10
- data/lib/mutant/parallel/worker.rb +0 -22
- data/lib/mutant/reporter/cli.rb +0 -5
- data/lib/mutant/reporter/cli/format.rb +0 -9
- data/lib/mutant/reporter/cli/printer.rb +2 -42
- data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -15
- data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -21
- data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -5
- data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -22
- data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -8
- data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -9
- data/lib/mutant/repository/diff.rb +1 -13
- data/lib/mutant/repository/diff/ranges.rb +0 -11
- data/lib/mutant/result.rb +0 -3
- data/lib/mutant/runner.rb +0 -18
- data/lib/mutant/runner/sink.rb +0 -5
- data/lib/mutant/subject.rb +0 -8
- data/lib/mutant/subject/method.rb +0 -3
- data/lib/mutant/subject/method/instance.rb +40 -6
- data/lib/mutant/subject/method/metaclass.rb +30 -0
- data/lib/mutant/transform.rb +0 -92
- data/lib/mutant/version.rb +1 -1
- data/lib/mutant/warnings.rb +0 -6
- data/lib/mutant/zombifier.rb +2 -34
- metadata +61 -333
- data/.github/workflows/ci.yml +0 -121
- data/.gitignore +0 -38
- data/.rspec +0 -5
- data/.rubocop.yml +0 -7
- data/Changelog.md +0 -75
- data/Gemfile +0 -7
- data/Gemfile.lock +0 -167
- data/Gemfile.shared +0 -10
- data/README.md +0 -138
- data/Rakefile +0 -5
- data/config/devtools.yml +0 -2
- data/config/reek.yml +0 -138
- data/config/rubocop.yml +0 -205
- data/config/yardstick.yml +0 -2
- data/docs/commercial-support.md +0 -14
- data/docs/concurrency.md +0 -39
- data/docs/incremental.md +0 -76
- data/docs/known-problems.md +0 -30
- data/docs/limitations.md +0 -50
- data/docs/mutant-minitest.md +0 -149
- data/docs/mutant-rspec.md +0 -130
- data/docs/nomenclature.md +0 -82
- data/docs/reading-reports.md +0 -74
- data/lib/mutant/color.rb +0 -43
- data/lib/mutant/diff.rb +0 -114
- data/meta/and.rb +0 -15
- data/meta/and_asgn.rb +0 -14
- data/meta/array.rb +0 -30
- data/meta/begin.rb +0 -23
- data/meta/block.rb +0 -202
- data/meta/block_pass.rb +0 -8
- data/meta/blockarg.rb +0 -10
- data/meta/break.rb +0 -10
- data/meta/case.rb +0 -223
- data/meta/casgn.rb +0 -28
- data/meta/cbase.rb +0 -8
- data/meta/class.rb +0 -12
- data/meta/const.rb +0 -17
- data/meta/csend.rb +0 -10
- data/meta/cvar.rb +0 -7
- data/meta/cvasgn.rb +0 -10
- data/meta/date.rb +0 -59
- data/meta/def.rb +0 -203
- data/meta/defined.rb +0 -9
- data/meta/dstr.rb +0 -13
- data/meta/dsym.rb +0 -14
- data/meta/ensure.rb +0 -9
- data/meta/false.rb +0 -8
- data/meta/file.rb +0 -5
- data/meta/float.rb +0 -37
- data/meta/gvar.rb +0 -7
- data/meta/gvasgn.rb +0 -10
- data/meta/hash.rb +0 -24
- data/meta/if.rb +0 -77
- data/meta/index.rb +0 -133
- data/meta/indexasgn.rb +0 -31
- data/meta/int.rb +0 -18
- data/meta/ivar.rb +0 -8
- data/meta/ivasgn.rb +0 -23
- data/meta/kwarg.rb +0 -10
- data/meta/kwbegin.rb +0 -9
- data/meta/kwoptarg.rb +0 -13
- data/meta/lambda.rb +0 -23
- data/meta/line.rb +0 -5
- data/meta/lvar.rb +0 -16
- data/meta/lvasgn.rb +0 -25
- data/meta/masgn.rb +0 -7
- data/meta/match_current_line.rb +0 -15
- data/meta/next.rb +0 -11
- data/meta/nil.rb +0 -5
- data/meta/nthref.rb +0 -14
- data/meta/op_assgn.rb +0 -17
- data/meta/or.rb +0 -15
- data/meta/or_asgn.rb +0 -50
- data/meta/range.rb +0 -39
- data/meta/redo.rb +0 -5
- data/meta/regexp.rb +0 -81
- data/meta/regopt.rb +0 -10
- data/meta/rescue.rb +0 -90
- data/meta/return.rb +0 -16
- data/meta/self.rb +0 -7
- data/meta/send.rb +0 -604
- data/meta/str.rb +0 -7
- data/meta/super.rb +0 -27
- data/meta/sym.rb +0 -8
- data/meta/true.rb +0 -8
- data/meta/until.rb +0 -17
- data/meta/while.rb +0 -26
- data/meta/yield.rb +0 -10
- data/mutant-minitest.gemspec +0 -22
- data/mutant-rspec.gemspec +0 -22
- data/mutant.gemspec +0 -41
- data/mutant.yml +0 -6
- data/spec/integration/mutant/corpus_spec.rb +0 -15
- data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
- data/spec/integration/mutant/minitest_spec.rb +0 -11
- data/spec/integration/mutant/null_spec.rb +0 -16
- data/spec/integration/mutant/rspec_spec.rb +0 -15
- data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
- data/spec/integrations.yml +0 -63
- data/spec/shared/base_behavior.rb +0 -45
- data/spec/shared/framework_integration_behavior.rb +0 -70
- data/spec/shared/method_matcher_behavior.rb +0 -47
- data/spec/spec_helper.rb +0 -75
- data/spec/support/corpus.rb +0 -318
- data/spec/support/file_system.rb +0 -62
- data/spec/support/ice_nine_config.rb +0 -10
- data/spec/support/ruby_vm.rb +0 -84
- data/spec/support/shared_context.rb +0 -169
- data/spec/support/test_app.rb +0 -7
- data/spec/support/warnings.yml +0 -6
- data/spec/support/xspec.rb +0 -183
- data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
- data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
- data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
- data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
- data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
- data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
- data/spec/unit/mutant/ast_spec.rb +0 -57
- data/spec/unit/mutant/bootstrap_spec.rb +0 -216
- data/spec/unit/mutant/cli_spec.rb +0 -305
- data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
- data/spec/unit/mutant/config_spec.rb +0 -126
- data/spec/unit/mutant/context_spec.rb +0 -111
- data/spec/unit/mutant/diff_spec.rb +0 -189
- data/spec/unit/mutant/env_spec.rb +0 -229
- data/spec/unit/mutant/expression/method_spec.rb +0 -62
- data/spec/unit/mutant/expression/methods_spec.rb +0 -61
- data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
- data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
- data/spec/unit/mutant/expression/parser_spec.rb +0 -65
- data/spec/unit/mutant/expression_spec.rb +0 -45
- data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
- data/spec/unit/mutant/integration_spec.rb +0 -150
- data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
- data/spec/unit/mutant/isolation/none_spec.rb +0 -23
- data/spec/unit/mutant/isolation/result_spec.rb +0 -73
- data/spec/unit/mutant/license_spec.rb +0 -293
- data/spec/unit/mutant/loader_spec.rb +0 -79
- data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
- data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
- data/spec/unit/mutant/matcher/config_spec.rb +0 -47
- data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
- data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
- data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
- data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
- data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
- data/spec/unit/mutant/matcher/namespace_spec.rb +0 -37
- data/spec/unit/mutant/matcher/null_spec.rb +0 -12
- data/spec/unit/mutant/matcher/scope_spec.rb +0 -35
- data/spec/unit/mutant/matcher/static_spec.rb +0 -13
- data/spec/unit/mutant/matcher_spec.rb +0 -102
- data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
- data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
- data/spec/unit/mutant/meta/example_spec.rb +0 -34
- data/spec/unit/mutant/mutation_spec.rb +0 -140
- data/spec/unit/mutant/mutator/node_spec.rb +0 -52
- data/spec/unit/mutant/mutator_spec.rb +0 -21
- data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
- data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
- data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
- data/spec/unit/mutant/parallel_spec.rb +0 -115
- data/spec/unit/mutant/parser_spec.rb +0 -26
- data/spec/unit/mutant/range_spec.rb +0 -141
- data/spec/unit/mutant/registry_spec.rb +0 -74
- data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
- data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
- data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
- data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
- data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
- data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
- data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
- data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
- data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
- data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
- data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
- data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
- data/spec/unit/mutant/reporter/null_spec.rb +0 -14
- data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
- data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
- data/spec/unit/mutant/repository/diff_spec.rb +0 -122
- data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
- data/spec/unit/mutant/require_highjack_spec.rb +0 -73
- data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
- data/spec/unit/mutant/result/env_spec.rb +0 -161
- data/spec/unit/mutant/result/mutation_spec.rb +0 -70
- data/spec/unit/mutant/result/subject_spec.rb +0 -111
- data/spec/unit/mutant/result/test_spec.rb +0 -14
- data/spec/unit/mutant/result_spec.rb +0 -33
- data/spec/unit/mutant/runner/sink_spec.rb +0 -174
- data/spec/unit/mutant/runner_spec.rb +0 -121
- data/spec/unit/mutant/selector/expression_spec.rb +0 -62
- data/spec/unit/mutant/selector/null_spec.rb +0 -17
- data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
- data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
- data/spec/unit/mutant/subject_spec.rb +0 -93
- data/spec/unit/mutant/transform/array_spec.rb +0 -92
- data/spec/unit/mutant/transform/bool_spec.rb +0 -63
- data/spec/unit/mutant/transform/error_spec.rb +0 -132
- data/spec/unit/mutant/transform/exception_spec.rb +0 -44
- data/spec/unit/mutant/transform/hash_spec.rb +0 -236
- data/spec/unit/mutant/transform/index_spec.rb +0 -92
- data/spec/unit/mutant/transform/named_spec.rb +0 -49
- data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
- data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
- data/spec/unit/mutant/util/one_spec.rb +0 -22
- data/spec/unit/mutant/warnings_spec.rb +0 -89
- data/spec/unit/mutant/world_spec.rb +0 -63
- data/spec/unit/mutant/zombifier_spec.rb +0 -122
- data/test_app/.rspec +0 -1
- data/test_app/Gemfile.minitest +0 -4
- data/test_app/Gemfile.rspec3.8 +0 -7
- data/test_app/lib/test_app.rb +0 -109
- data/test_app/lib/test_app/literal.rb +0 -35
- data/test_app/spec/spec_helper.rb +0 -9
- data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
- data/test_app/test/unit/test_app/literal_test.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8a634036241e157b66b8778d1645bca99d67cd81fa26042c42e43f868bafa260
|
4
|
+
data.tar.gz: ee46dcacd412e10634454dbdd5ec52d5a803c71fa8e9db9cc3fcdc35e35a8e5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0d20d48dc5443ba2347c176425ec372ed2d4e2f11e0bea33c59895b9b52d00b4efcdd07e8f9b47eefbd2ebd8f20d610f3ed3a726d9d59bbed1378b2be2fea1f
|
7
|
+
data.tar.gz: e4ad2f3d626eaae68f390447ad94cdf1338525f010f684f524873cfab6560d25ffb67062f6f2567750c9468670241d5180ba1a8bcc32fe7e42fc16cd3ff2c4ef
|
data/lib/mutant.rb
CHANGED
@@ -51,6 +51,7 @@ require 'mutant/ast/types'
|
|
51
51
|
require 'mutant/ast/nodes'
|
52
52
|
require 'mutant/ast/named_children'
|
53
53
|
require 'mutant/ast/node_predicates'
|
54
|
+
require 'mutant/ast/find_metaclass_containing'
|
54
55
|
require 'mutant/ast/meta'
|
55
56
|
require 'mutant/ast/meta/send'
|
56
57
|
require 'mutant/ast/meta/const'
|
@@ -112,12 +113,14 @@ require 'mutant/mutator/node/send/conditional'
|
|
112
113
|
require 'mutant/mutator/node/send/attribute_assignment'
|
113
114
|
require 'mutant/mutator/node/when'
|
114
115
|
require 'mutant/mutator/node/class'
|
116
|
+
require 'mutant/mutator/node/sclass'
|
115
117
|
require 'mutant/mutator/node/define'
|
116
118
|
require 'mutant/mutator/node/mlhs'
|
117
119
|
require 'mutant/mutator/node/nthref'
|
118
120
|
require 'mutant/mutator/node/masgn'
|
119
121
|
require 'mutant/mutator/node/return'
|
120
122
|
require 'mutant/mutator/node/block'
|
123
|
+
require 'mutant/mutator/node/block_pass'
|
121
124
|
require 'mutant/mutator/node/if'
|
122
125
|
require 'mutant/mutator/node/case'
|
123
126
|
require 'mutant/mutator/node/splat'
|
@@ -134,11 +137,13 @@ require 'mutant/subject'
|
|
134
137
|
require 'mutant/subject/method'
|
135
138
|
require 'mutant/subject/method/instance'
|
136
139
|
require 'mutant/subject/method/singleton'
|
140
|
+
require 'mutant/subject/method/metaclass'
|
137
141
|
require 'mutant/matcher'
|
138
142
|
require 'mutant/matcher/config'
|
139
143
|
require 'mutant/matcher/chain'
|
140
144
|
require 'mutant/matcher/method'
|
141
145
|
require 'mutant/matcher/method/singleton'
|
146
|
+
require 'mutant/matcher/method/metaclass'
|
142
147
|
require 'mutant/matcher/method/instance'
|
143
148
|
require 'mutant/matcher/methods'
|
144
149
|
require 'mutant/matcher/namespace'
|
@@ -161,8 +166,6 @@ require 'mutant/selector/expression'
|
|
161
166
|
require 'mutant/selector/null'
|
162
167
|
require 'mutant/config'
|
163
168
|
require 'mutant/cli'
|
164
|
-
require 'mutant/color'
|
165
|
-
require 'mutant/diff'
|
166
169
|
require 'mutant/runner'
|
167
170
|
require 'mutant/runner/sink'
|
168
171
|
require 'mutant/result'
|
data/lib/mutant/ast.rb
CHANGED
@@ -27,15 +27,6 @@ module Mutant
|
|
27
27
|
path
|
28
28
|
end
|
29
29
|
|
30
|
-
# Walk all ast nodes keeping track of path
|
31
|
-
#
|
32
|
-
# @param [Parser::AST::Node] root
|
33
|
-
# @param [Array<Parser::AST::Node>] stack
|
34
|
-
#
|
35
|
-
# @yield [Parser::AST::Node]
|
36
|
-
# all nodes visited recursively including root
|
37
|
-
#
|
38
|
-
# @return [undefined]
|
39
30
|
def self.walk(node, stack, &block)
|
40
31
|
block.call(node, stack)
|
41
32
|
node.children.grep(::Parser::AST::Node) do |child|
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
module AST
|
5
|
+
# Given an AST, finds the sclass that directly(-ish) contains the provided
|
6
|
+
# node.
|
7
|
+
# This won't match arbitrarily complex structures - it only searches the
|
8
|
+
# first level deep (no begins-in-begins, for example). This is in
|
9
|
+
# keeping with mutant generally not supporting 'weird' syntax.
|
10
|
+
# Descending into 'begin' nodes is supported because these are generated for
|
11
|
+
# the one-line syntax class << self; def foo; end
|
12
|
+
class FindMetaclassContaining
|
13
|
+
include NodePredicates, Concord.new(:root, :target), Procto.call
|
14
|
+
|
15
|
+
SCLASS_BODY_INDEX = 1
|
16
|
+
|
17
|
+
private_constant(*constants(false))
|
18
|
+
|
19
|
+
# Find metaclass node containing target node
|
20
|
+
#
|
21
|
+
# @return [Parser::AST::Node, nil]
|
22
|
+
#
|
23
|
+
# @api private
|
24
|
+
def call
|
25
|
+
AST.find_last_path(root) do |current|
|
26
|
+
next unless n_sclass?(current)
|
27
|
+
|
28
|
+
metaclass_of?(current)
|
29
|
+
end.last
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def metaclass_of?(sclass)
|
35
|
+
body = sclass.children.fetch(SCLASS_BODY_INDEX)
|
36
|
+
body.equal?(target) || transparently_contains?(body)
|
37
|
+
end
|
38
|
+
|
39
|
+
def transparently_contains?(body)
|
40
|
+
n_begin?(body) && include_exact?(body.children, target)
|
41
|
+
end
|
42
|
+
|
43
|
+
def include_exact?(haystack, needle)
|
44
|
+
haystack.any? { |elem| elem.equal?(needle) }
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/mutant/ast/meta/send.rb
CHANGED
@@ -56,16 +56,10 @@ module Mutant
|
|
56
56
|
|
57
57
|
private
|
58
58
|
|
59
|
-
# Test if node is `proc { ... }`
|
60
|
-
#
|
61
|
-
# @return [Boolean]
|
62
59
|
def naked_proc?
|
63
60
|
!receiver && selector.equal?(:proc)
|
64
61
|
end
|
65
62
|
|
66
|
-
# Test if node is `Proc.new { ... }`
|
67
|
-
#
|
68
|
-
# @return [Boolean]
|
69
63
|
def proc_new?
|
70
64
|
receiver &&
|
71
65
|
selector.equal?(:new) &&
|
data/lib/mutant/bootstrap.rb
CHANGED
@@ -36,7 +36,7 @@ module Mutant
|
|
36
36
|
.tap(&method(:infect))
|
37
37
|
.with(matchable_scopes: matchable_scopes(world, config))
|
38
38
|
|
39
|
-
subjects = Matcher.from_config(env.config.matcher).call(env)
|
39
|
+
subjects = start_subject(env, Matcher.from_config(env.config.matcher).call(env))
|
40
40
|
|
41
41
|
Integration.setup(env).fmap do |integration|
|
42
42
|
env.with(
|
@@ -49,9 +49,19 @@ module Mutant
|
|
49
49
|
end
|
50
50
|
# rubocop:enable Metrics/MethodLength
|
51
51
|
|
52
|
-
|
53
|
-
|
54
|
-
|
52
|
+
def self.start_subject(env, subjects)
|
53
|
+
start_expressions = env.config.matcher.start_expressions
|
54
|
+
|
55
|
+
return subjects if start_expressions.empty?
|
56
|
+
|
57
|
+
subjects.drop_while do |subject|
|
58
|
+
start_expressions.none? do |expression|
|
59
|
+
expression.prefix?(subject.expression)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
private_class_method :start_subject
|
64
|
+
|
55
65
|
def self.infect(env)
|
56
66
|
config, world = env.config, env.world
|
57
67
|
|
@@ -60,12 +70,6 @@ module Mutant
|
|
60
70
|
end
|
61
71
|
private_class_method :infect
|
62
72
|
|
63
|
-
# Matchable scopes
|
64
|
-
#
|
65
|
-
# @param [World] world
|
66
|
-
# @param [Config] config
|
67
|
-
#
|
68
|
-
# @return [Array<Scope>]
|
69
73
|
def self.matchable_scopes(world, config)
|
70
74
|
scopes = world.object_space.each_object(Module).each_with_object([]) do |scope, aggregate|
|
71
75
|
expression = expression(config.reporter, config.expression_parser, scope) || next
|
@@ -76,15 +80,6 @@ module Mutant
|
|
76
80
|
end
|
77
81
|
private_class_method :matchable_scopes
|
78
82
|
|
79
|
-
# Scope name from scoping object
|
80
|
-
#
|
81
|
-
# @param [Class, Module] scope
|
82
|
-
#
|
83
|
-
# @return [String]
|
84
|
-
# if scope has a name and does not raise exceptions obtaining it
|
85
|
-
#
|
86
|
-
# @return [nil]
|
87
|
-
# otherwise
|
88
83
|
def self.scope_name(reporter, scope)
|
89
84
|
scope.name
|
90
85
|
rescue => exception
|
@@ -99,20 +94,7 @@ module Mutant
|
|
99
94
|
end
|
100
95
|
private_class_method :scope_name
|
101
96
|
|
102
|
-
# Try to turn scope into expression
|
103
|
-
#
|
104
|
-
# @param [Expression::Parser] expression_parser
|
105
|
-
# @param [Class, Module] scope
|
106
|
-
#
|
107
|
-
# @return [Expression]
|
108
|
-
# if scope can be represented in an expression
|
109
|
-
#
|
110
|
-
# @return [nil]
|
111
|
-
# otherwise
|
112
|
-
#
|
113
97
|
# rubocop:disable Metrics/MethodLength
|
114
|
-
#
|
115
|
-
# ignore :reek:LongParameterList
|
116
98
|
def self.expression(reporter, expression_parser, scope)
|
117
99
|
name = scope_name(reporter, scope) or return
|
118
100
|
|
@@ -132,11 +114,6 @@ module Mutant
|
|
132
114
|
private_class_method :expression
|
133
115
|
# rubocop:enable Metrics/MethodLength
|
134
116
|
|
135
|
-
# Write a semantics warning
|
136
|
-
#
|
137
|
-
# @return [undefined]
|
138
|
-
#
|
139
|
-
# ignore :reek:LongParameterList
|
140
117
|
def self.semantics_warning(reporter, format, options)
|
141
118
|
reporter.warn(SEMANTICS_MESSAGE_FORMAT % { message: format % options })
|
142
119
|
end
|
data/lib/mutant/cli.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
module Mutant
|
4
4
|
# Commandline parser / runner
|
5
|
+
#
|
6
|
+
# rubocop:disable Metrics/ClassLength
|
5
7
|
class CLI
|
6
8
|
include Concord.new(:world, :config)
|
7
9
|
|
@@ -88,23 +90,12 @@ module Mutant
|
|
88
90
|
|
89
91
|
private
|
90
92
|
|
91
|
-
# Parse matchers
|
92
|
-
#
|
93
|
-
# @param [Array<String>] expressions
|
94
|
-
#
|
95
|
-
# @return [undefined]
|
96
93
|
def parse_match_expressions(expressions)
|
97
94
|
expressions.each do |expression|
|
98
95
|
add_matcher(:match_expressions, config.expression_parser.apply(expression).from_right)
|
99
96
|
end
|
100
97
|
end
|
101
98
|
|
102
|
-
# Add environmental options
|
103
|
-
#
|
104
|
-
# @param [Object] opts
|
105
|
-
#
|
106
|
-
# @return [undefined]
|
107
|
-
#
|
108
99
|
# rubocop:disable Metrics/MethodLength
|
109
100
|
def add_environment_options(opts)
|
110
101
|
opts.separator('Environment:')
|
@@ -121,12 +112,8 @@ module Mutant
|
|
121
112
|
with(jobs: Integer(number))
|
122
113
|
end
|
123
114
|
end
|
115
|
+
# rubocop:enable Metrics/MethodLength
|
124
116
|
|
125
|
-
# Add mutation options
|
126
|
-
#
|
127
|
-
# @param [OptionParser] opts
|
128
|
-
#
|
129
|
-
# @return [undefined]
|
130
117
|
def add_mutation_options(opts)
|
131
118
|
opts.separator(nil)
|
132
119
|
opts.separator('Options:')
|
@@ -136,15 +123,14 @@ module Mutant
|
|
136
123
|
end
|
137
124
|
end
|
138
125
|
|
139
|
-
#
|
140
|
-
#
|
141
|
-
# @param [OptionParser] opts
|
142
|
-
#
|
143
|
-
# @return [undefined]
|
126
|
+
# rubocop:disable Metrics/MethodLength
|
144
127
|
def add_filter_options(opts)
|
145
128
|
opts.on('--ignore-subject EXPRESSION', 'Ignore subjects that match EXPRESSION as prefix') do |pattern|
|
146
129
|
add_matcher(:ignore_expressions, config.expression_parser.apply(pattern).from_right)
|
147
130
|
end
|
131
|
+
opts.on('--start-subject EXPRESSION', 'Start mutation testing at a specific subject') do |pattern|
|
132
|
+
add_matcher(:start_expressions, config.expression_parser.apply(pattern).from_right)
|
133
|
+
end
|
148
134
|
opts.on('--since REVISION', 'Only select subjects touched since REVISION') do |revision|
|
149
135
|
add_matcher(
|
150
136
|
:subject_filters,
|
@@ -154,12 +140,9 @@ module Mutant
|
|
154
140
|
)
|
155
141
|
end
|
156
142
|
end
|
143
|
+
# rubocop:enable Metrics/MethodLength
|
157
144
|
|
158
|
-
#
|
159
|
-
#
|
160
|
-
# @param [OptionParser] opts
|
161
|
-
#
|
162
|
-
# @return [undefined]
|
145
|
+
# rubocop:disable Metrics/MethodLength
|
163
146
|
def add_debug_options(opts)
|
164
147
|
opts.on('--fail-fast', 'Fail fast') do
|
165
148
|
with(fail_fast: true)
|
@@ -173,40 +156,19 @@ module Mutant
|
|
173
156
|
world.kernel.exit
|
174
157
|
end
|
175
158
|
end
|
159
|
+
# rubocop:enable Metrics/MethodLength
|
176
160
|
|
177
|
-
# With configuration
|
178
|
-
#
|
179
|
-
# @param [Hash<Symbol, Object>] attributes
|
180
|
-
#
|
181
|
-
# @return [undefined]
|
182
161
|
def with(attributes)
|
183
162
|
@config = config.with(attributes)
|
184
163
|
end
|
185
164
|
|
186
|
-
# Add configuration
|
187
|
-
#
|
188
|
-
# @param [Symbol] attribute
|
189
|
-
# the attribute to add to
|
190
|
-
#
|
191
|
-
# @param [Object] value
|
192
|
-
# the value to add
|
193
|
-
#
|
194
|
-
# @return [undefined]
|
195
165
|
def add(attribute, value)
|
196
166
|
with(attribute => config.public_send(attribute) + [value])
|
197
167
|
end
|
198
168
|
|
199
|
-
# Add matcher configuration
|
200
|
-
#
|
201
|
-
# @param [Symbol] attribute
|
202
|
-
# the attribute to add to
|
203
|
-
#
|
204
|
-
# @param [Object] value
|
205
|
-
# the value to add
|
206
|
-
#
|
207
|
-
# @return [undefined]
|
208
169
|
def add_matcher(attribute, value)
|
209
170
|
with(matcher: config.matcher.add(attribute, value))
|
210
171
|
end
|
211
172
|
end # CLI
|
173
|
+
# rubocop:enable Metrics/ClassLength
|
212
174
|
end # Mutant
|
data/lib/mutant/config.rb
CHANGED
@@ -126,14 +126,6 @@ module Mutant
|
|
126
126
|
end
|
127
127
|
end
|
128
128
|
|
129
|
-
# Load contents of file
|
130
|
-
#
|
131
|
-
# @param [Pathname] path
|
132
|
-
#
|
133
|
-
# @return [Config]
|
134
|
-
#
|
135
|
-
# @raise [Either<String, Hash{Symbol => Object}>]
|
136
|
-
# in case of config file error
|
137
129
|
def self.load_contents(path)
|
138
130
|
Transform::Named
|
139
131
|
.new(path.to_s, TRANSFORM)
|
data/lib/mutant/context.rb
CHANGED
data/lib/mutant/env.rb
CHANGED
@@ -126,12 +126,6 @@ module Mutant
|
|
126
126
|
|
127
127
|
private
|
128
128
|
|
129
|
-
# Kill mutation under isolation with integration
|
130
|
-
#
|
131
|
-
# @param [Mutation] mutation
|
132
|
-
# @param [Array<Test>] test
|
133
|
-
#
|
134
|
-
# @return [Result::Isolation]
|
135
129
|
def run_mutation_tests(mutation, tests)
|
136
130
|
config.isolation.call do
|
137
131
|
result = mutation.insert(world.kernel)
|
@@ -14,8 +14,8 @@ module Mutant
|
|
14
14
|
private(*anima.attribute_names)
|
15
15
|
|
16
16
|
MATCHERS = IceNine.deep_freeze(
|
17
|
-
'.' => Matcher::Methods::Singleton,
|
18
|
-
'#' => Matcher::Methods::Instance
|
17
|
+
'.' => [Matcher::Methods::Singleton, Matcher::Methods::Metaclass],
|
18
|
+
'#' => [Matcher::Methods::Instance]
|
19
19
|
)
|
20
20
|
|
21
21
|
METHOD_NAME_PATTERN = Regexp.union(
|
@@ -39,16 +39,16 @@ module Mutant
|
|
39
39
|
#
|
40
40
|
# @return [Matcher]
|
41
41
|
def matcher
|
42
|
-
|
42
|
+
matcher_candidates = MATCHERS.fetch(scope_symbol)
|
43
|
+
.map { |submatcher| submatcher.new(scope) }
|
44
|
+
|
45
|
+
methods_matcher = Matcher::Chain.new(matcher_candidates)
|
43
46
|
|
44
47
|
Matcher::Filter.new(methods_matcher, ->(subject) { subject.expression.eql?(self) })
|
45
48
|
end
|
46
49
|
|
47
50
|
private
|
48
51
|
|
49
|
-
# Scope object
|
50
|
-
#
|
51
|
-
# @return [Class, Method]
|
52
52
|
def scope
|
53
53
|
Object.const_get(scope_name)
|
54
54
|
end
|
@@ -13,8 +13,8 @@ module Mutant
|
|
13
13
|
private(*anima.attribute_names)
|
14
14
|
|
15
15
|
MATCHERS = IceNine.deep_freeze(
|
16
|
-
'.' => Matcher::Methods::Singleton,
|
17
|
-
'#' => Matcher::Methods::Instance
|
16
|
+
'.' => [Matcher::Methods::Singleton, Matcher::Methods::Metaclass],
|
17
|
+
'#' => [Matcher::Methods::Instance]
|
18
18
|
)
|
19
19
|
private_constant(*constants(false))
|
20
20
|
|
@@ -32,7 +32,10 @@ module Mutant
|
|
32
32
|
#
|
33
33
|
# @return [Matcher::Method]
|
34
34
|
def matcher
|
35
|
-
MATCHERS.fetch(scope_symbol)
|
35
|
+
matcher_candidates = MATCHERS.fetch(scope_symbol)
|
36
|
+
.map { |submatcher| submatcher.new(scope) }
|
37
|
+
|
38
|
+
Matcher::Chain.new(matcher_candidates)
|
36
39
|
end
|
37
40
|
|
38
41
|
# Length of match with other expression
|
@@ -50,9 +53,6 @@ module Mutant
|
|
50
53
|
|
51
54
|
private
|
52
55
|
|
53
|
-
# Scope object
|
54
|
-
#
|
55
|
-
# @return [Class, Method]
|
56
56
|
def scope
|
57
57
|
Object.const_get(scope_name)
|
58
58
|
end
|