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,98 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Transform::Sequence do
4
- subject { described_class.new(steps) }
5
-
6
- let(:steps) do
7
- [
8
- hash_transform,
9
- hash_symbolize
10
- ]
11
- end
12
-
13
- let(:hash_transform) do
14
- Mutant::Transform::Hash.new(optional: [], required: [key_transform])
15
- end
16
-
17
- let(:key_transform) do
18
- Mutant::Transform::Hash::Key.new('foo', Mutant::Transform::Boolean.new)
19
- end
20
-
21
- let(:boolean_transform) do
22
- Mutant::Transform::Boolean.new
23
- end
24
-
25
- let(:hash_symbolize) do
26
- Mutant::Transform::Hash::Symbolize.new
27
- end
28
-
29
- describe '#apply' do
30
- def apply
31
- subject.apply(input)
32
- end
33
-
34
- context 'on valid input' do
35
- let(:input) { { 'foo' => true } }
36
-
37
- it 'returns success' do
38
- expect(apply).to eql(Mutant::Either::Right.new(foo: true))
39
- end
40
- end
41
-
42
- context 'on invalid input' do
43
- let(:input) { { 'foo' => 1 } }
44
-
45
- let(:boolean_error) do
46
- Mutant::Transform::Error.new(
47
- cause: nil,
48
- input: 1,
49
- message: 'Expected: boolean but got: 1',
50
- transform: boolean_transform
51
- )
52
- end
53
-
54
- let(:key_error) do
55
- Mutant::Transform::Error.new(
56
- cause: boolean_error,
57
- input: 1,
58
- message: nil,
59
- transform: key_transform
60
- )
61
- end
62
-
63
- let(:hash_error) do
64
- Mutant::Transform::Error.new(
65
- cause: key_error,
66
- input: input,
67
- message: nil,
68
- transform: hash_transform
69
- )
70
- end
71
-
72
- let(:index_error) do
73
- Mutant::Transform::Error.new(
74
- cause: hash_error,
75
- input: input,
76
- message: nil,
77
- transform: Mutant::Transform::Index.new(
78
- index: 0,
79
- transform: hash_transform
80
- )
81
- )
82
- end
83
-
84
- let(:error) do
85
- Mutant::Transform::Error.new(
86
- cause: index_error,
87
- input: input,
88
- message: nil,
89
- transform: subject
90
- )
91
- end
92
-
93
- it 'returns failure' do
94
- expect(apply).to eql(Mutant::Either::Left.new(error))
95
- end
96
- end
97
- end
98
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Util, '.one' do
4
- let(:first) { instance_double(Object) }
5
- let(:array) { instance_double(Array, one?: true, first: first) }
6
-
7
- it 'returns first element' do
8
- expect(described_class.one(array)).to be(first)
9
- end
10
-
11
- it 'fails if the list is empty' do
12
- expect { described_class.one([]) }
13
- .to raise_error(described_class::SizeError)
14
- .with_message('expected size to be exactly 1 but size was 0')
15
- end
16
-
17
- it 'fails if the list has more than one element' do
18
- expect { described_class.one([1, 2]) }
19
- .to raise_error(described_class::SizeError)
20
- .with_message('expected size to be exactly 1 but size was 2')
21
- end
22
- end
@@ -1,89 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Warnings do
4
- subject { described_class.new(warning_module) }
5
-
6
- before do
7
- subject # make sure we infect the module in any case
8
- end
9
-
10
- let(:original_messages) do
11
- []
12
- end
13
-
14
- let(:warning_module) do
15
- original_messages = original_messages()
16
-
17
- # Simulation of corelib `Warning` module
18
- Module.new do
19
- module_function def warn(*arguments)
20
- messages << arguments
21
- end
22
-
23
- module_function define_method(:messages) { original_messages }
24
- end
25
- end
26
-
27
- def cause_warnings
28
- original_messages.clear
29
-
30
- warning_module = warning_module()
31
-
32
- warning_module.warn('warning-a')
33
-
34
- Class
35
- .new { include warning_module }
36
- .new
37
- .instance_eval { warn('warning-b') }
38
- end
39
-
40
- describe '#call' do
41
- def apply
42
- subject.call { cause_warnings }
43
- end
44
-
45
- def expect_captured_messages(captured_messages)
46
- expect(captured_messages).to eql([%w[warning-a], %w[warning-b]])
47
- expect(captured_messages.frozen?).to eql(true)
48
- expect(captured_messages.map(&:frozen?)).to eql([true, true])
49
- expect(captured_messages.flat_map(&:frozen?)).to eql([true, true])
50
- expect(original_messages).to eql([])
51
- end
52
-
53
- def expect_original_messages
54
- expect(original_messages).to eql([%w[warning-a], %w[warning-b]])
55
- end
56
-
57
- it 'captures expected warnings during block execution' do
58
- expect_captured_messages(apply)
59
- expect(original_messages).to eql([])
60
- end
61
-
62
- it 'captures expected warnings during repeated block execution' do
63
- expect_captured_messages(apply)
64
- expect_captured_messages(apply)
65
- end
66
-
67
- it 'does use original implementation without block execution' do
68
- cause_warnings
69
- expect_original_messages
70
- end
71
-
72
- it 'does use original implementation before block execution' do
73
- cause_warnings
74
- expect_original_messages
75
- expect_captured_messages(apply)
76
- end
77
-
78
- it 'does use original implementation after block execution' do
79
- expect_captured_messages(apply)
80
- cause_warnings
81
- expect_original_messages
82
- end
83
-
84
- it 'rejects re-entrant use' do
85
- expect { subject.call { subject.call } }
86
- .to raise_error(described_class::RecursiveUseError)
87
- end
88
- end
89
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::World do
4
- subject do
5
- Mutant::WORLD
6
- end
7
-
8
- describe '#inspect' do
9
- def apply
10
- subject.inspect
11
- end
12
-
13
- it 'returns expected value' do
14
- expect(apply).to eql('#<Mutant::World>')
15
- end
16
-
17
- it 'is frozen' do
18
- expect(apply.frozen?).to be(true)
19
- end
20
-
21
- it 'is idempotent' do
22
- expect(apply).to be(apply)
23
- end
24
- end
25
-
26
- describe '#capture_stdout' do
27
- def apply
28
- subject.capture_stdout(command)
29
- end
30
-
31
- let(:open3) { class_double(Open3) }
32
- let(:stdout) { instance_double(String, :stdout) }
33
- let(:subject) { super().with(open3: open3) }
34
- let(:command) { %w[foo bar baz] }
35
-
36
- let(:process_status) do
37
- instance_double(
38
- Process::Status,
39
- success?: success?
40
- )
41
- end
42
-
43
- before do
44
- allow(open3).to receive_messages(capture2: [stdout, process_status])
45
- end
46
-
47
- context 'when process exists successful' do
48
- let(:success?) { true }
49
-
50
- it 'returns stdout' do
51
- expect(apply).to eql(Mutant::Either::Right.new(stdout))
52
- end
53
- end
54
-
55
- context 'when process exists unsuccessful' do
56
- let(:success?) { false }
57
-
58
- it 'returns stdout' do
59
- expect(apply).to eql(Mutant::Either::Left.new("Command #{command.inspect} failed!"))
60
- end
61
- end
62
- end
63
- end
@@ -1,122 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Zombifier do
4
- let(:root_require) { Pathname.new('project') }
5
- let(:pathname) { class_double(Pathname) }
6
-
7
- let(:require_highjack) do
8
- lambda do |block|
9
- original = ruby_vm.method(:require)
10
- allow(ruby_vm).to receive(:require) do |argument|
11
- return_value = ruby_vm.expected_events.first.return_value
12
- expect(block.call(argument)).to be(return_value)
13
- end
14
- original
15
- end
16
- end
17
-
18
- let(:options) do
19
- {
20
- load_path: %w[a b],
21
- includes: %w[project bar],
22
- namespace: :Zombie,
23
- require_highjack: require_highjack,
24
- root_require: root_require,
25
- pathname: pathname,
26
- kernel: ruby_vm
27
- }
28
- end
29
-
30
- let(:ruby_vm) do
31
- MutantSpec::RubyVM.new(
32
- [
33
- MutantSpec::RubyVM::EventExpectation::Require.new(
34
- expected_payload: {
35
- logical_name: 'project'
36
- },
37
- return_value: true
38
- ),
39
- MutantSpec::RubyVM::EventExpectation::Eval.new(
40
- expected_payload: {
41
- binding: TOPLEVEL_BINDING,
42
- source: "module Zombie\n module Project\n end\nend",
43
- source_location: 'a/project.rb'
44
- },
45
- trigger_requires: %w[foo bar],
46
- return_value: nil
47
- ),
48
- MutantSpec::RubyVM::EventExpectation::Require.new(
49
- expected_payload: {
50
- logical_name: 'foo'
51
- },
52
- trigger_requires: %w[bar],
53
- return_value: true
54
- ),
55
- MutantSpec::RubyVM::EventExpectation::Require.new(
56
- expected_payload: {
57
- logical_name: 'bar'
58
- },
59
- return_value: true
60
- ),
61
- MutantSpec::RubyVM::EventExpectation::Eval.new(
62
- expected_payload: {
63
- binding: TOPLEVEL_BINDING,
64
- source: "module Zombie\n module Bar\n end\nend",
65
- source_location: 'b/bar.rb'
66
- },
67
- trigger_requires: %w[],
68
- return_value: nil
69
- ),
70
- MutantSpec::RubyVM::EventExpectation::Require.new(
71
- expected_payload: {
72
- logical_name: 'bar'
73
- },
74
- return_value: false
75
- )
76
- ]
77
- )
78
- end
79
-
80
- let(:file_entries) do
81
- {
82
- 'a/project.rb' => { file: true, contents: 'module Project; end' },
83
- 'b/bar.rb' => { file: true, contents: 'module Bar; end' }
84
- }
85
- end
86
-
87
- let(:file_system) do
88
- MutantSpec::FileSystem.new(
89
- Hash[
90
- file_entries.map { |key, attributes| [key, MutantSpec::FileState.new(attributes)] }
91
- ]
92
- )
93
- end
94
-
95
- describe '.call' do
96
- def apply
97
- described_class.call(options)
98
- end
99
-
100
- before do
101
- allow(pathname).to receive(:new, &file_system.method(:path))
102
- end
103
-
104
- it 'returns self' do
105
- expect(apply).to be(described_class)
106
- end
107
-
108
- it 'walks the VM through expected steps' do
109
- expect { apply }.to change(ruby_vm, :done?).from(false).to(true)
110
- end
111
-
112
- context 'when zombifier require fails' do
113
- let(:file_entries) do
114
- {}
115
- end
116
-
117
- it 'raises zombifier specific load error' do
118
- expect { apply }.to raise_error(described_class::LoadError, 'Cannot find file "project.rb" in load path')
119
- end
120
- end
121
- end
122
- end
@@ -1 +0,0 @@
1
- --color
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'mutant', path: '../'
4
- gem 'mutant-minitest', path: '../'
5
-
6
- eval_gemfile File.expand_path('../../Gemfile.shared', __FILE__)
@@ -1,7 +0,0 @@
1
- source 'https://rubygems.org'
2
- gem 'rspec', '~> 3.8.0'
3
- gem 'rspec-core', '~> 3.8.0'
4
- gem 'mutant', path: '../'
5
- gem 'mutant-rspec', path: '../'
6
- gem 'adamantium'
7
- eval_gemfile File.expand_path('../../Gemfile.shared', __FILE__)
@@ -1,114 +0,0 @@
1
- require 'adamantium'
2
-
3
- original = $VERBOSE
4
- # Silence intentional violations made to exercise the method matcher edge cases.
5
- # This is NOT representative for could you should write!
6
- $VERBOSE = false
7
- # Namespace for test application
8
- module TestApp
9
- module InstanceMethodTests
10
- module WithMemoizer
11
- include Adamantium
12
-
13
- def bar; end; def baz; end
14
- eval('def boz; end')
15
- def foo; end;
16
- memoize :foo
17
- end
18
-
19
- module DefinedMultipleTimes
20
- class DifferentLines
21
- def foo
22
- end
23
-
24
- def foo(_arg)
25
- end
26
- end
27
-
28
- class SameLineSameScope
29
- def foo; end; def foo(_arg); end
30
- end
31
-
32
- class SameLineDifferentScope
33
- def self.foo; end; def foo(_arg); end
34
- end
35
- end
36
-
37
- class InClassEval
38
- class_eval do
39
- def foo
40
- end
41
- end
42
- end
43
-
44
- class InModuleEval
45
- module_eval do
46
- def foo
47
- end
48
- end
49
- end
50
-
51
- class InInstanceEval
52
- module_eval do
53
- def foo
54
- end
55
- end
56
- end
57
- end
58
-
59
- module SingletonMethodTests
60
- module DefinedOnSelf
61
- def self.foo; end
62
- end
63
-
64
- module DefinedOnLvar
65
- a = self
66
- def a.foo; end
67
- end
68
-
69
- module DefinedOnConstant
70
- module InsideNamespace
71
- def InsideNamespace.foo
72
- end
73
- end
74
-
75
- module OutsideNamespace
76
- end
77
-
78
- def OutsideNamespace.foo
79
- end
80
- end
81
-
82
- module DefinedMultipleTimes
83
- module DifferentLines
84
- def self.foo
85
- end
86
-
87
- def self.foo(_arg)
88
- end
89
- end
90
-
91
- module SameLine
92
- module SameScope
93
- def self.foo; end; def self.foo(_arg); end
94
- end
95
-
96
- module DifferentScope
97
- def self.foo; end; def DifferentScope.foo(_arg); end; def SingletonMethodTests.foo; end
98
- end
99
-
100
- module DifferentName
101
- def self.foo; end; def self.bar(_arg); end
102
- end
103
- end
104
- end
105
- end
106
-
107
- def self.root
108
- File.expand_path('..', __dir__)
109
- end
110
- end
111
-
112
- require 'test_app/metaclasses'
113
- require 'test_app/literal'
114
- $VERBOSE = original