mutant 0.9.7 → 0.9.12

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 (336) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mutant.rb +5 -2
  3. data/lib/mutant/ast.rb +0 -9
  4. data/lib/mutant/ast/find_metaclass_containing.rb +48 -0
  5. data/lib/mutant/ast/meta/send.rb +0 -6
  6. data/lib/mutant/bootstrap.rb +0 -36
  7. data/lib/mutant/cli.rb +5 -49
  8. data/lib/mutant/config.rb +0 -8
  9. data/lib/mutant/context.rb +0 -3
  10. data/lib/mutant/env.rb +0 -6
  11. data/lib/mutant/expression/method.rb +6 -6
  12. data/lib/mutant/expression/methods.rb +6 -6
  13. data/lib/mutant/expression/parser.rb +0 -6
  14. data/lib/mutant/integration.rb +0 -18
  15. data/lib/mutant/isolation.rb +1 -1
  16. data/lib/mutant/isolation/fork.rb +2 -24
  17. data/lib/mutant/isolation/none.rb +1 -1
  18. data/lib/mutant/license.rb +11 -0
  19. data/lib/mutant/matcher.rb +0 -14
  20. data/lib/mutant/matcher/config.rb +0 -11
  21. data/lib/mutant/matcher/method.rb +0 -31
  22. data/lib/mutant/matcher/method/instance.rb +0 -8
  23. data/lib/mutant/matcher/method/metaclass.rb +86 -0
  24. data/lib/mutant/matcher/method/singleton.rb +0 -25
  25. data/lib/mutant/matcher/methods.rb +17 -28
  26. data/lib/mutant/matcher/namespace.rb +0 -10
  27. data/lib/mutant/matcher/scope.rb +2 -4
  28. data/lib/mutant/meta/example/dsl.rb +0 -21
  29. data/lib/mutant/meta/example/verification.rb +0 -20
  30. data/lib/mutant/minitest/coverage.rb +53 -0
  31. data/lib/mutant/mutation.rb +0 -3
  32. data/lib/mutant/mutator.rb +1 -29
  33. data/lib/mutant/mutator/node.rb +1 -66
  34. data/lib/mutant/mutator/node/and_asgn.rb +0 -3
  35. data/lib/mutant/mutator/node/argument.rb +0 -15
  36. data/lib/mutant/mutator/node/arguments.rb +0 -20
  37. data/lib/mutant/mutator/node/begin.rb +0 -3
  38. data/lib/mutant/mutator/node/binary.rb +0 -23
  39. data/lib/mutant/mutator/node/block.rb +0 -15
  40. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  41. data/lib/mutant/mutator/node/break.rb +0 -3
  42. data/lib/mutant/mutator/node/case.rb +0 -9
  43. data/lib/mutant/mutator/node/class.rb +0 -3
  44. data/lib/mutant/mutator/node/conditional_loop.rb +0 -3
  45. data/lib/mutant/mutator/node/const.rb +0 -3
  46. data/lib/mutant/mutator/node/define.rb +0 -11
  47. data/lib/mutant/mutator/node/defined.rb +0 -3
  48. data/lib/mutant/mutator/node/dstr.rb +0 -3
  49. data/lib/mutant/mutator/node/dsym.rb +0 -3
  50. data/lib/mutant/mutator/node/generic.rb +0 -74
  51. data/lib/mutant/mutator/node/if.rb +0 -12
  52. data/lib/mutant/mutator/node/index.rb +0 -27
  53. data/lib/mutant/mutator/node/kwbegin.rb +0 -3
  54. data/lib/mutant/mutator/node/literal.rb +0 -3
  55. data/lib/mutant/mutator/node/literal/array.rb +0 -6
  56. data/lib/mutant/mutator/node/literal/boolean.rb +0 -4
  57. data/lib/mutant/mutator/node/literal/float.rb +0 -9
  58. data/lib/mutant/mutator/node/literal/hash.rb +0 -9
  59. data/lib/mutant/mutator/node/literal/integer.rb +0 -9
  60. data/lib/mutant/mutator/node/literal/nil.rb +0 -3
  61. data/lib/mutant/mutator/node/literal/range.rb +4 -7
  62. data/lib/mutant/mutator/node/literal/regex.rb +0 -6
  63. data/lib/mutant/mutator/node/literal/string.rb +0 -3
  64. data/lib/mutant/mutator/node/literal/symbol.rb +0 -3
  65. data/lib/mutant/mutator/node/masgn.rb +0 -3
  66. data/lib/mutant/mutator/node/match_current_line.rb +0 -3
  67. data/lib/mutant/mutator/node/mlhs.rb +0 -3
  68. data/lib/mutant/mutator/node/named_value/access.rb +2 -14
  69. data/lib/mutant/mutator/node/named_value/constant_assignment.rb +0 -9
  70. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -6
  71. data/lib/mutant/mutator/node/next.rb +0 -3
  72. data/lib/mutant/mutator/node/noop.rb +1 -4
  73. data/lib/mutant/mutator/node/nthref.rb +0 -3
  74. data/lib/mutant/mutator/node/op_asgn.rb +0 -3
  75. data/lib/mutant/mutator/node/or_asgn.rb +0 -3
  76. data/lib/mutant/mutator/node/procarg_zero.rb +0 -3
  77. data/lib/mutant/mutator/node/regopt.rb +0 -6
  78. data/lib/mutant/mutator/node/resbody.rb +0 -6
  79. data/lib/mutant/mutator/node/rescue.rb +2 -19
  80. data/lib/mutant/mutator/node/return.rb +0 -3
  81. data/lib/mutant/mutator/node/sclass.rb +20 -0
  82. data/lib/mutant/mutator/node/send.rb +26 -61
  83. data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -9
  84. data/lib/mutant/mutator/node/send/binary.rb +0 -11
  85. data/lib/mutant/mutator/node/send/conditional.rb +0 -3
  86. data/lib/mutant/mutator/node/splat.rb +0 -3
  87. data/lib/mutant/mutator/node/super.rb +0 -3
  88. data/lib/mutant/mutator/node/when.rb +0 -19
  89. data/lib/mutant/mutator/node/yield.rb +0 -3
  90. data/lib/mutant/mutator/node/zsuper.rb +0 -3
  91. data/lib/mutant/mutator/util/array.rb +0 -6
  92. data/lib/mutant/mutator/util/symbol.rb +0 -3
  93. data/lib/mutant/parallel.rb +0 -13
  94. data/lib/mutant/parallel/driver.rb +0 -10
  95. data/lib/mutant/parallel/worker.rb +0 -22
  96. data/lib/mutant/registry.rb +2 -7
  97. data/lib/mutant/reporter/cli.rb +0 -5
  98. data/lib/mutant/reporter/cli/format.rb +0 -9
  99. data/lib/mutant/reporter/cli/printer.rb +2 -42
  100. data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -15
  101. data/lib/mutant/reporter/cli/printer/isolation_result.rb +0 -18
  102. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -5
  103. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -22
  104. data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -8
  105. data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -9
  106. data/lib/mutant/repository/diff.rb +1 -13
  107. data/lib/mutant/repository/diff/ranges.rb +0 -11
  108. data/lib/mutant/result.rb +0 -3
  109. data/lib/mutant/runner.rb +0 -18
  110. data/lib/mutant/runner/sink.rb +0 -5
  111. data/lib/mutant/subject.rb +0 -8
  112. data/lib/mutant/subject/method.rb +0 -3
  113. data/lib/mutant/subject/method/instance.rb +40 -6
  114. data/lib/mutant/subject/method/metaclass.rb +30 -0
  115. data/lib/mutant/transform.rb +0 -92
  116. data/lib/mutant/version.rb +1 -1
  117. data/lib/mutant/warnings.rb +0 -6
  118. data/lib/mutant/zombifier.rb +2 -34
  119. metadata +61 -333
  120. data/.circleci/config.yml +0 -53
  121. data/.gitignore +0 -38
  122. data/.rspec +0 -5
  123. data/.rubocop.yml +0 -7
  124. data/Changelog.md +0 -71
  125. data/Gemfile +0 -14
  126. data/Gemfile.lock +0 -167
  127. data/Gemfile.shared +0 -3
  128. data/README.md +0 -138
  129. data/Rakefile +0 -5
  130. data/config/devtools.yml +0 -2
  131. data/config/reek.yml +0 -138
  132. data/config/rubocop.yml +0 -205
  133. data/config/yardstick.yml +0 -2
  134. data/docs/commercial-support.md +0 -14
  135. data/docs/concurrency.md +0 -39
  136. data/docs/incremental.md +0 -76
  137. data/docs/known-problems.md +0 -30
  138. data/docs/limitations.md +0 -50
  139. data/docs/mutant-minitest.md +0 -149
  140. data/docs/mutant-rspec.md +0 -130
  141. data/docs/nomenclature.md +0 -82
  142. data/docs/reading-reports.md +0 -74
  143. data/lib/mutant/color.rb +0 -43
  144. data/lib/mutant/diff.rb +0 -114
  145. data/meta/and.rb +0 -15
  146. data/meta/and_asgn.rb +0 -14
  147. data/meta/array.rb +0 -30
  148. data/meta/begin.rb +0 -23
  149. data/meta/block.rb +0 -202
  150. data/meta/block_pass.rb +0 -8
  151. data/meta/blockarg.rb +0 -10
  152. data/meta/break.rb +0 -10
  153. data/meta/case.rb +0 -223
  154. data/meta/casgn.rb +0 -28
  155. data/meta/cbase.rb +0 -8
  156. data/meta/class.rb +0 -12
  157. data/meta/const.rb +0 -17
  158. data/meta/csend.rb +0 -10
  159. data/meta/cvar.rb +0 -7
  160. data/meta/cvasgn.rb +0 -10
  161. data/meta/date.rb +0 -59
  162. data/meta/def.rb +0 -203
  163. data/meta/defined.rb +0 -9
  164. data/meta/dstr.rb +0 -13
  165. data/meta/dsym.rb +0 -14
  166. data/meta/ensure.rb +0 -9
  167. data/meta/false.rb +0 -8
  168. data/meta/file.rb +0 -5
  169. data/meta/float.rb +0 -37
  170. data/meta/gvar.rb +0 -7
  171. data/meta/gvasgn.rb +0 -10
  172. data/meta/hash.rb +0 -24
  173. data/meta/if.rb +0 -77
  174. data/meta/index.rb +0 -133
  175. data/meta/indexasgn.rb +0 -31
  176. data/meta/int.rb +0 -18
  177. data/meta/ivar.rb +0 -8
  178. data/meta/ivasgn.rb +0 -23
  179. data/meta/kwarg.rb +0 -10
  180. data/meta/kwbegin.rb +0 -9
  181. data/meta/kwoptarg.rb +0 -13
  182. data/meta/lambda.rb +0 -23
  183. data/meta/line.rb +0 -5
  184. data/meta/lvar.rb +0 -16
  185. data/meta/lvasgn.rb +0 -25
  186. data/meta/masgn.rb +0 -7
  187. data/meta/match_current_line.rb +0 -15
  188. data/meta/next.rb +0 -11
  189. data/meta/nil.rb +0 -5
  190. data/meta/nthref.rb +0 -14
  191. data/meta/op_assgn.rb +0 -17
  192. data/meta/or.rb +0 -15
  193. data/meta/or_asgn.rb +0 -50
  194. data/meta/range.rb +0 -39
  195. data/meta/redo.rb +0 -5
  196. data/meta/regexp.rb +0 -81
  197. data/meta/regopt.rb +0 -10
  198. data/meta/rescue.rb +0 -90
  199. data/meta/return.rb +0 -16
  200. data/meta/self.rb +0 -7
  201. data/meta/send.rb +0 -604
  202. data/meta/str.rb +0 -7
  203. data/meta/super.rb +0 -27
  204. data/meta/sym.rb +0 -8
  205. data/meta/true.rb +0 -8
  206. data/meta/until.rb +0 -17
  207. data/meta/while.rb +0 -26
  208. data/meta/yield.rb +0 -10
  209. data/mutant-minitest.gemspec +0 -22
  210. data/mutant-rspec.gemspec +0 -22
  211. data/mutant.gemspec +0 -41
  212. data/mutant.yml +0 -6
  213. data/spec/integration/mutant/corpus_spec.rb +0 -15
  214. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  215. data/spec/integration/mutant/minitest_spec.rb +0 -11
  216. data/spec/integration/mutant/null_spec.rb +0 -16
  217. data/spec/integration/mutant/rspec_spec.rb +0 -15
  218. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  219. data/spec/integrations.yml +0 -63
  220. data/spec/shared/base_behavior.rb +0 -45
  221. data/spec/shared/framework_integration_behavior.rb +0 -70
  222. data/spec/shared/method_matcher_behavior.rb +0 -47
  223. data/spec/spec_helper.rb +0 -75
  224. data/spec/support/corpus.rb +0 -318
  225. data/spec/support/file_system.rb +0 -62
  226. data/spec/support/ice_nine_config.rb +0 -10
  227. data/spec/support/ruby_vm.rb +0 -84
  228. data/spec/support/shared_context.rb +0 -169
  229. data/spec/support/test_app.rb +0 -7
  230. data/spec/support/warnings.yml +0 -6
  231. data/spec/support/xspec.rb +0 -183
  232. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  233. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  234. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  235. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  236. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  237. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  238. data/spec/unit/mutant/ast_spec.rb +0 -57
  239. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  240. data/spec/unit/mutant/cli_spec.rb +0 -305
  241. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  242. data/spec/unit/mutant/config_spec.rb +0 -126
  243. data/spec/unit/mutant/context_spec.rb +0 -111
  244. data/spec/unit/mutant/diff_spec.rb +0 -189
  245. data/spec/unit/mutant/env_spec.rb +0 -229
  246. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  247. data/spec/unit/mutant/expression/methods_spec.rb +0 -61
  248. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  249. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  250. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  251. data/spec/unit/mutant/expression_spec.rb +0 -45
  252. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  253. data/spec/unit/mutant/integration_spec.rb +0 -150
  254. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  255. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  256. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  257. data/spec/unit/mutant/license_spec.rb +0 -293
  258. data/spec/unit/mutant/loader_spec.rb +0 -79
  259. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  260. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  261. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  262. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  263. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  264. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  265. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  266. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  267. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -37
  268. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  269. data/spec/unit/mutant/matcher/scope_spec.rb +0 -35
  270. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  271. data/spec/unit/mutant/matcher_spec.rb +0 -102
  272. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  273. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  274. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  275. data/spec/unit/mutant/mutation_spec.rb +0 -140
  276. data/spec/unit/mutant/mutator/node_spec.rb +0 -52
  277. data/spec/unit/mutant/mutator_spec.rb +0 -21
  278. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  279. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  280. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  281. data/spec/unit/mutant/parallel_spec.rb +0 -115
  282. data/spec/unit/mutant/parser_spec.rb +0 -26
  283. data/spec/unit/mutant/range_spec.rb +0 -141
  284. data/spec/unit/mutant/registry_spec.rb +0 -47
  285. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  286. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  287. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  288. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  289. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  290. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  291. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  292. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  293. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  294. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  295. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  296. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  297. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  298. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  299. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  300. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  301. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  302. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  303. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  304. data/spec/unit/mutant/result/env_spec.rb +0 -161
  305. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  306. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  307. data/spec/unit/mutant/result/test_spec.rb +0 -14
  308. data/spec/unit/mutant/result_spec.rb +0 -33
  309. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  310. data/spec/unit/mutant/runner_spec.rb +0 -121
  311. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  312. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  313. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  314. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  315. data/spec/unit/mutant/subject_spec.rb +0 -93
  316. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  317. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  318. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  319. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  320. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  321. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  322. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  323. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  324. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  325. data/spec/unit/mutant/util/one_spec.rb +0 -22
  326. data/spec/unit/mutant/warnings_spec.rb +0 -89
  327. data/spec/unit/mutant/world_spec.rb +0 -63
  328. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  329. data/test_app/.rspec +0 -1
  330. data/test_app/Gemfile.minitest +0 -4
  331. data/test_app/Gemfile.rspec3.8 +0 -7
  332. data/test_app/lib/test_app.rb +0 -109
  333. data/test_app/lib/test_app/literal.rb +0 -35
  334. data/test_app/spec/spec_helper.rb +0 -9
  335. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  336. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -13,9 +13,6 @@ module Mutant
