mutant 0.11.18 → 0.11.19
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mutant/ast/find_metaclass_containing.rb +1 -1
- data/lib/mutant/ast/meta/const.rb +1 -1
- data/lib/mutant/ast/meta/optarg.rb +1 -1
- data/lib/mutant/ast/meta/resbody.rb +1 -1
- data/lib/mutant/ast/meta/send.rb +3 -3
- data/lib/mutant/ast/meta/symbol.rb +1 -1
- data/lib/mutant/ast/types.rb +2 -1311
- data/lib/mutant/bootstrap.rb +2 -2
- data/lib/mutant/cli/command/environment/run.rb +1 -1
- data/lib/mutant/cli/command/environment.rb +1 -3
- data/lib/mutant/cli/command/util.rb +6 -6
- data/lib/mutant/config/coverage_criteria.rb +13 -4
- data/lib/mutant/config.rb +51 -24
- data/lib/mutant/context.rb +1 -6
- data/lib/mutant/env.rb +1 -1
- data/lib/mutant/expression/method.rb +6 -3
- data/lib/mutant/expression/methods.rb +2 -2
- data/lib/mutant/expression/namespace.rb +2 -2
- data/lib/mutant/expression/parser.rb +1 -1
- data/lib/mutant/hooks.rb +4 -4
- data/lib/mutant/isolation/fork.rb +1 -1
- data/lib/mutant/license/subscription/commercial.rb +3 -3
- data/lib/mutant/license/subscription/opensource.rb +5 -9
- data/lib/mutant/license/subscription.rb +1 -1
- data/lib/mutant/matcher/chain.rb +1 -1
- data/lib/mutant/matcher/config.rb +10 -4
- data/lib/mutant/matcher/descendants.rb +1 -1
- data/lib/mutant/matcher/filter.rb +1 -1
- data/lib/mutant/matcher/method/instance.rb +9 -4
- data/lib/mutant/matcher/method/metaclass.rb +4 -17
- data/lib/mutant/matcher/method/singleton.rb +3 -13
- data/lib/mutant/matcher/method.rb +4 -4
- data/lib/mutant/matcher/methods.rb +4 -2
- data/lib/mutant/matcher/namespace.rb +2 -2
- data/lib/mutant/matcher/scope.rb +3 -3
- data/lib/mutant/matcher/static.rb +1 -1
- data/lib/mutant/matcher.rb +2 -2
- data/lib/mutant/meta/example/verification.rb +2 -2
- data/lib/mutant/meta/example.rb +4 -4
- data/lib/mutant/mutation/config.rb +10 -4
- data/lib/mutant/mutation/runner/sink.rb +80 -0
- data/lib/mutant/mutation/runner.rb +61 -0
- data/lib/mutant/mutation.rb +1 -1
- data/lib/mutant/mutator/node/block.rb +2 -2
- data/lib/mutant/mutator/node/define.rb +1 -1
- data/lib/mutant/mutator/node/if.rb +9 -0
- data/lib/mutant/mutator/node/rescue.rb +1 -1
- data/lib/mutant/mutator/node/send.rb +4 -4
- data/lib/mutant/mutator/regexp.rb +2 -2
- data/lib/mutant/parallel/source.rb +1 -1
- data/lib/mutant/pipe.rb +3 -3
- data/lib/mutant/registry.rb +2 -2
- data/lib/mutant/reporter/cli/format.rb +3 -3
- data/lib/mutant/reporter/cli/printer.rb +2 -2
- data/lib/mutant/reporter/cli.rb +4 -4
- data/lib/mutant/reporter/sequence.rb +1 -1
- data/lib/mutant/repository.rb +1 -1
- data/lib/mutant/result.rb +1 -1
- data/lib/mutant/scope.rb +1 -1
- data/lib/mutant/selector/expression.rb +1 -1
- data/lib/mutant/subject.rb +2 -2
- data/lib/mutant/timer.rb +3 -3
- data/lib/mutant/transform.rb +14 -14
- data/lib/mutant/version.rb +1 -1
- data/lib/mutant.rb +13 -11
- metadata +9 -9
- data/lib/mutant/runner/sink.rb +0 -78
- data/lib/mutant/runner.rb +0 -60
@@ -4,7 +4,7 @@ module Mutant
|
|
4
4
|
class Matcher
|
5
5
|
# Matcher for specific namespace
|
6
6
|
class Namespace < self
|
7
|
-
include
|
7
|
+
include Anima.new(:expression)
|
8
8
|
|
9
9
|
# Enumerate subjects
|
10
10
|
#
|
@@ -13,7 +13,7 @@ module Mutant
|
|
13
13
|
# @return [Enumerable<Subject>]
|
14
14
|
def call(env)
|
15
15
|
Chain.new(
|
16
|
-
matched_scopes(env).map { |scope| Scope.new(scope.raw) }
|
16
|
+
matchers: matched_scopes(env).map { |scope| Scope.new(scope: scope.raw) }
|
17
17
|
).call(env)
|
18
18
|
end
|
19
19
|
|
data/lib/mutant/matcher/scope.rb
CHANGED
@@ -9,7 +9,7 @@ module Mutant
|
|
9
9
|
# to hook in custom matchers. In that case the scope matchers to expand
|
10
10
|
# should be passed as arguments to the constructor.
|
11
11
|
class Scope < self
|
12
|
-
include
|
12
|
+
include Anima.new(:scope)
|
13
13
|
|
14
14
|
MATCHERS = [
|
15
15
|
Matcher::Methods::Singleton,
|
@@ -25,13 +25,13 @@ module Mutant
|
|
25
25
|
#
|
26
26
|
# @return [Enumerable<Subject>]
|
27
27
|
def call(env)
|
28
|
-
Chain.new(effective_matchers).call(env)
|
28
|
+
Chain.new(matchers: effective_matchers).call(env)
|
29
29
|
end
|
30
30
|
|
31
31
|
private
|
32
32
|
|
33
33
|
def effective_matchers
|
34
|
-
MATCHERS.map { |matcher| matcher.new(scope) }
|
34
|
+
MATCHERS.map { |matcher| matcher.new(scope: scope) }
|
35
35
|
end
|
36
36
|
|
37
37
|
end # Scope
|
data/lib/mutant/matcher.rb
CHANGED
@@ -20,8 +20,8 @@ module Mutant
|
|
20
20
|
# @return [Matcher]
|
21
21
|
def self.from_config(config)
|
22
22
|
Filter.new(
|
23
|
-
Chain.new(config.subjects.map(&:matcher)),
|
24
|
-
method(:allowed_subject?).curry.call(config)
|
23
|
+
matcher: Chain.new(matchers: config.subjects.map(&:matcher)),
|
24
|
+
predicate: method(:allowed_subject?).curry.call(config)
|
25
25
|
)
|
26
26
|
end
|
27
27
|
|
@@ -5,7 +5,7 @@ module Mutant
|
|
5
5
|
class Example
|
6
6
|
# Example verification
|
7
7
|
class Verification
|
8
|
-
include Adamantium,
|
8
|
+
include Adamantium, Anima.new(:example, :mutations)
|
9
9
|
|
10
10
|
# Test if mutation was verified successfully
|
11
11
|
#
|
@@ -94,7 +94,7 @@ module Mutant
|
|
94
94
|
|
95
95
|
def missing
|
96
96
|
(example.expected.map(&:node) - mutations.map(&:node)).map do |node|
|
97
|
-
Mutation::Evil.new(example, node)
|
97
|
+
Mutation::Evil.new(subject: example, node: node)
|
98
98
|
end
|
99
99
|
end
|
100
100
|
memoize :missing
|
data/lib/mutant/meta/example.rb
CHANGED
@@ -22,7 +22,7 @@ module Mutant
|
|
22
22
|
#
|
23
23
|
# @return [Verification]
|
24
24
|
def verification
|
25
|
-
Verification.new(self, generated)
|
25
|
+
Verification.new(example: self, mutations: generated)
|
26
26
|
end
|
27
27
|
memoize :verification
|
28
28
|
|
@@ -38,8 +38,8 @@ module Mutant
|
|
38
38
|
# @return [Context]
|
39
39
|
def context
|
40
40
|
Context.new(
|
41
|
-
Object,
|
42
|
-
location.path
|
41
|
+
scope: Object,
|
42
|
+
source_path: location.path
|
43
43
|
)
|
44
44
|
end
|
45
45
|
|
@@ -59,7 +59,7 @@ module Mutant
|
|
59
59
|
config: Mutation::Config::DEFAULT,
|
60
60
|
node: node
|
61
61
|
).map do |node|
|
62
|
-
Mutation::Evil.new(self, node)
|
62
|
+
Mutation::Evil.new(subject: self, node: node)
|
63
63
|
end
|
64
64
|
end
|
65
65
|
memoize :generated
|
@@ -13,16 +13,22 @@ module Mutant
|
|
13
13
|
ignore_pattern = Transform::Block.capture('ignore pattern', &AST::Pattern.method(:parse))
|
14
14
|
|
15
15
|
TRANSFORM = Transform::Sequence.new(
|
16
|
-
[
|
16
|
+
steps: [
|
17
17
|
Transform::Hash.new(
|
18
18
|
optional: [
|
19
|
-
Transform::Hash::Key.new(
|
20
|
-
|
19
|
+
Transform::Hash::Key.new(
|
20
|
+
transform: Transform::Array.new(transform: ignore_pattern),
|
21
|
+
value: 'ignore_patterns'
|
22
|
+
),
|
23
|
+
Transform::Hash::Key.new(
|
24
|
+
transform: Transform::FLOAT,
|
25
|
+
value: 'timeout'
|
26
|
+
)
|
21
27
|
],
|
22
28
|
required: []
|
23
29
|
),
|
24
30
|
Transform::Hash::Symbolize.new,
|
25
|
-
Transform::Success.new(DEFAULT.method(:with))
|
31
|
+
Transform::Success.new(block: DEFAULT.method(:with))
|
26
32
|
]
|
27
33
|
)
|
28
34
|
|
@@ -0,0 +1,80 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
class Mutation
|
5
|
+
module Runner
|
6
|
+
class Sink
|
7
|
+
include Anima.new(:env)
|
8
|
+
|
9
|
+
# Initialize object
|
10
|
+
#
|
11
|
+
# @return [undefined]
|
12
|
+
def initialize(*)
|
13
|
+
super
|
14
|
+
@start = env.world.timer.now
|
15
|
+
@subject_results = {}
|
16
|
+
end
|
17
|
+
|
18
|
+
# Runner status
|
19
|
+
#
|
20
|
+
# @return [Result::Env]
|
21
|
+
def status
|
22
|
+
Result::Env.new(
|
23
|
+
env: env,
|
24
|
+
runtime: env.world.timer.now - @start,
|
25
|
+
subject_results: @subject_results.values
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
# Test if scheduling stopped
|
30
|
+
#
|
31
|
+
# @return [Boolean]
|
32
|
+
def stop?
|
33
|
+
status.stop?
|
34
|
+
end
|
35
|
+
|
36
|
+
# Handle mutation finish
|
37
|
+
#
|
38
|
+
# @param [Result::MutationIndex] mutation_index_result
|
39
|
+
#
|
40
|
+
# @return [self]
|
41
|
+
def result(mutation_index_result)
|
42
|
+
mutation_result = mutation_result(mutation_index_result)
|
43
|
+
|
44
|
+
subject = mutation_result.mutation.subject
|
45
|
+
|
46
|
+
@subject_results[subject] = Result::Subject.new(
|
47
|
+
subject: subject,
|
48
|
+
coverage_results: previous_coverage_results(subject).dup << coverage_result(mutation_result),
|
49
|
+
tests: env.selections.fetch(subject)
|
50
|
+
)
|
51
|
+
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def coverage_result(mutation_result)
|
58
|
+
Result::Coverage.new(
|
59
|
+
mutation_result: mutation_result,
|
60
|
+
criteria_result: mutation_result.criteria_result(env.config.coverage_criteria)
|
61
|
+
)
|
62
|
+
end
|
63
|
+
|
64
|
+
def mutation_result(mutation_index_result)
|
65
|
+
Result::Mutation.new(
|
66
|
+
isolation_result: mutation_index_result.isolation_result,
|
67
|
+
mutation: env.mutations.fetch(mutation_index_result.mutation_index),
|
68
|
+
runtime: mutation_index_result.runtime
|
69
|
+
)
|
70
|
+
end
|
71
|
+
|
72
|
+
def previous_coverage_results(subject)
|
73
|
+
subject_result = @subject_results.fetch(subject) { return EMPTY_ARRAY }
|
74
|
+
subject_result.coverage_results
|
75
|
+
end
|
76
|
+
|
77
|
+
end # Sink
|
78
|
+
end # Runner
|
79
|
+
end # Mutation
|
80
|
+
end # Mutant
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Mutant
|
4
|
+
class Mutation
|
5
|
+
module Runner
|
6
|
+
# Run against env
|
7
|
+
#
|
8
|
+
# @return [Either<String, Result>]
|
9
|
+
def self.call(env)
|
10
|
+
reporter(env).start(env)
|
11
|
+
|
12
|
+
Either::Right.new(run_mutation_analysis(env))
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.run_mutation_analysis(env)
|
16
|
+
reporter = reporter(env)
|
17
|
+
|
18
|
+
env
|
19
|
+
.record(:analysis) { run_driver(reporter, async_driver(env)) }
|
20
|
+
.tap { |result| env.record(:report) { reporter.report(result) } }
|
21
|
+
end
|
22
|
+
private_class_method :run_mutation_analysis
|
23
|
+
|
24
|
+
def self.async_driver(env)
|
25
|
+
Parallel.async(env.world, mutation_test_config(env))
|
26
|
+
end
|
27
|
+
private_class_method :async_driver
|
28
|
+
|
29
|
+
def self.run_driver(reporter, driver)
|
30
|
+
Signal.trap('INT') do
|
31
|
+
driver.stop
|
32
|
+
end
|
33
|
+
|
34
|
+
loop do
|
35
|
+
status = driver.wait_timeout(reporter.delay)
|
36
|
+
break status.payload if status.done?
|
37
|
+
reporter.progress(status)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
private_class_method :run_driver
|
41
|
+
|
42
|
+
def self.mutation_test_config(env)
|
43
|
+
Parallel::Config.new(
|
44
|
+
block: env.method(:cover_index),
|
45
|
+
jobs: env.config.jobs,
|
46
|
+
process_name: 'mutant-worker-process',
|
47
|
+
sink: Sink.new(env: env),
|
48
|
+
source: Parallel::Source::Array.new(jobs: env.mutations.each_index.to_a),
|
49
|
+
thread_name: 'mutant-worker-thread'
|
50
|
+
)
|
51
|
+
end
|
52
|
+
private_class_method :mutation_test_config
|
53
|
+
|
54
|
+
def self.reporter(env)
|
55
|
+
env.config.reporter
|
56
|
+
end
|
57
|
+
private_class_method :reporter
|
58
|
+
|
59
|
+
end # Runner
|
60
|
+
end # Mutation
|
61
|
+
end # Mutant
|
data/lib/mutant/mutation.rb
CHANGED
@@ -48,7 +48,7 @@ module Mutant
|
|
48
48
|
def mutate_body_receiver
|
49
49
|
return if n_lambda?(send) || !n_send?(body)
|
50
50
|
|
51
|
-
body_meta = AST::Meta::Send.new(body)
|
51
|
+
body_meta = AST::Meta::Send.new(node: body)
|
52
52
|
|
53
53
|
emit(s(:send, send, body_meta.selector, *body_meta.arguments))
|
54
54
|
end
|
@@ -56,7 +56,7 @@ module Mutant
|
|
56
56
|
def valid_send_mutation?(node)
|
57
57
|
return unless n_send?(node)
|
58
58
|
|
59
|
-
last = AST::Meta::Send.new(node).arguments.last
|
59
|
+
last = AST::Meta::Send.new(node: node).arguments.last
|
60
60
|
|
61
61
|
!last&.type.equal?(:block_pass)
|
62
62
|
end
|
@@ -23,7 +23,7 @@ module Mutant
|
|
23
23
|
|
24
24
|
def emit_optarg_body_assignments
|
25
25
|
arguments.children.each do |argument|
|
26
|
-
next unless n_optarg?(argument) && AST::Meta::Optarg.new(argument).used?
|
26
|
+
next unless n_optarg?(argument) && AST::Meta::Optarg.new(node: argument).used?
|
27
27
|
|
28
28
|
emit_body_prepend(s(:lvasgn, *argument))
|
29
29
|
end
|
@@ -5,6 +5,7 @@ module Mutant
|
|
5
5
|
class Node
|
6
6
|
# Mutator for if nodes
|
7
7
|
class If < self
|
8
|
+
FLOW_MODIFIER = %i[return next break].to_set.freeze
|
8
9
|
|
9
10
|
handle(:if)
|
10
11
|
|
@@ -43,6 +44,14 @@ module Mutant
|
|
43
44
|
emit_type(condition, nil, else_branch)
|
44
45
|
end
|
45
46
|
|
47
|
+
def emit_type(_condition, if_branch, else_branch)
|
48
|
+
super unless ternary? && (if_branch.nil? || else_branch.nil?)
|
49
|
+
end
|
50
|
+
|
51
|
+
def ternary?
|
52
|
+
parent && FLOW_MODIFIER.include?(parent.node.type)
|
53
|
+
end
|
54
|
+
|
46
55
|
end # If
|
47
56
|
end # Node
|
48
57
|
end # Mutator
|
@@ -25,7 +25,7 @@ module Mutant
|
|
25
25
|
def mutate_rescue_bodies
|
26
26
|
children_indices(RESCUE_INDICES).each do |index|
|
27
27
|
mutate_child(index)
|
28
|
-
resbody_body = AST::Meta::Resbody.new(children.fetch(index)).body
|
28
|
+
resbody_body = AST::Meta::Resbody.new(node: children.fetch(index)).body
|
29
29
|
emit_concat(resbody_body) if resbody_body
|
30
30
|
end
|
31
31
|
end
|
@@ -79,7 +79,7 @@ module Mutant
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def meta
|
82
|
-
AST::Meta::Send.new(node)
|
82
|
+
AST::Meta::Send.new(node: node)
|
83
83
|
end
|
84
84
|
memoize :meta
|
85
85
|
|
@@ -173,7 +173,7 @@ module Mutant
|
|
173
173
|
|
174
174
|
return unless dynamic_selector && n_sym?(dynamic_selector)
|
175
175
|
|
176
|
-
method_name = AST::Meta::Symbol.new(dynamic_selector).name
|
176
|
+
method_name = AST::Meta::Symbol.new(node: dynamic_selector).name
|
177
177
|
|
178
178
|
emit(s(node.type, receiver, method_name, *actual_arguments))
|
179
179
|
end
|
@@ -194,7 +194,7 @@ module Mutant
|
|
194
194
|
def emit_double_negation_mutation
|
195
195
|
return unless selector.equal?(:!) && n_send?(receiver)
|
196
196
|
|
197
|
-
negated = AST::Meta::Send.new(
|
197
|
+
negated = AST::Meta::Send.new(node: receiver)
|
198
198
|
emit(negated.receiver) if negated.selector.equal?(:!)
|
199
199
|
end
|
200
200
|
|
@@ -223,7 +223,7 @@ module Mutant
|
|
223
223
|
def emit_const_get_mutation
|
224
224
|
return unless selector.equal?(:const_get) && n_sym?(arguments.first)
|
225
225
|
|
226
|
-
emit(s(:const, receiver, AST::Meta::Symbol.new(arguments.first).name))
|
226
|
+
emit(s(:const, receiver, AST::Meta::Symbol.new(node: arguments.first).name))
|
227
227
|
end
|
228
228
|
|
229
229
|
def emit_selector_replacement
|
data/lib/mutant/pipe.rb
CHANGED
@@ -41,7 +41,7 @@ module Mutant
|
|
41
41
|
Error = Class.new(RuntimeError)
|
42
42
|
|
43
43
|
class Frame
|
44
|
-
include
|
44
|
+
include Anima.new(:io)
|
45
45
|
|
46
46
|
HEADER_FORMAT = 'N'
|
47
47
|
MAX_BYTES = (2**32).pred
|
@@ -87,8 +87,8 @@ module Mutant
|
|
87
87
|
def self.from_pipes(marshal:, reader:, writer:)
|
88
88
|
new(
|
89
89
|
marshal: marshal,
|
90
|
-
reader: Frame.new(reader.to_reader),
|
91
|
-
writer: Frame.new(writer.to_writer)
|
90
|
+
reader: Frame.new(io: reader.to_reader),
|
91
|
+
writer: Frame.new(io: writer.to_writer)
|
92
92
|
)
|
93
93
|
end
|
94
94
|
end
|
data/lib/mutant/registry.rb
CHANGED
@@ -3,13 +3,13 @@
|
|
3
3
|
module Mutant
|
4
4
|
# Registry for mapping AST types to classes
|
5
5
|
class Registry
|
6
|
-
include
|
6
|
+
include Anima.new(:contents, :default)
|
7
7
|
|
8
8
|
# Initialize object
|
9
9
|
#
|
10
10
|
# @return [undefined]
|
11
11
|
def initialize(default)
|
12
|
-
super({}, default)
|
12
|
+
super(contents: {}, default: default)
|
13
13
|
end
|
14
14
|
|
15
15
|
# Raised when the type is an invalid type
|
@@ -7,7 +7,7 @@ module Mutant
|
|
7
7
|
#
|
8
8
|
# rubocop:disable Style/FormatString
|
9
9
|
class Format
|
10
|
-
include AbstractType,
|
10
|
+
include AbstractType, Anima.new(:tty)
|
11
11
|
|
12
12
|
# Start representation
|
13
13
|
#
|
@@ -32,7 +32,7 @@ module Mutant
|
|
32
32
|
|
33
33
|
# Output abstraction to decouple tty? from buffer
|
34
34
|
class Output
|
35
|
-
include
|
35
|
+
include Anima.new(:tty, :buffer)
|
36
36
|
|
37
37
|
# Test if output is a tty
|
38
38
|
#
|
@@ -51,7 +51,7 @@ module Mutant
|
|
51
51
|
|
52
52
|
def format(printer, object)
|
53
53
|
buffer = new_buffer
|
54
|
-
printer.call(Output.new(tty, buffer), object)
|
54
|
+
printer.call(output: Output.new(tty: tty, buffer: buffer), object: object)
|
55
55
|
buffer.rewind
|
56
56
|
buffer.read
|
57
57
|
end
|
@@ -8,7 +8,7 @@ module Mutant
|
|
8
8
|
include(
|
9
9
|
AbstractType,
|
10
10
|
Adamantium,
|
11
|
-
|
11
|
+
Anima.new(:output, :object),
|
12
12
|
Procto
|
13
13
|
)
|
14
14
|
|
@@ -61,7 +61,7 @@ module Mutant
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def visit(printer, object)
|
64
|
-
printer.call(output, object)
|
64
|
+
printer.call(output: output, object: object)
|
65
65
|
end
|
66
66
|
|
67
67
|
def info(string, *arguments)
|
data/lib/mutant/reporter/cli.rb
CHANGED
@@ -4,7 +4,7 @@ module Mutant
|
|
4
4
|
class Reporter
|
5
5
|
# Reporter that reports in human readable format
|
6
6
|
class CLI < self
|
7
|
-
include
|
7
|
+
include Anima.new(:output, :format)
|
8
8
|
|
9
9
|
# Build reporter
|
10
10
|
#
|
@@ -13,8 +13,8 @@ module Mutant
|
|
13
13
|
# @return [Reporter::CLI]
|
14
14
|
def self.build(output)
|
15
15
|
new(
|
16
|
-
output,
|
17
|
-
|
16
|
+
format: Format::Progressive.new(tty: output.respond_to?(:tty?) && output.tty?),
|
17
|
+
output: output
|
18
18
|
)
|
19
19
|
end
|
20
20
|
|
@@ -61,7 +61,7 @@ module Mutant
|
|
61
61
|
#
|
62
62
|
# @return [self]
|
63
63
|
def report(env)
|
64
|
-
Printer::EnvResult.call(output, env)
|
64
|
+
Printer::EnvResult.call(output: output, object: env)
|
65
65
|
self
|
66
66
|
end
|
67
67
|
|
data/lib/mutant/repository.rb
CHANGED
data/lib/mutant/result.rb
CHANGED
data/lib/mutant/scope.rb
CHANGED
data/lib/mutant/subject.rb
CHANGED
@@ -16,7 +16,7 @@ module Mutant
|
|
16
16
|
config: config.mutation,
|
17
17
|
node: node
|
18
18
|
).map do |mutant|
|
19
|
-
Mutation::Evil.new(self, wrap_node(mutant))
|
19
|
+
Mutation::Evil.new(subject: self, node: wrap_node(mutant))
|
20
20
|
end
|
21
21
|
)
|
22
22
|
end
|
@@ -92,7 +92,7 @@ module Mutant
|
|
92
92
|
private
|
93
93
|
|
94
94
|
def neutral_mutation
|
95
|
-
Mutation::Neutral.new(self, wrap_node(node))
|
95
|
+
Mutation::Neutral.new(subject: self, node: wrap_node(node))
|
96
96
|
end
|
97
97
|
|
98
98
|
def wrap_node(node)
|
data/lib/mutant/timer.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Mutant
|
4
4
|
class Timer
|
5
|
-
include
|
5
|
+
include Anima.new(:process)
|
6
6
|
|
7
7
|
# The now monotonic time
|
8
8
|
#
|
@@ -28,7 +28,7 @@ module Mutant
|
|
28
28
|
|
29
29
|
# Deadline status snapshot
|
30
30
|
class Status
|
31
|
-
include
|
31
|
+
include Anima.new(:time_left)
|
32
32
|
|
33
33
|
# Test if deadline is not yet expired
|
34
34
|
def ok?
|
@@ -40,7 +40,7 @@ module Mutant
|
|
40
40
|
#
|
41
41
|
# @return [Status]
|
42
42
|
def status
|
43
|
-
Status.new(time_left)
|
43
|
+
Status.new(time_left: time_left)
|
44
44
|
end
|
45
45
|
|
46
46
|
# Probe the time left
|