mutant 0.5.19 → 0.5.20

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.
Files changed (165) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -4
  3. data/Changelog.md +9 -0
  4. data/Gemfile.devtools +15 -11
  5. data/README.md +10 -6
  6. data/config/flay.yml +1 -1
  7. data/config/reek.yml +3 -1
  8. data/lib/mutant.rb +41 -41
  9. data/lib/mutant/cache.rb +0 -2
  10. data/lib/mutant/cli.rb +6 -8
  11. data/lib/mutant/color.rb +0 -2
  12. data/lib/mutant/config.rb +0 -2
  13. data/lib/mutant/context.rb +0 -2
  14. data/lib/mutant/context/scope.rb +0 -2
  15. data/lib/mutant/delegator.rb +2 -0
  16. data/lib/mutant/diff.rb +4 -16
  17. data/lib/mutant/expression.rb +8 -7
  18. data/lib/mutant/expression/method.rb +3 -9
  19. data/lib/mutant/isolation.rb +65 -0
  20. data/lib/mutant/killer.rb +1 -3
  21. data/lib/mutant/loader.rb +0 -2
  22. data/lib/mutant/matcher.rb +0 -2
  23. data/lib/mutant/matcher/chain.rb +0 -2
  24. data/lib/mutant/matcher/filter.rb +0 -2
  25. data/lib/mutant/matcher/method.rb +1 -2
  26. data/lib/mutant/matcher/method/finder.rb +0 -2
  27. data/lib/mutant/matcher/method/instance.rb +1 -3
  28. data/lib/mutant/matcher/method/singleton.rb +0 -2
  29. data/lib/mutant/matcher/methods.rb +0 -2
  30. data/lib/mutant/matcher/namespace.rb +2 -6
  31. data/lib/mutant/matcher/null.rb +0 -2
  32. data/lib/mutant/matcher/scope.rb +0 -2
  33. data/lib/mutant/meta/example.rb +57 -18
  34. data/lib/mutant/meta/example/dsl.rb +10 -13
  35. data/lib/mutant/mutation.rb +0 -2
  36. data/lib/mutant/mutation/evil.rb +0 -2
  37. data/lib/mutant/mutation/neutral.rb +0 -2
  38. data/lib/mutant/mutator.rb +4 -31
  39. data/lib/mutant/mutator/node.rb +19 -18
  40. data/lib/mutant/mutator/node/and_asgn.rb +3 -6
  41. data/lib/mutant/mutator/node/argument.rb +0 -2
  42. data/lib/mutant/mutator/node/arguments.rb +47 -4
  43. data/lib/mutant/mutator/node/begin.rb +3 -10
  44. data/lib/mutant/mutator/node/binary.rb +0 -2
  45. data/lib/mutant/mutator/node/block.rb +0 -2
  46. data/lib/mutant/mutator/node/blockarg.rb +0 -2
  47. data/lib/mutant/mutator/node/break.rb +0 -2
  48. data/lib/mutant/mutator/node/case.rb +3 -6
  49. data/lib/mutant/mutator/node/conditional_loop.rb +0 -2
  50. data/lib/mutant/mutator/node/const.rb +1 -3
  51. data/lib/mutant/mutator/node/define.rb +0 -2
  52. data/lib/mutant/mutator/node/defined.rb +1 -3
  53. data/lib/mutant/mutator/node/dstr.rb +0 -2
  54. data/lib/mutant/mutator/node/dsym.rb +0 -2
  55. data/lib/mutant/mutator/node/generic.rb +0 -2
  56. data/lib/mutant/mutator/node/if.rb +8 -12
  57. data/lib/mutant/mutator/node/kwbegin.rb +0 -2
  58. data/lib/mutant/mutator/node/literal.rb +0 -2
  59. data/lib/mutant/mutator/node/literal/array.rb +2 -5
  60. data/lib/mutant/mutator/node/literal/boolean.rb +0 -2
  61. data/lib/mutant/mutator/node/literal/fixnum.rb +0 -2
  62. data/lib/mutant/mutator/node/literal/float.rb +0 -2
  63. data/lib/mutant/mutator/node/literal/hash.rb +0 -2
  64. data/lib/mutant/mutator/node/literal/nil.rb +0 -2
  65. data/lib/mutant/mutator/node/literal/range.rb +0 -2
  66. data/lib/mutant/mutator/node/literal/regex.rb +2 -4
  67. data/lib/mutant/mutator/node/literal/string.rb +0 -2
  68. data/lib/mutant/mutator/node/literal/symbol.rb +0 -2
  69. data/lib/mutant/mutator/node/masgn.rb +0 -2
  70. data/lib/mutant/mutator/node/mlhs.rb +0 -2
  71. data/lib/mutant/mutator/node/named_value/access.rb +0 -2
  72. data/lib/mutant/mutator/node/named_value/constant_assignment.rb +0 -2
  73. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -2
  74. data/lib/mutant/mutator/node/next.rb +0 -3
  75. data/lib/mutant/mutator/node/noop.rb +0 -2
  76. data/lib/mutant/mutator/node/nthref.rb +0 -2
  77. data/lib/mutant/mutator/node/op_asgn.rb +2 -4
  78. data/lib/mutant/mutator/node/or_asgn.rb +4 -7
  79. data/lib/mutant/mutator/node/resbody.rb +1 -1
  80. data/lib/mutant/mutator/node/rescue.rb +0 -2
  81. data/lib/mutant/mutator/node/restarg.rb +0 -2
  82. data/lib/mutant/mutator/node/return.rb +3 -6
  83. data/lib/mutant/mutator/node/send.rb +14 -8
  84. data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -2
  85. data/lib/mutant/mutator/node/send/binary.rb +1 -3
  86. data/lib/mutant/mutator/node/splat.rb +0 -2
  87. data/lib/mutant/mutator/node/super.rb +0 -2
  88. data/lib/mutant/mutator/node/when.rb +0 -2
  89. data/lib/mutant/mutator/node/yield.rb +0 -2
  90. data/lib/mutant/mutator/node/zsuper.rb +0 -2
  91. data/lib/mutant/mutator/registry.rb +0 -2
  92. data/lib/mutant/mutator/util.rb +0 -2
  93. data/lib/mutant/mutator/util/array.rb +0 -2
  94. data/lib/mutant/mutator/util/symbol.rb +0 -2
  95. data/lib/mutant/node_helpers.rb +11 -2
  96. data/lib/mutant/reporter.rb +0 -2
  97. data/lib/mutant/reporter/cli.rb +0 -2
  98. data/lib/mutant/reporter/cli/printer.rb +0 -2
  99. data/lib/mutant/reporter/cli/progress.rb +0 -2
  100. data/lib/mutant/reporter/cli/report.rb +0 -2
  101. data/lib/mutant/reporter/cli/report/config.rb +0 -2
  102. data/lib/mutant/reporter/cli/report/mutation.rb +5 -5
  103. data/lib/mutant/reporter/cli/report/subject.rb +0 -2
  104. data/lib/mutant/reporter/null.rb +0 -2
  105. data/lib/mutant/runner.rb +0 -2
  106. data/lib/mutant/runner/config.rb +0 -2
  107. data/lib/mutant/runner/mutation.rb +0 -2
  108. data/lib/mutant/runner/subject.rb +0 -2
  109. data/lib/mutant/strategy.rb +0 -2
  110. data/lib/mutant/subject.rb +0 -2
  111. data/lib/mutant/subject/method.rb +0 -2
  112. data/lib/mutant/subject/method/instance.rb +1 -3
  113. data/lib/mutant/subject/method/singleton.rb +0 -2
  114. data/lib/mutant/version.rb +1 -3
  115. data/lib/mutant/zombifier.rb +0 -2
  116. data/meta/begin.rb +10 -0
  117. data/meta/case.rb +0 -2
  118. data/meta/def.rb +19 -0
  119. data/mutant-rspec.gemspec +1 -1
  120. data/mutant.gemspec +1 -1
  121. data/spec/integration/mutant/corpus_spec.rb +81 -22
  122. data/spec/integration/mutant/null_spec.rb +1 -3
  123. data/spec/integration/mutant/rspec_spec.rb +6 -8
  124. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -2
  125. data/spec/integration/mutant/zombie_spec.rb +0 -2
  126. data/spec/integrations.yml +12 -1
  127. data/spec/shared/method_matcher_behavior.rb +0 -2
  128. data/spec/spec_helper.rb +0 -2
  129. data/spec/support/compress_helper.rb +0 -2
  130. data/spec/support/ice_nine_config.rb +0 -2
  131. data/spec/support/rspec.rb +0 -2
  132. data/spec/support/test_app.rb +0 -2
  133. data/spec/unit/mutant/cli_new_spec.rb +0 -2
  134. data/spec/unit/mutant/cli_run_spec.rb +0 -2
  135. data/spec/unit/mutant/context/root_spec.rb +0 -2
  136. data/spec/unit/mutant/context/scope/root_spec.rb +0 -2
  137. data/spec/unit/mutant/context/scope/unqualified_name_spec.rb +0 -2
  138. data/spec/unit/mutant/diff_spec.rb +0 -2
  139. data/spec/unit/mutant/expression/method_spec.rb +2 -4
  140. data/spec/unit/mutant/expression/namespace/flat_spec.rb +1 -3
  141. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +10 -6
  142. data/spec/unit/mutant/isolation_spec.rb +61 -0
  143. data/spec/unit/mutant/loader/eval_spec.rb +0 -2
  144. data/spec/unit/mutant/matcher/chain_spec.rb +4 -15
  145. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -2
  146. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -2
  147. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -2
  148. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -2
  149. data/spec/unit/mutant/matcher/namespace_spec.rb +33 -31
  150. data/spec/unit/mutant/mutation_spec.rb +0 -2
  151. data/spec/unit/mutant/runner/config_spec.rb +0 -2
  152. data/spec/unit/mutant/runner/mutation_spec.rb +0 -2
  153. data/spec/unit/mutant/runner/subject_spec.rb +0 -2
  154. data/spec/unit/mutant/strategy_spec.rb +0 -2
  155. data/spec/unit/mutant/subject/context_spec.rb +0 -2
  156. data/spec/unit/mutant/subject/mutations_spec.rb +0 -2
  157. data/spec/unit/mutant/subject/node_spec.rb +0 -2
  158. data/spec/unit/mutant/subject_spec.rb +0 -2
  159. data/spec/unit/mutant/warning_filter_spec.rb +6 -0
  160. data/spec/unit/mutant_spec.rb +0 -55
  161. data/test_app/Gemfile.devtools +15 -11
  162. data/test_app/Gemfile.rspec3 +2 -2
  163. metadata +7 -7
  164. data/lib/mutant/constants.rb +0 -45
  165. data/spec/unit/mutant/mutator_spec.rb +0 -29
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
 
