mutant 0.1.1 → 0.2.0

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 (225) hide show
  1. data/.gitignore +5 -11
  2. data/.rspec +0 -1
  3. data/.travis.yml +14 -3
  4. data/Changelog.md +3 -0
  5. data/Gemfile +5 -1
  6. data/Gemfile.devtools +49 -0
  7. data/Guardfile +18 -0
  8. data/README.md +67 -0
  9. data/Rakefile +4 -1
  10. data/TODO +13 -0
  11. data/bin/mutant +14 -0
  12. data/bin/zombie +14 -0
  13. data/config/flay.yml +3 -0
  14. data/config/flog.yml +2 -0
  15. data/config/roodi.yml +26 -0
  16. data/config/site.reek +93 -0
  17. data/config/yardstick.yml +2 -0
  18. data/lib/inflector.rb +7 -0
  19. data/lib/inflector/defaults.rb +62 -0
  20. data/lib/inflector/inflections.rb +209 -0
  21. data/lib/inflector/methods.rb +149 -0
  22. data/lib/inflector/version.rb +3 -0
  23. data/lib/mutant.rb +96 -21
  24. data/lib/mutant/cli.rb +309 -0
  25. data/lib/mutant/color.rb +61 -0
  26. data/lib/mutant/context.rb +36 -0
  27. data/lib/mutant/context/scope.rb +138 -0
  28. data/lib/mutant/differ.rb +100 -0
  29. data/lib/mutant/helper.rb +38 -0
  30. data/lib/mutant/killer.rb +136 -0
  31. data/lib/mutant/killer/forking.rb +41 -0
  32. data/lib/mutant/killer/rspec.rb +49 -0
  33. data/lib/mutant/killer/static.rb +19 -0
  34. data/lib/mutant/loader.rb +129 -0
  35. data/lib/mutant/matcher.rb +55 -0
  36. data/lib/mutant/matcher/chain.rb +66 -0
  37. data/lib/mutant/matcher/method.rb +173 -0
  38. data/lib/mutant/matcher/method/classifier.rb +126 -0
  39. data/lib/mutant/matcher/method/instance.rb +67 -0
  40. data/lib/mutant/matcher/method/singleton.rb +141 -0
  41. data/lib/mutant/matcher/object_space.rb +114 -0
  42. data/lib/mutant/matcher/scope_methods.rb +127 -0
  43. data/lib/mutant/mutation.rb +101 -12
  44. data/lib/mutant/mutation/filter.rb +75 -0
  45. data/lib/mutant/mutation/filter/code.rb +68 -0
  46. data/lib/mutant/mutation/filter/regexp.rb +39 -0
  47. data/lib/mutant/mutation/filter/whitelist.rb +47 -0
  48. data/lib/mutant/mutator.rb +134 -30
  49. data/lib/mutant/mutator/node.rb +163 -0
  50. data/lib/mutant/mutator/node/arguments.rb +24 -0
  51. data/lib/mutant/mutator/node/block.rb +24 -0
  52. data/lib/mutant/mutator/node/define.rb +24 -0
  53. data/lib/mutant/mutator/node/if_statement.rb +93 -0
  54. data/lib/mutant/mutator/node/literal.rb +54 -0
  55. data/lib/mutant/mutator/node/literal/array.rb +28 -0
  56. data/lib/mutant/mutator/node/literal/boolean.rb +49 -0
  57. data/lib/mutant/mutator/node/literal/dynamic.rb +24 -0
  58. data/lib/mutant/mutator/node/literal/empty_array.rb +26 -0
  59. data/lib/mutant/mutator/node/literal/fixnum.rb +37 -0
  60. data/lib/mutant/mutator/node/literal/float.rb +48 -0
  61. data/lib/mutant/mutator/node/literal/hash.rb +89 -0
  62. data/lib/mutant/mutator/node/literal/nil.rb +25 -0
  63. data/lib/mutant/mutator/node/literal/range.rb +94 -0
  64. data/lib/mutant/mutator/node/literal/regex.rb +43 -0
  65. data/lib/mutant/mutator/node/literal/string.rb +26 -0
  66. data/lib/mutant/mutator/node/literal/symbol.rb +26 -0
  67. data/lib/mutant/mutator/node/noop.rb +55 -0
  68. data/lib/mutant/mutator/node/receiver_case.rb +140 -0
  69. data/lib/mutant/mutator/node/return.rb +31 -0
  70. data/lib/mutant/mutator/node/send.rb +112 -0
  71. data/lib/mutant/mutator/registry.rb +48 -0
  72. data/lib/mutant/mutator/util.rb +87 -0
  73. data/lib/mutant/random.rb +24 -27
  74. data/lib/mutant/reporter.rb +48 -30
  75. data/lib/mutant/reporter/cli.rb +221 -0
  76. data/lib/mutant/reporter/null.rb +42 -0
  77. data/lib/mutant/reporter/stats.rb +64 -0
  78. data/lib/mutant/runner.rb +112 -0
  79. data/lib/mutant/strategy.rb +42 -0
  80. data/lib/mutant/strategy/rspec.rb +59 -0
  81. data/lib/mutant/strategy/rspec/example_lookup.rb +122 -0
  82. data/lib/mutant/subject.rb +115 -0
  83. data/lib/mutant/support/method_object.rb +31 -0
  84. data/locator.rb +87 -0
  85. data/mutant.gemspec +21 -21
  86. data/spec/integration/mutant/differ_spec.rb +15 -0
  87. data/spec/integration/mutant/loader_spec.rb +21 -0
  88. data/spec/integration/mutant/method_matching_spec.rb +269 -0
  89. data/spec/integration/mutant/rspec_killer_spec.rb +24 -0
  90. data/spec/integration/mutant/runner_spec.rb +26 -0
  91. data/spec/integration/mutant/zombie_spec.rb +8 -0
  92. data/spec/rcov.opts +7 -0
  93. data/spec/shared/command_method_behavior.rb +7 -0
  94. data/spec/shared/each_method_behaviour.rb +15 -0
  95. data/spec/shared/hash_method_behavior.rb +17 -0
  96. data/spec/shared/idempotent_method_behavior.rb +7 -0
  97. data/spec/shared/invertible_method_behaviour.rb +9 -0
  98. data/spec/shared/method_filter_parse_behavior.rb +16 -0
  99. data/spec/shared/method_match_behavior.rb +39 -0
  100. data/spec/shared/mutator_behavior.rb +46 -0
  101. data/spec/spec_helper.rb +11 -14
  102. data/spec/support/compress_helper.rb +10 -0
  103. data/spec/support/rspec.rb +22 -0
  104. data/spec/support/test_app.rb +5 -0
  105. data/spec/support/zombie.rb +141 -0
  106. data/spec/unit/mutant/cli/class_methods/new_spec.rb +87 -0
  107. data/spec/unit/mutant/cli/class_methods/run_spec.rb +38 -0
  108. data/spec/unit/mutant/context/root_spec.rb +11 -0
  109. data/spec/unit/mutant/context/scope/class_methods/build_spec.rb +29 -0
  110. data/spec/unit/mutant/context/scope/root_spec.rb +22 -0
  111. data/spec/unit/mutant/context/scope/unqualified_name_spec.rb +27 -0
  112. data/spec/unit/mutant/killer/fail_ques_spec.rb +39 -0
  113. data/spec/unit/mutant/killer/rspec/class_methods/new_spec.rb +32 -0
  114. data/spec/unit/mutant/loader/eval/class_methods/run_spec.rb +33 -0
  115. data/spec/unit/mutant/loader/rubinius/class_methods/run_spec.rb +42 -0
  116. data/spec/unit/mutant/matcher/chain/each_spec.rb +37 -0
  117. data/spec/unit/mutant/matcher/chain/matchers_spec.rb +12 -0
  118. data/spec/unit/mutant/matcher/class_methods/from_string_spec.rb +49 -0
  119. data/spec/unit/mutant/matcher/class_methods/parse_spec.rb +12 -0
  120. data/spec/unit/mutant/matcher/each_spec.rb +14 -0
  121. data/spec/unit/mutant/matcher/method/class_methods/parse_spec.rb +21 -0
  122. data/spec/unit/mutant/matcher/method/classifier/class_methods/run_spec.rb +34 -0
  123. data/spec/unit/mutant/matcher/method/method_spec.rb +11 -0
  124. data/spec/unit/mutant/matcher/object_space/class_methods/parse_spec.rb +24 -0
  125. data/spec/unit/mutant/matcher/object_space/each_spec.rb +31 -0
  126. data/spec/unit/mutant/mutator/each_spec.rb +25 -0
  127. data/spec/unit/mutant/mutator/emit_new_spec.rb +51 -0
  128. data/spec/unit/mutant/mutator/emit_spec.rb +52 -0
  129. data/spec/unit/mutant/mutator/node/block/mutation_spec.rb +36 -0
  130. data/spec/unit/mutant/mutator/node/define/mutation_spec.rb +47 -0
  131. data/spec/unit/mutant/mutator/node/if_statement/mutation_spec.rb +30 -0
  132. data/spec/unit/mutant/mutator/node/literal/array_spec.rb +30 -0
  133. data/spec/unit/mutant/mutator/node/literal/boolean/mutation_spec.rb +23 -0
  134. data/spec/unit/mutant/mutator/node/literal/empty_array_spec.rb +17 -0
  135. data/spec/unit/mutant/mutator/node/literal/fixnum_spec.rb +17 -0
  136. data/spec/unit/mutant/mutator/node/literal/float_spec.rb +25 -0
  137. data/spec/unit/mutant/mutator/node/literal/hash_spec.rb +34 -0
  138. data/spec/unit/mutant/mutator/node/literal/nil_spec.rb +13 -0
  139. data/spec/unit/mutant/mutator/node/literal/range_spec.rb +35 -0
  140. data/spec/unit/mutant/mutator/node/literal/regex_spec.rb +23 -0
  141. data/spec/unit/mutant/mutator/node/literal/string_spec.rb +17 -0
  142. data/spec/unit/mutant/mutator/node/literal/symbol_spec.rb +17 -0
  143. data/spec/unit/mutant/mutator/node/receiver_case/mutation_spec.rb +27 -0
  144. data/spec/unit/mutant/mutator/node/return/mutation_spec.rb +21 -0
  145. data/spec/unit/mutant/mutator/node/send/mutation_spec.rb +78 -0
  146. data/spec/unit/mutant/mutator/self_spec.rb +7 -0
  147. data/spec/unit/mutant/subject/class_methods/new_spec.rb +13 -0
  148. data/spec/unit/mutant/subject/context_spec.rb +14 -0
  149. data/spec/unit/mutant/subject/each_spec.rb +35 -0
  150. data/spec/unit/mutant/subject/node_spec.rb +13 -0
  151. data/tasks/metrics/ci.rake +7 -0
  152. data/tasks/metrics/flay.rake +41 -0
  153. data/tasks/metrics/flog.rake +43 -0
  154. data/tasks/metrics/heckle.rake +216 -0
  155. data/tasks/metrics/metric_fu.rake +31 -0
  156. data/tasks/metrics/reek.rake +15 -0
  157. data/tasks/metrics/roodi.rake +15 -0
  158. data/tasks/metrics/yardstick.rake +23 -0
  159. data/tasks/spec.rake +45 -0
  160. data/tasks/yard.rake +9 -0
  161. data/test_app/.rspec +1 -0
  162. data/test_app/lib/test_app.rb +5 -0
  163. data/test_app/lib/test_app/literal.rb +32 -0
  164. data/test_app/spec/shared/command_method_behavior.rb +7 -0
  165. data/test_app/spec/shared/each_method_behaviour.rb +15 -0
  166. data/test_app/spec/shared/hash_method_behavior.rb +17 -0
  167. data/test_app/spec/shared/idempotent_method_behavior.rb +7 -0
  168. data/test_app/spec/shared/invertible_method_behaviour.rb +9 -0
  169. data/test_app/spec/shared/method_filter_parse_behavior.rb +16 -0
  170. data/test_app/spec/shared/method_match_behavior.rb +39 -0
  171. data/test_app/spec/shared/mutator_behavior.rb +44 -0
  172. data/test_app/spec/spec_helper.rb +7 -0
  173. data/test_app/spec/unit/test_app/literal/command_spec.rb +9 -0
  174. data/test_app/spec/unit/test_app/literal/string_spec.rb +9 -0
  175. metadata +346 -124
  176. data/.rvmrc +0 -1
  177. data/Readme.md +0 -13
  178. data/exe/mutate +0 -6
  179. data/lib/mutant/extensions.rb +0 -8
  180. data/lib/mutant/formatter.rb +0 -19
  181. data/lib/mutant/implementation.rb +0 -70
  182. data/lib/mutant/literal.rb +0 -147
  183. data/lib/mutant/method.rb +0 -31
  184. data/lib/mutant/mutatee.rb +0 -61
  185. data/lib/mutant/node.rb +0 -26
  186. data/lib/mutant/runners/rspec.rb +0 -34
  187. data/lib/mutant/version.rb +0 -3
  188. data/spec/functional/class_spec.rb +0 -46
  189. data/spec/functional/instance_method/array_spec.rb +0 -53
  190. data/spec/functional/instance_method/boolean_spec.rb +0 -101
  191. data/spec/functional/instance_method/call_spec.rb +0 -161
  192. data/spec/functional/instance_method/fixnum_spec.rb +0 -53
  193. data/spec/functional/instance_method/float_spec.rb +0 -53
  194. data/spec/functional/instance_method/hash_spec.rb +0 -53
  195. data/spec/functional/instance_method/if_spec.rb +0 -57
  196. data/spec/functional/instance_method/ivar_assign_spec.rb +0 -62
  197. data/spec/functional/instance_method/range_spec.rb +0 -53
  198. data/spec/functional/instance_method/regex_spec.rb +0 -55
  199. data/spec/functional/instance_method/string_spec.rb +0 -53
  200. data/spec/functional/instance_method/symbol_spec.rb +0 -53
  201. data/spec/functional/reporter/method_loaded_spec.rb +0 -62
  202. data/spec/functional/reporter/running_mutations_spec.rb +0 -60
  203. data/spec/functional/runners/rspec_spec.rb +0 -26
  204. data/spec/functional/singleton_method/array_spec.rb +0 -53
  205. data/spec/functional/singleton_method/boolean_spec.rb +0 -101
  206. data/spec/functional/singleton_method/call_spec.rb +0 -161
  207. data/spec/functional/singleton_method/fixnum_spec.rb +0 -53
  208. data/spec/functional/singleton_method/float_spec.rb +0 -53
  209. data/spec/functional/singleton_method/hash_spec.rb +0 -53
  210. data/spec/functional/singleton_method/if_spec.rb +0 -57
  211. data/spec/functional/singleton_method/ivar_assign_spec.rb +0 -60
  212. data/spec/functional/singleton_method/range_spec.rb +0 -53
  213. data/spec/functional/singleton_method/regex_spec.rb +0 -55
  214. data/spec/functional/singleton_method/string_spec.rb +0 -53
  215. data/spec/functional/singleton_method/symbol_spec.rb +0 -53
  216. data/spec/mutant/extensions_spec.rb +0 -13
  217. data/spec/mutant/implementation_spec.rb +0 -223
  218. data/spec/mutant/literal_spec.rb +0 -129
  219. data/spec/mutant/mutatee_spec.rb +0 -28
  220. data/spec/mutant/node_spec.rb +0 -41
  221. data/spec/mutant/random_spec.rb +0 -33
  222. data/spec/mutant/reporter_spec.rb +0 -17
  223. data/spec/mutant_spec.rb +0 -28
  224. data/spec/support/example_group_helpers.rb +0 -11
  225. data/spec/support/example_helpers.rb +0 -5