13
13
 
14
14
  private
15
15
 
16
- # Emit mutations
17
- #
18
- # @return [undefined]
19
16
  def dispatch
20
17
  emit_singletons
21
18
  emit_left_mutations do |node|
@@ -13,9 +13,6 @@ module Mutant
13
13
 
14
14
  private
15
15
 
16
- # Emit mutations
17
- #
18
- # @return [undefined]
19
16
  def dispatch
20
17
  emit_singletons
21
18
  emit_right_mutations
@@ -17,9 +17,6 @@ module Mutant
17
17
 
18
18
  private
19
19
 
20
- # Emit mutations
21
- #
22
- # @return [undefined]
23
20
  def dispatch
24
21
  name = Mutant::Util.one(argument.children)
25
22
 
@@ -13,16 +13,10 @@ module Mutant
13
13
 
14
14
  private
15
15
 
16
- # Emit mutations
17
- #
18
- # @return [undefined]
19
16
  def dispatch
20
17
  emit_type(*mutated_flags)
21
18
  end
22
19
 
23
- # Altered flags array excluding case insensitive flag
24
- #
25
- # @return [Array<Symbol>]
26
20
  def mutated_flags
27
21
  (children - MUTATED_FLAGS)
28
22
  end
@@ -12,18 +12,12 @@ module Mutant
12
12
 
