mutant 0.7.4 → 0.7.5

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -2
  3. data/Changelog.md +6 -2
  4. data/Gemfile +1 -0
  5. data/config/flay.yml +1 -1
  6. data/config/reek.yml +1 -1
  7. data/lib/mutant.rb +4 -3
  8. data/lib/mutant/cli.rb +2 -2
  9. data/lib/mutant/config.rb +2 -3
  10. data/lib/mutant/env.rb +29 -132
  11. data/lib/mutant/env/bootstrap.rb +155 -0
  12. data/lib/mutant/expression.rb +27 -0
  13. data/lib/mutant/expression/namespace.rb +2 -2
  14. data/lib/mutant/matcher/method.rb +1 -1
  15. data/lib/mutant/matcher/method/instance.rb +1 -1
  16. data/lib/mutant/mutation.rb +2 -30
  17. data/lib/mutant/mutator/node/begin.rb +1 -3
  18. data/lib/mutant/mutator/node/if.rb +2 -2
  19. data/lib/mutant/reporter/cli/printer.rb +5 -4
  20. data/lib/mutant/result.rb +1 -1
  21. data/lib/mutant/runner.rb +3 -3
  22. data/lib/mutant/runner/sink.rb +86 -53
  23. data/lib/mutant/selector.rb +17 -0
  24. data/lib/mutant/selector/expression.rb +28 -0
  25. data/lib/mutant/subject.rb +1 -19
  26. data/lib/mutant/version.rb +1 -1
  27. data/mutant.gemspec +3 -3
  28. data/spec/spec_helper.rb +1 -1
  29. data/spec/support/corpus.rb +5 -5
  30. data/spec/support/shared_context.rb +1 -6
  31. data/spec/unit/mutant/cli_spec.rb +2 -2
  32. data/spec/unit/mutant/env/boostrap_spec.rb +130 -0
  33. data/spec/unit/mutant/env_spec.rb +61 -49
  34. data/spec/unit/mutant/expression_spec.rb +13 -0
  35. data/spec/unit/mutant/matcher/filter_spec.rb +1 -1
  36. data/spec/unit/mutant/matcher/method/instance_spec.rb +1 -1
  37. data/spec/unit/mutant/matcher/method/singleton_spec.rb +1 -1
  38. data/spec/unit/mutant/mutation_spec.rb +0 -36
  39. data/spec/unit/mutant/reporter/trace_spec.rb +1 -1
  40. data/spec/unit/mutant/require_highjack_spec.rb +2 -4
  41. data/spec/unit/mutant/result/subject_spec.rb +2 -1
  42. data/spec/unit/mutant/runner/{sink_spec.rb → sink/mutation_spec.rb} +1 -3
  43. data/spec/unit/mutant/runner_spec.rb +4 -3
  44. data/spec/unit/mutant/selector/expression_spec.rb +60 -0
  45. data/spec/unit/mutant/subject/method/instance_spec.rb +3 -5
  46. data/spec/unit/mutant/subject/method/singleton_spec.rb +2 -3
  47. data/spec/unit/mutant/subject_spec.rb +1 -53
  48. data/spec/unit/mutant/warning_filter_spec.rb +2 -4
  49. metadata +18 -15
  50. data/lib/mutant/line_trace.rb +0 -34
  51. data/spec/unit/mutant/line_trace_spec.rb +0 -38
  52. data/spec/unit/mutant/subject/context_spec.rb +0 -16
@@ -4,6 +4,6 @@ RSpec.describe Mutant::Reporter::Trace do
4
4
  describe '#delay' do
5
5
  subject { object.delay }
6
6
 
7
- it { should equal(0.0) }
7
+ it { should eql(0.0) }
8
8
  end
9
9
  end
@@ -5,11 +5,9 @@ RSpec.describe Mutant::RequireHighjack do
5
5
  let(:require_calls) { [] }
6
6
 
7
7
  let(:target) do
8
- require_calls = self.require_calls
8
+ acc = require_calls
9
9
  Module.new do
10
- define_method(:require) do |logical_name|
11
- require_calls << logical_name
12
- end
10
+ define_method(:require, &acc.method(:<<))
13
11
  module_function :require
14
12
  end
15
13
  end
