mutant 0.2.20 → 0.3.0.beta2

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 (201) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +10 -11
  3. data/Changelog.md +93 -38
  4. data/Gemfile +3 -1
  5. data/Gemfile.devtools +16 -20
  6. data/Guardfile +1 -1
  7. data/README.md +36 -16
  8. data/Rakefile +21 -2
  9. data/TODO +11 -7
  10. data/bin/mutant +4 -0
  11. data/bin/zombie +4 -0
  12. data/config/devtools.yml +2 -0
  13. data/config/flay.yml +2 -2
  14. data/config/flog.yml +1 -1
  15. data/config/{site.reek → reek.yml} +94 -70
  16. data/lib/mutant/cli/classifier/method.rb +100 -0
  17. data/lib/mutant/cli/classifier/namespace.rb +47 -0
  18. data/lib/mutant/cli/classifier/scope.rb +35 -0
  19. data/lib/mutant/cli/classifier.rb +141 -0
  20. data/lib/mutant/cli.rb +115 -162
  21. data/lib/mutant/color.rb +2 -2
  22. data/lib/mutant/config.rb +27 -0
  23. data/lib/mutant/constants.rb +32 -17
  24. data/lib/mutant/context/scope.rb +33 -51
  25. data/lib/mutant/context.rb +8 -19
  26. data/lib/mutant/differ.rb +5 -5
  27. data/lib/mutant/helper.rb +2 -17
  28. data/lib/mutant/killer/forked.rb +44 -0
  29. data/lib/mutant/killer/forking.rb +3 -57
  30. data/lib/mutant/killer/rspec.rb +16 -20
  31. data/lib/mutant/killer/static.rb +6 -7
  32. data/lib/mutant/killer.rb +48 -74
  33. data/lib/mutant/loader.rb +6 -6
  34. data/lib/mutant/matcher/chain.rb +4 -25
  35. data/lib/mutant/matcher/method/instance.rb +14 -24
  36. data/lib/mutant/matcher/method/singleton.rb +35 -46
  37. data/lib/mutant/matcher/method.rb +95 -83
  38. data/lib/mutant/matcher/{scope_methods.rb → methods.rb} +53 -76
  39. data/lib/mutant/matcher/namespace.rb +71 -0
  40. data/lib/mutant/matcher/scope.rb +34 -0
  41. data/lib/mutant/matcher.rb +24 -34
  42. data/lib/mutant/mutation/evil.rb +35 -0
  43. data/lib/mutant/mutation/filter/code.rb +7 -28
  44. data/lib/mutant/mutation/filter/regexp.rb +6 -18
  45. data/lib/mutant/mutation/filter/whitelist.rb +5 -4
  46. data/lib/mutant/mutation/filter.rb +10 -9
  47. data/lib/mutant/mutation/neutral.rb +35 -0
  48. data/lib/mutant/mutation.rb +21 -61
  49. data/lib/mutant/mutator/node/argument.rb +88 -0
  50. data/lib/mutant/mutator/node/arguments.rb +52 -0
  51. data/lib/mutant/mutator/node/assignment.rb +34 -38
  52. data/lib/mutant/mutator/node/begin.rb +33 -0
  53. data/lib/mutant/mutator/node/block.rb +14 -14
  54. data/lib/mutant/mutator/node/case.rb +59 -0
  55. data/lib/mutant/mutator/node/define.rb +26 -22
  56. data/lib/mutant/mutator/node/if.rb +31 -71
  57. data/lib/mutant/mutator/node/literal/array.rb +25 -9
  58. data/lib/mutant/mutator/node/literal/boolean.rb +13 -30
  59. data/lib/mutant/mutator/node/literal/dynamic.rb +6 -5
  60. data/lib/mutant/mutator/node/literal/fixnum.rb +18 -7
  61. data/lib/mutant/mutator/node/literal/float.rb +15 -8
  62. data/lib/mutant/mutator/node/literal/hash.rb +33 -52
  63. data/lib/mutant/mutator/node/literal/nil.rb +8 -7
  64. data/lib/mutant/mutator/node/literal/range.rb +25 -50
  65. data/lib/mutant/mutator/node/literal/regex.rb +15 -23
  66. data/lib/mutant/mutator/node/literal/string.rb +7 -6
  67. data/lib/mutant/mutator/node/literal/symbol.rb +7 -6
  68. data/lib/mutant/mutator/node/literal.rb +4 -46
  69. data/lib/mutant/mutator/node/mlhs.rb +27 -0
  70. data/lib/mutant/mutator/node/noop.rb +18 -43
  71. data/lib/mutant/mutator/node/return.rb +8 -8
  72. data/lib/mutant/mutator/node/send/binary.rb +31 -0
  73. data/lib/mutant/mutator/node/send.rb +106 -72
  74. data/lib/mutant/mutator/node/super.rb +15 -20
  75. data/lib/mutant/mutator/node/when.rb +32 -7
  76. data/lib/mutant/mutator/node/while.rb +9 -7
  77. data/lib/mutant/mutator/node.rb +116 -66
  78. data/lib/mutant/mutator/registry.rb +14 -11
  79. data/lib/mutant/mutator/util/array.rb +9 -9
  80. data/lib/mutant/mutator/util/symbol.rb +6 -20
  81. data/lib/mutant/mutator/util.rb +6 -3
  82. data/lib/mutant/mutator.rb +12 -28
  83. data/lib/mutant/node_helpers.rb +28 -0
  84. data/lib/mutant/random.rb +3 -2
  85. data/lib/mutant/reporter/cli/printer/config.rb +174 -0
  86. data/lib/mutant/reporter/cli/printer/killer.rb +42 -0
  87. data/lib/mutant/reporter/cli/printer/mutation.rb +55 -0
  88. data/lib/mutant/reporter/cli/printer/subject.rb +147 -0
  89. data/lib/mutant/reporter/cli/printer.rb +165 -0
  90. data/lib/mutant/reporter/cli.rb +9 -277
  91. data/lib/mutant/reporter/null.rb +6 -30
  92. data/lib/mutant/reporter.rb +6 -73
  93. data/lib/mutant/runner/config.rb +82 -0
  94. data/lib/mutant/runner/mutation.rb +58 -0
  95. data/lib/mutant/runner/subject.rb +81 -0
  96. data/lib/mutant/runner.rb +42 -92
  97. data/lib/mutant/singleton_methods.rb +2 -2
  98. data/lib/mutant/strategy/method_expansion.rb +51 -0
  99. data/lib/mutant/strategy/rspec/dm2/lookup/method.rb +142 -0
  100. data/lib/mutant/strategy/rspec/dm2/lookup.rb +61 -0
  101. data/lib/mutant/strategy/rspec/dm2.rb +22 -0
  102. data/lib/mutant/strategy/rspec.rb +20 -22
  103. data/lib/mutant/strategy/static.rb +18 -0
  104. data/lib/mutant/strategy.rb +15 -50
  105. data/lib/mutant/subject/method.rb +100 -0
  106. data/lib/mutant/subject.rb +18 -49
  107. data/lib/mutant/support/method_object.rb +4 -2
  108. data/lib/mutant.rb +40 -35
  109. data/mutant.gemspec +9 -8
  110. data/spec/integration/mutant/rspec_killer_spec.rb +3 -3
  111. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +9 -0
  112. data/spec/integration/mutant/zombie_spec.rb +1 -1
  113. data/spec/shared/method_matcher_behavior.rb +35 -0
  114. data/spec/shared/mutator_behavior.rb +63 -32
  115. data/spec/spec_helper.rb +13 -3
  116. data/spec/support/ice_nine_config.rb +8 -0
  117. data/spec/support/rspec.rb +1 -1
  118. data/spec/support/zombie.rb +1 -1
  119. data/spec/unit/mutant/cli/class_methods/new_spec.rb +42 -28
  120. data/spec/unit/mutant/cli/class_methods/run_spec.rb +15 -13
  121. data/spec/unit/mutant/cli/classifier/class_methods/build_spec.rb +44 -0
  122. data/spec/unit/mutant/context/scope/root_spec.rb +4 -4
  123. data/spec/unit/mutant/killer/rspec/class_methods/new_spec.rb +6 -5
  124. data/spec/unit/mutant/killer/success_predicate_spec.rb +28 -0
  125. data/spec/unit/mutant/loader/eval/class_methods/run_spec.rb +1 -1
  126. data/spec/unit/mutant/matcher/chain/each_spec.rb +1 -1
  127. data/spec/unit/mutant/matcher/chain/matchers_spec.rb +1 -1
  128. data/spec/unit/mutant/matcher/method/instance/each_spec.rb +112 -0
  129. data/spec/unit/mutant/matcher/method/singleton/each_spec.rb +93 -0
  130. data/spec/unit/mutant/matcher/methods/instance/each_spec.rb +59 -0
  131. data/spec/unit/mutant/matcher/methods/singleton/each_spec.rb +53 -0
  132. data/spec/unit/mutant/matcher/namespace/each_spec.rb +37 -0
  133. data/spec/unit/mutant/mutator/node/begin/mutation_spec.rb +33 -0
  134. data/spec/unit/mutant/mutator/node/block/mutation_spec.rb +42 -14
  135. data/spec/unit/mutant/mutator/node/case/mutation_spec.rb +319 -0
  136. data/spec/unit/mutant/mutator/node/define/mutation_spec.rb +31 -27
  137. data/spec/unit/mutant/mutator/node/if/mutation_spec.rb +75 -0
  138. data/spec/unit/mutant/mutator/node/literal/fixnum_spec.rb +1 -1
  139. data/spec/unit/mutant/mutator/node/literal/hash_spec.rb +2 -2
  140. data/spec/unit/mutant/mutator/node/literal/nil_spec.rb +1 -3
  141. data/spec/unit/mutant/mutator/node/literal/regex_spec.rb +1 -9
  142. data/spec/unit/mutant/mutator/node/return/mutation_spec.rb +6 -2
  143. data/spec/unit/mutant/mutator/node/send/mutation_spec.rb +111 -108
  144. data/spec/unit/mutant/mutator/node/super/mutation_spec.rb +0 -33
  145. data/spec/unit/mutant/mutator/node/while/mutation_spec.rb +2 -2
  146. data/spec/unit/mutant/runner/config/subjects_spec.rb +38 -0
  147. data/spec/unit/mutant/runner/config/success_predicate_spec.rb +53 -0
  148. data/spec/unit/mutant/runner/failed_predicte_spec.rb +33 -0
  149. data/spec/unit/mutant/runner/mutation/killer_spec.rb +39 -0
  150. data/spec/unit/mutant/runner/subject/success_predicate_spec.rb +49 -0
  151. data/spec/unit/mutant/strategy/method_expansion/class_methods/run_spec.rb +49 -0
  152. data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/instance/spec_files_spec.rb +52 -0
  153. data/spec/unit/mutant/strategy/rspec/dm2/lookup/method/singleton/spec_files_spec.rb +42 -0
  154. data/spec/unit/mutant/subject/context_spec.rb +6 -3
  155. data/spec/unit/mutant/subject/each_spec.rb +11 -8
  156. data/spec/unit/mutant/subject/node_spec.rb +6 -2
  157. data/test_app/spec/shared/method_filter_parse_behavior.rb +0 -2
  158. data/test_app/spec/shared/method_match_behavior.rb +1 -1
  159. data/test_app/spec/spec_helper.rb +4 -2
  160. metadata +101 -109
  161. data/config/roodi.yml +0 -26
  162. data/lib/mutant/matcher/method/classifier.rb +0 -141
  163. data/lib/mutant/matcher/object_space.rb +0 -114
  164. data/lib/mutant/mutator/node/actual_arguments.rb +0 -25
  165. data/lib/mutant/mutator/node/default_arguments.rb +0 -25
  166. data/lib/mutant/mutator/node/formal_arguments_19/default_mutations.rb +0 -33
  167. data/lib/mutant/mutator/node/formal_arguments_19/pattern_argument_expansion.rb +0 -35
  168. data/lib/mutant/mutator/node/formal_arguments_19/require_defaults.rb +0 -37
  169. data/lib/mutant/mutator/node/formal_arguments_19.rb +0 -41
  170. data/lib/mutant/mutator/node/iter_19.rb +0 -27
  171. data/lib/mutant/mutator/node/literal/empty_array.rb +0 -26
  172. data/lib/mutant/mutator/node/pattern_arguments.rb +0 -41
  173. data/lib/mutant/mutator/node/pattern_variable.rb +0 -23
  174. data/lib/mutant/mutator/node/receiver_case.rb +0 -122
  175. data/lib/mutant/mutator/node/send/binary_operator_method.rb +0 -61
  176. data/lib/mutant/mutator/node/send/with_arguments.rb +0 -81
  177. data/lib/mutant/reporter/stats.rb +0 -120
  178. data/lib/mutant/strategy/rspec/example_lookup.rb +0 -163
  179. data/spec/integration/mutant/method_matching_spec.rb +0 -269
  180. data/spec/shared/method_match_behavior.rb +0 -39
  181. data/spec/unit/mutant/killer/fail_ques_spec.rb +0 -39
  182. data/spec/unit/mutant/matcher/class_methods/from_string_spec.rb +0 -49
  183. data/spec/unit/mutant/matcher/class_methods/parse_spec.rb +0 -12
  184. data/spec/unit/mutant/matcher/method/class_methods/parse_spec.rb +0 -21
  185. data/spec/unit/mutant/matcher/method/classifier/class_methods/run_spec.rb +0 -52
  186. data/spec/unit/mutant/matcher/object_space/class_methods/parse_spec.rb +0 -24
  187. data/spec/unit/mutant/matcher/object_space/each_spec.rb +0 -31
  188. data/spec/unit/mutant/mutator/node/if_statement/mutation_spec.rb +0 -60
  189. data/spec/unit/mutant/mutator/node/receiver_case/mutation_spec.rb +0 -27
  190. data/spec/unit/mutant/strategy/rspec/example_lookup/spec_file_spec.rb +0 -236
  191. data/spec/unit/mutant/subject/class_methods/new_spec.rb +0 -13
  192. data/tasks/metrics/ci.rake +0 -7
  193. data/tasks/metrics/flay.rake +0 -41
  194. data/tasks/metrics/flog.rake +0 -43
  195. data/tasks/metrics/heckle.rake +0 -216
  196. data/tasks/metrics/metric_fu.rake +0 -31
  197. data/tasks/metrics/reek.rake +0 -15
  198. data/tasks/metrics/roodi.rake +0 -15
  199. data/tasks/metrics/yardstick.rake +0 -23
  200. data/tasks/spec.rake +0 -45
  201. data/tasks/yard.rake +0 -9
