mutant 0.9.9 → 0.9.14

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