@@ -2,7 +2,8 @@ RSpec.describe Mutant::Result::Subject do
2
2
  let(:object) do
3
3
  described_class.new(
4
4
  subject: mutation_subject,
5
- mutation_results: mutation_results
5
+ mutation_results: mutation_results,
6
+ tests: []
6
7
  )
7
8
  end
8
9
 
@@ -1,6 +1,4 @@
1
- require 'spec_helper'
2
-
3
- describe Mutant::Runner::Sink do
1
+ describe Mutant::Runner::Sink::Mutation do
4
2
  setup_shared_context
5
3
 
6
4
  shared_context 'one result' do
@@ -1,7 +1,7 @@
1
1
  RSpec.describe Mutant::Runner do
2
2
  # setup_shared_context
3
3
  class FakeEnv
4
- def self.kill_mutation
4
+ def self.kill
5
5
  end
6
6
 
7
7
  def self.mutations
@@ -30,6 +30,7 @@ RSpec.describe Mutant::Runner do
30
30
 
31
31
  before do
32
32
  allow(FakeEnv).to receive(:config).and_return(config)
33
+ allow(FakeEnv).to receive(:actor_env).and_return(actor_env)
33
34
  end
34
35
 
35
36
  let(:parallel_config) do
@@ -37,8 +38,8 @@ RSpec.describe Mutant::Runner do
37
38
  jobs: 1,
38
39
  env: actor_env,
39
40
  source: Mutant::Parallel::Source::Array.new(env.mutations),
40
- sink: Mutant::Runner::Sink.new(env),
41
- processor: env.method(:kill_mutation)
41
+ sink: Mutant::Runner::Sink::Mutation.new(env),
42
+ processor: env.method(:kill)
42
43
  )
43
44
  end
44
45
 
@@ -0,0 +1,60 @@
1
+ RSpec.describe Mutant::Selector::Expression do
2
+ describe '#call' do
3
+ let(:object) { described_class.new(integration) }
4
+
5
+ let(:subject_class) do
6
+ Class.new(Mutant::Subject) do
7
+ def expression
8
+ Mutant::Expression.parse('SubjectA')
9
+ end
10
+
11
+ def match_expressions
12
+ [expression] << Mutant::Expression.parse('SubjectB')
13
+ end
14
+ end
15
+ end
16
+
17
+ let(:mutation_subject) { subject_class.new(context, node) }
18
+ let(:context) { double('Context') }
19
+ let(:node) { double('Node') }
20
+
21
+ let(:config) { Mutant::Config::DEFAULT.update(integration: integration) }
22
+ let(:integration) { double('Integration', all_tests: all_tests) }
23
+
24
+ let(:test_a) { double('test a', expression: Mutant::Expression.parse('SubjectA')) }
25
+ let(:test_b) { double('test b', expression: Mutant::Expression.parse('SubjectB')) }
26
+ let(:test_c) { double('test c', expression: Mutant::Expression.parse('SubjectC')) }
27
+
28
+ subject { object.call(mutation_subject) }
29
+
30
+ context 'without available tests' do
31
+ let(:all_tests) { [] }
32
+
33
+ it { should eql([]) }
34
+ end
35
+
36
+ context 'without qualifying tests' do
37
+ let(:all_tests) { [test_c] }
38
+
39
+ it { should eql([]) }
40
+ end
41
+
42
+ context 'with qualifying tests for first match expression' do
43
+ let(:all_tests) { [test_a] }
44
+
45
+ it { should eql([test_a]) }
46
+ end
47
+
48
+ context 'with qualifying tests for second match expression' do
49
+ let(:all_tests) { [test_b] }
50
+
51
+ it { should eql([test_b]) }
52
+ end
53
+
54
+ context 'with qualifying tests for the first and second match expression' do
55
+ let(:all_tests) { [test_a, test_b] }
56
+
57
+ it { should eql([test_a]) }
58
+ end
59
+ end
60
+ end
@@ -1,7 +1,6 @@
1
1
  RSpec.describe Mutant::Subject::Method::Instance do
2
- let(:object) { described_class.new(config, context, node) }
2
+ let(:object) { described_class.new(context, node) }
3
3
  let(:context) { Mutant::Context::Scope.new(scope, double('Source Path')) }
