mutant 0.9.8 → 0.9.13

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 (335) 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 +14 -37
  7. data/lib/mutant/cli.rb +11 -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 +2 -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 -3
  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/reporter/cli.rb +0 -5
  97. data/lib/mutant/reporter/cli/format.rb +0 -9
  98. data/lib/mutant/reporter/cli/printer.rb +2 -42
  99. data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -15
  100. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -21
  101. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -5
  102. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -22
  103. data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -8
  104. data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -9
  105. data/lib/mutant/repository/diff.rb +1 -13
  106. data/lib/mutant/repository/diff/ranges.rb +0 -11
  107. data/lib/mutant/result.rb +0 -3
  108. data/lib/mutant/runner.rb +0 -18
  109. data/lib/mutant/runner/sink.rb +0 -5
  110. data/lib/mutant/subject.rb +0 -8
  111. data/lib/mutant/subject/method.rb +0 -3
  112. data/lib/mutant/subject/method/instance.rb +40 -6
  113. data/lib/mutant/subject/method/metaclass.rb +30 -0
  114. data/lib/mutant/transform.rb +0 -92
  115. data/lib/mutant/version.rb +1 -1
  116. data/lib/mutant/warnings.rb +0 -6
  117. data/lib/mutant/zombifier.rb +2 -34
  118. metadata +61 -333
  119. data/.github/workflows/ci.yml +0 -121
  120. data/.gitignore +0 -38
  121. data/.rspec +0 -5
  122. data/.rubocop.yml +0 -7
  123. data/Changelog.md +0 -75
  124. data/Gemfile +0 -7
  125. data/Gemfile.lock +0 -167
  126. data/Gemfile.shared +0 -10
  127. data/README.md +0 -138
  128. data/Rakefile +0 -5
  129. data/config/devtools.yml +0 -2
  130. data/config/reek.yml +0 -138
  131. data/config/rubocop.yml +0 -205
  132. data/config/yardstick.yml +0 -2
  133. data/docs/commercial-support.md +0 -14
  134. data/docs/concurrency.md +0 -39
  135. data/docs/incremental.md +0 -76
  136. data/docs/known-problems.md +0 -30
  137. data/docs/limitations.md +0 -50
  138. data/docs/mutant-minitest.md +0 -149
  139. data/docs/mutant-rspec.md +0 -130
  140. data/docs/nomenclature.md +0 -82
  141. data/docs/reading-reports.md +0 -74
  142. data/lib/mutant/color.rb +0 -43
  143. data/lib/mutant/diff.rb +0 -114
  144. data/meta/and.rb +0 -15
  145. data/meta/and_asgn.rb +0 -14
  146. data/meta/array.rb +0 -30
  147. data/meta/begin.rb +0 -23
  148. data/meta/block.rb +0 -202
  149. data/meta/block_pass.rb +0 -8
  150. data/meta/blockarg.rb +0 -10
  151. data/meta/break.rb +0 -10
  152. data/meta/case.rb +0 -223
  153. data/meta/casgn.rb +0 -28
  154. data/meta/cbase.rb +0 -8
  155. data/meta/class.rb +0 -12
  156. data/meta/const.rb +0 -17
  157. data/meta/csend.rb +0 -10
  158. data/meta/cvar.rb +0 -7
  159. data/meta/cvasgn.rb +0 -10
  160. data/meta/date.rb +0 -59
  161. data/meta/def.rb +0 -203
  162. data/meta/defined.rb +0 -9
  163. data/meta/dstr.rb +0 -13
  164. data/meta/dsym.rb +0 -14
  165. data/meta/ensure.rb +0 -9
  166. data/meta/false.rb +0 -8
  167. data/meta/file.rb +0 -5
  168. data/meta/float.rb +0 -37
  169. data/meta/gvar.rb +0 -7
  170. data/meta/gvasgn.rb +0 -10
  171. data/meta/hash.rb +0 -24
  172. data/meta/if.rb +0 -77
  173. data/meta/index.rb +0 -133
  174. data/meta/indexasgn.rb +0 -31
  175. data/meta/int.rb +0 -18
  176. data/meta/ivar.rb +0 -8
  177. data/meta/ivasgn.rb +0 -23
  178. data/meta/kwarg.rb +0 -10
  179. data/meta/kwbegin.rb +0 -9
  180. data/meta/kwoptarg.rb +0 -13
  181. data/meta/lambda.rb +0 -23
  182. data/meta/line.rb +0 -5
  183. data/meta/lvar.rb +0 -16
  184. data/meta/lvasgn.rb +0 -25
  185. data/meta/masgn.rb +0 -7
  186. data/meta/match_current_line.rb +0 -15
  187. data/meta/next.rb +0 -11
  188. data/meta/nil.rb +0 -5
  189. data/meta/nthref.rb +0 -14
  190. data/meta/op_assgn.rb +0 -17
  191. data/meta/or.rb +0 -15
  192. data/meta/or_asgn.rb +0 -50
  193. data/meta/range.rb +0 -39
  194. data/meta/redo.rb +0 -5
  195. data/meta/regexp.rb +0 -81
  196. data/meta/regopt.rb +0 -10
  197. data/meta/rescue.rb +0 -90
  198. data/meta/return.rb +0 -16
  199. data/meta/self.rb +0 -7
  200. data/meta/send.rb +0 -604
  201. data/meta/str.rb +0 -7
  202. data/meta/super.rb +0 -27
  203. data/meta/sym.rb +0 -8
  204. data/meta/true.rb +0 -8
  205. data/meta/until.rb +0 -17
  206. data/meta/while.rb +0 -26
  207. data/meta/yield.rb +0 -10
  208. data/mutant-minitest.gemspec +0 -22
  209. data/mutant-rspec.gemspec +0 -22
  210. data/mutant.gemspec +0 -41
  211. data/mutant.yml +0 -6
  212. data/spec/integration/mutant/corpus_spec.rb +0 -15
  213. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  214. data/spec/integration/mutant/minitest_spec.rb +0 -11
  215. data/spec/integration/mutant/null_spec.rb +0 -16
  216. data/spec/integration/mutant/rspec_spec.rb +0 -15
  217. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  218. data/spec/integrations.yml +0 -63
  219. data/spec/shared/base_behavior.rb +0 -45
  220. data/spec/shared/framework_integration_behavior.rb +0 -70
  221. data/spec/shared/method_matcher_behavior.rb +0 -47
  222. data/spec/spec_helper.rb +0 -75
  223. data/spec/support/corpus.rb +0 -318
  224. data/spec/support/file_system.rb +0 -62
  225. data/spec/support/ice_nine_config.rb +0 -10
  226. data/spec/support/ruby_vm.rb +0 -84
  227. data/spec/support/shared_context.rb +0 -169
  228. data/spec/support/test_app.rb +0 -7
  229. data/spec/support/warnings.yml +0 -6
  230. data/spec/support/xspec.rb +0 -183
  231. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  232. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  233. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  234. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  235. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  236. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  237. data/spec/unit/mutant/ast_spec.rb +0 -57
  238. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  239. data/spec/unit/mutant/cli_spec.rb +0 -305
  240. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  241. data/spec/unit/mutant/config_spec.rb +0 -126
  242. data/spec/unit/mutant/context_spec.rb +0 -111
  243. data/spec/unit/mutant/diff_spec.rb +0 -189
  244. data/spec/unit/mutant/env_spec.rb +0 -229
  245. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  246. data/spec/unit/mutant/expression/methods_spec.rb +0 -61
  247. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  248. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  249. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  250. data/spec/unit/mutant/expression_spec.rb +0 -45
  251. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  252. data/spec/unit/mutant/integration_spec.rb +0 -150
  253. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  254. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  255. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  256. data/spec/unit/mutant/license_spec.rb +0 -293
  257. data/spec/unit/mutant/loader_spec.rb +0 -79
  258. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  259. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  260. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  261. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  262. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  263. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  264. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  265. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  266. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -37
  267. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  268. data/spec/unit/mutant/matcher/scope_spec.rb +0 -35
  269. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  270. data/spec/unit/mutant/matcher_spec.rb +0 -102
  271. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  272. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  273. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  274. data/spec/unit/mutant/mutation_spec.rb +0 -140
  275. data/spec/unit/mutant/mutator/node_spec.rb +0 -52
  276. data/spec/unit/mutant/mutator_spec.rb +0 -21
  277. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  278. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  279. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  280. data/spec/unit/mutant/parallel_spec.rb +0 -115
  281. data/spec/unit/mutant/parser_spec.rb +0 -26
  282. data/spec/unit/mutant/range_spec.rb +0 -141
  283. data/spec/unit/mutant/registry_spec.rb +0 -74
  284. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  285. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  286. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  287. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  288. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  289. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  290. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  291. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  292. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  293. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  294. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  295. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  296. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  297. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  298. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  299. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  300. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  301. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  302. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  303. data/spec/unit/mutant/result/env_spec.rb +0 -161
  304. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  305. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  306. data/spec/unit/mutant/result/test_spec.rb +0 -14
  307. data/spec/unit/mutant/result_spec.rb +0 -33
  308. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  309. data/spec/unit/mutant/runner_spec.rb +0 -121
  310. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  311. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  312. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  313. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  314. data/spec/unit/mutant/subject_spec.rb +0 -93
  315. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  316. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  317. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  318. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  319. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  320. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  321. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  322. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  323. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  324. data/spec/unit/mutant/util/one_spec.rb +0 -22
  325. data/spec/unit/mutant/warnings_spec.rb +0 -89
  326. data/spec/unit/mutant/world_spec.rb +0 -63
  327. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  328. data/test_app/.rspec +0 -1
  329. data/test_app/Gemfile.minitest +0 -4
  330. data/test_app/Gemfile.rspec3.8 +0 -7
  331. data/test_app/lib/test_app.rb +0 -109
  332. data/test_app/lib/test_app/literal.rb +0 -35
  333. data/test_app/spec/spec_helper.rb +0 -9
  334. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  335. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -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
