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,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Method::Singleton, '#call' do
4
- subject { object.call(env) }
5
-
6
- let(:object) { described_class.new(scope, method) }
7
- let(:method) { scope.method(method_name) }
8
- let(:type) { :defs }
9
- let(:method_name) { :foo }
10
- let(:method_arity) { 0 }
11
- let(:base) { TestApp::SingletonMethodTests }
12
- let(:source_path) { MutantSpec::ROOT.join('test_app/lib/test_app.rb') }
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(1)
34
- end
35
-
36
- def arguments
37
- node.children.fetch(2)
38
- end
39
-
40
- context 'when also defined on lvar' do
41
- let(:scope) { base::DefinedOnLvar }
42
- let(:expected_warnings) do
43
- [
44
- 'Can only match :defs on :self or :const got :lvar unable to match'
45
- ]
46
- end
47
-
48
- include_examples 'skipped candidate'
49
- end
50
-
51
- context 'when defined on self' do
52
- let(:scope) { base::DefinedOnSelf }
53
- let(:method_line) { 61 }
54
-
55
- it_should_behave_like 'a method matcher'
56
- end
57
-
58
- context 'when defined on constant' do
59
- context 'inside namespace' do
60
- let(:scope) { base::DefinedOnConstant::InsideNamespace }
61
- let(:method_line) { 71 }
62
-
63
- it_should_behave_like 'a method matcher'
64
- end
65
-
66
- context 'outside namespace' do
67
- let(:scope) { base::DefinedOnConstant::OutsideNamespace }
68
- let(:method_line) { 78 }
69
-
70
- it_should_behave_like 'a method matcher'
71
- end
72
- end
73
-
74
- context 'when defined multiple times in the same line' do
75
- context 'with method on different scope' do
76
- let(:scope) { base::DefinedMultipleTimes::SameLine::DifferentScope }
77
- let(:method_line) { 97 }
78
- let(:method_arity) { 1 }
79
-
80
- it_should_behave_like 'a method matcher'
81
- end
82
-
83
- context 'with different name' do
84
- let(:scope) { base::DefinedMultipleTimes::SameLine::DifferentName }
85
- let(:method_line) { 101 }
86
-
87
- it_should_behave_like 'a method matcher'
88
- end
89
- end
90
- end
@@ -1,54 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Methods::Instance, '#call' do
4
- let(:object) { described_class.new(class_under_test) }
5
- let(:env) { Fixtures::TEST_ENV }
6
-
7
- let(:class_under_test) do
8
- parent = Module.new do
9
- def method_d; end
10
-
11
- def method_e; end
12
- end
13
-
14
- Class.new do
15
- include parent
16
-
17
- private :method_d
18
-
19
- def method_a; end
20
-
21
- protected
22
-
23
- def method_b; end
24
-
25
- private
26
-
27
- def method_c; end
28
- end
29
- end
30
-
31
- let(:subject_a) { instance_double(Mutant::Subject) }
32
- let(:subject_b) { instance_double(Mutant::Subject) }
33
- let(:subject_c) { instance_double(Mutant::Subject) }
34
- let(:subjects) { [subject_a, subject_b, subject_c] }
35
-
36
- before do
37
- {
38
- method_a: subject_a,
39
- method_b: subject_b,
40
- method_c: subject_c
41
- }.each do |method, subject|
42
- matcher = instance_double(Mutant::Matcher)
43
- expect(matcher).to receive(:call).with(env).and_return([subject])
44
-
45
- expect(Mutant::Matcher::Method::Instance).to receive(:new)
46
- .with(class_under_test, class_under_test.instance_method(method))
47
- .and_return(matcher)
48
- end
49
- end
50
-
51
- it 'returns expected subjects' do
52
- expect(object.call(env)).to eql(subjects)
53
- end
54
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Methods::Metaclass, '#call' do
4
- let(:object) { described_class.new(class_under_test) }
5
- let(:env) { Fixtures::TEST_ENV }
6
-
7
- let(:class_under_test) do
8
- parent = Module.new do
9
- class << self
10
- def method_d; end
11
-
12
- protected
13
-
14
- def method_e; end
15
-
16
- private
17
-
18
- def method_f; end
19
- end
20
- end
21
-
22
- Class.new do
23
- extend parent
24
-
25
- class << self
26
- def method_a; end
27
-
28
- protected
29
-
30
- def method_b; end
31
-
32
- private
33
-
34
- def method_c; end
35
- end
36
- end
37
- end
38
-
39
- let(:subject_a) { instance_double(Mutant::Subject, 'A') }
40
- let(:subject_b) { instance_double(Mutant::Subject, 'B') }
41
- let(:subject_c) { instance_double(Mutant::Subject, 'C') }
42
-
43
- let(:subjects) { [subject_a, subject_b, subject_c] }
44
-
45
- before do
46
- matcher = Mutant::Matcher::Method::Metaclass
47
-
48
- {
49
- method_a: subject_a,
50
- method_b: subject_b,
51
- method_c: subject_c
52
- }.each do |method, subject|
53
- allow(matcher).to receive(:new)
54
- .with(class_under_test, class_under_test.method(method))
55
- .and_return(Mutant::Matcher::Static.new([subject]))
56
- end
57
- end
58
-
59
- it 'returns expected subjects' do
60
- expect(object.call(env)).to eql(subjects)
61
- end
62
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Methods::Singleton, '#call' do
4
- let(:object) { described_class.new(class_under_test) }
5
- let(:env) { Fixtures::TEST_ENV }
6
-
7
- let(:class_under_test) do
8
- parent = Module.new do
9
- def method_d; end
10
-
11
- def method_e; end
12
- end
13
-
14
- Class.new do
15
- extend parent
16
-
17
- def self.method_a; end
18
-
19
- def self.method_b; end
20
- class << self; protected :method_b; end
21
-
22
- def self.method_c; end
23
- private_class_method :method_c
24
-
25
- end
26
- end
27
-
28
- let(:subject_a) { instance_double(Mutant::Subject, 'A') }
29
- let(:subject_b) { instance_double(Mutant::Subject, 'B') }
30
- let(:subject_c) { instance_double(Mutant::Subject, 'C') }
31
-
32
- let(:subjects) { [subject_a, subject_b, subject_c] }
33
-
34
- before do
35
- matcher = Mutant::Matcher::Method::Singleton
36
-
37
- {
38
- method_a: subject_a,
39
- method_b: subject_b,
40
- method_c: subject_c
41
- }.each do |method, subject|
42
- allow(matcher).to receive(:new)
43
- .with(class_under_test, class_under_test.method(method))
44
- .and_return(Mutant::Matcher::Static.new([subject]))
45
- end
46
- end
47
-
48
- it 'returns expected subjects' do
49
- expect(object.call(env)).to eql(subjects)
50
- end
51
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Namespace, '#call' do
4
- let(:object) { described_class.new(parse_expression('TestApp*')) }
5
- let(:env) { instance_double(Mutant::Env) }
6
- let(:raw_scope_a) { instance_double(Class, name: 'TestApp::Literal') }
7
- let(:raw_scope_b) { instance_double(Class, name: 'TestApp::Foo') }
8
- let(:raw_scope_c) { instance_double(Class, name: 'TestAppOther') }
9
- let(:subject_a) { instance_double(Mutant::Subject) }
10
- let(:subject_b) { instance_double(Mutant::Subject) }
11
-
12
- before do
13
- [
14
- [Mutant::Matcher::Methods::Singleton, raw_scope_b, [subject_b]],
15
- [Mutant::Matcher::Methods::Instance, raw_scope_b, []],
16
- [Mutant::Matcher::Methods::Metaclass, raw_scope_b, []],
17
- [Mutant::Matcher::Methods::Singleton, raw_scope_a, [subject_a]],
18
- [Mutant::Matcher::Methods::Instance, raw_scope_a, []],
19
- [Mutant::Matcher::Methods::Metaclass, raw_scope_a, []]
20
- ].each do |klass, scope, subjects|
21
- matcher = instance_double(Mutant::Matcher)
22
- expect(matcher).to receive(:call).with(env).and_return(subjects)
23
-
24
- expect(klass).to receive(:new)
25
- .with(scope)
26
- .and_return(matcher)
27
- end
28
-
29
- allow(env).to receive(:matchable_scopes).and_return(
30
- [raw_scope_a, raw_scope_b, raw_scope_c].map do |raw_scope|
31
- Mutant::Scope.new(raw_scope, parse_expression(raw_scope.name))
32
- end
33
- )
34
- end
35
-
36
- it 'returns subjects' do
37
- expect(object.call(env)).to eql([subject_a, subject_b])
38
- end
39
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Null, '#call' do
4
- let(:object) { described_class.new }
5
- let(:env) { instance_double(Mutant::Env) }
6
-
7
- subject { object.call(env) }
8
-
9
- it 'returns no subjects' do
10
- should eql([])
11
- end
12
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Scope, '#call' do
4
- let(:scope) { TestApp }
5
- let(:object) { described_class.new(scope) }
6
- let(:env) { instance_double(Mutant::Env) }
7
- let(:matcher_a) { instance_double(Mutant::Matcher) }
8
- let(:matcher_b) { instance_double(Mutant::Matcher) }
9
- let(:matcher_c) { instance_double(Mutant::Matcher) }
10
- let(:subject_a) { instance_double(Mutant::Subject) }
11
- let(:subject_b) { instance_double(Mutant::Subject) }
12
- let(:subject_c) { instance_double(Mutant::Subject) }
13
-
14
- subject { object.call(env) }
15
-
16
- before do
17
- expect(Mutant::Matcher::Methods::Singleton).to receive(:new)
18
- .with(scope)
19
- .and_return(matcher_a)
20
-
21
- expect(Mutant::Matcher::Methods::Instance).to receive(:new)
22
- .with(scope)
23
- .and_return(matcher_b)
24
-
25
- expect(Mutant::Matcher::Methods::Metaclass).to receive(:new)
26
- .with(scope)
27
- .and_return(matcher_c)
28
-
29
- expect(matcher_a).to receive(:call)
30
- .with(env)
31
- .and_return([subject_a])
32
-
33
- expect(matcher_b).to receive(:call)
34
- .with(env)
35
- .and_return([subject_b])
36
-
37
- expect(matcher_c).to receive(:call)
38
- .with(env)
39
- .and_return([subject_c])
40
- end
41
-
42
- it 'concatenates subjects from matched singleton and instance methods' do
43
- should eql([subject_a, subject_b, subject_c])
44
- end
45
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher::Static, '#call' do
4
- let(:object) { described_class.new(subjects) }
5
- let(:env) { instance_double(Mutant::Env) }
6
- let(:subjects) { instance_double(Array) }
7
-
8
- subject { object.call(env) }
9
-
10
- it 'returns its predefined subjects' do
11
- should be(subjects)
12
- end
13
- end
@@ -1,102 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Matcher do
4
- describe '.from_config' do
5
- def apply
6
- described_class.from_config(config)
7
- end
8
-
9
- let(:anon_matcher) { instance_double(Mutant::Matcher) }
10
- let(:env) { instance_double(Mutant::Env) }
11
- let(:ignore_expressions) { [] }
12
- let(:match_expression_a) { expression('Foo::Bar#a', matcher_a) }
13
- let(:match_expression_b) { expression('Foo::Bar#b', matcher_b) }
14
- let(:subject_filters) { [] }
15
-
16
- let(:matcher_a) do
17
- instance_double(Mutant::Matcher, call: [subject_a])
18
- end
19
-
20
- let(:matcher_b) do
21
- instance_double(Mutant::Matcher, call: [subject_b])
22
- end
23
-
24
- let(:expression_class) do
25
- Class.new(Mutant::Expression) do
26
- include Concord.new(:child, :matcher)
27
-
28
- %w[syntax prefix?].each do |name|
29
- define_method(name) do |*arguments, &block|
30
- child.public_send(name, *arguments, &block)
31
- end
32
- end
33
-
34
- public :matcher
35
- end
36
- end
37
-
38
- let(:config) do
39
- Mutant::Matcher::Config.new(
40
- ignore_expressions: ignore_expressions,
41
- match_expressions: [match_expression_a, match_expression_b],
42
- subject_filters: subject_filters
43
- )
44
- end
45
-
46
- let(:subject_a) do
47
- instance_double(Mutant::Subject, 'subject a', expression: expression('Foo::Bar#a'))
48
- end
49
-
50
- let(:subject_b) do
51
- instance_double(Mutant::Subject, 'subject b', expression: expression('Foo::Bar#b'))
52
- end
53
-
54
- def expression(input, matcher = anon_matcher)
55
- expression_class.new(parse_expression(input), matcher)
56
- end
57
-
58
- context 'empty ignores and empty filter' do
59
- it 'returns expected subjects' do
60
- expect(apply.call(env)).to eql([subject_a, subject_b])
61
- end
62
- end
63
-
64
- context 'with ignore matching a subject' do
65
- let(:ignore_expressions) { [subject_b.expression] }
66
-
67
- it 'returns expected subjects' do
68
- expect(apply.call(env)).to eql([subject_a])
69
- end
70
- end
71
-
72
- context 'with ignore matching many subjects' do
73
- let(:ignore_expressions) { [expression('Foo*')] }
74
-
75
- it 'returns expected subjects' do
76
- expect(apply.call(env)).to eql([])
77
- end
78
- end
79
-
80
- context 'with subject filter' do
81
- let(:subject_filters) do
82
- [subject_a.method(:eql?)]
83
- end
84
-
85
- it 'returns expected subjects' do
86
- expect(apply.call(env)).to eql([subject_a])
87
- end
88
- end
89
-
90
- context 'with subject ignore and filter' do
91
- let(:ignore_expressions) { [subject_b.expression] }
92
-
93
- let(:subject_filters) do
94
- [subject_b.method(:eql?)]
95
- end
96
-
97
- it 'returns expected subjects' do
98
- expect(apply.call(env)).to eql([])
99
- end
100
- end
101
- end
102
- end