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,111 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Context do
4
- describe '.wrap' do
5
- subject { described_class.wrap(scope, node) }
6
-
7
- let(:node) { s(:str, 'test') }
8
-
9
- context 'with Module as scope' do
10
- let(:scope) { Mutant }
11
-
12
- let(:expected) do
13
- s(:module,
14
- s(:const, nil, :Mutant),
15
- s(:str, 'test'))
16
- end
17
-
18
- it { should eql(expected) }
19
- end
20
-
21
- context 'with Class as scope' do
22
- let(:scope) { Mutant::Context }
23
-
24
- let(:expected) do
25
- s(:class,
26
- s(:const, nil, :Context),
27
- nil,
28
- s(:str, 'test'))
29
- end
30
-
31
- it { should eql(expected) }
32
- end
33
- end
34
-
35
- let(:object) { described_class.new(scope, source_path) }
36
- let(:source_path) { instance_double(Pathname) }
37
- let(:scope) { TestApp::Literal }
38
-
39
- describe '#identification' do
40
- subject { object.identification }
41
-
42
- it { should eql(scope.name) }
43
- end
44
-
45
- describe '#root' do
46
- subject { object.root(node) }
47
-
48
- let(:node) { s(:sym, :node) }
49
-
50
- let(:expected_source) do
51
- generate(parse(<<-RUBY))
52
- module TestApp
53
- class Literal
54
- :node
55
- end
56
- end
57
- RUBY
58
- end
59
-
60
- let(:generated_source) do
61
- Unparser.unparse(subject)
62
- end
63
-
64
- it 'should create correct source' do
65
- expect(generated_source).to eql(expected_source)
66
- end
67
- end
68
-
69
- describe '#unqualified_name' do
70
- subject { object.unqualified_name }
71
-
72
- context 'with top level constant name' do
73
- let(:scope) { TestApp }
74
-
75
- it 'should return the unqualified name' do
76
- should eql('TestApp')
77
- end
78
-
79
- it_should_behave_like 'an idempotent method'
80
- end
81
-
82
- context 'with scoped constant name' do
83
- it 'should return the unqualified name' do
84
- should eql('Literal')
85
- end
86
-
87
- it_should_behave_like 'an idempotent method'
88
- end
89
- end
90
-
91
- describe '#match_expressions' do
92
- subject { object.match_expressions }
93
-
94
- context 'on toplevel scope' do
95
- let(:scope) { TestApp }
96
-
97
- it { should eql([parse_expression('TestApp*')]) }
98
- end
99
-
100
- context 'on nested scope' do
101
- specify do
102
- should eql(
103
- [
104
- parse_expression('TestApp::Literal*'),
105
- parse_expression('TestApp*')
106
- ]
107
- )
108
- end
109
- end
110
- end
111
- end
@@ -1,229 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Env do
4
- subject do
5
- described_class.new(
6
- config: config,
7
- integration: integration,
8
- matchable_scopes: [],
9
- mutations: [],
10
- selector: selector,
11
- subjects: subjects,
12
- parser: Mutant::Parser.new,
13
- world: world
14
- )
15
- end
16
-
17
- let(:integration_class) { Mutant::Integration::Null }
18
- let(:isolation) { Mutant::Isolation::None.new }
19
- let(:kernel) { instance_double(Object, 'kernel') }
20
- let(:reporter) { instance_double(Mutant::Reporter) }
21
- let(:selector) { instance_double(Mutant::Selector) }
22
- let(:subject_a) { instance_double(Mutant::Subject, :a) }
23
- let(:subject_b) { instance_double(Mutant::Subject, :b) }
24
- let(:subjects) { [subject_a, subject_b] }
25
- let(:test_a) { instance_double(Mutant::Test, :a) }
26
- let(:test_b) { instance_double(Mutant::Test, :b) }
27
- let(:test_c) { instance_double(Mutant::Test, :c) }
28
-
29
- let(:integration) do
30
- instance_double(Mutant::Integration, all_tests: [test_a, test_b, test_c])
31
- end
32
-
33
- let(:mutation) do
34
- instance_double(
35
- Mutant::Mutation,
36
- subject: subject_a
37
- )
38
- end
39
-
40
- let(:config) do
41
- instance_double(
42
- Mutant::Config,
43
- integration: integration_class,
44
- isolation: isolation,
45
- reporter: reporter
46
- )
47
- end
48
-
49
- let(:world) do
50
- instance_double(
51
- Mutant::World,
52
- kernel: kernel
53
- )
54
- end
55
-
56
- before do
57
- allow(selector).to receive(:call)
58
- .with(subject_a)
59
- .and_return([test_a, test_b])
60
-
61
- allow(selector).to receive(:call)
62
- .with(subject_b)
63
- .and_return([test_b, test_c])
64
-
65
- allow(Mutant::Timer).to receive(:now).and_return(2.0, 3.0)
66
- end
67
-
68
- describe '#kill' do
69
- def apply
70
- subject.kill(mutation)
71
- end
72
-
73
- before do
74
- allow(isolation).to receive(:call) do |&block|
75
- Mutant::Isolation::Result::Success.new(block.call)
76
- end
77
-
78
- allow(mutation).to receive_messages(insert: loader_result)
79
- end
80
-
81
- shared_examples 'mutation kill' do
82
- it 'returns expected result' do
83
- expect(apply).to eql(
84
- Mutant::Result::Mutation.new(
85
- isolation_result: isolation_result,
86
- mutation: mutation,
87
- runtime: 1.0
88
- )
89
- )
90
- end
91
- end
92
-
93
- context 'when loader is successful' do
94
- let(:loader_result) { Mutant::Loader::Result::Success.instance }
95
- let(:test_result) { instance_double(Mutant::Result::Test) }
96
-
97
- let(:isolation_result) do
98
- Mutant::Isolation::Result::Success.new(test_result)
99
- end
100
-
101
- before do
102
- allow(integration).to receive_messages(call: test_result)
103
- end
104
-
105
- it 'performs IO in expected sequence' do
106
- apply
107
-
108
- expect(isolation).to have_received(:call).ordered
109
- expect(mutation).to have_received(:insert).ordered.with(kernel)
110
- expect(integration).to have_received(:call).ordered.with([test_a, test_b])
111
- end
112
-
113
- include_examples 'mutation kill'
114
- end
115
-
116
- context 'when loader reports void value' do
117
- let(:loader_result) { Mutant::Loader::Result::VoidValue.instance }
118
-
119
- let(:isolation_result) do
120
- Mutant::Isolation::Result::Success.new(Mutant::Result::Test::VoidValue.instance)
121
- end
122
-
123
- it 'performs IO in expected sequence' do
124
- apply
125
-
126
- expect(isolation).to have_received(:call).ordered
127
- expect(mutation).to have_received(:insert).ordered.with(kernel)
128
- end
129
-
130
- include_examples 'mutation kill'
131
- end
132
- end
133
-
134
- describe '#selections' do
135
- def apply
136
- subject.selections
137
- end
138
-
139
- it 'returns expected selections' do
140
- expect(apply).to eql(
141
- subject_a => [test_a, test_b],
142
- subject_b => [test_b, test_c]
143
- )
144
- end
145
- end
146
-
147
- describe '#warn' do
148
- def apply
149
- subject.warn(message)
150
- end
151
-
152
- before do
153
- allow(reporter).to receive_messages(warn: reporter)
154
- end
155
-
156
- let(:message) { 'test-warning' }
157
-
158
- it 'warns via the reporter' do
159
- apply
160
-
161
- expect(reporter).to have_received(:warn).with(message)
162
- end
163
-
164
- it 'returns self' do
165
- expect(apply).to be(subject)
166
- end
167
- end
168
-
169
- describe '#amount_mutations' do
170
- def apply
171
- subject.amount_mutations
172
- end
173
-
174
- it 'returns expected value' do
175
- expect(apply).to be(0)
176
- end
177
- end
178
-
179
- describe '#amount_total_tests' do
180
- def apply
181
- subject.amount_total_tests
182
- end
183
-
184
- it 'returns expected value' do
185
- expect(apply).to be(3)
186
- end
187
- end
188
-
189
- describe '#test_subject_ratio' do
190
- def apply
191
- subject.test_subject_ratio
192
- end
193
-
194
- context 'on empty subjects' do
195
- let(:subjects) { [] }
196
-
197
- it 'returns expected value' do
198
- expect(apply).to eql(Rational(0))
199
- end
200
- end
201
-
202
- context 'on non empty subjects' do
203
- it 'returns expected value' do
204
- expect(apply).to eql(Rational(3, 2))
205
- end
206
- end
207
- end
208
-
209
- describe '.empty' do
210
- def apply
211
- described_class.empty(world, config)
212
- end
213
-
214
- it 'returns empty env' do
215
- expect(apply).to eql(
216
- described_class.new(
217
- config: config,
218
- integration: Mutant::Integration::Null.new(config),
219
- matchable_scopes: Mutant::EMPTY_ARRAY,
220
- mutations: Mutant::EMPTY_ARRAY,
221
- parser: Mutant::Parser.new,
222
- selector: Mutant::Selector::Null.new,
223
- subjects: Mutant::EMPTY_ARRAY,
224
- world: world
225
- )
226
- )
227
- end
228
- end
229
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Expression::Method do
4
- let(:object) { parse_expression(input) }
5
- let(:env) { Fixtures::TEST_ENV }
6
- let(:instance_method) { 'TestApp::Literal#string' }
7
- let(:singleton_method) { 'TestApp::Literal.string' }
8
-
9
- describe '#match_length' do
10
- let(:input) { instance_method }
11
-
12
- subject { object.match_length(other) }
13
-
14
- context 'when other is an equivalent expression' do
15
- let(:other) { parse_expression(object.syntax) }
16
-
17
- it { should be(object.syntax.length) }
18
- end
19
-
20
- context 'when other is an unequivalent expression' do
21
- let(:other) { parse_expression('Foo*') }
22
-
23
- it { should be(0) }
24
- end
25
- end
26
-
27
- describe '#matcher' do
28
- subject { object.matcher }
29
-
30
- context 'with an instance method' do
31
- let(:input) { instance_method }
32
-
33
- it 'returns correct matcher' do
34
- expect(subject.call(env).map(&:expression)).to eql([object])
35
- end
36
- end
37
-
38
- context 'with a singleton method' do
39
- let(:input) { singleton_method }
40
-
41
- it 'returns correct matcher' do
42
- expect(subject.call(env).map(&:expression)).to eql([object])
43
- end
44
- end
45
- end
46
-
47
- describe '#syntax' do
48
- subject { object.syntax }
49
-
50
- context 'on instance method' do
51
- let(:input) { instance_method }
52
-
53
- it { should eql(instance_method) }
54
- end
55
-
56
- context 'on singleton method' do
57
- let(:input) { singleton_method }
58
-
59
- it { should eql(singleton_method) }
60
- end
61
- end
62
- end
@@ -1,66 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Expression::Methods do
4
- let(:object) { described_class.new(attributes) }
5
-
6
- describe '#match_length' do
7
- let(:attributes) { { scope_name: 'TestApp::Literal', scope_symbol: '#' } }
8
-
9
- subject { object.match_length(other) }
10
-
11
- context 'when other is an equivalent expression' do
12
- let(:other) { parse_expression(object.syntax) }
13
-
14
- it { should be(object.syntax.length) }
15
- end
16
-
17
- context 'when other is matched' do
18
- let(:other) { parse_expression('TestApp::Literal#foo') }
19
-
20
- it { should be(object.syntax.length) }
21
- end
22
-
23
- context 'when other is an not matched expression' do
24
- let(:other) { parse_expression('Foo*') }
25
-
26
- it { should be(0) }
27
- end
28
- end
29
-
30
- describe '#syntax' do
31
- subject { object.syntax }
32
-
33
- context 'with an instance method' do
34
- let(:attributes) { { scope_name: 'TestApp::Literal', scope_symbol: '#' } }
35
-
36
- it { should eql('TestApp::Literal#') }
37
- end
38
-
39
- context 'with a singleton method' do
40
- let(:attributes) { { scope_name: 'TestApp::Literal', scope_symbol: '.' } }
41
-
42
- it { should eql('TestApp::Literal.') }
43
- end
44
- end
45
-
46
- describe '#matcher' do
47
- subject { object.matcher }
48
-
49
- context 'with an instance method' do
50
- let(:attributes) { { scope_name: 'TestApp::Literal', scope_symbol: '#' } }
51
-
52
- it { should eql(Mutant::Matcher::Chain.new([Mutant::Matcher::Methods::Instance.new(TestApp::Literal)])) }
53
- end
54
-
55
- context 'with a singleton method' do
56
- let(:attributes) { { scope_name: 'TestApp::Literal', scope_symbol: '.' } }
57
-
58
- it do
59
- should eql(Mutant::Matcher::Chain.new([
60
- Mutant::Matcher::Methods::Singleton.new(TestApp::Literal),
61
- Mutant::Matcher::Methods::Metaclass.new(TestApp::Literal)
62
- ]))
63
- end
64
- end
65
- end
66
- end