mutant 0.9.10 → 0.10.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 (254) hide show
  1. checksums.yaml +4 -4
  2. data/bin/mutant +16 -11
  3. data/lib/mutant.rb +8 -4
  4. data/lib/mutant/bootstrap.rb +14 -1
  5. data/lib/mutant/cli.rb +9 -162
  6. data/lib/mutant/cli/command.rb +196 -0
  7. data/lib/mutant/cli/command/root.rb +13 -0
  8. data/lib/mutant/cli/command/run.rb +151 -0
  9. data/lib/mutant/cli/command/subscription.rb +54 -0
  10. data/lib/mutant/expression.rb +0 -1
  11. data/lib/mutant/isolation.rb +1 -1
  12. data/lib/mutant/isolation/fork.rb +2 -2
  13. data/lib/mutant/isolation/none.rb +1 -1
  14. data/lib/mutant/license.rb +9 -35
  15. data/lib/mutant/license/subscription.rb +31 -9
  16. data/lib/mutant/license/subscription/commercial.rb +2 -4
  17. data/lib/mutant/license/subscription/opensource.rb +7 -7
  18. data/lib/mutant/matcher/config.rb +2 -0
  19. data/lib/mutant/meta/example.rb +16 -4
  20. data/lib/mutant/meta/example/dsl.rb +33 -16
  21. data/lib/mutant/meta/example/verification.rb +70 -28
  22. data/lib/mutant/minitest/coverage.rb +53 -0
  23. data/lib/mutant/mutator/node.rb +2 -2
  24. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  25. data/lib/mutant/mutator/node/{dstr.rb → dynamic_literal.rb} +7 -5
  26. data/lib/mutant/mutator/node/index.rb +4 -4
  27. data/lib/mutant/mutator/node/literal/range.rb +5 -2
  28. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +1 -1
  29. data/lib/mutant/mutator/node/noop.rb +1 -1
  30. data/lib/mutant/mutator/node/op_asgn.rb +15 -1
  31. data/lib/mutant/mutator/node/send.rb +25 -1
  32. data/lib/mutant/mutator/node/send/attribute_assignment.rb +1 -0
  33. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -3
  34. data/lib/mutant/subject/method/instance.rb +1 -1
  35. data/lib/mutant/version.rb +1 -1
  36. metadata +18 -336
  37. data/.github/workflows/ci.yml +0 -121
  38. data/.gitignore +0 -38
  39. data/.rspec +0 -5
  40. data/.rubocop.yml +0 -210
  41. data/Changelog.md +0 -87
  42. data/Gemfile +0 -7
  43. data/Gemfile.lock +0 -107
  44. data/Gemfile.shared +0 -10
  45. data/README.md +0 -199
  46. data/Rakefile +0 -5
  47. data/config/devtools.yml +0 -2
  48. data/config/reek.yml +0 -139
  49. data/config/yardstick.yml +0 -2
  50. data/docs/commercial-support.md +0 -14
  51. data/docs/concurrency.md +0 -39
  52. data/docs/incremental.md +0 -76
  53. data/docs/known-problems.md +0 -30
  54. data/docs/limitations.md +0 -50
  55. data/docs/mutant-minitest.md +0 -149
  56. data/docs/mutant-rspec.md +0 -130
  57. data/docs/nomenclature.md +0 -82
  58. data/docs/reading-reports.md +0 -74
  59. data/lib/mutant/mutator/node/dsym.rb +0 -22
  60. data/meta/and.rb +0 -13
  61. data/meta/and_asgn.rb +0 -14
  62. data/meta/array.rb +0 -27
  63. data/meta/begin.rb +0 -20
  64. data/meta/block.rb +0 -199
  65. data/meta/block_pass.rb +0 -8
  66. data/meta/blockarg.rb +0 -10
  67. data/meta/break.rb +0 -9
  68. data/meta/case.rb +0 -217
  69. data/meta/casgn.rb +0 -25
  70. data/meta/cbase.rb +0 -8
  71. data/meta/class.rb +0 -12
  72. data/meta/const.rb +0 -17
  73. data/meta/csend.rb +0 -10
  74. data/meta/cvar.rb +0 -7
  75. data/meta/cvasgn.rb +0 -9
  76. data/meta/date.rb +0 -59
  77. data/meta/def.rb +0 -196
  78. data/meta/defined.rb +0 -9
  79. data/meta/dstr.rb +0 -13
  80. data/meta/dsym.rb +0 -14
  81. data/meta/ensure.rb +0 -8
  82. data/meta/false.rb +0 -7
  83. data/meta/file.rb +0 -5
  84. data/meta/float.rb +0 -37
  85. data/meta/gvar.rb +0 -7
  86. data/meta/gvasgn.rb +0 -9
  87. data/meta/hash.rb +0 -20
  88. data/meta/if.rb +0 -72
  89. data/meta/index.rb +0 -133
  90. data/meta/indexasgn.rb +0 -31
  91. data/meta/int.rb +0 -18
  92. data/meta/ivar.rb +0 -8
  93. data/meta/ivasgn.rb +0 -22
  94. data/meta/kwarg.rb +0 -10
  95. data/meta/kwbegin.rb +0 -8
  96. data/meta/kwoptarg.rb +0 -13
  97. data/meta/lambda.rb +0 -23
  98. data/meta/line.rb +0 -5
  99. data/meta/lvar.rb +0 -16
  100. data/meta/lvasgn.rb +0 -24
  101. data/meta/masgn.rb +0 -7
  102. data/meta/match_current_line.rb +0 -14
  103. data/meta/next.rb +0 -10
  104. data/meta/nil.rb +0 -5
  105. data/meta/nthref.rb +0 -14
  106. data/meta/op_assgn.rb +0 -17
  107. data/meta/or.rb +0 -13
  108. data/meta/or_asgn.rb +0 -50
  109. data/meta/range.rb +0 -65
  110. data/meta/redo.rb +0 -5
  111. data/meta/regexp.rb +0 -80
  112. data/meta/regopt.rb +0 -10
  113. data/meta/rescue.rb +0 -84
  114. data/meta/return.rb +0 -16
  115. data/meta/sclass.rb +0 -12
  116. data/meta/self.rb +0 -7
  117. data/meta/send.rb +0 -600
  118. data/meta/str.rb +0 -7
  119. data/meta/super.rb +0 -27
  120. data/meta/sym.rb +0 -8
  121. data/meta/true.rb +0 -7
  122. data/meta/until.rb +0 -16
  123. data/meta/while.rb +0 -24
  124. data/meta/yield.rb +0 -9
  125. data/mutant-minitest.gemspec +0 -22
  126. data/mutant-rspec.gemspec +0 -22
  127. data/mutant.gemspec +0 -44
  128. data/mutant.sh +0 -12
  129. data/mutant.yml +0 -6
  130. data/spec/integration/mutant/corpus_spec.rb +0 -15
  131. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  132. data/spec/integration/mutant/minitest_spec.rb +0 -11
  133. data/spec/integration/mutant/null_spec.rb +0 -16
  134. data/spec/integration/mutant/rspec_spec.rb +0 -15
  135. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  136. data/spec/integrations.yml +0 -63
  137. data/spec/shared/framework_integration_behavior.rb +0 -70
  138. data/spec/shared/method_matcher_behavior.rb +0 -47
  139. data/spec/spec_helper.rb +0 -90
  140. data/spec/support/corpus.rb +0 -318
  141. data/spec/support/file_system.rb +0 -62
  142. data/spec/support/ice_nine_config.rb +0 -10
  143. data/spec/support/ruby_vm.rb +0 -84
  144. data/spec/support/shared_context.rb +0 -169
  145. data/spec/support/xspec.rb +0 -183
  146. data/spec/unit/mutant/ast/find_metaclass_containing_spec.rb +0 -64
  147. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  148. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  149. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  150. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  151. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  152. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  153. data/spec/unit/mutant/ast_spec.rb +0 -57
  154. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  155. data/spec/unit/mutant/cli_spec.rb +0 -305
  156. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  157. data/spec/unit/mutant/config_spec.rb +0 -126
  158. data/spec/unit/mutant/context_spec.rb +0 -111
  159. data/spec/unit/mutant/env_spec.rb +0 -229
  160. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  161. data/spec/unit/mutant/expression/methods_spec.rb +0 -66
  162. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  163. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  164. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  165. data/spec/unit/mutant/expression_spec.rb +0 -45
  166. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  167. data/spec/unit/mutant/integration_spec.rb +0 -150
  168. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  169. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  170. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  171. data/spec/unit/mutant/license_spec.rb +0 -305
  172. data/spec/unit/mutant/loader_spec.rb +0 -79
  173. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  174. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  175. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  176. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  177. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  178. data/spec/unit/mutant/matcher/method/metaclass_spec.rb +0 -108
  179. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  180. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  181. data/spec/unit/mutant/matcher/methods/metaclass_spec.rb +0 -62
  182. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  183. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -39
  184. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  185. data/spec/unit/mutant/matcher/scope_spec.rb +0 -45
  186. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  187. data/spec/unit/mutant/matcher_spec.rb +0 -102
  188. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  189. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  190. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  191. data/spec/unit/mutant/mutation_spec.rb +0 -140
  192. data/spec/unit/mutant/mutator/node_spec.rb +0 -47
  193. data/spec/unit/mutant/mutator_spec.rb +0 -21
  194. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  195. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  196. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  197. data/spec/unit/mutant/parallel_spec.rb +0 -115
  198. data/spec/unit/mutant/parser_spec.rb +0 -26
  199. data/spec/unit/mutant/range_spec.rb +0 -141
  200. data/spec/unit/mutant/registry_spec.rb +0 -74
  201. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  202. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  203. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  204. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  205. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  206. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  207. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  208. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  209. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  210. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  211. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  212. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  213. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  214. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  215. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  216. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  217. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  218. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  219. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  220. data/spec/unit/mutant/result/env_spec.rb +0 -161
  221. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  222. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  223. data/spec/unit/mutant/result/test_spec.rb +0 -14
  224. data/spec/unit/mutant/result_spec.rb +0 -33
  225. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  226. data/spec/unit/mutant/runner_spec.rb +0 -121
  227. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  228. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  229. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -276
  230. data/spec/unit/mutant/subject/method/metaclass_spec.rb +0 -63
  231. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  232. data/spec/unit/mutant/subject_spec.rb +0 -93
  233. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  234. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  235. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  236. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  237. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  238. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  239. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  240. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  241. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  242. data/spec/unit/mutant/util/one_spec.rb +0 -22
  243. data/spec/unit/mutant/warnings_spec.rb +0 -89
  244. data/spec/unit/mutant/world_spec.rb +0 -63
  245. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  246. data/test_app/.rspec +0 -1
  247. data/test_app/Gemfile.minitest +0 -6
  248. data/test_app/Gemfile.rspec3.8 +0 -7
  249. data/test_app/lib/test_app.rb +0 -114
  250. data/test_app/lib/test_app/literal.rb +0 -35
  251. data/test_app/lib/test_app/metaclasses.rb +0 -108
  252. data/test_app/spec/spec_helper.rb +0 -9
  253. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  254. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -1,137 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Reporter::CLI do
