mutant 0.3.0.beta20 → 0.3.0.beta21

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: abfb952112bd4c445ed4733853df50923258451a
4
- data.tar.gz: afcc91b4102ab14ed8844f72a649851c58d08b75
3
+ metadata.gz: 226c5aebcbb82e525556434b669aadde2eda433d
4
+ data.tar.gz: edf27540f7fdbad5176ed5b2c5e464e98fb06242
5
5
  SHA512:
6
- metadata.gz: eef08c62d860f904a82b88ebd26ec9f14117e4dc82fdefd5932c26181736564fc4a8621917a6783a9921e42aac3e1fdad3192fa307a6aedbb8aaec4c4f45961c
7
- data.tar.gz: 3ad28104cfa6e15e5a75e2c255fb4fa11c8b2f4596e3f042b4f54f643b01f195177be34b4ebf8a83763815f6985674a25cbaee09c52ccf18e2b62d5846872148
6
+ metadata.gz: 5e98fbc5850bc2b1de41d76484dbdd0f8755a625bad6f1830b9cd27e42cb3fafebdbdb6f779175deb7a57e86901ac0677be34a55679342f05c0d5f05e528960c
7
+ data.tar.gz: 2cc30f257f34cd3e113a5fa39e183a0abf0cfbc5c40efe10feba21b6b761756498abbc16a99e5356fd407b950bf9f7c1b6cc73b5b44192b7fb18bb1d05b417e9
data/config/flay.yml CHANGED
@@ -1,3 +1,3 @@
1
1
  ---
2
2
  threshold: 16
3
- total_score: 730
3
+ total_score: 737
data/lib/mutant.rb CHANGED
@@ -57,6 +57,9 @@ require 'mutant/mutator/node/literal/nil'
57
57
  require 'mutant/mutator/node/argument'
58
58
  require 'mutant/mutator/node/arguments'
59
59
  require 'mutant/mutator/node/begin'
60
+ require 'mutant/mutator/node/cbase'
61
+ require 'mutant/mutator/node/connective/binary'
62
+ require 'mutant/mutator/node/const'
60
63
  require 'mutant/mutator/node/named_value/access'
61
64
  require 'mutant/mutator/node/named_value/constant_assignment'
62
65
  require 'mutant/mutator/node/named_value/variable_assignment'
@@ -72,7 +72,7 @@ module Mutant
72
72
  :kwarg, :restarg, :arg, :block_pass, :or, :and,
73
73
  :next, :undef, :if, :module, :cbase, :block, :send,
74
74
  :zsuper, :super, :empty, :alias, :for, :redo,
75
- :return, :splat, :not, :defined?, :op_asgn, :self,
75
+ :return, :splat, :defined?, :op_asgn, :self,
76
76
  :true, :false, :nil, :dstr, :dsym, :regexp,
77
77
  :regopt, :int, :str, :float, :sym, :pair, :hash, :array,
78
78
  :xstr, :def, :defs, :case, :when, :ivar, :lvar, :cvar, :gvar,
@@ -21,7 +21,8 @@ module Mutant
21
21
  emit_self(*children)
22
22
  end
23
23
  end
24
- children.each do |child|
24
+ children.each_with_index do |child, index|
25
+ mutate_child(index)
25
26
  emit(child)
26
27
  end
27
28
  end
@@ -0,0 +1,25 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+
5
+ # Mutation emitter to handle cbase nodes
6
+ class Cbase < self
7
+
8
+ handle(:cbase)
9
+
10
+ private
11
+
12
+ # Emit mutations
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ # noop, for now
20
+ end
21
+
22
+ end # Cbase
23
+ end # Node
24
+ end # Mutator
25
+ end # Mutant
@@ -0,0 +1,59 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+ module Connective
5
+
6
+ # Mutation emitter to handle binary connectives
7
+ class Binary < Node
8
+
9
+ INVERSE = {
10
+ :and => :or,
11
+ :or => :and,
12
+ }.freeze
13
+
14
+ handle *INVERSE.keys
15
+
16
+ children :left, :right
17
+
18
+ private
19
+
20
+ # Emit mutations
21
+ #
22
+ # @return [undefined]
23
+ #
24
+ # @api private
25
+ #
26
+ def dispatch
27
+ emit_nil
28
+ emit(left)
29
+ emit(right)
30
+ mutate_operator
31
+ mutate_operands
32
+ end
33
+
34
+ # Emit operator mutations
35
+ #
36
+ # @return [undefined]
37
+ #
38
+ # @api private
39
+ #
40
+ def mutate_operator
41
+ emit(s(INVERSE.fetch(node.type), left, right))
42
+ end
43
+
44
+ # Emit condition mutations
45
+ #
46
+ # @return [undefined]
47
+ #
48
+ # @api private
49
+ #
50
+ def mutate_operands
51
+ emit(s(node.type, n_not(left), right))
52
+ emit(n_not(node))
53
+ end
54
+
55
+ end # Binary
56
+ end # Connective
57
+ end # Node
58
+ end # Mutator
59
+ end # Mutant
@@ -0,0 +1,28 @@
1
+ module Mutant
2
+ class Mutator
3
+ class Node
4
+
5
+ # Mutation emitter to handle const nodes
6
+ class Const < self
7
+
8
+ handle(:const)
9
+
10
+ private
11
+
12
+ # Emit mutations
13
+ #
14
+ # @return [undefined]
15
+ #
16
+ # @api private
17
+ #
18
+ def dispatch
19
+ emit_nil
20
+ children.each_with_index do |child, index|
21
+ mutate_child(index) if child.kind_of?(Parser::AST::Node)
22
+ end
23
+ end
24
+
25
+ end # Const
26
+ end # Node
27
+ end # Mutator
28
+ end # Mutant
@@ -8,12 +8,12 @@ module Mutant
8
8
  # These nodes still need a dedicated mutator,