@@ -0,0 +1,37 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutant::Matcher::Namespace, '#each' do
4
+ subject { object.each { |item| yields << item } }
5
+
6
+ let(:yields) { [] }
7
+ let(:object) { described_class.new(TestApp::Literal) }
8
+
9
+ let(:singleton_a) { mock('SingletonA', :name => 'TestApp::Literal') }
10
+ let(:singleton_b) { mock('SingletonB', :name => 'TestApp::Foo') }
11
+ let(:subject_a) { mock('SubjectA') }
12
+ let(:subject_b) { mock('SubjectB') }
13
+
14
+ before do
15
+ Mutant::Matcher::Methods::Singleton.stub(:each).with(singleton_a).and_yield(subject_a)
16
+ Mutant::Matcher::Methods::Instance.stub(:each).with(singleton_a).and_yield(subject_b)
17
+ ObjectSpace.stub(:each_object => [singleton_a, singleton_b])
18
+ end
19
+
20
+ context 'with no block' do
21
+ subject { object.each }
22
+
23
+ it { should be_instance_of(to_enum.class) }
24
+
25
+ if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
26
+ pending 'FIX RBX rspec? BUG HERE'
27
+ else
28
+ it 'yields the expected values' do
29
+ subject.to_a.should eql(object.to_a)
30
+ end
31
+ end
32
+ end
33
+
34
+ it 'should yield subjects' do
35
+ expect { subject }.to change { yields }.from([]).to([subject_a, subject_b])
36
+ end
37
+ end
@@ -0,0 +1,33 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutant::Mutator, 'begin' do
4
+
5
+ # This mutation and only this mutation can result in
6
+ # and empty emit that is parsed into nil, unparser cannot
7
+ # handle this so we guard this here!
8
+ def generate(node)
9
+ return '' if node.nil?
10
+ super
11
+ end
12
+
13
+ let(:source) { "true\nfalse" }
14
+
15
+ let(:mutations) do
16
+ mutations = []
17
+
18
+ # Mutation of each statement in block
19
+ mutations << "true\ntrue"
20
+ mutations << "false\nfalse"
21
+ mutations << "nil\nfalse"
22
+ mutations << "true\nnil"
23
+
24
+ # Remove statement in block
25
+ mutations << 'true'
26
+ mutations << 'false'
27
+
28
+ # Replace block with empty
29
+ mutations << ''
30
+ end
31
+
32
+ it_should_behave_like 'a mutator'
33
+ end
@@ -1,35 +1,63 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe Mutant::Mutator, 'block' do
4
-
5
- context 'with more than one statement' do
6
- let(:source) { "self.foo\nself.bar" }
4
+ context 'with block' do
5
+ let(:source) { 'foo() { a; b }' }
7
6
 
