mutest 0.0.9 → 0.0.10
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 +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
|
|