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,305 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::CLI do
4
- let(:default_config) { Mutant::Config::DEFAULT }
5
- let(:kernel) { instance_double('kernel', exit: undefined) }
6
- let(:stderr) { instance_double(IO, 'stderr', puts: undefined) }
7
- let(:stdout) { instance_double(IO, 'stdout', puts: undefined) }
8
- let(:target_stream) { stdout }
9
-
10
- let(:world) do
11
- instance_double(
12
- Mutant::World,
13
- kernel: kernel,
14
- stderr: stderr,
15
- stdout: stdout
16
- )
17
- end
18
-
19
- shared_examples 'prints expected message' do
20
-
21
- it 'prints expected message' do
22
- apply
23
-
24
- expect(target_stream).to have_received(:puts).with(expected_message)
25
- end
26
- end
27
-
28
- before do
29
- allow(stderr).to receive_messages(puts: undefined)
30
- allow(stdout).to receive_messages(puts: undefined)
31
- end
32
-
33
- describe '.run' do
34
- def apply
35
- described_class.run(world, default_config, arguments)
36
- end
37
-
38
- let(:arguments) { instance_double(Array) }
39
- let(:cli_config) { instance_double(Mutant::Config, 'cli config') }
40
- let(:cli_result) { Mutant::Either::Right.new(cli_config) }
41
- let(:env) { instance_double(Mutant::Env) }
42
- let(:env_result) { Mutant::Either::Right.new(env) }
43
- let(:file_config) { instance_double(Mutant::Config, 'file config') }
44
- let(:file_result) { Mutant::Either::Right.new(file_config) }
45
- let(:license_result) { Mutant::Either::Right.new(true) }
46
- let(:report_success) { true }
47
-
48
- let(:runner_result) do
49
- Mutant::Either::Right.new(
50
- instance_double(Mutant::Result::Env, success?: report_success)
51
- )
52
- end
53
-
54
- before do
55
- allow(Mutant::License).to receive_messages(apply: license_result)
56
- allow(Mutant::Config).to receive_messages(load_config_file: file_result)
57
- allow(Mutant::CLI).to receive_messages(apply: cli_result)
58
- allow(Mutant::Bootstrap).to receive_messages(apply: env_result)
59
- allow(Mutant::Runner).to receive_messages(apply: runner_result)
60
- end
61
-
62
- it 'performs calls in expected sequence' do
63
- apply
64
-
65
- expect(Mutant::License)
66
- .to have_received(:apply)
67
- .with(world)
68
- .ordered
69
-
70
- expect(Mutant::Config)
71
- .to have_received(:load_config_file)
72
- .with(world, default_config)
73
- .ordered
74
-
75
- expect(Mutant::CLI)
76
- .to have_received(:apply)
77
- .with(world, file_config, arguments)
78
- .ordered
79
-
80
- expect(Mutant::Bootstrap)
81
- .to have_received(:apply)
82
- .with(world, cli_config)
83
- .ordered
84
-
85
- expect(Mutant::Runner)
86
- .to have_received(:apply)
87
- .with(env)
88
- .ordered
89
- end
90
-
91
- context 'when report signals success' do
92
- let(:report_success) { true }
93
-
94
- it 'exits failure' do
95
- expect(apply).to be(true)
96
- end
97
- end
98
-
99
- context 'when report signals error' do
100
- let(:report_success) { false }
101
-
102
- it 'exits failure' do
103
- expect(apply).to be(false)
104
- end
105
- end
106
-
107
- context 'when parts of the chain fail' do
108
- let(:cli_result) { Mutant::Either::Left.new(expected_message) }
109
- let(:expected_message) { 'cli-error' }
110
- let(:target_stream) { stderr }
111
-
112
- include_examples 'prints expected message'
113
-
114
- it 'exits failure' do
115
- expect(apply).to be(false)
116
- end
117
- end
118
- end
119
-
120
- describe '.apply' do
121
- def apply
122
- described_class.apply(world, default_config, arguments)
123
- end
124
-
125
- shared_examples 'invalid arguments' do
126
- it 'returns left error' do
127
- expect(apply).to eql(Mutant::Either::Left.new(expected_message))
128
- end
129
- end
130
-
131
- shared_examples 'explicit exit' do
132
- it 'prints explicitly exits' do
133
- apply
134
-
135
- expect(kernel).to have_received(:exit)
136
- end
137
- end
138
-
139
- shared_examples 'no explicit exit' do
140
- it 'does not exit' do
141
- expect(kernel).to_not have_received(:exit)
142
- end
143
- end
144
-
145
- shared_examples_for 'cli parser' do
146
- it { expect(apply.from_right.integration).to eql(expected_integration) }
147
- it { expect(apply.from_right.matcher).to eql(expected_matcher_config) }
148
- end
149
-
150
- before do
151
- allow(kernel).to receive_messages(exit: nil)
152
- end
153
-
154
- let(:arguments) { (options + expressions).freeze }
155
- let(:expected_integration) { 'null' }
156
- let(:expected_matcher_config) { default_matcher_config }
157
- let(:expressions) { %w[TestApp*] }
158
- let(:options) { [] }
159
-
160
- let(:default_matcher_config) do
161
- Mutant::Matcher::Config::DEFAULT
162
- .with(match_expressions: expressions.map(&method(:parse_expression)))
163
- end
164
-
165
- context 'with --invalid option' do
166
- let(:options) { %w[--invalid] }
167
- let(:expected_message) { 'invalid option: --invalid' }
168
-
169
- include_examples 'invalid arguments'
170
- include_examples 'no explicit exit'
171
- end
172
-
173
- context 'with --help option' do
174
- let(:options) { %w[--help] }
175
-
176
- let(:expected_message) do
177
- <<~MESSAGE
178
- usage: mutant [options] MATCH_EXPRESSION ...
179
- Environment:
180
- --zombie Run mutant zombified
181
- -I, --include DIRECTORY Add DIRECTORY to $LOAD_PATH
182
- -r, --require NAME Require file with NAME
183
- -j, --jobs NUMBER Number of kill jobs. Defaults to number of processors.
184
-
185
- Options:
186
- --use INTEGRATION Use INTEGRATION to kill mutations
187
- --ignore-subject EXPRESSION Ignore subjects that match EXPRESSION as prefix
188
- --since REVISION Only select subjects touched since REVISION
189
- --fail-fast Fail fast
190
- --version Print mutants version
191
- -h, --help Show this message
192
- MESSAGE
193
- end
194
-
195
- include_examples 'cli parser'
196
- include_examples 'explicit exit'
197
- include_examples 'prints expected message'
198
- end
199
-
200
- context 'with --include option' do
201
- let(:options) { %w[--include foo] }
202
-
203
- include_examples 'cli parser'
204
- include_examples 'no explicit exit'
205
-
206
- it 'configures includes' do
207
- expect(apply.from_right.includes).to eql(%w[foo])
208
- end
209
- end
210
-
211
- context 'with --use option' do
212
- context 'when integration exists' do
213
- let(:expected_integration) { 'some' }
214
- let(:options) { %w[--use some] }
215
-
216
- include_examples 'cli parser'
217
- include_examples 'no explicit exit'
218
- end
219
- end
220
-
221
- context 'with --version option' do
222
- let(:expected_message) { "mutant-#{Mutant::VERSION}" }
223
- let(:options) { %w[--version] }
224
-
225
- include_examples 'cli parser'
226
- include_examples 'explicit exit'
227
- include_examples 'prints expected message'
228
- end
229
-
230
- context 'with --jobs option' do
231
- let(:options) { %w[--jobs 0] }
232
-
233
- include_examples 'cli parser'
234
- include_examples 'no explicit exit'
235
-
236
- it 'configures expected coverage' do
237
- expect(apply.from_right.jobs).to eql(0)
238
- end
239
- end
240
-
241
- context 'with --require options' do
242
- let(:options) { %w[--require foo --require bar] }
243
-
244
- include_examples 'cli parser'
245
- include_examples 'no explicit exit'
246
-
247
- it 'configures requires' do
248
- expect(apply.from_right.requires).to eql(%w[foo bar])
249
- end
250
- end
251
-
252
- context 'with --since option' do
253
- let(:options) { %w[--since master] }
254
-
255
- let(:expected_matcher_config) do
256
- default_matcher_config.with(
257
- subject_filters: [
258
- Mutant::Repository::SubjectFilter.new(
259
- Mutant::Repository::Diff.new(
260
- to: 'master',
261
- world: world
262
- )
263
- )
264
- ]
265
- )
266
- end
267
-
268
- include_examples 'cli parser'
269
- include_examples 'no explicit exit'
270
- end
271
-
272
- context 'with --subject-ignore option' do
273
- let(:options) { %w[--ignore-subject Foo::Bar] }
274
-
275
- let(:expected_matcher_config) do
276
- default_matcher_config.with(ignore_expressions: [parse_expression('Foo::Bar')])
277
- end
278
-
279
- include_examples 'cli parser'
280
- include_examples 'no explicit exit'
281
- end
282
-
283
- context 'with --fail-fast option' do
284
- let(:options) { %w[--fail-fast] }
285
-
286
- include_examples 'cli parser'
287
- include_examples 'no explicit exit'
288
-
289
- it 'sets the fail fast option' do
290
- expect(apply.from_right.fail_fast).to be(true)
291
- end
292
- end
293
-
294
- context 'with --zombie option' do
295
- let(:options) { %w[--zombie] }
296
-
297
- include_examples 'cli parser'
298
- include_examples 'no explicit exit'
299
-
300
- it 'sets the zombie option' do
301
- expect(apply.from_right.zombie).to be(true)
302
- end
303
- end
304
- end
305
- end
@@ -1,52 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Timer do
4
- let(:events) { [] }
5
-
6
- let(:times) { [1.0, 2.0] }
7
-
8
- before do
9
- allow(Process).to receive(:clock_gettime) do |argument|
10
- expect(argument).to be(Process::CLOCK_MONOTONIC)
11
-
12
- events << :clock_gettime
13
-
14
- times.fetch(events.count(:clock_gettime).pred)
15
- end
16
- end
17
-
18
- describe '.elapsed' do
19
- def apply
20
- described_class.elapsed { events << :yield }
21
- end
22
-
23
- it 'executes events in expected sequence' do
24
- expect { apply }
25
- .to change(events, :to_a)
26
- .from([])
27
- .to(%i[clock_gettime yield clock_gettime])
28
- end
29
-
30
- it 'returns elapsed time' do
31
- expect(apply).to be(1.0)
32
- end
33
- end
34
-
35
- describe '.now' do
36
- def apply
37
- described_class.now
38
- end
39
-
40
- it 'returns current monotonic time' do
41
- expect(apply).to be(1.0)
42
- expect(apply).to be(2.0)
43
- end
44
-
45
- it 'calls expected system API' do
46
- expect { apply }
47
- .to change(events, :to_a)
48
- .from([])
49
- .to(%i[clock_gettime])
50
- end
51
- end
52
- end
@@ -1,126 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Config do
4
- describe '.load_config_file' do
5
- def apply
6
- described_class.load_config_file(world, config)
7
- end
8
-
9
- let(:config) { Mutant::Config::DEFAULT }
10
- let(:world) { instance_double(Mutant::World, pathname: pathname) }
11
-
12
- let(:pathname) do
13
- paths = paths()
14
- Class.new do
15
- define_singleton_method(:new, &paths.method(:fetch))
16
- end
17
- end
18
-
19
- let(:config_mutant_yml) do
20
- instance_double(Pathname, 'config/mutant.yml', readable?: false)
21
- end
22
-
23
- let(:dot_mutant_yml) do
24
- instance_double(Pathname, '.mutant.yml', readable?: false)
25
- end
26
-
27
- let(:mutant_yml) do
28
- instance_double(Pathname, 'mutant.yml', readable?: false)
29
- end
30
-
31
- let(:paths) do
32
- {
33
- '.mutant.yml' => dot_mutant_yml,
34
- 'config/mutant.yml' => config_mutant_yml,
35
- 'mutant.yml' => mutant_yml
36
- }
37
- end
38
-
39
- before do
40
- allow(Pathname).to receive(:new, &paths.method(:fetch))
41
- end
42
-
43
- context 'when no path is readable' do
44
- it 'returns original config' do
45
- expect(apply).to eql(Mutant::Either::Right.new(config))
46
- end
47
- end
48
-
49
- context 'when more than one path is readable' do
50
- before do
51
- [config_mutant_yml, mutant_yml].each do |path|
52
- allow(path).to receive_messages(readable?: true)
53
- end
54
- end
55
-
56
- let(:expected_message) do
57
- <<~MESSAGE
58
- Found more than one candidate for use as implicit config file: #{config_mutant_yml}, #{mutant_yml}
59
- MESSAGE
60
- end
61
-
62
- it 'returns expected failure' do
63
- expect(apply).to eql(Mutant::Either::Left.new(expected_message))
64
- end
65
- end
66
-
67
- context 'with one readable path' do
68
- let(:path_contents) do
69
- <<~'YAML'
70
- ---
71
- integration: rspec
72
- YAML
73
- end
74
-
75
- before do
76
- allow(mutant_yml).to receive_messages(
77
- read: path_contents,
78
- readable?: true,
79
- to_s: 'mutant.yml'
80
- )
81
- end
82
-
83
- context 'when file can be read' do
84
- context 'when yaml contents can be transformed' do
85
- it 'returns expected config' do
86
- expect(apply)
87
- .to eql(Mutant::Either::Right.new(config.with(integration: 'rspec')))
88
- end
89
- end
90
-
91
- context 'when yaml contents cannot be transformed' do
92
- let(:path_contents) do
93
- <<~'YAML'
94
- ---
95
- integration: true
96
- YAML
97
- end
98
-
99
- # rubocop:disable Metrics/LineLength
100
- let(:expected_message) do
101
- 'mutant.yml/Mutant::Transform::Sequence/2/Mutant::Transform::Hash/["integration"]/String: Expected: String but got: TrueClass'
102
- end
103
- # rubocop:enable Metrics/LineLength
104
-
105
- it 'returns expected error' do
106
- expect(apply) .to eql(Mutant::Either::Left.new(expected_message))
107
- end
108
- end
109
- end
110
-
111
- context 'when file cannot be read' do
112
- before do
113
- allow(mutant_yml).to receive(:read).and_raise(SystemCallError, 'some error')
114
- end
115
-
116
- let(:expected_message) do
117
- 'mutant.yml/Mutant::Transform::Sequence/0/Mutant::Transform::Exception: unknown error - some error'
118
- end
119
-
120
- it 'returns expected error' do
121
- expect(apply) .to eql(Mutant::Either::Left.new(expected_message))
122
- end
123
- end
124
- end
125
- end
126
- end