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.
- checksums.yaml +4 -4
- data/bin/mutant +16 -11
- data/lib/mutant.rb +8 -4
- data/lib/mutant/bootstrap.rb +14 -1
- data/lib/mutant/cli.rb +9 -162
- data/lib/mutant/cli/command.rb +196 -0
- data/lib/mutant/cli/command/root.rb +13 -0
- data/lib/mutant/cli/command/run.rb +151 -0
- data/lib/mutant/cli/command/subscription.rb +54 -0
- data/lib/mutant/expression.rb +0 -1
- data/lib/mutant/isolation.rb +1 -1
- data/lib/mutant/isolation/fork.rb +2 -2
- data/lib/mutant/isolation/none.rb +1 -1
- data/lib/mutant/license.rb +9 -35
- data/lib/mutant/license/subscription.rb +31 -9
- data/lib/mutant/license/subscription/commercial.rb +2 -4
- data/lib/mutant/license/subscription/opensource.rb +7 -7
- data/lib/mutant/matcher/config.rb +2 -0
- data/lib/mutant/meta/example.rb +16 -4
- data/lib/mutant/meta/example/dsl.rb +33 -16
- data/lib/mutant/meta/example/verification.rb +70 -28
- data/lib/mutant/minitest/coverage.rb +53 -0
- data/lib/mutant/mutator/node.rb +2 -2
- data/lib/mutant/mutator/node/block_pass.rb +29 -0
- data/lib/mutant/mutator/node/{dstr.rb → dynamic_literal.rb} +7 -5
- data/lib/mutant/mutator/node/index.rb +4 -4
- data/lib/mutant/mutator/node/literal/range.rb +5 -2
- data/lib/mutant/mutator/node/named_value/variable_assignment.rb +1 -1
- data/lib/mutant/mutator/node/noop.rb +1 -1
- data/lib/mutant/mutator/node/op_asgn.rb +15 -1
- data/lib/mutant/mutator/node/send.rb +25 -1
- data/lib/mutant/mutator/node/send/attribute_assignment.rb +1 -0
- data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -3
- data/lib/mutant/subject/method/instance.rb +1 -1
- data/lib/mutant/version.rb +1 -1
- metadata +18 -336
- data/.github/workflows/ci.yml +0 -121
- data/.gitignore +0 -38
- data/.rspec +0 -5
- data/.rubocop.yml +0 -210
- data/Changelog.md +0 -87
- data/Gemfile +0 -7
- data/Gemfile.lock +0 -107
- data/Gemfile.shared +0 -10
- data/README.md +0 -199
- data/Rakefile +0 -5
- data/config/devtools.yml +0 -2
- data/config/reek.yml +0 -139
- data/config/yardstick.yml +0 -2
- data/docs/commercial-support.md +0 -14
- data/docs/concurrency.md +0 -39
- data/docs/incremental.md +0 -76
- data/docs/known-problems.md +0 -30
- data/docs/limitations.md +0 -50
- data/docs/mutant-minitest.md +0 -149
- data/docs/mutant-rspec.md +0 -130
- data/docs/nomenclature.md +0 -82
- data/docs/reading-reports.md +0 -74
- data/lib/mutant/mutator/node/dsym.rb +0 -22
- data/meta/and.rb +0 -13
- data/meta/and_asgn.rb +0 -14
- data/meta/array.rb +0 -27
- data/meta/begin.rb +0 -20
- data/meta/block.rb +0 -199
- data/meta/block_pass.rb +0 -8
- data/meta/blockarg.rb +0 -10
- data/meta/break.rb +0 -9
- data/meta/case.rb +0 -217
- data/meta/casgn.rb +0 -25
- data/meta/cbase.rb +0 -8
- data/meta/class.rb +0 -12
- data/meta/const.rb +0 -17
- data/meta/csend.rb +0 -10
- data/meta/cvar.rb +0 -7
- data/meta/cvasgn.rb +0 -9
- data/meta/date.rb +0 -59
- data/meta/def.rb +0 -196
- data/meta/defined.rb +0 -9
- data/meta/dstr.rb +0 -13
- data/meta/dsym.rb +0 -14
- data/meta/ensure.rb +0 -8
- data/meta/false.rb +0 -7
- data/meta/file.rb +0 -5
- data/meta/float.rb +0 -37
- data/meta/gvar.rb +0 -7
- data/meta/gvasgn.rb +0 -9
- data/meta/hash.rb +0 -20
- data/meta/if.rb +0 -72
- data/meta/index.rb +0 -133
- data/meta/indexasgn.rb +0 -31
- data/meta/int.rb +0 -18
- data/meta/ivar.rb +0 -8
- data/meta/ivasgn.rb +0 -22
- data/meta/kwarg.rb +0 -10
- data/meta/kwbegin.rb +0 -8
- data/meta/kwoptarg.rb +0 -13
- data/meta/lambda.rb +0 -23
- data/meta/line.rb +0 -5
- data/meta/lvar.rb +0 -16
- data/meta/lvasgn.rb +0 -24
- data/meta/masgn.rb +0 -7
- data/meta/match_current_line.rb +0 -14
- data/meta/next.rb +0 -10
- data/meta/nil.rb +0 -5
- data/meta/nthref.rb +0 -14
- data/meta/op_assgn.rb +0 -17
- data/meta/or.rb +0 -13
- data/meta/or_asgn.rb +0 -50
- data/meta/range.rb +0 -65
- data/meta/redo.rb +0 -5
- data/meta/regexp.rb +0 -80
- data/meta/regopt.rb +0 -10
- data/meta/rescue.rb +0 -84
- data/meta/return.rb +0 -16
- data/meta/sclass.rb +0 -12
- data/meta/self.rb +0 -7
- data/meta/send.rb +0 -600
- data/meta/str.rb +0 -7
- data/meta/super.rb +0 -27
- data/meta/sym.rb +0 -8
- data/meta/true.rb +0 -7
- data/meta/until.rb +0 -16
- data/meta/while.rb +0 -24
- data/meta/yield.rb +0 -9
- data/mutant-minitest.gemspec +0 -22
- data/mutant-rspec.gemspec +0 -22
- data/mutant.gemspec +0 -44
- data/mutant.sh +0 -12
- data/mutant.yml +0 -6
- data/spec/integration/mutant/corpus_spec.rb +0 -15
- data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
- data/spec/integration/mutant/minitest_spec.rb +0 -11
- data/spec/integration/mutant/null_spec.rb +0 -16
- data/spec/integration/mutant/rspec_spec.rb +0 -15
- data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
- data/spec/integrations.yml +0 -63
- data/spec/shared/framework_integration_behavior.rb +0 -70
- data/spec/shared/method_matcher_behavior.rb +0 -47
- data/spec/spec_helper.rb +0 -90
- data/spec/support/corpus.rb +0 -318
- data/spec/support/file_system.rb +0 -62
- data/spec/support/ice_nine_config.rb +0 -10
- data/spec/support/ruby_vm.rb +0 -84
- data/spec/support/shared_context.rb +0 -169
- data/spec/support/xspec.rb +0 -183
- data/spec/unit/mutant/ast/find_metaclass_containing_spec.rb +0 -64
- data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
- data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
- data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
- data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
- data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
- data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
- data/spec/unit/mutant/ast_spec.rb +0 -57
- data/spec/unit/mutant/bootstrap_spec.rb +0 -216
- data/spec/unit/mutant/cli_spec.rb +0 -305
- data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
- data/spec/unit/mutant/config_spec.rb +0 -126
- data/spec/unit/mutant/context_spec.rb +0 -111
- data/spec/unit/mutant/env_spec.rb +0 -229
- data/spec/unit/mutant/expression/method_spec.rb +0 -62
- data/spec/unit/mutant/expression/methods_spec.rb +0 -66
- data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
- data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
- data/spec/unit/mutant/expression/parser_spec.rb +0 -65
- data/spec/unit/mutant/expression_spec.rb +0 -45
- data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
- data/spec/unit/mutant/integration_spec.rb +0 -150
- data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
- data/spec/unit/mutant/isolation/none_spec.rb +0 -23
- data/spec/unit/mutant/isolation/result_spec.rb +0 -73
- data/spec/unit/mutant/license_spec.rb +0 -305
- data/spec/unit/mutant/loader_spec.rb +0 -79
- data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
- data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
- data/spec/unit/mutant/matcher/config_spec.rb +0 -47
- data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
- data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
- data/spec/unit/mutant/matcher/method/metaclass_spec.rb +0 -108
- data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
- data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
- data/spec/unit/mutant/matcher/methods/metaclass_spec.rb +0 -62
- data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
- data/spec/unit/mutant/matcher/namespace_spec.rb +0 -39
- data/spec/unit/mutant/matcher/null_spec.rb +0 -12
- data/spec/unit/mutant/matcher/scope_spec.rb +0 -45
- data/spec/unit/mutant/matcher/static_spec.rb +0 -13
- data/spec/unit/mutant/matcher_spec.rb +0 -102
- data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
- data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
- data/spec/unit/mutant/meta/example_spec.rb +0 -34
- data/spec/unit/mutant/mutation_spec.rb +0 -140
- data/spec/unit/mutant/mutator/node_spec.rb +0 -47
- data/spec/unit/mutant/mutator_spec.rb +0 -21
- data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
- data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
- data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
- data/spec/unit/mutant/parallel_spec.rb +0 -115
- data/spec/unit/mutant/parser_spec.rb +0 -26
- data/spec/unit/mutant/range_spec.rb +0 -141
- data/spec/unit/mutant/registry_spec.rb +0 -74
- data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
- data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
- data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
- data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
- data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
- data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
- data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
- data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
- data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
- data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
- data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
- data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
- data/spec/unit/mutant/reporter/null_spec.rb +0 -14
- data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
- data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
- data/spec/unit/mutant/repository/diff_spec.rb +0 -122
- data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
- data/spec/unit/mutant/require_highjack_spec.rb +0 -73
- data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
- data/spec/unit/mutant/result/env_spec.rb +0 -161
- data/spec/unit/mutant/result/mutation_spec.rb +0 -70
- data/spec/unit/mutant/result/subject_spec.rb +0 -111
- data/spec/unit/mutant/result/test_spec.rb +0 -14
- data/spec/unit/mutant/result_spec.rb +0 -33
- data/spec/unit/mutant/runner/sink_spec.rb +0 -174
- data/spec/unit/mutant/runner_spec.rb +0 -121
- data/spec/unit/mutant/selector/expression_spec.rb +0 -62
- data/spec/unit/mutant/selector/null_spec.rb +0 -17
- data/spec/unit/mutant/subject/method/instance_spec.rb +0 -276
- data/spec/unit/mutant/subject/method/metaclass_spec.rb +0 -63
- data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
- data/spec/unit/mutant/subject_spec.rb +0 -93
- data/spec/unit/mutant/transform/array_spec.rb +0 -92
- data/spec/unit/mutant/transform/bool_spec.rb +0 -63
- data/spec/unit/mutant/transform/error_spec.rb +0 -132
- data/spec/unit/mutant/transform/exception_spec.rb +0 -44
- data/spec/unit/mutant/transform/hash_spec.rb +0 -236
- data/spec/unit/mutant/transform/index_spec.rb +0 -92
- data/spec/unit/mutant/transform/named_spec.rb +0 -49
- data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
- data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
- data/spec/unit/mutant/util/one_spec.rb +0 -22
- data/spec/unit/mutant/warnings_spec.rb +0 -89
- data/spec/unit/mutant/world_spec.rb +0 -63
- data/spec/unit/mutant/zombifier_spec.rb +0 -122
- data/test_app/.rspec +0 -1
- data/test_app/Gemfile.minitest +0 -6
- data/test_app/Gemfile.rspec3.8 +0 -7
- data/test_app/lib/test_app.rb +0 -114
- data/test_app/lib/test_app/literal.rb +0 -35
- data/test_app/lib/test_app/metaclasses.rb +0 -108
- data/test_app/spec/spec_helper.rb +0 -9
- data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
- 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
|