mutant 0.5.10 → 0.5.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +1 -0
  3. data/Changelog.md +12 -1
  4. data/README.md +3 -0
  5. data/Rakefile +0 -9
  6. data/bin/mutant +1 -1
  7. data/config/flay.yml +1 -1
  8. data/config/mutant.yml +13 -0
  9. data/config/reek.yml +6 -2
  10. data/lib/mutant/constants.rb +0 -13
  11. data/lib/mutant/mutator/node/conditional_loop.rb +2 -1
  12. data/lib/mutant/mutator/node/generic.rb +1 -1
  13. data/lib/mutant/mutator/node/if.rb +1 -1
  14. data/lib/mutant/mutator/node/literal/regex.rb +2 -2
  15. data/lib/mutant/mutator/node/match_current_line.rb +27 -0
  16. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +1 -1
  17. data/lib/mutant/mutator/node/nthref.rb +3 -1
  18. data/lib/mutant/mutator/node/rescue.rb +0 -12
  19. data/lib/mutant/mutator/node/send/attribute_assignment.rb +51 -0
  20. data/lib/mutant/mutator/node/send/index.rb +43 -0
  21. data/lib/mutant/mutator/node/send.rb +7 -37
  22. data/lib/mutant/mutator/node.rb +4 -12
  23. data/lib/mutant/mutator.rb +2 -26
  24. data/lib/mutant/node_helpers.rb +3 -3
  25. data/lib/mutant/require_highjack.rb +64 -0
  26. data/lib/mutant/subject/method/instance.rb +9 -1
  27. data/lib/mutant/version.rb +1 -1
  28. data/lib/mutant/warning_expectation.rb +40 -0
  29. data/lib/mutant/warning_filter.rb +74 -0
  30. data/lib/mutant/zombifier/file.rb +81 -0
  31. data/lib/mutant/zombifier.rb +61 -240
  32. data/lib/mutant.rb +57 -1
  33. data/lib/parser_extensions.rb +25 -0
  34. data/mutant.gemspec +4 -3
  35. data/spec/integration/mutant/corpus_spec.rb +121 -0
  36. data/spec/integration/mutant/rspec_spec.rb +1 -1
  37. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +1 -1
  38. data/spec/integration/mutant/zombie_spec.rb +3 -3
  39. data/spec/integrations.yml +23 -0
  40. data/spec/shared/mutator_behavior.rb +22 -72
  41. data/spec/spec_helper.rb +4 -2
  42. data/spec/support/mutation_verifier.rb +95 -0
  43. data/spec/unit/mutant/mutator/node/conditional_loop_spec.rb +16 -0
  44. data/spec/unit/mutant/mutator/node/match_current_line_spec.rb +4 -4
  45. data/spec/unit/mutant/mutator/node/named_value/access_spec.rb +6 -3
  46. data/spec/unit/mutant/mutator/node/nthref_spec.rb +2 -2
  47. data/spec/unit/mutant/mutator/node/op_assgn_spec.rb +3 -1
  48. data/spec/unit/mutant/mutator/node/send_spec.rb +0 -1
  49. data/spec/unit/mutant/require_highjack_spec.rb +54 -0
  50. data/spec/unit/mutant/subject/method/instance_spec.rb +34 -3
  51. data/spec/unit/mutant/warning_expectation.rb +71 -0
  52. data/spec/unit/mutant/warning_filter_spec.rb +94 -0
  53. metadata +40 -9
  54. data/lib/mutant/singleton_methods.rb +0 -30