13
13
  private
14
14
 
15
- # Emit mutations
16
- #
17
- # @return [undefined]
18
15
  def dispatch
19
16
  emit_assignment(nil)
20
17
  emit_body_mutations if body
21
18
  mutate_captures
22
19
  end
23
20
 
24
- # Mutate captures
25
- #
26
- # @return [undefined]
27
21
  def mutate_captures
28
22
  return unless captures
29
23
  Util::Array::Element.call(captures.children).each do |matchers|
@@ -14,20 +14,14 @@ module Mutant
14
14
 
15
15
  RESCUE_INDICES = (1..-2).freeze
16
16
 
17
- # Emit mutations
18
- #
19
- # @return [undefined]
17
+ private
18
+
20
19
  def dispatch
21
20
  mutate_body
22
21
  mutate_rescue_bodies
23
22
  mutate_else_body
24
23
  end
25
24
 
26
- private
27
-
28
- # Mutate child by name
29
- #
30
- # @return [undefined]
31
25
  def mutate_rescue_bodies
32
26
  children_indices(RESCUE_INDICES).each do |index|
33
27
  mutate_child(index)
@@ -36,11 +30,6 @@ module Mutant
36
30
  end
37
31
  end
38
32
 
39
- # Emit concatenation with body
40
- #
41
- # @param [Parser::AST::Node] child
42
- #
43
- # @return [undefined]
44
33
  def emit_concat(child)
