mutant 0.2.20 → 0.3.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (201) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +10 -11
  3. data/Changelog.md +93 -38
  4. data/Gemfile +3 -1
  5. data/Gemfile.devtools +16 -20
  6. data/Guardfile +1 -1
  7. data/README.md +36 -16
  8. data/Rakefile +21 -2
  9. data/TODO +11 -7
  10. data/bin/mutant +4 -0
  11. data/bin/zombie +4 -0
  12. data/config/devtools.yml +2 -0
  13. data/config/flay.yml +2 -2
  14. data/config/flog.yml +1 -1
  15. data/config/{site.reek → reek.yml} +94 -70
  16. data/lib/mutant/cli/classifier/method.rb +100 -0
  17. data/lib/mutant/cli/classifier/namespace.rb +47 -0
  18. data/lib/mutant/cli/classifier/scope.rb +35 -0
  19. data/lib/mutant/cli/classifier.rb +141 -0
  20. data/lib/mutant/cli.rb +115 -162
  21. data/lib/mutant/color.rb +2 -2
  22. data/lib/mutant/config.rb +27 -0
  23. data/lib/mutant/constants.rb +32 -17
  24. data/lib/mutant/context/scope.rb +33 -51
  25. data/lib/mutant/context.rb +8 -19
  26. data/lib/mutant/differ.rb +5 -5
  27. data/lib/mutant/helper.rb +2 -17
  28. data/lib/mutant/killer/forked.rb +44 -0
  29. data/lib/mutant/killer/forking.rb +3 -57
  30. data/lib/mutant/killer/rspec.rb +16 -20
  31. data/lib/mutant/killer/static.rb +6 -7
  32. data/lib/mutant/killer.rb +48 -74
  33. data/lib/mutant/loader.rb +6 -6
  34. data/lib/mutant/matcher/chain.rb +4 -25
  35. data/lib/mutant/matcher/method/instance.rb +14 -24
  36. data/lib/mutant/matcher/method/singleton.rb +35 -46
  37. data/lib/mutant/matcher/method.rb +95 -83
  38. data/lib/mutant/matcher/{scope_methods.rb → methods.rb} +53 -76
  39. data/lib/mutant/matcher/namespace.rb +71 -0
  40. data/lib/mutant/matcher/scope.rb +34 -0
  41. data/lib/mutant/matcher.rb +24 -34
  42. data/lib/mutant/mutation/evil.rb +35 -0
  43. data/lib/mutant/mutation/filter/code.rb +7 -28
  44. data/lib/mutant/mutation/filter/regexp.rb +6 -18
  45. data/lib/mutant/mutation/filter/whitelist.rb +5 -4
  46. data/lib/mutant/mutation/filter.rb +10 -9
  47. data/lib/mutant/mutation/neutral.rb +35 -0
  48. data/lib/mutant/mutation.rb +21 -61
  49. data/lib/mutant/mutator/node/argument.rb +88 -0
  50. data/lib/mutant/mutator/node/arguments.rb +52 -0
  51. data/lib/mutant/mutator/node/assignment.rb +34 -38
  52. data/lib/mutant/mutator/node/begin.rb +33 -0
  53. data/lib/mutant/mutator/node/block.rb +14 -14
  54. data/lib/mutant/mutator/node/case.rb +59 -0
  55. data/lib/mutant/mutator/node/define.rb +26 -22
  56. data/lib/mutant/mutator/node/if.rb +31 -71
  57. data/lib/mutant/mutator/node/literal/array.rb +25 -9
  58. data/lib/mutant/mutator/node/literal/boolean.rb +13 -30
  59. data/lib/mutant/mutator/node/literal/dynamic.rb +6 -5
  60. data/lib/mutant/mutator/node/literal/fixnum.rb +18 -7
  61. data/lib/mutant/mutator/node/literal/float.rb +15 -8
  62. data/lib/mutant/mutator/node/literal/hash.rb +33 -52
  63. data/lib/mutant/mutator/node/literal/nil.rb +8 -7
  64. data/lib/mutant/mutator/node/literal/range.rb +25 -50
  65. data/lib/mutant/mutator/node/literal/regex.rb +15 -23
  66. data/lib/mutant/mutator/node/literal/string.rb +7 -6
  67. data/lib/mutant/mutator/node/literal/symbol.rb +7 -6
  68. data/lib/mutant/mutator/node/literal.rb +4 -46
  69. data/lib/mutant/mutator/node/mlhs.rb +27 -0
  70. data/lib/mutant/mutator/node/noop.rb +18 -43
  71. data/lib/mutant/mutator/node/return.rb +8 -8
  72. data/lib/mutant/mutator/node/send/binary.rb +31 -0
  73. data/lib/mutant/mutator/node/send.rb +106 -72
  74. data/lib/mutant/mutator/node/super.rb +15 -20
  75. data/lib/mutant/mutator/node/when.rb +32 -7
  76. data/lib/mutant/mutator/node/while.rb +9 -7
  77. data/lib/mutant/mutator/node.rb +116 -66
  78. data/lib/mutant/mutator/registry.rb +14 -11
  79. data/lib/mutant/mutator/util/array.rb +9 -9
  80. data/lib/mutant/mutator/util/symbol.rb +6 -20
  81. data/lib/mutant/mutator/util.rb +6 -3
  82. data/lib/mutant/mutator.rb +12 -28
  83. data/lib/mutant/node_helpers.rb +28 -0
  84. data/lib/mutant/random.rb +3 -2
  85. data/lib/mutant/reporter/cli/printer/config.rb +174 -0
  86. data/lib/mutant/reporter/cli/printer/killer.rb +42 -0
  87. data/lib/mutant/reporter/cli/printer/mutation.rb +55 -0
  88. data/lib/mutant/reporter/cli/printer/subject.rb +147 -0
  89. data/lib/mutant/reporter/cli/printer.rb +165 -0
  90. data/lib/mutant/reporter/cli.rb +9 -277
  91. data/lib/mutant/reporter/null.rb +6 -30
  92. data/lib/mutant/reporter.rb +6 -73
  93. data/lib/mutant/runner/config.rb +82 -0
  94. data/lib/mutant/runner/mutation.rb +58 -0
  95. data/lib/mutant/runner/subject.rb +81 -0
  96. data/lib/mutant/runner.rb +42 -92
  97. data/lib/mutant/singleton_methods.rb +2 -2
  98. data/lib/mutant/strategy/method_expansion.rb +51 -0
  99. data/lib/mutant/strategy/rspec/dm2/lookup/method.rb +142 -0
  100. data/lib/mutant/strategy/rspec/dm2/lookup.rb +61 -0
  101. data/lib/mutant/strategy/rspec/dm2.rb +22 -0
  102. data/lib/mutant/strategy/rspec.rb +20 -22
  103. data/lib/mutant/strategy/static.rb +18 -0
  104. data/lib/mutant/strategy.rb +15 -50
  105. data/lib/mutant/subject/method.rb +100 -0
  106. data/lib/mutant/subject.rb +18 -49
  107. data/lib/mutant/support/method_object.rb +4 -2
  108. data/lib/mutant.rb +40 -35
  109. data/mutant.gemspec +9 -8
  110. data/spec/integration/mutant/rspec_killer_spec.rb +3 -3
  111. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +9 -0
  112. data/spec/integration/mutant/zombie_spec.rb +1 -1
  113. data/spec/shared/method_matcher_behavior.rb +35 -0
  114. data/spec/shared/mutator_behavior.rb +63 -32
  115. data/spec/spec_helper.rb +13 -3
  116. data/spec/support/ice_nine_config.rb +8 -0
  117. data/spec/support/rspec.rb +1 -1
  118. data/spec/support/zombie.rb +1 -1
  119. data/spec/unit/mutant/cli/class_methods/new_spec.rb +42 -28
  120. data/spec/unit/mutant/cli/class_methods/run_spec.rb +15 -13
  121. data/spec/unit/mutant/cli/classifier/class_methods/build_spec.rb +44 -0
  122. data/spec/unit/mutant/context/scope/root_spec.rb +4 -4
  123. data/spec/unit/mutant/killer/rspec/class_methods/new_spec.rb +6 -5
  124. data/spec/unit/mutant/killer/success_predicate_spec.rb +28 -0
  125. data/spec/unit/mutant/loader/eval/class_methods/run_spec.rb +1 -1
  126. data/spec/unit/mutant/matcher/chain/each_spec.rb +1 -1
  127. data/spec/unit/mutant/matcher/chain/matchers_spec.rb +1 -1
  128. data/spec/unit/mutant/matcher/method/instance/each_spec.rb +112 -0
  129. data/spec/unit/mutant/matcher/method/singleton/each_spec.rb +93 -0
  130. data/spec/unit/mutant/matcher/methods/instance/each_spec.rb +59 -0
  131. data/spec/unit/mutant/matcher/methods/singleton/each_spec.rb +53 -0
  132. data/spec/unit/mutant/matcher/namespace/each_spec.rb +37 -0
  133. data/spec/unit/mutant/mutator/node/begin/mutation_spec.rb +33 -0
  134. data/spec/unit/mutant/mutator/node/block/mutation_spec.rb +42 -14
  135. data/spec/unit/mutant/mutator/node/case/mutation_spec.rb +319 -0
  136. data/spec/unit/mutant/mutator/node/define/mutation_spec.rb +31 -27
  137. data/spec/unit/mutant/mutator/node/if/mutation_spec.rb +75 -0
  138. data/spec/unit/mutant/mutator/node/literal/fixnum_spec.rb +1 -1
  139. data/spec/unit/mutant/mutator/node/literal/hash_spec.rb +2 -2
  140. data/spec/unit/mutant/mutator/node/literal/nil_spec.rb +1 -3
  141. data/spec/unit/mutant/mutator/node/literal/regex_spec.rb +1 -9
  142. data/spec/unit/mutant/mutator/node/return/mutation_spec.rb +6 -2
  143. data/spec/unit/mutant/mutator/node/send/mutation_spec.rb +111 -108
  144. data/spec/unit/mutant/mutator/node/super/mutation_spec.rb +0 -33
  145. data/spec/unit/mutant/mutator/node/while/mutation_spec.rb +2 -2
  146. data/spec/unit/mutant/runner/config/subjects_spec.rb +38 -0
  147. data/spec/unit/mutant/runner/config/success_predicate_spec.rb +53 -0
  148. data/spec/unit/mutant/runner/failed_predicte_spec.rb +33 -0
  149. data/spec/unit/mutant/runner/mutation/killer_spec.rb +39 -0
  150. data/spec/unit/mutant/runner/subject/success_predicate_spec.rb +49 -0
  151. data/spec/unit/mutant/strategy/method_expansion/class_methods/run_spec.rb +49 -0
  152. data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/instance/spec_files_spec.rb +52 -0
  153. data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/singleton/spec_files_spec.rb +42 -0
  154. data/spec/unit/mutant/subject/context_spec.rb +6 -3
  155. data/spec/unit/mutant/subject/each_spec.rb +11 -8
  156. data/spec/unit/mutant/subject/node_spec.rb +6 -2
  157. data/test_app/spec/shared/method_filter_parse_behavior.rb +0 -2
  158. data/test_app/spec/shared/method_match_behavior.rb +1 -1
  159. data/test_app/spec/spec_helper.rb +4 -2
  160. metadata +101 -109
  161. data/config/roodi.yml +0 -26
  162. data/lib/mutant/matcher/method/classifier.rb +0 -141
  163. data/lib/mutant/matcher/object_space.rb +0 -114
  164. data/lib/mutant/mutator/node/actual_arguments.rb +0 -25
  165. data/lib/mutant/mutator/node/default_arguments.rb +0 -25
  166. data/lib/mutant/mutator/node/formal_arguments_19/default_mutations.rb +0 -33
  167. data/lib/mutant/mutator/node/formal_arguments_19/pattern_argument_expansion.rb +0 -35
  168. data/lib/mutant/mutator/node/formal_arguments_19/require_defaults.rb +0 -37
  169. data/lib/mutant/mutator/node/formal_arguments_19.rb +0 -41
  170. data/lib/mutant/mutator/node/iter_19.rb +0 -27
  171. data/lib/mutant/mutator/node/literal/empty_array.rb +0 -26
  172. data/lib/mutant/mutator/node/pattern_arguments.rb +0 -41
  173. data/lib/mutant/mutator/node/pattern_variable.rb +0 -23
  174. data/lib/mutant/mutator/node/receiver_case.rb +0 -122
  175. data/lib/mutant/mutator/node/send/binary_operator_method.rb +0 -61
  176. data/lib/mutant/mutator/node/send/with_arguments.rb +0 -81
  177. data/lib/mutant/reporter/stats.rb +0 -120
  178. data/lib/mutant/strategy/rspec/example_lookup.rb +0 -163
  179. data/spec/integration/mutant/method_matching_spec.rb +0 -269
  180. data/spec/shared/method_match_behavior.rb +0 -39
  181. data/spec/unit/mutant/killer/fail_ques_spec.rb +0 -39
  182. data/spec/unit/mutant/matcher/class_methods/from_string_spec.rb +0 -49
  183. data/spec/unit/mutant/matcher/class_methods/parse_spec.rb +0 -12
  184. data/spec/unit/mutant/matcher/method/class_methods/parse_spec.rb +0 -21
  185. data/spec/unit/mutant/matcher/method/classifier/class_methods/run_spec.rb +0 -52
  186. data/spec/unit/mutant/matcher/object_space/class_methods/parse_spec.rb +0 -24
  187. data/spec/unit/mutant/matcher/object_space/each_spec.rb +0 -31
  188. data/spec/unit/mutant/mutator/node/if_statement/mutation_spec.rb +0 -60
  189. data/spec/unit/mutant/mutator/node/receiver_case/mutation_spec.rb +0 -27
  190. data/spec/unit/mutant/strategy/rspec/example_lookup/spec_file_spec.rb +0 -236
  191. data/spec/unit/mutant/subject/class_methods/new_spec.rb +0 -13
  192. data/tasks/metrics/ci.rake +0 -7
  193. data/tasks/metrics/flay.rake +0 -41
  194. data/tasks/metrics/flog.rake +0 -43
  195. data/tasks/metrics/heckle.rake +0 -216
  196. data/tasks/metrics/metric_fu.rake +0 -31
  197. data/tasks/metrics/reek.rake +0 -15
  198. data/tasks/metrics/roodi.rake +0 -15
  199. data/tasks/metrics/yardstick.rake +0 -23
  200. data/tasks/spec.rake +0 -45
  201. data/tasks/yard.rake +0 -9
