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,122 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Mutant::Repository::Diff do
4
- describe '#touches?' do
5
- def apply
6
- subject.touches?(path, line_range)
7
- end
8
-
9
- subject { described_class.new(world: world, to: 'to_rev') }
10
-
11
- let(:pathname) { class_double(Pathname, pwd: pwd) }
12
- let(:open3) { class_double(Open3) }
13
- let(:kernel) { class_double(Kernel) }
14
- let(:pwd) { Pathname.new('/foo') }
15
- let(:path) { Pathname.new('/foo/bar.rb') }
16
- let(:line_range) { 4..5 }
17
-
18
- let(:world) do
19
- instance_double(
20
- Mutant::World,
21
- kernel: kernel,
22
- pathname: pathname
23
- )
24
- end
25
-
26
- let(:allowed_paths) do
27
- %w[bar.rb baz.rb].map do |path|
28
- [path, Pathname.new(path)]
29
- end.to_h
30
- end
31
-
32
- let(:file_diff_expectations) { [] }
33
-
34
- let(:raw_expectations) do
35
- [
36
- {
37
- receiver: world,
38
- selector: :capture_stdout,
39
- arguments: [%w[git diff-index to_rev]],
40
- reaction: { return: Mutant::Either::Right.new(index_stdout) }
41
- },
42
- *file_diff_expectations
43
- ]
44
- end
45
-
46
- before do
47
- allow(pathname).to receive(:new, &allowed_paths.method(:fetch))
48
- end
49
-
50
- context 'when file is not touched in the diff' do
51
- let(:index_stdout) { '' }
52
-
53
- it 'returns false' do
54
- verify_events { expect(apply).to be(false) }
55
- end
56
- end
57
-
58
- context 'when a diff-index line is invalid' do
59
- let(:index_stdout) { 'invalid-line' }
60
-
61
- it 'raises error' do
62
- expect { verify_events { apply } }
63
- .to raise_error(
64
- described_class::Error,
65
- 'Invalid git diff-index line: invalid-line'
66
- )
67
- end
68
- end
69
-
70
- context 'when file is touched in the diff' do
71
- let(:index_stdout) do
72
- <<~STR
73
- :000000 000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 M\tbar.rb
74
- :000000 000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 M\tbaz.rb
75
- STR
76
- end
77
-
78
- let(:file_diff_expectations) do
79
- [
80
- {
81
- receiver: world,
82
- selector: :capture_stdout,
83
- arguments: [%w[git diff --unified=0 to_rev -- /foo/bar.rb]],
84
- reaction: { return: Mutant::Either::Right.new(diff_stdout) }
85
- }
86
- ]
87
- end
88
-
89
- context 'and diff touches the line range' do
90
- let(:diff_stdout) do
91
- <<~'DIFF'
92
- --- bar.rb
93
- +++ bar.rb
94
- @@ -4 +4 @@ header
95
- -a
96
- +b
97
- DIFF
98
- end
99
-
100
- it 'returns true' do
101
- verify_events { expect(apply).to be(true) }
102
- end
103
- end
104
-
105
- context 'and diff does not touch the line range' do
106
- let(:diff_stdout) do
107
- <<~'DIFF'
108
- --- bar.rb
109
- +++ bar.rb
110
- @@ -3 +3 @@ header
111
- -a
112
- +b
113
- DIFF
114
- end
115
-
116
- it 'returns false' do
117
- verify_events { expect(apply).to be(false) }
118
- end
119
- end
120
- end
121
- end
122
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Repository::SubjectFilter do
4
- context '#call' do
5
- subject { object.call(mutant_subject) }
6
-
7
- let(:object) { described_class.new(diff) }
8
- let(:diff) { instance_double(Mutant::Repository::Diff) }
9
- let(:value) { instance_double(Object, 'value') }
10
-
11
- let(:mutant_subject) do
12
- double(
13
- 'Subject',
14
- source_path: double('source path'),
15
- source_lines: double('source lines')
16
- )
17
- end
18
-
19
- before do
20
- expect(diff).to receive(:touches?).with(
21
- mutant_subject.source_path,
22
- mutant_subject.source_lines
23
- ).and_return(value)
24
- end
25
-
26
- it 'connects return value to repository diff API' do
27
- expect(subject).to be(value)
28
- end
29
- end
30
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::RequireHighjack do
4
- let(:highjacked_calls) { [] }
5
- let(:require_calls) { [] }
6
-
7
- let(:target_module) do
8
- acc = require_calls
9
- Module.new do
10
- define_method(:require, &acc.method(:<<))
11
- define_singleton_method(:require, &acc.method(:<<))
12
- end
13
- end
14
-
15
- def singleton_require(logical_name)
16
- target_module.require(logical_name)
17
- end
18
-
19
- def instance_require(logical_name)
20
- Object.new.extend(target_module).require(logical_name)
21
- end
22
-
23
- describe '.call' do
24
- let(:logical_name) { instance_double(String) }
25
-
26
- def apply
27
- described_class.call(target_module, highjacked_calls.method(:<<))
28
- end
29
-
30
- it 'prevents warnings' do
31
- expect(Mutant::WORLD.warnings.call(&method(:apply))).to eql([])
32
- end
33
-
34
- it 'returns the original implementation from singleton' do
35
- expect { apply.call(logical_name) }
36
- .to change { require_calls }
37
- .from([])
38
- .to([logical_name])
39
- end
40
-
41
- context '#require' do
42
- it 'does highjack calls' do
43
- apply
44
- expect { instance_require(logical_name) }
45
- .to change { highjacked_calls }
46
- .from([])
47
- .to([logical_name])
48
- end
49
-
50
- it 'does not call original require' do
51
- apply
52
- expect { instance_require(logical_name) }
53
- .not_to change { require_calls }.from([])
54
- end
55
- end
56
-
57
- context '.require' do
58
- it 'does highjack calls' do
59
- apply
60
- expect { singleton_require(logical_name) }
61
- .to change { highjacked_calls }
62
- .from([])
63
- .to([logical_name])
64
- end
65
-
66
- it 'does not call original require' do
67
- apply
68
- expect { singleton_require(logical_name) }
69
- .not_to change { require_calls }.from([])
70
- end
71
- end
72
- end
73
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The effect of this private module is done at boot time.
4
- # Hence there is no way to kill the mutations at runtime
5
- # so we have to directly hook into the private moduel via
6
- # reflection to redo a runtime observable interaction with
7
- # it.
8
- #
9
- # Until mutant gets boot time mutation support there is no
10
- # way to to avoid this.
11
- RSpec.describe 'Mutant::Result::ClassMethods' do
12
- let(:infected_class) do
13
- Class.new do
14
- include Adamantium::Flat, Concord::Public.new(:collection)
15
- extend Mutant::Result.const_get(:ClassMethods)
16
-
17
- sum :length, :collection
18
- end
19
- end
20
-
21
- describe '#sum' do
22
- let(:object) { infected_class.new(collection) }
23
-
24
- def apply
25
- object.length
26
- end
27
-
28
- subject { apply }
29
-
30
- before do
31
- # memoization behavior
32
- expect(collection).to receive(:map)
33
- .once
34
- .and_call_original
35
-
36
- apply
37
- end
38
-
39
- context 'empty collection' do
40
- let(:collection) { [] }
41
-
42
- it { should be(0) }
43
- end
44
-
45
- context 'non-emtpy collection' do
46
- let(:collection) { [[1], [2, 3]] }
47
-
48
- it { should be(3) }
49
- end
50
- end
51
- end
@@ -1,161 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Result::Env do
4
- let(:object) do
5
- described_class.new(
6
- runtime: instance_double(Float),
7
- env: env,
8
- subject_results: subject_results
9
- )
10
- end
11
-
12
- let(:subject_results) { [subject_result] }
13
-
14
- let(:env) do
15
- instance_double(
16
- Mutant::Env,
17
- config: instance_double(Mutant::Config, fail_fast: fail_fast),
18
- integration: integration,
19
- mutations: [instance_double(Mutant::Mutation)],
20
- selections: selections,
21
- subjects: [subject_a, subject_b]
22
- )
23
- end
24
-
25
- let(:integration) do
26
- instance_double(
27
- Mutant::Integration,
28
- all_tests: [test_a, test_b]
29
- )
30
- end
31
-
32
- let(:subject_result) do
33
- instance_double(
34
- Mutant::Result::Subject,
35
- amount_mutation_results: results,
36
- amount_mutations_killed: killed,
37
- success?: subject_success?
38
- )
39
- end
40
-
41
- let(:selections) do
42
- {
43
- subject_a: [test_a],
44
- subject_b: [test_a, test_b, test_c]
45
- }
46
- end
47
-
48
- let(:subject_a) do
49
- instance_double(Mutant::Subject, :a)
50
- end
51
-
52
- let(:subject_b) do
53
- instance_double(Mutant::Subject, :b)
54
- end
55
-
56
- let(:test_a) do
57
- instance_double(Mutant::Test, :a)
58
- end
59
-
60
- let(:test_b) do
61
- instance_double(Mutant::Test, :b)
62
- end
63
-
64
- let(:test_c) do
65
- instance_double(Mutant::Test, :c)
66
- end
67
-
68
- let(:fail_fast) { false }
69
- let(:killed) { 0 }
70
- let(:results) { 1 }
71
- let(:subject_success?) { true }
72
-
73
- describe '#success?' do
74
- subject { object.success? }
75
-
76
- context 'when coverage matches expectation' do
77
- let(:killed) { 1 }
78
-
79
- it { should be(true) }
80
- end
81
-
82
- context 'when coverage does not match expectation' do
83
- it { should be(false) }
84
- end
85
- end
86
-
87
- describe '#failed_subject_results' do
88
- subject { object.failed_subject_results }
89
-
90
- it { should eql([]) }
91
- end
92
-
93
- describe '#coverage' do
94
- subject { object.coverage }
95
-
96
- context 'when there are no results' do
97
- let(:results) { 0 }
98
-
99
- it { should eql(Rational(1)) }
100
- end
101
-
102
- context 'when there are no kills' do
103
- it { should eql(Rational(0)) }
104
- end
105
-
106
- context 'when there are kills' do
107
- let(:killed) { 1 }
108
- let(:results) { 2 }
109
-
110
- it { should eql(Rational(1, 2)) }
111
- end
112
- end
113
-
114
- describe '#amount_mutations' do
115
- subject { object.amount_mutations }
116
-
117
- it { should eql(1) }
118
- end
119
-
120
- describe '#stop?' do
121
- subject { object.stop? }
122
-
123
- context 'without fail fast' do
124
- context 'on empty subjects' do
125
- let(:subject_results) { [] }
126
-
127
- it { should be(false) }
128
- end
129
-
130
- context 'on failed subject' do
131
- let(:subject_success?) { false }
132
-
133
- it { should be(false) }
134
- end
135
-
136
- context 'on successful subject' do
137
- it { should be(false) }
138
- end
139
- end
140
-
141
- context 'with fail fast' do
142
- let(:fail_fast) { true }
143
-
144
- context 'on empty subjects' do
145
- let(:subject_results) { [] }
146
-
147
- it { should be(false) }
148
- end
149
-
150
- context 'on failed subject' do
151
- let(:subject_success?) { false }
152
-
153
- it { should be(true) }
154
- end
155
-
156
- context 'on successful subject' do
157
- it { should be(false) }
158
- end
159
- end
160
- end
161
- end
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Result::Mutation do
4
- let(:object) do
5
- described_class.new(
6
- isolation_result: isolation_result,
7
- mutation: mutation,
8
- runtime: 2.0
9
- )
10
- end
11
-
12
- let(:mutation) { instance_double(Mutant::Mutation) }
13
-
14
- let(:test_result) do
15
- instance_double(
16
- Mutant::Result::Test,
17
- runtime: 1.0
18
- )
19
- end
20
-
21
- let(:isolation_result) do
22
- Mutant::Isolation::Result::Success.new(test_result)
23
- end
24
-
25
- shared_examples_for 'unsuccessful isolation' do
26
- let(:isolation_result) do
27
- Mutant::Isolation::Result::Exception.new(RuntimeError.new('foo'))
28
- end
29
- end
30
-
31
- describe '#killtime' do
32
- subject { object.killtime }
33
-
34
- context 'if isolation is successful' do
35
- it { should eql(1.0) }
36
- end
37
-
38
- context 'if isolation is not successful' do
39
- include_context 'unsuccessful isolation'
40
-
41
- it { should eql(0.0) }
42
- end
43
- end
44
-
45
- describe '#runtime' do
46
- subject { object.runtime }
47
-
48
- it { should eql(2.0) }
49
- end
50
-
51
- describe '#success?' do
52
- subject { object.success? }
53
-
54
- context 'if isolation is successful' do
55
- before do
56
- expect(mutation.class).to receive(:success?)
57
- .with(test_result)
58
- .and_return(true)
59
- end
60
-
61
- it { should be(true) }
62
- end
63
-
64
- context 'if isolation is not successful' do
65
- include_context 'unsuccessful isolation'
66
-
67
- it { should be(false) }
68
- end
69
- end
70
- end