9
9
  # your contribution is that close!
10
10
  handle(
11
- :not, :or, :and, :defined,
11
+ :defined,
12
12
  :next, :break, :match, :ensure,
13
13
  :dstr, :dsym, :yield, :rescue, :redo, :defined?,
14
14
  :blockarg, :block_pass, :op_asgn, :and_asgn,
15
15
  :regopt, :restarg, :resbody, :retry, :arg_expr,
16
- :kwrestarg, :kwoptarg, :kwarg, :undef, :module, :cbase, :empty,
16
+ :kwrestarg, :kwoptarg, :kwarg, :undef, :module, :empty,
17
17
  :alias, :for, :xstr, :back_ref, :nth_ref, :class,
18
18
  :sclass, :match_with_lvasgn, :match_current_line, :or_asgn, :kwbegin
19
19
  )
@@ -30,9 +30,9 @@ module Mutant
30
30
  #
31
31
  def mutate_condition
32
32
  emit_condition_mutations
33
- emit_self(s(:send, condition, :!), if_branch, else_branch)
34
- emit_self(s(:true), if_branch, else_branch)
35
- emit_self(s(:false), if_branch, else_branch)
33
+ emit_self(n_not(condition), if_branch, else_branch)
34
+ emit_self(N_TRUE, if_branch, else_branch)
35
+ emit_self(N_FALSE, if_branch, else_branch)
36
36
  end
37
37
 
38
38
  # Emit if branch mutations
@@ -45,7 +45,7 @@ module Mutant
45
45
  emit_self(condition, else_branch, nil) if else_branch
46
46
  if if_branch
47
47
  emit_if_branch_mutations
48
- emit_self(condition, if_branch, nil)
48
+ emit_self(condition, if_branch, nil)
49
49
  end
50
50
  end
51
51
 
@@ -10,10 +10,18 @@ module Mutant
10
10
  # No input can ever be matched with this
11
11
  NULL_REGEXP_SOURCE = 'a\A'.freeze
12
12
 
13
- children :source, :options
14
-
15
13
  private
16
14
 
15
+ # Return options
16
+ #
17
+ # @return [Parser::AST::Node]
18
+ #
19
+ # @api private
20
+ #
21
+ def options
22
+ children.last
23
+ end
24
+
17
25
  # Emit mutants
18
26
  #
19
27
  # @return [undefined]
@@ -22,6 +30,9 @@ module Mutant
22
30
  #
23
31
  def dispatch
24
32
  emit_nil
33
+ children.each_with_index do |child, index|
34
+ mutate_child(index) unless child.type == :str
35
+ end
25
36
  emit_self(s(:str, EMPTY_STRING), options)
26
37
  emit_self(s(:str, NULL_REGEXP_SOURCE), options)
27
38
  end
@@ -6,7 +6,7 @@ module Mutant
6
6
  # Mutation emitter to handle named value access nodes
7
7
  class Access < Node
8
8
 
9
- handle(:gvar, :cvar, :ivar, :lvar, :const, :self)
9
+ handle(:gvar, :cvar, :ivar, :lvar, :self)
10
10
 
11
11
  private
12
12
 
@@ -15,7 +15,6 @@ module Mutant
15
15
  end
16
16
  module_function :s
17
17
 
18
-
19
18
  NAN = s(:send, s(:float, 0.0), :/, s(:args, s(:float, 0.0)))
20
19
  NEGATIVE_INFINITY = s(:send, s(:float, -1.0), :/, s(:args, s(:float, 0.0)))
