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
@@ -27,16 +27,10 @@ module Mutant
27
27
 
28
28
  private
29
29
 
30
- # method matcher class
31
- #
32
- # @return [Class:Matcher::Method]
33
30
  def matcher
34
31
  self.class::MATCHER
35
32
  end
36
33
 
37
- # Available methods scope
38
- #
39
- # @return [Enumerable<Method, UnboundMethod>]
40
34
  def methods
41
35
  candidate_names.each_with_object([]) do |name, methods|
42
36
  method = access(name)
@@ -45,9 +39,6 @@ module Mutant
45
39
  end
46
40
  memoize :methods
47
41
 
48
- # Candidate method names on target scope
49
- #
50
- # @return [Enumerable<Symbol>]
51
42
  def candidate_names
52
43
  CANDIDATE_NAMES
53
44
  .map(&candidate_scope.method(:public_send))
@@ -55,10 +46,8 @@ module Mutant
55
46
  .sort
56
47
  end
57
48
 
58
- # Candidate scope
59
- #
60
- # @return [Class, Module]
61
49
  abstract_method :candidate_scope
50
+ private :candidate_scope
62
51
 
63
52
  # Matcher for singleton methods
64
53
  class Singleton < self
@@ -66,18 +55,10 @@ module Mutant
66
55
 
67
56
  private
68
57
 
69
- # Method object on scope
70
- #
71
- # @param [Symbol] method_name
72
- #
73
- # @return [Method]
74
58
  def access(method_name)
75
59
  scope.method(method_name)
76
60
  end
77
61
 
78
- # Candidate scope
79
- #
80
- # @return [Class]
81
62
  def candidate_scope
82
63
  scope.singleton_class
83
64
  end
@@ -85,24 +66,32 @@ module Mutant
85
66
 
86
67
  end # Singleton
87
68
 
69
+ # Matcher for metaclass methods
70
+ class Metaclass < self
71
+ MATCHER = Matcher::Method::Metaclass
72
+
73
+ private
74
+
75
+ def access(method_name)
76
+ scope.method(method_name)
77
+ end
78
+
79
+ def candidate_scope
80
+ scope.singleton_class
81
+ end
82
+ memoize :candidate_scope, freezer: :noop
83
+ end # Metaclass
84
+
88
85
  # Matcher for instance methods
89
86
  class Instance < self
90
87
  MATCHER = Matcher::Method::Instance
91
88
 
92
89
  private
93
90
 
94
- # Method object on scope
95
- #
96
- # @param [Symbol] method_name
97
- #
98
- # @return [UnboundMethod]
99
91
  def access(method_name)
100
92
  scope.instance_method(method_name)
101
93
  end
102
94
 
103
- # Candidate scope
104
- #
105
- # @return [Class, Module]
106
95
  def candidate_scope
107
96
  scope
108
97
  end
@@ -19,22 +19,12 @@ module Mutant
19
19
 
20
20
  private
21
21
 
22
- # The matched scopes
23
- #
24
- # @param [Env] env
25
- #
26
- # @return [Enumerable<Scope>]
27
22
  def matched_scopes(env)
28
23
  env
29
24
  .matchable_scopes
30
25
  .select(&method(:match?))
31
26
  end
32
27
 
33
- # Test scope if matches expression
34
- #
35
- # @param [Scope] scope
36
- #
37
- # @return [Boolean]
38
28
  def match?(scope)
39
29
  expression.prefix?(scope.expression)
40
30
  end
@@ -13,7 +13,8 @@ module Mutant
13
13
 
14
14
  MATCHERS = [
15
15
  Matcher::Methods::Singleton,
16
- Matcher::Methods::Instance
16
+ Matcher::Methods::Instance,
17
+ Matcher::Methods::Metaclass
17
18
  ].freeze
18
19
 
19
20
  private_constant(*constants(false))
@@ -29,9 +30,6 @@ module Mutant
29
30
 
30
31
  private
31
32
 
32
- # Effective matchers
33
- #
34
- # @return [Enumerable<Matcher>]
35
33
  def effective_matchers
36
34
  MATCHERS.map { |matcher| matcher.new(scope) }
37
35
  end
@@ -49,21 +49,11 @@ module Mutant
49
49
 
50
50
  private
51
51
 
52
- # Set original source
53
- #
54
- # @param [String,Parser::AST::Node] input
55
- #
56
- # @return [undefined]
57
52
  def source(input)
58
53
  fail 'source already defined' if @node
59
54
  @node = node(input)
60
55
  end
61
56
 
62
- # Add expected mutation
63
- #
64
- # @param [String,Parser::AST::Node] input
65
- #
66
- # @return [undefined]
67
57
  def mutation(input)
68
58
  node = node(input)
69
59
  if @expected.include?(node)
@@ -72,22 +62,11 @@ module Mutant
72
62
  @expected << node
73
63
  end
74
64
 
75
- # Add singleton mutations
76
- #
77
- # @return [undefined]
78
65
  def singleton_mutations
