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
@@ -1,30 +0,0 @@
1
- Known Problems
2
- ==============
3
-
4
- The Crash / Stuck Problem (MRI)
5
- -------------------------------
6
-
7
- Mutations generated by mutant can cause MRI to enter VM states its not prepared for.
8
- All MRI versions > 1.9 and < 2.2.1 are affected by this depending on your compiler flags,
9
- compiler version, and OS scheduling behavior.
10
-
11
- This can have the following unintended effects:
12
-
13
- * MRI crashes with a segfault. Mutant kills each mutation in a dedicated fork to isolate
14
- the mutations side effects when this fork terminates abnormally (segfault) mutant
15
- counts the mutation as killed.
16
-
17
- * MRI crashes with a segfault and gets stuck when handling the segfault.
18
- Depending on the number of active kill jobs mutant might appear to continue normally until
19
- all workers are stuck into this state when it begins to hang.
20
- Currently mutant must assume that your test suite simply not terminated yet as from the outside
21
- (parent process) the difference between a long running test and a stuck MRI is not observable.
22
- Its planned to implement a timeout enforced from the parent process, but ideally MRI simply gets fixed.
23
-
24
- References:
25
-
26
- * [MRI fix](https://github.com/ruby/ruby/commit/8fe95fea9d238a6deb70c8953ceb3a28a67f4636)
27
- * [MRI backport to 2.2.1](https://github.com/ruby/ruby/commit/8fe95fea9d238a6deb70c8953ceb3a28a67f4636)
28
- * [Mutant issue](https://github.com/mbj/mutant/issues/265)
29
- * [Upstream bug redmine](https://bugs.ruby-lang.org/issues/10460)
30
- * [Upstream bug github](https://github.com/ruby/ruby/pull/822)
@@ -1,50 +0,0 @@
1
- Limitations
2
- ===========
3
-
4
- Subject
5
- -------
6
-
7
- Mutant cannot emit mutations for some subjects.
8
-
9
- * methods defined within a closure. For example, methods defined using `module_eval`, `class_eval`,
10
- `define_method`, or `define_singleton_method`:
11
-
12
- ```ruby
13
- class Example
14
- class_eval do
15
- def example1
16
- end
17
- end
18
-
19
- module_eval do
20
- def example2
21
- end
22
- end
23
-
24
- define_method(:example3) do
25
- end
26
-
27
- define_singleton_method(:example4) do
28
- end
29
- end
30
- ```
31
-
32
- * singleton methods not defined on a constant or `self`
33
-
34
- ```ruby
35
- class Foo
36
- def self.bar; end # ok
37
- def Foo.baz; end # ok
38
-
39
- myself = self
40
- def myself.qux; end # cannot mutate
41
- end
42
- ```
43
-
44
- * methods defined with eval:
45
-
46
- ```ruby
47
- class Foo
48
- class_eval('def bar; end') # cannot mutate
49
- end
50
- ```
@@ -1,149 +0,0 @@
1
- mutant-minitest
2
- ===============
3
-
4
- Before starting with mutant its recommended to understand the
5
- [nomenclature](/docs/nomenclature.md).
6
-
7
- ## Setup
8
-
9
- To add mutant to your minitest code base you need to:
10
-
11
- 1. Add `mutant-minitest` as development dependency to your `Gemfile` or `.gemspec`
12
-
13
- This may look like:
14
-
15
- ```ruby
16
- # A gemfile
17
- gem 'mutant-minitest'
18
- ```
19
-
20
- 2. Add `require 'mutant/minitest/coverage'` to your test environment (example to your `test/test_helper.rb`)
21
-
22
- Example:
23
-
24
- ```ruby
25
- require 'minitest/autorun'
26
- require 'mutant/minitest/coverage'
27
-
28
- class YourTestBaseClass < MiniTest::Test
29
- # ...
30
- ```
31
-
32
- 3. Add `.cover` call sides to your test suite to mark them as eligible for killing mutations in subjects.
33
-
34
- Example:
35
-
36
- ```ruby
37
- class YourLibrarySomeClassTest < YourTestBaseClass
38
- cover 'YourLibrary::SomeClass*' # tells mutant which subjects this tests should cover
39
- # ...
40
- ```
41
-
42
- 4. Run mutant against the minitest integration
43
-
44
- ```sh
45
- bundle exec mutant --include lib --require 'your_library.rb' --use minitest -- 'YourLibrary*'
46
- ```
47
-
48
- ## Run through example
49
-
50
- This uses [mbj/auom](https://github.com/mbj/auom) a small library that
51
- has 100% mutation coverage. Its tests execute very fast and do not have any IO
52
- so its a good playground example to interact with.
53
-
54
- All the setup described above is already done.
55
-
56
- ```sh
57
- git clone https://github.com/mbj/auom
58
- cd auom
59
- bundle install # gemfile references mutant-minitest already
60
- bundle exec mutant --include lib --require auom --use minitest -- 'AUOM*'
61
- ```
62
-
63
- This prints a report like:
64
-
65
- ```sh
66
- Mutant environment:
67
- Matcher: #<Mutant::Matcher::Config match_expressions: [AUOM*]>
68
- Integration: Mutant::Integration::Minitest
69
- Jobs: 8
70
- Includes: ["lib"]
71
- Requires: ["auom"]
72
- Subjects: 23
73
- Mutations: 1003
74
- Results: 1003
75
- Kills: 1003
76
- Alive: 0
77
- Runtime: 9.68s
78
- Killtime: 3.80s
79
- Overhead: 154.30%
80
- Mutations/s: 103.67
81
- Coverage: 100.00%
82
- ```
83
-
84
- Now lets try adding some redundant (or unspecified) code:
85
-
86
- ```sh
87
- patch -p1 <<'PATCH'
88
- --- a/lib/auom/unit.rb
89
- +++ b/lib/auom/unit.rb
90
- @@ -170,7 +170,7 @@ module AUOM
91
- # TODO: Move defaults coercions etc to .build method
92
- #
93
- def self.new(scalar, numerators = nil, denominators = nil)
94
- - scalar = rational(scalar)
95
- + scalar = rational(scalar) if true
96
-
97
- scalar, numerators = resolve([*numerators], scalar, :*)
98
- scalar, denominators = resolve([*denominators], scalar, :/)
99
- PATCH
100
- ```
101
-
102
- Running mutant again prints the following:
103
-
104
- ```
105
- AUOM::Unit.new:/home/mrh-dev/auom/lib/auom/unit.rb:172
106
- - minitest:AUOMTest::ClassMethods::New#test_reduced_unit
107
- - minitest:AUOMTest::ClassMethods::New#test_normalized_denominator_scalar
108
- - minitest:AUOMTest::ClassMethods::New#test_normalized_numerator_unit
109
- - minitest:AUOMTest::ClassMethods::New#test_incompatible_scalar
110
- - minitest:AUOMTest::ClassMethods::New#test_integer
111
- - minitest:AUOMTest::ClassMethods::New#test_sorted_numerator
112
- - minitest:AUOMTest::ClassMethods::New#test_unknown_unit
113
- - minitest:AUOMTest::ClassMethods::New#test_rational
114
- - minitest:AUOMTest::ClassMethods::New#test_normalized_numerator_scalar
115
- - minitest:AUOMTest::ClassMethods::New#test_sorted_denominator
116
- - minitest:AUOMTest::ClassMethods::New#test_normalized_denominator_unit
117
- evil:AUOM::Unit.new:/home/mrh-dev/auom/lib/auom/unit.rb:172:cd9ee
118
- @@ -1,9 +1,7 @@
119
- def self.new(scalar, numerators = nil, denominators = nil)
120
- - if true
121
- - scalar = rational(scalar)
122
- - end
123
- + scalar = rational(scalar)
124
- scalar, numerators = resolve([*numerators], scalar, :*)
125
- scalar, denominators = resolve([*denominators], scalar, :/)
126
- super(scalar, *[numerators, denominators].map(&:sort)).freeze
127
- end
128
- -----------------------
129
- Mutant configuration:
130
- Matcher: #<Mutant::Matcher::Config match_expressions: [AUOM*]>
131
- Integration: Mutant::Integration::Minitest
132
- Jobs: 8
133
- Includes: ["lib"]
134
- Requires: ["auom"]
135
- Subjects: 23
136
- Mutations: 1009
137
- Results: 1009
138
- Kills: 1008
139
- Alive: 1
140
- Runtime: 9.38s
141
- Killtime: 3.47s
142
- Overhead: 170.06%
143
- Mutations/s: 107.60
144
- Coverage: 99.90%
145
- ```
146
-
147
- This shows mutant detected the alive mutation. Which shows the conditional we deliberately added above is redundant.
148
-
149
- Feel free to also remove some tests. Or do other modifications to either test or code.
@@ -1,130 +0,0 @@
1
- mutant-rspec
2
- ============
3
-
4
- Before starting with mutant its recommended to understand the
5
- [nomenclature](/docs/nomenclature.md).
6
-
7
- ## Setup
8
-
9
- To add mutant to your rspec code base you need to:
10
-
11
- 1. Add `mutant-rspec` as development dependency to your `Gemfile` or `.gemspec`
12
-
13
- This may look like:
14
-
15
- ```ruby
16
- # A gemfile
17
- gem 'mutant-rspec'
18
- ```
19
-
20
- 2. Run mutant against the rspec integration via the `--use rspec` flag.
21
-
22
- ## Run through example
23
-
24
- This uses [mbj/auom](https://github.com/mbj/auom) a small library that
25
- has 100% mutation coverage. Its tests execute very fast and do not have any IO
26
- so its a good playground example to interact with.
27
-
28
- All the setup described above is already done.
29
-
30
- ```sh
31
- git clone https://github.com/mbj/auom
32
- cd auom
33
- bundle install # gemfile references mutant-rspec already
34
- bundle exec mutant --include lib --require auom --use rspec -- 'AUOM*'
35
- ```
36
-
37
- This prints a report like:
38
-
39
- ```sh
40
- Mutant environment:
41
- Matcher: #<Mutant::Matcher::Config match_expressions: [AUOM*]>
42
- Integration: Mutant::Integration::Rspec
43
- Jobs: 8
44
- Includes: ["lib"]
45
- Requires: ["auom"]
46
- Subjects: 23
47
- Mutations: 1003
48
- Results: 1003
49
- Kills: 1003
50
- Alive: 0
51
- Runtime: 51.52s
52
- Killtime: 200.13s
53
- Overhead: -74.26%
54
- Mutations/s: 19.47
55
- Coverage: 100.00%
56
- ```
57
-
58
- Now lets try adding some redundant (or unspecified) code:
59
-
60
- ```sh
61
- patch -p1 <<'PATCH'
62
- --- a/lib/auom/unit.rb
63
- +++ b/lib/auom/unit.rb
64
- @@ -170,7 +170,7 @@ module AUOM
65
- # TODO: Move defaults coercions etc to .build method
66
- #
67
- def self.new(scalar, numerators = nil, denominators = nil)
68
- - scalar = rational(scalar)
69
- + scalar = rational(scalar) if true
70
-
71
- scalar, numerators = resolve([*numerators], scalar, :*)
72
- scalar, denominators = resolve([*denominators], scalar, :/)
73
- PATCH
74
- ```
75
-
76
- Running mutant again prints the following:
77
-
78
- ```sh
79
- evil:AUOM::Unit.new:/home/mrh-dev/example/auom/lib/auom/unit.rb:172:45e17
80
- @@ -1,9 +1,7 @@
81
- def self.new(scalar, numerators = nil, denominators = nil)
82
- - if true
83
- - scalar = rational(scalar)
84
- - end
85
- + scalar = rational(scalar)
86
- scalar, numerators = resolve([*numerators], scalar, :*)
87
- scalar, denominators = resolve([*denominators], scalar, :/)
88
- super(scalar, *[numerators, denominators].map(&:sort)).freeze
89
- end
90
- -----------------------
91
- Mutant configuration:
92
- Matcher: #<Mutant::Matcher::Config match_expressions: [AUOM*]>
93
- Integration: Mutant::Integration::Rspec
94
- Jobs: 8
95
- Includes: ["lib"]
96
- Requires: ["auom"]
97
- Subjects: 23
98
- Mutations: 1009
99
- Results: 1009
100
- Kills: 1008
101
- Alive: 1
102
- Runtime: 50.93s
103
- Killtime: 190.09s
104
- Overhead: -73.21%
105
- Mutations/s: 19.81
106
- Coverage: 99.90%
107
- ```
108
-
109
- This shows mutant detected the alive mutation. Which shows the conditional we deliberately added above is redundant.
110
-
111
- Feel free to also remove some tests. Or do other modifications to either test or code.
112
-
113
- Test-Selection
114
- --------------
115
-
116
- Mutation testing is slow. The key to making it fast is selecting the correct
117
- set of tests to run. Mutant currently supports the following built-in
118
- strategy for selecting tests/specs:
119
-
120
- Mutant uses the "longest rspec example group descriptions prefix match" to
121
- select the tests to run.
122
-
123
- Example for a subject like `Foo::Bar#baz` it will run all example groups with
124
- description prefixes in `Foo::Bar#baz`, `Foo::Bar` and `Foo`. The order is
125
- important, so if mutant finds example groups in the current prefix level,
126
- these example groups *must* kill the mutation.
127
-
128
- ```sh
129
- RAILS_ENV=test bundle exec mutant -r ./config/environment --use rspec User
130
- ```
@@ -1,82 +0,0 @@
1
- Nomenclature
2
- ============
3
-
4
- The following explains several nouns you may experience in mutant's documentation.
5
- It's a good idea to familiarize yourself before moving on.
6
-
7
- ## AST
8
-
9
- Acronym for [Abstract Syntax Tree](https://en.wikipedia.org/wiki/Abstract_syntax_tree)
10
- and the level of abstraction mutant operates on.
11
-
12
- ## Subject
13
-
14
- An addressable piece of code to be targeted for mutation testing.
15
-
16
- Mutant currently supports the following subjects:
17
-
18
- * Instance methods
19
- * Singleton (class) methods
20
-
21
- Other subjects (constants, class bodies for DSLs, ...) are possible but aren't
22
- implemented in the OSS version.
23
-
24
- ## Mutation operator
25
-
26
- A transformation applied to the AST of a subject. Mutant knows the following high level operator
27
- classes:
28
-
29
- * Semantic Reduction
30
- * Orthogonal Replacement
31
- * [Noop](#neutral-noop-tests)
32
-
33
- An exhaustive list can be found in the [mutant-meta](https://github.com/mbj/mutant/tree/master/meta)
34
- subdirectory of the source.
35
-
36
- ## Mutation
37
-
38
- The result of applying a mutation operator to the AST of a subject. A mutation represents a
39
- hypothesis that ideally gets falsified by the tests.
40
-
41
- ## Insertion
42
-
43
- The process of inserting a mutation into the runtime environment.
44
- Mutant currently supports insertion via dynamically created monkeypatches.
45
-
46
- Other insertion strategies (such as "boot time") are possible but aren't implemented
47
- in the OSS version.
48
-
49
- ## Isolation
50
-
51
- The attempt to isolate the (side) effects of killing a mutation via an integration
52
- to prevent a mutation leaking into adjacent concurrent, or future mutations.
53
-
54
- Examples of sources for leaks are
55
-
56
- * Global variable writes
57
- * Thread local writes
58
- * DB State
59
- * File system
60
-
61
- Natively, mutant offers fork isolation. This works for any state within the executing
62
- Ruby process. For all state reachable via IO, it's the test author's responsibility to
63
- provide proper isolation.
64
-
65
- ## Integration
66
-
67
- The method used to determine if a specific inserted mutation is covered by tests.
68
-
69
- Currently mutant supports integrations for:
70
-
71
- * [mutant-rspec](/docs/mutant-rspec.md) for [rspec](https://rspec.info)
72
- * [mutant-minitest](/docs/mutant-minitest.md) for [minitest](https://github.com/seattlerb/minitest)
73
-
74
- ## Report
75
-
76
- Mutant currently provides two different reporters:
77
-
78
- * Progress (printed during mutation testing).
79
- * Summary (printed at the end of a finished analysis run)
80
-
81
- A reporter producing a machine readable report does not exist in the OSS version
82
- at the time of writing this documentation.
@@ -1,74 +0,0 @@
1
- Reading Reports
2
- ===============
3
-
4
- Mutation output is grouped by selection groups. Each group contains three sections:
5
-
6
- 1. An identifier for the current group.
7
-
8
- **Format**:
9
-
10
- ```text
11
- [SUBJECT EXPRESSION]:[SOURCE LOCATION]:[LINENO]
12
- ```
13
-
14
- **Example**:
15
-
16
- ```text
17
- Book#add_page:Book#add_page:/home/dev/mutant-examples/lib/book.rb:18
18
- ```
19
-
20
- 2. A list of specs that mutant ran to try to kill mutations for the current group.
21
-
22
- **Format**:
23
-
24
- ```text
25
- - [INTEGRATION]:0:[SPEC LOCATION]:[SPEC DESCRIPTION]
26
- - [INTEGRATION]:1:[SPEC LOCATION]:[SPEC DESCRIPTION]
27
- ```
28
-
29
- **Example**:
30
-
31
- ```text
32
- - rspec:0:./spec/unit/book_spec.rb:9/Book#add_page should return self
33
- - rspec:1:./spec/unit/book_spec.rb:13/Book#add_page should add page to book
34
- ```
35
-
36
- 3. A list of unkilled mutations diffed against the original unparsed source
37
-
38
- **Format**:
39
-
40
- ```text
41
- [MUTATION TYPE]:[SUBJECT EXPRESSION]:[SOURCE LOCATION]:[SOURCE LINENO]:[IDENTIFIER]
42
- [DIFF]
43
- -----------------------
44
- ```
45
-
46
- - `[MUTATION TYPE]` will be one of the following:
47
- - `evil` - a mutation of your source was not killed by your tests
48
- - `neutral` your original source was injected and one or more tests failed
49
- - `[IDENTIFIER]` - Unique identifier for this mutation
50
-
51
- **Example**:
52
-
53
- ```diff
54
- evil:Book#add_page:Book#add_page:/home/dev/mutant-examples/lib/book.rb:18:01f69
55
- @@ -1,6 +1,6 @@
56
- def add_page(page)
57
- - @pages << page
58
- + @pages
59
- @index[page.number] = page
60
- self
61
- end
62
- -----------------------
63
- evil:Book#add_page:Book#add_page:/home/dev/mutant-examples/lib/book.rb:18:b1ff2
64
- @@ -1,6 +1,6 @@
65
- def add_page(page)
66
- - @pages << page
67
- + self
68
- @index[page.number] = page
69
- self
70
- end
71
- -----------------------
72
- ```
73
-
74
- At this time no machine readable output exists in the opensourced versions of mutant.