4
- let(:config) { Mutant::Config::DEFAULT }
5
4
 
6
5
  let(:node) do
7
6
  s(:def, :foo, s(:args))
@@ -91,9 +90,8 @@ RSpec.describe Mutant::Subject::Method::Instance do
91
90
  end
92
91
 
93
92
  RSpec.describe Mutant::Subject::Method::Instance::Memoized do
94
- let(:object) { described_class.new(config, context, node) }
95
- let(:context) { double }
96
- let(:config) { Mutant::Config::DEFAULT }
93
+ let(:object) { described_class.new(context, node) }
94
+ let(:context) { double('Context') }
97
95
 
98
96
  let(:node) do
99
97
  s(:def, :foo, s(:args))
@@ -1,8 +1,7 @@
1
1
  RSpec.describe Mutant::Subject::Method::Singleton do
2
2
 
3
- let(:object) { described_class.new(config, context, node) }
4
- let(:config) { Mutant::Config::DEFAULT }
5
- let(:node) { s(:defs, s(:self), :foo, s(:args)) }
3
+ let(:object) { described_class.new(context, node) }
4
+ let(:node) { s(:defs, s(:self), :foo, s(:args)) }
6
5
 
7
6
  let(:context) do
8
7
  Mutant::Context::Scope.new(scope, double('Source Path'))
@@ -11,9 +11,7 @@ RSpec.describe Mutant::Subject do
11
11
  end
12
12
  end
13
13
 
14
- let(:object) { class_under_test.new(config, context, node) }
15
-
16
- let(:config) { Mutant::Config::DEFAULT }
14
+ let(:object) { class_under_test.new(context, node) }
17
15
 
18
16
  let(:node) do
19
17
  Parser::CurrentRuby.parse(<<-RUBY)
@@ -62,56 +60,6 @@ RSpec.describe Mutant::Subject do
62
60
  it_should_behave_like 'a command method'
63
61
  end
64
62
 
65
- describe '#tests' do
66
- let(:config) { Mutant::Config::DEFAULT.update(integration: integration) }
67
- let(:integration) { double('Integration', all_tests: all_tests) }
68
- let(:test_a) { double('test', expression: Mutant::Expression.parse('SubjectA')) }
69
- let(:test_b) { double('test', expression: Mutant::Expression.parse('SubjectB')) }
70
- let(:test_c) { double('test', expression: Mutant::Expression.parse('SubjectC')) }
71
-
72
- subject { object.tests }
73
-
74
- context 'without available tests' do
75
- let(:all_tests) { [] }
76
-
77
- it { should eql([]) }
78
-
79
- it_should_behave_like 'an idempotent method'
80
- end
81
-
82
- context 'without qualifying tests' do
83
- let(:all_tests) { [test_c] }
84
-
85
- it { should eql([]) }
86
-
87
- it_should_behave_like 'an idempotent method'
88
- end
89
-
90
- context 'with qualifying tests for first match expression' do
91
- let(:all_tests) { [test_a] }
92
-
93
- it { should eql([test_a]) }
94
-
95
- it_should_behave_like 'an idempotent method'
96
- end
97
-
98
- context 'with qualifying tests for second match expression' do
99
- let(:all_tests) { [test_b] }
100
-
101
- it { should eql([test_b]) }
102
-
103
- it_should_behave_like 'an idempotent method'
104
- end
105
-
106
- context 'with qualifying tests for the first and second match expression' do
107
- let(:all_tests) { [test_a, test_b] }
108
-
109
- it { should eql([test_a]) }
110
-
111
- it_should_behave_like 'an idempotent method'
112
- end
113
- end
114
-
115
63
  describe '#node' do
116
64
  subject { object.node }
117
65
 
@@ -8,11 +8,9 @@ RSpec.describe Mutant::WarningFilter do
8
8
  let(:object) { described_class.new(target) }
9
9
 
10
10
  let(:target) do
11
- writes = self.writes
11
+ acc = writes
12
12
  Module.new do
13
- define_singleton_method :write do |message|
14
- writes << message
15
- end
13
+ define_singleton_method(:write, &acc.method(:<<))
16
14
  end
17
15
  end
