mutest 0.0.9 → 0.0.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.circleci/config.yml +38 -0
- data/{config/rubocop.yml → .rubocop.yml} +80 -183
- data/CHANGELOG.md +8 -0
- data/Gemfile +2 -3
- data/Gemfile.lock +41 -52
- data/README.md +16 -0
- data/Rakefile +1 -1
- data/lib/mutest.rb +5 -4
- data/lib/mutest/actor.rb +7 -6
- data/lib/mutest/actor/env.rb +3 -3
- data/lib/mutest/actor/mailbox.rb +5 -4
- data/lib/mutest/actor/receiver.rb +6 -5
- data/lib/mutest/actor/sender.rb +5 -4
- data/lib/mutest/ast.rb +4 -3
- data/lib/mutest/ast/meta.rb +3 -3
- data/lib/mutest/ast/meta/const.rb +7 -5
- data/lib/mutest/ast/meta/optarg.rb +6 -5
- data/lib/mutest/ast/meta/resbody.rb +6 -5
- data/lib/mutest/ast/meta/restarg.rb +6 -5
- data/lib/mutest/ast/meta/send.rb +8 -20
- data/lib/mutest/ast/meta/symbol.rb +6 -5
- data/lib/mutest/ast/named_children.rb +5 -5
- data/lib/mutest/ast/node_predicates.rb +4 -4
- data/lib/mutest/ast/nodes.rb +3 -3
- data/lib/mutest/ast/regexp.rb +3 -3
- data/lib/mutest/ast/regexp/transformer.rb +19 -11
- data/lib/mutest/ast/regexp/transformer/alternative.rb +6 -6
- data/lib/mutest/ast/regexp/transformer/character_set.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/direct.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/options_group.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/quantifier.rb +11 -13
- data/lib/mutest/ast/regexp/transformer/recursive.rb +7 -7
- data/lib/mutest/ast/regexp/transformer/root.rb +6 -6
- data/lib/mutest/ast/regexp/transformer/text.rb +7 -7
- data/lib/mutest/ast/sexp.rb +3 -3
- data/lib/mutest/ast/types.rb +8 -6
- data/lib/mutest/cli.rb +5 -3
- data/lib/mutest/color.rb +4 -3
- data/lib/mutest/config.rb +4 -3
- data/lib/mutest/context.rb +4 -3
- data/lib/mutest/diff.rb +5 -3
- data/lib/mutest/env.rb +5 -5
- data/lib/mutest/env/bootstrap.rb +7 -5
- data/lib/mutest/expression.rb +7 -5
- data/lib/mutest/expression/method.rb +4 -4
- data/lib/mutest/expression/methods.rb +4 -4
- data/lib/mutest/expression/namespace.rb +9 -8
- data/lib/mutest/expression/parser.rb +9 -8
- data/lib/mutest/integration.rb +5 -3
- data/lib/mutest/integration/null.rb +3 -3
- data/lib/mutest/isolation.rb +2 -2
- data/lib/mutest/isolation/fork.rb +4 -4
- data/lib/mutest/isolation/none.rb +4 -4
- data/lib/mutest/loader.rb +2 -2
- data/lib/mutest/matcher.rb +4 -3
- data/lib/mutest/matcher/chain.rb +3 -3
- data/lib/mutest/matcher/compiler.rb +7 -5
- data/lib/mutest/matcher/config.rb +5 -4
- data/lib/mutest/matcher/filter.rb +3 -3
- data/lib/mutest/matcher/method.rb +13 -13
- data/lib/mutest/matcher/method/instance.rb +6 -6
- data/lib/mutest/matcher/method/singleton.rb +5 -5
- data/lib/mutest/matcher/methods.rb +7 -6
- data/lib/mutest/matcher/namespace.rb +3 -3
- data/lib/mutest/matcher/null.rb +3 -3
- data/lib/mutest/matcher/scope.rb +3 -3
- data/lib/mutest/matcher/static.rb +3 -3
- data/lib/mutest/meta.rb +4 -4
- data/lib/mutest/meta/example.rb +5 -4
- data/lib/mutest/meta/example/dsl.rb +12 -11
- data/lib/mutest/meta/example/verification.rb +7 -6
- data/lib/mutest/mutation.rb +7 -6
- data/lib/mutest/mutator.rb +6 -6
- data/lib/mutest/mutator/node.rb +19 -7
- data/lib/mutest/mutator/node/and_asgn.rb +4 -4
- data/lib/mutest/mutator/node/argument.rb +6 -5
- data/lib/mutest/mutator/node/arguments.rb +18 -5
- data/lib/mutest/mutator/node/begin.rb +4 -4
- data/lib/mutest/mutator/node/binary.rb +4 -4
- data/lib/mutest/mutator/node/block.rb +6 -5
- data/lib/mutest/mutator/node/block_pass.rb +4 -4
- data/lib/mutest/mutator/node/break.rb +4 -4
- data/lib/mutest/mutator/node/case.rb +6 -4
- data/lib/mutest/mutator/node/class.rb +4 -4
- data/lib/mutest/mutator/node/conditional_loop.rb +4 -4
- data/lib/mutest/mutator/node/const.rb +4 -4
- data/lib/mutest/mutator/node/define.rb +6 -6
- data/lib/mutest/mutator/node/defined.rb +4 -4
- data/lib/mutest/mutator/node/dstr.rb +4 -4
- data/lib/mutest/mutator/node/dsym.rb +4 -4
- data/lib/mutest/mutator/node/generic.rb +5 -4
- data/lib/mutest/mutator/node/if.rb +6 -4
- data/lib/mutest/mutator/node/index.rb +128 -0
- data/lib/mutest/mutator/node/kwbegin.rb +4 -4
- data/lib/mutest/mutator/node/literal.rb +4 -4
- data/lib/mutest/mutator/node/literal/array.rb +8 -6
- data/lib/mutest/mutator/node/literal/boolean.rb +5 -5
- data/lib/mutest/mutator/node/literal/fixnum.rb +5 -5
- data/lib/mutest/mutator/node/literal/float.rb +5 -5
- data/lib/mutest/mutator/node/literal/hash.rb +6 -6
- data/lib/mutest/mutator/node/literal/nil.rb +5 -5
- data/lib/mutest/mutator/node/literal/range.rb +5 -5
- data/lib/mutest/mutator/node/literal/regex.rb +5 -5
- data/lib/mutest/mutator/node/literal/string.rb +5 -5
- data/lib/mutest/mutator/node/literal/symbol.rb +5 -5
- data/lib/mutest/mutator/node/masgn.rb +4 -4
- data/lib/mutest/mutator/node/match_current_line.rb +4 -4
- data/lib/mutest/mutator/node/mlhs.rb +4 -4
- data/lib/mutest/mutator/node/named_value/access.rb +6 -6
- data/lib/mutest/mutator/node/named_value/constant_assignment.rb +6 -5
- data/lib/mutest/mutator/node/named_value/variable_assignment.rb +5 -5
- data/lib/mutest/mutator/node/next.rb +4 -4
- data/lib/mutest/mutator/node/nthref.rb +4 -4
- data/lib/mutest/mutator/node/op_asgn.rb +4 -4
- data/lib/mutest/mutator/node/or_asgn.rb +5 -4
- data/lib/mutest/mutator/node/procarg_zero.rb +45 -0
- data/lib/mutest/mutator/node/regexp.rb +6 -6
- data/lib/mutest/mutator/node/regexp/alternation_meta.rb +5 -5
- data/lib/mutest/mutator/node/regexp/capture_group.rb +5 -5
- data/lib/mutest/mutator/node/regexp/character_type.rb +5 -5
- data/lib/mutest/mutator/node/regexp/end_of_line_anchor.rb +5 -5
- data/lib/mutest/mutator/node/regexp/end_of_string_or_before_end_of_line_anchor.rb +5 -5
- data/lib/mutest/mutator/node/regexp/one_or_more.rb +5 -5
- data/lib/mutest/mutator/node/regexp/zero_or_more.rb +5 -5
- data/lib/mutest/mutator/node/regopt.rb +4 -4
- data/lib/mutest/mutator/node/resbody.rb +6 -4
- data/lib/mutest/mutator/node/rescue.rb +6 -4
- data/lib/mutest/mutator/node/return.rb +5 -4
- data/lib/mutest/mutator/node/send.rb +6 -34
- data/lib/mutest/mutator/node/send/attribute_assignment.rb +5 -5
- data/lib/mutest/mutator/node/send/binary.rb +5 -5
- data/lib/mutest/mutator/node/send/conditional.rb +5 -5
- data/lib/mutest/mutator/node/splat.rb +4 -4
- data/lib/mutest/mutator/node/super.rb +4 -4
- data/lib/mutest/mutator/node/when.rb +4 -4
- data/lib/mutest/mutator/node/yield.rb +4 -4
- data/lib/mutest/mutator/node/zsuper.rb +4 -4
- data/lib/mutest/mutator/util.rb +3 -3
- data/lib/mutest/mutator/util/array.rb +6 -6
- data/lib/mutest/mutator/util/symbol.rb +4 -4
- data/lib/mutest/parallel.rb +16 -12
- data/lib/mutest/parallel/master.rb +4 -4
- data/lib/mutest/parallel/source.rb +6 -5
- data/lib/mutest/parallel/worker.rb +6 -5
- data/lib/mutest/parser.rb +4 -3
- data/lib/mutest/registry.rb +6 -5
- data/lib/mutest/reporter.rb +2 -2
- data/lib/mutest/reporter/cli.rb +3 -3
- data/lib/mutest/reporter/cli/format.rb +9 -8
- data/lib/mutest/reporter/cli/printer.rb +8 -8
- data/lib/mutest/reporter/cli/printer/config.rb +5 -5
- data/lib/mutest/reporter/cli/printer/env_progress.rb +16 -16
- data/lib/mutest/reporter/cli/printer/env_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/mutation_progress_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/mutation_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/status.rb +6 -5
- data/lib/mutest/reporter/cli/printer/status_progressive.rb +5 -5
- data/lib/mutest/reporter/cli/printer/subject_progress.rb +5 -5
- data/lib/mutest/reporter/cli/printer/subject_result.rb +5 -5
- data/lib/mutest/reporter/cli/printer/test_result.rb +5 -5
- data/lib/mutest/reporter/cli/tput.rb +6 -5
- data/lib/mutest/reporter/null.rb +3 -3
- data/lib/mutest/reporter/sequence.rb +3 -3
- data/lib/mutest/repository.rb +9 -7
- data/lib/mutest/require_highjack.rb +2 -2
- data/lib/mutest/requirer.rb +2 -2
- data/lib/mutest/result.rb +18 -12
- data/lib/mutest/runner.rb +6 -3
- data/lib/mutest/runner/sink.rb +3 -3
- data/lib/mutest/scope.rb +2 -2
- data/lib/mutest/selector.rb +4 -3
- data/lib/mutest/selector/expression.rb +3 -3
- data/lib/mutest/source_file.rb +6 -5
- data/lib/mutest/subject.rb +5 -3
- data/lib/mutest/subject/method.rb +3 -3
- data/lib/mutest/subject/method/instance.rb +5 -5
- data/lib/mutest/subject/method/singleton.rb +4 -4
- data/lib/mutest/test.rb +4 -3
- data/lib/mutest/util.rb +3 -3
- data/lib/mutest/version.rb +2 -2
- data/lib/mutest/warning_filter.rb +3 -3
- data/lib/mutest/zombifier.rb +5 -4
- data/meta/block.rb +22 -3
- data/meta/case.rb +29 -1
- data/meta/index.rb +132 -0
- data/meta/indexasgn.rb +42 -0
- data/meta/lambda.rb +17 -0
- data/meta/send.rb +5 -139
- data/mutest-rspec.gemspec +1 -1
- data/mutest.gemspec +11 -12
- data/spec/integration/mutest/rspec_spec.rb +1 -1
- data/spec/shared/framework_integration_behavior.rb +1 -1
- data/spec/shared/idempotent_method_behavior.rb +2 -1
- data/spec/spec_helper.rb +5 -5
- data/spec/support/compress_helper.rb +2 -1
- data/spec/support/corpus.rb +12 -8
- data/spec/support/fake_actor.rb +19 -14
- data/spec/support/file_system.rb +10 -7
- data/spec/support/ice_nine_config.rb +3 -3
- data/spec/support/ruby_vm.rb +10 -11
- data/spec/support/shared_context.rb +1 -1
- data/spec/support/test_app.rb +1 -1
- data/spec/support/warning.rb +8 -7
- data/spec/support/xspec.rb +18 -17
- data/spec/unit/mutest/actor/binding_spec.rb +1 -0
- data/spec/unit/mutest/ast/meta/optarg_spec.rb +1 -0
- data/spec/unit/mutest/ast/meta/send/proc_predicate_spec.rb +1 -1
- data/spec/unit/mutest/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +1 -1
- data/spec/unit/mutest/ast/meta/send_spec.rb +14 -18
- data/spec/unit/mutest/ast/regexp_spec.rb +4 -3
- data/spec/unit/mutest/ast_spec.rb +1 -1
- data/spec/unit/mutest/cli_spec.rb +15 -15
- data/spec/unit/mutest/env/bootstrap_spec.rb +1 -1
- data/spec/unit/mutest/integration_spec.rb +1 -0
- data/spec/unit/mutest/isolation/none_spec.rb +1 -1
- data/spec/unit/mutest/matcher/config_spec.rb +1 -0
- data/spec/unit/mutest/mutator/node_spec.rb +1 -1
- data/spec/unit/mutest/parallel/master_spec.rb +3 -3
- data/spec/unit/mutest/reporter/cli/printer_spec.rb +2 -0
- data/spec/unit/mutest/reporter/cli/tput_spec.rb +2 -0
- data/spec/unit/mutest/reporter/cli_spec.rb +2 -0
- data/spec/unit/mutest/repository/diff_spec.rb +1 -1
- data/spec/unit/mutest/runner_spec.rb +1 -1
- data/spec/unit/mutest/subject_spec.rb +1 -1
- data/spec/unit/mutest/warning_filter_spec.rb +2 -3
- data/spec/unit/mutest/zombifier_spec.rb +1 -1
- data/test_app/Gemfile.rspec3.8 +7 -0
- metadata +67 -68
- data/.buildkite/hooks/pre-command +0 -3
- data/.buildkite/pipeline.yml +0 -38
- data/.gitmodules +0 -3
- data/circle.yml +0 -10
- data/config/triage.yml +0 -2
- data/config/yardstick.yml +0 -2
- data/lib/mutest/mutator/node/send/index.rb +0 -47
data/spec/support/xspec.rb
CHANGED
@@ -31,11 +31,11 @@ module XSpec
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def exception(_, exception)
|
34
|
-
|
34
|
+
raise exception
|
35
35
|
end
|
36
36
|
|
37
37
|
def yields(observation, yields)
|
38
|
-
block = observation.block or
|
38
|
+
block = observation.block or raise 'No block passed where expected'
|
39
39
|
|
40
40
|
validate_block_arity(observation, yields)
|
41
41
|
|
@@ -48,12 +48,13 @@ module XSpec
|
|
48
48
|
|
49
49
|
# block allows anything we can skip the check
|
50
50
|
return if observed.equal?(-1)
|
51
|
-
|
51
|
+
raise 'Optargs currently not supported' if observed < -1
|
52
|
+
|
52
53
|
block_arity_mismatch(observation, expected, observed) unless expected.equal?(observed)
|
53
54
|
end
|
54
55
|
|
55
56
|
def block_arity_mismatch(observation, expected, observed)
|
56
|
-
|
57
|
+
raise "block arity mismatch, expected #{expected} observed #{observed}\nobservation:\n#{observation.inspect}"
|
57
58
|
end
|
58
59
|
|
59
60
|
alias_method :yields_return, :yields
|
@@ -67,23 +68,23 @@ module XSpec
|
|
67
68
|
|
68
69
|
def self.assert_valid_events(event_list)
|
69
70
|
event_list.map(&:first).each do |event|
|
70
|
-
|
71
|
+
raise "Invalid event: #{event}" unless VALID_EVENTS.include?(event)
|
71
72
|
end
|
72
73
|
end
|
73
74
|
private_class_method :assert_valid_events
|
74
75
|
|
75
76
|
def self.assert_not_empty(event_list)
|
76
|
-
|
77
|
+
raise 'no events' if event_list.empty?
|
77
78
|
end
|
78
79
|
private_class_method :assert_not_empty
|
79
80
|
|
80
81
|
def self.assert_total(event_list)
|
81
82
|
return unless event_list[0..-2].map(&:first).any?(&TERMINATE_EVENTS.method(:include?))
|
82
83
|
|
83
|
-
|
84
|
+
raise "Reaction not total: #{event_list}"
|
84
85
|
end
|
85
86
|
private_class_method :assert_total
|
86
|
-
end
|
87
|
+
end
|
87
88
|
|
88
89
|
class MessageExpectation
|
89
90
|
include Anima.new(:receiver, :selector, :arguments, :reaction)
|
@@ -118,30 +119,30 @@ module XSpec
|
|
118
119
|
end
|
119
120
|
|
120
121
|
def error(message)
|
121
|
-
|
122
|
+
raise "#{message},\n observation:\n #{observation.inspect}\n expectation:\n #{expectation.inspect}"
|
122
123
|
end
|
123
124
|
|
124
125
|
def trigger_exception
|
125
126
|
exception = expectation.exception
|
126
|
-
|
127
|
+
raise exception if exception
|
127
128
|
end
|
128
|
-
end
|
129
|
-
end
|
129
|
+
end
|
130
|
+
end
|
130
131
|
|
131
132
|
class MessageObservation
|
132
133
|
include Anima.new(:receiver, :selector, :arguments, :block)
|
133
|
-
end
|
134
|
+
end
|
134
135
|
|
135
136
|
class ExpectationVerifier
|
136
137
|
include Concord.new(:expectations)
|
137
138
|
|
138
139
|
def call(observation)
|
139
|
-
expectation = expectations.shift or
|
140
|
+
expectation = expectations.shift or raise "No expected message but observed #{observation}"
|
140
141
|
expectation.call(observation)
|
141
142
|
end
|
142
143
|
|
143
144
|
def assert_done
|
144
|
-
expectations.empty? or
|
145
|
+
expectations.empty? or raise "unconsumed expectations:\n#{expectations.map(&:inspect).join}"
|
145
146
|
end
|
146
147
|
|
147
148
|
# rubocop:disable MethodLength
|
@@ -171,5 +172,5 @@ module XSpec
|
|
171
172
|
|
172
173
|
verifier.assert_done
|
173
174
|
end
|
174
|
-
end
|
175
|
-
end
|
175
|
+
end
|
176
|
+
end
|
@@ -2,7 +2,7 @@ RSpec.describe Mutest::AST::Meta::Send, '#proc?' do
|
|
2
2
|
subject { described_class.new(node).proc? }
|
3
3
|
|
4
4
|
shared_context 'proc send' do |source|
|
5
|
-
let(:node) {
|
5
|
+
let(:node) { Unparser.parse(source).children.first }
|
6
6
|
end
|
7
7
|
|
8
8
|
shared_examples 'proc definition' do |*args|
|
@@ -2,7 +2,7 @@ RSpec.describe Mutest::AST::Meta::Send, '#receiver_possible_top_level_const?' do
|
|
2
2
|
subject { described_class.new(node).receiver_possible_top_level_const? }
|
3
3
|
|
4
4
|
def parse(source)
|
5
|
-
|
5
|
+
Unparser.parse(source)
|
6
6
|
end
|
7
7
|
|
8
8
|
context 'when implicit top level const' do
|
@@ -7,35 +7,31 @@ RSpec.describe Mutest::AST::Meta::Send do
|
|
7
7
|
|
8
8
|
let(:method_call) { parse('foo.bar(baz)') }
|
9
9
|
let(:attribute_read) { parse('foo.bar') }
|
10
|
-
let(:index_assignment) { parse('foo[0] = bar') }
|
11
10
|
let(:attribute_assignment) { parse('foo.bar = baz') }
|
12
11
|
let(:binary_method_operator) { parse('foo == bar') }
|
13
12
|
let(:method_method_call) { parse('foo.method(:bar)') }
|
14
13
|
let(:public_method_call) { parse("foo.public_method('bar')") }
|
15
14
|
|
16
15
|
class Expectation
|
17
|
-
include
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
:method_object_selector
|
25
|
-
)
|
16
|
+
include Anima.new(
|
17
|
+
:name,
|
18
|
+
:attribute_assignment,
|
19
|
+
:binary_method_operator,
|
20
|
+
:method_object_selector
|
21
|
+
)
|
22
|
+
include Adamantium
|
26
23
|
|
27
24
|
ALL = [
|
28
|
-
[:method_call, false, false, false
|
29
|
-
[:attribute_read, false, false, false
|
30
|
-
[:
|
31
|
-
[:
|
32
|
-
[:
|
33
|
-
[:
|
34
|
-
[:public_method_call, false, false, false, false, true]
|
25
|
+
[:method_call, false, false, false],
|
26
|
+
[:attribute_read, false, false, false],
|
27
|
+
[:attribute_assignment, true, false, false],
|
28
|
+
[:binary_method_operator, false, true, false],
|
29
|
+
[:method_method_call, false, false, true],
|
30
|
+
[:public_method_call, false, false, true]
|
35
31
|
].map do |values|
|
36
32
|
new(Hash[anima.attribute_names.zip(values)])
|
37
33
|
end.freeze
|
38
|
-
end
|
34
|
+
end
|
39
35
|
|
40
36
|
# Rspec should have a build in for this kind of "n-dimensional assertion with context"
|
41
37
|
(Expectation.anima.attribute_names - %i[name]).each do |name|
|
@@ -20,8 +20,8 @@ module RegexpSpec
|
|
20
20
|
NONE = Object.new.freeze
|
21
21
|
|
22
22
|
include Equalizer.new(:token, :text, :mode, :min, :max)
|
23
|
-
end
|
24
|
-
end
|
23
|
+
end
|
24
|
+
end
|
25
25
|
|
26
26
|
RSpec.shared_context 'regexp transformation' do
|
27
27
|
let(:parsed) { Mutest::AST::Regexp.parse(regexp) }
|
@@ -66,6 +66,7 @@ module RegexpSpec
|
|
66
66
|
RSpec.describe Mutest::AST::Regexp::Transformer.lookup(type) do
|
67
67
|
context "when mapping #{regexp.inspect}" do
|
68
68
|
let(:regexp) { regexp }
|
69
|
+
|
69
70
|
let(:expected, &block)
|
70
71
|
|
71
72
|
include_context 'regexp transformation'
|
@@ -74,7 +75,7 @@ module RegexpSpec
|
|
74
75
|
end
|
75
76
|
end
|
76
77
|
end
|
77
|
-
end
|
78
|
+
end
|
78
79
|
|
79
80
|
RegexpSpec.expect_mapping(/A/, :regexp_root_expression) do
|
80
81
|
s(:regexp_root_expression,
|
@@ -28,7 +28,7 @@ RSpec.describe Mutest::AST do
|
|
28
28
|
end
|
29
29
|
|
30
30
|
context 'on non Parser::AST::Node child' do
|
31
|
-
let(:block) { ->(node) {
|
31
|
+
let(:block) { ->(node) { raise if node.equal?(child_a) } }
|
32
32
|
let(:child_a) { AST::Node.new(:foo) }
|
33
33
|
|
34
34
|
it 'does not yield that node' do
|
@@ -107,21 +107,21 @@ RSpec.describe Mutest::CLI do
|
|
107
107
|
it_behaves_like 'a cli parser'
|
108
108
|
|
109
109
|
let(:expected_message) do
|
110
|
-
|
111
|
-
usage: mutest [options] MATCH_EXPRESSION ...
|
112
|
-
Environment:
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
Options:
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
110
|
+
<<~MESSAGE
|
111
|
+
usage: mutest [options] MATCH_EXPRESSION ...
|
112
|
+
Environment:
|
113
|
+
--zombie Run mutest zombified
|
114
|
+
-I, --include DIRECTORY Add DIRECTORY to $LOAD_PATH
|
115
|
+
-r, --require NAME Require file with NAME
|
116
|
+
-j, --jobs NUMBER Number of kill jobs. Defaults to number of processors.
|
117
|
+
|
118
|
+
Options:
|
119
|
+
--use INTEGRATION Use INTEGRATION to kill mutations
|
120
|
+
--ignore-subject EXPRESSION Ignore subjects that match EXPRESSION as prefix
|
121
|
+
--since REVISION Only select subjects touched since REVISION
|
122
|
+
--fail-fast Fail fast
|
123
|
+
--version Print mutests version
|
124
|
+
-h, --help Show this message
|
125
125
|
MESSAGE
|
126
126
|
end
|
127
127
|
end
|
@@ -10,6 +10,7 @@ RSpec.describe Mutest::Matcher::Config do
|
|
10
10
|
|
11
11
|
context 'with one expression' do
|
12
12
|
let(:object) { described_class::DEFAULT.add(:match_expressions, parse_expression('Foo')) }
|
13
|
+
|
13
14
|
it { is_expected.to eql('#<Mutest::Matcher::Config match_expressions: [Foo]>') }
|
14
15
|
end
|
15
16
|
|
@@ -5,7 +5,7 @@ Mutest::Meta::Example::ALL.each.group_by(&:node_type).each do |type, examples|
|
|
5
5
|
it "generates the correct mutations on #{toplevel_nodes} toplevel examples" do
|
6
6
|
examples.each do |example|
|
7
7
|
verification = example.verification
|
8
|
-
|
8
|
+
raise verification.error_report unless verification.success?
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -67,7 +67,7 @@ RSpec.describe Mutest::Parallel::Master do
|
|
67
67
|
def stop?
|
68
68
|
@stop
|
69
69
|
end
|
70
|
-
end
|
70
|
+
end
|
71
71
|
|
72
72
|
# Needed because of rubies undefined-ivar-read-is-nil stuff
|
73
73
|
describe 'object initialization' do
|
@@ -79,6 +79,8 @@ RSpec.describe Mutest::Parallel::Master do
|
|
79
79
|
end
|
80
80
|
|
81
81
|
describe '.call' do
|
82
|
+
subject { described_class.call(config) }
|
83
|
+
|
82
84
|
before do
|
83
85
|
expect(Mutest::Parallel::Worker).to receive(:run).with(
|
84
86
|
mailbox: actor_env.mailbox(:worker_a),
|
@@ -87,8 +89,6 @@ RSpec.describe Mutest::Parallel::Master do
|
|
87
89
|
).and_return(worker_a)
|
88
90
|
end
|
89
91
|
|
90
|
-
subject { described_class.call(config) }
|
91
|
-
|
92
92
|
context 'with multiple workers configured' do
|
93
93
|
let(:config) { super().with(jobs: 2) }
|
94
94
|
let(:expected_results) { [] }
|
@@ -67,6 +67,7 @@ RSpec.describe Mutest::Reporter::CLI::Printer do
|
|
67
67
|
|
68
68
|
context 'on failure' do
|
69
69
|
let(:success?) { false }
|
70
|
+
|
70
71
|
it_reports Mutest::Color::RED.format('foo bar') << "\n"
|
71
72
|
end
|
72
73
|
end
|
@@ -155,6 +156,7 @@ RSpec.describe Mutest::Reporter::CLI::Printer do
|
|
155
156
|
|
156
157
|
context 'when output is NOT a tty?' do
|
157
158
|
let(:tty?) { false }
|
159
|
+
|
158
160
|
it_reports "foo\n"
|
159
161
|
end
|
160
162
|
end
|
@@ -38,9 +38,11 @@ RSpec.describe Mutest::Reporter::CLI::Tput do
|
|
38
38
|
context 'when ed fails' do
|
39
39
|
let(:tput_ed?) { false }
|
40
40
|
let(:tput_cd?) { true }
|
41
|
+
|
41
42
|
before do
|
42
43
|
expect_command('tput cd', '[cd]', tput_cd?)
|
43
44
|
end
|
45
|
+
|
44
46
|
its(:prepare) { is_expected.to eql('[reset][sc]') }
|
45
47
|
its(:restore) { is_expected.to eql('[rc][cd]') }
|
46
48
|
end
|
@@ -82,11 +82,13 @@ RSpec.describe Mutest::Reporter::CLI do
|
|
82
82
|
|
83
83
|
context 'when on CI' do
|
84
84
|
let(:ci?) { true }
|
85
|
+
|
85
86
|
it { is_expected.to eql(described_class.new(output, progressive_format)) }
|
86
87
|
end
|
87
88
|
|
88
89
|
context 'when output is not a tty?' do
|
89
90
|
let(:tty?) { false }
|
91
|
+
|
90
92
|
it { is_expected.to eql(described_class.new(output, progressive_format)) }
|
91
93
|
end
|
92
94
|
|
@@ -31,7 +31,7 @@ describe Mutest::Repository::Diff do
|
|
31
31
|
expect(config.kernel).to receive(:system)
|
32
32
|
.ordered
|
33
33
|
.with(
|
34
|
-
*%W[git ls-files --error-unmatch -- #{path}],
|
34
|
+
*%W[git ls-files --error-unmatch -- #{path}], # rubocop:disable Lint/UnneededSplatExpansion
|
35
35
|
out: File::NULL,
|
36
36
|
err: File::NULL
|
37
37
|
).and_return(git_ls_success?)
|
@@ -39,7 +39,7 @@ RSpec.describe Mutest::Runner do
|
|
39
39
|
Mutest::Parallel::Config.new(
|
40
40
|
env: actor_env,
|
41
41
|
jobs: 1,
|
42
|
-
processor: ->(_object) {
|
42
|
+
processor: ->(_object) { raise },
|
43
43
|
sink: Mutest::Runner::Sink.new(env),
|
44
44
|
source: Mutest::Parallel::Source::Array.new(env.mutations)
|
45
45
|
)
|
@@ -54,8 +54,8 @@ RSpec.describe Mutest::WarningFilter do
|
|
54
54
|
it 'resets to original stderr after execution with exception ' do
|
55
55
|
original = $stderr
|
56
56
|
begin
|
57
|
-
object.use {
|
58
|
-
rescue
|
57
|
+
object.use { raise }
|
58
|
+
rescue StandardError
|
59
59
|
:make_rubo_cop_happy
|
60
60
|
end
|
61
61
|
expect($stderr).to be(original)
|
@@ -64,7 +64,6 @@ RSpec.describe Mutest::WarningFilter do
|
|
64
64
|
it 'returns warnings generated within block' do
|
65
65
|
warnings =
|
66
66
|
object.use do
|
67
|
-
# rubocop:disable Security/Eval
|
68
67
|
eval(<<-RUBY)
|
69
68
|
Class.new do
|
70
69
|
def foo
|
@@ -78,7 +78,7 @@ RSpec.describe Mutest::Zombifier do
|
|
78
78
|
let(:file_entries) do
|
79
79
|
{
|
80
80
|
'a/project.rb' => { file: true, contents: 'module Project; end' },
|
81
|
-
'b/bar.rb'
|
81
|
+
'b/bar.rb' => { file: true, contents: 'module Bar; end' }
|
82
82
|
}
|
83
83
|
end
|
84
84
|
|