8
7
  let(:mutations) do
9
8
  mutations = []
9
+ mutations << 'foo { a }'
10
+ mutations << 'foo { b }'
11
+ mutations << 'foo {}'
12
+ mutations << 'foo'
13
+ end
14
+
15
+ it_should_behave_like 'a mutator'
16
+ end
17
+
18
+ context 'with block args' do
10
19
 
11
- # Mutation of each statement in block
12
- mutations << "foo\nself.bar".to_ast
13
- mutations << "self.foo\nbar".to_ast
20
+ let(:source) { 'foo { |a, b| }' }
14
21
 
15
- # Remove statement in block
16
- mutations << Rubinius::AST::Block.new(1, ['self.foo'.to_ast])
17
- mutations << Rubinius::AST::Block.new(1, ['self.bar'.to_ast])
18
- mutations << Rubinius::AST::Block.new(1, ['nil'.to_ast])
22
+ before do
23
+ Mutant::Random.stub(:hex_string => :random)
24
+ end
25
+
26
+ let(:mutations) do
27
+ mutations = []
28
+ mutations << 'foo'
29
+ mutations << 'foo { |a, b| ::Object.new }'
30
+ mutations << 'foo { |a, srandom| }'
31
+ mutations << 'foo { |srandom, b| }'
32
+ mutations << 'foo { |a| }'
33
+ mutations << 'foo { |b| }'
34
+ mutations << 'foo { || }'
19
35
  end