18
16
 
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.7.4
4
+ version: 0.7.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Markus Schirp
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-12-22 00:00:00.000000000 Z
11
+ date: 2015-01-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.2.pre.7
19
+ version: 2.2.0.2
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.2.pre.7
26
+ version: 2.2.0.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: ast
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 0.1.16
117
+ version: 0.2.2
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.1.16
124
+ version: 0.2.2
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: ice_nine
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -295,13 +295,13 @@ files:
295
295
  - lib/mutant/delegator.rb
296
296
  - lib/mutant/diff.rb
297
297
  - lib/mutant/env.rb
298
+ - lib/mutant/env/bootstrap.rb
298
299
  - lib/mutant/expression.rb
299
300
  - lib/mutant/expression/method.rb
300
301
  - lib/mutant/expression/methods.rb
301
302
  - lib/mutant/expression/namespace.rb
302
303
  - lib/mutant/integration.rb
303
304
  - lib/mutant/isolation.rb
304
- - lib/mutant/line_trace.rb
305
305
  - lib/mutant/loader.rb
306
306
  - lib/mutant/matcher.rb
307
307
  - lib/mutant/matcher/chain.rb
@@ -393,6 +393,8 @@ files:
393
393
  - lib/mutant/result.rb
394
394
  - lib/mutant/runner.rb
395
395
  - lib/mutant/runner/sink.rb
396
+ - lib/mutant/selector.rb
397
+ - lib/mutant/selector/expression.rb
396
398
  - lib/mutant/subject.rb
397
399
  - lib/mutant/subject/method.rb
398
400
  - lib/mutant/subject/method/instance.rb
@@ -489,6 +491,7 @@ files:
489
491
  - spec/unit/mutant/context/scope/unqualified_name_spec.rb
490
492
  - spec/unit/mutant/context_spec.rb
491
493
  - spec/unit/mutant/diff_spec.rb
494
+ - spec/unit/mutant/env/boostrap_spec.rb
492
495
  - spec/unit/mutant/env_spec.rb
493
496
  - spec/unit/mutant/expression/method_spec.rb
494
497
  - spec/unit/mutant/expression/methods_spec.rb
@@ -497,7 +500,6 @@ files:
497
500
  - spec/unit/mutant/expression_spec.rb
498
501
  - spec/unit/mutant/integration_spec.rb
499
502
  - spec/unit/mutant/isolation_spec.rb
500
- - spec/unit/mutant/line_trace_spec.rb
501
503
  - spec/unit/mutant/loader/eval_spec.rb
502
504
  - spec/unit/mutant/matcher/chain_spec.rb
503
505
  - spec/unit/mutant/matcher/compiler/subject_prefix_spec.rb
@@ -523,9 +525,9 @@ files:
523
525
  - spec/unit/mutant/result/env_spec.rb
524
526
  - spec/unit/mutant/result/subject_spec.rb
525
527
  - spec/unit/mutant/runner/driver_spec.rb
526
- - spec/unit/mutant/runner/sink_spec.rb
528
+ - spec/unit/mutant/runner/sink/mutation_spec.rb
527
529
  - spec/unit/mutant/runner_spec.rb
528
- - spec/unit/mutant/subject/context_spec.rb
530
+ - spec/unit/mutant/selector/expression_spec.rb
529
531
  - spec/unit/mutant/subject/method/instance_spec.rb
530
532
  - spec/unit/mutant/subject/method/singleton_spec.rb
531
533
  - spec/unit/mutant/subject_spec.rb
@@ -552,7 +554,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
552
554
  requirements:
553
555
  - - ">="
554
556
  - !ruby/object:Gem::Version
555
- version: 2.0.0
557
+ version: 1.9.3
556
558
  required_rubygems_version: !ruby/object:Gem::Requirement
557
559
  requirements:
558
560
  - - ">="
@@ -560,7 +562,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
560
562
  version: '0'
561
563
  requirements: []
562
564
  rubyforge_project:
563
- rubygems_version: 2.2.2
565
+ rubygems_version: 2.4.5
564
566
  signing_key:
565
567
  specification_version: 4
566
568
  summary: Mutation testing tool for ruby under MRI and Rubinius
@@ -583,6 +585,7 @@ test_files:
583
585
  - spec/unit/mutant/context/scope/unqualified_name_spec.rb
