mutant 0.3.0.beta21 → 0.3.0.beta22
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/.gitignore +37 -6
- data/.rspec +2 -0
- data/.ruby-gemset +1 -0
- data/.travis.yml +13 -7
- data/Gemfile +8 -3
- data/Gemfile.devtools +2 -6
- data/Guardfile +22 -8
- data/README.md +3 -1
- data/Rakefile +3 -0
- data/bin/mutant +4 -3
- data/config/devtools.yml +1 -1
- data/config/flay.yml +1 -1
- data/config/flog.yml +1 -1
- data/config/reek.yml +7 -6
- data/config/rubocop.yml +55 -0
- data/lib/mutant.rb +3 -1
- data/lib/mutant/cache.rb +2 -0
- data/lib/mutant/cli.rb +14 -10
- data/lib/mutant/cli/classifier.rb +22 -10
- data/lib/mutant/cli/classifier/method.rb +14 -15
- data/lib/mutant/cli/classifier/namespace.rb +6 -2
- data/lib/mutant/cli/classifier/scope.rb +3 -1
- data/lib/mutant/color.rb +7 -3
- data/lib/mutant/config.rb +2 -0
- data/lib/mutant/constants.rb +5 -4
- data/lib/mutant/context.rb +2 -0
- data/lib/mutant/context/scope.rb +3 -1
- data/lib/mutant/differ.rb +10 -2
- data/lib/mutant/killer.rb +4 -1
- data/lib/mutant/killer/forked.rb +2 -0
- data/lib/mutant/killer/forking.rb +2 -0
- data/lib/mutant/killer/rspec.rb +19 -3
- data/lib/mutant/killer/static.rb +2 -0
- data/lib/mutant/loader.rb +8 -1
- data/lib/mutant/matcher.rb +2 -0
- data/lib/mutant/matcher/chain.rb +2 -0
- data/lib/mutant/matcher/method.rb +15 -3
- data/lib/mutant/matcher/method/finder.rb +2 -0
- data/lib/mutant/matcher/method/instance.rb +4 -1
- data/lib/mutant/matcher/method/singleton.rb +7 -1
- data/lib/mutant/matcher/methods.rb +3 -1
- data/lib/mutant/matcher/namespace.rb +4 -2
- data/lib/mutant/matcher/scope.rb +2 -0
- data/lib/mutant/mutation.rb +19 -5
- data/lib/mutant/mutation/evil.rb +12 -0
- data/lib/mutant/mutation/filter.rb +2 -0
- data/lib/mutant/mutation/filter/code.rb +3 -1
- data/lib/mutant/mutation/filter/regexp.rb +2 -0
- data/lib/mutant/mutation/filter/whitelist.rb +2 -0
- data/lib/mutant/mutation/neutral.rb +25 -0
- data/lib/mutant/mutator.rb +4 -6
- data/lib/mutant/mutator/node.rb +5 -1
- data/lib/mutant/mutator/node/argument.rb +2 -0
- data/lib/mutant/mutator/node/arguments.rb +2 -0
- data/lib/mutant/mutator/node/begin.rb +2 -0
- data/lib/mutant/mutator/node/block.rb +2 -0
- data/lib/mutant/mutator/node/case.rb +3 -1
- data/lib/mutant/mutator/node/connective/binary.rb +3 -1
- data/lib/mutant/mutator/node/const.rb +2 -0
- data/lib/mutant/mutator/node/define.rb +2 -0
- data/lib/mutant/mutator/node/generic.rb +4 -3
- data/lib/mutant/mutator/node/if.rb +2 -0
- data/lib/mutant/mutator/node/literal.rb +2 -0
- data/lib/mutant/mutator/node/literal/array.rb +2 -0
- data/lib/mutant/mutator/node/literal/boolean.rb +2 -0
- data/lib/mutant/mutator/node/literal/dynamic.rb +2 -0
- data/lib/mutant/mutator/node/literal/fixnum.rb +3 -1
- data/lib/mutant/mutator/node/literal/float.rb +2 -0
- data/lib/mutant/mutator/node/literal/hash.rb +2 -0
- data/lib/mutant/mutator/node/literal/nil.rb +2 -0
- data/lib/mutant/mutator/node/literal/range.rb +2 -1
- data/lib/mutant/mutator/node/literal/regex.rb +2 -0
- data/lib/mutant/mutator/node/literal/string.rb +2 -0
- data/lib/mutant/mutator/node/literal/symbol.rb +5 -1
- data/lib/mutant/mutator/node/masgn.rb +2 -0
- data/lib/mutant/mutator/node/mlhs.rb +2 -0
- data/lib/mutant/mutator/node/named_value/access.rb +2 -0
- data/lib/mutant/mutator/node/named_value/constant_assignment.rb +2 -0
- data/lib/mutant/mutator/node/named_value/variable_assignment.rb +3 -1
- data/lib/mutant/mutator/node/{cbase.rb → noop.rb} +7 -5
- data/lib/mutant/mutator/node/return.rb +2 -0
- data/lib/mutant/mutator/node/send.rb +2 -0
- data/lib/mutant/mutator/node/send/binary.rb +2 -0
- data/lib/mutant/mutator/node/splat.rb +2 -0
- data/lib/mutant/mutator/node/super.rb +2 -0
- data/lib/mutant/mutator/node/when.rb +3 -1
- data/lib/mutant/mutator/node/while.rb +2 -0
- data/lib/mutant/mutator/node/zsuper.rb +2 -0
- data/lib/mutant/mutator/registry.rb +55 -13
- data/lib/mutant/mutator/util.rb +2 -0
- data/lib/mutant/mutator/util/array.rb +3 -1
- data/lib/mutant/mutator/util/symbol.rb +2 -0
- data/lib/mutant/node_helpers.rb +10 -4
- data/lib/mutant/random.rb +2 -0
- data/lib/mutant/reporter.rb +2 -0
- data/lib/mutant/reporter/cli.rb +2 -0
- data/lib/mutant/reporter/cli/printer.rb +2 -0
- data/lib/mutant/reporter/cli/printer/config.rb +5 -2
- data/lib/mutant/reporter/cli/printer/killer.rb +2 -0
- data/lib/mutant/reporter/cli/printer/mutation.rb +13 -6
- data/lib/mutant/reporter/cli/printer/subject.rb +5 -1
- data/lib/mutant/reporter/null.rb +2 -0
- data/lib/mutant/runner.rb +2 -0
- data/lib/mutant/runner/config.rb +2 -0
- data/lib/mutant/runner/mutation.rb +2 -0
- data/lib/mutant/runner/subject.rb +2 -0
- data/lib/mutant/singleton_methods.rb +5 -3
- data/lib/mutant/strategy.rb +2 -0
- data/lib/mutant/strategy/method_expansion.rb +2 -0
- data/lib/mutant/strategy/rspec.rb +2 -0
- data/lib/mutant/strategy/rspec/dm2.rb +2 -0
- data/lib/mutant/strategy/rspec/dm2/lookup.rb +4 -2
- data/lib/mutant/strategy/rspec/dm2/lookup/method.rb +2 -0
- data/lib/mutant/strategy/static.rb +2 -0
- data/lib/mutant/subject.rb +4 -1
- data/lib/mutant/subject/method.rb +2 -0
- data/lib/mutant/subject/method/instance.rb +2 -0
- data/lib/mutant/subject/method/singleton.rb +2 -0
- data/lib/mutant/support/method_object.rb +2 -0
- data/lib/mutant/zombifier.rb +10 -6
- data/mutant.gemspec +11 -10
- data/spec/integration/mutant/rspec_killer_spec.rb +9 -4
- data/spec/integration/mutant/test_mutator_handles_types_spec.rb +3 -1
- data/spec/integration/mutant/zombie_spec.rb +2 -0
- data/spec/shared/method_matcher_behavior.rb +2 -0
- data/spec/shared/mutator_behavior.rb +16 -7
- data/spec/spec_helper.rb +26 -5
- data/spec/support/compress_helper.rb +5 -5
- data/spec/support/ice_nine_config.rb +2 -0
- data/spec/support/rspec.rb +2 -0
- data/spec/support/test_app.rb +2 -0
- data/spec/unit/mutant/class_methods/singleton_subclass_instance_spec.rb +2 -0
- data/spec/unit/mutant/cli/class_methods/new_spec.rb +17 -8
- data/spec/unit/mutant/cli/class_methods/run_spec.rb +10 -2
- data/spec/unit/mutant/cli/classifier/class_methods/build_spec.rb +4 -1
- data/spec/unit/mutant/cli/classifier/method/each_spec.rb +89 -0
- data/spec/unit/mutant/cli/classifier/namespace/flat/each_spec.rb +58 -0
- data/spec/unit/mutant/cli/classifier/namespace/recursive/each_spec.rb +58 -0
- data/spec/unit/mutant/cli/classifier/scope/each_spec.rb +33 -0
- data/spec/unit/mutant/context/root_spec.rb +5 -1
- data/spec/unit/mutant/context/scope/root_spec.rb +2 -0
- data/spec/unit/mutant/context/scope/unqualified_name_spec.rb +2 -0
- data/spec/unit/mutant/differ/class_methods/build_spec.rb +2 -0
- data/spec/unit/mutant/differ/class_methods/colorize_line_spec.rb +2 -0
- data/spec/unit/mutant/differ/diff_spec.rb +67 -5
- data/spec/unit/mutant/killer/rspec/class_methods/new_spec.rb +21 -4
- data/spec/unit/mutant/killer/success_predicate_spec.rb +2 -0
- data/spec/unit/mutant/loader/eval/class_methods/run_spec.rb +12 -5
- data/spec/unit/mutant/matcher/chain/each_spec.rb +2 -0
- data/spec/unit/mutant/matcher/chain/matchers_spec.rb +2 -0
- data/spec/unit/mutant/matcher/each_spec.rb +8 -1
- data/spec/unit/mutant/matcher/method/instance/class_methods/build_spec.rb +4 -2
- data/spec/unit/mutant/matcher/method/instance/each_spec.rb +21 -20
- data/spec/unit/mutant/matcher/method/singleton/each_spec.rb +22 -19
- data/spec/unit/mutant/matcher/methods/instance/each_spec.rb +8 -3
- data/spec/unit/mutant/matcher/methods/singleton/each_spec.rb +8 -3
- data/spec/unit/mutant/matcher/namespace/each_spec.rb +8 -2
- data/spec/unit/mutant/mutator/each_spec.rb +2 -0
- data/spec/unit/mutant/mutator/emit_new_spec.rb +10 -3
- data/spec/unit/mutant/mutator/emit_spec.rb +4 -2
- data/spec/unit/mutant/mutator/node/and_asgn/mutation_spec.rb +26 -0
- data/spec/unit/mutant/mutator/node/begin/mutation_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/block/mutation_spec.rb +4 -2
- data/spec/unit/mutant/mutator/node/block_pass/mutation_spec.rb +14 -0
- data/spec/unit/mutant/mutator/node/break/mutation_spec.rb +15 -0
- data/spec/unit/mutant/mutator/node/case/mutation_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/cbase/mutation_spec.rb +3 -6
- data/spec/unit/mutant/mutator/node/connective/binary/mutation_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/const/mutation_spec.rb +3 -6
- data/spec/unit/mutant/mutator/node/define/mutation_spec.rb +2 -1
- data/spec/unit/mutant/mutator/node/defined_predicate/mutation_spec.rb +10 -0
- data/spec/unit/mutant/mutator/node/dstr/mutation_spec.rb +21 -0
- data/spec/unit/mutant/mutator/node/dsym/mutation_spec.rb +21 -0
- data/spec/unit/mutant/mutator/node/ensure/mutation_spec.rb +15 -0
- data/spec/unit/mutant/mutator/node/if/mutation_spec.rb +2 -1
- data/spec/unit/mutant/mutator/node/literal/array_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/literal/boolean/mutation_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/literal/fixnum_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/literal/float_spec.rb +4 -2
- data/spec/unit/mutant/mutator/node/literal/hash_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/literal/nil_spec.rb +4 -5
- data/spec/unit/mutant/mutator/node/literal/range_spec.rb +8 -8
- data/spec/unit/mutant/mutator/node/literal/regex_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/literal/string_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/literal/symbol_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/masgn/mutation_spec.rb +4 -10
- data/spec/unit/mutant/mutator/node/match_current_line/mutation_spec.rb +20 -0
- data/spec/unit/mutant/mutator/node/named_value/access/mutation_spec.rb +3 -2
- data/spec/unit/mutant/mutator/node/named_value/constant_assignment/mutation_spec.rb +3 -2
- data/spec/unit/mutant/mutator/node/named_value/variable_assignment/mutation_spec.rb +3 -2
- data/spec/unit/mutant/mutator/node/next/mutation_spec.rb +15 -0
- data/spec/unit/mutant/mutator/node/op_assgn/mutation_spec.rb +26 -0
- data/spec/unit/mutant/mutator/node/or_asgn/mutation_spec.rb +26 -0
- data/spec/unit/mutant/mutator/node/redo/mutation_spec.rb +10 -0
- data/spec/unit/mutant/mutator/node/rescue/mutation_spec.rb +24 -0
- data/spec/unit/mutant/mutator/node/restarg/mutation_spec.rb +16 -0
- data/spec/unit/mutant/mutator/node/return/mutation_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/send/mutation_spec.rb +3 -1
- data/spec/unit/mutant/mutator/node/super/mutation_spec.rb +2 -0
- data/spec/unit/mutant/mutator/node/while/mutation_spec.rb +3 -1
- data/spec/unit/mutant/mutator/node/yield/mutation_spec.rb +15 -0
- data/spec/unit/mutant/node_helpers/n_not_spec.rb +2 -0
- data/spec/unit/mutant/runner/config/subjects_spec.rb +6 -2
- data/spec/unit/mutant/runner/config/success_predicate_spec.rb +15 -6
- data/spec/unit/mutant/runner/mutation/killer_spec.rb +3 -1
- data/spec/unit/mutant/runner/subject/success_predicate_spec.rb +15 -8
- data/spec/unit/mutant/strategy/method_expansion/class_methods/run_spec.rb +2 -0
- data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/instance/spec_files_spec.rb +32 -11
- data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/singleton/spec_files_spec.rb +31 -11
- data/spec/unit/mutant/subject/context_spec.rb +2 -0
- data/spec/unit/mutant/subject/mutations_spec.rb +2 -0
- data/spec/unit/mutant/subject/node_spec.rb +2 -0
- data/test_app/lib/test_app.rb +2 -0
- data/test_app/lib/test_app/literal.rb +2 -0
- data/test_app/spec/shared/method_filter_parse_behavior.rb +5 -1
- data/test_app/spec/shared/method_match_behavior.rb +2 -0
- data/test_app/spec/spec_helper.rb +3 -1
- data/test_app/spec/unit/test_app/literal/command_spec.rb +2 -0
- data/test_app/spec/unit/test_app/literal/string_spec.rb +3 -1
- metadata +66 -18
- data/bin/zombie +0 -18
- data/test_app/spec/shared/mutator_behavior.rb +0 -44
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
2
4
|
class Matcher
|
|
3
5
|
class Method
|
|
@@ -92,7 +94,11 @@ module Mutant
|
|
|
92
94
|
when :const
|
|
93
95
|
receiver_name?(receiver)
|
|
94
96
|
else
|
|
95
|
-
|
|
97
|
+
message = sprintf(
|
|
98
|
+
'Can only match :defs on :self or :const got %s unable to match',
|
|
99
|
+
receiver.type.inspect
|
|
100
|
+
)
|
|
101
|
+
$stderr.puts(message)
|
|
96
102
|
false
|
|
97
103
|
end
|
|
98
104
|
end
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
2
4
|
class Matcher
|
|
3
|
-
# Abstract base class for matcher that returns method subjects
|
|
5
|
+
# Abstract base class for matcher that returns method subjects from scope
|
|
4
6
|
class Methods < self
|
|
5
7
|
include AbstractType, Concord::Public.new(:cache, :scope)
|
|
6
8
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
2
4
|
class Matcher
|
|
3
5
|
|
|
@@ -34,7 +36,7 @@ module Mutant
|
|
|
34
36
|
# @api private
|
|
35
37
|
#
|
|
36
38
|
def pattern
|
|
37
|
-
|
|
39
|
+
/\A#{Regexp.escape(namespace.name)}(?:::)?/
|
|
38
40
|
end
|
|
39
41
|
memoize :pattern
|
|
40
42
|
|
|
@@ -62,7 +64,7 @@ module Mutant
|
|
|
62
64
|
#
|
|
63
65
|
def emit_scope(scope)
|
|
64
66
|
name = scope.name
|
|
65
|
-
# FIXME Fix nokogiri to return a string here
|
|
67
|
+
# FIXME: Fix nokogiri to return a string here
|
|
66
68
|
return unless name.kind_of?(String)
|
|
67
69
|
if pattern =~ name
|
|
68
70
|
yield scope
|
data/lib/mutant/matcher/scope.rb
CHANGED
data/lib/mutant/mutation.rb
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
2
4
|
# Represent a mutated node with its subject
|
|
3
5
|
class Mutation
|
|
4
|
-
include AbstractType, Adamantium::Flat
|
|
6
|
+
include AbstractType, Adamantium::Flat
|
|
7
|
+
include Concord::Public.new(:subject, :node)
|
|
5
8
|
|
|
6
9
|
# Return mutated root node
|
|
7
10
|
#
|
|
@@ -28,12 +31,23 @@ module Mutant
|
|
|
28
31
|
#
|
|
29
32
|
abstract_method :success?
|
|
30
33
|
|
|
34
|
+
# Indicate if a killer should treat a kill as problematic
|
|
35
|
+
#
|
|
36
|
+
# @return [true]
|
|
37
|
+
# if killing is unexpected
|
|
38
|
+
#
|
|
39
|
+
# @return [false]
|
|
40
|
+
# if killing is expected
|
|
41
|
+
#
|
|
42
|
+
# @api private
|
|
43
|
+
#
|
|
44
|
+
abstract_method :should_survive?
|
|
45
|
+
|
|
31
46
|
# Insert mutated node
|
|
32
47
|
#
|
|
33
|
-
# FIXME:
|
|
34
|
-
#
|
|
35
|
-
#
|
|
36
|
-
# mutations.
|
|
48
|
+
# FIXME: Cache subject visibility in a better way! Ideally dont mutate it
|
|
49
|
+
# implicitly. Also subject.public? should NOT be a public interface it
|
|
50
|
+
# is a detail of method mutations.
|
|
37
51
|
#
|
|
38
52
|
# @return [self]
|
|
39
53
|
#
|
data/lib/mutant/mutation/evil.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
2
4
|
class Mutation
|
|
3
5
|
# Evul mutation
|
|
@@ -30,6 +32,16 @@ module Mutant
|
|
|
30
32
|
killer.killed?
|
|
31
33
|
end
|
|
32
34
|
|
|
35
|
+
# Indicate if a killer should treat a kill as problematic
|
|
36
|
+
#
|
|
37
|
+
# @return [false] Killing evil mutants is not problematic
|
|
38
|
+
#
|
|
39
|
+
# @api private
|
|
40
|
+
#
|
|
41
|
+
def should_survive?
|
|
42
|
+
false
|
|
43
|
+
end
|
|
44
|
+
|
|
33
45
|
end # Evil
|
|
34
46
|
end # Mutation
|
|
35
47
|
end # Mutant
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
2
4
|
class Mutation
|
|
3
5
|
class Filter
|
|
@@ -21,7 +23,7 @@ module Mutant
|
|
|
21
23
|
mutation.code.eql?(code)
|
|
22
24
|
end
|
|
23
25
|
|
|
24
|
-
PATTERN =
|
|
26
|
+
PATTERN = /\Acode:([a-f0-9]{1,6})\z/.freeze
|
|
25
27
|
|
|
26
28
|
# Test if class handles string
|
|
27
29
|
#
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
2
4
|
class Mutation
|
|
3
5
|
# Neutral mutation
|
|
@@ -10,6 +12,19 @@ module Mutant
|
|
|
10
12
|
|
|
11
13
|
SYMBOL = 'noop'
|
|
12
14
|
|
|
15
|
+
# Indicate if a killer should treat a kill as problematic
|
|
16
|
+
#
|
|
17
|
+
# @return [false] Killing noop mutants is a serious problem. Failures
|
|
18
|
+
# in noop may indicate a broken test suite, but they can also be an
|
|
19
|
+
# indication mutant has altered the runtime environment in a subtle
|
|
20
|
+
# way and tickled an odd bug
|
|
21
|
+
#
|
|
22
|
+
# @api private
|
|
23
|
+
#
|
|
24
|
+
def should_survive?
|
|
25
|
+
false
|
|
26
|
+
end
|
|
27
|
+
|
|
13
28
|
end
|
|
14
29
|
|
|
15
30
|
# Return identification
|
|
@@ -39,6 +54,16 @@ module Mutant
|
|
|
39
54
|
!killer.killed?
|
|
40
55
|
end
|
|
41
56
|
|
|
57
|
+
# Indicate if a killer should treat a kill as problematic
|
|
58
|
+
#
|
|
59
|
+
# @return [true] Neutral mutants must die
|
|
60
|
+
#
|
|
61
|
+
# @api private
|
|
62
|
+
#
|
|
63
|
+
def should_survive?
|
|
64
|
+
false
|
|
65
|
+
end
|
|
66
|
+
|
|
42
67
|
end # Neutral
|
|
43
68
|
end # Mutation
|
|
44
69
|
end # Mutant
|
data/lib/mutant/mutator.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
2
4
|
# Generator for mutations
|
|
3
5
|
class Mutator
|
|
@@ -12,7 +14,7 @@ module Mutant
|
|
|
12
14
|
#
|
|
13
15
|
# @api private
|
|
14
16
|
#
|
|
15
|
-
def self.each(node, parent=nil, &block)
|
|
17
|
+
def self.each(node, parent = nil, &block)
|
|
16
18
|
return to_enum(__method__, node, parent) unless block_given?
|
|
17
19
|
Registry.lookup(node).new(node, parent, block)
|
|
18
20
|
|
|
@@ -135,17 +137,13 @@ module Mutant
|
|
|
135
137
|
|
|
136
138
|
# Call block until it generates a mutation
|
|
137
139
|
#
|
|
138
|
-
# The primary use of this method is to give the random generated object
|
|
139
|
-
# a nice interface for retring generation when generation accidentally generated the
|
|
140
|
-
# input
|
|
141
|
-
#
|
|
142
140
|
# @yield
|
|
143
141
|
# Execute block until object is generated where new?(object) returns true
|
|
144
142
|
#
|
|
145
143
|
# @return [self]
|
|
146
144
|
#
|
|
147
145
|
# @raise [RuntimeError]
|
|
148
|
-
# raises RuntimeError
|
|
146
|
+
# raises RuntimeError when no new node can be generated after MAX_TRIES.
|
|
149
147
|
#
|
|
150
148
|
# @api private
|
|
151
149
|
#
|
data/lib/mutant/mutator/node.rb
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
4
|
+
|
|
2
5
|
# Generator for mutations
|
|
3
6
|
class Mutator
|
|
7
|
+
|
|
4
8
|
# Abstract base class for node mutators
|
|
5
9
|
class Node < self
|
|
6
10
|
include AbstractType, NodeHelpers, Unparser::Constants
|
|
@@ -154,7 +158,7 @@ module Mutant
|
|
|
154
158
|
#
|
|
155
159
|
def emit_child_update(index, node)
|
|
156
160
|
new_children = children.dup
|
|
157
|
-
new_children[index]=node
|
|
161
|
+
new_children[index] = node
|
|
158
162
|
emit_self(*new_children)
|
|
159
163
|
end
|
|
160
164
|
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
2
4
|
class Mutator
|
|
3
5
|
class Node
|
|
@@ -30,7 +32,7 @@ module Mutant
|
|
|
30
32
|
# @api private
|
|
31
33
|
#
|
|
32
34
|
def emit_when_mutations
|
|
33
|
-
indices = children.each_index.drop(1).take(children.length-2)
|
|
35
|
+
indices = children.each_index.drop(1).take(children.length - 2)
|
|
34
36
|
one = indices.one?
|
|
35
37
|
indices.each do |index|
|
|
36
38
|
mutate_child(index)
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
|
|
1
3
|
module Mutant
|
|
2
4
|
class Mutator
|
|
3
5
|
class Node
|
|
@@ -8,10 +10,9 @@ module Mutant
|
|
|
8
10
|
# These nodes still need a dedicated mutator,
|
|
9
11
|
# your contribution is that close!
|
|
10
12
|
handle(
|
|
11
|
-
:
|
|
12
|
-
:next, :break, :match, :ensure,
|
|
13
|
+
:next, :break, :ensure,
|
|
13
14
|
:dstr, :dsym, :yield, :rescue, :redo, :defined?,
|
|
14
|
-
:blockarg, :
|
|
15
|
+
:blockarg, :op_asgn, :and_asgn,
|
|
15
16
|
:regopt, :restarg, :resbody, :retry, :arg_expr,
|
|
16
17
|
:kwrestarg, :kwoptarg, :kwarg, :undef, :module, :empty,
|
|
17
18
|
:alias, :for, :xstr, :back_ref, :nth_ref, :class,
|