mutant 0.9.9 → 0.9.14

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 (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,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Reporter::Sequence do
4
- let(:object) { described_class.new([reporter_a, reporter_b]) }
5
- let(:value) { instance_double(Object) }
6
- let(:reporter_a) { instance_double(Mutant::Reporter, delay: 1.0) }
7
- let(:reporter_b) { instance_double(Mutant::Reporter, delay: 2.0) }
8
-
9
- %i[report progress warn start].each do |name|
10
- describe "##{name}" do
11
- subject { object.public_send(name, value) }
12
-
13
- before do
14
- [reporter_a, reporter_b].each do |receiver|
15
- expect(receiver).to receive(name)
16
- .ordered
17
- .with(value)
18
- .and_return(receiver)
19
- end
20
- end
21
-
22
- it_should_behave_like 'a command method'
23
- end
24
- end
25
-
26
- describe '#delay' do
27
- it 'returns the lowest value' do
28
- expect(object.delay).to eql(1.0)
29
- end
30
- end
31
- end
@@ -1,180 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Mutant::Repository::Diff::Ranges do
4
- describe '.parse' do
5
- def apply
6
- described_class.parse(diff)
7
- end
8
-
9
- let(:diff) do
10
- Tempfile.open('old') do |old_file|
11
- old_file.write(old)
12
- old_file.flush
13
- Tempfile.open('new') do |new_file|
14
- new_file.write(new)
15
- new_file.flush
16
- # rubocop:disable Lint/RedundantSplatExpansion
17
- stdout, status = Open3.capture2(
18
- *%W[
19
- git
20
- diff
21
- --no-index
22
- --unified=0
23
- --
24
- #{old_file.path}
25
- #{new_file.path}
26
- ]
27
- )
28
- # rubocop:enable Lint/RedundantSplatExpansion
29
-
30
- fail unless [0, 256].include?(status.to_i)
31
-
32
- stdout
33
- end
34
- end
35
- end
36
-
37
- context 'on empty diff' do
38
- let(:old) { '' }
39
- let(:new) { '' }
40
-
41
- it 'returns emtpy set' do
42
- expect(apply).to eql(Set.new)
43
- end
44
- end
45
-
46
- context 'on empty old' do
47
- let(:old) { '' }
48
-
49
- context 'adding a single line' do
50
- let(:new) do
51
- <<~'STR'
52
- a
53
- STR
54
- end
55
-
56
- it 'returns expected set' do
57
- expect(apply).to eql([1..1].to_set)
58
- end
59
- end
60
-
61
- context 'adding a multiple lines' do
62
- let(:old) { '' }
63
-
64
- let(:new) do
65
- <<~'STR'
66
- a
67
- b
68
- STR
69
- end
70
-
71
- it 'returns expected set' do
72
- expect(apply).to eql([1..2].to_set)
73
- end
74
- end
75
- end
76
-
77
- context 'on empty new' do
78
- let(:new) { '' }
79
-
80
- context 'removing a single line' do
81
- let(:old) do
82
- <<~'STR'
83
- a
84
- STR
85
- end
86
-
87
- it 'returns expected set' do
88
- expect(apply).to eql([1..1].to_set)
89
- end
90
- end
91
-
92
- context 'removing a multiple lines' do
93
- let(:old) do
94
- <<~'STR'
95
- a
96
- b
97
- STR
98
- end
99
-
100
- it 'returns expected set' do
101
- expect(apply).to eql([1..2].to_set)
102
- end
103
- end
104
- end
105
-
106
- context 'single line modification' do
107
- let(:old) do
108
- <<~'STR'
109
- a
110
- b
111
- c
112
- a
113
- STR
114
- end
115
-
116
- let(:new) do
117
- <<~'STR'
118
- a
119
- b
120
- b
121
- a
122
- STR
123
- end
124
-
125
- it 'returns expected set' do
126
- expect(apply).to eql([3..3].to_set)
127
- end
128
- end
129
-
130
- context 'nonempty old and new' do
131
- context 'single line addition' do
132
- let(:old) do
133
- <<~'STR'
134
- a
135
- b
136
- a
137
- STR
138
- end
139
-
140
- let(:new) do
141
- <<~'STR'
142
- a
143
- b
144
- b
145
- a
146
- STR
147
- end
148
-
149
- it 'returns expected set' do
150
- expect(apply).to eql([3..3].to_set)
151
- end
152
- end
153
- context 'multi line modification' do
154
- let(:old) do
155
- <<~'STR'
156
- a
157
- b
158
- c
159
- d
160
- a
161
- STR
162
- end
163
-
164
- let(:new) do
165
- <<~'STR'
166
- a
167
- b
168
- b
169
- b
170
- a
171
- STR
172
- end
173
-
174
- it 'returns expected set' do
175
- expect(apply).to eql([3..4].to_set)
176
- end
177
- end
178
- end
179
- end
180
- end
@@ -1,122 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe Mutant::Repository::Diff do
4
- describe '#touches?' do
5
- def apply
6
- subject.touches?(path, line_range)
7
- end
8
-
9
- subject { described_class.new(world: world, to: 'to_rev') }
10
-
11
- let(:pathname) { class_double(Pathname, pwd: pwd) }
12
- let(:open3) { class_double(Open3) }
13
- let(:kernel) { class_double(Kernel) }
14
- let(:pwd) { Pathname.new('/foo') }
15
- let(:path) { Pathname.new('/foo/bar.rb') }
16
- let(:line_range) { 4..5 }
17
-
18
- let(:world) do
19
- instance_double(
20
- Mutant::World,
21
- kernel: kernel,
22
- pathname: pathname
23
- )
24
- end
25
-
26
- let(:allowed_paths) do
27
- %w[bar.rb baz.rb].map do |path|
28
- [path, Pathname.new(path)]
29
- end.to_h
30
- end
31
-
32
- let(:file_diff_expectations) { [] }
33
-
34
- let(:raw_expectations) do
35
- [
36
- {
37
- receiver: world,
38
- selector: :capture_stdout,
39
- arguments: [%w[git diff-index to_rev]],
40
- reaction: { return: Mutant::Either::Right.new(index_stdout) }
41
- },
42
- *file_diff_expectations
43
- ]
44
- end
45
-
46
- before do
47
- allow(pathname).to receive(:new, &allowed_paths.method(:fetch))
48
- end
49
-
50
- context 'when file is not touched in the diff' do
51
- let(:index_stdout) { '' }
52
-
53
- it 'returns false' do
54
- verify_events { expect(apply).to be(false) }
55
- end
56
- end
57
-
58
- context 'when a diff-index line is invalid' do
59
- let(:index_stdout) { 'invalid-line' }
60
-
61
- it 'raises error' do
62
- expect { verify_events { apply } }
63
- .to raise_error(
64
- described_class::Error,
65
- 'Invalid git diff-index line: invalid-line'
66
- )
67
- end
68
- end
69
-
70
- context 'when file is touched in the diff' do
71
- let(:index_stdout) do
72
- <<~STR
73
- :000000 000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 M\tbar.rb
74
- :000000 000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 M\tbaz.rb
75
- STR
76
- end
77
-
78
- let(:file_diff_expectations) do
79
- [
80
- {
81
- receiver: world,
82
- selector: :capture_stdout,
83
- arguments: [%w[git diff --unified=0 to_rev -- /foo/bar.rb]],
84
- reaction: { return: Mutant::Either::Right.new(diff_stdout) }
85
- }
86
- ]
87
- end
88
-
89
- context 'and diff touches the line range' do
90
- let(:diff_stdout) do
91
- <<~'DIFF'
92
- --- bar.rb
93
- +++ bar.rb
94
- @@ -4 +4 @@ header
95
- -a
96
- +b
97
- DIFF
98
- end
99
-
100
- it 'returns true' do
101
- verify_events { expect(apply).to be(true) }
102
- end
103
- end
104
-
105
- context 'and diff does not touch the line range' do
106
- let(:diff_stdout) do
107
- <<~'DIFF'
108
- --- bar.rb
109
- +++ bar.rb
110
- @@ -3 +3 @@ header
111
- -a
112
- +b
113
- DIFF
114
- end
115
-
116
- it 'returns false' do
117
- verify_events { expect(apply).to be(false) }
118
- end
119
- end
120
- end
121
- end
122
- end
@@ -1,30 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Repository::SubjectFilter do
4
- context '#call' do
5
- subject { object.call(mutant_subject) }
6
-
7
- let(:object) { described_class.new(diff) }
8
- let(:diff) { instance_double(Mutant::Repository::Diff) }
9
- let(:value) { instance_double(Object, 'value') }
10
-
11
- let(:mutant_subject) do
12
- double(
13
- 'Subject',
14
- source_path: double('source path'),
15
- source_lines: double('source lines')
16
- )
17
- end
18
-
19
- before do
20
- expect(diff).to receive(:touches?).with(
21
- mutant_subject.source_path,
22
- mutant_subject.source_lines
23
- ).and_return(value)
24
- end
25
-
26
- it 'connects return value to repository diff API' do
27
- expect(subject).to be(value)
28
- end
29
- end
30
- end
@@ -1,73 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::RequireHighjack do
4
- let(:highjacked_calls) { [] }
5
- let(:require_calls) { [] }
6
-
7
- let(:target_module) do
8
- acc = require_calls
9
- Module.new do
10
- define_method(:require, &acc.method(:<<))
11
- define_singleton_method(:require, &acc.method(:<<))
12
- end
13
- end
14
-
15
- def singleton_require(logical_name)
16
- target_module.require(logical_name)
17
- end
18
-
19
- def instance_require(logical_name)
20
- Object.new.extend(target_module).require(logical_name)
21
- end
22
-
23
- describe '.call' do
24
- let(:logical_name) { instance_double(String) }
25
-
26
- def apply
27
- described_class.call(target_module, highjacked_calls.method(:<<))
28
- end
29
-
30
- it 'prevents warnings' do
31
- expect(Mutant::WORLD.warnings.call(&method(:apply))).to eql([])
32
- end
33
-
34
- it 'returns the original implementation from singleton' do
35
- expect { apply.call(logical_name) }
36
- .to change { require_calls }
37
- .from([])
38
- .to([logical_name])
39
- end
40
-
41
- context '#require' do
42
- it 'does highjack calls' do
43
- apply
44
- expect { instance_require(logical_name) }
45
- .to change { highjacked_calls }
46
- .from([])
47
- .to([logical_name])
48
- end
49
-
50
- it 'does not call original require' do
51
- apply
52
- expect { instance_require(logical_name) }
53
- .not_to change { require_calls }.from([])
54
- end
55
- end
56
-
57
- context '.require' do
58
- it 'does highjack calls' do
59
- apply
60
- expect { singleton_require(logical_name) }
61
- .to change { highjacked_calls }
62
- .from([])
63
- .to([logical_name])
64
- end
65
-
66
- it 'does not call original require' do
67
- apply
68
- expect { singleton_require(logical_name) }
69
- .not_to change { require_calls }.from([])
70
- end
71
- end
72
- end
73
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # The effect of this private module is done at boot time.
4
- # Hence there is no way to kill the mutations at runtime
5
- # so we have to directly hook into the private moduel via
6
- # reflection to redo a runtime observable interaction with
7
- # it.
8
- #
9
- # Until mutant gets boot time mutation support there is no
10
- # way to to avoid this.
11
- RSpec.describe 'Mutant::Result::ClassMethods' do
12
- let(:infected_class) do
13
- Class.new do
14
- include Adamantium::Flat, Concord::Public.new(:collection)
15
- extend Mutant::Result.const_get(:ClassMethods)
16
-
17
- sum :length, :collection
18
- end
19
- end
20
-
21
- describe '#sum' do
22
- let(:object) { infected_class.new(collection) }
23
-
24
- def apply
25
- object.length
26
- end
27
-
28
- subject { apply }
29
-
30
- before do
31
- # memoization behavior
32
- expect(collection).to receive(:map)
33
- .once
34
- .and_call_original
35
-
36
- apply
37
- end
38
-
39
- context 'empty collection' do
40
- let(:collection) { [] }
41
-
42
- it { should be(0) }
43
- end
44
-
45
- context 'non-emtpy collection' do
46
- let(:collection) { [[1], [2, 3]] }
47
-
48
- it { should be(3) }
49
- end
50
- end
51
- end