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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5ac360cb601cc521059ca91167f18898ca897a7c475244e122c2fa46c80213b6
4
- data.tar.gz: 557f073ba78b87381f7a424b198df8a6450e16b2f4bf3b3863ba370aa4fe7207
3
+ metadata.gz: 8a634036241e157b66b8778d1645bca99d67cd81fa26042c42e43f868bafa260
4
+ data.tar.gz: ee46dcacd412e10634454dbdd5ec52d5a803c71fa8e9db9cc3fcdc35e35a8e5c
5
5
  SHA512:
6
- metadata.gz: d8375c95cab6deab2f6b460892e40c3922dc5adf2b2dc188f9a3ac459dfe5c5a453da543b4fb8f95e7596019989aca80cf01c66d49a3796ef678b3f48c30b136
7
- data.tar.gz: 4dc79e273ef83112e0e4b2d4e6c74dd8f0bc0366537cb7efc5f71fbdd0a22a93ab29e8c7726c1a78224fc020a92b202eed2ab1ef9a534fd008f5a621779a7aa8
6
+ metadata.gz: b0d20d48dc5443ba2347c176425ec372ed2d4e2f11e0bea33c59895b9b52d00b4efcdd07e8f9b47eefbd2ebd8f20d610f3ed3a726d9d59bbed1378b2be2fea1f
7
+ data.tar.gz: e4ad2f3d626eaae68f390447ad94cdf1338525f010f684f524873cfab6560d25ffb67062f6f2567750c9468670241d5180ba1a8bcc32fe7e42fc16cd3ff2c4ef
@@ -51,6 +51,7 @@ require 'mutant/ast/types'
51
51
  require 'mutant/ast/nodes'
52
52
  require 'mutant/ast/named_children'
53
53
  require 'mutant/ast/node_predicates'
54
+ require 'mutant/ast/find_metaclass_containing'
54
55
  require 'mutant/ast/meta'
55
56
  require 'mutant/ast/meta/send'
56
57
  require 'mutant/ast/meta/const'
@@ -112,12 +113,14 @@ require 'mutant/mutator/node/send/conditional'
112
113
  require 'mutant/mutator/node/send/attribute_assignment'
113
114
  require 'mutant/mutator/node/when'
114
115
  require 'mutant/mutator/node/class'
116
+ require 'mutant/mutator/node/sclass'
115
117
  require 'mutant/mutator/node/define'
116
118
  require 'mutant/mutator/node/mlhs'
117
119
  require 'mutant/mutator/node/nthref'
118
120
  require 'mutant/mutator/node/masgn'
119
121
  require 'mutant/mutator/node/return'
120
122
  require 'mutant/mutator/node/block'
123
+ require 'mutant/mutator/node/block_pass'
121
124
  require 'mutant/mutator/node/if'
122
125
  require 'mutant/mutator/node/case'
123
126
  require 'mutant/mutator/node/splat'
@@ -134,11 +137,13 @@ require 'mutant/subject'
134
137
  require 'mutant/subject/method'
135
138
  require 'mutant/subject/method/instance'
136
139
  require 'mutant/subject/method/singleton'
140
+ require 'mutant/subject/method/metaclass'
137
141
  require 'mutant/matcher'
138
142
  require 'mutant/matcher/config'
139
143
  require 'mutant/matcher/chain'
140
144
  require 'mutant/matcher/method'
141
145
  require 'mutant/matcher/method/singleton'
146
+ require 'mutant/matcher/method/metaclass'
142
147
  require 'mutant/matcher/method/instance'
143
148
  require 'mutant/matcher/methods'
144
149
  require 'mutant/matcher/namespace'
@@ -161,8 +166,6 @@ require 'mutant/selector/expression'
161
166
  require 'mutant/selector/null'
162
167
  require 'mutant/config'
163
168
  require 'mutant/cli'
164
- require 'mutant/color'
165
- require 'mutant/diff'
166
169
  require 'mutant/runner'
167
170
  require 'mutant/runner/sink'
168
171
  require 'mutant/result'
@@ -27,15 +27,6 @@ module Mutant
27
27
  path
28
28
  end
29
29
 
30
- # Walk all ast nodes keeping track of path
31
- #
32
- # @param [Parser::AST::Node] root
33
- # @param [Array<Parser::AST::Node>] stack
34
- #
35
- # @yield [Parser::AST::Node]
36
- # all nodes visited recursively including root
37
- #
38
- # @return [undefined]
39
30
  def self.walk(node, stack, &block)
