mutant 0.9.9 → 0.9.14

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 (252) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mutant.rb +2 -4
  3. data/lib/mutant/bootstrap.rb +14 -1
  4. data/lib/mutant/cli.rb +6 -0
  5. data/lib/mutant/isolation.rb +1 -1
  6. data/lib/mutant/isolation/fork.rb +2 -2
  7. data/lib/mutant/isolation/none.rb +1 -1
  8. data/lib/mutant/matcher/config.rb +2 -0
  9. data/lib/mutant/meta/example.rb +16 -4
  10. data/lib/mutant/meta/example/dsl.rb +33 -16
  11. data/lib/mutant/meta/example/verification.rb +70 -28
  12. data/lib/mutant/minitest/coverage.rb +53 -0
  13. data/lib/mutant/mutator/node.rb +2 -2
  14. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  15. data/lib/mutant/mutator/node/{dstr.rb → dynamic_literal.rb} +7 -5
  16. data/lib/mutant/mutator/node/index.rb +4 -4
  17. data/lib/mutant/mutator/node/literal/range.rb +4 -1
  18. data/lib/mutant/mutator/node/noop.rb +1 -1
  19. data/lib/mutant/mutator/node/op_asgn.rb +15 -1
  20. data/lib/mutant/mutator/node/send.rb +25 -1
  21. data/lib/mutant/mutator/node/send/attribute_assignment.rb +1 -0
  22. data/lib/mutant/reporter/cli/printer.rb +2 -2
  23. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -3
  24. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -1
  25. data/lib/mutant/subject/method/instance.rb +41 -2
  26. data/lib/mutant/version.rb +1 -1
  27. metadata +59 -347
  28. data/.github/workflows/ci.yml +0 -121
  29. data/.gitignore +0 -38
  30. data/.rspec +0 -5
  31. data/.rubocop.yml +0 -7
  32. data/Changelog.md +0 -81
  33. data/Gemfile +0 -7
  34. data/Gemfile.lock +0 -167
  35. data/Gemfile.shared +0 -10
  36. data/README.md +0 -178
  37. data/Rakefile +0 -5
  38. data/config/devtools.yml +0 -2
  39. data/config/reek.yml +0 -139
  40. data/config/rubocop.yml +0 -205
  41. data/config/yardstick.yml +0 -2
  42. data/docs/commercial-support.md +0 -14
  43. data/docs/concurrency.md +0 -39
  44. data/docs/incremental.md +0 -76
  45. data/docs/known-problems.md +0 -30
  46. data/docs/limitations.md +0 -50
  47. data/docs/mutant-minitest.md +0 -149
  48. data/docs/mutant-rspec.md +0 -130
  49. data/docs/nomenclature.md +0 -82
  50. data/docs/reading-reports.md +0 -74
  51. data/lib/mutant/color.rb +0 -40
  52. data/lib/mutant/diff.rb +0 -97
  53. data/lib/mutant/mutator/node/dsym.rb +0 -22
  54. data/meta/and.rb +0 -13
  55. data/meta/and_asgn.rb +0 -14
  56. data/meta/array.rb +0 -27
  57. data/meta/begin.rb +0 -20
  58. data/meta/block.rb +0 -199
  59. data/meta/block_pass.rb +0 -8
  60. data/meta/blockarg.rb +0 -10
  61. data/meta/break.rb +0 -9
  62. data/meta/case.rb +0 -217
  63. data/meta/casgn.rb +0 -25
  64. data/meta/cbase.rb +0 -8
  65. data/meta/class.rb +0 -12
  66. data/meta/const.rb +0 -17
  67. data/meta/csend.rb +0 -10
  68. data/meta/cvar.rb +0 -7
  69. data/meta/cvasgn.rb +0 -9
  70. data/meta/date.rb +0 -59
  71. data/meta/def.rb +0 -196
  72. data/meta/defined.rb +0 -9
  73. data/meta/dstr.rb +0 -13
  74. data/meta/dsym.rb +0 -14
  75. data/meta/ensure.rb +0 -8
  76. data/meta/false.rb +0 -7
  77. data/meta/file.rb +0 -5
  78. data/meta/float.rb +0 -37
  79. data/meta/gvar.rb +0 -7
  80. data/meta/gvasgn.rb +0 -9
  81. data/meta/hash.rb +0 -20
  82. data/meta/if.rb +0 -72
  83. data/meta/index.rb +0 -133
  84. data/meta/indexasgn.rb +0 -31
  85. data/meta/int.rb +0 -18
  86. data/meta/ivar.rb +0 -8
  87. data/meta/ivasgn.rb +0 -22
  88. data/meta/kwarg.rb +0 -10
  89. data/meta/kwbegin.rb +0 -8
  90. data/meta/kwoptarg.rb +0 -13
  91. data/meta/lambda.rb +0 -23
  92. data/meta/line.rb +0 -5
  93. data/meta/lvar.rb +0 -16
  94. data/meta/lvasgn.rb +0 -24
  95. data/meta/masgn.rb +0 -7
  96. data/meta/match_current_line.rb +0 -14
  97. data/meta/next.rb +0 -10
  98. data/meta/nil.rb +0 -5
  99. data/meta/nthref.rb +0 -14
  100. data/meta/op_assgn.rb +0 -17
  101. data/meta/or.rb +0 -13
  102. data/meta/or_asgn.rb +0 -50
  103. data/meta/range.rb +0 -39
  104. data/meta/redo.rb +0 -5
  105. data/meta/regexp.rb +0 -80
  106. data/meta/regopt.rb +0 -10
  107. data/meta/rescue.rb +0 -84
  108. data/meta/return.rb +0 -16
  109. data/meta/sclass.rb +0 -12
  110. data/meta/self.rb +0 -7
  111. data/meta/send.rb +0 -600
  112. data/meta/str.rb +0 -7
  113. data/meta/super.rb +0 -27
  114. data/meta/sym.rb +0 -8
  115. data/meta/true.rb +0 -7
  116. data/meta/until.rb +0 -16
  117. data/meta/while.rb +0 -24
  118. data/meta/yield.rb +0 -9
  119. data/mutant-minitest.gemspec +0 -22
  120. data/mutant-rspec.gemspec +0 -22
  121. data/mutant.gemspec +0 -41
  122. data/mutant.sh +0 -12
  123. data/mutant.yml +0 -6
  124. data/spec/integration/mutant/corpus_spec.rb +0 -15
  125. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  126. data/spec/integration/mutant/minitest_spec.rb +0 -11
  127. data/spec/integration/mutant/null_spec.rb +0 -16
  128. data/spec/integration/mutant/rspec_spec.rb +0 -15
  129. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  130. data/spec/integrations.yml +0 -63
  131. data/spec/shared/base_behavior.rb +0 -45
  132. data/spec/shared/framework_integration_behavior.rb +0 -70
  133. data/spec/shared/method_matcher_behavior.rb +0 -47
  134. data/spec/spec_helper.rb +0 -75
  135. data/spec/support/corpus.rb +0 -318
  136. data/spec/support/file_system.rb +0 -62
  137. data/spec/support/ice_nine_config.rb +0 -10
  138. data/spec/support/ruby_vm.rb +0 -84
  139. data/spec/support/shared_context.rb +0 -169
  140. data/spec/support/test_app.rb +0 -7
  141. data/spec/support/warnings.yml +0 -6
  142. data/spec/support/xspec.rb +0 -183
  143. data/spec/unit/mutant/ast/find_metaclass_containing_spec.rb +0 -64
  144. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  145. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  146. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  147. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  148. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  149. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  150. data/spec/unit/mutant/ast_spec.rb +0 -57
  151. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  152. data/spec/unit/mutant/cli_spec.rb +0 -305
  153. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  154. data/spec/unit/mutant/config_spec.rb +0 -126
  155. data/spec/unit/mutant/context_spec.rb +0 -111
  156. data/spec/unit/mutant/diff_spec.rb +0 -189
  157. data/spec/unit/mutant/env_spec.rb +0 -229
  158. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  159. data/spec/unit/mutant/expression/methods_spec.rb +0 -66
  160. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  161. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  162. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  163. data/spec/unit/mutant/expression_spec.rb +0 -45
  164. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  165. data/spec/unit/mutant/integration_spec.rb +0 -150
  166. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  167. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  168. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  169. data/spec/unit/mutant/license_spec.rb +0 -305
  170. data/spec/unit/mutant/loader_spec.rb +0 -79
  171. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  172. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  173. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  174. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  175. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  176. data/spec/unit/mutant/matcher/method/metaclass_spec.rb +0 -108
  177. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  178. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  179. data/spec/unit/mutant/matcher/methods/metaclass_spec.rb +0 -62
  180. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  181. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -39
  182. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  183. data/spec/unit/mutant/matcher/scope_spec.rb +0 -45
  184. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  185. data/spec/unit/mutant/matcher_spec.rb +0 -102
  186. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  187. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  188. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  189. data/spec/unit/mutant/mutation_spec.rb +0 -140
  190. data/spec/unit/mutant/mutator/node_spec.rb +0 -47
  191. data/spec/unit/mutant/mutator_spec.rb +0 -21
  192. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  193. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  194. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  195. data/spec/unit/mutant/parallel_spec.rb +0 -115
  196. data/spec/unit/mutant/parser_spec.rb +0 -26
  197. data/spec/unit/mutant/range_spec.rb +0 -141
  198. data/spec/unit/mutant/registry_spec.rb +0 -74
  199. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  200. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  201. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  202. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  203. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  204. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  205. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  206. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  207. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  208. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  209. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  210. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  211. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  212. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  213. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  214. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  215. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  216. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  217. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  218. data/spec/unit/mutant/result/env_spec.rb +0 -161
  219. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  220. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  221. data/spec/unit/mutant/result/test_spec.rb +0 -14
  222. data/spec/unit/mutant/result_spec.rb +0 -33
  223. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  224. data/spec/unit/mutant/runner_spec.rb +0 -121
  225. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  226. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  227. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  228. data/spec/unit/mutant/subject/method/metaclass_spec.rb +0 -63
  229. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  230. data/spec/unit/mutant/subject_spec.rb +0 -93
  231. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  232. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  233. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  234. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  235. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  236. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  237. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  238. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  239. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  240. data/spec/unit/mutant/util/one_spec.rb +0 -22
  241. data/spec/unit/mutant/warnings_spec.rb +0 -89
  242. data/spec/unit/mutant/world_spec.rb +0 -63
  243. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  244. data/test_app/.rspec +0 -1
  245. data/test_app/Gemfile.minitest +0 -4
  246. data/test_app/Gemfile.rspec3.8 +0 -7
  247. data/test_app/lib/test_app.rb +0 -110
  248. data/test_app/lib/test_app/literal.rb +0 -35
  249. data/test_app/lib/test_app/metaclasses.rb +0 -108
  250. data/test_app/spec/spec_helper.rb +0 -9
  251. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  252. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -1,121 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Runner do
