mutant 0.9.9 → 0.9.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (252) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mutant.rb +2 -4
  3. data/lib/mutant/bootstrap.rb +14 -1
  4. data/lib/mutant/cli.rb +6 -0
  5. data/lib/mutant/isolation.rb +1 -1
  6. data/lib/mutant/isolation/fork.rb +2 -2
  7. data/lib/mutant/isolation/none.rb +1 -1
  8. data/lib/mutant/matcher/config.rb +2 -0
  9. data/lib/mutant/meta/example.rb +16 -4
  10. data/lib/mutant/meta/example/dsl.rb +33 -16
  11. data/lib/mutant/meta/example/verification.rb +70 -28
  12. data/lib/mutant/minitest/coverage.rb +53 -0
  13. data/lib/mutant/mutator/node.rb +2 -2
  14. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  15. data/lib/mutant/mutator/node/{dstr.rb → dynamic_literal.rb} +7 -5
  16. data/lib/mutant/mutator/node/index.rb +4 -4
  17. data/lib/mutant/mutator/node/literal/range.rb +4 -1
  18. data/lib/mutant/mutator/node/noop.rb +1 -1
  19. data/lib/mutant/mutator/node/op_asgn.rb +15 -1
  20. data/lib/mutant/mutator/node/send.rb +25 -1
  21. data/lib/mutant/mutator/node/send/attribute_assignment.rb +1 -0
  22. data/lib/mutant/reporter/cli/printer.rb +2 -2
  23. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -3
  24. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -1
  25. data/lib/mutant/subject/method/instance.rb +41 -2
  26. data/lib/mutant/version.rb +1 -1
  27. metadata +59 -347
  28. data/.github/workflows/ci.yml +0 -121
  29. data/.gitignore +0 -38
  30. data/.rspec +0 -5
  31. data/.rubocop.yml +0 -7
  32. data/Changelog.md +0 -81
  33. data/Gemfile +0 -7
  34. data/Gemfile.lock +0 -167
  35. data/Gemfile.shared +0 -10
  36. data/README.md +0 -178
  37. data/Rakefile +0 -5
  38. data/config/devtools.yml +0 -2
  39. data/config/reek.yml +0 -139
  40. data/config/rubocop.yml +0 -205
  41. data/config/yardstick.yml +0 -2
  42. data/docs/commercial-support.md +0 -14
  43. data/docs/concurrency.md +0 -39
  44. data/docs/incremental.md +0 -76
  45. data/docs/known-problems.md +0 -30
  46. data/docs/limitations.md +0 -50
  47. data/docs/mutant-minitest.md +0 -149
  48. data/docs/mutant-rspec.md +0 -130
  49. data/docs/nomenclature.md +0 -82
  50. data/docs/reading-reports.md +0 -74
  51. data/lib/mutant/color.rb +0 -40
  52. data/lib/mutant/diff.rb +0 -97
  53. data/lib/mutant/mutator/node/dsym.rb +0 -22
  54. data/meta/and.rb +0 -13
  55. data/meta/and_asgn.rb +0 -14
  56. data/meta/array.rb +0 -27
  57. data/meta/begin.rb +0 -20
  58. data/meta/block.rb +0 -199
  59. data/meta/block_pass.rb +0 -8
  60. data/meta/blockarg.rb +0 -10
  61. data/meta/break.rb +0 -9
  62. data/meta/case.rb +0 -217
  63. data/meta/casgn.rb +0 -25
  64. data/meta/cbase.rb +0 -8
  65. data/meta/class.rb +0 -12
  66. data/meta/const.rb +0 -17
  67. data/meta/csend.rb +0 -10
  68. data/meta/cvar.rb +0 -7
  69. data/meta/cvasgn.rb +0 -9
  70. data/meta/date.rb +0 -59
  71. data/meta/def.rb +0 -196
  72. data/meta/defined.rb +0 -9
  73. data/meta/dstr.rb +0 -13
  74. data/meta/dsym.rb +0 -14
  75. data/meta/ensure.rb +0 -8
  76. data/meta/false.rb +0 -7
  77. data/meta/file.rb +0 -5
  78. data/meta/float.rb +0 -37
  79. data/meta/gvar.rb +0 -7
  80. data/meta/gvasgn.rb +0 -9
  81. data/meta/hash.rb +0 -20
  82. data/meta/if.rb +0 -72
  83. data/meta/index.rb +0 -133
  84. data/meta/indexasgn.rb +0 -31
  85. data/meta/int.rb +0 -18
  86. data/meta/ivar.rb +0 -8
  87. data/meta/ivasgn.rb +0 -22
  88. data/meta/kwarg.rb +0 -10
  89. data/meta/kwbegin.rb +0 -8
  90. data/meta/kwoptarg.rb +0 -13
  91. data/meta/lambda.rb +0 -23
  92. data/meta/line.rb +0 -5
  93. data/meta/lvar.rb +0 -16
  94. data/meta/lvasgn.rb +0 -24
  95. data/meta/masgn.rb +0 -7
  96. data/meta/match_current_line.rb +0 -14
  97. data/meta/next.rb +0 -10
  98. data/meta/nil.rb +0 -5
  99. data/meta/nthref.rb +0 -14
  100. data/meta/op_assgn.rb +0 -17
  101. data/meta/or.rb +0 -13
  102. data/meta/or_asgn.rb +0 -50
  103. data/meta/range.rb +0 -39
  104. data/meta/redo.rb +0 -5
  105. data/meta/regexp.rb +0 -80
  106. data/meta/regopt.rb +0 -10
  107. data/meta/rescue.rb +0 -84
  108. data/meta/return.rb +0 -16
  109. data/meta/sclass.rb +0 -12
  110. data/meta/self.rb +0 -7
  111. data/meta/send.rb +0 -600
  112. data/meta/str.rb +0 -7
  113. data/meta/super.rb +0 -27
  114. data/meta/sym.rb +0 -8
  115. data/meta/true.rb +0 -7
  116. data/meta/until.rb +0 -16
  117. data/meta/while.rb +0 -24
  118. data/meta/yield.rb +0 -9
  119. data/mutant-minitest.gemspec +0 -22
  120. data/mutant-rspec.gemspec +0 -22
  121. data/mutant.gemspec +0 -41
  122. data/mutant.sh +0 -12
  123. data/mutant.yml +0 -6
  124. data/spec/integration/mutant/corpus_spec.rb +0 -15
  125. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  126. data/spec/integration/mutant/minitest_spec.rb +0 -11
  127. data/spec/integration/mutant/null_spec.rb +0 -16
  128. data/spec/integration/mutant/rspec_spec.rb +0 -15
  129. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  130. data/spec/integrations.yml +0 -63
  131. data/spec/shared/base_behavior.rb +0 -45
  132. data/spec/shared/framework_integration_behavior.rb +0 -70
  133. data/spec/shared/method_matcher_behavior.rb +0 -47
  134. data/spec/spec_helper.rb +0 -75
  135. data/spec/support/corpus.rb +0 -318
  136. data/spec/support/file_system.rb +0 -62
  137. data/spec/support/ice_nine_config.rb +0 -10
  138. data/spec/support/ruby_vm.rb +0 -84
  139. data/spec/support/shared_context.rb +0 -169
  140. data/spec/support/test_app.rb +0 -7
  141. data/spec/support/warnings.yml +0 -6
  142. data/spec/support/xspec.rb +0 -183
  143. data/spec/unit/mutant/ast/find_metaclass_containing_spec.rb +0 -64
  144. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  145. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  146. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  147. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  148. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  149. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  150. data/spec/unit/mutant/ast_spec.rb +0 -57
  151. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  152. data/spec/unit/mutant/cli_spec.rb +0 -305
  153. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  154. data/spec/unit/mutant/config_spec.rb +0 -126
  155. data/spec/unit/mutant/context_spec.rb +0 -111
  156. data/spec/unit/mutant/diff_spec.rb +0 -189
  157. data/spec/unit/mutant/env_spec.rb +0 -229
  158. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  159. data/spec/unit/mutant/expression/methods_spec.rb +0 -66
  160. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  161. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  162. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  163. data/spec/unit/mutant/expression_spec.rb +0 -45
  164. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  165. data/spec/unit/mutant/integration_spec.rb +0 -150
  166. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  167. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  168. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  169. data/spec/unit/mutant/license_spec.rb +0 -305
  170. data/spec/unit/mutant/loader_spec.rb +0 -79
  171. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  172. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  173. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  174. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  175. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  176. data/spec/unit/mutant/matcher/method/metaclass_spec.rb +0 -108
  177. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  178. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  179. data/spec/unit/mutant/matcher/methods/metaclass_spec.rb +0 -62
  180. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  181. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -39
  182. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  183. data/spec/unit/mutant/matcher/scope_spec.rb +0 -45
  184. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  185. data/spec/unit/mutant/matcher_spec.rb +0 -102
  186. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  187. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  188. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  189. data/spec/unit/mutant/mutation_spec.rb +0 -140
  190. data/spec/unit/mutant/mutator/node_spec.rb +0 -47
  191. data/spec/unit/mutant/mutator_spec.rb +0 -21
  192. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  193. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  194. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  195. data/spec/unit/mutant/parallel_spec.rb +0 -115
  196. data/spec/unit/mutant/parser_spec.rb +0 -26
  197. data/spec/unit/mutant/range_spec.rb +0 -141
  198. data/spec/unit/mutant/registry_spec.rb +0 -74
  199. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  200. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  201. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  202. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  203. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  204. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  205. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  206. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  207. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  208. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  209. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  210. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  211. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  212. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  213. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  214. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  215. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  216. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  217. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  218. data/spec/unit/mutant/result/env_spec.rb +0 -161
  219. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  220. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  221. data/spec/unit/mutant/result/test_spec.rb +0 -14
  222. data/spec/unit/mutant/result_spec.rb +0 -33
  223. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  224. data/spec/unit/mutant/runner_spec.rb +0 -121
  225. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  226. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  227. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  228. data/spec/unit/mutant/subject/method/metaclass_spec.rb +0 -63
  229. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  230. data/spec/unit/mutant/subject_spec.rb +0 -93
  231. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  232. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  233. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  234. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  235. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  236. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  237. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  238. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  239. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  240. data/spec/unit/mutant/util/one_spec.rb +0 -22
  241. data/spec/unit/mutant/warnings_spec.rb +0 -89
  242. data/spec/unit/mutant/world_spec.rb +0 -63
  243. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  244. data/test_app/.rspec +0 -1
  245. data/test_app/Gemfile.minitest +0 -4
  246. data/test_app/Gemfile.rspec3.8 +0 -7
  247. data/test_app/lib/test_app.rb +0 -110
  248. data/test_app/lib/test_app/literal.rb +0 -35
  249. data/test_app/lib/test_app/metaclasses.rb +0 -108
  250. data/test_app/spec/spec_helper.rb +0 -9
  251. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  252. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -1,111 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Context do