20
36
 
21
37
  it_should_behave_like 'a mutator'
22
38
  end
23
39
 
40
+ context 'with block pattern args' do
24
41
 
42
+ before do
43
+ Mutant::Random.stub(:hex_string => :random)
44
+ end
25
45
 
26
- context 'with one statement' do
27
- let(:node) { Rubinius::AST::Block.new(1, ['self.foo'.to_ast]) }
46
+ let(:source) { 'foo { |(a, b), c| }' }
28
47
 
29
48
  let(:mutations) do
30
49
  mutations = []
31
- mutations << Rubinius::AST::Block.new(1, ['foo'.to_ast])
32
- mutations << Rubinius::AST::Block.new(1, ['nil'.to_ast])
50
+ mutations << 'foo { || }'
51
+ mutations << 'foo { |a, b, c| }'
52
+ mutations << 'foo { |(a, b), c| ::Object.new }'
53
+ mutations << 'foo { |(a), c| }'
54
+ mutations << 'foo { |(b), c| }'
55
+ mutations << 'foo { |(a, b)| }'
56
+ mutations << 'foo { |c| }'
57
+ mutations << 'foo { |(srandom, b), c| }'
58
+ mutations << 'foo { |(a, srandom), c| }'
59
+ mutations << 'foo { |(a, b), srandom| }'
60
+ mutations << 'foo'
33
61
  end