40
31
  block.call(node, stack)
41
32
  node.children.grep(::Parser::AST::Node) do |child|
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Mutant
4
+ module AST
5
+ # Given an AST, finds the sclass that directly(-ish) contains the provided
6
+ # node.
7
+ # This won't match arbitrarily complex structures - it only searches the
8
+ # first level deep (no begins-in-begins, for example). This is in
9
+ # keeping with mutant generally not supporting 'weird' syntax.
10
+ # Descending into 'begin' nodes is supported because these are generated for
11
+ # the one-line syntax class << self; def foo; end
12
+ class FindMetaclassContaining
13
+ include NodePredicates, Concord.new(:root, :target), Procto.call
14
+
15
+ SCLASS_BODY_INDEX = 1
16
+
17
+ private_constant(*constants(false))
18
+
19
+ # Find metaclass node containing target node
20
+ #
21
+ # @return [Parser::AST::Node, nil]
22
+ #
23
+ # @api private
24
+ def call
25
+ AST.find_last_path(root) do |current|
26
+ next unless n_sclass?(current)
27
+
28
+ metaclass_of?(current)
29
+ end.last
30
+ end
31
+
32
+ private
33
+
34
+ def metaclass_of?(sclass)
35
+ body = sclass.children.fetch(SCLASS_BODY_INDEX)
36
+ body.equal?(target) || transparently_contains?(body)
37
+ end
38
+
39
+ def transparently_contains?(body)
40
+ n_begin?(body) && include_exact?(body.children, target)
41
+ end
42
+
43
+ def include_exact?(haystack, needle)
44
+ haystack.any? { |elem| elem.equal?(needle) }
45
+ end
46
+ end
47
+ end
48
+ end
@@ -56,16 +56,10 @@ module Mutant
56
56
 
57
57
  private
58
58
 
59
- # Test if node is `proc { ... }`
60
- #
61
- # @return [Boolean]
62
59
  def naked_proc?
63
60
  !receiver && selector.equal?(:proc)
64
61
  end
65
62
 
66
- # Test if node is `Proc.new { ... }`
67
- #
68
- # @return [Boolean]
69
63
  def proc_new?
70
64
  receiver &&
71
65
  selector.equal?(:new) &&
@@ -36,7 +36,7 @@ module Mutant
36
36
  .tap(&method(:infect))
37
37
  .with(matchable_scopes: matchable_scopes(world, config))
38
38
 
39
- subjects = Matcher.from_config(env.config.matcher).call(env)
39
+ subjects = start_subject(env, Matcher.from_config(env.config.matcher).call(env))
40
40
 
41
41
  Integration.setup(env).fmap do |integration|