4
- describe '.wrap' do
5
- subject { described_class.wrap(scope, node) }
6
-
7
- let(:node) { s(:str, 'test') }
8
-
9
- context 'with Module as scope' do
10
- let(:scope) { Mutant }
11
-
12
- let(:expected) do
13
- s(:module,
14
- s(:const, nil, :Mutant),
15
- s(:str, 'test'))
16
- end
17
-
18
- it { should eql(expected) }
19
- end
20
-
21
- context 'with Class as scope' do
22
- let(:scope) { Mutant::Context }
23
-
24
- let(:expected) do
25
- s(:class,
26
- s(:const, nil, :Context),
27
- nil,
28
- s(:str, 'test'))
29
- end
30
-
31
- it { should eql(expected) }
32
- end
33
- end
34
-
35
- let(:object) { described_class.new(scope, source_path) }
36
- let(:source_path) { instance_double(Pathname) }
37
- let(:scope) { TestApp::Literal }
38
-
39
- describe '#identification' do
40
- subject { object.identification }
41
-
42
- it { should eql(scope.name) }
43
- end
44
-
45
- describe '#root' do
46
- subject { object.root(node) }
47
-
48
- let(:node) { s(:sym, :node) }
49
-
50
- let(:expected_source) do
51
- generate(parse(<<-RUBY))
52
- module TestApp
53
- class Literal
54
- :node
55
- end
56
- end
57
- RUBY
58
- end
59
-
60
- let(:generated_source) do
61
- Unparser.unparse(subject)
62
- end
63
-
64
- it 'should create correct source' do
65
- expect(generated_source).to eql(expected_source)
66
- end
67
- end
68
-
69
- describe '#unqualified_name' do
70
- subject { object.unqualified_name }
71
-
72
- context 'with top level constant name' do
73
- let(:scope) { TestApp }
74
-
75
- it 'should return the unqualified name' do
76
- should eql('TestApp')
77
- end
78
-
79
- it_should_behave_like 'an idempotent method'
80
- end
81
-
82
- context 'with scoped constant name' do
83
- it 'should return the unqualified name' do
84
- should eql('Literal')
85
- end
86
-
87
- it_should_behave_like 'an idempotent method'
88
- end
89
- end
90
-
91
- describe '#match_expressions' do
92
- subject { object.match_expressions }
93
-
94
- context 'on toplevel scope' do
95
- let(:scope) { TestApp }
96
-
97
- it { should eql([parse_expression('TestApp*')]) }
98
- end
99
-
100
- context 'on nested scope' do
101
- specify do
102
- should eql(
103
- [
104
- parse_expression('TestApp::Literal*'),
105
- parse_expression('TestApp*')
106
- ]
107
- )
108
- end
109
- end
110
- end
111
- end
@@ -1,189 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Diff do
4
- let(:object) { described_class }
5
-
6
- describe '.build' do
7
-
8
- subject { object.build(old_string, new_string) }
9
-
10
- let(:old_string) { "foo\nbar" }
11
- let(:new_string) { "bar\nbaz" }
12
-
13
- it { should eql(Mutant::Diff.new(%w[foo bar], %w[bar baz])) }
14
-
15
- end
16
-
17
- describe '#colorized_diff' do
18
- let(:object) { described_class.new(old, new) }
19
-
20
- subject { object.colorized_diff }
21
-
22
- context 'when there is a diff at begin of hunk' do
23
- let(:old) { %w[foo bar] }
24
- let(:new) { %w[baz bar] }
25
-
26
- let(:expectation) do
27
- [
28
- "@@ -1,3 +1,3 @@\n",
29
- Mutant::Color::RED.format("-foo\n"),
30
- Mutant::Color::GREEN.format("+baz\n"),
31
- " bar\n"
32
- ].join
33
- end
34
-
35
- it { should eql(expectation) }
36
-
37
- it_should_behave_like 'an idempotent method'
38
- end
39
-
40
- context 'when there is no diff' do
41
- let(:old) { '' }
42
- let(:new) { '' }
43
-
44
- it { should be(nil) }
45
-
46
- it_should_behave_like 'an idempotent method'
47
- end
48
- end
49
-
50
- describe '#diff' do
51
- let(:object) { described_class.new(old, new) }
52
-
53
- subject { object.diff }
54
-
55
- context 'when there is a diff at begin and end' do
56
- let(:old) { %w[foo bar foo] }
57
- let(:new) { %w[baz bar baz] }
58
-
59
- let(:expectation) do
60
- <<~STR
61
- @@ -1,4 +1,4 @@
62
- -foo
63
- +baz
64
- bar
65
- -foo
66
- +baz
67
- STR
68
- end
69
-
70
- it { should eql(expectation) }
71
-
72
- it_should_behave_like 'an idempotent method'
73
- end
74
-
75
- context 'when there is a diff at begin of hunk' do
76
- let(:old) { %w[foo bar] }
77
- let(:new) { %w[baz bar] }
78
-
79
- let(:expectation) do
80
- <<~STR
81
- @@ -1,3 +1,3 @@
82
- -foo
83
- +baz
84
- bar
85
- STR
86
- end
87
-
88
- it { should eql(expectation) }
89
-
90
- it_should_behave_like 'an idempotent method'
91
- end
92
-
93
- context 'when there is a diff NOT at begin of hunk' do
94
- let(:old) { %w[foo bar] }
95
- let(:new) { %w[foo baz bar] }
96
-
97
- let(:expectation) do
98
- <<~STR
99
- @@ -1,3 +1,4 @@
100
- foo
101
- +baz
102
- bar
103
- STR
104
- end
105
-
106
- it { should eql(expectation) }
107
-
108
- it_should_behave_like 'an idempotent method'
109
- end
110
-
111
- context 'when the diff has a long context at begin' do
112
- let(:old) { %w[foo bar baz boz a b c] }
113
- let(:new) { %w[foo bar baz boz a b c other] }
114
-
115
- let(:expectation) do
116
- <<~STR
117
- @@ -1,8 +1,9 @@
118
- foo
119
- bar
120
- baz
121
- boz
122
- a
123
- b
124
- c
125
- +other
126
- STR
127
- end
128
-
129
- it { should eql(expectation) }
130
-
131
- it_should_behave_like 'an idempotent method'
132
- end
133
-
134
- context 'when the diff has a long context at end, deleting' do
135
- let(:old) { %w[other foo bar baz boz a b c] }
136
- let(:new) { %w[foo bar baz boz a b c] }
137
-
138
- let(:expectation) do
139
- <<~STR
140
- @@ -1,9 +1,8 @@
141
- -other
142
- foo
143
- bar
144
- baz
145
- boz
146
- a
147
- b
148
- c
149
- STR
150
- end
151
-
152
- it { should eql(expectation) }
153
-
154
- it_should_behave_like 'an idempotent method'
155
- end
156
-
157
- context 'when the diff has a long context at end, inserting' do
158
- let(:old) { %w[foo bar baz boz a b c] }
159
- let(:new) { %w[other foo bar baz boz a b c] }
160
-
161
- let(:expectation) do
162
- <<~STR
163
- @@ -1,8 +1,9 @@
164
- +other
165
- foo
166
- bar
167
- baz
168
- boz
169
- a
170
- b
171
- c
172
- STR
173
- end
174
-
175
- it { should eql(expectation) }
176
-
177
- it_should_behave_like 'an idempotent method'
178
- end
179
-
180
- context 'when there is no diff' do
181
- let(:old) { '' }
182
- let(:new) { '' }
183
-
184
- it { should be(nil) }
185
-
186
- it_should_behave_like 'an idempotent method'
187
- end
188
- end
189
- end
@@ -1,229 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Env do
4
- subject do
5
- described_class.new(
6
- config: config,
7
- integration: integration,
8
- matchable_scopes: [],
9
- mutations: [],
10
- selector: selector,
11
- subjects: subjects,
12
- parser: Mutant::Parser.new,
13
- world: world
14
- )
15
- end
16
-
17
- let(:integration_class) { Mutant::Integration::Null }
18
- let(:isolation) { Mutant::Isolation::None.new }
19
- let(:kernel) { instance_double(Object, 'kernel') }
20
- let(:reporter) { instance_double(Mutant::Reporter) }
21
- let(:selector) { instance_double(Mutant::Selector) }
22
- let(:subject_a) { instance_double(Mutant::Subject, :a) }
23
- let(:subject_b) { instance_double(Mutant::Subject, :b) }
24
- let(:subjects) { [subject_a, subject_b] }
25
- let(:test_a) { instance_double(Mutant::Test, :a) }
26
- let(:test_b) { instance_double(Mutant::Test, :b) }
27
- let(:test_c) { instance_double(Mutant::Test, :c) }
28
-
29
- let(:integration) do
30
- instance_double(Mutant::Integration, all_tests: [test_a, test_b, test_c])
31
- end
32
-
33
- let(:mutation) do
34
- instance_double(
35
- Mutant::Mutation,
36
- subject: subject_a
37
- )
38
- end
39
-
40
- let(:config) do
41
- instance_double(
42
- Mutant::Config,
43
- integration: integration_class,
44
- isolation: isolation,
45
- reporter: reporter
46
- )
47
- end
48
-
49
- let(:world) do
50
- instance_double(
51
- Mutant::World,
52
- kernel: kernel
53
- )
54
- end
55
-
56
- before do
57
- allow(selector).to receive(:call)
58
- .with(subject_a)
59
- .and_return([test_a, test_b])
60
-
61
- allow(selector).to receive(:call)
62
- .with(subject_b)
63
- .and_return([test_b, test_c])
64
-
65
- allow(Mutant::Timer).to receive(:now).and_return(2.0, 3.0)
66
- end
67
-
68
- describe '#kill' do
69
- def apply
70
- subject.kill(mutation)
71
- end
72
-
73
- before do
74
- allow(isolation).to receive(:call) do |&block|
75
- Mutant::Isolation::Result::Success.new(block.call)
76
- end
77
-
78
- allow(mutation).to receive_messages(insert: loader_result)
79
- end
80
-
81
- shared_examples 'mutation kill' do
82
- it 'returns expected result' do
83
- expect(apply).to eql(
84
- Mutant::Result::Mutation.new(
85
- isolation_result: isolation_result,
86
- mutation: mutation,
87
- runtime: 1.0
88
- )
89
- )
90
- end
91
- end
92
-
93
- context 'when loader is successful' do
94
- let(:loader_result) { Mutant::Loader::Result::Success.instance }
95
- let(:test_result) { instance_double(Mutant::Result::Test) }
96
-
97
- let(:isolation_result) do
98
- Mutant::Isolation::Result::Success.new(test_result)
99
- end
100
-
101
- before do
102
- allow(integration).to receive_messages(call: test_result)
103
- end
104
-
105
- it 'performs IO in expected sequence' do
106
- apply
107
-
108
- expect(isolation).to have_received(:call).ordered
109
- expect(mutation).to have_received(:insert).ordered.with(kernel)
110
- expect(integration).to have_received(:call).ordered.with([test_a, test_b])
111
- end
112
-
113
- include_examples 'mutation kill'
114
- end
115
-
116
- context 'when loader reports void value' do
117
- let(:loader_result) { Mutant::Loader::Result::VoidValue.instance }
118
-
119
- let(:isolation_result) do
120
- Mutant::Isolation::Result::Success.new(Mutant::Result::Test::VoidValue.instance)
121
- end
122
-
123
- it 'performs IO in expected sequence' do
124
- apply
125
-
126
- expect(isolation).to have_received(:call).ordered
127
- expect(mutation).to have_received(:insert).ordered.with(kernel)
128
- end
129
-
130
- include_examples 'mutation kill'
131
- end
132
- end
133
-
134
- describe '#selections' do
135
- def apply
136
- subject.selections
137
- end
138
-
139
- it 'returns expected selections' do
140
- expect(apply).to eql(
141
- subject_a => [test_a, test_b],
142
- subject_b => [test_b, test_c]
143
- )
144
- end
145
- end
146
-
147
- describe '#warn' do
148
- def apply
149
- subject.warn(message)
150
- end
151
-
152
- before do
153
- allow(reporter).to receive_messages(warn: reporter)
154
- end
155
-
156
- let(:message) { 'test-warning' }
157
-
158
- it 'warns via the reporter' do
159
- apply
160
-
161
- expect(reporter).to have_received(:warn).with(message)
162
- end
163
-
164
- it 'returns self' do
165
- expect(apply).to be(subject)
166
- end
167
- end
168
-
169
- describe '#amount_mutations' do
170
- def apply
171
- subject.amount_mutations
172
- end
173
-
174
- it 'returns expected value' do
175
- expect(apply).to be(0)
176
- end
177
- end
178
-
179
- describe '#amount_total_tests' do
180
- def apply
181
- subject.amount_total_tests
182
- end
183
-
184
- it 'returns expected value' do
185
- expect(apply).to be(3)
186
- end
187
- end
188
-
189
- describe '#test_subject_ratio' do
190
- def apply
191
- subject.test_subject_ratio
192
- end
193
-
194
- context 'on empty subjects' do
195
- let(:subjects) { [] }
196
-
197
- it 'returns expected value' do
198
- expect(apply).to eql(Rational(0))
199
- end
200
- end
201
-
202
- context 'on non empty subjects' do
203
- it 'returns expected value' do
204
- expect(apply).to eql(Rational(3, 2))
205
- end
206
- end
207
- end
208
-
209
- describe '.empty' do
210
- def apply
211
- described_class.empty(world, config)
212
- end
213
-
214
- it 'returns empty env' do
215
- expect(apply).to eql(
216
- described_class.new(
217
- config: config,
218
- integration: Mutant::Integration::Null.new(config),
219
- matchable_scopes: Mutant::EMPTY_ARRAY,
220
- mutations: Mutant::EMPTY_ARRAY,
221
- parser: Mutant::Parser.new,
222
- selector: Mutant::Selector::Null.new,
223
- subjects: Mutant::EMPTY_ARRAY,
224
- world: world
225
- )
226
- )
227
- end
228
- end
229
- end