4
- describe '.call' do
5
- let(:condition_variable) { class_double(ConditionVariable) }
6
- let(:delay) { instance_double(Float) }
7
- let(:driver) { instance_double(Mutant::Parallel::Driver) }
8
- let(:env_result) { instance_double(Mutant::Result::Env) }
9
- let(:kernel) { class_double(Kernel) }
10
- let(:mutex) { class_double(Mutex) }
11
- let(:processor) { instance_double(Method) }
12
- let(:reporter) { instance_double(Mutant::Reporter, delay: delay) }
13
- let(:thread) { class_double(Thread) }
14
-
15
- let(:env) do
16
- instance_double(
17
- Mutant::Env,
18
- config: config,
19
- mutations: [],
20
- world: world
21
- )
22
- end
23
-
24
- let(:config) do
25
- instance_double(
26
- Mutant::Config,
27
- jobs: 1,
28
- reporter: reporter
29
- )
30
- end
31
-
32
- let(:world) do
33
- instance_double(
34
- Mutant::World,
35
- condition_variable: condition_variable,
36
- kernel: kernel,
37
- mutex: mutex,
38
- thread: thread
39
- )
40
- end
41
-
42
- let(:status_a) do
43
- instance_double(
44
- Mutant::Parallel::Status,
45
- done?: false
46
- )
47
- end
48
-
49
- let(:status_b) do
50
- instance_double(
51
- Mutant::Parallel::Status,
52
- done?: true,
53
- payload: env_result
54
- )
55
- end
56
-
57
- let(:parallel_config) do
58
- Mutant::Parallel::Config.new(
59
- condition_variable: condition_variable,
60
- jobs: 1,
61
- mutex: mutex,
62
- processor: processor,
63
- sink: Mutant::Runner::Sink.new(env),
64
- source: Mutant::Parallel::Source::Array.new(env.mutations),
65
- thread: thread
66
- )
67
- end
68
-
69
- def apply
70
- described_class.apply(env)
71
- end
72
-
73
- let(:raw_expectations) do
74
- [
75
- {
76
- receiver: reporter,
77
- selector: :start,
78
- arguments: [env]
79
- },
80
- {
81
- receiver: env,
82
- selector: :method,
83
- arguments: [:kill],
84
- reaction: { return: processor }
85
- },
86
- {
87
- receiver: Mutant::Parallel,
88
- selector: :async,
89
- arguments: [parallel_config],
90
- reaction: { return: driver }
91
- },
92
- {
93
- receiver: driver,
94
- selector: :wait_timeout,
95
- arguments: [delay],
96
- reaction: { return: status_a }
97
- },
98
- {
99
- receiver: reporter,
100
- selector: :progress,
101
- arguments: [status_a]
102
- },
103
- {
104
- receiver: driver,
105
- selector: :wait_timeout,
106
- arguments: [delay],
107
- reaction: { return: status_b }
108
- },
109
- {
110
- receiver: reporter,
111
- selector: :report,
112
- arguments: [env_result]
113
- }
114
- ]
115
- end
116
-
117
- it 'returns env result' do
118
- verify_events { expect(apply).to eql(Mutant::Either::Right.new(env_result)) }
119
- end
120
- end
121
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Selector::Expression do
4
- describe '#call' do
5
- let(:object) { described_class.new(integration) }
6
-
7
- let(:mutation_subject) { subject_class.new(context: context, node: node, warnings: warnings) }
8
- let(:context) { instance_double(Mutant::Context) }
9
- let(:node) { instance_double(Parser::AST::Node) }
10
- let(:integration) { instance_double(Mutant::Integration, all_tests: all_tests) }
11
- let(:test_a) { instance_double(Mutant::Test, expression: parse_expression('SubjectA')) }
12
- let(:test_b) { instance_double(Mutant::Test, expression: parse_expression('SubjectB')) }
13
- let(:test_c) { instance_double(Mutant::Test, expression: parse_expression('SubjectC')) }
14
- let(:warnings) { instance_double(Mutant::Warnings) }
15
-
16
- let(:subject_class) do
17
- parse = method(:parse_expression)
18
-
19
- Class.new(Mutant::Subject) do
20
- define_method(:expression) do
21
- parse.call('SubjectA')
22
- end
23
-
24
- define_method(:match_expressions) do
25
- [expression] << parse.call('SubjectB')
26
- end
27
- end
28
- end
29
-
30
- subject { object.call(mutation_subject) }
31
-
32
- context 'without available tests' do
33
- let(:all_tests) { [] }
34
-
35
- it { should eql([]) }
36
- end
37
-
38
- context 'without qualifying tests' do
39
- let(:all_tests) { [test_c] }
40
-
41
- it { should eql([]) }
42
- end
43
-
44
- context 'with qualifying tests for first match expression' do
45
- let(:all_tests) { [test_a] }
46
-
47
- it { should eql([test_a]) }
48
- end
49
-
50
- context 'with qualifying tests for second match expression' do
51
- let(:all_tests) { [test_b] }
52
-
53
- it { should eql([test_b]) }
54
- end
55
-
56
- context 'with qualifying tests for the first and second match expression' do
57
- let(:all_tests) { [test_a, test_b] }
58
-
59
- it { should eql([test_a]) }
60
- end
61
- end
62
- end
@@ -1,17 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Selector::Null do
4
- describe '#call' do
5
- subject { described_class.new }
6
-
7
- let(:mutant_subject) { instance_double(Mutant::Subject) }
8
-
9
- def apply
10
- subject.call(mutant_subject)
11
- end
12
-
13
- it 'returns no tests' do
14
- expect(apply).to eql([])
15
- end
16
- end
17
- end
@@ -1,181 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Subject::Method::Instance do
4
- let(:object) do
5
- described_class.new(
6
- context: context,
7
- node: node,
8
- warnings: warnings
9
- )
10
- end
11
-
12
- let(:call_block?) { true }
13
- let(:warnings) { instance_double(Mutant::Warnings) }
14
-
15
- let(:context) do
16
- Mutant::Context.new(
17
- scope,
18
- instance_double(Pathname)
19
- )
20
- end
21
-
22
- let(:node) do
23
- s(:def, :foo, s(:args))
24
- end
25
-
26
- let(:scope) do
27
- Class.new do
28
- attr_reader :bar
29
-
30
- def initialize
31
- @bar = :boo
32
- end
33
-
34
- def foo; end
35
-
36
- def self.name
37
- 'Test'
38
- end
39
- end
40
- end
41
-
42
- before do
43
- allow(warnings).to receive(:call) do |&block|
44
- block.call if call_block?
45
- end
46
- end
47
-
48
- describe '#expression' do
49
- subject { object.expression }
50
-
51
- it { should eql(parse_expression('Test#foo')) }
52
-
53
- it_should_behave_like 'an idempotent method'
54
- end
55
-
56
- describe '#match_expression' do
57
- subject { object.match_expressions }
58
-
59
- it { should eql(%w[Test#foo Test*].map(&method(:parse_expression))) }
60
-
61
- it_should_behave_like 'an idempotent method'
62
- end
63
-
64
- describe '#prepare' do
65
- let(:context) do
66
- Mutant::Context.new(scope, instance_double(Pathname))
67
- end
68
-
69
- subject { object.prepare }
70
-
71
- it 'undefines method on scope' do
72
- expect { subject }
73
- .to change { scope.instance_methods.include?(:foo) }
74
- .from(true)
75
- .to(false)
76
- end
77
-
78
- context 'within warning capture' do
79
- let(:call_block?) { false }
80
-
81
- it 'undefines method on scope' do
82
- expect { subject }
83
- .to_not change { scope.instance_methods.include?(:foo) }
84
- .from(true)
85
- end
86
- end
87
-
88
- it_should_behave_like 'a command method'
89
- end
90
-
91
- describe '#source' do
92
- subject { object.source }
93
-
94
- it { should eql("def foo\nend") }
95
- end
96
- end
97
-
98
- RSpec.describe Mutant::Subject::Method::Instance::Memoized do
99
- let(:object) do
100
- described_class.new(
101
- context: context,
102
- node: node,
103
- warnings: warnings
104
- )
105
- end
106
-
107
- let(:context) { double('Context') }
108
- let(:warnings) { instance_double(Mutant::Warnings) }
109
-
110
- let(:node) do
111
- s(:def, :foo, s(:args))
112
- end
113
-
114
- before do
115
- allow(warnings).to receive(:call).and_yield
116
- end
117
-
118
- describe '#prepare' do
119
-
120
- let(:context) do
121
- Mutant::Context.new(scope, double('Source Path'))
122
- end
123
-
124
- let(:scope) do
125
- Class.new do
126
- include Memoizable
127
- def foo; end
128
- memoize :foo
129
- end
130
- end
131
-
132
- subject { object.prepare }
133
-
134
- it 'undefines memoizer' do
135
- expect { subject }.to change { scope.memoized?(:foo) }.from(true).to(false)
136
- end
137
-
138
- it 'undefines method on scope' do
139
- expect { subject }.to change { scope.instance_methods.include?(:foo) }.from(true).to(false)
140
- end
141
-
142
- it_should_behave_like 'a command method'
143
- end
144
-
145
- describe '#mutations', mutant_expression: 'Mutant::Subject#mutations' do
146
- subject { object.mutations }
147
-
148
- let(:expected) do
149
- [
150
- Mutant::Mutation::Neutral.new(
151
- object,
152
- s(:begin,
153
- s(:def, :foo, s(:args)), s(:send, nil, :memoize, s(:args, s(:sym, :foo))))
154
- ),
155
- Mutant::Mutation::Evil.new(
156
- object,
157
- s(:begin,
158
- s(:def, :foo, s(:args), s(:send, nil, :raise)), s(:send, nil, :memoize, s(:args, s(:sym, :foo))))
159
- ),
160
- Mutant::Mutation::Evil.new(
161
- object,
162
- s(:begin,
163
- s(:def, :foo, s(:args), s(:zsuper)), s(:send, nil, :memoize, s(:args, s(:sym, :foo))))
164
- ),
165
- Mutant::Mutation::Evil.new(
166
- object,
167
- s(:begin,
168
- s(:def, :foo, s(:args), nil), s(:send, nil, :memoize, s(:args, s(:sym, :foo))))
169
- )
170
- ]
171
- end
172
-
173
- it { should eql(expected) }
174
- end
175
-
176
- describe '#source' do
177
- subject { object.source }
178
-
179
- it { should eql("def foo\nend\nmemoize(:foo)") }
180
- end
181
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Subject::Method::Metaclass do
4
- let(:object) do
5
- described_class.new(
6
- context: context,
7
- node: node,
8
- warnings: warnings
9
- )
10
- end
11
-
12
- let(:node) { s(:def, :foo, s(:args)) }
13
- let(:warnings) { instance_double(Mutant::Warnings) }
14
-
15
- let(:context) do
16
- Mutant::Context.new(scope, instance_double(Pathname))
17
- end
18
-
19
- let(:scope) do
20
- Class.new do
21
- class << self
22
- def foo; end
23
-
24
- def name
25
- 'Test'
26
- end
27
- end
28
- end
29
- end
30
-
31
- describe '#expression' do
32
- subject { object.expression }
33
-
34
- it { should eql(parse_expression('Test.foo')) }
35
-
36
- it_should_behave_like 'an idempotent method'
37
- end
38
-
39
- describe '#match_expression' do
40
- subject { object.match_expressions }
41
-
42
- it { should eql(%w[Test.foo Test*].map(&method(:parse_expression))) }
43
-
44
- it_should_behave_like 'an idempotent method'
45
- end
46
-
47
- describe '#prepare' do
48
-
49
- subject { object.prepare }
50
-
51
- it 'undefines method on scope' do
52
- expect { subject }.to change { scope.methods.include?(:foo) }.from(true).to(false)
53
- end
54
-
55
- it_should_behave_like 'a command method'
56
- end
57
-
58
- describe '#source' do
59
- subject { object.source }
60
-
61
- it { should eql("class << self\n def foo\n end\nend") }
62
- end
63
- end
@@ -1,61 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Subject::Method::Singleton do
4
- let(:object) do
5
- described_class.new(
6
- context: context,
7
- node: node,
8
- warnings: warnings
9
- )
10
- end
11
-
12
- let(:node) { s(:defs, s(:self), :foo, s(:args)) }
13
- let(:warnings) { instance_double(Mutant::Warnings) }
14
-
15
- let(:context) do
16
- Mutant::Context.new(scope, instance_double(Pathname))
17
- end
18
-
19
- let(:scope) do
20
- Class.new do
21
- def self.foo; end
22
-
23
- def self.name
24
- 'Test'
25
- end
26
- end
27
- end
28
-
29
- describe '#expression' do
30
- subject { object.expression }
31
-
32
- it { should eql(parse_expression('Test.foo')) }
33
-
34
- it_should_behave_like 'an idempotent method'
35
- end
36
-
37
- describe '#match_expression' do
38
- subject { object.match_expressions }
39
-
40
- it { should eql(%w[Test.foo Test*].map(&method(:parse_expression))) }
41
-
42
- it_should_behave_like 'an idempotent method'
43
- end
44
-
45
- describe '#prepare' do
46
-
47
- subject { object.prepare }
48
-
49
- it 'undefines method on scope' do
50
- expect { subject }.to change { scope.methods.include?(:foo) }.from(true).to(false)
51
- end
52
-
53
- it_should_behave_like 'a command method'
54
- end
55
-
56
- describe '#source' do
57
- subject { object.source }
58
-
59
- it { should eql("def self.foo\nend") }
60
- end
61
- end