5
3
  # Generator for mutations
@@ -119,12 +117,11 @@ module Mutant
119
117
  # @api private
120
118
  #
121
119
  def mutate_child(index, mutator = Mutator, &block)
122
- block ||= lambda { |_node| true }
120
+ block ||= ->(_node) { true }
123
121
  child = children.at(index)
124
122
  mutator.each(child, self) do |mutation|
125
- if block.call(mutation)
126
- emit_child_update(index, mutation)
127
- end
123
+ next unless block.call(mutation)
124
+ emit_child_update(index, mutation)
128
125
  end
129
126
  end
130
127
 
@@ -166,7 +163,7 @@ module Mutant
166
163
  # @api private
167
164
  #
168
165
  def emit_type(*children)
169
- emit(new_self(*children))
166
+ emit(Parser::AST::Node.new(node.type, children))
170
167
  end
171
168
 
172
169
  # Emit singleton literals
@@ -200,16 +197,6 @@ module Mutant
200
197
  emit(N_NIL) unless asgn_left?
201
198
  end
202
199
 
203
- # Return new self typed child
204
- #
205
- # @return [Parser::AST::Node]
206
- #
207
- # @api private
208
- #
209
- def new_self(*children)
210
- Parser::AST::Node.new(node.type, children)
211
- end
212
-
213
200
  # Emit values