21
20
  INFINITY = s(:send, s(:float, 1.0), :/, s(:args, s(:float, 0.0)))
@@ -23,8 +22,22 @@ module Mutant
23
22
 
24
23
  RAISE = s(:send, nil, :raise)
25
24
 
25
+ N_TRUE = s(:true)
26
+ N_FALSE = s(:false)
26
27
  N_NIL = s(:nil)
27
28
  N_EMPTY = s(:empty)
28
29
 
30
+ # Build a negated boolean node
31
+ #
32
+ # @param [Parser::AST::Node] node
33
+ #
34
+ # @return [Parser::AST::Node]
35
+ #
36
+ # @api private
37
+ #
38
+ def n_not(node)
39
+ s(:send, node, :!)
40
+ end
41
+
29
42
  end # NodeHelpers
30
43
  end # Mutant
data/mutant.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |gem|
4
4
  gem.name = 'mutant'
5
- gem.version = '0.3.0.beta20'
5
+ gem.version = '0.3.0.beta21'
6
6
  gem.authors = [ 'Markus Schirp' ]
7
7
  gem.email = [ 'mbj@schirp-dso.com' ]
8
8
 
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutant::Mutator::Node::NamedValue::Access, 'cbase' do
4
+
5
+ before do
6
+ Mutant::Random.stub(:hex_string => :random)
7
+ end
8
+
9
+ let(:source) { '::A' }
10
+
11
+ let(:mutations) do
12
+ mutants = []
13
+ mutants << 'nil'
14
+ end
15
+
16
+ it_should_behave_like 'a mutator'
17
+ end
@@ -0,0 +1,39 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutant::Mutator::Node::Connective::Binary, 'mutations' do
4
+ context 'and' do
5
+ let(:source) { 'true and false' }
6
+
7
+ let(:mutations) do
8
+ mutations = []
9
+ mutations << 'nil'
10
+ mutations << 'true'
11
+ mutations << 'false'
12
+
13
+ mutations << 'true or false'
14
+
15
+ mutations << 'not true and false'
16
+ mutations << 'not(true and false)'
17
+ end
18
+
19
+ it_should_behave_like 'a mutator'
20
+ end
21
+
22
+ context 'or' do
23
+ let(:source) { 'true or false' }
24
+
25
+ let(:mutations) do
26
+ mutations = []
27
+ mutations << 'nil'
28
+ mutations << 'true'
29
+ mutations << 'false'
30
+
31
+ mutations << 'true and false'
32
+
33
+ mutations << 'not true or false'
34
+ mutations << 'not(true or false)'
35
+ end
36
+
37
+ it_should_behave_like 'a mutator'
38
+ end
39
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutant::Mutator::Node::NamedValue::Access, 'const' do
4
+
5
+ before do
6
+ Mutant::Random.stub(:hex_string => :random)
7
+ end
8
+
9
+ let(:source) { 'A::B' }
10
+
11
+ let(:mutations) do
12
+ mutants = []
13
+ mutants << 'nil'
14
+ mutants << 'nil::B'
15
+ end
16
+
17
+ it_should_behave_like 'a mutator'
18
+ end
@@ -2,14 +2,31 @@ require 'spec_helper'
2
2
 
3
3
  describe Mutant::Mutator::Node::Literal, 'regex' do
4
4
 
5
- let(:source) { '/foo/' }
5
+ context 'literal' do
6
+ let(:source) { '/foo/' }
6
7
 
7
- let(:mutations) do
8
- mutations = []
9
- mutations << 'nil'
10
- mutations << '//' # match all
11
- mutations << '/a\A/' # match nothing
8
+ let(:mutations) do
9
+ mutations = []
10
+ mutations << 'nil'
11
+ mutations << '//' # match all
12
+ mutations << '/a\A/' # match nothing
13
+ end
14
+
15
+ it_should_behave_like 'a mutator'
16
+ end
17
+
18
+ context 'interpolated' do
19
+ let(:source) { '/#{foo.bar}n/' }
20
+
21
+ let(:mutations) do
22
+ mutations = []
23
+ mutations << 'nil'
24
+ mutations << '//' # match all
25
+ mutations << '/#{foo}n/' # match all
26
+ mutations << '/a\A/' # match nothing
27
+ end
28
+
29
+ it_should_behave_like 'a mutator'
12
30
  end
13
31
 
14
- it_should_behave_like 'a mutator'
15
32
  end
@@ -64,17 +64,6 @@ describe Mutant::Mutator::Node::NamedValue::Access, 'mutations' do
64
64
  it_should_behave_like 'a mutator'
65
65
  end
66
66
 
