mutant 0.8.9 → 0.8.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 +4 -4
- data/Changelog.md +4 -0
- data/config/devtools.yml +1 -1
- data/config/flay.yml +1 -1
- data/lib/mutant.rb +1 -2
- data/lib/mutant/ast/types.rb +3 -2
- data/lib/mutant/context.rb +78 -6
- data/lib/mutant/diff.rb +7 -13
- data/lib/mutant/matcher/method.rb +2 -2
- data/lib/mutant/mutation.rb +1 -1
- data/lib/mutant/mutator/node/generic.rb +1 -1
- data/lib/mutant/reporter/cli/printer.rb +25 -1
- data/lib/mutant/reporter/sequence.rb +22 -0
- data/lib/mutant/result.rb +4 -9
- data/lib/mutant/version.rb +1 -1
- data/meta/dsym.rb +7 -7
- data/mutant.gemspec +5 -5
- data/spec/spec_helper.rb +0 -1
- data/spec/unit/mutant/ast/named_children_spec.rb +12 -2
- data/spec/unit/mutant/context_spec.rb +85 -1
- data/spec/unit/mutant/diff_spec.rb +9 -0
- data/spec/unit/mutant/mutation_spec.rb +55 -4
- data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +3 -3
- data/spec/unit/mutant/reporter/cli/printer_spec.rb +27 -6
- data/spec/unit/mutant/reporter/null_spec.rb +5 -15
- data/spec/unit/mutant/reporter/sequence_spec.rb +29 -0
- data/spec/unit/mutant/result/class_methods_spec.rb +49 -0
- data/spec/unit/mutant/result/mutation_spec.rb +49 -0
- data/spec/unit/mutant/result/subject_spec.rb +84 -19
- data/spec/unit/mutant/result_spec.rb +18 -10
- data/spec/unit/mutant/subject/method/instance_spec.rb +3 -3
- data/spec/unit/mutant/subject/method/singleton_spec.rb +1 -1
- metadata +19 -22
- data/lib/mutant/context/scope.rb +0 -94
- data/lib/mutant/delegator.rb +0 -43
- data/spec/unit/mutant/context/root_spec.rb +0 -11
- data/spec/unit/mutant/context/scope/root_spec.rb +0 -32
- data/spec/unit/mutant/context/scope/unqualified_name_spec.rb +0 -25
- data/spec/unit/mutant/context/scope_spec.rb +0 -11
@@ -1,17 +1,17 @@
|
|
1
1
|
RSpec.describe Mutant::Result do
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
include Mutant::Result
|
2
|
+
let(:object) do
|
3
|
+
Class.new do
|
4
|
+
include Mutant::Result, Concord.new(:runtime, :killtime)
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
def collection
|
7
|
+
[[1]]
|
8
|
+
end
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
|
10
|
+
sum :length, :collection
|
11
|
+
end.new(3.0, 1.0)
|
12
|
+
end
|
14
13
|
|
14
|
+
describe '.included' do
|
15
15
|
it 'includes mixin to freeze instances' do
|
16
16
|
expect(object.frozen?).to be(true)
|
17
17
|
end
|
@@ -20,4 +20,12 @@ RSpec.describe Mutant::Result do
|
|
20
20
|
expect(object.length).to be(1)
|
21
21
|
end
|
22
22
|
end
|
23
|
+
|
24
|
+
describe '#overhead' do
|
25
|
+
subject { object.overhead }
|
26
|
+
|
27
|
+
it 'returns difference between runtime and killtime' do
|
28
|
+
should eql(2.0)
|
29
|
+
end
|
30
|
+
end
|
23
31
|
end
|
@@ -2,7 +2,7 @@ RSpec.describe Mutant::Subject::Method::Instance do
|
|
2
2
|
let(:object) { described_class.new(context, node) }
|
3
3
|
|
4
4
|
let(:context) do
|
5
|
-
Mutant::Context
|
5
|
+
Mutant::Context.new(
|
6
6
|
scope,
|
7
7
|
instance_double(Pathname)
|
8
8
|
)
|
@@ -48,7 +48,7 @@ RSpec.describe Mutant::Subject::Method::Instance do
|
|
48
48
|
describe '#prepare' do
|
49
49
|
|
50
50
|
let(:context) do
|
51
|
-
Mutant::Context
|
51
|
+
Mutant::Context.new(scope, instance_double(Pathname))
|
52
52
|
end
|
53
53
|
|
54
54
|
subject { object.prepare }
|
@@ -78,7 +78,7 @@ RSpec.describe Mutant::Subject::Method::Instance::Memoized do
|
|
78
78
|
describe '#prepare' do
|
79
79
|
|
80
80
|
let(:context) do
|
81
|
-
Mutant::Context
|
81
|
+
Mutant::Context.new(scope, double('Source Path'))
|
82
82
|
end
|
83
83
|
|
84
84
|
let(:scope) do
|
@@ -4,7 +4,7 @@ RSpec.describe Mutant::Subject::Method::Singleton do
|
|
4
4
|
let(:node) { s(:defs, s(:self), :foo, s(:args)) }
|
5
5
|
|
6
6
|
let(:context) do
|
7
|
-
Mutant::Context
|
7
|
+
Mutant::Context.new(scope, instance_double(Pathname))
|
8
8
|
end
|
9
9
|
|
10
10
|
let(:scope) do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: mutant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Schirp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-01-
|
11
|
+
date: 2016-01-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: 2.3.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.
|
26
|
+
version: 2.3.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: ast
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '2.
|
33
|
+
version: '2.2'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '2.
|
40
|
+
version: '2.2'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: diff-lcs
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -72,14 +72,14 @@ dependencies:
|
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: 0.2.
|
75
|
+
version: 0.2.6
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: 0.2.
|
82
|
+
version: 0.2.6
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: procto
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -114,14 +114,14 @@ dependencies:
|
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: 0.2.
|
117
|
+
version: 0.2.5
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: 0.2.
|
124
|
+
version: 0.2.5
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: ice_nine
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
@@ -212,14 +212,14 @@ dependencies:
|
|
212
212
|
requirements:
|
213
213
|
- - "~>"
|
214
214
|
- !ruby/object:Gem::Version
|
215
|
-
version: 0.1.
|
215
|
+
version: 0.1.3
|
216
216
|
type: :development
|
217
217
|
prerelease: false
|
218
218
|
version_requirements: !ruby/object:Gem::Requirement
|
219
219
|
requirements:
|
220
220
|
- - "~>"
|
221
221
|
- !ruby/object:Gem::Version
|
222
|
-
version: 0.1.
|
222
|
+
version: 0.1.3
|
223
223
|
- !ruby/object:Gem::Dependency
|
224
224
|
name: bundler
|
225
225
|
requirement: !ruby/object:Gem::Requirement
|
@@ -301,8 +301,6 @@ files:
|
|
301
301
|
- lib/mutant/color.rb
|
302
302
|
- lib/mutant/config.rb
|
303
303
|
- lib/mutant/context.rb
|
304
|
-
- lib/mutant/context/scope.rb
|
305
|
-
- lib/mutant/delegator.rb
|
306
304
|
- lib/mutant/diff.rb
|
307
305
|
- lib/mutant/env.rb
|
308
306
|
- lib/mutant/env/bootstrap.rb
|
@@ -411,6 +409,7 @@ files:
|
|
411
409
|
- lib/mutant/reporter/cli/printer/test_result.rb
|
412
410
|
- lib/mutant/reporter/cli/tput.rb
|
413
411
|
- lib/mutant/reporter/null.rb
|
412
|
+
- lib/mutant/reporter/sequence.rb
|
414
413
|
- lib/mutant/repository.rb
|
415
414
|
- lib/mutant/require_highjack.rb
|
416
415
|
- lib/mutant/result.rb
|
@@ -516,10 +515,6 @@ files:
|
|
516
515
|
- spec/unit/mutant/ast/sexp_spec.rb
|
517
516
|
- spec/unit/mutant/ast_spec.rb
|
518
517
|
- spec/unit/mutant/cli_spec.rb
|
519
|
-
- spec/unit/mutant/context/root_spec.rb
|
520
|
-
- spec/unit/mutant/context/scope/root_spec.rb
|
521
|
-
- spec/unit/mutant/context/scope/unqualified_name_spec.rb
|
522
|
-
- spec/unit/mutant/context/scope_spec.rb
|
523
518
|
- spec/unit/mutant/context_spec.rb
|
524
519
|
- spec/unit/mutant/diff_spec.rb
|
525
520
|
- spec/unit/mutant/env/boostrap_spec.rb
|
@@ -569,10 +564,13 @@ files:
|
|
569
564
|
- spec/unit/mutant/reporter/cli/tput_spec.rb
|
570
565
|
- spec/unit/mutant/reporter/cli_spec.rb
|
571
566
|
- spec/unit/mutant/reporter/null_spec.rb
|
567
|
+
- spec/unit/mutant/reporter/sequence_spec.rb
|
572
568
|
- spec/unit/mutant/repository/diff_spec.rb
|
573
569
|
- spec/unit/mutant/repository/subject_filter_spec.rb
|
574
570
|
- spec/unit/mutant/require_highjack_spec.rb
|
571
|
+
- spec/unit/mutant/result/class_methods_spec.rb
|
575
572
|
- spec/unit/mutant/result/env_spec.rb
|
573
|
+
- spec/unit/mutant/result/mutation_spec.rb
|
576
574
|
- spec/unit/mutant/result/subject_spec.rb
|
577
575
|
- spec/unit/mutant/result_spec.rb
|
578
576
|
- spec/unit/mutant/runner/driver_spec.rb
|
@@ -634,10 +632,6 @@ test_files:
|
|
634
632
|
- spec/unit/mutant/ast/sexp_spec.rb
|
635
633
|
- spec/unit/mutant/ast_spec.rb
|
636
634
|
- spec/unit/mutant/cli_spec.rb
|
637
|
-
- spec/unit/mutant/context/root_spec.rb
|
638
|
-
- spec/unit/mutant/context/scope/root_spec.rb
|
639
|
-
- spec/unit/mutant/context/scope/unqualified_name_spec.rb
|
640
|
-
- spec/unit/mutant/context/scope_spec.rb
|
641
635
|
- spec/unit/mutant/context_spec.rb
|
642
636
|
- spec/unit/mutant/diff_spec.rb
|
643
637
|
- spec/unit/mutant/env/boostrap_spec.rb
|
@@ -687,10 +681,13 @@ test_files:
|
|
687
681
|
- spec/unit/mutant/reporter/cli/tput_spec.rb
|
688
682
|
- spec/unit/mutant/reporter/cli_spec.rb
|
689
683
|
- spec/unit/mutant/reporter/null_spec.rb
|
684
|
+
- spec/unit/mutant/reporter/sequence_spec.rb
|
690
685
|
- spec/unit/mutant/repository/diff_spec.rb
|
691
686
|
- spec/unit/mutant/repository/subject_filter_spec.rb
|
692
687
|
- spec/unit/mutant/require_highjack_spec.rb
|
688
|
+
- spec/unit/mutant/result/class_methods_spec.rb
|
693
689
|
- spec/unit/mutant/result/env_spec.rb
|
690
|
+
- spec/unit/mutant/result/mutation_spec.rb
|
694
691
|
- spec/unit/mutant/result/subject_spec.rb
|
695
692
|
- spec/unit/mutant/result_spec.rb
|
696
693
|
- spec/unit/mutant/runner/driver_spec.rb
|
data/lib/mutant/context/scope.rb
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
module Mutant
|
2
|
-
class Context
|
3
|
-
# Scope context for mutation (Class or Module)
|
4
|
-
class Scope < self
|
5
|
-
include Adamantium::Flat, Concord::Public.new(:scope, :source_path)
|
6
|
-
extend AST::Sexp
|
7
|
-
|
8
|
-
NAMESPACE_DELIMITER = '::'.freeze
|
9
|
-
|
10
|
-
# Return root node for mutation
|
11
|
-
#
|
12
|
-
# @return [Parser::AST::Node]
|
13
|
-
def root(node)
|
14
|
-
nesting.reverse.reduce(node) do |current, scope|
|
15
|
-
self.class.wrap(scope, current)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# Identification string
|
20
|
-
#
|
21
|
-
# @return [String]
|
22
|
-
def identification
|
23
|
-
scope.name
|
24
|
-
end
|
25
|
-
|
26
|
-
# Wrap node into ast node
|
27
|
-
#
|
28
|
-
# @param [Class, Module] scope
|
29
|
-
# @param [Parser::AST::Node] node
|
30
|
-
#
|
31
|
-
# @return [Parser::AST::Class]
|
32
|
-
# if scope is of kind Class
|
33
|
-
#
|
34
|
-
# @return [Parser::AST::Module]
|
35
|
-
# if scope is of kind module
|
36
|
-
def self.wrap(scope, node)
|
37
|
-
name = s(:const, nil, scope.name.split(NAMESPACE_DELIMITER).last.to_sym)
|
38
|
-
case scope
|
39
|
-
when Class
|
40
|
-
s(:class, name, nil, node)
|
41
|
-
when Module
|
42
|
-
s(:module, name, node)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
# Nesting of scope
|
47
|
-
#
|
48
|
-
# @return [Enumerable<Class,Module>]
|
49
|
-
def nesting
|
50
|
-
const = ::Object
|
51
|
-
name_nesting.each_with_object([]) do |name, nesting|
|
52
|
-
const = const.const_get(name)
|
53
|
-
nesting << const
|
54
|
-
end
|
55
|
-
end
|
56
|
-
memoize :nesting
|
57
|
-
|
58
|
-
# Unqualified name of scope
|
59
|
-
#
|
60
|
-
# @return [String]
|
61
|
-
def unqualified_name
|
62
|
-
name_nesting.last
|
63
|
-
end
|
64
|
-
|
65
|
-
# Match expressions for scope
|
66
|
-
#
|
67
|
-
# @return [Enumerable<Expression>]
|
68
|
-
def match_expressions
|
69
|
-
name_nesting.each_index.reverse_each.map do |index|
|
70
|
-
Expression::Namespace::Recursive.new(
|
71
|
-
scope_name: name_nesting.take(index.succ).join(NAMESPACE_DELIMITER)
|
72
|
-
)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
memoize :match_expressions
|
76
|
-
|
77
|
-
# Scope wrapped by context
|
78
|
-
#
|
79
|
-
# @return [::Module|::Class]
|
80
|
-
attr_reader :scope
|
81
|
-
|
82
|
-
private
|
83
|
-
|
84
|
-
# Nesting of names in scope
|
85
|
-
#
|
86
|
-
# @return [Array<String>]
|
87
|
-
def name_nesting
|
88
|
-
scope.name.split(NAMESPACE_DELIMITER)
|
89
|
-
end
|
90
|
-
memoize :name_nesting
|
91
|
-
|
92
|
-
end # Scope
|
93
|
-
end # Context
|
94
|
-
end # Mutant
|
data/lib/mutant/delegator.rb
DELETED
@@ -1,43 +0,0 @@
|
|
1
|
-
module Mutant
|
2
|
-
# A simple delegator with opinions
|
3
|
-
module Delegator
|
4
|
-
# Class level mixins
|
5
|
-
module ClassMethods
|
6
|
-
|
7
|
-
private
|
8
|
-
|
9
|
-
# Create delegators to object
|
10
|
-
#
|
11
|
-
# @return [undefined]
|
12
|
-
def delegate(*names)
|
13
|
-
names.each(&method(:define_delegator))
|
14
|
-
end
|
15
|
-
|
16
|
-
# Create delegator to object
|
17
|
-
#
|
18
|
-
# @param [Symbol] name
|
19
|
-
#
|
20
|
-
# @return [undefined]
|
21
|
-
def define_delegator(name)
|
22
|
-
fail "method #{name} already defined" if instance_methods.include?(name)
|
23
|
-
define_method(name) do
|
24
|
-
object.public_send(name)
|
25
|
-
end
|
26
|
-
private name
|
27
|
-
end
|
28
|
-
|
29
|
-
end # ClassMethods
|
30
|
-
|
31
|
-
# Hook called when module is included
|
32
|
-
#
|
33
|
-
# @param [Class,Module] host
|
34
|
-
#
|
35
|
-
# @return [undefined]
|
36
|
-
def self.included(host)
|
37
|
-
super
|
38
|
-
|
39
|
-
host.extend(ClassMethods)
|
40
|
-
end
|
41
|
-
|
42
|
-
end # Delegator
|
43
|
-
end # Mutant
|
@@ -1,32 +0,0 @@
|
|
1
|
-
RSpec.describe Mutant::Context::Scope, '#root' do
|
2
|
-
subject { object.root(node) }
|
3
|
-
|
4
|
-
let(:object) { described_class.new(TestApp::Literal, path) }
|
5
|
-
let(:path) { instance_double(Pathname) }
|
6
|
-
let(:node) { parse(':node') }
|
7
|
-
|
8
|
-
let(:scope) { subject.body }
|
9
|
-
let(:scope_body) { scope.body }
|
10
|
-
|
11
|
-
let(:expected_source) do
|
12
|
-
generate(parse(<<-RUBY))
|
13
|
-
module TestApp
|
14
|
-
class Literal
|
15
|
-
:node
|
16
|
-
end
|
17
|
-
end
|
18
|
-
RUBY
|
19
|
-
end
|
20
|
-
|
21
|
-
let(:generated_source) do
|
22
|
-
Unparser.unparse(subject)
|
23
|
-
end
|
24
|
-
|
25
|
-
let(:round_tripped_source) do
|
26
|
-
Unparser.unparse(parse(expected_source))
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'should create correct source' do
|
30
|
-
expect(generated_source).to eql(expected_source)
|
31
|
-
end
|
32
|
-
end
|
@@ -1,25 +0,0 @@
|
|
1
|
-
RSpec.describe Mutant::Context::Scope, '#unqualified_name' do
|
2
|
-
subject { object.unqualified_name }
|
3
|
-
|
4
|
-
let(:path) { instance_double(Pathname) }
|
5
|
-
|
6
|
-
context 'with top level constant name' do
|
7
|
-
let(:object) { described_class.new(TestApp, path) }
|
8
|
-
|
9
|
-
it 'should return the unqualified name' do
|
10
|
-
should eql('TestApp')
|
11
|
-
end
|
12
|
-
|
13
|
-
it_should_behave_like 'an idempotent method'
|
14
|
-
end
|
15
|
-
|
16
|
-
context 'with scoped constant name' do
|
17
|
-
let(:object) { described_class.new(TestApp::Literal, path) }
|
18
|
-
|
19
|
-
it 'should return the unqualified name' do
|
20
|
-
should eql('Literal')
|
21
|
-
end
|
22
|
-
|
23
|
-
it_should_behave_like 'an idempotent method'
|
24
|
-
end
|
25
|
-
end
|