mutant 0.9.7 → 0.9.12

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 (336) 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 +0 -36
  7. data/lib/mutant/cli.rb +5 -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 +0 -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 -74
  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/registry.rb +2 -7
  97. data/lib/mutant/reporter/cli.rb +0 -5
  98. data/lib/mutant/reporter/cli/format.rb +0 -9
  99. data/lib/mutant/reporter/cli/printer.rb +2 -42
  100. data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -15
  101. data/lib/mutant/reporter/cli/printer/isolation_result.rb +0 -18
  102. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -5
  103. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -22
  104. data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -8
  105. data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -9
  106. data/lib/mutant/repository/diff.rb +1 -13
  107. data/lib/mutant/repository/diff/ranges.rb +0 -11
  108. data/lib/mutant/result.rb +0 -3
  109. data/lib/mutant/runner.rb +0 -18
  110. data/lib/mutant/runner/sink.rb +0 -5
  111. data/lib/mutant/subject.rb +0 -8
  112. data/lib/mutant/subject/method.rb +0 -3
  113. data/lib/mutant/subject/method/instance.rb +40 -6
  114. data/lib/mutant/subject/method/metaclass.rb +30 -0
  115. data/lib/mutant/transform.rb +0 -92
  116. data/lib/mutant/version.rb +1 -1
  117. data/lib/mutant/warnings.rb +0 -6
  118. data/lib/mutant/zombifier.rb +2 -34
  119. metadata +61 -333
  120. data/.circleci/config.yml +0 -53
  121. data/.gitignore +0 -38
  122. data/.rspec +0 -5
  123. data/.rubocop.yml +0 -7
  124. data/Changelog.md +0 -71
  125. data/Gemfile +0 -14
  126. data/Gemfile.lock +0 -167
  127. data/Gemfile.shared +0 -3
  128. data/README.md +0 -138
  129. data/Rakefile +0 -5
  130. data/config/devtools.yml +0 -2
  131. data/config/reek.yml +0 -138
  132. data/config/rubocop.yml +0 -205
  133. data/config/yardstick.yml +0 -2
  134. data/docs/commercial-support.md +0 -14
  135. data/docs/concurrency.md +0 -39
  136. data/docs/incremental.md +0 -76
  137. data/docs/known-problems.md +0 -30
  138. data/docs/limitations.md +0 -50
  139. data/docs/mutant-minitest.md +0 -149
  140. data/docs/mutant-rspec.md +0 -130
  141. data/docs/nomenclature.md +0 -82
  142. data/docs/reading-reports.md +0 -74
  143. data/lib/mutant/color.rb +0 -43
  144. data/lib/mutant/diff.rb +0 -114
  145. data/meta/and.rb +0 -15
  146. data/meta/and_asgn.rb +0 -14
  147. data/meta/array.rb +0 -30
  148. data/meta/begin.rb +0 -23
  149. data/meta/block.rb +0 -202
  150. data/meta/block_pass.rb +0 -8
  151. data/meta/blockarg.rb +0 -10
  152. data/meta/break.rb +0 -10
  153. data/meta/case.rb +0 -223
  154. data/meta/casgn.rb +0 -28
  155. data/meta/cbase.rb +0 -8
  156. data/meta/class.rb +0 -12
  157. data/meta/const.rb +0 -17
  158. data/meta/csend.rb +0 -10
  159. data/meta/cvar.rb +0 -7
  160. data/meta/cvasgn.rb +0 -10
  161. data/meta/date.rb +0 -59
  162. data/meta/def.rb +0 -203
  163. data/meta/defined.rb +0 -9
  164. data/meta/dstr.rb +0 -13
  165. data/meta/dsym.rb +0 -14
  166. data/meta/ensure.rb +0 -9
  167. data/meta/false.rb +0 -8
  168. data/meta/file.rb +0 -5
  169. data/meta/float.rb +0 -37
  170. data/meta/gvar.rb +0 -7
  171. data/meta/gvasgn.rb +0 -10
  172. data/meta/hash.rb +0 -24
  173. data/meta/if.rb +0 -77
  174. data/meta/index.rb +0 -133
  175. data/meta/indexasgn.rb +0 -31
  176. data/meta/int.rb +0 -18
  177. data/meta/ivar.rb +0 -8
  178. data/meta/ivasgn.rb +0 -23
  179. data/meta/kwarg.rb +0 -10
  180. data/meta/kwbegin.rb +0 -9
  181. data/meta/kwoptarg.rb +0 -13
  182. data/meta/lambda.rb +0 -23
  183. data/meta/line.rb +0 -5
  184. data/meta/lvar.rb +0 -16
  185. data/meta/lvasgn.rb +0 -25
  186. data/meta/masgn.rb +0 -7
  187. data/meta/match_current_line.rb +0 -15
  188. data/meta/next.rb +0 -11
  189. data/meta/nil.rb +0 -5
  190. data/meta/nthref.rb +0 -14
  191. data/meta/op_assgn.rb +0 -17
  192. data/meta/or.rb +0 -15
  193. data/meta/or_asgn.rb +0 -50
  194. data/meta/range.rb +0 -39
  195. data/meta/redo.rb +0 -5
  196. data/meta/regexp.rb +0 -81
  197. data/meta/regopt.rb +0 -10
  198. data/meta/rescue.rb +0 -90
  199. data/meta/return.rb +0 -16
  200. data/meta/self.rb +0 -7
  201. data/meta/send.rb +0 -604
  202. data/meta/str.rb +0 -7
  203. data/meta/super.rb +0 -27
  204. data/meta/sym.rb +0 -8
  205. data/meta/true.rb +0 -8
  206. data/meta/until.rb +0 -17
  207. data/meta/while.rb +0 -26
  208. data/meta/yield.rb +0 -10
  209. data/mutant-minitest.gemspec +0 -22
  210. data/mutant-rspec.gemspec +0 -22
  211. data/mutant.gemspec +0 -41
  212. data/mutant.yml +0 -6
  213. data/spec/integration/mutant/corpus_spec.rb +0 -15
  214. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  215. data/spec/integration/mutant/minitest_spec.rb +0 -11
  216. data/spec/integration/mutant/null_spec.rb +0 -16
  217. data/spec/integration/mutant/rspec_spec.rb +0 -15
  218. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  219. data/spec/integrations.yml +0 -63
  220. data/spec/shared/base_behavior.rb +0 -45
  221. data/spec/shared/framework_integration_behavior.rb +0 -70
  222. data/spec/shared/method_matcher_behavior.rb +0 -47
  223. data/spec/spec_helper.rb +0 -75
  224. data/spec/support/corpus.rb +0 -318
  225. data/spec/support/file_system.rb +0 -62
  226. data/spec/support/ice_nine_config.rb +0 -10
  227. data/spec/support/ruby_vm.rb +0 -84
  228. data/spec/support/shared_context.rb +0 -169
  229. data/spec/support/test_app.rb +0 -7
  230. data/spec/support/warnings.yml +0 -6
  231. data/spec/support/xspec.rb +0 -183
  232. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  233. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  234. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  235. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  236. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  237. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  238. data/spec/unit/mutant/ast_spec.rb +0 -57
  239. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  240. data/spec/unit/mutant/cli_spec.rb +0 -305
  241. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  242. data/spec/unit/mutant/config_spec.rb +0 -126
  243. data/spec/unit/mutant/context_spec.rb +0 -111
  244. data/spec/unit/mutant/diff_spec.rb +0 -189
  245. data/spec/unit/mutant/env_spec.rb +0 -229
  246. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  247. data/spec/unit/mutant/expression/methods_spec.rb +0 -61
  248. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  249. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  250. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  251. data/spec/unit/mutant/expression_spec.rb +0 -45
  252. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  253. data/spec/unit/mutant/integration_spec.rb +0 -150
  254. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  255. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  256. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  257. data/spec/unit/mutant/license_spec.rb +0 -293
  258. data/spec/unit/mutant/loader_spec.rb +0 -79
  259. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  260. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  261. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  262. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  263. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  264. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  265. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  266. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  267. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -37
  268. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  269. data/spec/unit/mutant/matcher/scope_spec.rb +0 -35
  270. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  271. data/spec/unit/mutant/matcher_spec.rb +0 -102
  272. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  273. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  274. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  275. data/spec/unit/mutant/mutation_spec.rb +0 -140
  276. data/spec/unit/mutant/mutator/node_spec.rb +0 -52
  277. data/spec/unit/mutant/mutator_spec.rb +0 -21
  278. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  279. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  280. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  281. data/spec/unit/mutant/parallel_spec.rb +0 -115
  282. data/spec/unit/mutant/parser_spec.rb +0 -26
  283. data/spec/unit/mutant/range_spec.rb +0 -141
  284. data/spec/unit/mutant/registry_spec.rb +0 -47
  285. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  286. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  287. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  288. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  289. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  290. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  291. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  292. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  293. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  294. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  295. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  296. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  297. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  298. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  299. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  300. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  301. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  302. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  303. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  304. data/spec/unit/mutant/result/env_spec.rb +0 -161
  305. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  306. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  307. data/spec/unit/mutant/result/test_spec.rb +0 -14
  308. data/spec/unit/mutant/result_spec.rb +0 -33
  309. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  310. data/spec/unit/mutant/runner_spec.rb +0 -121
  311. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  312. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  313. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  314. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  315. data/spec/unit/mutant/subject_spec.rb +0 -93
  316. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  317. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  318. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  319. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  320. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  321. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  322. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  323. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  324. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  325. data/spec/unit/mutant/util/one_spec.rb +0 -22
  326. data/spec/unit/mutant/warnings_spec.rb +0 -89
  327. data/spec/unit/mutant/world_spec.rb +0 -63
  328. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  329. data/test_app/.rspec +0 -1
  330. data/test_app/Gemfile.minitest +0 -4
  331. data/test_app/Gemfile.rspec3.8 +0 -7
  332. data/test_app/lib/test_app.rb +0 -109
  333. data/test_app/lib/test_app/literal.rb +0 -35
  334. data/test_app/spec/spec_helper.rb +0 -9
  335. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  336. 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