214
201
  #
215
202
  # @param [Array<Object>] values
@@ -224,6 +211,20 @@ module Mutant
224
211
  end
225
212
  end
226
213
 
214
+ # Return parent node
215
+ #
216
+ # @return [Parser::AST::Node] node
217
+ # if parent with node is presnet
218
+ #
219
+ # @return [nil]
220
+ # otherwise
221
+ #
222
+ # @api private
223
+ #
224
+ def parent_node
225
+ parent.node if parent
226
+ end
227
+
227
228
  # Return parent type
228
229
  #
229
230
  # @return [Symbol] type
@@ -235,7 +236,7 @@ module Mutant
235
236
  # @api private
236
237
  #
237
238
  def parent_type
238
- parent && parent.node.type
239
+ parent_node.type if parent_node
239
240
  end
240
241
 
241
242
  # Test if the node is the left of an or_asgn or op_asgn
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -21,14 +19,13 @@ module Mutant
21
19
  #
22
20
  def dispatch
23
21
  emit_singletons
24
- emit_left_mutations do |mutation|
25
- !mutation.type.equal?(:self)
22
+ emit_left_mutations do |node|
23
+ !n_self?(node)
26
24
  end
27
25
  emit_right_mutations
28
26
  end
29
27
 
30
- end # OrAsgn
28
+ end # AndAsgn
31
29
  end # Node