584
586
  - spec/unit/mutant/context_spec.rb
585
587
  - spec/unit/mutant/diff_spec.rb
588
+ - spec/unit/mutant/env/boostrap_spec.rb
586
589
  - spec/unit/mutant/env_spec.rb
587
590
  - spec/unit/mutant/expression/method_spec.rb
588
591
  - spec/unit/mutant/expression/methods_spec.rb
@@ -591,7 +594,6 @@ test_files:
591
594
  - spec/unit/mutant/expression_spec.rb
592
595
  - spec/unit/mutant/integration_spec.rb
593
596
  - spec/unit/mutant/isolation_spec.rb
594
- - spec/unit/mutant/line_trace_spec.rb
595
597
  - spec/unit/mutant/loader/eval_spec.rb
596
598
  - spec/unit/mutant/matcher/chain_spec.rb
597
599
  - spec/unit/mutant/matcher/compiler/subject_prefix_spec.rb
@@ -617,11 +619,12 @@ test_files:
617
619
  - spec/unit/mutant/result/env_spec.rb
618
620
  - spec/unit/mutant/result/subject_spec.rb
619
621
  - spec/unit/mutant/runner/driver_spec.rb
620
- - spec/unit/mutant/runner/sink_spec.rb
622
+ - spec/unit/mutant/runner/sink/mutation_spec.rb
621
623
  - spec/unit/mutant/runner_spec.rb
622
- - spec/unit/mutant/subject/context_spec.rb
624
+ - spec/unit/mutant/selector/expression_spec.rb
623
625
  - spec/unit/mutant/subject/method/instance_spec.rb
624
626
  - spec/unit/mutant/subject/method/singleton_spec.rb
625
627
  - spec/unit/mutant/subject_spec.rb
626
628
  - spec/unit/mutant/warning_filter_spec.rb
627
629
  - spec/unit/mutant_spec.rb
630
+ has_rdoc:
@@ -1,34 +0,0 @@
1
- module Mutant
2
- # Line tracer
3
- class LineTrace
4
- include Adamantium::Flat, Concord.new(:contents)
5
-
6
- private_class_method :new
7
-
8
- # Test if trace coveres file at lineno
9
- #
10
- # @param [String] file
11
- # @param [Fixnum] lineno
12
- #
13
- # @return [Boolean]
14
- #
15
- def cover?(file, lineno)
16
- contents.fetch(file) { return false }.include?(lineno)
17
- end
18
-
19
- # Run block
20
- #
21
- # @return [Traces]
22
- #
23
- # @api private
24
- #
25
- def self.call(&block)
26
- traces = Hash.new { |hash, file| hash[file] = Set.new }
27
- TracePoint.trace(:return, :line) do |point|
28
- traces[point.path] << point.lineno
29
- end.tap(&block).disable
30
- new(IceNine.deep_freeze(traces))
31
- end
32
-
33
- end # LineTrace
34
- end # Mutant
@@ -1,38 +0,0 @@
1
- RSpec.describe Mutant::LineTrace do
2
- let(:object) { described_class }
3
-
4
- test_a_line = __LINE__ + 2
5
- def test_a
6
- test_b
7
- end
8
-
9
- test_b_line = __LINE__ + 2
10
- def test_b
11
- end
12
-
13
- test_c_line = __LINE__ + 2
14
- def test_c
15
- end
16
-
17
- shared_examples_for 'line trace' do
18
- it 'returns correct trace results' do
19
- expect(subject.cover?(__FILE__, test_a_line)).to be(true)
20
- expect(subject.cover?(__FILE__, test_b_line)).to be(true)
21
- expect(subject.cover?(__FILE__, test_c_line)).to be(false)
22
- expect(subject.cover?(__FILE__, __LINE__)).to be(false)
23
- expect(subject.cover?('/dev/null', test_a_line)).to be(false)
24
- end
25
- end
26
-
27
- describe '.cover?' do
28
- subject { object.call { test_a } }
29
-
30
- include_examples 'line trace'
31
- end
32
-
33
- describe '.call' do
34
- subject { object.call { test_a } }
35
-
36
- include_examples 'line trace'
37
- end
38
- end