79
66
  mutation('nil')
80
67
  mutation('self')
81
68
  end
82
69
 
83
- # Helper method to coerce input to node
84
- #
85
- # @param [String,Parser::AST::Node] input
86
- #
87
- # @return [Parser::AST::Node]
88
- #
89
- # @raise [RuntimeError]
90
- # in case input cannot be coerced
91
70
  def node(input)
92
71
  case input
93
72
  when String
@@ -35,9 +35,6 @@ module Mutant
35
35
 
36
36
  private
37
37
 
38
- # Unexpected mutations
39
- #
40
- # @return [Array<Mutation>]
41
38
  def unexpected
42
39
  mutations.reject do |mutation|
43
40
  example.expected.include?(mutation.node)
@@ -45,9 +42,6 @@ module Mutant
45
42
  end
46
43
  memoize :unexpected
47
44
 
48
- # Missing mutations
49
- #
50
- # @return [Array<Mutation>]
51
45
  def missing
52
46
  (example.expected - mutations.map(&:node)).map do |node|
53
47
  Mutation::Evil.new(self, node)
@@ -55,9 +49,6 @@ module Mutant
55
49
  end
56
50
  memoize :missing
57
51
 
58
- # Mutations that generated invalid syntax
59
- #
60
- # @return [Enumerable<Mutation>]
61
52
  def invalid_syntax
62
53
  mutations.reject do |mutation|
63
54
  ::Parser::CurrentRuby.parse(mutation.source)
@@ -66,19 +57,11 @@ module Mutant
66
57
  end
67
58
  memoize :invalid_syntax
68
59
 
69
- # Mutations with no diff to original
70
- #
71
- # @return [Enumerable<Mutation>]
72
60
  def no_diffs
73
61
  mutations.select { |mutation| mutation.source.eql?(example.source) }
74
62
  end
75
63
  memoize :no_diffs
76
64
 
77
- # Mutation report
78
- #
79
- # @param [Array<Mutation>] mutations
80
- #
81
- # @return [Array<Hash>]
82
65
  def format_mutations(mutations)
83
66
  mutations.map do |mutation|
