mutant 0.5.19 → 0.5.20

Sign up to get free protection for your applications and to get access to all the features.
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)