34
62
 
35
63
  it_should_behave_like 'a mutator'
@@ -0,0 +1,319 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutant::Mutator::Node::Case do
4
+ let(:random_string) { 'random' }
5
+
6
+ before do
7
+ Mutant::Random.stub(:hex_string => random_string)
8
+ end
9
+
10
+ context 'with multiple when branches' do
11
+ let(:source) do
12
+ <<-RUBY
13
+ case :condition
14
+ when :foo
15
+ :foo
16
+ when :bar, :baz
17
+ :barbaz
18
+ else
19
+ :else
20
+ end
21
+ RUBY
22
+ end
23
+
24
+ let(:mutations) do
25
+ mutations = []
26
+
27
+ # Presence of branches
28
+ mutations << <<-RUBY
29
+ case :condition
30
+ when :bar, :baz
31
+ :barbaz
32
+ else
33
+ :else
34
+ end
35
+ RUBY
36
+ mutations << <<-RUBY
37
+ case :condition
38
+ when :foo
39
+ :foo
40
+ else
41
+ :else
42
+ end
43
+ RUBY
44
+ mutations << <<-RUBY
45
+ case :condition
46
+ when :foo
47
+ :foo
48
+ when :bar, :baz
49
+ :barbaz
50
+ end
51
+ RUBY
52
+
53
+ # Mutations of condition
54
+ mutations << <<-RUBY
55
+ case nil
56
+ when :foo
57
+ :foo
58
+ when :bar, :baz
59
+ :barbaz
60
+ else
61
+ :else
62
+ end
63
+ RUBY
64
+ mutations << <<-RUBY
65
+ case :srandom
66
+ when :foo
67
+ :foo
68
+ when :bar, :baz
69
+ :barbaz
70
+ else
71
+ :else
72
+ end
73
+ RUBY
74
+
75
+ # Mutations of branch bodies
76
+ mutations << <<-RUBY
77
+ case :condition
78
+ when :foo
79
+ nil
80
+ when :bar, :baz
81
+ :barbaz
82
+ else
83
+ :else
84
+ end
85
+ RUBY
86
+ mutations << <<-RUBY
87
+ case :condition
88
+ when :foo
89
+ :srandom
90
+ when :bar, :baz
91
+ :barbaz
92
+ else
93
+ :else
94
+ end
95
+ RUBY
96
+ mutations << <<-RUBY
97
+ case :condition
98
+ when :foo
99
+ :foo
100
+ when :bar, :baz
101
+ :srandom
102
+ else
103
+ :else
104
+ end
105
+ RUBY
106
+ mutations << <<-RUBY
107
+ case :condition
108
+ when :foo
109
+ :foo
110
+ when :bar, :baz
111
+ nil
112
+ else
113
+ :else
114
+ end
115
+ RUBY
116
+ mutations << <<-RUBY
117
+ case :condition
118
+ when :foo
119
+ :foo
120
+ when :bar, :baz
121
+ :barbaz
122
+ else
123
+ :srandom
124
+ end
125
+ RUBY
126
+ mutations << <<-RUBY
127
+ case :condition
128
+ when :foo
129
+ :foo
130
+ when :bar, :baz
131
+ :barbaz
132
+ else
133
+ nil
134
+ end
135
+ RUBY
136
+
137
+ # Mutations of when conditions
138
+ mutations << <<-RUBY
139
+ case :condition
140
+ when :srandom
141
+ :foo
142
+ when :bar, :baz
143
+ :barbaz
144
+ else
145
+ :else
146
+ end
147
+ RUBY
148
+ mutations << <<-RUBY
149
+ case :condition
150
+ when nil
151
+ :foo
152
+ when :bar, :baz
153
+ :barbaz
154
+ else
155
+ :else
156
+ end
157
+ RUBY
158
+ mutations << <<-RUBY
159
+ case :condition
160
+ when :foo
161
+ :foo
162
+ when :srandom, :baz
163
+ :barbaz
164
+ else
165
+ :else
166
+ end
167
+ RUBY
168
+ mutations << <<-RUBY
169
+ case :condition
170
+ when :foo
171
+ :foo
172
+ when nil, :baz
173
+ :barbaz
174
+ else
175
+ :else
176
+ end
177
+ RUBY
178
+ mutations << <<-RUBY
179
+ case :condition
180
+ when :foo
181
+ :foo
182
+ when :bar, nil
183
+ :barbaz
184
+ else
185
+ :else
186
+ end
187
+ RUBY
188
+ mutations << <<-RUBY
189
+ case :condition
190
+ when :foo
191
+ :foo
192
+ when :bar, :srandom
193
+ :barbaz
194
+ else
195
+ :else
196
+ end
197
+ RUBY
198
+ mutations << <<-RUBY
199
+ case :condition
200
+ when :foo
201
+ :foo
202
+ when :baz
203
+ :barbaz
204
+ else
205
+ :else
206
+ end
207
+ RUBY
208
+ mutations << <<-RUBY
209
+ case :condition
210
+ when :foo
211
+ :foo
212
+ when :bar
213
+ :barbaz
214
+ else
215
+ :else
216
+ end
217
+ RUBY
218
+ end
219
+
220
+ it_should_behave_like 'a mutator'
221
+ end
222
+
223
+ context 'with one when branch' do
224
+ let(:source) do
225
+ <<-RUBY
226
+ case :condition
227
+ when :foo
228
+ :foo
229
+ else
230
+ :else
231
+ end
232
+ RUBY
233
+ end
234
+
235
+ let(:mutations) do
236
+ mutations = []
237
+
238
+ # Presence of branches
239
+ mutations << <<-RUBY
240
+ case :condition
241
+ when :foo
242
+ :foo
243
+ end
244
+ RUBY
245
+
246
+ # Mutations of condition
247
+ mutations << <<-RUBY
248
+ case nil
249
+ when :foo
250
+ :foo
251
+ else
252
+ :else
253
+ end
254
+ RUBY
255
+ mutations << <<-RUBY
256
+ case :srandom
257
+ when :foo
258
+ :foo
259
+ else
260
+ :else
261
+ end
262
+ RUBY
263
+
264
+ # Mutations of branch bodies
265
+ mutations << <<-RUBY
266
+ case :condition
267
+ when :foo
268
+ nil
269
+ else
270
+ :else
271
+ end
272
+ RUBY
273
+ mutations << <<-RUBY
274
+ case :condition
275
+ when :foo
276
+ :srandom
277
+ else
278
+ :else
279
+ end
280
+ RUBY
281
+ mutations << <<-RUBY
282
+ case :condition
283
+ when :foo
284
+ :foo
285
+ else
286
+ :srandom
287
+ end
288
+ RUBY
289
+ mutations << <<-RUBY
290
+ case :condition
291
+ when :foo
292
+ :foo
293
+ else
294
+ nil
295
+ end
296
+ RUBY
297
+
298
+ # Mutations of when conditions
299
+ mutations << <<-RUBY
300
+ case :condition
301
+ when :srandom
302
+ :foo
303
+ else
304
+ :else
305
+ end
306
+ RUBY
307
+ mutations << <<-RUBY
308
+ case :condition
309
+ when nil
310
+ :foo
311
+ else
312
+ :else
313
+ end
314
+ RUBY
315
+ end
316
+
317
+ it_should_behave_like 'a mutator'
318
+ end
319
+ end
@@ -1,20 +1,22 @@
1
1
  require 'spec_helper'
