mutant 0.0.1 → 0.1.0

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 (59) hide show
  1. data/.gitignore +5 -0
  2. data/.rvmrc +1 -1
  3. data/.travis.yml +6 -0
  4. data/Readme.md +13 -0
  5. data/exe/mutate +6 -0
  6. data/lib/mutant.rb +21 -0
  7. data/lib/mutant/extensions.rb +8 -0
  8. data/lib/mutant/formatter.rb +19 -0
  9. data/lib/mutant/implementation.rb +70 -0
  10. data/lib/mutant/literal.rb +134 -0
  11. data/lib/mutant/method.rb +31 -0
  12. data/lib/mutant/mutatee.rb +61 -0
  13. data/lib/mutant/mutation.rb +24 -0
  14. data/lib/mutant/mutator.rb +49 -0
  15. data/lib/mutant/node.rb +26 -0
  16. data/lib/mutant/random.rb +37 -0
  17. data/lib/mutant/reporter.rb +38 -0
  18. data/lib/mutant/runners/rspec.rb +26 -4
  19. data/lib/mutant/version.rb +1 -1
  20. data/mutant.gemspec +5 -3
  21. data/spec/functional/class_spec.rb +46 -0
  22. data/spec/functional/instance_method/array_spec.rb +53 -0
  23. data/spec/functional/instance_method/boolean_spec.rb +101 -0
  24. data/spec/functional/instance_method/call_spec.rb +161 -0
  25. data/spec/functional/instance_method/fixnum_spec.rb +53 -0
  26. data/spec/functional/instance_method/float_spec.rb +53 -0
  27. data/spec/functional/instance_method/hash_spec.rb +53 -0
  28. data/spec/functional/instance_method/if_spec.rb +57 -0
  29. data/spec/functional/instance_method/range_spec.rb +53 -0
  30. data/spec/functional/instance_method/regex_spec.rb +55 -0
  31. data/spec/functional/instance_method/string_spec.rb +53 -0
  32. data/spec/functional/instance_method/symbol_spec.rb +53 -0
  33. data/spec/functional/reporter/method_loaded_spec.rb +62 -0
  34. data/spec/functional/reporter/running_mutations_spec.rb +60 -0
  35. data/spec/functional/runners/rspec_spec.rb +26 -0
  36. data/spec/functional/singleton_method/array_spec.rb +53 -0
  37. data/spec/functional/singleton_method/boolean_spec.rb +101 -0
  38. data/spec/functional/singleton_method/call_spec.rb +161 -0
  39. data/spec/functional/singleton_method/fixnum_spec.rb +53 -0
  40. data/spec/functional/singleton_method/float_spec.rb +53 -0
  41. data/spec/functional/singleton_method/hash_spec.rb +53 -0
  42. data/spec/functional/singleton_method/if_spec.rb +57 -0
  43. data/spec/functional/singleton_method/range_spec.rb +53 -0
  44. data/spec/functional/singleton_method/regex_spec.rb +55 -0
  45. data/spec/functional/singleton_method/string_spec.rb +53 -0
  46. data/spec/functional/singleton_method/symbol_spec.rb +53 -0
  47. data/spec/mutant/extensions_spec.rb +13 -0
  48. data/spec/mutant/implementation_spec.rb +223 -0
  49. data/spec/mutant/literal_spec.rb +129 -0
  50. data/spec/mutant/mutatee_spec.rb +28 -0
  51. data/spec/mutant/node_spec.rb +41 -0
  52. data/spec/mutant/random_spec.rb +33 -0
  53. data/spec/mutant/reporter_spec.rb +17 -0
  54. data/spec/mutant_spec.rb +28 -0
  55. data/spec/spec_helper.rb +11 -3
  56. data/spec/support/example_group_helpers.rb +11 -0
  57. data/spec/support/example_helpers.rb +5 -0
  58. metadata +149 -81
  59. data/spec/functional/boolean_spec.rb +0 -49
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Reporter' do
4
+ describe 'running mutations' do
5
+ before do
6
+ write_file 'thing.rb', <<-CODE
7
+ class Thing
8
+ def alive?
9
+ a_string = 'foo'
10
+ a_symbol = :bar
11
+ a_range = 'a'..'c'
12
+ :symbol
13
+ true
14
+ end
15
+ end
16
+ CODE
17
+ write_file 'spec/thing_spec.rb', """
18
+ $: << '.'
19
+ require 'thing'
20
+
21
+ describe 'Thing#alive?' do
22
+ specify { Thing.new.should be_alive }
23
+ end
24
+ """
25
+
26
+ ENV['RANDOM_STRING'] = 'bar'
27
+ ENV['RANDOM_SYMBOL'] = 'foo'
28
+ ENV['RANDOM_RANGE_MIN'] = '1'
29
+ ENV['RANDOM_RANGE_MAX'] = '3'
30
+
31
+ mutate 'Thing#alive? spec/thing_spec.rb'
32
+ end
33
+
34
+ after do
35
+ ENV['RANDOM_STRING'] = nil
36
+ ENV['RANDOM_SYMBOL'] = nil
37
+ ENV['RANDOM_RANGE_MIN'] = nil
38
+ ENV['RANDOM_RANGE_MAX'] = nil
39
+ end
40
+
41
+ it 'displays the details of each mutation as they are run' do
42
+ all_output.should include <<-STR
43
+ Mutating line 3
44
+ a_string = "foo" >>> a_string = "bar"
45
+
46
+ Mutating line 4
47
+ a_symbol = :bar >>> a_symbol = :foo
48
+
49
+ Mutating line 5
50
+ a_range = "a".."c" >>> a_range = 1..3
51
+
52
+ Mutating line 6
53
+ :symbol >>> :foo
54
+
55
+ Mutating line 7
56
+ true >>> false
57
+ STR
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Runners' do
4
+ describe 'RSpec' do
5
+ describe 'a spec that fails before mutations' do
6
+ before do
7
+ write_file 'spec/thing_spec.rb', """
8
+ class Thing
9
+ def alive?; true end
10
+ end
11
+
12
+ describe 'Thing#alive?' do
13
+ specify { Thing.new.should_not be_alive }
14
+ end
15
+ """
16
+ mutate 'Thing#alive? spec/thing_spec.rb', false
17
+ end
18
+
19
+ it 'causes the run to abort' do
20
+ all_output.should include(
21
+ 'Initial run of specs failed... fix and run mutant again'
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Mutating arrays' do
4
+ context 'for a singleton method' do
5
+ context 'that contains [1,2,3]' do
6
+ before do
7
+ write_file 'thing.rb', """
8
+ class Thing
9
+ def self.to_a
10
+ [1,2,3]
11
+ end
12
+ end
13
+ """
14
+ end
15
+
16
+ context 'with an expectation that the array is [1,2,3]' do
17
+ before do
18
+ write_file 'spec/thing_spec.rb', """
19
+ $: << '.'
20
+ require 'thing'
21
+
22
+ describe 'Thing.to_a' do
23
+ specify { Thing.to_a.should eq([1,2,3]) }
24
+ end
25
+ """
26
+ mutate 'Thing.to_a spec/thing_spec.rb'
27
+ end
28
+
29
+ specify 'the mutation passes' do
30
+ all_output.should include('passed')
31
+ end
32
+ end
33
+
34
+ context 'with an expectation that the array responds to length' do
35
+ before do
36
+ write_file 'spec/thing_spec.rb', """
37
+ $: << '.'
38
+ require 'thing'
39
+
40
+ describe 'Thing.to_a' do
41
+ specify { Thing.to_a.should respond_to(:length) }
42
+ end
43
+ """
44
+ mutate 'Thing.to_a spec/thing_spec.rb'
45
+ end
46
+
47
+ specify 'the mutation fails' do
48
+ all_output.should include('failed')
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,101 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Mutating booleans' do
4
+ context 'for a singleton method' do
5
+ context 'that contains `true`' do
6
+ before do
7
+ write_file 'thing.rb', """
8
+ class Thing
9
+ def self.alive?
10
+ true
11
+ end
12
+ end
13
+ """
14
+ end
15
+
16
+ context 'with an expectation that the return value is true' do
17
+ before do
18
+ write_file 'spec/thing_spec.rb', """
19
+ $: << '.'
20
+ require 'thing'
21
+
22
+ describe 'Thing.alive?' do
23
+ specify { Thing.should be_alive }
24
+ end
25
+ """
26
+ mutate 'Thing.alive? spec/thing_spec.rb'
27
+ end
28
+
29
+ specify 'the mutation passes' do
30
+ all_output.should include('passed')
31
+ end
32
+ end
33
+
34
+ context 'with an expectation that the return value is true or false' do
35
+ before do
36
+ write_file 'spec/thing_spec.rb', """
37
+ $: << '.'
38
+ require 'thing'
39
+
40
+ describe 'Thing.alive?' do
41
+ specify { String(Thing.alive?).should =~ /true|false/ }
42
+ end
43
+ """
44
+ mutate 'Thing.alive? spec/thing_spec.rb'
45
+ end
46
+
47
+ specify 'the mutation fails' do
48
+ all_output.should include('failed')
49
+ end
50
+ end
51
+ end
52
+
53
+ context 'that contains `false`' do
54
+ before do
55
+ write_file 'thing.rb', """
56
+ class Thing
57
+ def self.alive?
58
+ false
59
+ end
60
+ end
61
+ """
62
+ end
63
+
64
+ context 'with an expectation that the return value is false' do
65
+ before do
66
+ write_file 'spec/thing_spec.rb', """
67
+ $: << '.'
68
+ require 'thing'
69
+
70
+ describe 'Thing.alive?' do
71
+ specify { Thing.should_not be_alive }
72
+ end
73
+ """
74
+ mutate 'Thing.alive? spec/thing_spec.rb'
75
+ end
76
+
77
+ specify 'the mutation passes' do
78
+ all_output.should include('passed')
79
+ end
80
+ end
81
+
82
+ context 'with an expectation that the return value is true or false' do
83
+ before do
84
+ write_file 'spec/thing_spec.rb', """
85
+ $: << '.'
86
+ require 'thing'
87
+
88
+ describe 'Thing.alive?' do
89
+ specify { String(Thing.alive?).should =~ /true|false/ }
90
+ end
91
+ """
92
+ mutate 'Thing.alive? spec/thing_spec.rb'
93
+ end
94
+
95
+ specify 'the mutation fails' do
96
+ all_output.should include('failed')
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,161 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Mutating calls' do
4
+ context 'for an instance method' do
5
+ context 'that contains a method call without arguments' do
6
+ before do
7
+ write_file 'life.rb', """
8
+ class Life
9
+ def self.helper
10
+ 42
11
+ end
12
+
13
+ def self.answer
14
+ helper
15
+ end
16
+ end
17
+ """
18
+ end
19
+
20
+ context 'with an expectation that the answer is 42' do
21
+ before do
22
+ write_file 'spec/life_spec.rb', """
23
+ $: << '.'
24
+ require 'life'
25
+
26
+ describe 'Life.answer' do
27
+ specify { Life.answer.should eq(42) }
28
+ end
29
+ """
30
+ run_simple '../../bin/mutate Life.answer spec/life_spec.rb'
31
+ end
32
+
33
+ specify 'the mutation passes' do
34
+ all_output.should include('passed')
35
+ end
36
+ end
37
+
38
+ context 'with an expectation that life respond to :answer' do
39
+ before do
40
+ write_file 'spec/life_spec.rb', """
41
+ $: << '.'
42
+ require 'life'
43
+
44
+ describe 'Life.answer' do
45
+ specify { Life.should respond_to(:answer) }
46
+ end
47
+ """
48
+ run_simple '../../bin/mutate Life.answer spec/life_spec.rb'
49
+ end
50
+
51
+ specify 'the mutation fails' do
52
+ all_output.should include('failed')
53
+ end
54
+ end
55
+ end
56
+
57
+ context 'that contains a method call with arguments' do
58
+ before do
59
+ write_file 'life.rb', """
60
+ class Life
61
+ def self.helper(num)
62
+ num + 2
63
+ end
64
+
65
+ def self.answer
66
+ helper(40)
67
+ end
68
+ end
69
+ """
70
+ end
71
+
72
+ context 'with an expectation that the answer is 42' do
73
+ before do
74
+ write_file 'spec/life_spec.rb', """
75
+ $: << '.'
76
+ require 'life'
77
+
78
+ describe 'Life.answer' do
79
+ specify { Life.answer.should eq(42) }
80
+ end
81
+ """
82
+ run_simple '../../bin/mutate Life.answer spec/life_spec.rb'
83
+ end
84
+
85
+ specify 'the mutation passes' do
86
+ all_output.should include('passed')
87
+ end
88
+ end
89
+
90
+ context 'with an expectation that life respond to :answer' do
91
+ before do
92
+ write_file 'spec/life_spec.rb', """
93
+ $: << '.'
94
+ require 'life'
95
+
96
+ describe 'Life.answer' do
97
+ specify { Life.should respond_to(:answer) }
98
+ end
99
+ """
100
+ run_simple '../../bin/mutate Life.answer spec/life_spec.rb'
101
+ end
102
+
103
+ specify 'the mutation fails' do
104
+ all_output.should include('failed')
105
+ end
106
+ end
107
+ end
108
+
109
+ context 'that contains a method call with a block' do
110
+ before do
111
+ write_file 'life.rb', """
112
+ class Life
113
+ def self.helper
114
+ yield
115
+ end
116
+
117
+ def self.answer
118
+ helper { 42 }
119
+ end
120
+ end
121
+ """
122
+ end
123
+
124
+ context 'with an expectation that the answer is 42' do
125
+ before do
126
+ write_file 'spec/life_spec.rb', """
127
+ $: << '.'
128
+ require 'life'
129
+
130
+ describe 'Life.answer' do
131
+ specify { Life.answer.should eq(42) }
132
+ end
133
+ """
134
+ run_simple '../../bin/mutate Life.answer spec/life_spec.rb'
135
+ end
136
+
137
+ specify 'the mutation passes' do
138
+ all_output.should include('passed')
139
+ end
140
+ end
141
+
142
+ context 'with an expectation that life respond to :answer' do
143
+ before do
144
+ write_file 'spec/life_spec.rb', """
145
+ $: << '.'
146
+ require 'life'
147
+
148
+ describe 'Life.answer' do
149
+ specify { Life.should respond_to(:answer) }
150
+ end
151
+ """
152
+ run_simple '../../bin/mutate Life.answer spec/life_spec.rb'
153
+ end
154
+
155
+ specify 'the mutation fails' do
156
+ all_output.should include('failed')
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'Mutating fixnums' do
4
+ context 'for a singleton method' do
5
+ context 'that contains 42' do
6
+ before do
7
+ write_file 'life.rb', """
8
+ class Life
9
+ def self.answer
10
+ 42
11
+ end
12
+ end
13
+ """
14
+ end
15
+
16
+ context 'with an expectation that the return value is 42' do
17
+ before do
18
+ write_file 'spec/life_spec.rb', """
19
+ $: << '.'
20
+ require 'life'
21
+
22
+ describe 'Life.answer' do
23
+ specify { Life.answer.should eq(42) }
24
+ end
25
+ """
26
+ mutate 'Life.answer spec/life_spec.rb'
27
+ end
28
+
29
+ specify 'the mutation passes' do
30
+ all_output.should include('passed')
31
+ end
32
+ end
33
+
34
+ context 'with an expectation that the return value is a Fixnum' do
35
+ before do
36
+ write_file 'spec/life_spec.rb', """
37
+ $: << '.'
38
+ require 'life'
39
+
40
+ describe 'Life.answer' do
41
+ specify { Life.answer.should be_a(Fixnum) }
42
+ end
43
+ """
44
+ mutate 'Life.answer spec/life_spec.rb'
45
+ end
46
+
47
+ specify 'the mutation fails' do
48
+ all_output.should include('failed')
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end