mutant 0.3.0.beta22 → 0.3.0.rc1

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -5
  3. data/Gemfile.devtools +1 -1
  4. data/README.md +22 -50
  5. data/config/flay.yml +1 -1
  6. data/config/flog.yml +1 -1
  7. data/config/reek.yml +9 -2
  8. data/lib/mutant.rb +3 -4
  9. data/lib/mutant/cli.rb +41 -35
  10. data/lib/mutant/cli/classifier.rb +1 -1
  11. data/lib/mutant/config.rb +2 -1
  12. data/lib/mutant/context/scope.rb +14 -1
  13. data/lib/mutant/killer.rb +10 -0
  14. data/lib/mutant/killer/rspec.rb +52 -18
  15. data/lib/mutant/matcher/method.rb +4 -4
  16. data/lib/mutant/mutator/node/generic.rb +1 -1
  17. data/lib/mutant/mutator/node/literal/float.rb +2 -0
  18. data/lib/mutant/mutator/node/nthref.rb +29 -0
  19. data/lib/mutant/mutator/node/send.rb +17 -0
  20. data/lib/mutant/reporter/cli/printer/killer.rb +9 -3
  21. data/lib/mutant/strategy.rb +9 -9
  22. data/lib/mutant/strategy/rspec.rb +51 -41
  23. data/lib/mutant/subject.rb +16 -6
  24. data/lib/mutant/subject/method.rb +10 -10
  25. data/lib/mutant/version.rb +7 -0
  26. data/lib/mutant/zombifier.rb +2 -3
  27. data/mutant.gemspec +6 -4
  28. data/spec/integration/mutant/rspec_spec.rb +26 -0
  29. data/spec/unit/mutant/cli/class_methods/new_spec.rb +33 -8
  30. data/spec/unit/mutant/killer/rspec/class_methods/new_spec.rb +4 -0
  31. data/spec/unit/mutant/mutator/node/nthref/mutation_spec.rb +19 -0
  32. data/spec/unit/mutant/mutator/node/send/mutation_spec.rb +29 -0
  33. metadata +14 -20
  34. data/lib/mutant/strategy/method_expansion.rb +0 -53
  35. data/lib/mutant/strategy/rspec/dm2.rb +0 -24
  36. data/lib/mutant/strategy/rspec/dm2/lookup.rb +0 -63
  37. data/lib/mutant/strategy/rspec/dm2/lookup/method.rb +0 -145
  38. data/spec/integration/mutant/rspec_killer_spec.rb +0 -29
  39. data/spec/unit/mutant/strategy/method_expansion/class_methods/run_spec.rb +0 -51
  40. data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/instance/spec_files_spec.rb +0 -73
  41. data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/singleton/spec_files_spec.rb +0 -62
@@ -29,7 +29,7 @@ describe Mutant::CLI, '.new' do
29
29
 
30
30
  # Defaults
31
31
  let(:expected_filter) { Mutant::Mutation::Filter::ALL }
32
- let(:expected_strategy) { Mutant::Strategy::Rspec::Unit }
32
+ let(:expected_strategy) { Mutant::Strategy::Rspec.new }
33
33
  let(:expected_reporter) { Mutant::Reporter::CLI.new($stdout) }
34
34
 
35
35
  let(:ns) { Mutant::CLI::Classifier }
@@ -56,9 +56,10 @@ describe Mutant::CLI, '.new' do
56
56
  end
57
57
 
58
58
  context 'with many strategy flags' do
59
- let(:arguments) { %w(--rspec-unit --rspec-dm2) }
59
+ let(:arguments) { %w(--static-fail --rspec TestApp) }
60
+ let(:expected_matcher) { Mutant::CLI::Classifier::Namespace::Flat.new(Mutant::Cache.new, 'TestApp') }
60
61
 
61
- let(:expected_strategy) { Mutant::Strategy::Rspec::DM2 }
62
+ it_should_behave_like 'a cli parser'
62
63
  end
63
64
 
64
65
  context 'without arguments' do
@@ -70,30 +71,54 @@ describe Mutant::CLI, '.new' do
70
71
  end
71
72
 
72
73
  context 'with code filter and missing argument' do
73
- let(:arguments) { %w(--rspec-unit --code) }
74
+ let(:arguments) { %w(--rspec --code) }
74
75
  let(:expected_message) { 'missing argument: --code' }