@@ -0,0 +1,71 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutant::WarningExpectation do
4
+ let(:object) { described_class.new(expected_warnings) }
5
+
6
+ let(:expected_warnings) { [] }
7
+ let(:warnings) { [] }
8
+
9
+ let(:warning_a) { "foo.rb:10: warning: We have a problem!\n" }
10
+ let(:warning_b) { "bar.rb:10: warning: We have an other problem!\n" }
11
+
12
+ describe '#execute' do
13
+ subject { object.execute(&block) }
14
+
15
+ before do
16
+ @called = false
17
+ end
18
+
19
+ let(:block) do
20
+ lambda do
21
+ @called = true
22
+ warnings.each(&Kernel.method(:warn))
23
+ end
24
+ end
25
+
26
+ it 'executes block' do
27
+ expect { subject }.to change { @called }.from(false).to(true)
28
+ end
29
+
30
+ context 'when no warnings occur during block execution' do
31
+ context 'and no warnings are expected' do
32
+ it_should_behave_like 'a command method'
33
+ end
34
+
35
+ context 'and warnings are expected' do
36
+ let(:expected_warnings) { [warning_a] }
37
+
38
+ it 'raises an expectation error' do
39
+ expect { subject }.to raise_error(Mutant::WarningExpectation::ExpectationError.new([], [warning_a]))
40
+ end
41
+ end
42
+ end
43
+
44
+ context 'when warnings occur during block execution' do
45
+ let(:warnings) { [warning_a, warning_b] }
46
+
47
+ context 'and only some no warnings are expected' do
48
+ let(:expected_warnings) { [warning_a] }
49
+
50
+ it 'raises an expectation error' do
51
+ expect { subject }.to raise_error(Mutant::WarningExpectation::ExpectationError.new([warning_b], []))
52
+ end
53
+ end
54
+
55
+ context 'and all warnings are expected' do
56
+ let(:expected_warnings) { [warning_a, warning_b] }
57
+
58
+ it_should_behave_like 'a command method'
59
+ end
60
+
61
+ context 'and there is an expected warning missing' do
62
+ let(:expected_warnings) { [warning_a] }
63
+ let(:warnings) { [warning_b] }
64
+
65
+ it 'raises an expectation error' do
66
+ expect { subject }.to raise_error(Mutant::WarningExpectation::ExpectationError.new([warning_b], [warning_a]))
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutant::WarningFilter do
4
+ let(:object) { described_class.new(target) }
5
+
6
+ let(:target) do
7
+ writes = self.writes
8
+ Module.new do
9
+ define_singleton_method :write do |message|
10
+ writes << message
11
+ end
12
+ end
13
+ end
14
+
15
+ let(:writes) { [] }
16
+
17
+ describe '#write' do
18
+ subject { object.write(message) }
19
+
20
+ context 'when writing a non warning message' do
21
+ let(:message) { 'foo' }
22
+
23
+ it 'writes message' do
24
+ expect { subject }.to change { writes }.from([]).to([message])
25
+ end
26
+
27
+ it 'does not capture warning' do
28
+ subject
29
+ expect(subject.warnings).to eql([])
30
+ end
31
+ end
32
+
33
+ context 'when writing a warning message' do
34
+ let(:message) { "test.rb:1: warning: some warning\n" }
35
+
36
+ it 'captures warning' do
37
+ expect { subject }.to change { object.warnings }.from([]).to([message])
38
+ end
39
+
40
+ it 'does not write message' do
41
+ subject
42
+ expect(writes).to eql([])
43
+ end
44
+ end
45
+ end
46
+
47
+ describe '.use' do
48
+ let(:object) { described_class }
49
+
50
+ it 'executes block with warning filter enabled' do
51
+ found = false
52
+ object.use do
53
+ found = $stderr.kind_of?(described_class)
54
+ end
55
+ expect(found).to be(true)
56
+ end
57
+
58
+ it 'resets to original stderr after execution with exeception ' do
59
+ original = $stderr
60
+ begin
61
+ object.use { fail }
62
+ rescue
63
+ :make_rubo_cop_happy
64
+ end
65
+ expect($stderr).to be(original)
66
+ end
67
+
68
+ it 'returns warnings generated within block' do
69
+ warnings = object.use do
70
+ eval(<<-RUBY)
71
+ Class.new do
72
+ def foo
73
+ end
74
+
75
+ def foo
76
+ end
77
+ end
78
+ RUBY
79
+ end
80
+ expect(warnings).to eql(
81
+ [
82
+ "(eval):5: warning: method redefined; discarding old foo\n",
83
+ "(eval):2: warning: previous definition of foo was here\n"
84
+ ]
85
+ )
86
+ end
87
+
88
+ it 'resets to original stderr after execution' do
89
+ original = $stderr
90
+ object.use {}
91
+ expect($stderr).to be(original)
92
+ end
93
+ end
94
+ end
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.5.10
4
+ version: 0.5.11
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-04-06 00:00:00.000000000 Z
11
+ date: 2014-04-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.1'
27
+ - !ruby/object:Gem::Dependency
28
+ name: ast
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '2.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: diff-lcs
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +58,14 @@ dependencies:
44
58
  requirements:
