mutant 0.3.0.beta22 → 0.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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