84
67
  {
@@ -88,9 +71,6 @@ module Mutant
88
71
  end
89
72
  end
90
73
 
91
- # No diff mutation report
92
- #
93
- # @return [Array, nil]
94
74
  def no_diff_report
95
75
  no_diffs.map do |mutation|
96
76
  {
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'minitest'
4
+
5
+ module Mutant
6
+ module Minitest
7
+ module Coverage
8
+ # Setup coverage declaration for current class
9
+ #
10
+ # @param [String]
11
+ #
12
+ # @example
13
+ #
14
+ # class MyTest < MiniTest::Test
15
+ # cover 'MyCode*'
16
+ #
17
+ # def test_some_stuff
18
+ # end
19
+ # end
20
+ #
21
+ # @api public
22
+ def cover(expression)
23
+ if defined?(@cover_expression)
24
+ fail "#{self} already declares to cover: #{@cover_expression.inspect}"
25
+ end
26
+
27
+ @cover_expression = expression
28
+ end
29
+
30
+ # Effective coverage expression
31
+ #
32
+ # @return [String, nil]
33
+ #
34
+ # @api private
35
+ def resolve_cover_expression
36
+ return @cover_expression if defined?(@cover_expression)
37
+
38
+ try_superclass_cover_expression
39
+ end
40
+
41
+ private
42
+
43
+ def try_superclass_cover_expression
44
+ return if superclass.equal?(::Minitest::Runnable)
45
+
46
+ superclass.resolve_cover_expression
47
+ end
48
+
49
+ end # Coverage
50
+ end # Minitest
51
+ end # Mutant
52
+
53
+ Minitest::Test.extend(Mutant::Minitest::Coverage)
@@ -74,9 +74,6 @@ module Mutant
74
74
 
75
75
  private
76
76
 
77
- # SHA1 sum of source and subject identification
78
- #
79
- # @return [String]
80
77
  def sha1
81
78
  Digest::SHA1.hexdigest(subject.identification + CODE_DELIMITER + source)
82
79
  end
@@ -18,9 +18,6 @@ module Mutant
18
18
  self::REGISTRY.lookup(node.type).call(node, parent)
19
19
  end
20
20
 
21
- # Register node class handler
22
- #
23
- # @return [undefined]
24
21
  def self.handle(*types)
25
22
  types.each do |type|
26
23
  self::REGISTRY.register(type, self)
@@ -35,13 +32,6 @@ module Mutant
35
32
 
36
33
  private
37
34
 
38
- # Initialize object
39
- #
40
- # @param [Object] input
41
- # @param [Object] parent
42
- # @param [#call(node)] block
43
- #
44
- # @return [undefined]
45
35
  def initialize(_input, _parent = nil)
46
36
  super
47
37
 
@@ -50,41 +40,23 @@ module Mutant
50
40
  dispatch
51
41
  end
52
42
 
53
- # Test if generated object is not guarded from emitting
54
- #
55
- # @param [Object] object
56
- #
57
- # @return [Boolean]
58
43
  def new?(object)
59
44
  !object.eql?(input)
60
45
  end
61
46
 
62
- # Dispatch node generations
63
- #
64
- # @return [undefined]
65
47
  abstract_method :dispatch
48
+ private :dispatch
66
49
 
67
- # Emit generated mutation if object is not equivalent to input
68
- #
69
- # @param [Object] object
70
- #
71
- # @return [undefined]
72
50
  def emit(object)
73
51
  return unless new?(object)
74
52
 
75
53
  output << object
76
54
  end
77
55
 
78
- # Run input with mutator
79
- #
80
- # @return [undefined]
81
56
  def run(mutator)
82
57
  mutator.call(input).each(&method(:emit))
83
58
  end
84
59
 
85
- # Shortcut to create a new unfrozen duplicate of input
86
- #
87
- # @return [Object]
88
60
  def dup_input
89
61
  input.dup
90
62
  end
@@ -34,21 +34,9 @@ module Mutant
34
34
 
35
35
  private
36
36
 
37
- # Node to mutate
38
- #
39
- # @return [Parser::AST::Node]
40
- alias_method :node, :input
41
-
42
- # Duplicate of original
43
- #
44
- # @return [Parser::AST::Node]
37
+ alias_method :node, :input
45
38
  alias_method :dup_node, :dup_input
46
39
 
47
- # Dispatch on child index
48
- #
49
- # @param [Integer] index
50
- #
51
- # @return [undefined]
52
40
  def mutate_child(index, &block)
53
41
  block ||= TAUTOLOGY
54
42
  Mutator.mutate(children.fetch(index), self).each do |mutation|
@@ -57,108 +45,55 @@ module Mutant
57
45
  end
58
46
  end
59
47
 
60
- # Emit delete child mutation
61
- #
62
- # @param [Integer] index
63
- #
64
- # @return [undefined]
65
48
  def delete_child(index)
66
49
  dup_children = children.dup
67
50
  dup_children.delete_at(index)
68
51
  emit_type(*dup_children)
69
52
  end
70
53
 
71
- # Emit updated child
72
- #
73
- # @param [Integer] index
74
- # @param [Parser::AST::Node] node
75
- #
76
- # @return [undefined]
77
54
  def emit_child_update(index, node)
78
55
  new_children = children.dup
79
56
  new_children[index] = node
80
57
  emit_type(*new_children)
81
58
  end
82
59
 
83
- # Emit a new AST node with same class as wrapped node
84
- #
85
- # @param [Array<Parser::AST::Node>] children
86
- #
87
- # @return [undefined]
88
60
  def emit_type(*children)
89
61
  emit(::Parser::AST::Node.new(node.type, children))
90
62
  end
91
63
 
92
- # Emit propagation if node can stand alone
93
- #
94
- # @return [undefined]
95
64
  def emit_propagation(node)
96
65
  emit(node) unless AST::Types::NOT_STANDALONE.include?(node.type)
97
66
  end
98
67
 
99
- # Emit singleton literals
100
- #
101
- # @return [undefined]
102
68
  def emit_singletons
103
69
  emit_nil
104
70
  emit_self
105
71
  end
106
72
 
107
- # Emit a literal self
108
- #
109
- # @return [undefined]
110
73
  def emit_self
111
74
  emit(N_SELF)
112
75
  end
113
76
 
114
- # Emit a literal nil
115
- #
116
- # @return [undefined]
117
77
  def emit_nil
118
78
  emit(N_NIL) unless left_assignment?
119
79
  end
120
80
 
121
- # Parent node
122
- #
123
- # @return [Parser::AST::Node] node
124
- # if parent with node is present
125
- #
126
- # @return [nil]
127
- # otherwise
128
81
  def parent_node
129
82
  parent&.node
130
83
  end
131
84
 
132
- # Parent type
133
- #
134
- # @return [Symbol] type
135
- # if parent with type is present
136
- #
137
- # @return [nil]
138
- # otherwise
139
85
  def parent_type
140
86
  parent_node&.type
141
87
  end
142
88
 
143
- # Test if the node is the left of an or_asgn or op_asgn
144
- #
145
- # @return [Boolean]
146
89
  def left_assignment?
147
90
  AST::Types::OP_ASSIGN.include?(parent_type) && parent.node.children.first.equal?(node)
148
91
  end
149
92
 
150
- # Children indices
151
- #
152
- # @param [Range] range
153
- #
154
- # @return [Enumerable<Integer>]
155
93
  def children_indices(range)
156
94
  range.begin.upto(children.length + range.end)
157
95
  end
158
96
 
159
- # Emit single child mutation
160
- #
161
- # @return [undefined]
162
97
  def mutate_single_child
163
98
  children.each_with_index do |child, index|
164
99
  mutate_child(index)