45
59
  - - ~>
46
60
  - !ruby/object:Gem::Version
47
- version: 0.2.1
61
+ version: 0.2.3
48
62
  type: :runtime
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - ~>
53
67
  - !ruby/object:Gem::Version
54
- version: 0.2.1
68
+ version: 0.2.3
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: procto
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +100,14 @@ dependencies:
86
100
  requirements:
87
101
  - - ~>
88
102
  - !ruby/object:Gem::Version
89
- version: 0.1.10
103
+ version: 0.1.12
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - ~>
95
109
  - !ruby/object:Gem::Version
96
- version: 0.1.10
110
+ version: 0.1.12
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: ice_nine
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -184,14 +198,14 @@ dependencies:
184
198
  requirements:
185
199
  - - ~>
186
200
  - !ruby/object:Gem::Version
187
- version: 0.1.4
201
+ version: 0.1.5
188
202
  type: :runtime
189
203
  prerelease: false
190
204
  version_requirements: !ruby/object:Gem::Requirement
191
205
  requirements:
192
206
  - - ~>
193
207
  - !ruby/object:Gem::Version
194
- version: 0.1.4
208
+ version: 0.1.5
195
209
  - !ruby/object:Gem::Dependency
196
210
  name: bundler
197
211
  requirement: !ruby/object:Gem::Requirement
@@ -307,6 +321,7 @@ files:
307
321
  - lib/mutant/mutator/node/literal/symbol.rb
308
322
  - lib/mutant/mutator/node/loop_control.rb
309
323
  - lib/mutant/mutator/node/masgn.rb
324
+ - lib/mutant/mutator/node/match_current_line.rb
310
325
  - lib/mutant/mutator/node/mlhs.rb
311
326
  - lib/mutant/mutator/node/named_value/access.rb
312
327
  - lib/mutant/mutator/node/named_value/constant_assignment.rb
@@ -319,7 +334,9 @@ files:
319
334
  - lib/mutant/mutator/node/restarg.rb
320
335
  - lib/mutant/mutator/node/return.rb
321
336
  - lib/mutant/mutator/node/send.rb
337
+ - lib/mutant/mutator/node/send/attribute_assignment.rb
322
338
  - lib/mutant/mutator/node/send/binary.rb
339
+ - lib/mutant/mutator/node/send/index.rb
323
340
  - lib/mutant/mutator/node/splat.rb
324
341
  - lib/mutant/mutator/node/super.rb
325
342
  - lib/mutant/mutator/node/when.rb
@@ -339,11 +356,11 @@ files:
339
356
  - lib/mutant/reporter/cli/printer/mutation.rb
340
357
  - lib/mutant/reporter/cli/printer/subject.rb
341
358
  - lib/mutant/reporter/null.rb
359
+ - lib/mutant/require_highjack.rb
342
360
  - lib/mutant/runner.rb
343
361
  - lib/mutant/runner/config.rb
344
362
  - lib/mutant/runner/mutation.rb
345
363
  - lib/mutant/runner/subject.rb
346
- - lib/mutant/singleton_methods.rb
347
364
  - lib/mutant/strategy.rb
348
365
  - lib/mutant/subject.rb
349
366
  - lib/mutant/subject/method.rb
@@ -351,18 +368,25 @@ files:
351
368
  - lib/mutant/subject/method/singleton.rb
352
369
  - lib/mutant/version.rb
353
370
  - lib/mutant/walker.rb
371
+ - lib/mutant/warning_expectation.rb
372
+ - lib/mutant/warning_filter.rb
354
373
  - lib/mutant/zombifier.rb
374
+ - lib/mutant/zombifier/file.rb
375
+ - lib/parser_extensions.rb
355
376
  - mutant-rspec.gemspec
356
377
  - mutant.gemspec
378
+ - spec/integration/mutant/corpus_spec.rb
357
379
  - spec/integration/mutant/rspec_spec.rb