@@ -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
  super()
19
16
  emit_singletons
@@ -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)
@@ -12,9 +12,6 @@ module Mutant
12
12
 
13
13
  private
14
14
 
15
- # Emit element presence mutations
16
- #
17
- # @return [undefined]
18
15
  def dispatch
19
16
  input.each_index do |index|
20
17
  dup = dup_input
@@ -30,9 +27,6 @@ module Mutant
30
27
 
31
28
  private
32
29
 
33
- # Emit mutations
34
- #
35
- # @return [undefined]
36
30
  def dispatch
37
31
  input.each_with_index do |element, index|
38
32
  Mutator.mutate(element).each do |mutation|
@@ -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((input.to_s + POSTFIX).to_sym)
19
16
  end
@@ -36,24 +36,11 @@ module Mutant
36
36
  )
37
37
  end
38
38
 
39
- # Start threads
40
- #
41
- # @param [Config] config
42
- # @param [Worker] worker
43
- #
44
- # @return [Array<Thread>]
45
39
  def self.threads(config, worker)
46
40
  Array.new(config.jobs) { config.thread.new(&worker.method(:call)) }
47
41
  end
48
42
  private_class_method :threads
49
43
 
50
- # Create shared variable
51
- #
52
- # @param [Class] klass
53
- # @param [Config] config
54
- #
55
- # @return [Variable]
56
- #
57
44
  # ignore :reek:LongParameterList
58
45
  def self.shared(klass, config, **attributes)
59
46
  klass.new(
@@ -27,22 +27,12 @@ module Mutant
27
27
 
28
28
  private
29
29
 
30
- # Possibly finalize the exeuction
31
- #
32
- # @param [Status]
33
- #
34
- # @return [Status]
35
30
  def finalize(status)
36
31
  status.tap do
37
32
  threads.each(&:join) if status.done?
38
33
  end
39
34
  end
40
35
 
41
- # Get status
42
- #
43
- # @return [Status]
44
- #
45
- # ignore :reek:NestedIterators
46
36
  def status
47
37
  var_active_jobs.with do |active_jobs|
48
38
  var_sink.with do |sink|