mutant 0.8.8 → 0.8.9
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/Changelog.md +9 -0
- data/README.md +1 -1
- data/Rakefile +12 -8
- data/bin/mutant +5 -1
- data/config/flay.yml +1 -1
- data/lib/mutant.rb +18 -17
- data/lib/mutant/actor.rb +1 -7
- data/lib/mutant/actor/env.rb +0 -4
- data/lib/mutant/actor/mailbox.rb +0 -4
- data/lib/mutant/actor/receiver.rb +0 -4
- data/lib/mutant/actor/sender.rb +0 -2
- data/lib/mutant/ast.rb +1 -5
- data/lib/mutant/ast/meta/const.rb +0 -2
- data/lib/mutant/ast/meta/optarg.rb +0 -2
- data/lib/mutant/ast/meta/send.rb +0 -12
- data/lib/mutant/ast/named_children.rb +0 -10
- data/lib/mutant/ast/sexp.rb +1 -5
- data/lib/mutant/cli.rb +19 -38
- data/lib/mutant/color.rb +1 -7
- data/lib/mutant/config.rb +11 -7
- data/lib/mutant/context.rb +0 -4
- data/lib/mutant/context/scope.rb +0 -18
- data/lib/mutant/delegator.rb +0 -6
- data/lib/mutant/diff.rb +0 -18
- data/lib/mutant/env.rb +8 -24
- data/lib/mutant/env/bootstrap.rb +18 -41
- data/lib/mutant/expression.rb +0 -8
- data/lib/mutant/expression/method.rb +6 -7
- data/lib/mutant/expression/methods.rb +5 -9
- data/lib/mutant/expression/namespace.rb +0 -13
- data/lib/mutant/expression/parser.rb +0 -6
- data/lib/mutant/integration.rb +2 -20
- data/lib/mutant/isolation.rb +0 -4
- data/lib/mutant/loader.rb +20 -35
- data/lib/mutant/matcher.rb +1 -1
- data/lib/mutant/matcher/chain.rb +1 -3
- data/lib/mutant/matcher/compiler.rb +0 -8
- data/lib/mutant/matcher/config.rb +2 -10
- data/lib/mutant/matcher/filter.rb +1 -3
- data/lib/mutant/matcher/method.rb +4 -26
- data/lib/mutant/matcher/method/instance.rb +1 -7
- data/lib/mutant/matcher/method/singleton.rb +0 -12
- data/lib/mutant/matcher/methods.rb +1 -19
- data/lib/mutant/matcher/namespace.rb +1 -7
- data/lib/mutant/matcher/null.rb +1 -3
- data/lib/mutant/matcher/scope.rb +1 -5
- data/lib/mutant/matcher/static.rb +0 -2
- data/lib/mutant/meta.rb +0 -2
- data/lib/mutant/meta/example.rb +0 -28
- data/lib/mutant/meta/example/dsl.rb +2 -16
- data/lib/mutant/mutation.rb +9 -18
- data/lib/mutant/mutator.rb +0 -24
- data/lib/mutant/mutator/node.rb +1 -33
- data/lib/mutant/mutator/node/and_asgn.rb +0 -2
- data/lib/mutant/mutator/node/argument.rb +0 -10
- data/lib/mutant/mutator/node/arguments.rb +0 -12
- data/lib/mutant/mutator/node/begin.rb +0 -4
- data/lib/mutant/mutator/node/binary.rb +2 -11
- data/lib/mutant/mutator/node/block.rb +0 -6
- data/lib/mutant/mutator/node/break.rb +0 -2
- data/lib/mutant/mutator/node/case.rb +0 -6
- data/lib/mutant/mutator/node/conditional_loop.rb +0 -2
- data/lib/mutant/mutator/node/const.rb +1 -3
- data/lib/mutant/mutator/node/define.rb +4 -11
- data/lib/mutant/mutator/node/defined.rb +0 -2
- data/lib/mutant/mutator/node/dstr.rb +0 -2
- data/lib/mutant/mutator/node/dsym.rb +0 -2
- data/lib/mutant/mutator/node/generic.rb +1 -3
- data/lib/mutant/mutator/node/if.rb +0 -8
- data/lib/mutant/mutator/node/kwbegin.rb +0 -2
- data/lib/mutant/mutator/node/literal/array.rb +0 -4
- data/lib/mutant/mutator/node/literal/boolean.rb +0 -2
- data/lib/mutant/mutator/node/literal/fixnum.rb +0 -6
- data/lib/mutant/mutator/node/literal/float.rb +0 -6
- data/lib/mutant/mutator/node/literal/hash.rb +0 -6
- data/lib/mutant/mutator/node/literal/nil.rb +0 -2
- data/lib/mutant/mutator/node/literal/range.rb +0 -8
- data/lib/mutant/mutator/node/literal/regex.rb +0 -4
- data/lib/mutant/mutator/node/literal/string.rb +0 -2
- data/lib/mutant/mutator/node/literal/symbol.rb +0 -2
- data/lib/mutant/mutator/node/masgn.rb +0 -2
- data/lib/mutant/mutator/node/match_current_line.rb +0 -2
- data/lib/mutant/mutator/node/mlhs.rb +0 -2
- data/lib/mutant/mutator/node/named_value/access.rb +0 -8
- data/lib/mutant/mutator/node/named_value/constant_assignment.rb +1 -7
- data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -4
- data/lib/mutant/mutator/node/next.rb +0 -2
- data/lib/mutant/mutator/node/noop.rb +0 -2
- data/lib/mutant/mutator/node/nthref.rb +0 -2
- data/lib/mutant/mutator/node/op_asgn.rb +0 -2
- data/lib/mutant/mutator/node/or_asgn.rb +0 -2
- data/lib/mutant/mutator/node/resbody.rb +0 -4
- data/lib/mutant/mutator/node/rescue.rb +0 -10
- data/lib/mutant/mutator/node/return.rb +0 -2
- data/lib/mutant/mutator/node/send.rb +4 -32
- data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -6
- data/lib/mutant/mutator/node/send/binary.rb +0 -6
- data/lib/mutant/mutator/node/send/index.rb +0 -6
- data/lib/mutant/mutator/node/splat.rb +0 -2
- data/lib/mutant/mutator/node/super.rb +0 -2
- data/lib/mutant/mutator/node/when.rb +0 -10
- data/lib/mutant/mutator/node/yield.rb +0 -2
- data/lib/mutant/mutator/node/zsuper.rb +0 -2
- data/lib/mutant/mutator/registry.rb +0 -6
- data/lib/mutant/mutator/util.rb +0 -4
- data/lib/mutant/mutator/util/array.rb +0 -6
- data/lib/mutant/mutator/util/symbol.rb +0 -2
- data/lib/mutant/parallel.rb +21 -17
- data/lib/mutant/parallel/master.rb +0 -28
- data/lib/mutant/parallel/source.rb +0 -10
- data/lib/mutant/parallel/worker.rb +15 -10
- data/lib/mutant/parser.rb +23 -0
- data/lib/mutant/reporter.rb +5 -8
- data/lib/mutant/reporter/cli.rb +1 -15
- data/lib/mutant/reporter/cli/format.rb +3 -25
- data/lib/mutant/reporter/cli/printer.rb +0 -18
- data/lib/mutant/reporter/cli/printer/config.rb +0 -2
- data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -2
- data/lib/mutant/reporter/cli/printer/env_result.rb +0 -2
- data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -4
- data/lib/mutant/reporter/cli/printer/mutation_result.rb +0 -16
- data/lib/mutant/reporter/cli/printer/status.rb +0 -6
- data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -4
- data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -8
- data/lib/mutant/reporter/cli/printer/subject_result.rb +0 -2
- data/lib/mutant/reporter/cli/printer/test_result.rb +0 -2
- data/lib/mutant/reporter/cli/tput.rb +0 -4
- data/lib/mutant/repository.rb +4 -22
- data/lib/mutant/require_highjack.rb +0 -2
- data/lib/mutant/result.rb +23 -43
- data/lib/mutant/runner.rb +7 -20
- data/lib/mutant/runner/sink.rb +43 -86
- data/lib/mutant/selector.rb +0 -2
- data/lib/mutant/selector/expression.rb +0 -2
- data/lib/mutant/subject.rb +0 -22
- data/lib/mutant/subject/method.rb +2 -10
- data/lib/mutant/subject/method/instance.rb +0 -6
- data/lib/mutant/subject/method/singleton.rb +0 -2
- data/lib/mutant/test.rb +4 -3
- data/lib/mutant/version.rb +1 -1
- data/lib/mutant/warning_filter.rb +0 -10
- data/lib/mutant/zombifier.rb +5 -20
- data/meta/or_asgn.rb +6 -0
- data/meta/send.rb +29 -0
- data/mutant-rspec.gemspec +1 -1
- data/spec/integration/mutant/rspec_spec.rb +1 -1
- data/spec/integrations.yml +2 -3
- data/spec/shared/method_matcher_behavior.rb +7 -7
- data/spec/spec_helper.rb +2 -9
- data/spec/support/corpus.rb +37 -30
- data/spec/support/rb_bug.rb +1 -2
- data/spec/support/ruby_vm.rb +6 -3
- data/spec/support/shared_context.rb +19 -20
- data/spec/unit/mutant/actor/binding_spec.rb +6 -6
- data/spec/unit/mutant/actor/env_spec.rb +2 -2
- data/spec/unit/mutant/actor/mailbox_spec.rb +6 -6
- data/spec/unit/mutant/actor/message_spec.rb +2 -2
- data/spec/unit/mutant/actor/receiver_spec.rb +4 -4
- data/spec/unit/mutant/actor/sender_spec.rb +6 -6
- data/spec/unit/mutant/ast_spec.rb +9 -0
- data/spec/unit/mutant/cli_spec.rb +16 -10
- data/spec/unit/mutant/context/scope/root_spec.rb +1 -1
- data/spec/unit/mutant/context/scope/unqualified_name_spec.rb +1 -1
- data/spec/unit/mutant/context/scope_spec.rb +3 -3
- data/spec/unit/mutant/context_spec.rb +0 -22
- data/spec/unit/mutant/env/boostrap_spec.rb +34 -41
- data/spec/unit/mutant/env_spec.rb +74 -32
- data/spec/unit/mutant/integration/rspec_spec.rb +23 -17
- data/spec/unit/mutant/integration_spec.rb +4 -4
- data/spec/unit/mutant/isolation_spec.rb +4 -4
- data/spec/unit/mutant/loader_spec.rb +42 -0
- data/spec/unit/mutant/matcher/compiler_spec.rb +3 -3
- data/spec/unit/mutant/matcher/config_spec.rb +1 -1
- data/spec/unit/mutant/matcher/method/instance_spec.rb +8 -1
- data/spec/unit/mutant/matcher/method/singleton_spec.rb +8 -1
- data/spec/unit/mutant/matcher/namespace_spec.rb +7 -8
- data/spec/unit/mutant/matcher/null_spec.rb +3 -2
- data/spec/unit/mutant/mutation_spec.rb +11 -5
- data/spec/unit/mutant/mutator/registry_spec.rb +1 -1
- data/spec/unit/mutant/parallel/master_spec.rb +9 -9
- data/spec/unit/mutant/parallel/source/array_spec.rb +3 -3
- data/spec/unit/mutant/parallel/worker_spec.rb +5 -5
- data/spec/unit/mutant/parallel_spec.rb +4 -4
- data/spec/unit/mutant/parser_spec.rb +24 -0
- data/spec/unit/mutant/reporter/cli/printer_spec.rb +3 -3
- data/spec/unit/mutant/reporter/cli/tput_spec.rb +2 -2
- data/spec/unit/mutant/reporter/cli_spec.rb +7 -7
- data/spec/unit/mutant/reporter/null_spec.rb +5 -4
- data/spec/unit/mutant/repository/diff_spec.rb +30 -18
- data/spec/unit/mutant/repository/subject_filter_spec.rb +5 -5
- data/spec/unit/mutant/require_highjack_spec.rb +1 -1
- data/spec/unit/mutant/result/env_spec.rb +9 -9
- data/spec/unit/mutant/result/subject_spec.rb +5 -5
- data/spec/unit/mutant/runner/driver_spec.rb +4 -4
- data/spec/unit/mutant/runner/{sink/mutation_spec.rb → sink_spec.rb} +16 -4
- data/spec/unit/mutant/runner_spec.rb +31 -31
- data/spec/unit/mutant/selector/expression_spec.rb +8 -8
- data/spec/unit/mutant/subject/method/instance_spec.rb +9 -3
- data/spec/unit/mutant/subject/method/singleton_spec.rb +1 -1
- data/spec/unit/mutant/subject_spec.rb +1 -5
- data/spec/unit/mutant_spec.rb +3 -3
- metadata +9 -15
- data/config/mutant.yml +0 -14
- data/lib/mutant/cache.rb +0 -29
- data/lib/mutant/reporter/trace.rb +0 -36
- data/spec/support/rspec.rb +0 -21
- data/spec/unit/mutant/cache_spec.rb +0 -22
- data/spec/unit/mutant/loader/eval_spec.rb +0 -44
- data/spec/unit/mutant/reporter/trace_spec.rb +0 -21
- data/test_app/Gemfile.rspec3.2 +0 -7
data/lib/mutant/color.rb
CHANGED
@@ -8,10 +8,8 @@ module Mutant
|
|
8
8
|
# @param [String] text
|
9
9
|
#
|
10
10
|
# @return [String]
|
11
|
-
#
|
12
|
-
# @api private
|
13
11
|
def format(text)
|
14
|
-
"\e[#{
|
12
|
+
"\e[#{code}m#{text}\e[0m"
|
15
13
|
end
|
16
14
|
|
17
15
|
NONE = Class.new(self) do
|
@@ -22,8 +20,6 @@ module Mutant
|
|
22
20
|
#
|
23
21
|
# @return [String]
|
24
22
|
# the argument string
|
25
|
-
#
|
26
|
-
# @api private
|
27
23
|
def format(text)
|
28
24
|
text
|
29
25
|
end
|
@@ -33,8 +29,6 @@ module Mutant
|
|
33
29
|
# Initialize null color
|
34
30
|
#
|
35
31
|
# @return [undefined]
|
36
|
-
#
|
37
|
-
# @api private
|
38
32
|
def initialize
|
39
33
|
end
|
40
34
|
|
data/lib/mutant/config.rb
CHANGED
@@ -6,17 +6,21 @@ module Mutant
|
|
6
6
|
class Config
|
7
7
|
include Adamantium::Flat, Anima.new(
|
8
8
|
:debug,
|
9
|
+
:expected_coverage,
|
10
|
+
:expression_parser,
|
11
|
+
:fail_fast,
|
9
12
|
:integration,
|
10
|
-
:matcher,
|
11
13
|
:includes,
|
12
|
-
:requires,
|
13
|
-
:reporter,
|
14
14
|
:isolation,
|
15
|
-
:fail_fast,
|
16
15
|
:jobs,
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
16
|
+
:kernel,
|
17
|
+
:load_path,
|
18
|
+
:matcher,
|
19
|
+
:open3,
|
20
|
+
:pathname,
|
21
|
+
:requires,
|
22
|
+
:reporter,
|
23
|
+
:zombie
|
20
24
|
)
|
21
25
|
|
22
26
|
%i[fail_fast zombie debug].each do |name|
|
data/lib/mutant/context.rb
CHANGED
@@ -8,15 +8,11 @@ module Mutant
|
|
8
8
|
# @param [Parser::AST::Node] node
|
9
9
|
#
|
10
10
|
# @return [Parser::AST::Node]
|
11
|
-
#
|
12
|
-
# @api private
|
13
11
|
abstract_method :root
|
14
12
|
|
15
13
|
# Identification string
|
16
14
|
#
|
17
15
|
# @return [String]
|
18
|
-
#
|
19
|
-
# @api private
|
20
16
|
abstract_method :identification
|
21
17
|
|
22
18
|
end # Context
|
data/lib/mutant/context/scope.rb
CHANGED
@@ -10,8 +10,6 @@ module Mutant
|
|
10
10
|
# Return root node for mutation
|
11
11
|
#
|
12
12
|
# @return [Parser::AST::Node]
|
13
|
-
#
|
14
|
-
# @api private
|
15
13
|
def root(node)
|
16
14
|
nesting.reverse.reduce(node) do |current, scope|
|
17
15
|
self.class.wrap(scope, current)
|
@@ -21,8 +19,6 @@ module Mutant
|
|
21
19
|
# Identification string
|
22
20
|
#
|
23
21
|
# @return [String]
|
24
|
-
#
|
25
|
-
# @api private
|
26
22
|
def identification
|
27
23
|
scope.name
|
28
24
|
end
|
@@ -37,8 +33,6 @@ module Mutant
|
|
37
33
|
#
|
38
34
|
# @return [Parser::AST::Module]
|
39
35
|
# if scope is of kind module
|
40
|
-
#
|
41
|
-
# @api private
|
42
36
|
def self.wrap(scope, node)
|
43
37
|
name = s(:const, nil, scope.name.split(NAMESPACE_DELIMITER).last.to_sym)
|
44
38
|
case scope
|
@@ -46,16 +40,12 @@ module Mutant
|
|
46
40
|
s(:class, name, nil, node)
|
47
41
|
when Module
|
48
42
|
s(:module, name, node)
|
49
|
-
else
|
50
|
-
fail "Cannot wrap scope: #{scope.inspect}"
|
51
43
|
end
|
52
44
|
end
|
53
45
|
|
54
46
|
# Nesting of scope
|
55
47
|
#
|
56
48
|
# @return [Enumerable<Class,Module>]
|
57
|
-
#
|
58
|
-
# @api private
|
59
49
|
def nesting
|
60
50
|
const = ::Object
|
61
51
|
name_nesting.each_with_object([]) do |name, nesting|
|
@@ -68,8 +58,6 @@ module Mutant
|
|
68
58
|
# Unqualified name of scope
|
69
59
|
#
|
70
60
|
# @return [String]
|
71
|
-
#
|
72
|
-
# @api private
|
73
61
|
def unqualified_name
|
74
62
|
name_nesting.last
|
75
63
|
end
|
@@ -77,8 +65,6 @@ module Mutant
|
|
77
65
|
# Match expressions for scope
|
78
66
|
#
|
79
67
|
# @return [Enumerable<Expression>]
|
80
|
-
#
|
81
|
-
# @api private
|
82
68
|
def match_expressions
|
83
69
|
name_nesting.each_index.reverse_each.map do |index|
|
84
70
|
Expression::Namespace::Recursive.new(
|
@@ -91,8 +77,6 @@ module Mutant
|
|
91
77
|
# Scope wrapped by context
|
92
78
|
#
|
93
79
|
# @return [::Module|::Class]
|
94
|
-
#
|
95
|
-
# @api private
|
96
80
|
attr_reader :scope
|
97
81
|
|
98
82
|
private
|
@@ -100,8 +84,6 @@ module Mutant
|
|
100
84
|
# Nesting of names in scope
|
101
85
|
#
|
102
86
|
# @return [Array<String>]
|
103
|
-
#
|
104
|
-
# @api private
|
105
87
|
def name_nesting
|
106
88
|
scope.name.split(NAMESPACE_DELIMITER)
|
107
89
|
end
|
data/lib/mutant/delegator.rb
CHANGED
@@ -9,8 +9,6 @@ module Mutant
|
|
9
9
|
# Create delegators to object
|
10
10
|
#
|
11
11
|
# @return [undefined]
|
12
|
-
#
|
13
|
-
# @api private
|
14
12
|
def delegate(*names)
|
15
13
|
names.each(&method(:define_delegator))
|
16
14
|
end
|
@@ -20,8 +18,6 @@ module Mutant
|
|
20
18
|
# @param [Symbol] name
|
21
19
|
#
|
22
20
|
# @return [undefined]
|
23
|
-
#
|
24
|
-
# @api private
|
25
21
|
def define_delegator(name)
|
26
22
|
fail "method #{name} already defined" if instance_methods.include?(name)
|
27
23
|
define_method(name) do
|
@@ -37,8 +33,6 @@ module Mutant
|
|
37
33
|
# @param [Class,Module] host
|
38
34
|
#
|
39
35
|
# @return [undefined]
|
40
|
-
#
|
41
|
-
# @api private
|
42
36
|
def self.included(host)
|
43
37
|
super
|
44
38
|
|
data/lib/mutant/diff.rb
CHANGED
@@ -14,8 +14,6 @@ module Mutant
|
|
14
14
|
#
|
15
15
|
# @return [nil]
|
16
16
|
# otherwise
|
17
|
-
#
|
18
|
-
# @api private
|
19
17
|
def diff
|
20
18
|
return if diffs.empty?
|
21
19
|
|
@@ -32,8 +30,6 @@ module Mutant
|
|
32
30
|
#
|
33
31
|
# @return [nil]
|
34
32
|
# otherwise
|
35
|
-
#
|
36
|
-
# @api private
|
37
33
|
def colorized_diff
|
38
34
|
return unless diff
|
39
35
|
diff.lines.map(&self.class.method(:colorize_line)).join
|
@@ -46,8 +42,6 @@ module Mutant
|
|
46
42
|
# @param [String] new
|
47
43
|
#
|
48
44
|
# @return [Diff]
|
49
|
-
#
|
50
|
-
# @api private
|
51
45
|
def self.build(old, new)
|
52
46
|
new(lines(old), lines(new))
|
53
47
|
end
|
@@ -57,8 +51,6 @@ module Mutant
|
|
57
51
|
# @param [String] source
|
58
52
|
#
|
59
53
|
# @return [Array<String>]
|
60
|
-
#
|
61
|
-
# @api private
|
62
54
|
def self.lines(source)
|
63
55
|
source.lines.map(&:chomp)
|
64
56
|
end
|
@@ -69,8 +61,6 @@ module Mutant
|
|
69
61
|
# Diffs between old and new
|
70
62
|
#
|
71
63
|
# @return [Array<Array>]
|
72
|
-
#
|
73
|
-
# @api private
|
74
64
|
def diffs
|
75
65
|
::Diff::LCS.diff(old, new)
|
76
66
|
end
|
@@ -78,8 +68,6 @@ module Mutant
|
|
78
68
|
# Raw diff-lcs hunks
|
79
69
|
#
|
80
70
|
# @return [Array<Diff::LCS::Hunk>]
|
81
|
-
#
|
82
|
-
# @api private
|
83
71
|
def hunks
|
84
72
|
diffs.map do |diff|
|
85
73
|
::Diff::LCS::Hunk.new(old, new, diff, max_length, 0)
|
@@ -89,8 +77,6 @@ module Mutant
|
|
89
77
|
# Minimized hunks
|
90
78
|
#
|
91
79
|
# @return [Array<Diff::LCS::Hunk>]
|
92
|
-
#
|
93
|
-
# @api private
|
94
80
|
def minimized_hunks
|
95
81
|
head, *tail = hunks
|
96
82
|
|
@@ -107,8 +93,6 @@ module Mutant
|
|
107
93
|
# Max length of source line in new and old
|
108
94
|
#
|
109
95
|
# @return [Fixnum]
|
110
|
-
#
|
111
|
-
# @api private
|
112
96
|
def max_length
|
113
97
|
[old, new].map(&:length).max
|
114
98
|
end
|
@@ -118,8 +102,6 @@ module Mutant
|
|
118
102
|
# @param [String] line
|
119
103
|
#
|
120
104
|
# @return [String]
|
121
|
-
#
|
122
|
-
# @api private
|
123
105
|
def self.colorize_line(line)
|
124
106
|
case line[0]
|
125
107
|
when ADDITION
|
data/lib/mutant/env.rb
CHANGED
@@ -2,39 +2,25 @@ module Mutant
|
|
2
2
|
# Abstract base class for mutant environments
|
3
3
|
class Env
|
4
4
|
include Adamantium::Flat, Anima.new(
|
5
|
-
:config,
|
6
5
|
:actor_env,
|
7
|
-
:
|
8
|
-
:subjects,
|
9
|
-
:matchable_scopes,
|
6
|
+
:config,
|
10
7
|
:integration,
|
8
|
+
:matchable_scopes,
|
9
|
+
:mutations,
|
10
|
+
:parser,
|
11
11
|
:selector,
|
12
|
-
:
|
12
|
+
:subjects
|
13
13
|
)
|
14
14
|
|
15
15
|
SEMANTICS_MESSAGE =
|
16
16
|
"Fix your lib to follow normal ruby semantics!\n" \
|
17
17
|
'{Module,Class}#name should return resolvable constant name as String or nil'.freeze
|
18
18
|
|
19
|
-
# Print warning message
|
20
|
-
#
|
21
|
-
# @param [String]
|
22
|
-
#
|
23
|
-
# @return [self]
|
24
|
-
#
|
25
|
-
# @api private
|
26
|
-
def warn(message)
|
27
|
-
config.reporter.warn(message)
|
28
|
-
self
|
29
|
-
end
|
30
|
-
|
31
19
|
# Kill mutation
|
32
20
|
#
|
33
21
|
# @param [Mutation] mutation
|
34
22
|
#
|
35
23
|
# @return [Result::Mutation]
|
36
|
-
#
|
37
|
-
# @api private
|
38
24
|
def kill(mutation)
|
39
25
|
test_result = run_mutation_tests(mutation)
|
40
26
|
Result::Mutation.new(
|
@@ -53,22 +39,20 @@ module Mutant
|
|
53
39
|
# @return [Result::Test]
|
54
40
|
#
|
55
41
|
# rubocop:disable MethodLength
|
56
|
-
#
|
57
|
-
# @api private
|
58
42
|
def run_mutation_tests(mutation)
|
59
43
|
start = Time.now
|
60
44
|
tests = selector.call(mutation.subject)
|
61
45
|
|
62
46
|
config.isolation.call do
|
63
|
-
mutation.insert
|
47
|
+
mutation.insert(config.kernel)
|
64
48
|
integration.call(tests)
|
65
49
|
end
|
66
50
|
rescue Isolation::Error => error
|
67
51
|
Result::Test.new(
|
68
|
-
tests: tests,
|
69
52
|
output: error.message,
|
53
|
+
passed: false,
|
70
54
|
runtime: Time.now - start,
|
71
|
-
|
55
|
+
tests: tests
|
72
56
|
)
|
73
57
|
end
|
74
58
|
|
data/lib/mutant/env/bootstrap.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module Mutant
|
2
2
|
class Env
|
3
|
-
#
|
3
|
+
# Bootstrap environment
|
4
4
|
class Bootstrap
|
5
|
-
include Adamantium::Flat, Concord::Public.new(:config
|
5
|
+
include Adamantium::Flat, Concord::Public.new(:config), Procto.call(:env)
|
6
6
|
|
7
7
|
SEMANTICS_MESSAGE_FORMAT =
|
8
8
|
"%<message>s. Fix your lib to follow normal ruby semantics!\n" \
|
@@ -19,26 +19,19 @@ module Mutant
|
|
19
19
|
# Scopes that are eligible for matching
|
20
20
|
#
|
21
21
|
# @return [Enumerable<Matcher::Scope>]
|
22
|
-
#
|
23
|
-
# @api private
|
24
22
|
attr_reader :matchable_scopes
|
25
23
|
|
26
|
-
#
|
27
|
-
#
|
28
|
-
# @return [Env]
|
24
|
+
# Parser for this environment
|
29
25
|
#
|
30
|
-
# @
|
31
|
-
|
32
|
-
super
|
33
|
-
end
|
26
|
+
# @return [Parser]
|
27
|
+
attr_reader :parser
|
34
28
|
|
35
29
|
# Initialize object
|
36
30
|
#
|
37
31
|
# @return [Object]
|
38
|
-
#
|
39
|
-
# @api private
|
40
32
|
def initialize(*)
|
41
33
|
super
|
34
|
+
@parser = Parser.new
|
42
35
|
infect
|
43
36
|
initialize_matchable_scopes
|
44
37
|
end
|
@@ -48,8 +41,6 @@ module Mutant
|
|
48
41
|
# @param [String]
|
49
42
|
#
|
50
43
|
# @return [self]
|
51
|
-
#
|
52
|
-
# @api private
|
53
44
|
def warn(message)
|
54
45
|
config.reporter.warn(message)
|
55
46
|
self
|
@@ -58,8 +49,6 @@ module Mutant
|
|
58
49
|
# Environment after bootstraping
|
59
50
|
#
|
60
51
|
# @return [Env]
|
61
|
-
#
|
62
|
-
# @api private
|
63
52
|
# rubocop:disable MethodLength
|
64
53
|
#
|
65
54
|
def env
|
@@ -67,18 +56,18 @@ module Mutant
|
|
67
56
|
Env.new(
|
68
57
|
actor_env: Actor::Env.new(Thread),
|
69
58
|
config: config,
|
70
|
-
cache: cache,
|
71
|
-
subjects: subjects,
|
72
|
-
matchable_scopes: matchable_scopes,
|
73
59
|
integration: @integration,
|
60
|
+
matchable_scopes: matchable_scopes,
|
61
|
+
mutations: subjects.flat_map(&:mutations),
|
62
|
+
parser: parser,
|
74
63
|
selector: Selector::Expression.new(@integration),
|
75
|
-
|
64
|
+
subjects: subjects
|
76
65
|
)
|
77
66
|
end
|
78
67
|
|
79
68
|
private
|
80
69
|
|
81
|
-
# Scope name from
|
70
|
+
# Scope name from scoping object
|
82
71
|
#
|
83
72
|
# @param [Class, Module] scope
|
84
73
|
#
|
@@ -87,16 +76,14 @@ module Mutant
|
|
87
76
|
#
|
88
77
|
# @return [nil]
|
89
78
|
# otherwise
|
90
|
-
#
|
91
|
-
# @api private
|
92
79
|
def scope_name(scope)
|
93
80
|
scope.name
|
94
81
|
rescue => exception
|
95
82
|
semantics_warning(
|
96
83
|
CLASS_NAME_RAISED_EXCEPTION,
|
97
|
-
|
84
|
+
exception: exception.inspect,
|
98
85
|
scope: scope,
|
99
|
-
|
86
|
+
scope_class: scope.class
|
100
87
|
)
|
101
88
|
nil
|
102
89
|
end
|
@@ -104,19 +91,15 @@ module Mutant
|
|
104
91
|
# Infect environment
|
105
92
|
#
|
106
93
|
# @return [undefined]
|
107
|
-
#
|
108
|
-
# @api private
|
109
94
|
def infect
|
110
|
-
config.includes.each(
|
111
|
-
config.requires.each(&
|
95
|
+
config.includes.each(&config.load_path.method(:<<))
|
96
|
+
config.requires.each(&config.kernel.method(:require))
|
112
97
|
@integration = config.integration.new(config).setup
|
113
98
|
end
|
114
99
|
|
115
100
|
# Matched subjects
|
116
101
|
#
|
117
102
|
# @return [Enumerable<Subject>]
|
118
|
-
#
|
119
|
-
# @api private
|
120
103
|
def matched_subjects
|
121
104
|
Matcher::Compiler.call(config.matcher).call(self)
|
122
105
|
end
|
@@ -124,8 +107,6 @@ module Mutant
|
|
124
107
|
# Initialize matchable scopes
|
125
108
|
#
|
126
109
|
# @return [undefined]
|
127
|
-
#
|
128
|
-
# @api private
|
129
110
|
def initialize_matchable_scopes
|
130
111
|
scopes = ObjectSpace.each_object(Module).each_with_object([]) do |scope, aggregate|
|
131
112
|
expression = expression(scope) || next
|
@@ -144,17 +125,15 @@ module Mutant
|
|
144
125
|
#
|
145
126
|
# @return [nil]
|
146
127
|
# otherwise
|
147
|
-
#
|
148
|
-
# @api private
|
149
128
|
def expression(scope)
|
150
129
|
name = scope_name(scope) or return
|
151
130
|
|
152
131
|
unless name.instance_of?(String)
|
153
132
|
semantics_warning(
|
154
133
|
CLASS_NAME_TYPE_MISMATCH_FORMAT,
|
134
|
+
name: name,
|
155
135
|
scope_class: scope.class,
|
156
|
-
scope: scope
|
157
|
-
name: name
|
136
|
+
scope: scope
|
158
137
|
)
|
159
138
|
return
|
160
139
|
end
|
@@ -165,12 +144,10 @@ module Mutant
|
|
165
144
|
# Write a semantics warning
|
166
145
|
#
|
167
146
|
# @return [undefined]
|
168
|
-
#
|
169
|
-
# @api private
|
170
147
|
def semantics_warning(format, options)
|
171
148
|
message = format % options
|
172
149
|
warn(SEMANTICS_MESSAGE_FORMAT % { message: message })
|
173
150
|
end
|
174
|
-
end #
|
151
|
+
end # Bootstrap
|
175
152
|
end # Env
|
176
153
|
end # Mutant
|