32
30
  end # Mutator
33
31
  end # Mutant
34
-
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -17,10 +15,55 @@ module Mutant
17
15
  # @api private
18
16
  #
19
17
  def dispatch
20
- emit_children_mutations
18
+ emit_argument_presence
19
+ emit_argument_mutations
21
20
  emit_mlhs_expansion
22
21
  end
23
22
 
23
+ # Emit argument presence mutation
24
+ #
25
+ # @return [undefined]
26
+ #
27
+ # @api private
28
+ #
29
+ def emit_argument_presence
30
+ emit_type
31
+ Mutator::Util::Array::Presence.each(children, self) do |children|
32
+ emit_type(*children)
33
+ end
34
+ end
35
+
36
+ # Emit argument mutations
37
+ #
38
+ # @return [undefined]
39
+ #
40
+ # @api private
41
+ #
42
+ def emit_argument_mutations
43
+ children.each_with_index do |child, index|
44
+ Mutator.each(child) do |mutant|
45
+ next if invalid_argument_replacement?(mutant, index)
46
+ emit_child_update(index, mutant)
47
+ end
48
+ end
49
+ end
50
+
51
+ # Test if child mutation is allowed
52
+ #
53
+ # @param [Parser::AST::Node]
54
+ #
55
+ # @return [Boolean]
56
+ #
57
+ # @api private
58
+ #
59
+ def invalid_argument_replacement?(mutant, index)
60
+ original = children.fetch(index)
61
+
62
+ n_optarg?(original) &&
63
+ n_arg?(mutant) &&
64
+ children[0...index].any?(&method(:n_optarg?))
65
+ end
66
+
24
67
  # Emit mlhs expansions
25
68
  #
26
69
  # @return [undefined]
@@ -44,7 +87,7 @@ module Mutant
44
87
  #
45
88
  def mlhs_childs_with_index
46
89
  children.each_with_index.select do |child, _index|
47
- child.type == :mlhs
90
+ n_mlhs?(child)
48
91
  end
49
92
  end
50
93
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -23,7 +21,7 @@ module Mutant
23
21
  end
24
22
  children.each_with_index do |child, index|
25
23
  mutate_child(index)
26
- emit(child)
24
+ emit(child) unless children.eql?([child])
27
25
  end
28
26
  end
29
27
 
@@ -36,13 +34,8 @@ module Mutant
36
34
  # @api private
37
35
  #