2
2
 
3
- describe Mutant::Mutator, 'define' do
3
+ describe Mutant::Mutator, 'def' do
4
4
 
5
5
  context 'with no arguments' do
6
- let(:source) { 'def foo; self.bar; self.baz; end' }
6
+ let(:source) { 'def foo; true; false; end' }
7
7
 
8
8
  let(:mutations) do
9
9
  mutations = []
10
10
 
11
11
  # Mutation of each statement in block
12
- mutations << 'def foo; bar; self.baz; end'
13
- mutations << 'def foo; self.bar; baz; end'
12
+ mutations << 'def foo; true; true; end'
13
+ mutations << 'def foo; false; false; end'
14
+ mutations << 'def foo; true; nil; end'
15
+ mutations << 'def foo; nil; false; end'
14
16
 
15
17
  # Remove statement in block
16
- mutations << 'def foo; self.baz; end'
17
- mutations << 'def foo; self.bar; end'
18
+ mutations << 'def foo; true; end'
19
+ mutations << 'def foo; false; end'
18
20
 
19
21
  # Remove all statements
20
22
  mutations << 'def foo; end'
@@ -24,7 +26,7 @@ describe Mutant::Mutator, 'define' do
24
26
  end
25
27
 
26
28
  context 'with arguments' do
27
- let(:source) { 'def foo(a, b); nil; end' }
29
+ let(:source) { 'def foo(a, b); end' }
28
30
 