358
380
  - spec/integration/mutant/test_mutator_handles_types_spec.rb
359
381
  - spec/integration/mutant/zombie_spec.rb
382
+ - spec/integrations.yml
360
383
  - spec/rcov.opts
361
384
  - spec/shared/method_matcher_behavior.rb
362
385
  - spec/shared/mutator_behavior.rb
363
386
  - spec/spec_helper.rb
364
387
  - spec/support/compress_helper.rb
365
388
  - spec/support/ice_nine_config.rb
389
+ - spec/support/mutation_verifier.rb
366
390
  - spec/support/rspec.rb
367
391
  - spec/support/test_app.rb
368
392
  - spec/unit/mutant/cli/classifier/method_spec.rb
@@ -429,6 +453,7 @@ files:
429
453
  - spec/unit/mutant/mutator/node/super_spec.rb
430
454
  - spec/unit/mutant/mutator/node/yield_spec.rb
431
455
  - spec/unit/mutant/mutator_spec.rb
456
+ - spec/unit/mutant/require_highjack_spec.rb
432
457
  - spec/unit/mutant/rspec/killer_spec.rb
433
458
  - spec/unit/mutant/runner/config_spec.rb
434
459
  - spec/unit/mutant/runner/mutation/killer_spec.rb
@@ -440,6 +465,8 @@ files:
440
465
  - spec/unit/mutant/subject/mutations_spec.rb
441
466
  - spec/unit/mutant/subject/node_spec.rb
442
467
  - spec/unit/mutant/subject_spec.rb
468
+ - spec/unit/mutant/warning_expectation.rb
469
+ - spec/unit/mutant/warning_filter_spec.rb
443
470
  - spec/unit/mutant_spec.rb
444
471
  - test_app/.rspec
445
472
  - test_app/Gemfile.devtools
@@ -482,6 +509,7 @@ signing_key:
482
509
  specification_version: 4
483
510
  summary: Mutation testing tool for ruby under MRI and Rubinius
484
511
  test_files:
512
+ - spec/integration/mutant/corpus_spec.rb
485
513
  - spec/integration/mutant/rspec_spec.rb
486
514
  - spec/integration/mutant/test_mutator_handles_types_spec.rb
487
515
  - spec/integration/mutant/zombie_spec.rb
@@ -549,6 +577,7 @@ test_files:
549
577
  - spec/unit/mutant/mutator/node/super_spec.rb
550
578
  - spec/unit/mutant/mutator/node/yield_spec.rb
551
579
  - spec/unit/mutant/mutator_spec.rb
580
+ - spec/unit/mutant/require_highjack_spec.rb
552
581
  - spec/unit/mutant/rspec/killer_spec.rb
553
582
  - spec/unit/mutant/runner/config_spec.rb
554
583
  - spec/unit/mutant/runner/mutation/killer_spec.rb
@@ -560,5 +589,7 @@ test_files:
560
589
  - spec/unit/mutant/subject/mutations_spec.rb
561
590
  - spec/unit/mutant/subject/node_spec.rb
562
591
  - spec/unit/mutant/subject_spec.rb
592
+ - spec/unit/mutant/warning_expectation.rb
593
+ - spec/unit/mutant/warning_filter_spec.rb
563
594
  - spec/unit/mutant_spec.rb
564
595
  has_rdoc:
@@ -1,30 +0,0 @@
1
- # encoding: utf-8
2
-
3
- # Singleton methods are defined here so zombie can pick them up
4
- module Mutant
5
-
6
- # Define instance of subclassed superclass as constant
7
- #
8
- # @param [Class] superclass
9
- # @param [Symbol] name
10
- #
11
- # @return [self]
12
- #
13
- # @api private
14
- #
15
- def self.singleton_subclass_instance(name, superclass, &block)
16
- klass = Class.new(superclass) do
17
- def inspect
18
- self.class.name
19
- end
20
-
21
- define_singleton_method(:name) do
22
- "#{superclass.name}::#{name}".freeze
23
- end
24
- end
25
- klass.class_eval(&block)
26
- superclass.const_set(name, klass.new)
27
- self
28
- end
29
-
30
- end # Mutant