4
- setup_shared_context
5
-
6
- let(:object) { described_class.new(output, format) }
7
- let(:tty?) { false }
8
-
9
- let(:format) do
10
- described_class::Format::Progressive.new(tty?)
11
- end
12
-
13
- def contents
14
- output.rewind
15
- output.read
16
- end
17
-
18
- def self.it_reports(expected_content)
19
- it 'writes expected report to output' do
20
- expect(subject).to be(object)
21
- expect(contents).to eql(expected_content)
22
- end
23
- end
24
-
25
- before do
26
- allow(Mutant::Timer).to receive_messages(now: Mutant::Timer.now)
27
- end
28
-
29
- describe '.build' do
30
- subject { described_class.build(output) }
31
-
32
- context 'when output is a tty' do
33
- let(:tty?) { true }
34
- let(:output) { instance_double(IO, tty?: true) }
35
-
36
- it { should eql(described_class.new(output, format)) }
37
- end
38
-
39
- context 'when output is not a tty' do
40
- context 'and does not respond to #tty?' do
41
- let(:output) { nil }
42
-
43
- it { should eql(described_class.new(output, format)) }
44
- end
45
-
46
- context 'and does respond to #tty?' do
47
- it { should eql(described_class.new(output, format)) }
48
- end
49
- end
50
- end
51
-
52
- describe '#warn' do
53
- subject { object.warn(message) }
54
-
55
- let(:message) { 'message' }
56
-
57
- it_reports("message\n")
58
- end
59
-
60
- describe '#delay' do
61
- subject { object.delay }
62
-
63
- it { should eql(1.0) }
64
- end
65
-
66
- describe '#start' do
67
- subject { object.start(env) }
68
-
69
- it_reports(<<~REPORT)
70
- Mutant environment:
71
- Matcher: #<Mutant::Matcher::Config empty>
72
- Integration: null
73
- Jobs: 1
74
- Includes: []
75
- Requires: []
76
- Subjects: 1
77
- Total-Tests: 1
78
- Selected-Tests: 1
79
- Tests/Subject: 1.00 avg
80
- Mutations: 2
81
- REPORT
82
- end
83
-
84
- describe '#report' do
85
- subject { object.report(env_result) }
86
-
87
- it_reports(<<~REPORT)
88
- Mutant environment:
89
- Matcher: #<Mutant::Matcher::Config empty>
90
- Integration: null
91
- Jobs: 1
92
- Includes: []
93
- Requires: []
94
- Subjects: 1
95
- Total-Tests: 1
96
- Selected-Tests: 1
97
- Tests/Subject: 1.00 avg
98
- Mutations: 2
99
- Results: 2
100
- Kills: 2
101
- Alive: 0
102
- Runtime: 4.00s
103
- Killtime: 2.00s
104
- Overhead: 100.00%
105
- Mutations/s: 0.50
106
- Coverage: 100.00%
107
- REPORT
108
- end
109
-
110
- describe '#progress' do
111
- subject { object.progress(status) }
112
-
113
- context 'with empty scheduler' do
114
- with(:env_result) { { subject_results: [] } }
115
-
116
- let(:tty?) { true }
117
-
118
- # rubocop:disable Metrics/LineLength
119
- it_reports Unparser::Color::GREEN.format('progress: 00/02 alive: 0 runtime: 4.00s killtime: 0.00s mutations/s: 0.00') + "\n"
120
- # rubocop:enable Metrics/LineLength
121
- end
122
-
123
- context 'with last mutation present' do
124
- with(:env_result) { { subject_results: [subject_a_result] } }
125
-
126
- context 'when mutation is successful' do
127
- it_reports "progress: 02/02 alive: 0 runtime: 4.00s killtime: 2.00s mutations/s: 0.50\n"
128
- end
129
-
130
- context 'when mutation is NOT successful' do
131
- with(:mutation_a_test_result) { { passed: true } }
132
-
133
- it_reports "progress: 02/02 alive: 1 runtime: 4.00s killtime: 2.00s mutations/s: 0.50\n"
134
- end
135
- end
136
- end
137
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Reporter::Null do
4
- let(:object) { described_class.new }
5
- let(:value) { instance_double(Object) }
6
-
7
- %i[progress report start warn].each do |name|
8
- describe "##{name}" do
9
- subject { object.public_send(name, value) }
10
-
11
- it_should_behave_like 'a command method'
12
- end
13
- end
14
- end
@@ -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