mutant 0.9.10 → 0.10.0

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 (254) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mutant +16 -11
  3. data/lib/mutant.rb +8 -4
  4. data/lib/mutant/bootstrap.rb +14 -1
  5. data/lib/mutant/cli.rb +9 -162
  6. data/lib/mutant/cli/command.rb +196 -0
  7. data/lib/mutant/cli/command/root.rb +13 -0
  8. data/lib/mutant/cli/command/run.rb +151 -0
  9. data/lib/mutant/cli/command/subscription.rb +54 -0
  10. data/lib/mutant/expression.rb +0 -1
  11. data/lib/mutant/isolation.rb +1 -1
  12. data/lib/mutant/isolation/fork.rb +2 -2
  13. data/lib/mutant/isolation/none.rb +1 -1
  14. data/lib/mutant/license.rb +9 -35
  15. data/lib/mutant/license/subscription.rb +31 -9
  16. data/lib/mutant/license/subscription/commercial.rb +2 -4
  17. data/lib/mutant/license/subscription/opensource.rb +7 -7
  18. data/lib/mutant/matcher/config.rb +2 -0
  19. data/lib/mutant/meta/example.rb +16 -4
  20. data/lib/mutant/meta/example/dsl.rb +33 -16
  21. data/lib/mutant/meta/example/verification.rb +70 -28
  22. data/lib/mutant/minitest/coverage.rb +53 -0
  23. data/lib/mutant/mutator/node.rb +2 -2
  24. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  25. data/lib/mutant/mutator/node/{dstr.rb → dynamic_literal.rb} +7 -5
  26. data/lib/mutant/mutator/node/index.rb +4 -4
  27. data/lib/mutant/mutator/node/literal/range.rb +5 -2
  28. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +1 -1
  29. data/lib/mutant/mutator/node/noop.rb +1 -1
  30. data/lib/mutant/mutator/node/op_asgn.rb +15 -1
  31. data/lib/mutant/mutator/node/send.rb +25 -1
  32. data/lib/mutant/mutator/node/send/attribute_assignment.rb +1 -0
  33. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -3
  34. data/lib/mutant/subject/method/instance.rb +1 -1
  35. data/lib/mutant/version.rb +1 -1
  36. metadata +18 -336
  37. data/.github/workflows/ci.yml +0 -121
  38. data/.gitignore +0 -38
  39. data/.rspec +0 -5
  40. data/.rubocop.yml +0 -210
  41. data/Changelog.md +0 -87
  42. data/Gemfile +0 -7
  43. data/Gemfile.lock +0 -107
  44. data/Gemfile.shared +0 -10
  45. data/README.md +0 -199
  46. data/Rakefile +0 -5
  47. data/config/devtools.yml +0 -2
  48. data/config/reek.yml +0 -139
  49. data/config/yardstick.yml +0 -2
  50. data/docs/commercial-support.md +0 -14
  51. data/docs/concurrency.md +0 -39
  52. data/docs/incremental.md +0 -76
  53. data/docs/known-problems.md +0 -30
  54. data/docs/limitations.md +0 -50
  55. data/docs/mutant-minitest.md +0 -149
  56. data/docs/mutant-rspec.md +0 -130
  57. data/docs/nomenclature.md +0 -82
  58. data/docs/reading-reports.md +0 -74
  59. data/lib/mutant/mutator/node/dsym.rb +0 -22
  60. data/meta/and.rb +0 -13
  61. data/meta/and_asgn.rb +0 -14
  62. data/meta/array.rb +0 -27
  63. data/meta/begin.rb +0 -20
  64. data/meta/block.rb +0 -199
  65. data/meta/block_pass.rb +0 -8
  66. data/meta/blockarg.rb +0 -10
  67. data/meta/break.rb +0 -9
  68. data/meta/case.rb +0 -217
  69. data/meta/casgn.rb +0 -25
  70. data/meta/cbase.rb +0 -8
  71. data/meta/class.rb +0 -12
  72. data/meta/const.rb +0 -17
  73. data/meta/csend.rb +0 -10
  74. data/meta/cvar.rb +0 -7
  75. data/meta/cvasgn.rb +0 -9
  76. data/meta/date.rb +0 -59
  77. data/meta/def.rb +0 -196
  78. data/meta/defined.rb +0 -9
  79. data/meta/dstr.rb +0 -13
  80. data/meta/dsym.rb +0 -14
  81. data/meta/ensure.rb +0 -8
  82. data/meta/false.rb +0 -7
  83. data/meta/file.rb +0 -5
  84. data/meta/float.rb +0 -37
  85. data/meta/gvar.rb +0 -7
  86. data/meta/gvasgn.rb +0 -9
  87. data/meta/hash.rb +0 -20
  88. data/meta/if.rb +0 -72
  89. data/meta/index.rb +0 -133
  90. data/meta/indexasgn.rb +0 -31
  91. data/meta/int.rb +0 -18
  92. data/meta/ivar.rb +0 -8
  93. data/meta/ivasgn.rb +0 -22
  94. data/meta/kwarg.rb +0 -10
  95. data/meta/kwbegin.rb +0 -8
  96. data/meta/kwoptarg.rb +0 -13
  97. data/meta/lambda.rb +0 -23
  98. data/meta/line.rb +0 -5
  99. data/meta/lvar.rb +0 -16
  100. data/meta/lvasgn.rb +0 -24
  101. data/meta/masgn.rb +0 -7
  102. data/meta/match_current_line.rb +0 -14
  103. data/meta/next.rb +0 -10
  104. data/meta/nil.rb +0 -5
  105. data/meta/nthref.rb +0 -14
  106. data/meta/op_assgn.rb +0 -17
  107. data/meta/or.rb +0 -13
  108. data/meta/or_asgn.rb +0 -50
  109. data/meta/range.rb +0 -65
  110. data/meta/redo.rb +0 -5
  111. data/meta/regexp.rb +0 -80
  112. data/meta/regopt.rb +0 -10
  113. data/meta/rescue.rb +0 -84
  114. data/meta/return.rb +0 -16
  115. data/meta/sclass.rb +0 -12
  116. data/meta/self.rb +0 -7
  117. data/meta/send.rb +0 -600
  118. data/meta/str.rb +0 -7
  119. data/meta/super.rb +0 -27
  120. data/meta/sym.rb +0 -8
  121. data/meta/true.rb +0 -7
  122. data/meta/until.rb +0 -16
  123. data/meta/while.rb +0 -24
  124. data/meta/yield.rb +0 -9
  125. data/mutant-minitest.gemspec +0 -22
  126. data/mutant-rspec.gemspec +0 -22
  127. data/mutant.gemspec +0 -44
  128. data/mutant.sh +0 -12
  129. data/mutant.yml +0 -6
  130. data/spec/integration/mutant/corpus_spec.rb +0 -15
  131. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  132. data/spec/integration/mutant/minitest_spec.rb +0 -11
  133. data/spec/integration/mutant/null_spec.rb +0 -16
  134. data/spec/integration/mutant/rspec_spec.rb +0 -15
  135. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  136. data/spec/integrations.yml +0 -63
  137. data/spec/shared/framework_integration_behavior.rb +0 -70
  138. data/spec/shared/method_matcher_behavior.rb +0 -47
  139. data/spec/spec_helper.rb +0 -90
  140. data/spec/support/corpus.rb +0 -318
  141. data/spec/support/file_system.rb +0 -62
  142. data/spec/support/ice_nine_config.rb +0 -10
  143. data/spec/support/ruby_vm.rb +0 -84
  144. data/spec/support/shared_context.rb +0 -169
  145. data/spec/support/xspec.rb +0 -183
  146. data/spec/unit/mutant/ast/find_metaclass_containing_spec.rb +0 -64
  147. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  148. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  149. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  150. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  151. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  152. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  153. data/spec/unit/mutant/ast_spec.rb +0 -57
  154. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  155. data/spec/unit/mutant/cli_spec.rb +0 -305
  156. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  157. data/spec/unit/mutant/config_spec.rb +0 -126
  158. data/spec/unit/mutant/context_spec.rb +0 -111
  159. data/spec/unit/mutant/env_spec.rb +0 -229
  160. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  161. data/spec/unit/mutant/expression/methods_spec.rb +0 -66
  162. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  163. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  164. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  165. data/spec/unit/mutant/expression_spec.rb +0 -45
  166. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  167. data/spec/unit/mutant/integration_spec.rb +0 -150
  168. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  169. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  170. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  171. data/spec/unit/mutant/license_spec.rb +0 -305
  172. data/spec/unit/mutant/loader_spec.rb +0 -79
  173. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  174. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  175. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  176. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  177. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  178. data/spec/unit/mutant/matcher/method/metaclass_spec.rb +0 -108
  179. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  180. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  181. data/spec/unit/mutant/matcher/methods/metaclass_spec.rb +0 -62
  182. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  183. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -39
  184. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  185. data/spec/unit/mutant/matcher/scope_spec.rb +0 -45
  186. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  187. data/spec/unit/mutant/matcher_spec.rb +0 -102
  188. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  189. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  190. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  191. data/spec/unit/mutant/mutation_spec.rb +0 -140
  192. data/spec/unit/mutant/mutator/node_spec.rb +0 -47
  193. data/spec/unit/mutant/mutator_spec.rb +0 -21
  194. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  195. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  196. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  197. data/spec/unit/mutant/parallel_spec.rb +0 -115
  198. data/spec/unit/mutant/parser_spec.rb +0 -26
  199. data/spec/unit/mutant/range_spec.rb +0 -141
  200. data/spec/unit/mutant/registry_spec.rb +0 -74
  201. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  202. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  203. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  204. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  205. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  206. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  207. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  208. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  209. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  210. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  211. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  212. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  213. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  214. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  215. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  216. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  217. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  218. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  219. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  220. data/spec/unit/mutant/result/env_spec.rb +0 -161
  221. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  222. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  223. data/spec/unit/mutant/result/test_spec.rb +0 -14
  224. data/spec/unit/mutant/result_spec.rb +0 -33
  225. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  226. data/spec/unit/mutant/runner_spec.rb +0 -121
  227. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  228. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  229. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -276
  230. data/spec/unit/mutant/subject/method/metaclass_spec.rb +0 -63
  231. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  232. data/spec/unit/mutant/subject_spec.rb +0 -93
  233. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  234. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  235. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  236. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  237. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  238. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  239. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  240. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  241. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  242. data/spec/unit/mutant/util/one_spec.rb +0 -22
  243. data/spec/unit/mutant/warnings_spec.rb +0 -89
  244. data/spec/unit/mutant/world_spec.rb +0 -63
  245. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  246. data/test_app/.rspec +0 -1
  247. data/test_app/Gemfile.minitest +0 -6
  248. data/test_app/Gemfile.rspec3.8 +0 -7
  249. data/test_app/lib/test_app.rb +0 -114
  250. data/test_app/lib/test_app/literal.rb +0 -35
  251. data/test_app/lib/test_app/metaclasses.rb +0 -108
  252. data/test_app/spec/spec_helper.rb +0 -9
  253. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  254. 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