mutant 0.6.7 → 0.7.1
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.
- checksums.yaml +4 -4
- data/Changelog.md +10 -0
- data/README.md +1 -1
- data/config/flay.yml +1 -1
- data/config/reek.yml +11 -40
- data/config/rubocop.yml +1 -1
- data/lib/mutant.rb +10 -2
- data/lib/mutant/actor.rb +64 -0
- data/lib/mutant/actor/actor.rb +50 -0
- data/lib/mutant/actor/env.rb +35 -0
- data/lib/mutant/actor/mailbox.rb +53 -0
- data/lib/mutant/actor/receiver.rb +48 -0
- data/lib/mutant/actor/sender.rb +27 -0
- data/lib/mutant/ast/types.rb +1 -1
- data/lib/mutant/cli.rb +2 -0
- data/lib/mutant/config.rb +2 -1
- data/lib/mutant/env.rb +6 -2
- data/lib/mutant/expression/methods.rb +1 -1
- data/lib/mutant/integration.rb +11 -1
- data/lib/mutant/isolation.rb +1 -2
- data/lib/mutant/meta/example.rb +1 -1
- data/lib/mutant/mutation.rb +47 -21
- data/lib/mutant/mutator/node.rb +1 -1
- data/lib/mutant/mutator/node/literal/symbol.rb +1 -1
- data/lib/mutant/mutator/node/send.rb +4 -3
- data/lib/mutant/reporter/cli.rb +2 -0
- data/lib/mutant/reporter/cli/format.rb +23 -36
- data/lib/mutant/reporter/cli/printer.rb +66 -27
- data/lib/mutant/result.rb +45 -58
- data/lib/mutant/runner.rb +47 -154
- data/lib/mutant/runner/master.rb +174 -0
- data/lib/mutant/runner/scheduler.rb +141 -0
- data/lib/mutant/runner/worker.rb +93 -0
- data/lib/mutant/subject/method/instance.rb +1 -15
- data/lib/mutant/test.rb +2 -15
- data/lib/mutant/version.rb +1 -1
- data/meta/send.rb +16 -0
- data/mutant-rspec.gemspec +1 -1
- data/mutant.gemspec +1 -1
- data/spec/integration/mutant/rspec_spec.rb +0 -6
- data/spec/spec_helper.rb +9 -1
- data/spec/support/fake_actor.rb +93 -0
- data/spec/support/shared_context.rb +135 -0
- data/spec/unit/mutant/actor/actor_spec.rb +35 -0
- data/spec/unit/mutant/actor/binding_spec.rb +32 -0
- data/spec/unit/mutant/actor/env_spec.rb +49 -0
- data/spec/unit/mutant/actor/message_spec.rb +23 -0
- data/spec/unit/mutant/actor/receiver_spec.rb +60 -0
- data/spec/unit/mutant/actor/sender_spec.rb +22 -0
- data/spec/unit/mutant/cli_spec.rb +17 -4
- data/spec/unit/mutant/env_spec.rb +2 -2
- data/spec/unit/mutant/mailbox_spec.rb +33 -0
- data/spec/unit/mutant/mutation_spec.rb +52 -18
- data/spec/unit/mutant/mutator/registry_spec.rb +4 -4
- data/spec/unit/mutant/reporter/cli_spec.rb +131 -249
- data/spec/unit/mutant/result/env_spec.rb +55 -0
- data/spec/unit/mutant/result/subject_spec.rb +43 -0
- data/spec/unit/mutant/runner/master_spec.rb +199 -0
- data/spec/unit/mutant/runner/scheduler_spec.rb +161 -0
- data/spec/unit/mutant/runner/worker_spec.rb +73 -0
- data/spec/unit/mutant/runner_spec.rb +60 -118
- data/spec/unit/mutant/subject/method/instance_spec.rb +18 -31
- data/spec/unit/mutant/warning_filter_spec.rb +1 -1
- metadata +39 -14
- data/lib/mutant/runner/collector.rb +0 -133
- data/lib/mutant/warning_expectation.rb +0 -47
- data/spec/unit/mutant/runner/collector_spec.rb +0 -198
- data/spec/unit/mutant/test_spec.rb +0 -23
- data/spec/unit/mutant/warning_expectation_spec.rb +0 -80
- data/test_app/Gemfile.rspec2 +0 -6
@@ -4,9 +4,58 @@ RSpec.describe Mutant::Mutation do
|
|
4
4
|
SYMBOL = 'test'.freeze
|
5
5
|
end
|
6
6
|
|
7
|
-
let(:object)
|
8
|
-
let(:
|
9
|
-
|
7
|
+
let(:object) { TestMutation.new(mutation_subject, Mutant::AST::Nodes::N_NIL) }
|
8
|
+
let(:context) { double('Context') }
|
9
|
+
|
10
|
+
let(:mutation_subject) do
|
11
|
+
double(
|
12
|
+
'Subject',
|
13
|
+
identification: 'subject',
|
14
|
+
context: context,
|
15
|
+
source: 'original',
|
16
|
+
tests: tests
|
17
|
+
)
|
18
|
+
end
|
19
|
+
|
20
|
+
let(:test_a) { double('Test A') }
|
21
|
+
let(:test_b) { double('Test B') }
|
22
|
+
let(:tests) { [test_a, test_b] }
|
23
|
+
|
24
|
+
describe '#kill' do
|
25
|
+
let(:isolation) { Mutant::Isolation::None }
|
26
|
+
let(:integration) { double('Integration') }
|
27
|
+
let(:object) { Mutant::Mutation::Evil.new(mutation_subject, Mutant::AST::Nodes::N_NIL) }
|
28
|
+
let(:wrapped_node) { double('Wrapped Node') }
|
29
|
+
|
30
|
+
subject { object.kill(isolation, integration) }
|
31
|
+
|
32
|
+
before do
|
33
|
+
allow(Time).to receive(:now).and_return(Time.at(0))
|
34
|
+
end
|
35
|
+
|
36
|
+
context 'when isolation does not raise error' do
|
37
|
+
let(:test_result) { double('Test Result A', passed: false) }
|
38
|
+
|
39
|
+
before do
|
40
|
+
expect(mutation_subject).to receive(:public?).and_return(true).ordered
|
41
|
+
expect(mutation_subject).to receive(:prepare).and_return(mutation_subject).ordered
|
42
|
+
expect(context).to receive(:root).with(s(:nil)).and_return(wrapped_node).ordered
|
43
|
+
expect(Mutant::Loader::Eval).to receive(:call).with(wrapped_node, mutation_subject).and_return(nil).ordered
|
44
|
+
expect(integration).to receive(:call).with(tests).and_return(test_result).ordered
|
45
|
+
expect(test_result).to receive(:update).with(tests: tests).and_return(test_result).ordered
|
46
|
+
end
|
47
|
+
|
48
|
+
it { should eql(test_result) }
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when isolation does raise error' do
|
52
|
+
before do
|
53
|
+
expect(isolation).to receive(:call).and_raise(Mutant::Isolation::Error, 'test-error')
|
54
|
+
end
|
55
|
+
|
56
|
+
it { should eql(Mutant::Result::Test.new(tests: tests, output: 'test-error', passed: false, runtime: 0.0)) }
|
57
|
+
end
|
58
|
+
end
|
10
59
|
|
11
60
|
describe '#code' do
|
12
61
|
subject { object.code }
|
@@ -24,21 +73,6 @@ RSpec.describe Mutant::Mutation do
|
|
24
73
|
it_should_behave_like 'an idempotent method'
|
25
74
|
end
|
26
75
|
|
27
|
-
describe '#insert' do
|
28
|
-
subject { object.insert }
|
29
|
-
|
30
|
-
let(:wrapped_node) { double('Wrapped Node') }
|
31
|
-
|
32
|
-
before do
|
33
|
-
expect(mutation_subject).to receive(:public?).ordered.and_return(true)
|
34
|
-
expect(mutation_subject).to receive(:prepare).ordered
|
35
|
-
expect(context).to receive(:root).ordered.with(s(:nil)).and_return(wrapped_node)
|
36
|
-
expect(Mutant::Loader::Eval).to receive(:call).ordered.with(wrapped_node, mutation_subject).and_return(nil)
|
37
|
-
end
|
38
|
-
|
39
|
-
it_should_behave_like 'a command method'
|
40
|
-
end
|
41
|
-
|
42
76
|
describe '#source' do
|
43
77
|
subject { object.source }
|
44
78
|
|
@@ -2,7 +2,7 @@ RSpec.describe Mutant::Mutator::Registry do
|
|
2
2
|
describe '#lookup' do
|
3
3
|
subject { Mutant::Mutator::REGISTRY.lookup(node) }
|
4
4
|
|
5
|
-
context 'on
|
5
|
+
context 'on registered node' do
|
6
6
|
let(:node) { s(:true) }
|
7
7
|
|
8
8
|
it { should eql(Mutant::Mutator::Node::Literal::Boolean) }
|
@@ -12,7 +12,7 @@ RSpec.describe Mutant::Mutator::Registry do
|
|
12
12
|
let(:node) { s(:unknown) }
|
13
13
|
|
14
14
|
it 'raises error' do
|
15
|
-
expect { subject }.to raise_error(described_class::RegistryError,
|
15
|
+
expect { subject }.to raise_error(described_class::RegistryError, 'No mutator to handle: :unknown')
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
@@ -24,7 +24,7 @@ RSpec.describe Mutant::Mutator::Registry do
|
|
24
24
|
|
25
25
|
subject { object.register(type, mutator) }
|
26
26
|
|
27
|
-
context 'when
|
27
|
+
context 'when registering an invalid node type' do
|
28
28
|
let(:type) { :invalid }
|
29
29
|
|
30
30
|
it 'raises error' do
|
@@ -32,7 +32,7 @@ RSpec.describe Mutant::Mutator::Registry do
|
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
35
|
-
context 'when
|
35
|
+
context 'when registering a valid node type' do
|
36
36
|
let(:type) { :true }
|
37
37
|
|
38
38
|
it 'allows to lookup mutator' do
|
@@ -1,4 +1,6 @@
|
|
1
1
|
RSpec.describe Mutant::Reporter::CLI do
|
2
|
+
setup_shared_context
|
3
|
+
|
2
4
|
let(:object) { described_class.new(output, format) }
|
3
5
|
let(:output) { StringIO.new }
|
4
6
|
|
@@ -31,110 +33,6 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
31
33
|
allow(Time).to receive(:now).and_return(Time.now)
|
32
34
|
end
|
33
35
|
|
34
|
-
let(:result) do
|
35
|
-
Mutant::Result::Env.new(
|
36
|
-
env: env,
|
37
|
-
runtime: 1.1,
|
38
|
-
subject_results: subject_results
|
39
|
-
)
|
40
|
-
end
|
41
|
-
|
42
|
-
let(:env) do
|
43
|
-
double(
|
44
|
-
'Env',
|
45
|
-
class: Mutant::Env,
|
46
|
-
matchable_scopes: matchable_scopes,
|
47
|
-
config: config,
|
48
|
-
subjects: subjects,
|
49
|
-
mutations: subjects.flat_map(&:mutations)
|
50
|
-
)
|
51
|
-
end
|
52
|
-
|
53
|
-
let(:config) { Mutant::Config::DEFAULT.update(jobs: 1) }
|
54
|
-
let(:mutation_class) { Mutant::Mutation::Evil }
|
55
|
-
let(:matchable_scopes) { double('Matchable Scopes', length: 10) }
|
56
|
-
|
57
|
-
before do
|
58
|
-
allow(mutation_a).to receive(:subject).and_return(_subject)
|
59
|
-
allow(mutation_b).to receive(:subject).and_return(_subject)
|
60
|
-
end
|
61
|
-
|
62
|
-
let(:mutation_a) do
|
63
|
-
double(
|
64
|
-
'Mutation',
|
65
|
-
identification: 'mutation_id-a',
|
66
|
-
class: mutation_class,
|
67
|
-
original_source: 'true',
|
68
|
-
source: mutation_source
|
69
|
-
)
|
70
|
-
end
|
71
|
-
|
72
|
-
let(:mutation_b) do
|
73
|
-
double(
|
74
|
-
'Mutation',
|
75
|
-
identification: 'mutation_id-b',
|
76
|
-
class: mutation_class,
|
77
|
-
original_source: 'true',
|
78
|
-
source: mutation_source
|
79
|
-
)
|
80
|
-
end
|
81
|
-
|
82
|
-
let(:mutation_source) { 'false' }
|
83
|
-
|
84
|
-
let(:_subject) do
|
85
|
-
double(
|
86
|
-
'Subject',
|
87
|
-
class: Mutant::Subject,
|
88
|
-
node: s(:true),
|
89
|
-
identification: 'subject_id',
|
90
|
-
mutations: subject_mutations,
|
91
|
-
tests: [
|
92
|
-
double('Test', identification: 'test_id')
|
93
|
-
]
|
94
|
-
)
|
95
|
-
end
|
96
|
-
|
97
|
-
let(:subject_mutations) { [mutation_a] }
|
98
|
-
|
99
|
-
let(:test_results) do
|
100
|
-
[
|
101
|
-
double(
|
102
|
-
'Test Result',
|
103
|
-
class: Mutant::Result::Test,
|
104
|
-
test: _subject.tests.first,
|
105
|
-
runtime: 1.0,
|
106
|
-
output: 'test-output',
|
107
|
-
success?: mutation_result_success
|
108
|
-
)
|
109
|
-
]
|
110
|
-
end
|
111
|
-
|
112
|
-
let(:mutation_a_result) do
|
113
|
-
double(
|
114
|
-
'Mutation Result',
|
115
|
-
class: Mutant::Result::Mutation,
|
116
|
-
mutation: mutation_a,
|
117
|
-
killtime: 0.5,
|
118
|
-
runtime: 1.0,
|
119
|
-
index: 0,
|
120
|
-
success?: mutation_result_success,
|
121
|
-
test_results: test_results,
|
122
|
-
failed_test_results: mutation_result_success ? [] : test_results
|
123
|
-
)
|
124
|
-
end
|
125
|
-
|
126
|
-
let(:subject_results) do
|
127
|
-
[
|
128
|
-
Mutant::Result::Subject.new(
|
129
|
-
subject: _subject,
|
130
|
-
runtime: 1.0,
|
131
|
-
mutation_results: [mutation_a_result]
|
132
|
-
)
|
133
|
-
]
|
134
|
-
end
|
135
|
-
|
136
|
-
let(:subjects) { [_subject] }
|
137
|
-
|
138
36
|
describe '.build' do
|
139
37
|
subject { described_class.build(output) }
|
140
38
|
|
@@ -210,47 +108,35 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
210
108
|
end
|
211
109
|
|
212
110
|
describe '#progress' do
|
213
|
-
subject { object.progress(
|
214
|
-
|
215
|
-
let(:collector) do
|
216
|
-
Mutant::Runner::Collector.new(env)
|
217
|
-
end
|
218
|
-
|
219
|
-
let(:mutation_result_success) { true }
|
111
|
+
subject { object.progress(status) }
|
220
112
|
|
221
113
|
context 'on progressive format' do
|
222
|
-
|
223
114
|
let(:format) { progressive_format }
|
224
115
|
|
225
|
-
context 'with empty
|
116
|
+
context 'with empty scheduler' do
|
117
|
+
update(:env_result) { { subject_results: [] } }
|
226
118
|
|
227
119
|
it_reports ''
|
228
120
|
end
|
229
121
|
|
230
122
|
context 'with last mutation present' do
|
231
|
-
|
232
|
-
before do
|
233
|
-
collector.start(mutation_a)
|
234
|
-
collector.finish(mutation_a_result)
|
235
|
-
end
|
123
|
+
update(:env_result) { { subject_results: [subject_a_result] } }
|
236
124
|
|
237
125
|
context 'when mutation is successful' do
|
238
|
-
it_reports '
|
126
|
+
it_reports '..'
|
239
127
|
end
|
240
128
|
|
241
129
|
context 'when mutation is NOT successful' do
|
242
|
-
|
243
|
-
|
244
|
-
it_reports 'F'
|
130
|
+
update(:mutation_a_test_result) { { passed: true } }
|
131
|
+
it_reports 'F.'
|
245
132
|
end
|
246
133
|
end
|
247
134
|
end
|
248
135
|
|
249
136
|
context 'on framed format' do
|
137
|
+
context 'with empty scheduler' do
|
138
|
+
update(:env_result) { { subject_results: [] } }
|
250
139
|
|
251
|
-
let(:mutation_result_success) { true }
|
252
|
-
|
253
|
-
context 'with empty collector' do
|
254
140
|
it_reports <<-REPORT
|
255
141
|
Mutant configuration:
|
256
142
|
Matcher: #<Mutant::Matcher::Config match_expressions=[] subject_ignores=[] subject_selects=[]>
|
@@ -261,24 +147,21 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
261
147
|
Requires: []
|
262
148
|
Available Subjects: 1
|
263
149
|
Subjects: 1
|
264
|
-
Mutations:
|
150
|
+
Mutations: 2
|
265
151
|
Kills: 0
|
266
152
|
Alive: 0
|
267
|
-
Runtime:
|
153
|
+
Runtime: 4.00s
|
268
154
|
Killtime: 0.00s
|
269
|
-
Overhead:
|
155
|
+
Overhead: Inf%
|
270
156
|
Coverage: 0.00%
|
271
157
|
Expected: 100.00%
|
272
158
|
Active subjects: 0
|
273
159
|
REPORT
|
274
160
|
end
|
275
161
|
|
276
|
-
context 'with
|
277
|
-
before do
|
278
|
-
collector.start(mutation_a)
|
279
|
-
end
|
280
|
-
|
162
|
+
context 'with scheduler active on one subject' do
|
281
163
|
context 'without progress' do
|
164
|
+
update(:status) { { active_jobs: [].to_set } }
|
282
165
|
|
283
166
|
it_reports(<<-REPORT)
|
284
167
|
Mutant configuration:
|
@@ -290,32 +173,23 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
290
173
|
Requires: []
|
291
174
|
Available Subjects: 1
|
292
175
|
Subjects: 1
|
293
|
-
Mutations:
|
294
|
-
Kills:
|
176
|
+
Mutations: 2
|
177
|
+
Kills: 2
|
295
178
|
Alive: 0
|
296
|
-
Runtime:
|
297
|
-
Killtime:
|
298
|
-
Overhead:
|
299
|
-
Coverage:
|
179
|
+
Runtime: 4.00s
|
180
|
+
Killtime: 2.00s
|
181
|
+
Overhead: 100.00%
|
182
|
+
Coverage: 100.00%
|
300
183
|
Expected: 100.00%
|
301
|
-
Active subjects:
|
302
|
-
subject_id mutations: 1
|
303
|
-
- test_id
|
304
|
-
(00/01) 0% - killtime: 0.00s runtime: 0.00s overhead: 0.00s
|
184
|
+
Active subjects: 0
|
305
185
|
REPORT
|
306
186
|
end
|
307
187
|
|
308
188
|
context 'with progress' do
|
309
|
-
|
310
|
-
let(:subject_mutations) { [mutation_a, mutation_b] }
|
311
|
-
|
312
|
-
before do
|
313
|
-
collector.start(mutation_b)
|
314
|
-
collector.finish(mutation_a_result)
|
315
|
-
end
|
189
|
+
update(:status) { { active_jobs: [job_a].to_set } }
|
316
190
|
|
317
191
|
context 'on failure' do
|
318
|
-
|
192
|
+
update(:mutation_a_test_result) { { passed: true } }
|
319
193
|
|
320
194
|
it_reports(<<-REPORT)
|
321
195
|
Mutant configuration:
|
@@ -328,18 +202,20 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
328
202
|
Available Subjects: 1
|
329
203
|
Subjects: 1
|
330
204
|
Mutations: 2
|
331
|
-
Kills:
|
205
|
+
Kills: 1
|
332
206
|
Alive: 1
|
333
|
-
Runtime:
|
334
|
-
Killtime:
|
335
|
-
Overhead:
|
336
|
-
Coverage:
|
207
|
+
Runtime: 4.00s
|
208
|
+
Killtime: 2.00s
|
209
|
+
Overhead: 100.00%
|
210
|
+
Coverage: 50.00%
|
337
211
|
Expected: 100.00%
|
338
212
|
Active subjects: 1
|
339
|
-
|
340
|
-
-
|
341
|
-
F
|
342
|
-
(
|
213
|
+
subject-a mutations: 2
|
214
|
+
- test-a
|
215
|
+
F.
|
216
|
+
(01/02) 50% - killtime: 2.00s runtime: 2.00s overhead: 0.00s
|
217
|
+
Active Jobs:
|
218
|
+
0: evil:subject-a:d27d2
|
343
219
|
REPORT
|
344
220
|
end
|
345
221
|
|
@@ -355,18 +231,20 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
355
231
|
Available Subjects: 1
|
356
232
|
Subjects: 1
|
357
233
|
Mutations: 2
|
358
|
-
Kills:
|
234
|
+
Kills: 2
|
359
235
|
Alive: 0
|
360
|
-
Runtime:
|
361
|
-
Killtime:
|
362
|
-
Overhead:
|
236
|
+
Runtime: 4.00s
|
237
|
+
Killtime: 2.00s
|
238
|
+
Overhead: 100.00%
|
363
239
|
Coverage: 100.00%
|
364
240
|
Expected: 100.00%
|
365
241
|
Active subjects: 1
|
366
|
-
|
367
|
-
-
|
368
|
-
|
369
|
-
(
|
242
|
+
subject-a mutations: 2
|
243
|
+
- test-a
|
244
|
+
..
|
245
|
+
(02/02) 100% - killtime: 2.00s runtime: 2.00s overhead: 0.00s
|
246
|
+
Active Jobs:
|
247
|
+
0: evil:subject-a:d27d2
|
370
248
|
REPORT
|
371
249
|
end
|
372
250
|
end
|
@@ -374,11 +252,9 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
374
252
|
end
|
375
253
|
|
376
254
|
describe '#report' do
|
377
|
-
subject { object.report(
|
255
|
+
subject { object.report(status.env_result) }
|
378
256
|
|
379
257
|
context 'with full coverage' do
|
380
|
-
let(:mutation_result_success) { true }
|
381
|
-
|
382
258
|
it_reports(<<-REPORT)
|
383
259
|
Mutant configuration:
|
384
260
|
Matcher: #<Mutant::Matcher::Config match_expressions=[] subject_ignores=[] subject_selects=[]>
|
@@ -389,26 +265,26 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
389
265
|
Requires: []
|
390
266
|
Available Subjects: 1
|
391
267
|
Subjects: 1
|
392
|
-
Mutations:
|
393
|
-
Kills:
|
268
|
+
Mutations: 2
|
269
|
+
Kills: 2
|
394
270
|
Alive: 0
|
395
|
-
Runtime:
|
396
|
-
Killtime:
|
397
|
-
Overhead:
|
271
|
+
Runtime: 4.00s
|
272
|
+
Killtime: 2.00s
|
273
|
+
Overhead: 100.00%
|
398
274
|
Coverage: 100.00%
|
399
275
|
Expected: 100.00%
|
400
276
|
REPORT
|
401
277
|
end
|
402
278
|
|
403
279
|
context 'and partial coverage' do
|
404
|
-
|
280
|
+
update(:mutation_a_test_result) { { passed: true } }
|
405
281
|
|
406
282
|
context 'on evil mutation' do
|
407
283
|
context 'with a diff' do
|
408
284
|
it_reports(<<-REPORT)
|
409
|
-
|
410
|
-
-
|
411
|
-
|
285
|
+
subject-a
|
286
|
+
- test-a
|
287
|
+
evil:subject-a:d27d2
|
412
288
|
@@ -1,2 +1,2 @@
|
413
289
|
-true
|
414
290
|
+false
|
@@ -422,29 +298,29 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
422
298
|
Requires: []
|
423
299
|
Available Subjects: 1
|
424
300
|
Subjects: 1
|
425
|
-
Mutations:
|
426
|
-
Kills:
|
301
|
+
Mutations: 2
|
302
|
+
Kills: 1
|
427
303
|
Alive: 1
|
428
|
-
Runtime:
|
429
|
-
Killtime:
|
430
|
-
Overhead:
|
431
|
-
Coverage:
|
304
|
+
Runtime: 4.00s
|
305
|
+
Killtime: 2.00s
|
306
|
+
Overhead: 100.00%
|
307
|
+
Coverage: 50.00%
|
432
308
|
Expected: 100.00%
|
433
309
|
REPORT
|
434
310
|
end
|
435
311
|
|
436
312
|
context 'without a diff' do
|
437
|
-
let(:
|
313
|
+
let(:mutation_a_node) { s(:true) }
|
438
314
|
|
439
315
|
it_reports(<<-REPORT)
|
440
|
-
|
441
|
-
-
|
442
|
-
|
316
|
+
subject-a
|
317
|
+
- test-a
|
318
|
+
evil:subject-a:d5318
|
443
319
|
Original source:
|
444
320
|
true
|
445
321
|
Mutated Source:
|
446
322
|
true
|
447
|
-
BUG: Mutation NOT resulted in exactly one diff. Please report a reproduction!
|
323
|
+
BUG: Mutation NOT resulted in exactly one diff hunk. Please report a reproduction!
|
448
324
|
-----------------------
|
449
325
|
Mutant configuration:
|
450
326
|
Matcher: #<Mutant::Matcher::Config match_expressions=[] subject_ignores=[] subject_selects=[]>
|
@@ -455,26 +331,29 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
455
331
|
Requires: []
|
456
332
|
Available Subjects: 1
|
457
333
|
Subjects: 1
|
458
|
-
Mutations:
|
459
|
-
Kills:
|
334
|
+
Mutations: 2
|
335
|
+
Kills: 1
|
460
336
|
Alive: 1
|
461
|
-
Runtime:
|
462
|
-
Killtime:
|
463
|
-
Overhead:
|
464
|
-
Coverage:
|
337
|
+
Runtime: 4.00s
|
338
|
+
Killtime: 2.00s
|
339
|
+
Overhead: 100.00%
|
340
|
+
Coverage: 50.00%
|
465
341
|
Expected: 100.00%
|
466
342
|
REPORT
|
467
343
|
end
|
468
344
|
end
|
469
345
|
|
470
346
|
context 'on neutral mutation' do
|
471
|
-
|
472
|
-
|
347
|
+
update(:mutation_a_test_result) { { passed: false } }
|
348
|
+
|
349
|
+
let(:mutation_a) do
|
350
|
+
Mutant::Mutation::Neutral.new(subject_a, s(:true))
|
351
|
+
end
|
473
352
|
|
474
353
|
it_reports(<<-REPORT)
|
475
|
-
|
476
|
-
-
|
477
|
-
|
354
|
+
subject-a
|
355
|
+
- test-a
|
356
|
+
neutral:subject-a:d5318
|
478
357
|
--- Neutral failure ---
|
479
358
|
Original code was inserted unmutated. And the test did NOT PASS.
|
480
359
|
Your tests do not pass initially or you found a bug in mutant / unparser.
|
@@ -482,10 +361,25 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
482
361
|
(true)
|
483
362
|
Unparsed Source:
|
484
363
|
true
|
485
|
-
Test
|
486
|
-
-
|
364
|
+
Test Result:
|
365
|
+
- 1 @ runtime: 1.0
|
366
|
+
- test-a
|
487
367
|
Test Output:
|
488
|
-
test
|
368
|
+
mutation a test result output
|
369
|
+
-----------------------
|
370
|
+
neutral:subject-a:d5318
|
371
|
+
--- Neutral failure ---
|
372
|
+
Original code was inserted unmutated. And the test did NOT PASS.
|
373
|
+
Your tests do not pass initially or you found a bug in mutant / unparser.
|
374
|
+
Subject AST:
|
375
|
+
(true)
|
376
|
+
Unparsed Source:
|
377
|
+
true
|
378
|
+
Test Result:
|
379
|
+
- 1 @ runtime: 1.0
|
380
|
+
- test-a
|
381
|
+
Test Output:
|
382
|
+
mutation b test result output
|
489
383
|
-----------------------
|
490
384
|
Mutant configuration:
|
491
385
|
Matcher: #<Mutant::Matcher::Config match_expressions=[] subject_ignores=[] subject_selects=[]>
|
@@ -496,31 +390,46 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
496
390
|
Requires: []
|
497
391
|
Available Subjects: 1
|
498
392
|
Subjects: 1
|
499
|
-
Mutations:
|
393
|
+
Mutations: 2
|
500
394
|
Kills: 0
|
501
|
-
Alive:
|
502
|
-
Runtime:
|
503
|
-
Killtime:
|
504
|
-
Overhead:
|
395
|
+
Alive: 2
|
396
|
+
Runtime: 4.00s
|
397
|
+
Killtime: 2.00s
|
398
|
+
Overhead: 100.00%
|
505
399
|
Coverage: 0.00%
|
506
400
|
Expected: 100.00%
|
507
401
|
REPORT
|
508
402
|
end
|
509
403
|
|
510
404
|
context 'on noop mutation' do
|
511
|
-
|
405
|
+
update(:mutation_a_test_result) { { passed: false } }
|
406
|
+
|
407
|
+
let(:mutation_a) do
|
408
|
+
Mutant::Mutation::Noop.new(subject_a, s(:true))
|
409
|
+
end
|
512
410
|
|
513
411
|
it_reports(<<-REPORT)
|
514
|
-
|
515
|
-
-
|
516
|
-
|
412
|
+
subject-a
|
413
|
+
- test-a
|
414
|
+
noop:subject-a:d5318
|
517
415
|
---- Noop failure -----
|
518
416
|
No code was inserted. And the test did NOT PASS.
|
519
417
|
This is typically a problem of your specs not passing unmutated.
|
520
|
-
Test
|
521
|
-
-
|
418
|
+
Test Result:
|
419
|
+
- 1 @ runtime: 1.0
|
420
|
+
- test-a
|
522
421
|
Test Output:
|
523
|
-
test
|
422
|
+
mutation a test result output
|
423
|
+
-----------------------
|
424
|
+
noop:subject-a:d5318
|
425
|
+
---- Noop failure -----
|
426
|
+
No code was inserted. And the test did NOT PASS.
|
427
|
+
This is typically a problem of your specs not passing unmutated.
|
428
|
+
Test Result:
|
429
|
+
- 1 @ runtime: 1.0
|
430
|
+
- test-a
|
431
|
+
Test Output:
|
432
|
+
mutation b test result output
|
524
433
|
-----------------------
|
525
434
|
Mutant configuration:
|
526
435
|
Matcher: #<Mutant::Matcher::Config match_expressions=[] subject_ignores=[] subject_selects=[]>
|
@@ -531,44 +440,17 @@ RSpec.describe Mutant::Reporter::CLI do
|
|
531
440
|
Requires: []
|
532
441
|
Available Subjects: 1
|
533
442
|
Subjects: 1
|
534
|
-
Mutations:
|
443
|
+
Mutations: 2
|
535
444
|
Kills: 0
|
536
|
-
Alive:
|
537
|
-
Runtime:
|
538
|
-
Killtime:
|
539
|
-
Overhead:
|
445
|
+
Alive: 2
|
446
|
+
Runtime: 4.00s
|
447
|
+
Killtime: 2.00s
|
448
|
+
Overhead: 100.00%
|
540
449
|
Coverage: 0.00%
|
541
450
|
Expected: 100.00%
|
542
451
|
REPORT
|
543
452
|
end
|
544
453
|
end
|
545
|
-
|
546
|
-
context 'without subjects' do
|
547
|
-
let(:subjects) { [] }
|
548
|
-
let(:subject_results) { [] }
|
549
|
-
|
550
|
-
let(:config) { Mutant::Config::DEFAULT.update(jobs: 1, includes: %w[include-dir], requires: %w[require-name]) }
|
551
|
-
|
552
|
-
it_reports(<<-REPORT)
|
553
|
-
Mutant configuration:
|
554
|
-
Matcher: #<Mutant::Matcher::Config match_expressions=[] subject_ignores=[] subject_selects=[]>
|
555
|
-
Integration: null
|
556
|
-
Expect Coverage: 100.00%
|
557
|
-
Jobs: 1
|
558
|
-
Includes: ["include-dir"]
|
559
|
-
Requires: ["require-name"]
|
560
|
-
Available Subjects: 0
|
561
|
-
Subjects: 0
|
562
|
-
Mutations: 0
|
563
|
-
Kills: 0
|
564
|
-
Alive: 0
|
565
|
-
Runtime: 1.10s
|
566
|
-
Killtime: 0.00s
|
567
|
-
Overhead: Inf%
|
568
|
-
Coverage: 0.00%
|
569
|
-
Expected: 100.00%
|
570
|
-
REPORT
|
571
|
-
end
|
572
454
|
end
|
573
455
|
end
|
574
456
|
end
|