@@ -0,0 +1,24 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ # Mutator for arguments
5
+ class Arguments < self
6
+
7
+ handle(Rubinius::AST::ActualArguments)
8
+
9
+ private
10
+
11
+ # Emit mutations
12
+ #
13
+ # @return [undefined]
14
+ #
15
+ # @api private
16
+ #
17
+ def dispatch
18
+ emit_attribute_mutations(:array)
19
+ end
20
+
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ # Mutator on AST blocks
5
+ class Block < self
6
+
7
+ handle(Rubinius::AST::Block)
8
+
9
+ private
10
+
11
+ # Emit mutants
12
+ #
13
+ # @return [undefined]
14
+ #
15
+ # @api private
16
+ #
17
+ def dispatch
18
+ array = input.array
19
+ emit_attribute_mutations(:array)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,24 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ class Define < self
5
+
6
+ handle(Rubinius::AST::Define)
7
+ handle(Rubinius::AST::DefineSingleton)
8
+ handle(Rubinius::AST::DefineSingletonScope)
9
+
10
+ private
11
+
12
+ # Emit mutations
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ emit_attribute_mutations(:body)
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,93 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ # Mutator for Rubinius::AST::If nodes
5
+ class IfStatement < self
6
+
7
+ handle(Rubinius::AST::If)
8
+
9
+ private
10
+
11
+ # Emit mutations on Rubinius::AST::If nodes
12
+ #
13
+ # @return [undefined]
14
+ #
15
+ # @api private
16
+ #
17
+ def dispatch
18
+ emit_attribute_mutations(:condition)
19
+ emit_attribute_mutations(:body)
20
+ emit_attribute_mutations(:else) if node.else
21
+ emit_inverted_condition
22
+ emit_deleted_if_branch
23
+ emit_deleted_else_branch
24
+ end
25
+
26
+ # Emit inverted condition
27
+ #
28
+ # Especially the same like swap branches but more universal as it also
29
+ # covers the case there is no else branch
30
+ #
31
+ # @return [undefined]
32
+ #
33
+ # @api private
34
+ #
35
+ def emit_inverted_condition
36
+ emit_self(new_send(condition, :'!'), if_branch, else_branch)
37
+ end
38
+
39
+ # Emit deleted else branch
40
+ #
41
+ # @return [undefined]
42
+ #
43
+ # @api private
44
+ #
45
+ def emit_deleted_else_branch
46
+ emit_self(condition, if_branch, nil)
47
+ end
48
+
49
+ # Emit deleted if branch
50
+ #
51
+ # @return [undefined]
52
+ #
53
+ # @api private
54
+ #
55
+ def emit_deleted_if_branch
56
+ body = else_branch
57
+ return unless body
58
+ emit_self(condition, else_branch, nil)
59
+ end
60
+
61
+ # Return if_branch of node
62
+ #
63
+ # @return [Rubinius::AST::Node]
64
+ #
65
+ # @api private
66
+ #
67
+ def if_branch
68
+ node.body
69
+ end
70
+
71
+ # Return condition of node
72
+ #
73
+ # @return [Rubinius::AST::Node]
74
+ #
75
+ # @api private
76
+ #
77
+ def condition
78
+ node.condition
79
+ end
80
+
81
+ # Return else body of node
82
+ #
83
+ # @return [Rubinius::AST::Node]
84
+ #
85
+ # @api private
86
+ #
87
+ def else_branch
88
+ node.else
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,54 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ # Abstract mutator for literal AST nodes
5
+ class Literal < self
6
+ include AbstractType
7
+
8
+ private
9
+
10
+ # Return new float literal
11
+ #
12
+ # @param [#to_f] value
13
+ #
14
+ # @return [Rubinius::Node::FloatLiteral]
15
+ #
16
+ # @api private
17
+ #
18
+ def new_float(value)
19
+ new(Rubinius::AST::FloatLiteral, value)
20
+ end
21
+
22
+ # Return AST representing NaN
23
+ #
24
+ # @return [Rubinius::Node::AST]
25
+ #
26
+ # @api private
27
+ #
28
+ def nan
29
+ new_send(new_float(0), :/, new_float(0))
30
+ end
31
+
32
+ # Return AST representing negative infinity
33
+ #
34
+ # @return [Rubinius::Node::AST]
35
+ #
36
+ # @api private
37
+ #
38
+ def negative_infinity
39
+ new(Rubinius::AST::Negate, infinity)
40
+ end
41
+
42
+ # Return AST representing infinity
43
+ #
44
+ # @return [Rubinius::Node::AST]
45
+ #
46
+ # @api private
47
+ #
48
+ def infinity
49
+ new_send(new_float(1), :/, new_float(0))
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,28 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ class Literal < self
5
+ # Mutator for array literals
6
+ class Array < self
7
+
8
+ handle(Rubinius::AST::ArrayLiteral)
9
+
10
+ private
11
+
12
+ # Emit mutations
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ emit_attribute_mutations(:body)
20
+ emit_self([])
21
+ emit_nil
22
+ emit_self(node.body.dup << new_nil)
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,49 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ class Literal < self
5
+ # Abstract mutator for boolean literals
6
+ class Boolean < self
7
+
8
+ private
9
+
10
+ # Emit mutants
11
+ #
12
+ # @return [undefined]
13
+ #
14
+ # @api private
15
+ #
16
+ def dispatch
17
+ emit_nil
18
+ emit(inverse)
19
+ end
20
+
21
+ # Return inverse
22
+ #
23
+ # @return [Rubinius::AST::Node]
24
+ #
25
+ # @api private
26
+ #
27
+ def inverse
28
+ new(self.class::INVERSE_CLASS)
29
+ end
30
+
31
+ # Mutator for true literals
32
+ class TrueLiteral < self
33
+ INVERSE_CLASS = Rubinius::AST::FalseLiteral
34
+
35
+ handle(Rubinius::AST::TrueLiteral)
36
+ end
37
+
38
+
39
+ # Mutator for false literals
40
+ class FalseLiteral < self
41
+ INVERSE_CLASS = Rubinius::AST::TrueLiteral
42
+
43
+ handle(Rubinius::AST::FalseLiteral)
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,24 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ class Literal
5
+ # Abstract mutations on dynamic literals
6
+ class Dynamic < self
7
+ include AbstractType
8
+
9
+ private
10
+
11
+ # Emit mutants
12
+ #
13
+ # @return [undefined]
14
+ #
15
+ # @api private
16
+ #
17
+ def dispatch
18
+ emit_nil
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,26 @@
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
@@ -0,0 +1,37 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ class Literal < self
5
+ # Mutator for fixnum literals
6
+ class Fixnum < self
7
+
8
+ handle(Rubinius::AST::FixnumLiteral)
9
+
10
+ private
11
+
12
+ # Emit mutants
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ emit_nil
20
+ emit_values(values)
21
+ emit_new { new_self(Random.fixnum) }
22
+ end
23
+
24
+ # Return values to mutate against
25
+ #
26
+ # @return [Array]
27
+ #
28
+ # @api private
29
+ #
30
+ def values
31
+ [0, 1, -node.value]
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,48 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ class Literal < self
5
+ # Mutator for float literals
6
+ class Float < self
7
+
8
+ handle(Rubinius::AST::FloatLiteral)
9
+
10
+ private
11
+
12
+ # Emit mutants
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ def dispatch
17
+ emit_nil
18
+ emit_values(values)
19
+ emit_special_cases
20
+ emit_new { new_self(Random.float) }
21
+ end
22
+
23
+ # Emit special cases
24
+ #
25
+ # @return [undefined]
26
+ #
27
+ # @api private
28
+ #
29
+ def emit_special_cases
30
+ [infinity, negative_infinity, nan].each do |value|
31
+ emit(value)
32
+ end
33
+ end
34
+
35
+ # Return values to test against
36
+ #
37
+ # @return [Array]
38
+ #
39
+ # @api private
40
+ #
41
+ def values
42
+ [0.0, 1.0] << -node.value
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,89 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ class Literal
5
+ # Mutator for hash literals
6
+ class Hash < self
7
+
8
+ handle(Rubinius::AST::HashLiteral)
9
+
10
+ private
11
+
12
+ # Emit mutations
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ emit_nil
20
+ emit_values(values)
21
+ emit_element_presence
22
+ emit_body
23
+ end
24
+
25
+ # Emit body mutations
26
+ #
27
+ # @return [undefined]
28
+ #
29
+ # @api private
30
+ #
31
+ def emit_body
32
+ array.each_with_index do |element, index|
33
+ dup = dup_array
34
+ Mutator.each(element).each do |mutation|
35
+ dup[index]=mutation
36
+ emit_self(dup)
37
+ end
38
+ end
39
+ end
40
+
41
+ # Return array of values in literal
42
+ #
43
+ # @return [Array]
44
+ #
45
+ # @api private
46
+ #
47
+ def array
48
+ node.array
49
+ end
50
+
51
+ # Return duplicate of array values in literal
52
+ #
53
+ # @return [Array]
54
+ #
55
+ # @api private
56
+ #
57
+ def dup_array
58
+ array.dup
59
+ end
60
+
61
+ # Return values to mutate against
62
+ #
63
+ # @return [Array]
64
+ #
65
+ # @api private
66
+ #
67
+ def values
68
+ [[], dup_array << new_nil << new_nil ]
69
+ end
70
+
71
+ # Emit element presence mutations
72
+ #
73
+ # @return [undefined]
74
+ #
75
+ # @api private
76
+ #
77
+ def emit_element_presence
78
+ 0.step(array.length-1, 2) do |index|
79
+ contents = dup_array
80
+ contents.delete_at(index)
81
+ contents.delete_at(index)
82
+ emit_self(contents)
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
88
+ end
89
+ end