29
31
  before do
30
32
  Mutant::Random.stub(:hex_string => 'random')
@@ -34,29 +36,29 @@ describe Mutant::Mutator, 'define' do
34
36
  mutations = []
35
37
 
36
38
  # Deletion of each argument
37
- mutations << 'def foo(a); nil; end'
38
- mutations << 'def foo(b); nil; end'
39
+ mutations << 'def foo(a); end'
40
+ mutations << 'def foo(b); end'
39
41
 
40
42
  # Deletion of all arguments
41
- mutations << 'def foo; nil; end'
43
+ mutations << 'def foo; end'
42
44
 
43
45
  # Rename each argument
44
- mutations << 'def foo(srandom, b); nil; end'
45
- mutations << 'def foo(a, srandom); nil; end'
46
+ mutations << 'def foo(srandom, b); end'
47
+ mutations << 'def foo(a, srandom); end'
46
48
 
47
49
  # Mutation of body
48
- mutations << 'def foo(a, b); Object.new; end'
50
+ mutations << 'def foo(a, b); ::Object.new; end'
49
51
  end
50
52
 
51
53
  it_should_behave_like 'a mutator'
52
54
  end
53
55
 
54
- context 'with arguments beginning with an underscore' do
56
+ context 'with argument beginning in an underscore' do
55
57
  let(:source) { 'def foo(_unused); end' }
56
58
 
57
59
  let(:mutations) do
58
60
  mutations = []
59
- mutations << 'def foo(_unused); Object.new; end'
61
+ mutations << 'def foo(_unused); ::Object.new; end'
60
62
  mutations << 'def foo; end'
61
63
  end
62
64
 
@@ -64,38 +66,40 @@ describe Mutant::Mutator, 'define' do
64
66
  end
65
67
 
66
68
  context 'default argument' do
67
- let(:source) { 'def foo(a = "literal"); end' }
69
+ let(:source) { 'def foo(a = true); end' }
68
70
 
69
71
  before do
70
72
  Mutant::Random.stub(:hex_string => 'random')
71
73
  end
72
74
 
73
- let(:mutations) do
75
+ let(:mutations) do
74
76
  mutations = []
75
77
  mutations << 'def foo(a); end'
76
78
  mutations << 'def foo(); end'
77
- mutations << 'def foo(a = "random"); end'
79
+ mutations << 'def foo(a = false); end'
78
80
  mutations << 'def foo(a = nil); end'
79
- mutations << 'def foo(a = "literal"); Object.new; end'
80
- mutations << 'def foo(srandom = "literal"); nil; end'
81
+ mutations << 'def foo(srandom = true); end'
82
+ mutations << 'def foo(a = true); ::Object.new; end'
81
83
  end
82
84
 
83
85
  it_should_behave_like 'a mutator'
84
86
  end
85
87
 
86
88
  context 'define on singleton' do
87
- let(:source) { 'def self.foo; self.bar; self.baz; end' }
89
+ let(:source) { 'def self.foo; true; false; end' }
88
90
 
89
91
  let(:mutations) do
90
92
  mutations = []
91
93
 
92
94
  # Body presence mutations