45
34
  if body
46
35
  emit(s(:begin, body, child))
@@ -49,18 +38,12 @@ module Mutant
49
38
  end
50
39
  end
51
40
 
52
- # Emit body mutations
53
- #
54
- # @return [undefined]
55
41
  def mutate_body
56
42
  return unless body
57
43
  emit_body_mutations
58
44
  emit(body)
59
45
  end
60
46
 
61
- # Emit else body mutations
62
- #
63
- # @return [undefined]
64
47
  def mutate_else_body
65
48
  return unless else_body
66
49
  emit_else_body_mutations
@@ -12,9 +12,6 @@ module Mutant
12
12
 
13
13
  private
14
14
 
15
- # Emit mutations
16
- #
17
- # @return [undefined]
18
15
  def dispatch
19
16
  emit_singletons
20
17
  return unless value
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mutant
4
+ class Mutator
5
+ class Node
6
+ # Namespace for singleton class mutations (class << some_obj)
7
+ class Sclass < self
8
+ handle :sclass
9
+
10
+ children :expr, :body
11
+
12
+ private
13
+
14
+ def dispatch
15
+ emit_body_mutations if body
16
+ end
17
+ end # Class
18
+ end # Node
19
+ end # Mutator
20
+ end # Mutant
@@ -36,8 +36,8 @@ module Mutant
36
36
  :== => %i[eql? equal?],
