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,79 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Loader, '.call' do
4
- def apply
5
- described_class.call(
6
- binding: binding,
7
- kernel: kernel,
8
- source: source,
9
- subject: mutation_subject
10
- )
11
- end
12
-
13
- let(:path) { instance_double(Pathname, to_s: path_str) }
14
- let(:path_str) { instance_double(String) }
15
- let(:line) { instance_double(Integer) }
16
- let(:kernel) { class_double(Kernel) }
17
- let(:binding) { instance_double(Binding) }
18
- let(:source) { instance_double(String) }
19
- let(:node) { instance_double(Parser::AST::Node) }
20
-
21
- let(:mutation_subject) do
22
- instance_double(
23
- Mutant::Subject,
24
- source_path: path,
25
- source_line: line
26
- )
27
- end
28
-
29
- before do
30
- allow(kernel).to receive_messages(eval: nil)
31
- end
32
-
33
- shared_examples 'kernel eval' do
34
- it 'performs eval' do
35
- apply
36
-
37
- expect(kernel).to have_received(:eval)
38
- .with(
39
- "# frozen_string_literal: true\n#[InstanceDouble(String) (anonymous)]",
40
- binding,
41
- path_str,
42
- line
43
- )
44
- end
45
- end
46
-
47
- context 'without exception being raised' do
48
- it 'returns success result' do
49
- expect(apply).to be(described_class::Result::Success.instance)
50
- end
51
-
52
- include_examples 'kernel eval'
53
- end
54
-
55
- context 'with void value syntax error' do
56
- before do
57
- allow(kernel).to receive(:eval)
58
- .and_raise(SyntaxError, '/some/path.rb:1: void value expression')
59
- end
60
-
61
- it 'returns void value result' do
62
- expect(apply).to be(described_class::Result::VoidValue.instance)
63
- end
64
-
65
- include_examples 'kernel eval'
66
- end
67
-
68
- context 'with other syntax error' do
69
- let(:message) { '(eval):1: some other error' }
70
-
71
- before do
72
- allow(kernel).to receive(:eval).and_raise(SyntaxError, message)
73
- end
74
-
75
- it 'raises exception' do
76
- expect { apply }.to raise_error(SyntaxError, message)
77
- end
78
- end
79
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Chain, '#call' do
4
- subject { object.call(env) }
5
-
6
- let(:object) { described_class.new([matcher_a, matcher_b]) }
7
- let(:env) { instance_double(Mutant::Env) }
8
- let(:matcher_a) { instance_double(Mutant::Matcher) }
9
- let(:matcher_b) { instance_double(Mutant::Matcher) }
10
- let(:subject_a) { instance_double(Mutant::Subject) }
11
- let(:subject_b) { instance_double(Mutant::Subject) }
12
-
13
- before do
14
- expect(matcher_a).to receive(:call)
15
- .with(env)
16
- .and_return([subject_a])
17
-
18
- expect(matcher_b).to receive(:call)
19
- .with(env)
20
- .and_return([subject_b])
21
- end
22
-
23
- it 'returns concatenated matches' do
24
- should eql([subject_a, subject_b])
25
- end
26
- end
File without changes
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Config do
4
- describe '#inspect' do
5
- subject { object.inspect }
6
-
7
- context 'on default config' do
8
- let(:object) { described_class::DEFAULT }
9
-
10
- it { should eql('#<Mutant::Matcher::Config empty>') }
11
- end
12
-
13
- context 'with one expression' do
14
- let(:object) { described_class::DEFAULT.add(:match_expressions, parse_expression('Foo')) }
15
- it { should eql('#<Mutant::Matcher::Config match_expressions: [Foo]>') }
16
- end
17
-
18
- context 'with many expressions' do
19
- let(:object) do
20
- described_class::DEFAULT
21
- .add(:match_expressions, parse_expression('Foo'))
22
- .add(:match_expressions, parse_expression('Bar'))
23
- end
24
-
25
- it { should eql('#<Mutant::Matcher::Config match_expressions: [Foo,Bar]>') }
26
- end
27
-
28
- context 'with match and ignore expression' do
29
- let(:object) do
30
- described_class::DEFAULT
31
- .add(:match_expressions, parse_expression('Foo'))
32
- .add(:ignore_expressions, parse_expression('Bar'))
33
- end
34
-
35
- it { should eql('#<Mutant::Matcher::Config ignore_expressions: [Bar] match_expressions: [Foo]>') }
36
- end
37
-
38
- context 'with subject filter' do
39
- let(:object) do
40
- described_class::DEFAULT
41
- .add(:subject_filters, 'foo')
42
- end
43
-
44
- it { should eql('#<Mutant::Matcher::Config subject_filters: ["foo"]>') }
45
- end
46
- end
47
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Filter, '#call' do
4
- subject { object.call(env) }
5
-
6
- let(:object) { described_class.new(matcher, predicate) }
7
- let(:matcher) { instance_double(Mutant::Matcher) }
8
- let(:subject_a) { instance_double(Mutant::Subject) }
9
- let(:subject_b) { instance_double(Mutant::Subject) }
10
- let(:env) { instance_double(Mutant::Env) }
11
- let(:predicate) { ->(node) { node.eql?(subject_a) } }
12
-
13
- before do
14
- expect(matcher).to receive(:call)
15
- .with(env)
16
- .and_return([subject_a, subject_b])
17
- end
18
-
19
- it 'returns subjects after filtering' do
20
- should eql([subject_a])
21
- end
22
- end
@@ -1,164 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Method::Instance, '#call' do
4
- subject { object.call(env) }
5
-
6
- let(:base) { TestApp::InstanceMethodTests }
7
- let(:method) { scope.instance_method(method_name) }
8
- let(:method_arity) { 0 }
9
- let(:method_name) { :foo }
10
- let(:object) { described_class.new(scope, method) }
11
- let(:source_path) { MutantSpec::ROOT.join('test_app/lib/test_app.rb') }
12
- let(:type) { :def }
13
- let(:warnings) { instance_double(Mutant::Warnings) }
14
-
15
- let(:world) do
16
- instance_double(
17
- Mutant::World,
18
- pathname: Pathname,
19
- warnings: warnings
20
- )
21
- end
22
-
23
- let(:env) do
24
- instance_double(
25
- Mutant::Env,
26
- config: Mutant::Config::DEFAULT,
27
- parser: Fixtures::TEST_ENV.parser,
28
- world: world
29
- )
30
- end
31
-
32
- def name
33
- node.children.fetch(0)
34
- end
35
-
36
- def arguments
37
- node.children.fetch(1)
38
- end
39
-
40
- context 'when method is defined inside eval' do
41
- let(:subject_class) { Mutant::Subject::Method::Instance::Memoized }
42
- let(:scope) { base::WithMemoizer }
43
- let(:method) { scope.instance_method(:boz) }
44
-
45
- let(:expected_warnings) do
46
- [
47
- "#{method} does not have a valid source location, unable to emit subject"
48
- ]
49
- end
50
-
51
- include_examples 'skipped candidate'
52
-
53
- it 'returns expected subjects' do
54
- expect(subject).to eql([])
55
- end
56
- end
57
-
58
- context 'when method is defined without source location' do
59
- let(:scope) { Module }
60
- let(:method) { scope.instance_method(:object_id) }
61
-
62
- let(:expected_warnings) do
63
- [
64
- "#{method} does not have a valid source location, unable to emit subject"
65
- ]
66
- end
67
-
68
- include_examples 'skipped candidate'
69
-
70
- it 'returns expected subjects' do
71
- expect(subject).to eql([])
72
- end
73
- end
74
-
75
- context 'in module eval' do
76
- let(:scope) { base::InModuleEval }
77
-
78
- let(:expected_warnings) do
79
- [
80
- "#{method} is dynamically defined in a closure, unable to emit subject"
81
- ]
82
- end
83
-
84
- include_examples 'skipped candidate'
85
-
86
- it 'returns expected subjects' do
87
- expect(subject).to eql([])
88
- end
89
- end
90
-
91
- context 'in class eval' do
92
- let(:scope) { base::InClassEval }
93
-
94
- let(:expected_warnings) do
95
- [
96
- "#{method} is dynamically defined in a closure, unable to emit subject"
97
- ]
98
- end
99
-
100
- include_examples 'skipped candidate'
101
-
102
- it 'returns expected subjects' do
103
- expect(subject).to eql([])
104
- end
105
- end
106
-
107
- context 'when method is defined once' do
108
- let(:method_name) { :bar }
109
- let(:scope) { base::WithMemoizer }
110
- let(:method_line) { 13 }
111
-
112
- it_should_behave_like 'a method matcher'
113
-
114
- it 'returns expected subjects' do
115
- context = Mutant::Context.new(
116
- TestApp::InstanceMethodTests::WithMemoizer,
117
- MutantSpec::ROOT.join('test_app', 'lib', 'test_app.rb')
118
- )
119
-
120
- expect(subject).to eql(
121
- [
122
- Mutant::Subject::Method::Instance.new(
123
- context: context,
124
- node: s(:def, :bar, s(:args), nil),
125
- warnings: warnings
126
- )
127
- ]
128
- )
129
- end
130
- end
131
-
132
- context 'when method is defined once with a memoizer' do
133
- let(:scope) { base::WithMemoizer }
134
- let(:method_line) { 15 }
135
-
136
- it_should_behave_like 'a method matcher'
137
- end
138
-
139
- context 'when method is defined multiple times' do
140
- context 'on different lines' do
141
- let(:scope) { base::DefinedMultipleTimes::DifferentLines }
142
- let(:method_line) { 24 }
143
- let(:method_arity) { 1 }
144
-
145
- it_should_behave_like 'a method matcher'
146
- end
147
-
148
- context 'on the same line' do
149
- let(:scope) { base::DefinedMultipleTimes::SameLineSameScope }
150
- let(:method_line) { 29 }
151
- let(:method_arity) { 1 }
152
-
153
- it_should_behave_like 'a method matcher'
154
- end
155
-
156
- context 'on the same line with different scope' do
157
- let(:scope) { base::DefinedMultipleTimes::SameLineDifferentScope }
158
- let(:method_line) { 33 }
159
- let(:method_arity) { 1 }
160
-
161
- it_should_behave_like 'a method matcher'
162
- end
163
- end
164
- end
@@ -1,108 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Method::Metaclass, '#call' do
4
- SOURCE_PATH = 'test_app/lib/test_app/metaclasses.rb'
5
- subject { object.call(env) }
6
-
7
- let(:object) { described_class.new(scope, method) }
8
- let(:method) { scope.method(method_name) }
9
- let(:type) { :def }
10
- let(:method_name) { :foo }
11
- let(:method_arity) { 0 }
12
- let(:base) { TestApp::MetaclassMethodTests }
13
- let(:source_path) { MutantSpec::ROOT.join(SOURCE_PATH) }
14
- let(:warnings) { instance_double(Mutant::Warnings) }
15
-
16
- let(:world) do
17
- instance_double(
18
- Mutant::World,
19
- pathname: Pathname,
20
- warnings: warnings
21
- )
22
- end
23
-
24
- let(:env) do
25
- instance_double(
26
- Mutant::Env,
27
- config: Mutant::Config::DEFAULT,
28
- parser: Fixtures::TEST_ENV.parser,
29
- world: world
30
- )
31
- end
32
-
33
- def name
34
- node.children.fetch(0)
35
- end
36
-
37
- def arguments
38
- node.children.fetch(1)
39
- end
40
-
41
- context 'when also defined on lvar' do
42
- let(:scope) { base::DefinedOnLvar }
43
- let(:expected_warnings) do
44
- [
45
- 'Can only match :def inside :sclass on :self or :const, got :sclass on :lvar unable to match'
46
- ]
47
- end
48
-
49
- include_examples 'skipped candidate'
50
- end
51
-
52
- context 'when defined on self' do
53
- let(:scope) { base::DefinedOnSelf }
54
- let(:method_line) { 7 }
55
-
56
- it_should_behave_like 'a method matcher'
57
-
58
- context 'when scope is a metaclass' do
59
- let(:scope) { base::DefinedOnSelf::InsideMetaclass.metaclass }
60
- let(:method_line) { 28 }
61
-
62
- it_should_behave_like 'a method matcher'
63
- end
64
- end
65
-
66
- context 'when defined on constant' do
67
- context 'inside namespace' do
68
- let(:scope) { base::DefinedOnConstant::InsideNamespace }
69
- let(:method_line) { 44 }
70
-
71
- it_should_behave_like 'a method matcher'
72
- end
73
-
74
- context 'outside namespace' do
75
- let(:scope) { base::DefinedOnConstant::OutsideNamespace }
76
- let(:method_line) { 52 }
77
-
78
- it_should_behave_like 'a method matcher'
79
- end
80
- end
81
-
82
- context 'when defined multiple times in the same line' do
83
- context 'with method on different scope' do
84
- let(:scope) { base::DefinedMultipleTimes::SameLine::DifferentScope }
85
- let(:method_line) { 76 }
86
- let(:method_arity) { 1 }
87
-
88
- it_should_behave_like 'a method matcher'
89
- end
90
-
91
- context 'with different name' do
92
- let(:scope) { base::DefinedMultipleTimes::SameLine::DifferentName }
93
- let(:method_line) { 80 }
94
-
95
- it_should_behave_like 'a method matcher'
96
- end
97
- end
98
-
99
- # tests that the evaluator correctly returns nil when the metaclass doesn't
100
- # directly contain the method
101
- context 'when defined inside a class in a metaclass' do
102
- let(:scope) { base::NotActuallyInAMetaclass }
103
- let(:method) { scope.metaclass::SomeClass.new.method(:foo) }
104
- let(:method_line) { 93 }
105
-
106
- it { is_expected.to be_empty }
107
- end
108
- end