75
76
 
76
77
  it_should_behave_like 'an invalid cli run'
77
78
  end
78
79
 
79
80
  context 'with explicit method matcher' do
80
- let(:arguments) { %w(--rspec-unit TestApp::Literal#float) }
81
+ let(:arguments) { %w(--rspec TestApp::Literal#float) }
81
82
  let(:expected_matcher) { ns::Method.new(cache, 'TestApp::Literal#float') }
82
83
 
83
84
  it_should_behave_like 'a cli parser'
84
85
  end
85
86
 
87
+ context 'with debug flag' do
88
+ let(:matcher) { '::TestApp*' }
89
+ let(:arguments) { %W(--debug --rspec #{matcher}) }
90
+ let(:expected_matcher) { ns::Namespace::Recursive.new(cache, matcher) }
91
+
92
+ it_should_behave_like 'a cli parser'
93
+
94
+ it 'should set the debug option' do
95
+ subject.config.debug.should be(true)
96
+ end
97
+ end
98
+
99
+ context 'with zombie flag' do
100
+ let(:matcher) { '::TestApp*' }
101
+ let(:arguments) { %W(--zombie --rspec #{matcher}) }
102
+ let(:expected_matcher) { ns::Namespace::Recursive.new(cache, matcher) }
103
+
104
+ it_should_behave_like 'a cli parser'
105
+
106
+ it 'should set the zombie option' do
107
+ subject.config.zombie.should be(true)
108
+ end
109
+ end
110
+
86
111
  context 'with namespace matcher' do
87
112
  let(:matcher) { '::TestApp*' }
88
- let(:arguments) { %W(--rspec-unit #{matcher}) }
113
+ let(:arguments) { %W(--rspec #{matcher}) }
89
114
  let(:expected_matcher) { ns::Namespace::Recursive.new(cache, matcher) }
90
115
 
91
116
  it_should_behave_like 'a cli parser'
92
117
  end
93
118
 
94
119
  context 'with code filter' do
95
- let(:matcher) { 'TestApp::Literal#float' }
96
- let(:arguments) { %W(--rspec-unit --code faa --code bbb #{matcher}) }
120
+ let(:matcher) { 'TestApp::Literal#float' }
121
+ let(:arguments) { %W(--rspec --code faa --code bbb #{matcher}) }
97
122
 
98
123
  let(:filters) do
99
124
  [
@@ -4,6 +4,10 @@ require 'spec_helper'
4
4
 
5
5
  describe Mutant::Killer::Rspec, '.new' do
6
6
 
7
+ before do
8
+ pending 'dactivated'
9
+ end
10
+
7
11
  subject { object.new(strategy, mutation) }
8
12
 
9
13
  let(:context) { double('Context') }
@@ -0,0 +1,19 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Mutant::Mutator, 'nthref' do
6
+ context '$1' do
7
+ let(:source) { '$1' }
8
+ let(:mutations) { ['$2', '$0'] }
9
+
10
+ it_should_behave_like 'a mutator'
11
+ end
12
+
13
+ context '$2' do
14
+ let(:source) { '$2' }
15
+ let(:mutations) { ['$3', '$1'] }
16
+
17
+ it_should_behave_like 'a mutator'
18
+ end
19
+ end
@@ -5,6 +5,35 @@ require 'spec_helper'
5
5
  # FIXME: This spec needs to be structured better!
6
6
  describe Mutant::Mutator, 'send' do
7
7
 
8
+ context 'when using String#gsub' do
9
+ let(:source) { 'foo.gsub(a, b)' }
10
+
11
+ let(:mutations) do
12
+ mutations = []
13
+ mutations << 'foo'
14
+ mutations << 'foo.gsub(a)'
15
+ mutations << 'foo.gsub(b)'
16
+ mutations << 'foo.gsub'
17
+ mutations << 'foo.sub(a, b)'
18
+ end
19
+
20
+ it_should_behave_like 'a mutator'
21
+ end
22
+
23
+ context 'when using Kernel#send' do
24
+ let(:source) { 'foo.send(bar)' }
25
+
26
+ let(:mutations) do
27
+ mutations = []
28
+ mutations << 'foo.send'
29
+ mutations << 'foo.public_send(bar)'
30
+ mutations << 'bar'
31
+ mutations << 'foo'
32
+ end
33
+
34
+ it_should_behave_like 'a mutator'
35
+ end
36
+
8
37
  context 'inside op assign' do
9
38
  let(:source) { 'self.foo ||= expression' }
10
39
 
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.beta22
4
+ version: 0.3.0.rc1
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-30 00:00:00.000000000 Z
11
+ date: 2013-08-05 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.0.0.pre3
19
+ version: 2.0.0.pre6
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.0.pre3
26
+ version: 2.0.0.pre6
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: unparser
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: 0.0.13
33
+ version: 0.0.14
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: 0.0.13
40
+ version: 0.0.14
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: ice_nine
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -128,14 +128,14 @@ dependencies:
128
128
  requirements:
129
129
  - - ~>
130
130
  - !ruby/object:Gem::Version
131
- version: 0.1.1
131
+ version: 0.1.3
132
132
  type: :runtime
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
136
  - - ~>
137
137
  - !ruby/object:Gem::Version
138
- version: 0.1.1
138
+ version: 0.1.3
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rspec
141
141
  requirement: !ruby/object:Gem::Requirement
@@ -266,6 +266,7 @@ files:
266
266
  - lib/mutant/mutator/node/named_value/constant_assignment.rb
267
267
  - lib/mutant/mutator/node/named_value/variable_assignment.rb
268
268
  - lib/mutant/mutator/node/noop.rb
269
+ - lib/mutant/mutator/node/nthref.rb
269
270
  - lib/mutant/mutator/node/return.rb
270
271
  - lib/mutant/mutator/node/send.rb
271
272
  - lib/mutant/mutator/node/send/binary.rb
@@ -294,20 +295,17 @@ files:
294
295
  - lib/mutant/runner/subject.rb
295
296
  - lib/mutant/singleton_methods.rb
296
297
  - lib/mutant/strategy.rb
297
- - lib/mutant/strategy/method_expansion.rb
298
298
  - lib/mutant/strategy/rspec.rb
299
- - lib/mutant/strategy/rspec/dm2.rb
300
- - lib/mutant/strategy/rspec/dm2/lookup.rb
301
- - lib/mutant/strategy/rspec/dm2/lookup/method.rb
302
299
  - lib/mutant/strategy/static.rb
303
300
  - lib/mutant/subject.rb
304
301
  - lib/mutant/subject/method.rb
305
302
  - lib/mutant/subject/method/instance.rb
306
303
  - lib/mutant/subject/method/singleton.rb
307
304
  - lib/mutant/support/method_object.rb
305
+ - lib/mutant/version.rb
308
306
  - lib/mutant/zombifier.rb
309
307
  - mutant.gemspec
310
- - spec/integration/mutant/rspec_killer_spec.rb
308
+ - spec/integration/mutant/rspec_spec.rb
311
309
  - spec/integration/mutant/test_mutator_handles_types_spec.rb
312
310
  - spec/integration/mutant/zombie_spec.rb
313
311
  - spec/rcov.opts
@@ -378,6 +376,7 @@ files:
378
376
  - spec/unit/mutant/mutator/node/named_value/constant_assignment/mutation_spec.rb
379
377
  - spec/unit/mutant/mutator/node/named_value/variable_assignment/mutation_spec.rb
380
378
  - spec/unit/mutant/mutator/node/next/mutation_spec.rb
379
+ - spec/unit/mutant/mutator/node/nthref/mutation_spec.rb
381
380
  - spec/unit/mutant/mutator/node/op_assgn/mutation_spec.rb
382
381
  - spec/unit/mutant/mutator/node/or_asgn/mutation_spec.rb
383
382
  - spec/unit/mutant/mutator/node/redo/mutation_spec.rb
@@ -393,9 +392,6 @@ files:
393
392
  - spec/unit/mutant/runner/config/success_predicate_spec.rb
394
393
  - spec/unit/mutant/runner/mutation/killer_spec.rb
395
394
  - spec/unit/mutant/runner/subject/success_predicate_spec.rb
396
- - spec/unit/mutant/strategy/method_expansion/class_methods/run_spec.rb
397
- - spec/unit/mutant/strategy/rspec/dm2/lookup/method/instance/spec_files_spec.rb
398
- - spec/unit/mutant/strategy/rspec/dm2/lookup/method/singleton/spec_files_spec.rb
399
395
  - spec/unit/mutant/subject/context_spec.rb
400
396
  - spec/unit/mutant/subject/mutations_spec.rb
401
397
  - spec/unit/mutant/subject/node_spec.rb
@@ -437,7 +433,7 @@ signing_key:
437
433
  specification_version: 4
438
434
  summary: Mutation testing tool for ruby under MRI and Rubinius
439
435
  test_files:
440
- - spec/integration/mutant/rspec_killer_spec.rb
436
+ - spec/integration/mutant/rspec_spec.rb
441
437
  - spec/integration/mutant/test_mutator_handles_types_spec.rb
442
438
  - spec/integration/mutant/zombie_spec.rb
443
439
  - spec/unit/mutant/class_methods/singleton_subclass_instance_spec.rb
@@ -500,6 +496,7 @@ test_files:
500
496
  - spec/unit/mutant/mutator/node/named_value/constant_assignment/mutation_spec.rb
501
497
  - spec/unit/mutant/mutator/node/named_value/variable_assignment/mutation_spec.rb
502
498
  - spec/unit/mutant/mutator/node/next/mutation_spec.rb
499
+ - spec/unit/mutant/mutator/node/nthref/mutation_spec.rb
503
500
  - spec/unit/mutant/mutator/node/op_assgn/mutation_spec.rb
504
501
  - spec/unit/mutant/mutator/node/or_asgn/mutation_spec.rb
505
502
  - spec/unit/mutant/mutator/node/redo/mutation_spec.rb
@@ -515,9 +512,6 @@ test_files:
515
512
  - spec/unit/mutant/runner/config/success_predicate_spec.rb
516
513
  - spec/unit/mutant/runner/mutation/killer_spec.rb
517
514
  - spec/unit/mutant/runner/subject/success_predicate_spec.rb
518
- - spec/unit/mutant/strategy/method_expansion/class_methods/run_spec.rb
519
- - spec/unit/mutant/strategy/rspec/dm2/lookup/method/instance/spec_files_spec.rb
520
- - spec/unit/mutant/strategy/rspec/dm2/lookup/method/singleton/spec_files_spec.rb
521
515
  - spec/unit/mutant/subject/context_spec.rb
522
516
  - spec/unit/mutant/subject/mutations_spec.rb
523
517
  - spec/unit/mutant/subject/node_spec.rb
@@ -1,53 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Mutant
4
- class Strategy
5
- module MethodExpansion
6
-
7
- # Run method name expansion
8
- #
9
- # @param [Symbol] name
10
- #
11
- # @return [Symbol]
12
- #
13
- # @api private
14
- #
15
- def self.run(name)
16
- name = map(name) || expand(name)
17
- end
18
-
19
- # Return mapped name
20
- #
21
- # @param [Symbol] name
22
- #
23
- # @return [Symbol]
24
- # if name was mapped
25
- #
26
- # @return [nil]
27
- # otherwise
28
- #
29
- # @api private
30
- #
31
- def self.map(name)
32
- OPERATOR_EXPANSIONS[name]
33
- end
34
- private_class_method :map
35
-
36
- REGEXP = /#{Regexp.union(*METHOD_POSTFIX_EXPANSIONS.keys)}\z/.freeze
37
-
38
- # Return expanded name
39
- #
40
- # @param [Symbol] name
41
- #
42
- # @return [Symbol]
43
- #
44
- # @api private
45
- #
46
- def self.expand(name)
47
- name.to_s.gsub(REGEXP, METHOD_POSTFIX_EXPANSIONS).to_sym
48
- end
49
- private_class_method :expand
50
-
51
- end # MethodExpansion
52
- end # Strategy
53
- end # Mutant
@@ -1,24 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Mutant
4
- class Strategy
5
- class Rspec
6
- # DM2-style strategy
7
- class DM2 < self
8
-
9
- # Return filename pattern
10
- #
11
- # @param [Subject] subject
12
- #
13
- # @return [Enumerable<String>]
14
- #
15
- # @api private
16
- #
17
- def self.spec_files(subject)
18
- Lookup.run(subject)
19
- end
20
-
21
- end # DM2
22
- end # Rspec
23
- end # Strategy
24
- end # Mutant
@@ -1,63 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Mutant
4
- class Strategy
5
- class Rspec
6
- class DM2
7
-
8
- # Example lookup for the rspec dm2
9
- class Lookup
10
- include AbstractType, Adamantium::Flat, Concord::Public.new(:subject)
11
-
12
- # Return glob expression
13
- #
14
- # @return [String]
15
- #
16
- # @api private
17
- #
18
- abstract_method :spec_files
19
-
20
- # Perform example lookup
21
- #
22
- # @param [Subject] subject
23
- #
24
- # @return [Enumerable<String>]
25
- #
26
- # @api private
27
- #
28
- def self.run(subject)
29
- build(subject).spec_files
30
- end
31
-
32
- REGISTRY = {}
33
-
34
- # Register subject hander
35
- #
36
- # @param [Class:Subject]
37
- #
38
- # @return [undefined]
39
- #
40
- # @api private
41
- #
42
- def self.handle(subject_class)
43
- REGISTRY[subject_class] = self
44
- end
45
- private_class_method :handle
46
-
47
- # Build lookup object
48
- #
49
- # @param [Subject] subject
50
- #
51
- # @return [Lookup]
52
- #
53
- # @api private
54
- #
55
- def self.build(subject)
56
- REGISTRY.fetch(subject.class).new(subject)
57
- end
58
-
59
- end # Lookup
60
- end # DM2
61
- end # Rspec
62
- end # Strategy
63
- end # Mutant
@@ -1,145 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Mutant
4
- class Strategy
5
- class Rspec
6
- class DM2
7
- class Lookup
8
-
9
- # Base class for dm2 style method lookup
10
- class Method < self
11
-
12
- # Return spec files
13
- #
14
- # @return [Enumerable<String>]
15
- #
16
- # @api private
17
- #
18
- def spec_files
19
- Dir.glob(glob_expression)
20
- end
21
- memoize :spec_files
22
-
23
- private
24
-
25
- # Return base path
26
- #
27
- # @return [String]
28
- #
29
- # @api private
30
- #
31
- def base_path
32
- "spec/unit/#{Inflecto.underscore(subject.context.name)}"
33
- end
34
-
35
- # Return method name
36
- #
37
- # @return [Symbol]
38
- #
39
- # @api private
40
- #
41
- def method_name
42
- subject.name
43
- end
44
-
45
- # Test if method is public
46
- #
47
- # @return [true]
48
- # if method is public
49
- #
50
- # @return [false]
51
- #
52
- # @api private
53
- #
54
- def public?
55
- subject.public?
56
- end
57
-
58
- # Return expanded name
59
- #
60
- # @return [String]
61
- #
62
- # @api private
63
- #
64
- def expanded_name
65
- MethodExpansion.run(method_name)
66
- end
67
-
68
- # Return glob expression
69
- #
70
- # @return [String]
71
- #
72
- # @api private
73
- #
74
- def glob_expression
75
- public? ? public_glob_expression : private_glob_expression
76
- end
77
-
78
- # Return public glob expression
79
- #
80
- # @return [String]
81
- #
82
- # @api private
83
- #
84
- def public_glob_expression
85
- "#{base_path}/#{expanded_name}_spec.rb"
86
- end
87
-
88
- # Return private glob expression
89
- #
90
- # @return [String]
91
- #
92
- # @api private
93
- #
94
- def private_glob_expression
95
- "#{base_path}/*_spec.rb"
96
- end
97
-
98
- # Instance method dm2 style method lookup
99
- class Instance < self
100
- handle(Subject::Method::Instance)
101
- handle(Subject::Method::Instance::Memoized)
102
-
103
- private
104
-
105
- # Return glob expression
106
- #
107
- # @return [String]
108
- #
109
- # @api private
110
- #
111
- def glob_expression
112
- glob_expression = super
113
- if method_name == :initialize and !public?
114
- "{#{glob_expression},#{base_path}/class_methods/new_spec.rb}"
115
- else
116
- glob_expression
117
- end
118
- end
119
-
120
- end # Instance
121
-
122
- # Singleton method dm2 style method lookup
123
- class Singleton < self
124
- handle(Subject::Method::Singleton)
125
-
126
- private
127
-
128
- # Return base path
129
- #
130
- # @return [String]
131
- #
132
- # @api private
133
- #
134
- def base_path
135
- "#{super}/class_methods"
136
- end
137
-
138
- end # Singleton
139
-
140
- end # Method
141
- end # Lookup
142
- end # DM2
143
- end # Rspec
144
- end # Strategy
145
- end # Mutant