42
42
  env.with(
@@ -49,9 +49,19 @@ module Mutant
49
49
  end
50
50
  # rubocop:enable Metrics/MethodLength
51
51
 
52
- # Infect environment
53
- #
54
- # @return [undefined]
52
+ def self.start_subject(env, subjects)
53
+ start_expressions = env.config.matcher.start_expressions
54
+
55
+ return subjects if start_expressions.empty?
56
+
57
+ subjects.drop_while do |subject|
58
+ start_expressions.none? do |expression|
59
+ expression.prefix?(subject.expression)
60
+ end
61
+ end
62
+ end
63
+ private_class_method :start_subject
64
+
55
65
  def self.infect(env)
56
66
  config, world = env.config, env.world
57
67
 
@@ -60,12 +70,6 @@ module Mutant
60
70
  end
61
71
  private_class_method :infect
62
72
 
63
- # Matchable scopes
64
- #
65
- # @param [World] world
66
- # @param [Config] config
67
- #
68
- # @return [Array<Scope>]
69
73
  def self.matchable_scopes(world, config)
70
74
  scopes = world.object_space.each_object(Module).each_with_object([]) do |scope, aggregate|
71
75
  expression = expression(config.reporter, config.expression_parser, scope) || next
@@ -76,15 +80,6 @@ module Mutant
76
80
  end
77
81
  private_class_method :matchable_scopes
78
82
 
79
- # Scope name from scoping object
80
- #
81
- # @param [Class, Module] scope
82
- #
83
- # @return [String]
84
- # if scope has a name and does not raise exceptions obtaining it
85
- #
86
- # @return [nil]
87
- # otherwise
88
83
  def self.scope_name(reporter, scope)
89
84
  scope.name
90
85
  rescue => exception
@@ -99,20 +94,7 @@ module Mutant
99
94
  end
100
95
  private_class_method :scope_name
101
96
 
102
- # Try to turn scope into expression
103
- #
104
- # @param [Expression::Parser] expression_parser
105
- # @param [Class, Module] scope
106
- #
107
- # @return [Expression]
108
- # if scope can be represented in an expression
109
- #
110
- # @return [nil]
111
- # otherwise
112
- #
113
97
  # rubocop:disable Metrics/MethodLength
114
- #
115
- # ignore :reek:LongParameterList
116
98
  def self.expression(reporter, expression_parser, scope)
117
99
  name = scope_name(reporter, scope) or return
118
100
 
@@ -132,11 +114,6 @@ module Mutant
132
114
  private_class_method :expression
133
115
  # rubocop:enable Metrics/MethodLength
134
116
 
135
- # Write a semantics warning
136
- #
137
- # @return [undefined]
138
- #
139
- # ignore :reek:LongParameterList
140
117
  def self.semantics_warning(reporter, format, options)
141
118
  reporter.warn(SEMANTICS_MESSAGE_FORMAT % { message: format % options })
142
119
  end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Mutant
4
4
  # Commandline parser / runner
5
+ #
6
+ # rubocop:disable Metrics/ClassLength
5
7
  class CLI
6
8
  include Concord.new(:world, :config)
7
9
 
@@ -88,23 +90,12 @@ module Mutant
88
90
 
89
91
  private
90
92
 
91
- # Parse matchers
92
- #
93
- # @param [Array<String>] expressions
94
- #
95
- # @return [undefined]
96
93
  def parse_match_expressions(expressions)
97
94
  expressions.each do |expression|
98
95
  add_matcher(:match_expressions, config.expression_parser.apply(expression).from_right)
99
96
  end
100
97
  end
101
98
 
102
- # Add environmental options
103
- #
104
- # @param [Object] opts
105
- #
106
- # @return [undefined]
107
- #
108
99
  # rubocop:disable Metrics/MethodLength
109
100
  def add_environment_options(opts)
110
101
  opts.separator('Environment:')
@@ -121,12 +112,8 @@ module Mutant
121
112
  with(jobs: Integer(number))
122
113
  end
123
114
  end
115
+ # rubocop:enable Metrics/MethodLength
124
116
 
125
- # Add mutation options
126
- #
127
- # @param [OptionParser] opts
128
- #
129
- # @return [undefined]
130
117
  def add_mutation_options(opts)
131
118
  opts.separator(nil)
132
119
  opts.separator('Options:')
@@ -136,15 +123,14 @@ module Mutant
136
123
  end
137
124
  end
138
125
 
139
- # Add filter options
140
- #
141
- # @param [OptionParser] opts
142
- #
143
- # @return [undefined]
126
+ # rubocop:disable Metrics/MethodLength
144
127
  def add_filter_options(opts)
145
128
  opts.on('--ignore-subject EXPRESSION', 'Ignore subjects that match EXPRESSION as prefix') do |pattern|
146
129
  add_matcher(:ignore_expressions, config.expression_parser.apply(pattern).from_right)
147
130
  end
131
+ opts.on('--start-subject EXPRESSION', 'Start mutation testing at a specific subject') do |pattern|
132
+ add_matcher(:start_expressions, config.expression_parser.apply(pattern).from_right)
133
+ end
148
134
  opts.on('--since REVISION', 'Only select subjects touched since REVISION') do |revision|
149
135
  add_matcher(
150
136
  :subject_filters,
@@ -154,12 +140,9 @@ module Mutant
154
140
  )
155
141
  end
156
142
  end
143
+ # rubocop:enable Metrics/MethodLength
157
144
 
158
- # Add debug options
159
- #
160
- # @param [OptionParser] opts
161
- #
162
- # @return [undefined]
145
+ # rubocop:disable Metrics/MethodLength
163
146
  def add_debug_options(opts)
164
147
  opts.on('--fail-fast', 'Fail fast') do
165
148
  with(fail_fast: true)
@@ -173,40 +156,19 @@ module Mutant
173
156
  world.kernel.exit
174
157
  end
175
158
  end
159
+ # rubocop:enable Metrics/MethodLength
176
160
 
177
- # With configuration
178
- #
179
- # @param [Hash<Symbol, Object>] attributes
180
- #
181
- # @return [undefined]
182
161
  def with(attributes)
183
162
  @config = config.with(attributes)
184
163
  end
185
164
 
186
- # Add configuration
187
- #
188
- # @param [Symbol] attribute
189
- # the attribute to add to
190
- #
191
- # @param [Object] value
192
- # the value to add
193
- #
194
- # @return [undefined]
195
165
  def add(attribute, value)
196
166
  with(attribute => config.public_send(attribute) + [value])
197
167
  end
198
168
 
199
- # Add matcher configuration
200
- #
201
- # @param [Symbol] attribute
202
- # the attribute to add to
203
- #
204
- # @param [Object] value
205
- # the value to add
206
- #
207
- # @return [undefined]
208
169
  def add_matcher(attribute, value)
209
170
  with(matcher: config.matcher.add(attribute, value))
210
171
  end
211
172
  end # CLI
173
+ # rubocop:enable Metrics/ClassLength
212
174
  end # Mutant
@@ -126,14 +126,6 @@ module Mutant
126
126
  end
127
127
  end
128
128
 
129
- # Load contents of file
130
- #
131
- # @param [Pathname] path
132
- #
133
- # @return [Config]
134
- #
135
- # @raise [Either<String, Hash{Symbol => Object}>]
136
- # in case of config file error
137
129
  def self.load_contents(path)
138
130
  Transform::Named
139
131
  .new(path.to_s, TRANSFORM)
@@ -81,9 +81,6 @@ module Mutant
81
81
 
82
82
  private
83
83
 
84
- # Nesting of names in scope
85
- #
86
- # @return [Array<String>]
87
84
  def name_nesting
88
85
  scope.name.split(NAMESPACE_DELIMITER)
89
86
  end
@@ -126,12 +126,6 @@ module Mutant
126
126
 
127
127
  private
128
128
 
129
- # Kill mutation under isolation with integration
130
- #
131
- # @param [Mutation] mutation
132
- # @param [Array<Test>] test
133
- #
134
- # @return [Result::Isolation]
135
129
  def run_mutation_tests(mutation, tests)
136
130
  config.isolation.call do
137
131
  result = mutation.insert(world.kernel)
@@ -14,8 +14,8 @@ module Mutant
14
14
  private(*anima.attribute_names)
15
15
 
16
16
  MATCHERS = IceNine.deep_freeze(
17
- '.' => Matcher::Methods::Singleton,
18
- '#' => Matcher::Methods::Instance
17
+ '.' => [Matcher::Methods::Singleton, Matcher::Methods::Metaclass],
18
+ '#' => [Matcher::Methods::Instance]
19
19
  )
20
20
 
21
21
  METHOD_NAME_PATTERN = Regexp.union(
@@ -39,16 +39,16 @@ module Mutant
39
39
  #
40
40
  # @return [Matcher]
41
41
  def matcher
42
- methods_matcher = MATCHERS.fetch(scope_symbol).new(scope)
42
+ matcher_candidates = MATCHERS.fetch(scope_symbol)
43
+ .map { |submatcher| submatcher.new(scope) }
44
+
45
+ methods_matcher = Matcher::Chain.new(matcher_candidates)
43
46
 
44
47
  Matcher::Filter.new(methods_matcher, ->(subject) { subject.expression.eql?(self) })
45
48
  end
46
49
 
47
50
  private
48
51
 
49
- # Scope object
50
- #
51
- # @return [Class, Method]
52
52
  def scope
53
53
  Object.const_get(scope_name)
54
54
  end
@@ -13,8 +13,8 @@ module Mutant
13
13
  private(*anima.attribute_names)
14
14
 
15
15
  MATCHERS = IceNine.deep_freeze(
16
- '.' => Matcher::Methods::Singleton,
17
- '#' => Matcher::Methods::Instance
16
+ '.' => [Matcher::Methods::Singleton, Matcher::Methods::Metaclass],
17
+ '#' => [Matcher::Methods::Instance]
18
18
  )
19
19
  private_constant(*constants(false))
20
20
 
@@ -32,7 +32,10 @@ module Mutant
32
32
  #
33
33
  # @return [Matcher::Method]
34
34
  def matcher
35
- MATCHERS.fetch(scope_symbol).new(scope)
35
+ matcher_candidates = MATCHERS.fetch(scope_symbol)
36
+ .map { |submatcher| submatcher.new(scope) }
37
+
38
+ Matcher::Chain.new(matcher_candidates)
36
39
  end
37
40
 
38
41
  # Length of match with other expression
@@ -50,9 +53,6 @@ module Mutant
50
53
 
51
54
  private
52
55
 
53
- # Scope object
54
- #
55
- # @return [Class, Method]
56
56
  def scope
57
57
  Object.const_get(scope_name)
58
58
  end