mutant 0.3.0.beta13 → 0.3.0.beta14
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.devtools +5 -4
- data/circle.yml +4 -0
- data/config/flay.yml +1 -1
- data/lib/mutant/constants.rb +22 -4
- data/lib/mutant/mutator/node.rb +14 -0
- data/lib/mutant/mutator/node/generic.rb +6 -5
- data/lib/mutant/mutator/node/send.rb +16 -4
- data/lib/mutant/runner/config.rb +1 -1
- data/mutant.gemspec +2 -2
- data/spec/unit/mutant/cli/class_methods/new_spec.rb +2 -2
- data/spec/unit/mutant/cli/class_methods/run_spec.rb +6 -6
- data/spec/unit/mutant/cli/classifier/class_methods/build_spec.rb +5 -5
- 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/differ/class_methods/colorize_line_spec.rb +3 -0
- data/spec/unit/mutant/differ/diff_spec.rb +4 -4
- data/spec/unit/mutant/killer/rspec/class_methods/new_spec.rb +4 -4
- data/spec/unit/mutant/killer/success_predicate_spec.rb +4 -4
- data/spec/unit/mutant/loader/eval/class_methods/run_spec.rb +4 -4
- data/spec/unit/mutant/matcher/chain/each_spec.rb +4 -4
- data/spec/unit/mutant/matcher/chain/matchers_spec.rb +1 -1
- data/spec/unit/mutant/matcher/method/instance/class_methods/build_spec.rb +1 -1
- data/spec/unit/mutant/matcher/methods/instance/each_spec.rb +3 -3
- data/spec/unit/mutant/matcher/methods/singleton/each_spec.rb +3 -3
- data/spec/unit/mutant/matcher/namespace/each_spec.rb +5 -5
- data/spec/unit/mutant/mutator/node/send/mutation_spec.rb +11 -1
- data/spec/unit/mutant/runner/config/subjects_spec.rb +6 -6
- data/spec/unit/mutant/runner/config/success_predicate_spec.rb +6 -6
- data/spec/unit/mutant/runner/failed_predicte_spec.rb +1 -1
- data/spec/unit/mutant/runner/mutation/killer_spec.rb +5 -5
- data/spec/unit/mutant/runner/subject/success_predicate_spec.rb +6 -6
- data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/instance/spec_files_spec.rb +5 -5
- data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/singleton/spec_files_spec.rb +5 -5
- data/spec/unit/mutant/subject/context_spec.rb +2 -2
- data/spec/unit/mutant/subject/each_spec.rb +5 -5
- data/spec/unit/mutant/subject/node_spec.rb +2 -2
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c1b02e2a004b27eb4c96785f88d431d6f352ad5b
|
4
|
+
data.tar.gz: 12d62f0e44af09e2711244278c8cdfe67e512fa6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2cb7ddcbee74e216a95bed6f22fe576fadbe0230d06e08b8bd15ee933338029c0351dc9833925fb2cabb203d31b88d4b147ba98f584f1e04db75f7c3d8bca9d
|
7
|
+
data.tar.gz: 750a4ea68ad7d76e8b8f0d6a5825c9c16a703324c20c1e5bfcd46fea48a8620134b4d31cdf3cbcf02e1db5bc0f68957d6b23964f55647f3927dedd203edd0cb3
|
data/Gemfile.devtools
CHANGED
@@ -3,17 +3,18 @@
|
|
3
3
|
group :development do
|
4
4
|
gem 'rake', '~> 10.1.0'
|
5
5
|
gem 'rspec', '~> 2.13.0'
|
6
|
-
gem 'yard', '~> 0.8.6.
|
6
|
+
gem 'yard', '~> 0.8.6.2'
|
7
7
|
end
|
8
8
|
|
9
9
|
group :yard do
|
10
|
-
gem 'kramdown', '~> 1.0
|
10
|
+
gem 'kramdown', '~> 1.1.0'
|
11
11
|
end
|
12
12
|
|
13
13
|
group :guard do
|
14
14
|
gem 'guard', '~> 1.8.1'
|
15
15
|
gem 'guard-bundler', '~> 1.0.0'
|
16
16
|
gem 'guard-rspec', '~> 3.0.2'
|
17
|
+
gem 'guard-rubocop', '~> 0.2.0'
|
17
18
|
|
18
19
|
# file system change event handling
|
19
20
|
gem 'listen', '~> 1.2.2'
|
@@ -28,16 +29,16 @@ group :guard do
|
|
28
29
|
end
|
29
30
|
|
30
31
|
group :metrics do
|
31
|
-
gem 'backports', '~> 3.3', '>= 3.3.2'
|
32
32
|
gem 'coveralls', '~> 0.6.7'
|
33
33
|
gem 'flay', '~> 2.3.0'
|
34
34
|
gem 'flog', '~> 4.1.0'
|
35
35
|
gem 'reek', '~> 1.3.1', :git => 'https://github.com/troessner/reek.git'
|
36
|
+
gem 'rubocop', '~> 0.9.1'
|
36
37
|
gem 'simplecov', '~> 0.7.1'
|
37
38
|
gem 'yardstick', '~> 0.9.6'
|
38
39
|
|
39
40
|
platforms :ruby_19 do
|
40
|
-
gem '
|
41
|
+
gem 'json', '~> 1.8.0'
|
41
42
|
end
|
42
43
|
|
43
44
|
platforms :rbx do
|
data/circle.yml
ADDED
data/config/flay.yml
CHANGED
data/lib/mutant/constants.rb
CHANGED
@@ -6,6 +6,20 @@ module Mutant
|
|
6
6
|
'!' => '_bang'
|
7
7
|
}.freeze
|
8
8
|
|
9
|
+
# Set of not assignable nodes
|
10
|
+
NOT_ASSIGNABLE = [
|
11
|
+
:int, :float, :str, :dstr, :class, :module, :self
|
12
|
+
].to_set.freeze
|
13
|
+
|
14
|
+
# Set of op assign types
|
15
|
+
OP_ASSIGN = [
|
16
|
+
:or_asgn, :and_asgn
|
17
|
+
].to_set.freeze
|
18
|
+
|
19
|
+
# Set of node types that are not valid when emitted standalone
|
20
|
+
NOT_STANDALONE = [ :splat, :block_pass ].to_set.freeze
|
21
|
+
|
22
|
+
|
9
23
|
OPERATOR_EXPANSIONS = {
|
10
24
|
:<=> => :spaceship_operator,
|
11
25
|
:=== => :case_equality_operator,
|
@@ -42,9 +56,12 @@ module Mutant
|
|
42
56
|
:~@, :+@, :-@, :'!'
|
43
57
|
].freeze
|
44
58
|
|
45
|
-
BINARY_METHOD_OPERATORS = (
|
59
|
+
BINARY_METHOD_OPERATORS = (
|
60
|
+
OPERATOR_EXPANSIONS.keys - (INDEX_OPERATORS + UNARY_METHOD_OPERATORS)
|
61
|
+
).to_set.freeze
|
46
62
|
|
47
|
-
OPERATOR_METHODS =
|
63
|
+
OPERATOR_METHODS =
|
64
|
+
OPERATOR_EXPANSIONS.keys + INDEX_OPERATORS + UNARY_METHOD_OPERATORS
|
48
65
|
|
49
66
|
# Hopefully all types parser does generate
|
50
67
|
NODE_TYPES = [
|
@@ -61,6 +78,7 @@ module Mutant
|
|
61
78
|
:xstr, :def, :defs, :case, :when, :ivar, :lvar, :cvar, :gvar,
|
62
79
|
:back_ref, :const, :nth_ref, :class, :sclass, :yield,
|
63
80
|
:match_with_lvasgn, :match_current_line, :irange, :erange,
|
64
|
-
:or_asgn, :kwbegin
|
81
|
+
:or_asgn, :kwbegin, :and_asgn
|
65
82
|
].to_set.freeze
|
66
|
-
|
83
|
+
|
84
|
+
end # Mutant
|
data/lib/mutant/mutator/node.rb
CHANGED
@@ -204,6 +204,20 @@ module Mutant
|
|
204
204
|
end
|
205
205
|
end
|
206
206
|
|
207
|
+
# Return parent type
|
208
|
+
#
|
209
|
+
# @return [Symbol] type
|
210
|
+
# if parent with type is presnet
|
211
|
+
#
|
212
|
+
# @return [nil]
|
213
|
+
# otherwise
|
214
|
+
#
|
215
|
+
# @api private
|
216
|
+
#
|
217
|
+
def parent_type
|
218
|
+
parent && parent.node.type
|
219
|
+
end
|
220
|
+
|
207
221
|
end # Node
|
208
222
|
end # Mutator
|
209
223
|
end # Mutant
|
@@ -6,16 +6,17 @@ module Mutant
|
|
6
6
|
|
7
7
|
handle(:self)
|
8
8
|
|
9
|
-
# These nodes still need a dedicated mutator,
|
9
|
+
# These nodes still need a dedicated mutator,
|
10
|
+
# your contribution is that close!
|
10
11
|
handle(
|
11
12
|
:zsuper, :not, :or, :and, :defined,
|
12
13
|
:next, :break, :match, :gvar, :cvar, :ensure,
|
13
14
|
:dstr, :dsym, :yield, :rescue, :redo, :defined?,
|
14
|
-
:lvar, :splat, :const, :blockarg, :block_pass, :op_asgn, :
|
15
|
-
:ivar, :restarg, :casgn, :resbody, :retry, :arg_expr,
|
15
|
+
:lvar, :splat, :const, :blockarg, :block_pass, :op_asgn, :and_asgn,
|
16
|
+
:regopt, :ivar, :restarg, :casgn, :resbody, :retry, :arg_expr,
|
16
17
|
:kwrestarg, :kwoptarg, :kwarg, :undef, :module, :cbase, :empty,
|
17
|
-
:alias, :for, :xstr, :back_ref, :nth_ref, :class,
|
18
|
-
:match_current_line, :or_asgn, :kwbegin
|
18
|
+
:alias, :for, :xstr, :back_ref, :nth_ref, :class,
|
19
|
+
:sclass, :match_with_lvasgn, :match_current_line, :or_asgn, :kwbegin
|
19
20
|
)
|
20
21
|
|
21
22
|
private
|
@@ -95,12 +95,26 @@ module Mutant
|
|
95
95
|
# @api private
|
96
96
|
#
|
97
97
|
def normal_dispatch
|
98
|
-
|
98
|
+
emit_naked_receiver
|
99
99
|
mutate_receiver
|
100
100
|
emit_argument_propagation
|
101
101
|
mutate_arguments
|
102
102
|
end
|
103
103
|
|
104
|
+
# Emit naked receiver mutation
|
105
|
+
#
|
106
|
+
# @return [undefined]
|
107
|
+
#
|
108
|
+
# @api private
|
109
|
+
#
|
110
|
+
def emit_naked_receiver
|
111
|
+
return unless receiver
|
112
|
+
op_assign = OP_ASSIGN.include?(parent_type)
|
113
|
+
not_assignable = NOT_ASSIGNABLE.include?(receiver.type)
|
114
|
+
return if op_assign and not_assignable
|
115
|
+
emit(receiver)
|
116
|
+
end
|
117
|
+
|
104
118
|
# Test for binary operator
|
105
119
|
#
|
106
120
|
# @return [true]
|
@@ -130,8 +144,6 @@ module Mutant
|
|
130
144
|
end
|
131
145
|
end
|
132
146
|
|
133
|
-
NO_PROPAGATE = [ :splat, :block_pass ].to_set
|
134
|
-
|
135
147
|
# Emit argument propagation
|
136
148
|
#
|
137
149
|
# @return [undefined]
|
@@ -141,7 +153,7 @@ module Mutant
|
|
141
153
|
def emit_argument_propagation
|
142
154
|
return unless arguments.one?
|
143
155
|
node = arguments.first
|
144
|
-
return if
|
156
|
+
return if NOT_STANDALONE.include?(node.type)
|
145
157
|
emit(arguments.first)
|
146
158
|
end
|
147
159
|
|
data/lib/mutant/runner/config.rb
CHANGED
data/mutant.gemspec
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |gem|
|
4
4
|
gem.name = 'mutant'
|
5
|
-
gem.version = '0.3.0.
|
5
|
+
gem.version = '0.3.0.beta14'
|
6
6
|
gem.authors = [ 'Markus Schirp' ]
|
7
7
|
gem.email = [ 'mbj@schirp-dso.com' ]
|
8
8
|
|
@@ -16,7 +16,7 @@ Gem::Specification.new do |gem|
|
|
16
16
|
gem.extra_rdoc_files = %w[TODO LICENSE]
|
17
17
|
gem.executables = [ 'mutant', 'zombie' ]
|
18
18
|
|
19
|
-
gem.add_runtime_dependency('parser', '~> 2.0.
|
19
|
+
gem.add_runtime_dependency('parser', '~> 2.0.pre2')
|
20
20
|
gem.add_runtime_dependency('unparser', '~> 0.0.8')
|
21
21
|
gem.add_runtime_dependency('ice_nine', '~> 0.8.0')
|
22
22
|
gem.add_runtime_dependency('descendants_tracker', '~> 0.0.1')
|
@@ -77,7 +77,7 @@ describe Mutant::CLI, '.new' do
|
|
77
77
|
end
|
78
78
|
|
79
79
|
context 'with namespace matcher' do
|
80
|
-
let(:arguments) { %w(--rspec-unit ::TestApp*)
|
80
|
+
let(:arguments) { %w(--rspec-unit ::TestApp*) }
|
81
81
|
let(:expected_matcher) { Mutant::CLI::Classifier::Namespace::Recursive.new(Mutant::Cache.new, '::TestApp*') }
|
82
82
|
|
83
83
|
it_should_behave_like 'a cli parser'
|
@@ -94,7 +94,7 @@ describe Mutant::CLI, '.new' do
|
|
94
94
|
end
|
95
95
|
|
96
96
|
let(:expected_matcher) { Mutant::CLI::Classifier::Method.new(Mutant::Cache.new, 'TestApp::Literal#float') }
|
97
|
-
let(:expected_filter) { Mutant::Mutation::Filter::Whitelist.new(filters)
|
97
|
+
let(:expected_filter) { Mutant::Mutation::Filter::Whitelist.new(filters) }
|
98
98
|
|
99
99
|
it_should_behave_like 'a cli parser'
|
100
100
|
end
|
@@ -3,12 +3,12 @@ require 'spec_helper'
|
|
3
3
|
describe Mutant::CLI, '.run' do
|
4
4
|
subject { object.run(argv) }
|
5
5
|
|
6
|
-
let(:object) { described_class
|
7
|
-
let(:argv) {
|
8
|
-
let(:attributes) {
|
9
|
-
let(:runner) {
|
10
|
-
let(:config) {
|
11
|
-
let(:instance) {
|
6
|
+
let(:object) { described_class }
|
7
|
+
let(:argv) { double('ARGV') }
|
8
|
+
let(:attributes) { double('Options') }
|
9
|
+
let(:runner) { double('Runner', :success? => success) }
|
10
|
+
let(:config) { double('Config') }
|
11
|
+
let(:instance) { double(described_class.name, :config => config) }
|
12
12
|
|
13
13
|
before do
|
14
14
|
described_class.stub(:new => instance)
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Mutant::CLI::Classifier, '.build' do
|
4
4
|
subject { described_class.build(cache, input) }
|
5
5
|
|
6
|
-
let(:cache) {
|
6
|
+
let(:cache) { double('Cache') }
|
7
7
|
|
8
8
|
this_spec = 'Mutant::CLI::Classifier.build'
|
9
9
|
|
@@ -12,25 +12,25 @@ describe Mutant::CLI::Classifier, '.build' do
|
|
12
12
|
should eql(expected_class.new(cache, expected_class::REGEXP.match(input)))
|
13
13
|
end
|
14
14
|
|
15
|
-
let(:expected_class)
|
15
|
+
let(:expected_class) { Mutant::CLI::Classifier::Method }
|
16
16
|
end
|
17
17
|
|
18
18
|
context 'with explicit toplevel scope' do
|
19
19
|
|
20
|
-
let(:input)
|
20
|
+
let(:input) { '::TestApp::Literal#string' }
|
21
21
|
|
22
22
|
it_should_behave_like this_spec
|
23
23
|
end
|
24
24
|
|
25
25
|
context 'with instance method notation' do
|
26
26
|
|
27
|
-
let(:input)
|
27
|
+
let(:input) { 'TestApp::Literal#string' }
|
28
28
|
|
29
29
|
it_should_behave_like this_spec
|
30
30
|
end
|
31
31
|
|
32
32
|
context 'with singleton method notation' do
|
33
|
-
let(:input)
|
33
|
+
let(:input) { 'TestApp::Literal.string' }
|
34
34
|
|
35
35
|
it_should_behave_like this_spec
|
36
36
|
end
|
@@ -4,7 +4,7 @@ describe Mutant::Context::Scope, '#root' do
|
|
4
4
|
subject { object.root(node) }
|
5
5
|
|
6
6
|
let(:object) { described_class.new(TestApp::Literal, path) }
|
7
|
-
let(:path) {
|
7
|
+
let(:path) { double('Path') }
|
8
8
|
let(:node) { parse(':node') }
|
9
9
|
|
10
10
|
let(:scope) { subject.body }
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Mutant::Context::Scope, '#unqualified_name' do
|
4
4
|
subject { object.unqualified_name }
|
5
5
|
|
6
|
-
let(:path) {
|
6
|
+
let(:path) { double('Path') }
|
7
7
|
|
8
8
|
context 'with top level constant name' do
|
9
9
|
let(:object) { described_class.new(TestApp, path) }
|
@@ -7,16 +7,19 @@ describe Mutant::Differ, '.colorize_line' do
|
|
7
7
|
|
8
8
|
context 'line beginning with "+"' do
|
9
9
|
let(:line) { '+line' }
|
10
|
+
|
10
11
|
it { should eql(Mutant::Color::GREEN.format(line)) }
|
11
12
|
end
|
12
13
|
|
13
14
|
context 'line beginning with "-"' do
|
14
15
|
let(:line) { '-line' }
|
16
|
+
|
15
17
|
it { should eql(Mutant::Color::RED.format(line)) }
|
16
18
|
end
|
17
19
|
|
18
20
|
context 'line beginning in other char' do
|
19
21
|
let(:line) { ' line' }
|
22
|
+
|
20
23
|
it { should eql(line) }
|
21
24
|
end
|
22
25
|
end
|
@@ -15,7 +15,7 @@ describe Mutant::Differ, '#diff' do
|
|
15
15
|
end
|
16
16
|
|
17
17
|
context 'when there is a diff NOT at begin of hunk' do
|
18
|
-
let(:old) { %w(foo bar)
|
18
|
+
let(:old) { %w(foo bar) }
|
19
19
|
let(:new) { %w(foo baz bar) }
|
20
20
|
|
21
21
|
it { should eql("@@ -1,3 +1,4 @@\n foo\n+baz\n bar\n") }
|
@@ -24,7 +24,7 @@ describe Mutant::Differ, '#diff' do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
context 'when the diff has a long context at begin' do
|
27
|
-
let(:old) { %w(foo bar baz boz a b c)
|
27
|
+
let(:old) { %w(foo bar baz boz a b c) }
|
28
28
|
let(:new) { %w(foo bar baz boz a b c other) }
|
29
29
|
|
30
30
|
it { should eql("@@ -1,8 +1,9 @@\n foo\n bar\n baz\n boz\n a\n b\n c\n+other\n") }
|
@@ -34,7 +34,7 @@ describe Mutant::Differ, '#diff' do
|
|
34
34
|
|
35
35
|
context 'when the diff has a long context at end, deleting' do
|
36
36
|
let(:old) { %w(other foo bar baz boz a b c) }
|
37
|
-
let(:new) { %w(foo bar baz boz a b c)
|
37
|
+
let(:new) { %w(foo bar baz boz a b c) }
|
38
38
|
|
39
39
|
it { should eql("@@ -1,9 +1,8 @@\n-other\n foo\n bar\n baz\n boz\n a\n b\n c\n") }
|
40
40
|
|
@@ -42,7 +42,7 @@ describe Mutant::Differ, '#diff' do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
context 'when the diff has a long context at end, inserting' do
|
45
|
-
let(:old) { %w(foo bar baz boz a b c)
|
45
|
+
let(:old) { %w(foo bar baz boz a b c) }
|
46
46
|
let(:new) { %w(other foo bar baz boz a b c) }
|
47
47
|
|
48
48
|
it { should eql("@@ -1,8 +1,9 @@\n+other\n foo\n bar\n baz\n boz\n a\n b\n c\n") }
|
@@ -4,10 +4,10 @@ describe Mutant::Killer::Rspec, '.new' do
|
|
4
4
|
|
5
5
|
subject { object.new(strategy, mutation) }
|
6
6
|
|
7
|
-
let(:strategy) {
|
8
|
-
let(:context) {
|
9
|
-
let(:mutation) {
|
10
|
-
let(:mutation_subject) {
|
7
|
+
let(:strategy) { double('Strategy', :spec_files => ['foo'], :error_stream => $stderr, :output_stream => $stdout) }
|
8
|
+
let(:context) { double('Context') }
|
9
|
+
let(:mutation) { double('Mutation', :subject => mutation_subject) }
|
10
|
+
let(:mutation_subject) { double('Mutation Subject') }
|
11
11
|
|
12
12
|
let(:object) { described_class }
|
13
13
|
|
@@ -3,10 +3,10 @@ require 'spec_helper'
|
|
3
3
|
describe Mutant::Killer, '#success?' do
|
4
4
|
subject { object.success? }
|
5
5
|
|
6
|
-
let(:object) { class_under_test.new(strategy, mutation)
|
7
|
-
let(:strategy) {
|
8
|
-
let(:mutation) {
|
9
|
-
let(:kill_state) {
|
6
|
+
let(:object) { class_under_test.new(strategy, mutation) }
|
7
|
+
let(:strategy) { double('Strategy') }
|
8
|
+
let(:mutation) { double('Mutation', :success? => kill_state) }
|
9
|
+
let(:kill_state) { double('Kill State') }
|
10
10
|
|
11
11
|
before do
|
12
12
|
kill_state.stub(:freeze => kill_state, :dup => kill_state)
|
@@ -4,10 +4,10 @@ describe Mutant::Loader::Eval, '.run' do
|
|
4
4
|
|
5
5
|
subject { object.run(node, mutation_subject) }
|
6
6
|
|
7
|
-
let(:object) { described_class
|
8
|
-
let(:mutation_subject) {
|
9
|
-
let(:path) { 'test.rb'
|
10
|
-
let(:line) { 1
|
7
|
+
let(:object) { described_class }
|
8
|
+
let(:mutation_subject) { double('Subject', :source_path => path, :source_line => line) }
|
9
|
+
let(:path) { 'test.rb' }
|
10
|
+
let(:line) { 1 }
|
11
11
|
|
12
12
|
let(:source) do
|
13
13
|
<<-RUBY
|
@@ -7,11 +7,11 @@ describe Mutant::Matcher::Chain, '#each' do
|
|
7
7
|
|
8
8
|
let(:matchers) { [matcher_a, matcher_b] }
|
9
9
|
|
10
|
-
let(:matcher_a) {
|
11
|
-
let(:matcher_b) {
|
10
|
+
let(:matcher_a) { double('Matcher A') }
|
11
|
+
let(:matcher_b) { double('Matcher B') }
|
12
12
|
|
13
|
-
let(:subject_a) {
|
14
|
-
let(:subject_b) {
|
13
|
+
let(:subject_a) { double('Subject A') }
|
14
|
+
let(:subject_b) { double('Subject B') }
|
15
15
|
|
16
16
|
before do
|
17
17
|
matcher_a.stub(:each).and_yield(subject_a).and_return(matcher_a)
|
@@ -38,9 +38,9 @@ describe Mutant::Matcher::Methods::Instance, '#each' do
|
|
38
38
|
|
39
39
|
end
|
40
40
|
|
41
|
-
let(:subject_a) {
|
42
|
-
let(:subject_b) {
|
43
|
-
let(:subject_c) {
|
41
|
+
let(:subject_a) { double('Subject A') }
|
42
|
+
let(:subject_b) { double('Subject B') }
|
43
|
+
let(:subject_c) { double('Subject C') }
|
44
44
|
|
45
45
|
let(:subjects) { [subject_a, subject_b, subject_c] }
|
46
46
|
|
@@ -32,9 +32,9 @@ describe Mutant::Matcher::Methods::Singleton, '#each' do
|
|
32
32
|
|
33
33
|
end
|
34
34
|
|
35
|
-
let(:subject_a) {
|
36
|
-
let(:subject_b) {
|
37
|
-
let(:subject_c) {
|
35
|
+
let(:subject_a) { double('Subject A') }
|
36
|
+
let(:subject_b) { double('Subject B') }
|
37
|
+
let(:subject_c) { double('Subject C') }
|
38
38
|
|
39
39
|
let(:subjects) { [subject_a, subject_b, subject_c] }
|
40
40
|
|
@@ -3,15 +3,15 @@ require 'spec_helper'
|
|
3
3
|
describe Mutant::Matcher::Namespace, '#each' do
|
4
4
|
subject { object.each { |item| yields << item } }
|
5
5
|
|
6
|
-
let(:yields) { []
|
6
|
+
let(:yields) { [] }
|
7
7
|
let(:object) { described_class.new(cache, TestApp::Literal) }
|
8
8
|
|
9
9
|
let(:cache) { Mutant::Cache.new }
|
10
10
|
|
11
|
-
let(:singleton_a) {
|
12
|
-
let(:singleton_b) {
|
13
|
-
let(:subject_a) {
|
14
|
-
let(:subject_b) {
|
11
|
+
let(:singleton_a) { double('SingletonA', :name => 'TestApp::Literal') }
|
12
|
+
let(:singleton_b) { double('SingletonB', :name => 'TestApp::Foo') }
|
13
|
+
let(:subject_a) { double('SubjectA') }
|
14
|
+
let(:subject_b) { double('SubjectB') }
|
15
15
|
|
16
16
|
before do
|
17
17
|
Mutant::Matcher::Methods::Singleton.stub(:each).with(cache, singleton_a).and_yield(subject_a)
|
@@ -3,6 +3,17 @@ require 'spec_helper'
|
|
3
3
|
# FIXME: This spec needs to be structured better!
|
4
4
|
describe Mutant::Mutator, 'send' do
|
5
5
|
|
6
|
+
context 'inside op assign' do
|
7
|
+
let(:source) { 'self.foo ||= expression' }
|
8
|
+
|
9
|
+
let(:mutations) do
|
10
|
+
mutations = []
|
11
|
+
mutations << 'foo ||= expression'
|
12
|
+
end
|
13
|
+
|
14
|
+
it_should_behave_like 'a mutator'
|
15
|
+
end
|
16
|
+
|
6
17
|
context 'index assign' do
|
7
18
|
let(:source) { 'foo[bar]=baz' }
|
8
19
|
|
@@ -14,7 +25,6 @@ describe Mutant::Mutator, 'send' do
|
|
14
25
|
it_should_behave_like 'a mutator'
|
15
26
|
end
|
16
27
|
|
17
|
-
|
18
28
|
context 'with only a splat arg' do
|
19
29
|
let(:source) { 'foo(*bar)' }
|
20
30
|
|
@@ -6,7 +6,7 @@ describe Mutant::Runner::Config, '#subjects' do
|
|
6
6
|
subject { object.subjects }
|
7
7
|
|
8
8
|
let(:config) do
|
9
|
-
|
9
|
+
double(
|
10
10
|
'Config',
|
11
11
|
:subjects => [mutation_subject],
|
12
12
|
:strategy => strategy,
|
@@ -14,10 +14,10 @@ describe Mutant::Runner::Config, '#subjects' do
|
|
14
14
|
)
|
15
15
|
end
|
16
16
|
|
17
|
-
let(:reporter) {
|
18
|
-
let(:strategy) {
|
19
|
-
let(:mutation_subject) {
|
20
|
-
let(:subject_runner) {
|
17
|
+
let(:reporter) { double('Reporter') }
|
18
|
+
let(:strategy) { double('Strategy') }
|
19
|
+
let(:mutation_subject) { double('Mutation subject') }
|
20
|
+
let(:subject_runner) { double('Subject runner') }
|
21
21
|
|
22
22
|
class DummySubjectRunner
|
23
23
|
include Concord::Public.new(:config, :mutation)
|
@@ -32,7 +32,7 @@ describe Mutant::Runner::Config, '#subjects' do
|
|
32
32
|
stub_const('Mutant::Runner::Subject', DummySubjectRunner)
|
33
33
|
end
|
34
34
|
|
35
|
-
it { should eql([DummySubjectRunner.new(
|
35
|
+
it { should eql([DummySubjectRunner.new(config, mutation_subject)]) }
|
36
36
|
|
37
37
|
it_should_behave_like 'an idempotent method'
|
38
38
|
end
|
@@ -6,7 +6,7 @@ describe Mutant::Runner::Config, '#success?' do
|
|
6
6
|
let(:object) { described_class.run(config) }
|
7
7
|
|
8
8
|
let(:config) do
|
9
|
-
|
9
|
+
double(
|
10
10
|
'Config',
|
11
11
|
:reporter => reporter,
|
12
12
|
:strategy => strategy,
|
@@ -14,11 +14,11 @@ describe Mutant::Runner::Config, '#success?' do
|
|
14
14
|
)
|
15
15
|
end
|
16
16
|
|
17
|
-
let(:reporter) {
|
18
|
-
let(:strategy) {
|
19
|
-
let(:subjects) { [subject_a, subject_b]
|
20
|
-
let(:subject_a) {
|
21
|
-
let(:subject_b) {
|
17
|
+
let(:reporter) { double('Reporter') }
|
18
|
+
let(:strategy) { double('Strategy') }
|
19
|
+
let(:subjects) { [subject_a, subject_b] }
|
20
|
+
let(:subject_a) { double('Subject A', :fails? => false) }
|
21
|
+
let(:subject_b) { double('Subject B', :fails? => false) }
|
22
22
|
|
23
23
|
class DummySubjectRunner
|
24
24
|
include Concord::Public.new(:config, :subject)
|
@@ -4,17 +4,17 @@ describe Mutant::Runner::Mutation, '#killer' do
|
|
4
4
|
let(:object) { described_class.run(config, mutation) }
|
5
5
|
|
6
6
|
let(:config) do
|
7
|
-
|
7
|
+
double(
|
8
8
|
'Config',
|
9
9
|
:reporter => reporter,
|
10
10
|
:strategy => strategy
|
11
11
|
)
|
12
12
|
end
|
13
13
|
|
14
|
-
let(:reporter) {
|
15
|
-
let(:mutation) {
|
16
|
-
let(:strategy) {
|
17
|
-
let(:killer) {
|
14
|
+
let(:reporter) { double('Reporter') }
|
15
|
+
let(:mutation) { double('Mutation') }
|
16
|
+
let(:strategy) { double('Strategy') }
|
17
|
+
let(:killer) { double('Killer') }
|
18
18
|
|
19
19
|
subject { object.killer }
|
20
20
|
|
@@ -5,12 +5,12 @@ describe Mutant::Runner::Subject, '#success?' do
|
|
5
5
|
|
6
6
|
let(:object) { described_class.run(config, mutation_subject) }
|
7
7
|
|
8
|
-
let(:reporter) {
|
9
|
-
let(:mutation_subject) {
|
10
|
-
let(:config) {
|
11
|
-
let(:mutation_a) {
|
12
|
-
let(:mutation_b) {
|
13
|
-
let(:mutations) { [mutation_a, mutation_b]
|
8
|
+
let(:reporter) { double('Reporter') }
|
9
|
+
let(:mutation_subject) { double('Subject', :map => mutations) }
|
10
|
+
let(:config) { double('Config', :reporter => reporter) }
|
11
|
+
let(:mutation_a) { double('Mutation A', :failed? => false) }
|
12
|
+
let(:mutation_b) { double('Mutation B', :failed? => false) }
|
13
|
+
let(:mutations) { [mutation_a, mutation_b] }
|
14
14
|
|
15
15
|
before do
|
16
16
|
reporter.stub(:report => reporter)
|
@@ -3,11 +3,11 @@ require 'spec_helper'
|
|
3
3
|
describe Mutant::Strategy::Rspec::DM2::Lookup::Method::Instance, '#spec_files' do
|
4
4
|
subject { object.spec_files }
|
5
5
|
|
6
|
-
let(:object) { described_class.new(mutation_subject)
|
7
|
-
let(:mutation_subject) {
|
8
|
-
let(:context) {
|
9
|
-
let(:method_name) { :bar
|
10
|
-
let(:files) { 'Files'.freeze
|
6
|
+
let(:object) { described_class.new(mutation_subject) }
|
7
|
+
let(:mutation_subject) { double('Subject', :name => method_name, :public? => is_public, :context => context) }
|
8
|
+
let(:context) { double('Context', :name => 'Foo') }
|
9
|
+
let(:method_name) { :bar }
|
10
|
+
let(:files) { 'Files'.freeze }
|
11
11
|
|
12
12
|
this_example_group = 'Mutant::Strategy::Rspec::DM2::Lookup::Method::Instance#spec_files'
|
13
13
|
|
@@ -4,11 +4,11 @@ describe Mutant::Strategy::Rspec::DM2::Lookup::Method::Singleton, '#spec_files'
|
|
4
4
|
|
5
5
|
subject { object.spec_files }
|
6
6
|
|
7
|
-
let(:object) { described_class.new(mutation_subject)
|
8
|
-
let(:mutation_subject) {
|
9
|
-
let(:method_name) { :bar
|
10
|
-
let(:files) { 'Files'.freeze
|
11
|
-
let(:context) {
|
7
|
+
let(:object) { described_class.new(mutation_subject) }
|
8
|
+
let(:mutation_subject) { double('Subject', :name => method_name, :public? => is_public, :context => context) }
|
9
|
+
let(:method_name) { :bar }
|
10
|
+
let(:files) { 'Files'.freeze }
|
11
|
+
let(:context) { double('Context', :name => 'Foo') }
|
12
12
|
|
13
13
|
this_example_group = 'Mutant::Strategy::Rspec::DM2::Lookup::Method::Singleton#spec_files'
|
14
14
|
|
@@ -8,8 +8,8 @@ describe Mutant::Subject, '#context' do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
let(:object) { class_under_test.new(context, node) }
|
11
|
-
let(:node) {
|
12
|
-
let(:context) {
|
11
|
+
let(:node) { double('Node') }
|
12
|
+
let(:context) { double('Context') }
|
13
13
|
|
14
14
|
it { should be(context) }
|
15
15
|
|
@@ -12,11 +12,11 @@ describe Mutant::Subject, '#each' do
|
|
12
12
|
|
13
13
|
let(:object) { class_under_test.new(context, node) }
|
14
14
|
let(:yields) { [] }
|
15
|
-
let(:node) {
|
16
|
-
let(:context) {
|
17
|
-
let(:mutant) {
|
18
|
-
let(:mutation_a) {
|
19
|
-
let(:mutation_b) {
|
15
|
+
let(:node) { double('Node') }
|
16
|
+
let(:context) { double('Context') }
|
17
|
+
let(:mutant) { double('Mutant') }
|
18
|
+
let(:mutation_a) { double('Mutation A') }
|
19
|
+
let(:mutation_b) { double('Mutation B') }
|
20
20
|
|
21
21
|
it_should_behave_like 'an #each method'
|
22
22
|
|
@@ -8,8 +8,8 @@ describe Mutant::Subject, '#node' do
|
|
8
8
|
end
|
9
9
|
|
10
10
|
let(:object) { class_under_test.new(context, node) }
|
11
|
-
let(:node) {
|
12
|
-
let(:context) {
|
11
|
+
let(:node) { double('Node') }
|
12
|
+
let(:context) { double('Context') }
|
13
13
|
|
14
14
|
it { should be(node) }
|
15
15
|
|
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.3.0.
|
4
|
+
version: 0.3.0.beta14
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Markus Schirp
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-07-
|
11
|
+
date: 2013-07-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: parser
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.0.
|
19
|
+
version: 2.0.pre2
|
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.0.
|
26
|
+
version: 2.0.pre2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: unparser
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -174,6 +174,7 @@ files:
|
|
174
174
|
- TODO
|
175
175
|
- bin/mutant
|
176
176
|
- bin/zombie
|
177
|
+
- circle.yml
|
177
178
|
- config/devtools.yml
|
178
179
|
- config/flay.yml
|
179
180
|
- config/flog.yml
|