mutant 0.7.4 → 0.7.5

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