37
37
  :>= => %i[> == eql? equal?],
38
38
  :<= => %i[< == eql? equal?],
39
- :> => %i[== >= eql? equal?],
40
- :< => %i[== <= eql? equal?]
39
+ :> => %i[== eql? equal?],
40
+ :< => %i[== eql? equal?]
41
41
  )
42
42
 
43
43
  RECEIVER_SELECTOR_REPLACEMENTS = IceNine.deep_freeze(
@@ -48,9 +48,6 @@ module Mutant
48
48
 
49
49
  private
50
50
 
51
- # Emit mutations
52
- #
53
- # @return [undefined]
54
51
  def dispatch
55
52
  emit_singletons
56
53
 
@@ -63,23 +60,14 @@ module Mutant
63
60
  end
64
61
  end
65
62
 
66
- # AST metadata for node
67
- #
68
- # @return [AST::Meta::Send]
69
63
  def meta
70
64
  AST::Meta::Send.new(node)
71
65
  end
72
66
  memoize :meta
73
67
 
74
- # Arguments being send
75
- #
76
- # @return [Enumerable<Parser::AST::Node>]
77
68
  alias_method :arguments, :remaining_children
78
69
  private :arguments
79
70
 
80
- # Perform normal, non special case dispatch
81
- #
82
- # @return [undefined]
83
71
  def normal_dispatch
84
72
  emit_naked_receiver
85
73
  emit_selector_replacement
@@ -90,10 +78,9 @@ module Mutant
90
78
  mutate_arguments
91
79
  end
92
80
 
93
- # Emit mutations which only correspond to one selector
94
- #
95
- # @return [undefined]
96
81
  def emit_selector_specific_mutations
82
+ emit_array_mutation
83
+ emit_static_send
97
84
  emit_const_get_mutation
98
85
  emit_integer_mutation
99
86
  emit_dig_mutation
@@ -101,9 +88,28 @@ module Mutant
101
88
  emit_lambda_mutation
102
89
  end
103
90
 
104
- # Emit selector mutations specific to top level constants
105
- #
106
- # @return [undefined]
91
+ def emit_array_mutation
92
+ return unless selector.equal?(:Array) && possible_kernel_method?
93
+
94
+ emit(s(:array, *arguments))
95
+ end
96
+
97
+ def emit_static_send
98
+ return unless %i[__send__ send public_send].include?(selector)
99
+
100
+ dynamic_selector, *actual_arguments = *arguments
101
+
102
+ return unless n_sym?(dynamic_selector)
103
+
104
+ method_name = AST::Meta::Symbol.new(dynamic_selector).name
105
+
106
+ emit(s(node.type, receiver, method_name, *actual_arguments))
107
+ end
108
+
109
+ def possible_kernel_method?
110
+ receiver.nil? || receiver.eql?(s(:const, nil, :Kernel))
111
+ end
112
+
107
113
  def emit_receiver_selector_mutations
108
114
  return unless meta.receiver_possible_top_level_const?
109
115
 
@@ -113,9 +119,6 @@ module Mutant
113
119
  .each(&method(:emit_selector))
114
120
  end
115
121
 
116
- # Emit mutation from `!!foo` to `foo`
117
- #
118
- # @return [undefined]
119
122
  def emit_double_negation_mutation
120
123
  return unless selector.equal?(:!) && n_send?(receiver)
121
124
 
@@ -123,19 +126,10 @@ module Mutant
123
126
  emit(negated.receiver) if negated.selector.equal?(:!)
124
127
  end
125
128
 
126
- # Emit mutation from proc definition to lambda
127
- #
128
- # @return [undefined]
129
129
  def emit_lambda_mutation
130
130
  emit(s(:send, nil, :lambda)) if meta.proc?
131
131
  end
132
132
 
133
- # Emit mutation for `#dig`
134
- #
135
- # - Mutates `foo.dig(a, b)` to `foo.fetch(a).dig(b)`
136
- # - Mutates `foo.dig(a)` to `foo.fetch(a)`
137
- #
138
- # @return [undefined]
139
133
  def emit_dig_mutation
140
134
  return if !selector.equal?(:dig) || arguments.none?
141
135
 
@@ -148,41 +142,26 @@ module Mutant
148
142
  emit(s(:send, fetch_mutation, :dig, *tail))
149
143
  end
150
144
 
151
- # Emit mutation from `to_i` to `Integer(...)`
152
- #
153
- # @return [undefined]
154
145
  def emit_integer_mutation
155
146
  return unless selector.equal?(:to_i)
156
147
 
157
148
  emit(s(:send, nil, :Integer, receiver))
158
149
  end
159
150
 
160
- # Emit mutation from `const_get` to const literal
161
- #
162
- # @return [undefined]
163
151
  def emit_const_get_mutation
164
152
  return unless selector.equal?(:const_get) && n_sym?(arguments.first)
165
153
 
166
154
  emit(s(:const, receiver, AST::Meta::Symbol.new(arguments.first).name))
167
155
  end
168
156
 
169
- # Emit selector replacement
170
- #
171
- # @return [undefined]
172
157
  def emit_selector_replacement
173
158
  SELECTOR_REPLACEMENTS.fetch(selector, EMPTY_ARRAY).each(&method(:emit_selector))
174
159
  end
175
160
 
176
- # Emit naked receiver mutation
177
- #
178
- # @return [undefined]
179
161
  def emit_naked_receiver
180
162
  emit(receiver) if receiver
181
163
  end
182
164
 
183
- # Mutate arguments
184
- #
185
- # @return [undefined]
186
165
  def mutate_arguments
187
166
  emit_type(receiver, selector)
188
167
  remaining_children_with_index.each do |_node, index|
@@ -191,25 +170,14 @@ module Mutant
191
170
  end
192
171
  end
193
172
 
194
- # Mutate argument
195
- #
196
- # @param [Integer] index
197
- #
198
- # @return [undefined]
199
173
  def mutate_argument_index(index)
200
174
  mutate_child(index) { |node| !n_begin?(node) }
201
175
  end
202
176
 
203
- # Emit argument propagation
204
- #
205
- # @return [undefined]
206
177
  def emit_argument_propagation
207
178
  emit_propagation(Mutant::Util.one(arguments)) if arguments.one?
208
179
  end
209
180
 
210
- # Emit receiver mutations
211
- #
212
- # @return [undefined]
213
181
  def mutate_receiver
214
182
  return unless receiver
215
183
  emit_implicit_self
@@ -218,9 +186,6 @@ module Mutant
218
186
  end
219
187
  end
220
188
 
221
- # Emit implicit self mutation
222
- #
223
- # @return [undefined]
224
189
  def emit_implicit_self
225
190
  emit_receiver(nil) if n_self?(receiver) && !(
226
191
  KEYWORDS.include?(selector) ||
@@ -12,26 +12,17 @@ module Mutant
12
12
 
13
13
  private
14
14
 
15
- # Emit mutations
16
- #
17
- # @return [undefined]
18
15
  def dispatch
19
16
  normal_dispatch
20
17
  emit_attribute_read
21
18
  end
22
19
 
23
- # Mutate arguments
24
- #
25
- # @return [undefined]
26
20
  def mutate_arguments
27
21
  remaining_children_indices.each do |index|
28
22
  mutate_child(index)
29
23
  end
30
24
  end
31
25
 
32
- # Emit attribute read
33
- #
34
- # @return [undefined]
35
26
  def emit_attribute_read
36
27
  emit_type(receiver, selector[ATTRIBUTE_RANGE].to_sym)
37
28
  end
@@ -12,9 +12,6 @@ module Mutant
12
12
 
13
13
  private
14
14
 
15
- # Emit mutations
16
- #
17
- # @return [undefined]
18
15
  def dispatch
19
16
  emit(left)
20
17
  emit_left_mutations
@@ -24,9 +21,6 @@ module Mutant
24
21
  emit_not_equality_mutations
25
22
  end
26
23
 
27
- # Emit mutations for `!=`
28
- #
29
- # @return [undefined]
30
24
  def emit_not_equality_mutations
31
25
  return unless operator.equal?(:'!=')
32
26
 
@@ -34,11 +28,6 @@ module Mutant
34
28
  emit_not_equality_mutation(:equal?)
35
29
  end
36
30
 
37
- # Emit negated method sends with specified operator
38
- #
39
- # @param new_operator [Symbol] selector to be negated
40
- #
41
- # @return [undefined]
42
31
  def emit_not_equality_mutation(new_operator)
43
32
  emit(n_not(s(:send, left, new_operator, right)))
44
33
  end
@@ -10,9 +10,6 @@ module Mutant
10
10
 
11
11
  private
12
12
 
13
- # Emit mutations
14
- #
15
- # @return [undefined]
16
13
  def dispatch
17
14
  super()
18
15
  emit(s(:send, *children))
@@ -12,9 +12,6 @@ module Mutant
12
12
 
13
13
  private
14
14
 
15
- # Emit mutations
16
- #
17
- # @return [undefined]
18
15
  def dispatch
19
16
  emit_singletons
20
17
  emit_expression_mutations
@@ -11,9 +11,6 @@ module Mutant
11
11
 
12
12
  private
13
13
 
14
- # Emit mutations
15
- #
16
- # @return [undefined]
17
14
  def dispatch
18
15
  emit_singletons
19
16
  emit(N_EMPTY_SUPER)
@@ -11,9 +11,6 @@ module Mutant
11
11
 
12
12
  private
13
13
 
14
- # Emit mutations
15
- #
16
- # @return [undefined]
17
14
  def dispatch
18
15
  if body
19
16
  mutate_body
@@ -23,9 +20,6 @@ module Mutant
23
20
  mutate_conditions
24
21
  end
25
22
 
26
- # Emit condition mutations
27
- #
28
- # @return [undefined]
29
23
  def mutate_conditions
30
24
  conditions = children.length - 1
31
25
  children[0..-2].each_index do |index|
@@ -34,27 +28,14 @@ module Mutant
34
28
  end
35
29
  end
36
30
 
37
- # Emit body mutations
38
- #
39
- # @return [undefined]
40
31
  def mutate_body
41
32
  mutate_child(body_index)
42
33
  end
43
34
 
44
- # Body node
45
- #
46
- # @return [Parser::AST::Node]
47
- # if body is present
48
- #
49
- # @return [nil]
50
- # otherwise
51
35
  def body
52
36
  children.fetch(body_index)
53
37
  end
54
38
 
55
- # Index of body node
56
- #
57
- # @return [Integer]
58
39
  def body_index
59
40
  children.length - 1
60
41
  end