@@ -1,114 +0,0 @@
1
- module Mutant
2
- class Matcher
3
- # Matcher against object space
4
- class ObjectSpace < self
5
- include Equalizer.new(:scope_name_pattern)
6
-
7
- PATTERN = %r(\A::(.+)\z)
8
-
9
- # Parse matcher
10
- #
11
- # @param [String] input
12
- #
13
- # @return [Matcher::ObjectSpace]
14
- # returns object space matcher if successful
15
- #
16
- # @return [nil]
17
- # returns nil otherwise
18
- #
19
- # @api private
20
- #
21
- def self.parse(input)
22
- match = PATTERN.match(input)
23
- return unless match
24
-
25
- new(%r(\A#{Regexp.escape(match[1])}(\z|::)))
26
- end
27
-
28
- # Enumerate subjects
29
- #
30
- # @return [Enumerator<Subject>]
31
- # returns subject enumerator when no block given
32
- #
33
- # @return [self]
34
- # returns self otherwise
35
- #
36
- # @api private
37
- #
38
- def each(&block)
39
- return to_enum unless block_given?
40
-
41
- scopes.each do |scope|
42
- emit_scope_matches(scope, &block)
43
- end
44
-
45
- self
46
- end
47
-
48
- # Return scope name pattern
49
- #
50
- # @return [Regexp]
51
- #
52
- # @api private
53
- #
54
- def scope_name_pattern; @scope_name_pattern; end
55
-
56
- private
57
-
58
- # Initialize object space matcher
59
- #
60
- # @param [Regexp] scope_name_pattern
61
- # @param [Enumerable<#each(scope)>] matchers
62
- #
63
- # @return [undefined]
64
- #
65
- # @api private
66
- #
67
- def initialize(scope_name_pattern, matchers = [Matcher::ScopeMethods::Singleton, Matcher::ScopeMethods::Instance])
68
- @scope_name_pattern, @matchers = scope_name_pattern, @matchers = matchers #[Method::Singleton, Method::Instance]
69
- end
70
-
71
- # Yield matchers for scope
72
- #
73
- # @param [::Class,::Module] scope
74
- #
75
- # @return [undefined]
76
- #
77
- # @api private
78
- #
79
- def emit_scope_matches(scope, &block)
80
- @matchers.each do |matcher|
81
- matcher.new(scope).each(&block)
82
- end
83
- end
84
-
85
- # Return scope enumerator
86
- #
87
- # @return [Enumerable<Object>]
88
- #
89
- # @api private
90
- #
91
- def scopes(&block)
92
- return to_enum(__method__) unless block_given?
93
-
94
- ::ObjectSpace.each_object(Module) do |scope|
95
- emit_scope(scope, &block)
96
- end
97
- end
98
-
99
- # Yield scope if name matches pattern
100
- #
101
- # @param [::Module,::Class] scope
102
- #
103
- # @return [undefined]
104
- #
105
- # @api private
106
- #
107
- def emit_scope(scope)
108
- if [::Module, ::Class].include?(scope.class) and @scope_name_pattern =~ scope.name
109
- yield scope
110
- end
111
- end
112
- end
113
- end
114
- end
@@ -1,25 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
-
5
- # Mutator for arguments
6
- class Arguments < self
7
-
8
- handle(Rubinius::AST::ActualArguments)
9
-
10
- private
11
-
12
- # Emit mutations
13
- #
14
- # @return [undefined]
15
- #
16
- # @api private
17
- #
18
- def dispatch
19
- emit_attribute_mutations(:array)
20
- end
21
-
22
- end
23
- end
24
- end
25
- end
@@ -1,25 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
- # Mutantor for default arguments
5
- class DefaultArguments < self
6
- handle(Rubinius::AST::DefaultArguments)
7
-
8
- private
9
-
10
- # Emit mutations
11
- #
12
- # @return [undefined]
13
- #
14
- # @api private
15
- #
16
- def dispatch
17
- emit_attribute_mutations(:arguments) do |argument|
18
- argument.names = argument.arguments.map(&:name)
19
- argument
20
- end
21
- end
22
- end
23
- end
24
- end
25
- end
@@ -1,33 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
- class FormalArguments19
5
-
6
- # Mutator for default argument values
7
- class DefaultMutations < Node
8
-
9
- private
10
-
11
- # Emit mutations
12
- #
13
- # @return [undefined]
14
- #
15
- # @api private
16
- #
17
- def dispatch
18
- return unless node.defaults
19
- emit_attribute_mutations(:defaults) do |mutation|
20
- mutation.optional = mutation.defaults.names
21
- mutation.names = mutation.required + mutation.optional
22
- if mutation.defaults.names.empty?
23
- mutation.defaults = nil
24
- end
25
- mutation
26
- end
27
- end
28
-
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,35 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
- class FormalArguments19
5
-
6
- # Mutator that expands pattern arguments
7
- class PatternArgumentExpansion < Node
8
-
9
- private
10
-
11
- # Emit mutations
12
- #
13
- # @return [undefined]
14
- #
15
- # @api private
16
- #
17
- def dispatch
18
- node.required.each_with_index do |argument, index|
19
- next unless argument.kind_of?(Rubinius::AST::PatternArguments)
20
- dup = dup_node
21
- required = dup.required
22
- required.delete_at(index)
23
- argument.arguments.body.reverse.each do |node|
24
- required.insert(index, node.name)
25
- end
26
- dup.names |= required
27
- emit(dup)
28
- end
29
- end
30
-
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,37 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
- class FormalArguments19
5
-
6
- # Mutator for removing defaults and transform them into required arguments
7
- class RequireDefaults < Node
8
-
9
- private
10
-
11
- # Emit mutants
12
- #
13
- # @return [undefined]
14
- #
15
- # @api private
16
- #
17
- def dispatch
18
- return unless node.defaults
19
- arguments = node.defaults.arguments
20
- arguments.each_index do |index|
21
- names = arguments.take(index+1).map(&:name)
22
- dup = dup_node
23
- defaults = dup.defaults
24
- defaults.arguments = defaults.arguments.drop(names.size)
25
- names.each { |name| dup.optional.delete(name) }
26
- dup.required.concat(names)
27
- if dup.optional.empty?
28
- dup.defaults = nil
29
- end
30
- emit(dup)
31
- end
32
- end
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,41 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
-
5
- # Mutator for formal arguments in 1.9 mode
6
- class FormalArguments19 < self
7
-
8
- private
9
-
10
- handle(Rubinius::AST::FormalArguments19)
11
-
12
- # Emit mutations
13
- #
14
- # @return [undefined]
15
- #
16
- # @api private
17
- #
18
- def dispatch
19
- run(DefaultMutations)
20
- run(RequireDefaults)
21
- run(PatternArgumentExpansion)
22
- emit_required_mutations
23
- end
24
-
25
-
26
- # Emit required mutations
27
- #
28
- # @return [undefined]
29
- #
30
- # @api private
31
- #
32
- def emit_required_mutations
33
- emit_attribute_mutations(:required) do |mutation|
34
- mutation.names = mutation.optional + mutation.required
35
- mutation
36
- end
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,27 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
- # Emitter for mutations on 19 blocks
5
- class Iter19 < self
6
-
7
- handle(Rubinius::AST::Iter19)
8
-
9
- # Emit mutants
10
- #
11
- # @return [undefined]
12
- #
13
- # @api private
14
- #
15
- def dispatch
16
- emit_attribute_mutations(:body)
17
- emit_attribute_mutations(:arguments) do |mutation|
18
- arguments = mutation.arguments
19
- arguments.names = arguments.required + arguments.optional
20
- mutation
21
- end if node.arguments
22
- end
23
-
24
- end
25
- end
26
- end
27
- end
@@ -1,26 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
- class Literal < self
5
- # Mutator for empty array literals
6
- class EmptyArray < self
7
-
8
- handle(Rubinius::AST::EmptyArray)
9
-
10
- private
11
-
12
- # Emit mutants
13
- #
14
- # @return [undefined]
15
- #
16
- # @api private
17
- #
18
- def dispatch
19
- emit_nil
20
- emit_node(Rubinius::AST::ArrayLiteral, [new_nil])
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,41 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
- # Mutator for pattern arguments
5
- class PatternArguments < self
6
-
7
- handle(Rubinius::AST::PatternArguments)
8
-
9
- private
10
-
11
- # Emit mutations
12
- #
13
- # @return [undefined]
14
- #
15
- # @api private
16
- #
17
- def dispatch
18
- Mutator.each(node.arguments.body) do |mutation|
19
- dup = dup_node
20
- dup.arguments.body = mutation
21
- emit(dup)
22
- end
23
- end
24
-
25
- # Test if mutation should be skipped
26
- #
27
- # @return [true]
28
- # if mutation should be skipped
29
- #
30
- # @return [false]
31
- # otherwise
32
- #
33
- # @api private
34
- #
35
- def allow?(object)
36
- object.arguments.body.size >= 2
37
- end
38
- end
39
- end
40
- end
41
- end
@@ -1,23 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
- # Mutator for pattern variable
5
- class PatternVariable < self
6
-
7
- handle(Rubinius::AST::PatternVariable)
8
-
9
- private
10
-
11
- # Emit mutations
12
- #
13
- # @return [undefined]
14
- #
15
- # @api private
16
- #
17
- def dispatch
18
- emit_attribute_mutations(:name)
19
- end
20
- end
21
- end
22
- end
23
- end
@@ -1,122 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
-
5
- # Mutator for Rubinius::AST::ReceiverCase nodes
6
- class ReceiverCase < self
7
-
8
- handle(Rubinius::AST::ReceiverCase)
9
-
10
- private
11
-
12
- # Emit mutations
13
- #
14
- # @return [undefined]
15
- #
16
- # @api private
17
- #
18
- def dispatch
19
- emit_attribute_mutations(:receiver)
20
- emit_when_branch_presence_mutations
21
- emit_else_branch_presence_mutation
22
- emit_when_branch_mutations
23
- end
24
-
25
- # Emit else branch presence mutation
26
- #
27
- # @return [undefined]
28
- #
29
- # @api private
30
- #
31
- def emit_else_branch_presence_mutation
32
- emit_self(receiver, when_branches, nil)
33
- end
34
-
35
- # Emit when branch body mutations
36
- #
37
- # @return [undefined]
38
- #
39
- # @api private
40
- #
41
- def emit_when_branch_mutations
42
- when_branches.each_with_index do |branch, index|
43
- Mutator.each(branch) do |mutant|
44
- branches = dup_when_branches
45
- branches[index]=mutant
46
- emit_self(receiver, branches, else_branch)
47
- end
48
- end
49
- end
50
-
51
- # Emit when branch presence mutations
52
- #
53
- # @return [undefined]
54
- #
55
- # @api private
56
- #
57
- def emit_when_branch_presence_mutations
58
- return if one?
59
- when_branches.each_index do |index|
60
- dup_branches = dup_when_branches
61
- dup_branches.delete_at(index)
62
- emit_self(receiver, dup_branches, else_branch)
63
- end
64
- end
65
-
66
- # Check for case there is only one when branch
67
- #
68
- # @return [true]
69
- # returns true when there is only one when branch
70
- #
71
- # @return [false]
72
- # returns false otherwise
73
- #
74
- # @api private
75
- #
76
- def one?
77
- when_branches.one?
78
- end
79
-
80
- # Return duplicate of when branches
81
- #
82
- # @return [Array]
83
- #
84
- # @api private
85
- #
86
- def dup_when_branches
87
- when_branches.dup
88
- end
89
-
90
- # Return when branches
91
- #
92
- # @return [Array]
93
- #
94
- # @api private
95
- #
96
- def when_branches
97
- node.whens
98
- end
99
-
100
- # Return receiver
101
- #
102
- # @return [Rubinius::AST::Node]
103
- #
104
- # @api private
105
- #
106
- def receiver
107
- node.receiver
108
- end
109
-
110
- # Return else branch
111
- #
112
- # @return [Rubinius::AST::Node]
113
- #
114
- # @api private
115
- #
116
- def else_branch
117
- node.else
118
- end
119
- end
120
- end
121
- end
122
- end
@@ -1,61 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
- class Send
5
-
6
- # Mutator for sends that correspond to a binary operator
7
- class BinaryOperatorMethod < Node
8
-
9
- private
10
-
11
- # Emit mutations
12
- #
13
- # @return [undefined]
14
- #
15
- # @api private
16
- #
17
- def dispatch
18
- emit_left_mutations
19
- emit_right_mutations
20
- emit(right)
21
- end
22
-
23
- # Emit left mutations
24
- #
25
- # @return [undefined]
26
- #
27
- # @api private
28
- #
29
- def emit_left_mutations
30
- emit_attribute_mutations(:receiver)
31
- end
32
-
33
- # Return right
34
- #
35
- # @return [Rubinius::AST::Node]
36
- #
37
- # @api private
38
- #
39
- def right
40
- node.arguments.array.first
41
- end
42
-
43
- # Emit right mutations
44
- #
45
- # @return [undefined]
46
- #
47
- # @api private
48
- #
49
- def emit_right_mutations
50
- Mutator.each(right).each do |mutated|
51
- dup = dup_node
52
- dup.arguments.array[0] = mutated
53
- emit(dup)
54
- end
55
- end
56
- end
57
-
58
- end
59
- end
60
- end
61
- end
@@ -1,81 +0,0 @@
1
- module Mutant
2
- class Mutator
3
- class Node
4
- class Send
5
-
6
- # Mutator for send with arguments
7
- class WithArguments < self
8
-
9
- handle(Rubinius::AST::SendWithArguments)
10
-
11
- private
12
-
13
- # Emit mutations
14
- #
15
- # @return [undefined]
16
- #
17
- # @api private
18
- #
19
- def dispatch
20
- super
21
-
22
- if binary_operator?
23
- run(BinaryOperatorMethod)
24
- return
25
- end
26
-
27
- emit_send_remove_mutation
28
- emit_argument_mutations
29
- end
30
-
31
- # Test if message is a binary operator
32
- #
33
- # @return [true]
34
- # if message is a binary operator
35
- #
36
- # @return [false]
37
- # otherwise
38
- #
39
- # @api private
40
- #
41
- def binary_operator?
42
- Mutant::BINARY_METHOD_OPERATORS.include?(node.name)
43
- end
44
-
45
- # Emit argument mutations
46
- #
47
- # @api private
48
- #
49
- # @return [undefined]
50
- #
51
- # @api private
52
- #
53
- def emit_argument_mutations
54
- emit_attribute_mutations(:arguments) do |mutation|
55
- if mutation.arguments.array.empty?
56
- mutation = new_send(receiver, node.name)
57
- mutation.privately = node.privately
58
- mutation
59
- else
60
- mutation
61
- end
62
- end
63
- end
64
-
65
- # Emit send remove mutation
66
- #
67
- # @return [undefined]
68
- #
69
- # @api private
70
- #
71
- def emit_send_remove_mutation
72
- array = node.arguments.array
73
- return unless array.length == 1
74
- emit(array.first)
75
- end
76
- end
77
-
78
- end
79
- end
80
- end
81
- end