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
@@ -18,7 +18,7 @@ module Mutest
|
|
18
18
|
def call
|
19
19
|
quantify(ast(*expression.members))
|
20
20
|
end
|
21
|
-
end
|
21
|
+
end
|
22
22
|
|
23
23
|
# Mapper from `Parser::AST::Node` to `Regexp::Expression`
|
24
24
|
class ASTToExpression < Transformer::ASTToExpression
|
@@ -38,9 +38,9 @@ module Mutest
|
|
38
38
|
expression.members = node.children
|
39
39
|
end
|
40
40
|
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -28,7 +28,7 @@ module Mutest
|
|
28
28
|
def call
|
29
29
|
quantify(ast)
|
30
30
|
end
|
31
|
-
end
|
31
|
+
end
|
32
32
|
|
33
33
|
# Mapper from `Parser::AST::Node` to `Regexp::Expression`
|
34
34
|
class ASTToExpression < Transformer::ASTToExpression
|
@@ -91,11 +91,11 @@ module Mutest
|
|
91
91
|
def transform
|
92
92
|
expression_class.new(expression_token)
|
93
93
|
end
|
94
|
-
end
|
94
|
+
end
|
95
95
|
|
96
96
|
ASTToExpression::TABLE.types.each(&method(:register))
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
@@ -14,7 +14,7 @@ module Mutest
|
|
14
14
|
def call
|
15
15
|
quantify(ast(expression.options, *children))
|
16
16
|
end
|
17
|
-
end
|
17
|
+
end
|
18
18
|
|
19
19
|
# Mapper from `Parser::AST::Node` to `Regexp::Expression`
|
20
20
|
class ASTToExpression < Transformer::ASTToExpression
|
@@ -57,9 +57,9 @@ module Mutest
|
|
57
57
|
|
58
58
|
"(?#{flags}-:"
|
59
59
|
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -21,7 +21,7 @@ module Mutest
|
|
21
21
|
def type
|
22
22
|
:"regexp_#{expression.mode}_#{expression.token}"
|
23
23
|
end
|
24
|
-
end
|
24
|
+
end
|
25
25
|
|
26
26
|
# Mapper from `Parser::AST::Node` to `Regexp::Expression`
|
27
27
|
class ASTToExpression < Transformer::ASTToExpression
|
@@ -101,9 +101,7 @@ module Mutest
|
|
101
101
|
def initialize(*)
|
102
102
|
super
|
103
103
|
|
104
|
-
unless valid_min? && valid_max?
|
105
|
-
fail ArgumentError, 'Unexpected quantifier interval bound.'
|
106
|
-
end
|
104
|
+
raise ArgumentError, 'Unexpected quantifier interval bound.' unless valid_min? && valid_max?
|
107
105
|
end
|
108
106
|
|
109
107
|
def to_s
|
@@ -113,7 +111,7 @@ module Mutest
|
|
113
111
|
private
|
114
112
|
|
115
113
|
def compacted_interval
|
116
|
-
[min, max].map { |bound| bound if bound
|
114
|
+
[min, max].map { |bound| bound if bound.positive? }.uniq
|
117
115
|
end
|
118
116
|
|
119
117
|
def valid_min?
|
@@ -121,14 +119,14 @@ module Mutest
|
|
121
119
|
end
|
122
120
|
|
123
121
|
def valid_max?
|
124
|
-
max
|
122
|
+
max.positive? || max.equal?(-1)
|
125
123
|
end
|
126
|
-
end
|
127
|
-
end
|
124
|
+
end
|
125
|
+
end
|
128
126
|
|
129
127
|
ASTToExpression::QUANTIFIER_MAP.keys.each(&method(:register))
|
130
|
-
end
|
131
|
-
end
|
132
|
-
end
|
133
|
-
end
|
134
|
-
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
end
|
@@ -12,7 +12,7 @@ module Mutest
|
|
12
12
|
def call
|
13
13
|
quantify(ast(*children))
|
14
14
|
end
|
15
|
-
end
|
15
|
+
end
|
16
16
|
|
17
17
|
# Mapper from `Parser::AST::Node` to `Regexp::Expression`
|
18
18
|
class ASTToExpression < Transformer::ASTToExpression
|
@@ -40,11 +40,11 @@ module Mutest
|
|
40
40
|
expression.expressions = subexpressions
|
41
41
|
end
|
42
42
|
end
|
43
|
-
end
|
43
|
+
end
|
44
44
|
|
45
45
|
ASTToExpression::TABLE.types.each(&method(:register))
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -12,7 +12,7 @@ module Mutest
|
|
12
12
|
def call
|
13
13
|
quantify(ast(expression.text))
|
14
14
|
end
|
15
|
-
end
|
15
|
+
end
|
16
16
|
|
17
17
|
# Mapper from `Parser::AST::Node` to `Regexp::Expression`
|
18
18
|
class ASTToExpression < Transformer::ASTToExpression
|
@@ -47,11 +47,11 @@ module Mutest
|
|
47
47
|
token.text = Util.one(node.children)
|
48
48
|
expression_class.new(token)
|
49
49
|
end
|
50
|
-
end
|
50
|
+
end
|
51
51
|
|
52
52
|
ASTToExpression::TABLE.types.each(&method(:register))
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
data/lib/mutest/ast/sexp.rb
CHANGED
data/lib/mutest/ast/types.rb
CHANGED
@@ -132,10 +132,12 @@ module Mutest
|
|
132
132
|
# Nodes that are NOT generated by parser but used by mutest / unparser.
|
133
133
|
GENERATED = symbolset.(%w[empty])
|
134
134
|
|
135
|
-
|
135
|
+
# Nodes missing from parser metadata
|
136
|
+
MISSING = Set.new(%i[index indexasgn lambda procarg0]).freeze
|
136
137
|
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
end
|
138
|
+
ALL = Set.new(
|
139
|
+
(Parser::Meta::NODE_TYPES + GENERATED + REGEXP + MISSING) - BLACKLIST
|
140
|
+
).freeze
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
data/lib/mutest/cli.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
module Mutest
|
2
2
|
# Commandline parser / runner
|
3
3
|
class CLI
|
4
|
-
include
|
4
|
+
include Procto.call(:config)
|
5
|
+
include Equalizer.new(:config)
|
6
|
+
include Adamantium::Flat
|
5
7
|
|
6
8
|
# Error failed when CLI argv is invalid
|
7
9
|
Error = Class.new(RuntimeError)
|
@@ -192,5 +194,5 @@ module Mutest
|
|
192
194
|
def add_matcher(attribute, value)
|
193
195
|
with(matcher: config.matcher.add(attribute, value))
|
194
196
|
end
|
195
|
-
end
|
196
|
-
end
|
197
|
+
end
|
198
|
+
end
|
data/lib/mutest/color.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Mutest
|
2
2
|
# Class to colorize strings
|
3
3
|
class Color
|
4
|
-
include
|
4
|
+
include Concord.new(:code)
|
5
|
+
include Adamantium::Flat
|
5
6
|
|
6
7
|
# Format text with color
|
7
8
|
#
|
@@ -35,5 +36,5 @@ module Mutest
|
|
35
36
|
RED = Color.new(31)
|
36
37
|
GREEN = Color.new(32)
|
37
38
|
BLUE = Color.new(34)
|
38
|
-
end
|
39
|
-
end
|
39
|
+
end
|
40
|
+
end
|
data/lib/mutest/config.rb
CHANGED
@@ -4,7 +4,7 @@ module Mutest
|
|
4
4
|
# Does not reference any "external" volatile state. The configuration applied
|
5
5
|
# to current environment is being represented by the Mutest::Env object.
|
6
6
|
class Config
|
7
|
-
include
|
7
|
+
include Anima.new(
|
8
8
|
:expression_parser,
|
9
9
|
:fail_fast,
|
10
10
|
:integration,
|
@@ -21,9 +21,10 @@ module Mutest
|
|
21
21
|
:reporter,
|
22
22
|
:zombie
|
23
23
|
)
|
24
|
+
include Adamantium::Flat
|
24
25
|
|
25
26
|
%i[fail_fast zombie].each do |name|
|
26
27
|
define_method(:"#{name}?") { public_send(name) }
|
27
28
|
end
|
28
|
-
end
|
29
|
-
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/mutest/context.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Mutest
|
2
2
|
# An abstract context where mutations can be applied to.
|
3
3
|
class Context
|
4
|
-
include
|
4
|
+
include Concord::Public.new(:scope, :source_file)
|
5
|
+
include Adamantium::Flat
|
5
6
|
extend AST::Sexp
|
6
7
|
|
7
8
|
NAMESPACE_DELIMITER = '::'.freeze
|
@@ -94,5 +95,5 @@ module Mutest
|
|
94
95
|
scope.name.split(NAMESPACE_DELIMITER)
|
95
96
|
end
|
96
97
|
memoize :name_nesting
|
97
|
-
end
|
98
|
-
end
|
98
|
+
end
|
99
|
+
end
|
data/lib/mutest/diff.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module Mutest
|
2
2
|
# Class to create diffs from source code
|
3
3
|
class Diff
|
4
|
-
include
|
4
|
+
include Concord.new(:old, :new)
|
5
|
+
include Adamantium::Flat
|
5
6
|
|
6
7
|
ADDITION = '+'.freeze
|
7
8
|
DELETION = '-'.freeze
|
@@ -30,6 +31,7 @@ module Mutest
|
|
30
31
|
# otherwise
|
31
32
|
def colorized_diff
|
32
33
|
return unless diff
|
34
|
+
|
33
35
|
diff.lines.map(&self.class.method(:colorize_line)).join
|
34
36
|
end
|
35
37
|
memoize :colorized_diff
|
@@ -107,5 +109,5 @@ module Mutest
|
|
107
109
|
end.format(line)
|
108
110
|
end
|
109
111
|
private_class_method :colorize_line
|
110
|
-
end
|
111
|
-
end
|
112
|
+
end
|
113
|
+
end
|
data/lib/mutest/env.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Mutest
|
2
2
|
# Abstract base class for mutest environments
|
3
3
|
class Env
|
4
|
-
include
|
4
|
+
include Anima.new(
|
5
5
|
:actor_env,
|
6
6
|
:config,
|
7
7
|
:integration,
|
@@ -11,6 +11,7 @@ module Mutest
|
|
11
11
|
:selector,
|
12
12
|
:subjects
|
13
13
|
)
|
14
|
+
include Adamantium::Flat
|
14
15
|
|
15
16
|
SEMANTICS_MESSAGE =
|
16
17
|
"Fix your lib to follow normal ruby semantics!\n" \
|
@@ -33,8 +34,7 @@ module Mutest
|
|
33
34
|
|
34
35
|
# Kill mutation under isolation with integration
|
35
36
|
#
|
36
|
-
# @param [
|
37
|
-
# @param [Integration] integration
|
37
|
+
# @param [Mutation] mutation
|
38
38
|
#
|
39
39
|
# @return [Result::Test]
|
40
40
|
#
|
@@ -55,5 +55,5 @@ module Mutest
|
|
55
55
|
tests: tests
|
56
56
|
)
|
57
57
|
end
|
58
|
-
end
|
59
|
-
end
|
58
|
+
end
|
59
|
+
end
|
data/lib/mutest/env/bootstrap.rb
CHANGED
@@ -2,7 +2,9 @@ module Mutest
|
|
2
2
|
class Env
|
3
3
|
# Bootstrap environment
|
4
4
|
class Bootstrap
|
5
|
-
include
|
5
|
+
include Procto.call(:env)
|
6
|
+
include Concord::Public.new(:config)
|
7
|
+
include Adamantium::Flat
|
6
8
|
|
7
9
|
SEMANTICS_MESSAGE_FORMAT =
|
8
10
|
"%<message>s. Fix your lib to follow normal ruby semantics!\n" \
|
@@ -83,7 +85,7 @@ module Mutest
|
|
83
85
|
# otherwise
|
84
86
|
def scope_name(scope)
|
85
87
|
scope.name
|
86
|
-
rescue => exception
|
88
|
+
rescue StandardError => exception
|
87
89
|
semantics_warning(
|
88
90
|
CLASS_NAME_RAISED_EXCEPTION,
|
89
91
|
exception: exception.inspect,
|
@@ -154,6 +156,6 @@ module Mutest
|
|
154
156
|
message = format % options
|
155
157
|
warn(format(SEMANTICS_MESSAGE_FORMAT, message: message))
|
156
158
|
end
|
157
|
-
end
|
158
|
-
end
|
159
|
-
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
data/lib/mutest/expression.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Mutest
|
2
2
|
# Abstract base class for match expression
|
3
3
|
class Expression
|
4
|
-
include
|
4
|
+
include Adamantium::Flat
|
5
|
+
include AbstractType
|
5
6
|
|
6
7
|
fragment = /[A-Za-z][A-Za-z\d_]*/
|
7
|
-
SCOPE_NAME_PATTERN = /(?<scope_name>#{fragment}(?:#{SCOPE_OPERATOR}#{fragment})*)
|
8
|
+
SCOPE_NAME_PATTERN = /(?<scope_name>#{fragment}(?:#{SCOPE_OPERATOR}#{fragment})*)/.freeze
|
8
9
|
SCOPE_SYMBOL_PATTERN = '(?<scope_symbol>[.#])'.freeze
|
9
10
|
|
10
11
|
private_constant(*constants(false))
|
@@ -48,8 +49,9 @@ module Mutest
|
|
48
49
|
def self.try_parse(input)
|
49
50
|
match = self::REGEXP.match(input)
|
50
51
|
return unless match
|
52
|
+
|
51
53
|
names = anima.attribute_names
|
52
|
-
new(Hash[names.zip(names.map(&match.
|
54
|
+
new(Hash[names.zip(names.map(&match.public_method(:[])))])
|
53
55
|
end
|
54
|
-
end
|
55
|
-
end
|
56
|
+
end
|
57
|
+
end
|
@@ -22,7 +22,7 @@ module Mutest
|
|
22
22
|
|
23
23
|
private_constant(*constants(false))
|
24
24
|
|
25
|
-
REGEXP = /\A#{SCOPE_NAME_PATTERN}#{SCOPE_SYMBOL_PATTERN}#{METHOD_NAME_PATTERN}\z
|
25
|
+
REGEXP = /\A#{SCOPE_NAME_PATTERN}#{SCOPE_SYMBOL_PATTERN}#{METHOD_NAME_PATTERN}\z/.freeze
|
26
26
|
|
27
27
|
# Syntax of expression
|
28
28
|
#
|
@@ -49,6 +49,6 @@ module Mutest
|
|
49
49
|
def scope
|
50
50
|
Object.const_get(scope_name)
|
51
51
|
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|