67
- context 'constant' do
68
- let(:source) { 'A' }
69
-
70
- let(:mutations) do
71
- mutants = []
72
- mutants << 'nil'
73
- end
74
-
75
- it_should_behave_like 'a mutator'
76
- end
77
-
78
67
  context 'self' do
79
68
  let(:source) { 'self' }
80
69
 
@@ -191,6 +191,8 @@ describe Mutant::Mutator, 'send' do
191
191
  mutations = []
192
192
  mutations << 'foo'
193
193
  mutations << 'left - right'
194
+ mutations << 'left / foo'
195
+ mutations << 'right / foo'
194
196
  end
195
197
 
196
198
  it_should_behave_like 'a mutator'
@@ -0,0 +1,12 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutant::NodeHelpers, '#n_not' do
4
+ subject { object.n_not(node) }
5
+
6
+ let(:object) { Object.new.extend(described_class) }
7
+ let(:node) { described_class::N_TRUE }
8
+
9
+ it 'returns the negated node' do
10
+ expect(subject).to eq(parse('not true'))
11
+ end
12
+ 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.3.0.beta20
4
+ version: 0.3.0.beta21
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-23 00:00:00.000000000 Z
11
+ date: 2013-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: parser
@@ -224,6 +224,9 @@ files:
224
224
  - lib/mutant/mutator/node/begin.rb
225
225
  - lib/mutant/mutator/node/block.rb
226
226
  - lib/mutant/mutator/node/case.rb
227
+ - lib/mutant/mutator/node/cbase.rb
228
+ - lib/mutant/mutator/node/connective/binary.rb
229
+ - lib/mutant/mutator/node/const.rb
227
230
  - lib/mutant/mutator/node/define.rb
228
231
  - lib/mutant/mutator/node/generic.rb
229
232
  - lib/mutant/mutator/node/if.rb
@@ -324,6 +327,9 @@ files:
324
327
  - spec/unit/mutant/mutator/node/begin/mutation_spec.rb
325
328
  - spec/unit/mutant/mutator/node/block/mutation_spec.rb
326
329
  - spec/unit/mutant/mutator/node/case/mutation_spec.rb
330
+ - spec/unit/mutant/mutator/node/cbase/mutation_spec.rb
331
+ - spec/unit/mutant/mutator/node/connective/binary/mutation_spec.rb
332
+ - spec/unit/mutant/mutator/node/const/mutation_spec.rb
327
333
  - spec/unit/mutant/mutator/node/define/mutation_spec.rb
328
334
  - spec/unit/mutant/mutator/node/if/mutation_spec.rb
329
335
  - spec/unit/mutant/mutator/node/literal/array_spec.rb
@@ -344,6 +350,7 @@ files:
344
350
  - spec/unit/mutant/mutator/node/send/mutation_spec.rb
345
351
  - spec/unit/mutant/mutator/node/super/mutation_spec.rb
346
352
  - spec/unit/mutant/mutator/node/while/mutation_spec.rb
353
+ - spec/unit/mutant/node_helpers/n_not_spec.rb
347
354
  - spec/unit/mutant/runner/config/subjects_spec.rb
348
355
  - spec/unit/mutant/runner/config/success_predicate_spec.rb
349
356
  - spec/unit/mutant/runner/mutation/killer_spec.rb
@@ -432,6 +439,9 @@ test_files:
432
439
  - spec/unit/mutant/mutator/node/begin/mutation_spec.rb
433
440
  - spec/unit/mutant/mutator/node/block/mutation_spec.rb
434
441
  - spec/unit/mutant/mutator/node/case/mutation_spec.rb
442
+ - spec/unit/mutant/mutator/node/cbase/mutation_spec.rb
443
+ - spec/unit/mutant/mutator/node/connective/binary/mutation_spec.rb
444
+ - spec/unit/mutant/mutator/node/const/mutation_spec.rb
435
445
  - spec/unit/mutant/mutator/node/define/mutation_spec.rb
436
446
  - spec/unit/mutant/mutator/node/if/mutation_spec.rb
437
447
  - spec/unit/mutant/mutator/node/literal/array_spec.rb
@@ -452,6 +462,7 @@ test_files:
452
462
  - spec/unit/mutant/mutator/node/send/mutation_spec.rb
453
463
  - spec/unit/mutant/mutator/node/super/mutation_spec.rb
454
464
  - spec/unit/mutant/mutator/node/while/mutation_spec.rb
465
+ - spec/unit/mutant/node_helpers/n_not_spec.rb
455
466
  - spec/unit/mutant/runner/config/subjects_spec.rb
456
467
  - spec/unit/mutant/runner/config/success_predicate_spec.rb
457
468
  - spec/unit/mutant/runner/mutation/killer_spec.rb