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,98 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Mutant::Transform::Sequence do
|
4
|
-
subject { described_class.new(steps) }
|
5
|
-
|
6
|
-
let(:steps) do
|
7
|
-
[
|
8
|
-
hash_transform,
|
9
|
-
hash_symbolize
|
10
|
-
]
|
11
|
-
end
|
12
|
-
|
13
|
-
let(:hash_transform) do
|
14
|
-
Mutant::Transform::Hash.new(optional: [], required: [key_transform])
|
15
|
-
end
|
16
|
-
|
17
|
-
let(:key_transform) do
|
18
|
-
Mutant::Transform::Hash::Key.new('foo', Mutant::Transform::Boolean.new)
|
19
|
-
end
|
20
|
-
|
21
|
-
let(:boolean_transform) do
|
22
|
-
Mutant::Transform::Boolean.new
|
23
|
-
end
|
24
|
-
|
25
|
-
let(:hash_symbolize) do
|
26
|
-
Mutant::Transform::Hash::Symbolize.new
|
27
|
-
end
|
28
|
-
|
29
|
-
describe '#apply' do
|
30
|
-
def apply
|
31
|
-
subject.apply(input)
|
32
|
-
end
|
33
|
-
|
34
|
-
context 'on valid input' do
|
35
|
-
let(:input) { { 'foo' => true } }
|
36
|
-
|
37
|
-
it 'returns success' do
|
38
|
-
expect(apply).to eql(Mutant::Either::Right.new(foo: true))
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'on invalid input' do
|
43
|
-
let(:input) { { 'foo' => 1 } }
|
44
|
-
|
45
|
-
let(:boolean_error) do
|
46
|
-
Mutant::Transform::Error.new(
|
47
|
-
cause: nil,
|
48
|
-
input: 1,
|
49
|
-
message: 'Expected: boolean but got: 1',
|
50
|
-
transform: boolean_transform
|
51
|
-
)
|
52
|
-
end
|
53
|
-
|
54
|
-
let(:key_error) do
|
55
|
-
Mutant::Transform::Error.new(
|
56
|
-
cause: boolean_error,
|
57
|
-
input: 1,
|
58
|
-
message: nil,
|
59
|
-
transform: key_transform
|
60
|
-
)
|
61
|
-
end
|
62
|
-
|
63
|
-
let(:hash_error) do
|
64
|
-
Mutant::Transform::Error.new(
|
65
|
-
cause: key_error,
|
66
|
-
input: input,
|
67
|
-
message: nil,
|
68
|
-
transform: hash_transform
|
69
|
-
)
|
70
|
-
end
|
71
|
-
|
72
|
-
let(:index_error) do
|
73
|
-
Mutant::Transform::Error.new(
|
74
|
-
cause: hash_error,
|
75
|
-
input: input,
|
76
|
-
message: nil,
|
77
|
-
transform: Mutant::Transform::Index.new(
|
78
|
-
index: 0,
|
79
|
-
transform: hash_transform
|
80
|
-
)
|
81
|
-
)
|
82
|
-
end
|
83
|
-
|
84
|
-
let(:error) do
|
85
|
-
Mutant::Transform::Error.new(
|
86
|
-
cause: index_error,
|
87
|
-
input: input,
|
88
|
-
message: nil,
|
89
|
-
transform: subject
|
90
|
-
)
|
91
|
-
end
|
92
|
-
|
93
|
-
it 'returns failure' do
|
94
|
-
expect(apply).to eql(Mutant::Either::Left.new(error))
|
95
|
-
end
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Mutant::Util, '.one' do
|
4
|
-
let(:first) { instance_double(Object) }
|
5
|
-
let(:array) { instance_double(Array, one?: true, first: first) }
|
6
|
-
|
7
|
-
it 'returns first element' do
|
8
|
-
expect(described_class.one(array)).to be(first)
|
9
|
-
end
|
10
|
-
|
11
|
-
it 'fails if the list is empty' do
|
12
|
-
expect { described_class.one([]) }
|
13
|
-
.to raise_error(described_class::SizeError)
|
14
|
-
.with_message('expected size to be exactly 1 but size was 0')
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'fails if the list has more than one element' do
|
18
|
-
expect { described_class.one([1, 2]) }
|
19
|
-
.to raise_error(described_class::SizeError)
|
20
|
-
.with_message('expected size to be exactly 1 but size was 2')
|
21
|
-
end
|
22
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Mutant::Warnings do
|
4
|
-
subject { described_class.new(warning_module) }
|
5
|
-
|
6
|
-
before do
|
7
|
-
subject # make sure we infect the module in any case
|
8
|
-
end
|
9
|
-
|
10
|
-
let(:original_messages) do
|
11
|
-
[]
|
12
|
-
end
|
13
|
-
|
14
|
-
let(:warning_module) do
|
15
|
-
original_messages = original_messages()
|
16
|
-
|
17
|
-
# Simulation of corelib `Warning` module
|
18
|
-
Module.new do
|
19
|
-
module_function def warn(*arguments)
|
20
|
-
messages << arguments
|
21
|
-
end
|
22
|
-
|
23
|
-
module_function define_method(:messages) { original_messages }
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def cause_warnings
|
28
|
-
original_messages.clear
|
29
|
-
|
30
|
-
warning_module = warning_module()
|
31
|
-
|
32
|
-
warning_module.warn('warning-a')
|
33
|
-
|
34
|
-
Class
|
35
|
-
.new { include warning_module }
|
36
|
-
.new
|
37
|
-
.instance_eval { warn('warning-b') }
|
38
|
-
end
|
39
|
-
|
40
|
-
describe '#call' do
|
41
|
-
def apply
|
42
|
-
subject.call { cause_warnings }
|
43
|
-
end
|
44
|
-
|
45
|
-
def expect_captured_messages(captured_messages)
|
46
|
-
expect(captured_messages).to eql([%w[warning-a], %w[warning-b]])
|
47
|
-
expect(captured_messages.frozen?).to eql(true)
|
48
|
-
expect(captured_messages.map(&:frozen?)).to eql([true, true])
|
49
|
-
expect(captured_messages.flat_map(&:frozen?)).to eql([true, true])
|
50
|
-
expect(original_messages).to eql([])
|
51
|
-
end
|
52
|
-
|
53
|
-
def expect_original_messages
|
54
|
-
expect(original_messages).to eql([%w[warning-a], %w[warning-b]])
|
55
|
-
end
|
56
|
-
|
57
|
-
it 'captures expected warnings during block execution' do
|
58
|
-
expect_captured_messages(apply)
|
59
|
-
expect(original_messages).to eql([])
|
60
|
-
end
|
61
|
-
|
62
|
-
it 'captures expected warnings during repeated block execution' do
|
63
|
-
expect_captured_messages(apply)
|
64
|
-
expect_captured_messages(apply)
|
65
|
-
end
|
66
|
-
|
67
|
-
it 'does use original implementation without block execution' do
|
68
|
-
cause_warnings
|
69
|
-
expect_original_messages
|
70
|
-
end
|
71
|
-
|
72
|
-
it 'does use original implementation before block execution' do
|
73
|
-
cause_warnings
|
74
|
-
expect_original_messages
|
75
|
-
expect_captured_messages(apply)
|
76
|
-
end
|
77
|
-
|
78
|
-
it 'does use original implementation after block execution' do
|
79
|
-
expect_captured_messages(apply)
|
80
|
-
cause_warnings
|
81
|
-
expect_original_messages
|
82
|
-
end
|
83
|
-
|
84
|
-
it 'rejects re-entrant use' do
|
85
|
-
expect { subject.call { subject.call } }
|
86
|
-
.to raise_error(described_class::RecursiveUseError)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
@@ -1,63 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Mutant::World do
|
4
|
-
subject do
|
5
|
-
Mutant::WORLD
|
6
|
-
end
|
7
|
-
|
8
|
-
describe '#inspect' do
|
9
|
-
def apply
|
10
|
-
subject.inspect
|
11
|
-
end
|
12
|
-
|
13
|
-
it 'returns expected value' do
|
14
|
-
expect(apply).to eql('#<Mutant::World>')
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'is frozen' do
|
18
|
-
expect(apply.frozen?).to be(true)
|
19
|
-
end
|
20
|
-
|
21
|
-
it 'is idempotent' do
|
22
|
-
expect(apply).to be(apply)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
describe '#capture_stdout' do
|
27
|
-
def apply
|
28
|
-
subject.capture_stdout(command)
|
29
|
-
end
|
30
|
-
|
31
|
-
let(:open3) { class_double(Open3) }
|
32
|
-
let(:stdout) { instance_double(String, :stdout) }
|
33
|
-
let(:subject) { super().with(open3: open3) }
|
34
|
-
let(:command) { %w[foo bar baz] }
|
35
|
-
|
36
|
-
let(:process_status) do
|
37
|
-
instance_double(
|
38
|
-
Process::Status,
|
39
|
-
success?: success?
|
40
|
-
)
|
41
|
-
end
|
42
|
-
|
43
|
-
before do
|
44
|
-
allow(open3).to receive_messages(capture2: [stdout, process_status])
|
45
|
-
end
|
46
|
-
|
47
|
-
context 'when process exists successful' do
|
48
|
-
let(:success?) { true }
|
49
|
-
|
50
|
-
it 'returns stdout' do
|
51
|
-
expect(apply).to eql(Mutant::Either::Right.new(stdout))
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
context 'when process exists unsuccessful' do
|
56
|
-
let(:success?) { false }
|
57
|
-
|
58
|
-
it 'returns stdout' do
|
59
|
-
expect(apply).to eql(Mutant::Either::Left.new("Command #{command.inspect} failed!"))
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
@@ -1,122 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
RSpec.describe Mutant::Zombifier do
|
4
|
-
let(:root_require) { Pathname.new('project') }
|
5
|
-
let(:pathname) { class_double(Pathname) }
|
6
|
-
|
7
|
-
let(:require_highjack) do
|
8
|
-
lambda do |block|
|
9
|
-
original = ruby_vm.method(:require)
|
10
|
-
allow(ruby_vm).to receive(:require) do |argument|
|
11
|
-
return_value = ruby_vm.expected_events.first.return_value
|
12
|
-
expect(block.call(argument)).to be(return_value)
|
13
|
-
end
|
14
|
-
original
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
let(:options) do
|
19
|
-
{
|
20
|
-
load_path: %w[a b],
|
21
|
-
includes: %w[project bar],
|
22
|
-
namespace: :Zombie,
|
23
|
-
require_highjack: require_highjack,
|
24
|
-
root_require: root_require,
|
25
|
-
pathname: pathname,
|
26
|
-
kernel: ruby_vm
|
27
|
-
}
|
28
|
-
end
|
29
|
-
|
30
|
-
let(:ruby_vm) do
|
31
|
-
MutantSpec::RubyVM.new(
|
32
|
-
[
|
33
|
-
MutantSpec::RubyVM::EventExpectation::Require.new(
|
34
|
-
expected_payload: {
|
35
|
-
logical_name: 'project'
|
36
|
-
},
|
37
|
-
return_value: true
|
38
|
-
),
|
39
|
-
MutantSpec::RubyVM::EventExpectation::Eval.new(
|
40
|
-
expected_payload: {
|
41
|
-
binding: TOPLEVEL_BINDING,
|
42
|
-
source: "module Zombie\n module Project\n end\nend",
|
43
|
-
source_location: 'a/project.rb'
|
44
|
-
},
|
45
|
-
trigger_requires: %w[foo bar],
|
46
|
-
return_value: nil
|
47
|
-
),
|
48
|
-
MutantSpec::RubyVM::EventExpectation::Require.new(
|
49
|
-
expected_payload: {
|
50
|
-
logical_name: 'foo'
|
51
|
-
},
|
52
|
-
trigger_requires: %w[bar],
|
53
|
-
return_value: true
|
54
|
-
),
|
55
|
-
MutantSpec::RubyVM::EventExpectation::Require.new(
|
56
|
-
expected_payload: {
|
57
|
-
logical_name: 'bar'
|
58
|
-
},
|
59
|
-
return_value: true
|
60
|
-
),
|
61
|
-
MutantSpec::RubyVM::EventExpectation::Eval.new(
|
62
|
-
expected_payload: {
|
63
|
-
binding: TOPLEVEL_BINDING,
|
64
|
-
source: "module Zombie\n module Bar\n end\nend",
|
65
|
-
source_location: 'b/bar.rb'
|
66
|
-
},
|
67
|
-
trigger_requires: %w[],
|
68
|
-
return_value: nil
|
69
|
-
),
|
70
|
-
MutantSpec::RubyVM::EventExpectation::Require.new(
|
71
|
-
expected_payload: {
|
72
|
-
logical_name: 'bar'
|
73
|
-
},
|
74
|
-
return_value: false
|
75
|
-
)
|
76
|
-
]
|
77
|
-
)
|
78
|
-
end
|
79
|
-
|
80
|
-
let(:file_entries) do
|
81
|
-
{
|
82
|
-
'a/project.rb' => { file: true, contents: 'module Project; end' },
|
83
|
-
'b/bar.rb' => { file: true, contents: 'module Bar; end' }
|
84
|
-
}
|
85
|
-
end
|
86
|
-
|
87
|
-
let(:file_system) do
|
88
|
-
MutantSpec::FileSystem.new(
|
89
|
-
Hash[
|
90
|
-
file_entries.map { |key, attributes| [key, MutantSpec::FileState.new(attributes)] }
|
91
|
-
]
|
92
|
-
)
|
93
|
-
end
|
94
|
-
|
95
|
-
describe '.call' do
|
96
|
-
def apply
|
97
|
-
described_class.call(options)
|
98
|
-
end
|
99
|
-
|
100
|
-
before do
|
101
|
-
allow(pathname).to receive(:new, &file_system.method(:path))
|
102
|
-
end
|
103
|
-
|
104
|
-
it 'returns self' do
|
105
|
-
expect(apply).to be(described_class)
|
106
|
-
end
|
107
|
-
|
108
|
-
it 'walks the VM through expected steps' do
|
109
|
-
expect { apply }.to change(ruby_vm, :done?).from(false).to(true)
|
110
|
-
end
|
111
|
-
|
112
|
-
context 'when zombifier require fails' do
|
113
|
-
let(:file_entries) do
|
114
|
-
{}
|
115
|
-
end
|
116
|
-
|
117
|
-
it 'raises zombifier specific load error' do
|
118
|
-
expect { apply }.to raise_error(described_class::LoadError, 'Cannot find file "project.rb" in load path')
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
data/test_app/.rspec
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
--color
|
data/test_app/Gemfile.minitest
DELETED
data/test_app/Gemfile.rspec3.8
DELETED
data/test_app/lib/test_app.rb
DELETED
@@ -1,114 +0,0 @@
|
|
1
|
-
require 'adamantium'
|
2
|
-
|
3
|
-
original = $VERBOSE
|
4
|
-
# Silence intentional violations made to exercise the method matcher edge cases.
|
5
|
-
# This is NOT representative for could you should write!
|
6
|
-
$VERBOSE = false
|
7
|
-
# Namespace for test application
|
8
|
-
module TestApp
|
9
|
-
module InstanceMethodTests
|
10
|
-
module WithMemoizer
|
11
|
-
include Adamantium
|
12
|
-
|
13
|
-
def bar; end; def baz; end
|
14
|
-
eval('def boz; end')
|
15
|
-
def foo; end;
|
16
|
-
memoize :foo
|
17
|
-
end
|
18
|
-
|
19
|
-
module DefinedMultipleTimes
|
20
|
-
class DifferentLines
|
21
|
-
def foo
|
22
|
-
end
|
23
|
-
|
24
|
-
def foo(_arg)
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
class SameLineSameScope
|
29
|
-
def foo; end; def foo(_arg); end
|
30
|
-
end
|
31
|
-
|
32
|
-
class SameLineDifferentScope
|
33
|
-
def self.foo; end; def foo(_arg); end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
class InClassEval
|
38
|
-
class_eval do
|
39
|
-
def foo
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
|
44
|
-
class InModuleEval
|
45
|
-
module_eval do
|
46
|
-
def foo
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
class InInstanceEval
|
52
|
-
module_eval do
|
53
|
-
def foo
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
module SingletonMethodTests
|
60
|
-
module DefinedOnSelf
|
61
|
-
def self.foo; end
|
62
|
-
end
|
63
|
-
|
64
|
-
module DefinedOnLvar
|
65
|
-
a = self
|
66
|
-
def a.foo; end
|
67
|
-
end
|
68
|
-
|
69
|
-
module DefinedOnConstant
|
70
|
-
module InsideNamespace
|
71
|
-
def InsideNamespace.foo
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
module OutsideNamespace
|
76
|
-
end
|
77
|
-
|
78
|
-
def OutsideNamespace.foo
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
module DefinedMultipleTimes
|
83
|
-
module DifferentLines
|
84
|
-
def self.foo
|
85
|
-
end
|
86
|
-
|
87
|
-
def self.foo(_arg)
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
module SameLine
|
92
|
-
module SameScope
|
93
|
-
def self.foo; end; def self.foo(_arg); end
|
94
|
-
end
|
95
|
-
|
96
|
-
module DifferentScope
|
97
|
-
def self.foo; end; def DifferentScope.foo(_arg); end; def SingletonMethodTests.foo; end
|
98
|
-
end
|
99
|
-
|
100
|
-
module DifferentName
|
101
|
-
def self.foo; end; def self.bar(_arg); end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def self.root
|
108
|
-
File.expand_path('..', __dir__)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
require 'test_app/metaclasses'
|
113
|
-
require 'test_app/literal'
|
114
|
-
$VERBOSE = original
|