38
36
  def emit_child_subset(children)
39
- case children.length
40
- when 0
41
- when 1
42
- emit(children.first)
43
- else
44
- emit_type(*children)
45
- end
37
+ return if children.length < 2
38
+ emit_type(*children)
46
39
  end
47
40
 
48
41
  end # Block
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -50,10 +48,9 @@ module Mutant
50
48
  def emit_else_mutations
51
49
  else_branch = children.last
52
50
  else_index = children.length - 1
53
- if else_branch
54
- mutate_child(else_index)
55
- emit_child_update(else_index, nil)
56
- end
51
+ return unless else_branch
52
+ mutate_child(else_index)
53
+ emit_child_update(else_index, nil)
57
54
  end
58
55
 
59
56
  end # Case
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -18,7 +16,7 @@ module Mutant
18
16
  # @api private
19
17
  #
20
18
  def dispatch
21
- emit_singletons unless parent_type == :const
19
+ emit_singletons unless parent_node && n_const?(parent_node)
22
20
  emit_type(nil, *children.drop(1))
23
21
  children.each_with_index do |child, index|
24
22
  mutate_child(index) if child.kind_of?(Parser::AST::Node)
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -20,7 +18,7 @@ module Mutant
20
18
  #
21
19
  def dispatch
22
20
  emit_expression_mutations do |node|
23
- !node.type.equal?(:self)
21
+ !n_self?(node)
24
22
  end
25
23
  end
26
24
 
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -33,9 +31,9 @@ module Mutant
33
31
  #
34
32
  def mutate_condition
35
33
  emit_condition_mutations do |condition|
36
- !condition.type.eql?(:self)
34
+ !n_self?(condition)
37
35
  end
38
- emit_type(n_not(condition), if_branch, else_branch) unless condition.type == :match_current_line
36
+ emit_type(n_not(condition), if_branch, else_branch) unless n_match_current_line?(condition)
39
37
  emit_type(N_TRUE, if_branch, else_branch)
40
38
  emit_type(N_FALSE, if_branch, else_branch)
41
39
  end
@@ -48,10 +46,9 @@ module Mutant
48
46
  #
49
47
  def mutate_if_branch
50
48
  emit_type(condition, else_branch, nil) if else_branch
51
- if if_branch
52
- emit_if_branch_mutations
53
- emit_type(condition, if_branch, nil)
54
- end
49
+ return unless if_branch
50
+ emit_if_branch_mutations
51
+ emit_type(condition, if_branch, nil)
55
52
  end
56
53
 
57
54
  # Emit else branch mutations
@@ -61,10 +58,9 @@ module Mutant
61
58
  # @api private
62
59
  #
63
60
  def mutate_else_branch
64
- if else_branch
65
- emit_else_branch_mutations
66
- emit_type(condition, nil, else_branch)
67
- end
61
+ return unless else_branch
62
+ emit_else_branch_mutations
63
+ emit_type(condition, nil, else_branch)
68
64
  end
69
65
 
70
66
  end # If
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -21,9 +19,8 @@ module Mutant
21
19
  emit_singletons
22
20
  emit_type
23
21
  mutate_body
24
- if children.one?
25
- emit(children.first)
26
- end
22
+ return unless children.one?
23
+ emit(children.first)
27
24
  end
28
25
 
29
26
  # Mutate body
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -1,5 +1,3 @@
1
- # encoding: utf-8
2
-
3
1
  module Mutant
4
2
  class Mutator
5
3
  class Node
@@ -31,9 +29,9 @@ module Mutant
31
29
  # @api private
32
30
  #
33
31
  def dispatch
34
- emit_singletons unless parent_type == :match_current_line
32
+ emit_singletons unless parent_node && n_match_current_line?(parent_node)
35
33
  children.each_with_index do |child, index|
36
- mutate_child(index) unless child.type == :str
34
+ mutate_child(index) unless n_str?(child)
37
35
  end
38
36
  emit_type(options)
39
37
  emit_type(s(:str, NULL_REGEXP_SOURCE), options)