mutest 0.0.9 → 0.0.10
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/.circleci/config.yml +38 -0
- data/{config/rubocop.yml → .rubocop.yml} +80 -183
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -3
- data/Gemfile.lock +41 -52
- data/README.md +16 -0
- data/Rakefile +1 -1
- data/lib/mutest.rb +5 -4
- data/lib/mutest/actor.rb +7 -6
- data/lib/mutest/actor/env.rb +3 -3
- data/lib/mutest/actor/mailbox.rb +5 -4
- data/lib/mutest/actor/receiver.rb +6 -5
- data/lib/mutest/actor/sender.rb +5 -4
- data/lib/mutest/ast.rb +4 -3
- data/lib/mutest/ast/meta.rb +3 -3
- data/lib/mutest/ast/meta/const.rb +7 -5
- data/lib/mutest/ast/meta/optarg.rb +6 -5
- data/lib/mutest/ast/meta/resbody.rb +6 -5
- data/lib/mutest/ast/meta/restarg.rb +6 -5
- data/lib/mutest/ast/meta/send.rb +8 -20
- data/lib/mutest/ast/meta/symbol.rb +6 -5
- data/lib/mutest/ast/named_children.rb +5 -5
- data/lib/mutest/ast/node_predicates.rb +4 -4
- data/lib/mutest/ast/nodes.rb +3 -3
- data/lib/mutest/ast/regexp.rb +3 -3
- data/lib/mutest/ast/regexp/transformer.rb +19 -11
- data/lib/mutest/ast/regexp/transformer/alternative.rb +6 -6
- data/lib/mutest/ast/regexp/transformer/character_set.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/direct.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/options_group.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/quantifier.rb +11 -13
- data/lib/mutest/ast/regexp/transformer/recursive.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/root.rb +6 -6
- data/lib/mutest/ast/regexp/transformer/text.rb +7 -7
- data/lib/mutest/ast/sexp.rb +3 -3
- data/lib/mutest/ast/types.rb +8 -6
- data/lib/mutest/cli.rb +5 -3
- data/lib/mutest/color.rb +4 -3
- data/lib/mutest/config.rb +4 -3
- data/lib/mutest/context.rb +4 -3
- data/lib/mutest/diff.rb +5 -3
- data/lib/mutest/env.rb +5 -5
- data/lib/mutest/env/bootstrap.rb +7 -5
- data/lib/mutest/expression.rb +7 -5
- data/lib/mutest/expression/method.rb +4 -4
- data/lib/mutest/expression/methods.rb +4 -4
- data/lib/mutest/expression/namespace.rb +9 -8
- data/lib/mutest/expression/parser.rb +9 -8
- data/lib/mutest/integration.rb +5 -3
- data/lib/mutest/integration/null.rb +3 -3
- data/lib/mutest/isolation.rb +2 -2
- data/lib/mutest/isolation/fork.rb +4 -4
- data/lib/mutest/isolation/none.rb +4 -4
- data/lib/mutest/loader.rb +2 -2
- data/lib/mutest/matcher.rb +4 -3
- data/lib/mutest/matcher/chain.rb +3 -3
- data/lib/mutest/matcher/compiler.rb +7 -5
- data/lib/mutest/matcher/config.rb +5 -4
- data/lib/mutest/matcher/filter.rb +3 -3
- data/lib/mutest/matcher/method.rb +13 -13
- data/lib/mutest/matcher/method/instance.rb +6 -6
- data/lib/mutest/matcher/method/singleton.rb +5 -5
- data/lib/mutest/matcher/methods.rb +7 -6
- data/lib/mutest/matcher/namespace.rb +3 -3
- data/lib/mutest/matcher/null.rb +3 -3
- data/lib/mutest/matcher/scope.rb +3 -3
- data/lib/mutest/matcher/static.rb +3 -3
- data/lib/mutest/meta.rb +4 -4
- data/lib/mutest/meta/example.rb +5 -4
- data/lib/mutest/meta/example/dsl.rb +12 -11
- data/lib/mutest/meta/example/verification.rb +7 -6
- data/lib/mutest/mutation.rb +7 -6
- data/lib/mutest/mutator.rb +6 -6
- data/lib/mutest/mutator/node.rb +19 -7
- data/lib/mutest/mutator/node/and_asgn.rb +4 -4
- data/lib/mutest/mutator/node/argument.rb +6 -5
- data/lib/mutest/mutator/node/arguments.rb +18 -5
- data/lib/mutest/mutator/node/begin.rb +4 -4
- data/lib/mutest/mutator/node/binary.rb +4 -4
- data/lib/mutest/mutator/node/block.rb +6 -5
- data/lib/mutest/mutator/node/block_pass.rb +4 -4
- data/lib/mutest/mutator/node/break.rb +4 -4
- data/lib/mutest/mutator/node/case.rb +6 -4
- data/lib/mutest/mutator/node/class.rb +4 -4
- data/lib/mutest/mutator/node/conditional_loop.rb +4 -4
- data/lib/mutest/mutator/node/const.rb +4 -4
- data/lib/mutest/mutator/node/define.rb +6 -6
- data/lib/mutest/mutator/node/defined.rb +4 -4
- data/lib/mutest/mutator/node/dstr.rb +4 -4
- data/lib/mutest/mutator/node/dsym.rb +4 -4
- data/lib/mutest/mutator/node/generic.rb +5 -4
- data/lib/mutest/mutator/node/if.rb +6 -4
- data/lib/mutest/mutator/node/index.rb +128 -0
- data/lib/mutest/mutator/node/kwbegin.rb +4 -4
- data/lib/mutest/mutator/node/literal.rb +4 -4
- data/lib/mutest/mutator/node/literal/array.rb +8 -6
- data/lib/mutest/mutator/node/literal/boolean.rb +5 -5
- data/lib/mutest/mutator/node/literal/fixnum.rb +5 -5
- data/lib/mutest/mutator/node/literal/float.rb +5 -5
- data/lib/mutest/mutator/node/literal/hash.rb +6 -6
- data/lib/mutest/mutator/node/literal/nil.rb +5 -5
- data/lib/mutest/mutator/node/literal/range.rb +5 -5
- data/lib/mutest/mutator/node/literal/regex.rb +5 -5
- data/lib/mutest/mutator/node/literal/string.rb +5 -5
- data/lib/mutest/mutator/node/literal/symbol.rb +5 -5
- data/lib/mutest/mutator/node/masgn.rb +4 -4
- data/lib/mutest/mutator/node/match_current_line.rb +4 -4
- data/lib/mutest/mutator/node/mlhs.rb +4 -4
- data/lib/mutest/mutator/node/named_value/access.rb +6 -6
- data/lib/mutest/mutator/node/named_value/constant_assignment.rb +6 -5
- data/lib/mutest/mutator/node/named_value/variable_assignment.rb +5 -5
- data/lib/mutest/mutator/node/next.rb +4 -4
- data/lib/mutest/mutator/node/nthref.rb +4 -4
- data/lib/mutest/mutator/node/op_asgn.rb +4 -4
- data/lib/mutest/mutator/node/or_asgn.rb +5 -4
- data/lib/mutest/mutator/node/procarg_zero.rb +45 -0
- data/lib/mutest/mutator/node/regexp.rb +6 -6
- data/lib/mutest/mutator/node/regexp/alternation_meta.rb +5 -5
- data/lib/mutest/mutator/node/regexp/capture_group.rb +5 -5
- data/lib/mutest/mutator/node/regexp/character_type.rb +5 -5
- data/lib/mutest/mutator/node/regexp/end_of_line_anchor.rb +5 -5
- data/lib/mutest/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor.rb +5 -5
- data/lib/mutest/mutator/node/regexp/one_or_more.rb +5 -5
- data/lib/mutest/mutator/node/regexp/zero_or_more.rb +5 -5
- data/lib/mutest/mutator/node/regopt.rb +4 -4
- data/lib/mutest/mutator/node/resbody.rb +6 -4
- data/lib/mutest/mutator/node/rescue.rb +6 -4
- data/lib/mutest/mutator/node/return.rb +5 -4
- data/lib/mutest/mutator/node/send.rb +6 -34
- data/lib/mutest/mutator/node/send/attribute_assignment.rb +5 -5
- data/lib/mutest/mutator/node/send/binary.rb +5 -5
- data/lib/mutest/mutator/node/send/conditional.rb +5 -5
- data/lib/mutest/mutator/node/splat.rb +4 -4
- data/lib/mutest/mutator/node/super.rb +4 -4
- data/lib/mutest/mutator/node/when.rb +4 -4
- data/lib/mutest/mutator/node/yield.rb +4 -4
- data/lib/mutest/mutator/node/zsuper.rb +4 -4
- data/lib/mutest/mutator/util.rb +3 -3
- data/lib/mutest/mutator/util/array.rb +6 -6
- data/lib/mutest/mutator/util/symbol.rb +4 -4
- data/lib/mutest/parallel.rb +16 -12
- data/lib/mutest/parallel/master.rb +4 -4
- data/lib/mutest/parallel/source.rb +6 -5
- data/lib/mutest/parallel/worker.rb +6 -5
- data/lib/mutest/parser.rb +4 -3
- data/lib/mutest/registry.rb +6 -5
- data/lib/mutest/reporter.rb +2 -2
- data/lib/mutest/reporter/cli.rb +3 -3
- data/lib/mutest/reporter/cli/format.rb +9 -8
- data/lib/mutest/reporter/cli/printer.rb +8 -8
- data/lib/mutest/reporter/cli/printer/config.rb +5 -5
- data/lib/mutest/reporter/cli/printer/env_progress.rb +16 -16
- data/lib/mutest/reporter/cli/printer/env_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/mutation_progress_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/mutation_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/status.rb +6 -5
- data/lib/mutest/reporter/cli/printer/status_progressive.rb +5 -5
- data/lib/mutest/reporter/cli/printer/subject_progress.rb +5 -5
- data/lib/mutest/reporter/cli/printer/subject_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/test_result.rb +5 -5
- data/lib/mutest/reporter/cli/tput.rb +6 -5
- data/lib/mutest/reporter/null.rb +3 -3
- data/lib/mutest/reporter/sequence.rb +3 -3
- data/lib/mutest/repository.rb +9 -7
- data/lib/mutest/require_highjack.rb +2 -2
- data/lib/mutest/requirer.rb +2 -2
- data/lib/mutest/result.rb +18 -12
- data/lib/mutest/runner.rb +6 -3
- data/lib/mutest/runner/sink.rb +3 -3
- data/lib/mutest/scope.rb +2 -2
- data/lib/mutest/selector.rb +4 -3
- data/lib/mutest/selector/expression.rb +3 -3
- data/lib/mutest/source_file.rb +6 -5
- data/lib/mutest/subject.rb +5 -3
- data/lib/mutest/subject/method.rb +3 -3
- data/lib/mutest/subject/method/instance.rb +5 -5
- data/lib/mutest/subject/method/singleton.rb +4 -4
- data/lib/mutest/test.rb +4 -3
- data/lib/mutest/util.rb +3 -3
- data/lib/mutest/version.rb +2 -2
- data/lib/mutest/warning_filter.rb +3 -3
- data/lib/mutest/zombifier.rb +5 -4
- data/meta/block.rb +22 -3
- data/meta/case.rb +29 -1
- data/meta/index.rb +132 -0
- data/meta/indexasgn.rb +42 -0
- data/meta/lambda.rb +17 -0
- data/meta/send.rb +5 -139
- data/mutest-rspec.gemspec +1 -1
- data/mutest.gemspec +11 -12
- data/spec/integration/mutest/rspec_spec.rb +1 -1
- data/spec/shared/framework_integration_behavior.rb +1 -1
- data/spec/shared/idempotent_method_behavior.rb +2 -1
- data/spec/spec_helper.rb +5 -5
- data/spec/support/compress_helper.rb +2 -1
- data/spec/support/corpus.rb +12 -8
- data/spec/support/fake_actor.rb +19 -14
- data/spec/support/file_system.rb +10 -7
- data/spec/support/ice_nine_config.rb +3 -3
- data/spec/support/ruby_vm.rb +10 -11
- data/spec/support/shared_context.rb +1 -1
- data/spec/support/test_app.rb +1 -1
- data/spec/support/warning.rb +8 -7
- data/spec/support/xspec.rb +18 -17
- data/spec/unit/mutest/actor/binding_spec.rb +1 -0
- data/spec/unit/mutest/ast/meta/optarg_spec.rb +1 -0
- data/spec/unit/mutest/ast/meta/send/proc_predicate_spec.rb +1 -1
- data/spec/unit/mutest/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +1 -1
- data/spec/unit/mutest/ast/meta/send_spec.rb +14 -18
- data/spec/unit/mutest/ast/regexp_spec.rb +4 -3
- data/spec/unit/mutest/ast_spec.rb +1 -1
- data/spec/unit/mutest/cli_spec.rb +15 -15
- data/spec/unit/mutest/env/bootstrap_spec.rb +1 -1
- data/spec/unit/mutest/integration_spec.rb +1 -0
- data/spec/unit/mutest/isolation/none_spec.rb +1 -1
- data/spec/unit/mutest/matcher/config_spec.rb +1 -0
- data/spec/unit/mutest/mutator/node_spec.rb +1 -1
- data/spec/unit/mutest/parallel/master_spec.rb +3 -3
- data/spec/unit/mutest/reporter/cli/printer_spec.rb +2 -0
- data/spec/unit/mutest/reporter/cli/tput_spec.rb +2 -0
- data/spec/unit/mutest/reporter/cli_spec.rb +2 -0
- data/spec/unit/mutest/repository/diff_spec.rb +1 -1
- data/spec/unit/mutest/runner_spec.rb +1 -1
- data/spec/unit/mutest/subject_spec.rb +1 -1
- data/spec/unit/mutest/warning_filter_spec.rb +2 -3
- data/spec/unit/mutest/zombifier_spec.rb +1 -1
- data/test_app/Gemfile.rspec3.8 +7 -0
- metadata +67 -68
- data/.buildkite/hooks/pre-command +0 -3
- data/.buildkite/pipeline.yml +0 -38
- data/.gitmodules +0 -3
- data/circle.yml +0 -10
- data/config/triage.yml +0 -2
- data/config/yardstick.yml +0 -2
- data/lib/mutest/mutator/node/send/index.rb +0 -47
data/lib/mutest/meta/example.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Mutest
|
2
2
|
module Meta
|
3
3
|
class Example
|
4
|
-
include
|
4
|
+
include Anima.new(:file, :node, :node_type, :expected)
|
5
|
+
include Adamantium
|
5
6
|
|
6
7
|
# Verification instance for example
|
7
8
|
#
|
@@ -27,6 +28,6 @@ module Mutest
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
memoize :generated
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -33,7 +33,8 @@ module Mutest
|
|
33
33
|
# @raise [RuntimeError]
|
34
34
|
# in case example cannot be build
|
35
35
|
def example
|
36
|
-
|
36
|
+
raise 'source not defined' unless @node
|
37
|
+
|
37
38
|
Example.new(
|
38
39
|
file: @file,
|
39
40
|
node: @node,
|
@@ -50,7 +51,8 @@ module Mutest
|
|
50
51
|
#
|
51
52
|
# @return [undefined]
|
52
53
|
def source(input)
|
53
|
-
|
54
|
+
raise 'source already defined' if @node
|
55
|
+
|
54
56
|
@node = node(input)
|
55
57
|
end
|
56
58
|
|
@@ -61,9 +63,8 @@ module Mutest
|
|
61
63
|
# @return [undefined]
|
62
64
|
def mutation(input)
|
63
65
|
node = node(input)
|
64
|
-
if @expected.include?(node)
|
65
|
-
|
66
|
-
end
|
66
|
+
raise "Mutation for input: #{input.inspect} is already expected" if @expected.include?(node)
|
67
|
+
|
67
68
|
@expected << node
|
68
69
|
end
|
69
70
|
|
@@ -94,14 +95,14 @@ module Mutest
|
|
94
95
|
def node(input)
|
95
96
|
case input
|
96
97
|
when String
|
97
|
-
Unparser::Preprocessor.run(
|
98
|
+
Unparser::Preprocessor.run(Unparser.parse(input))
|
98
99
|
when ::Parser::AST::Node
|
99
100
|
input
|
100
101
|
else
|
101
|
-
|
102
|
+
raise "Cannot coerce to node: #{input.inspect}"
|
102
103
|
end
|
103
104
|
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -3,7 +3,8 @@ module Mutest
|
|
3
3
|
class Example
|
4
4
|
# Example verification
|
5
5
|
class Verification
|
6
|
-
include
|
6
|
+
include Concord.new(:example, :mutations)
|
7
|
+
include Adamantium::Flat
|
7
8
|
|
8
9
|
# Test if mutation was verified successfully
|
9
10
|
#
|
@@ -16,7 +17,7 @@ module Mutest
|
|
16
17
|
#
|
17
18
|
# @return [String]
|
18
19
|
def error_report
|
19
|
-
|
20
|
+
raise 'no error report on successful validation' if success?
|
20
21
|
|
21
22
|
YAML.dump(
|
22
23
|
'file' => example.file,
|
@@ -79,7 +80,7 @@ module Mutest
|
|
79
80
|
example.expected - mutations.map(&:node)
|
80
81
|
end
|
81
82
|
memoize :missing
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
data/lib/mutest/mutation.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Mutest
|
2
2
|
# Represent a mutated node with its subject
|
3
3
|
class Mutation
|
4
|
-
include
|
4
|
+
include Adamantium::Flat
|
5
|
+
include AbstractType
|
5
6
|
include Concord::Public.new(:subject, :node)
|
6
7
|
|
7
8
|
CODE_DELIMITER = "\0".freeze
|
@@ -84,18 +85,18 @@ module Mutest
|
|
84
85
|
class Evil < self
|
85
86
|
SYMBOL = 'evil'.freeze
|
86
87
|
TEST_PASS_SUCCESS = false
|
87
|
-
end
|
88
|
+
end
|
88
89
|
|
89
90
|
# Neutral mutation that should not cause mutations to fail tests
|
90
91
|
class Neutral < self
|
91
92
|
SYMBOL = 'neutral'.freeze
|
92
93
|
TEST_PASS_SUCCESS = true
|
93
|
-
end
|
94
|
+
end
|
94
95
|
|
95
96
|
# Noop mutation, special case of neutral
|
96
97
|
class Noop < Neutral
|
97
98
|
SYMBOL = 'noop'.freeze
|
98
99
|
TEST_PASS_SUCCESS = true
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/lib/mutest/mutator.rb
CHANGED
@@ -3,10 +3,10 @@ module Mutest
|
|
3
3
|
class Mutator
|
4
4
|
REGISTRY = Registry.new
|
5
5
|
|
6
|
-
include
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
include Procto.call(:output)
|
7
|
+
include AbstractType
|
8
|
+
include Concord.new(:input, :filter, :parent)
|
9
|
+
include Adamantium::Flat
|
10
10
|
|
11
11
|
# Lookup and invoke dedicated AST mutator
|
12
12
|
#
|
@@ -111,5 +111,5 @@ module Mutest
|
|
111
111
|
|
112
112
|
mutator.call(nodes, filter).each(&block)
|
113
113
|
end
|
114
|
-
end
|
115
|
-
end
|
114
|
+
end
|
115
|
+
end
|
data/lib/mutest/mutator/node.rb
CHANGED
@@ -3,8 +3,12 @@ module Mutest
|
|
3
3
|
class Mutator
|
4
4
|
# Abstract base class for node mutators
|
5
5
|
class Node < self
|
6
|
-
include
|
7
|
-
include
|
6
|
+
include Unparser::Constants
|
7
|
+
include AbstractType
|
8
|
+
include AST::Nodes
|
9
|
+
include AST::Sexp
|
10
|
+
include AST::NodePredicates
|
11
|
+
include AST::NamedChildren
|
8
12
|
|
9
13
|
TAUTOLOGY = ->(_input) { true }
|
10
14
|
|
@@ -49,6 +53,7 @@ module Mutest
|
|
49
53
|
block ||= TAUTOLOGY
|
50
54
|
mutate(children.fetch(index), self).each do |mutation|
|
51
55
|
next unless block.call(mutation)
|
56
|
+
|
52
57
|
emit_child_update(index, mutation)
|
53
58
|
end
|
54
59
|
end
|
@@ -85,6 +90,13 @@ module Mutest
|
|
85
90
|
emit(::Parser::AST::Node.new(node.type, children))
|
86
91
|
end
|
87
92
|
|
93
|
+
# Emit propagation if node can stand alone
|
94
|
+
#
|
95
|
+
# @return [undefined]
|
96
|
+
def emit_propagation(node)
|
97
|
+
emit(node) unless AST::Types::NOT_STANDALONE.include?(node.type)
|
98
|
+
end
|
99
|
+
|
88
100
|
# Emit singleton literals
|
89
101
|
#
|
90
102
|
# @return [undefined]
|
@@ -115,7 +127,7 @@ module Mutest
|
|
115
127
|
# @return [nil]
|
116
128
|
# otherwise
|
117
129
|
def parent_node
|
118
|
-
parent
|
130
|
+
parent&.node
|
119
131
|
end
|
120
132
|
|
121
133
|
# Parent type
|
@@ -126,7 +138,7 @@ module Mutest
|
|
126
138
|
# @return [nil]
|
127
139
|
# otherwise
|
128
140
|
def parent_type
|
129
|
-
parent_node
|
141
|
+
parent_node&.type
|
130
142
|
end
|
131
143
|
|
132
144
|
# Test if the node is the left of an or_asgn or op_asgn
|
@@ -154,6 +166,6 @@ module Mutest
|
|
154
166
|
yield child, index unless children.one?
|
155
167
|
end
|
156
168
|
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
@@ -23,6 +23,7 @@ module Mutest
|
|
23
23
|
# @return [undefined]
|
24
24
|
def emit_name_mutation
|
25
25
|
return if skip?
|
26
|
+
|
26
27
|
emit_name(:"#{UNDERSCORE}#{name}")
|
27
28
|
end
|
28
29
|
|
@@ -61,8 +62,8 @@ module Mutest
|
|
61
62
|
def emit_required_mutation
|
62
63
|
emit(s(TYPE_MAP.fetch(node.type), name))
|
63
64
|
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -22,11 +22,23 @@ module Mutest
|
|
22
22
|
# @return [undefined]
|
23
23
|
def emit_argument_presence
|
24
24
|
emit_type
|
25
|
+
|
25
26
|
mutate_with(Util::Array::Presence, children) do |children|
|
26
|
-
|
27
|
+
if children.one? && n_mlhs?(Mutest::Util.one(children))
|
28
|
+
emit_procarg(Mutest::Util.one(children))
|
29
|
+
else
|
30
|
+
emit_type(*children)
|
31
|
+
end
|
27
32
|
end
|
28
33
|
end
|
29
34
|
|
35
|
+
# Emit procarg form
|
36
|
+
#
|
37
|
+
# @return [undefined]
|
38
|
+
def emit_procarg(arg)
|
39
|
+
emit_type(s(:procarg0, *arg))
|
40
|
+
end
|
41
|
+
|
30
42
|
# Emit argument mutations
|
31
43
|
#
|
32
44
|
# @return [undefined]
|
@@ -34,6 +46,7 @@ module Mutest
|
|
34
46
|
children.each_with_index do |child, index|
|
35
47
|
mutate(child).each do |mutest|
|
36
48
|
next if invalid_argument_replacement?(mutest, index)
|
49
|
+
|
37
50
|
emit_child_update(index, mutest)
|
38
51
|
end
|
39
52
|
end
|
@@ -84,7 +97,7 @@ module Mutest
|
|
84
97
|
n_mlhs?(child)
|
85
98
|
end
|
86
99
|
end
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -14,7 +14,7 @@ module Mutest
|
|
14
14
|
# @return [undefined]
|
15
15
|
def dispatch
|
16
16
|
emit_singletons
|
17
|
-
emit(send)
|
17
|
+
emit(send) unless n_lambda?(send)
|
18
18
|
emit_send_mutations(&method(:n_send?))
|
19
19
|
emit_arguments_mutations
|
20
20
|
|
@@ -29,6 +29,7 @@ module Mutest
|
|
29
29
|
emit_body(N_RAISE)
|
30
30
|
|
31
31
|
return unless body
|
32
|
+
|
32
33
|
emit(body)
|
33
34
|
emit_body_mutations
|
34
35
|
|
@@ -45,7 +46,7 @@ module Mutest
|
|
45
46
|
|
46
47
|
emit(s(:send, send, body_meta.selector, *body_meta.arguments))
|
47
48
|
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -37,11 +37,13 @@ module Mutest
|
|
37
37
|
def emit_else_mutations
|
38
38
|
else_branch = children.last
|
39
39
|
else_index = children.length - 1
|
40
|
+
|
40
41
|
return unless else_branch
|
42
|
+
|
41
43
|
mutate_child(else_index)
|
42
44
|
emit_child_update(else_index, nil)
|
43
45
|
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -69,15 +69,15 @@ module Mutest
|
|
69
69
|
handle :def
|
70
70
|
|
71
71
|
children :name, :arguments, :body
|
72
|
-
end
|
72
|
+
end
|
73
73
|
|
74
74
|
# Mutator for singleton method defines
|
75
75
|
class Singleton < self
|
76
76
|
handle :defs
|
77
77
|
|
78
78
|
children :subject, :name, :arguments, :body
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|