93
- mutations << 'def self.foo; bar; self.baz; end'
94
- mutations << 'def self.foo; self.bar; baz; end'
95
-
95
+ mutations << 'def self.foo; false; false; end'
96
+ mutations << 'def self.foo; true; true; end'
97
+ mutations << 'def self.foo; true; nil; end'
98
+ mutations << 'def self.foo; nil; false; end'
99
+
96
100
  # Body presence mutations
97
- mutations << 'def self.foo; self.bar; end'
98
- mutations << 'def self.foo; self.baz; end'
101
+ mutations << 'def self.foo; true; end'
102
+ mutations << 'def self.foo; false; end'
99
103
 
100
104
  # Remove all statements
101
105
  mutations << 'def self.foo; end'
@@ -127,7 +131,7 @@ describe Mutant::Mutator, 'define' do
127
131
  mutations << 'def self.foo(a, srandom); nil; end'
128
132
 
129
133
  # Mutation of body
130
- mutations << 'def self.foo(a, b); Object.new; end'
134
+ mutations << 'def self.foo(a, b); ::Object.new; end'
131
135
  end
132
136
 
133
137
  it_should_behave_like 'a mutator'
@@ -0,0 +1,75 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mutant::Mutator, 'if' do
4
+
5
+ before do
6
+ Mutant::Random.stub(:hex_string => 'random')
7
+ end
8
+
9
+ context 'with if and else branches' do
10
+ let(:source) { 'if :condition; true; else false; end' }
11
+
12
+ let(:mutations) do
13
+ mutants = []
14
+
15
+ # mutations of condition
16
+ mutants << 'if :srandom; true; else false; end'
17
+ mutants << 'if !:condition; true; else false; end'
18
+ mutants << 'if nil; true; else false; end'
19
+ mutants << 'if true; true; else false; end'
20
+ mutants << 'if false; true; else false; end'
21
+
22
+ # Deleted else branch
23
+ mutants << 'if :condition; true end'
24
+
25
+ # Deleted if branch resuting in unless rendering
26
+ mutants << 'unless :condition; false; end'
27
+
28
+ # Deleted if branch with promoting else branch to if branch
29
+ mutants << 'if :condition; false end'
30
+
31
+ # mutations of if body
32
+ mutants << 'if :condition; false; else false; end'
33
+ mutants << 'if :condition; nil; else false; end'
34
+
35
+ # mutations of else body
36
+ mutants << 'if :condition; true; else true; end'
37
+ mutants << 'if :condition; true; else nil; end'
38
+ end
39
+
40
+ it_should_behave_like 'a mutator'
41
+ end
42
+
43
+ context 'if with one branch' do
44
+ let(:source) { 'if condition; true; end' }
45
+
46
+ let(:mutations) do
47
+ mutants = []
48
+ mutants << 'if !condition; true; end'
49
+ mutants << 'if condition; false; end'
50
+ mutants << 'if condition; nil; end'
51
+ mutants << 'if true; true; end'
52
+ mutants << 'if false; true; end'
53
+ end
54
+
55
+ it_should_behave_like 'a mutator'
56
+ end
57
+
58
+ context 'unless with one branch' do
59
+ let(:source) { 'unless :condition; true; end' }
60
+
61
+ let(:mutations) do
62
+ mutants = []
63
+ mutants << 'unless !:condition; true; end'
64
+ mutants << 'unless :srandom; true; end'
65
+ mutants << 'unless nil; true; end'
66
+ mutants << 'unless :condition; false; end'
67
+ mutants << 'unless :condition; nil; end'
68
+ mutants << 'unless true; true; end'
69
+ mutants << 'unless false; true; end'
70
+ mutants << 'if :condition; true; end'
71
+ end
72
+
73
+ it_should_behave_like 'a mutator'
74
+ end
75
+ end
@@ -6,7 +6,7 @@ describe Mutant::Mutator::Node::Literal, 'fixnum' do
6
6
  let(:source) { '10' }
7
7
 
8
8
  let(:mutations) do
9
- %W(nil 0 1 #{random_fixnum} -10)
9
+ %W(nil 0 1 #{random_fixnum} -10 9 11)
10
10
  end
11
11
 
12
12
  before do
@@ -20,8 +20,8 @@ describe Mutant::Mutator::Node::Literal, 'hash' do
20
20
  mutations << '{ true => true , false => nil }'
21
21
 
22
22
  # Remove each key once
23
- mutations << '{ true => true }'
24
- mutations << '{ false => false }'
23
+ mutations << '{ true => true }'
24
+ mutations << '{ false => false }'
25
25
 
26
26
  # Empty hash
27
27
  mutations << '{}'