mutant 0.9.8 → 0.9.13

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 (335) hide show
  1. checksums.yaml +4 -4
  2. data/lib/mutant.rb +5 -2
  3. data/lib/mutant/ast.rb +0 -9
  4. data/lib/mutant/ast/find_metaclass_containing.rb +48 -0
  5. data/lib/mutant/ast/meta/send.rb +0 -6
  6. data/lib/mutant/bootstrap.rb +14 -37
  7. data/lib/mutant/cli.rb +11 -49
  8. data/lib/mutant/config.rb +0 -8
  9. data/lib/mutant/context.rb +0 -3
  10. data/lib/mutant/env.rb +0 -6
  11. data/lib/mutant/expression/method.rb +6 -6
  12. data/lib/mutant/expression/methods.rb +6 -6
  13. data/lib/mutant/expression/parser.rb +0 -6
  14. data/lib/mutant/integration.rb +0 -18
  15. data/lib/mutant/isolation.rb +1 -1
  16. data/lib/mutant/isolation/fork.rb +2 -24
  17. data/lib/mutant/isolation/none.rb +1 -1
  18. data/lib/mutant/license.rb +11 -0
  19. data/lib/mutant/matcher.rb +0 -14
  20. data/lib/mutant/matcher/config.rb +2 -11
  21. data/lib/mutant/matcher/method.rb +0 -31
  22. data/lib/mutant/matcher/method/instance.rb +0 -8
  23. data/lib/mutant/matcher/method/metaclass.rb +86 -0
  24. data/lib/mutant/matcher/method/singleton.rb +0 -25
  25. data/lib/mutant/matcher/methods.rb +17 -28
  26. data/lib/mutant/matcher/namespace.rb +0 -10
  27. data/lib/mutant/matcher/scope.rb +2 -4
  28. data/lib/mutant/meta/example/dsl.rb +0 -21
  29. data/lib/mutant/meta/example/verification.rb +0 -20
  30. data/lib/mutant/minitest/coverage.rb +53 -0
  31. data/lib/mutant/mutation.rb +0 -3
  32. data/lib/mutant/mutator.rb +1 -29
  33. data/lib/mutant/mutator/node.rb +1 -66
  34. data/lib/mutant/mutator/node/and_asgn.rb +0 -3
  35. data/lib/mutant/mutator/node/argument.rb +0 -15
  36. data/lib/mutant/mutator/node/arguments.rb +0 -20
  37. data/lib/mutant/mutator/node/begin.rb +0 -3
  38. data/lib/mutant/mutator/node/binary.rb +0 -23
  39. data/lib/mutant/mutator/node/block.rb +0 -15
  40. data/lib/mutant/mutator/node/block_pass.rb +29 -0
  41. data/lib/mutant/mutator/node/break.rb +0 -3
  42. data/lib/mutant/mutator/node/case.rb +0 -9
  43. data/lib/mutant/mutator/node/class.rb +0 -3
  44. data/lib/mutant/mutator/node/conditional_loop.rb +0 -3
  45. data/lib/mutant/mutator/node/const.rb +0 -3
  46. data/lib/mutant/mutator/node/define.rb +0 -11
  47. data/lib/mutant/mutator/node/defined.rb +0 -3
  48. data/lib/mutant/mutator/node/dstr.rb +0 -3
  49. data/lib/mutant/mutator/node/dsym.rb +0 -3
  50. data/lib/mutant/mutator/node/generic.rb +0 -3
  51. data/lib/mutant/mutator/node/if.rb +0 -12
  52. data/lib/mutant/mutator/node/index.rb +0 -27
  53. data/lib/mutant/mutator/node/kwbegin.rb +0 -3
  54. data/lib/mutant/mutator/node/literal.rb +0 -3
  55. data/lib/mutant/mutator/node/literal/array.rb +0 -6
  56. data/lib/mutant/mutator/node/literal/boolean.rb +0 -4
  57. data/lib/mutant/mutator/node/literal/float.rb +0 -9
  58. data/lib/mutant/mutator/node/literal/hash.rb +0 -9
  59. data/lib/mutant/mutator/node/literal/integer.rb +0 -9
  60. data/lib/mutant/mutator/node/literal/nil.rb +0 -3
  61. data/lib/mutant/mutator/node/literal/range.rb +4 -7
  62. data/lib/mutant/mutator/node/literal/regex.rb +0 -6
  63. data/lib/mutant/mutator/node/literal/string.rb +0 -3
  64. data/lib/mutant/mutator/node/literal/symbol.rb +0 -3
  65. data/lib/mutant/mutator/node/masgn.rb +0 -3
  66. data/lib/mutant/mutator/node/match_current_line.rb +0 -3
  67. data/lib/mutant/mutator/node/mlhs.rb +0 -3
  68. data/lib/mutant/mutator/node/named_value/access.rb +2 -14
  69. data/lib/mutant/mutator/node/named_value/constant_assignment.rb +0 -9
  70. data/lib/mutant/mutator/node/named_value/variable_assignment.rb +0 -6
  71. data/lib/mutant/mutator/node/next.rb +0 -3
  72. data/lib/mutant/mutator/node/noop.rb +1 -4
  73. data/lib/mutant/mutator/node/nthref.rb +0 -3
  74. data/lib/mutant/mutator/node/op_asgn.rb +0 -3
  75. data/lib/mutant/mutator/node/or_asgn.rb +0 -3
  76. data/lib/mutant/mutator/node/procarg_zero.rb +0 -3
  77. data/lib/mutant/mutator/node/regopt.rb +0 -6
  78. data/lib/mutant/mutator/node/resbody.rb +0 -6
  79. data/lib/mutant/mutator/node/rescue.rb +2 -19
  80. data/lib/mutant/mutator/node/return.rb +0 -3
  81. data/lib/mutant/mutator/node/sclass.rb +20 -0
  82. data/lib/mutant/mutator/node/send.rb +26 -61
  83. data/lib/mutant/mutator/node/send/attribute_assignment.rb +0 -9
  84. data/lib/mutant/mutator/node/send/binary.rb +0 -11
  85. data/lib/mutant/mutator/node/send/conditional.rb +0 -3
  86. data/lib/mutant/mutator/node/splat.rb +0 -3
  87. data/lib/mutant/mutator/node/super.rb +0 -3
  88. data/lib/mutant/mutator/node/when.rb +0 -19
  89. data/lib/mutant/mutator/node/yield.rb +0 -3
  90. data/lib/mutant/mutator/node/zsuper.rb +0 -3
  91. data/lib/mutant/mutator/util/array.rb +0 -6
  92. data/lib/mutant/mutator/util/symbol.rb +0 -3
  93. data/lib/mutant/parallel.rb +0 -13
  94. data/lib/mutant/parallel/driver.rb +0 -10
  95. data/lib/mutant/parallel/worker.rb +0 -22
  96. data/lib/mutant/reporter/cli.rb +0 -5
  97. data/lib/mutant/reporter/cli/format.rb +0 -9
  98. data/lib/mutant/reporter/cli/printer.rb +2 -42
  99. data/lib/mutant/reporter/cli/printer/env_progress.rb +0 -15
  100. data/lib/mutant/reporter/cli/printer/isolation_result.rb +9 -21
  101. data/lib/mutant/reporter/cli/printer/mutation_progress_result.rb +0 -5
  102. data/lib/mutant/reporter/cli/printer/mutation_result.rb +1 -22
  103. data/lib/mutant/reporter/cli/printer/status_progressive.rb +0 -8
  104. data/lib/mutant/reporter/cli/printer/subject_progress.rb +0 -9
  105. data/lib/mutant/repository/diff.rb +1 -13
  106. data/lib/mutant/repository/diff/ranges.rb +0 -11
  107. data/lib/mutant/result.rb +0 -3
  108. data/lib/mutant/runner.rb +0 -18
  109. data/lib/mutant/runner/sink.rb +0 -5
  110. data/lib/mutant/subject.rb +0 -8
  111. data/lib/mutant/subject/method.rb +0 -3
  112. data/lib/mutant/subject/method/instance.rb +40 -6
  113. data/lib/mutant/subject/method/metaclass.rb +30 -0
  114. data/lib/mutant/transform.rb +0 -92
  115. data/lib/mutant/version.rb +1 -1
  116. data/lib/mutant/warnings.rb +0 -6
  117. data/lib/mutant/zombifier.rb +2 -34
  118. metadata +61 -333
  119. data/.github/workflows/ci.yml +0 -121
  120. data/.gitignore +0 -38
  121. data/.rspec +0 -5
  122. data/.rubocop.yml +0 -7
  123. data/Changelog.md +0 -75
  124. data/Gemfile +0 -7
  125. data/Gemfile.lock +0 -167
  126. data/Gemfile.shared +0 -10
  127. data/README.md +0 -138
  128. data/Rakefile +0 -5
  129. data/config/devtools.yml +0 -2
  130. data/config/reek.yml +0 -138
  131. data/config/rubocop.yml +0 -205
  132. data/config/yardstick.yml +0 -2
  133. data/docs/commercial-support.md +0 -14
  134. data/docs/concurrency.md +0 -39
  135. data/docs/incremental.md +0 -76
  136. data/docs/known-problems.md +0 -30
  137. data/docs/limitations.md +0 -50
  138. data/docs/mutant-minitest.md +0 -149
  139. data/docs/mutant-rspec.md +0 -130
  140. data/docs/nomenclature.md +0 -82
  141. data/docs/reading-reports.md +0 -74
  142. data/lib/mutant/color.rb +0 -43
  143. data/lib/mutant/diff.rb +0 -114
  144. data/meta/and.rb +0 -15
  145. data/meta/and_asgn.rb +0 -14
  146. data/meta/array.rb +0 -30
  147. data/meta/begin.rb +0 -23
  148. data/meta/block.rb +0 -202
  149. data/meta/block_pass.rb +0 -8
  150. data/meta/blockarg.rb +0 -10
  151. data/meta/break.rb +0 -10
  152. data/meta/case.rb +0 -223
  153. data/meta/casgn.rb +0 -28
  154. data/meta/cbase.rb +0 -8
  155. data/meta/class.rb +0 -12
  156. data/meta/const.rb +0 -17
  157. data/meta/csend.rb +0 -10
  158. data/meta/cvar.rb +0 -7
  159. data/meta/cvasgn.rb +0 -10
  160. data/meta/date.rb +0 -59
  161. data/meta/def.rb +0 -203
  162. data/meta/defined.rb +0 -9
  163. data/meta/dstr.rb +0 -13
  164. data/meta/dsym.rb +0 -14
  165. data/meta/ensure.rb +0 -9
  166. data/meta/false.rb +0 -8
  167. data/meta/file.rb +0 -5
  168. data/meta/float.rb +0 -37
  169. data/meta/gvar.rb +0 -7
  170. data/meta/gvasgn.rb +0 -10
  171. data/meta/hash.rb +0 -24
  172. data/meta/if.rb +0 -77
  173. data/meta/index.rb +0 -133
  174. data/meta/indexasgn.rb +0 -31
  175. data/meta/int.rb +0 -18
  176. data/meta/ivar.rb +0 -8
  177. data/meta/ivasgn.rb +0 -23
  178. data/meta/kwarg.rb +0 -10
  179. data/meta/kwbegin.rb +0 -9
  180. data/meta/kwoptarg.rb +0 -13
  181. data/meta/lambda.rb +0 -23
  182. data/meta/line.rb +0 -5
  183. data/meta/lvar.rb +0 -16
  184. data/meta/lvasgn.rb +0 -25
  185. data/meta/masgn.rb +0 -7
  186. data/meta/match_current_line.rb +0 -15
  187. data/meta/next.rb +0 -11
  188. data/meta/nil.rb +0 -5
  189. data/meta/nthref.rb +0 -14
  190. data/meta/op_assgn.rb +0 -17
  191. data/meta/or.rb +0 -15
  192. data/meta/or_asgn.rb +0 -50
  193. data/meta/range.rb +0 -39
  194. data/meta/redo.rb +0 -5
  195. data/meta/regexp.rb +0 -81
  196. data/meta/regopt.rb +0 -10
  197. data/meta/rescue.rb +0 -90
  198. data/meta/return.rb +0 -16
  199. data/meta/self.rb +0 -7
  200. data/meta/send.rb +0 -604
  201. data/meta/str.rb +0 -7
  202. data/meta/super.rb +0 -27
  203. data/meta/sym.rb +0 -8
  204. data/meta/true.rb +0 -8
  205. data/meta/until.rb +0 -17
  206. data/meta/while.rb +0 -26
  207. data/meta/yield.rb +0 -10
  208. data/mutant-minitest.gemspec +0 -22
  209. data/mutant-rspec.gemspec +0 -22
  210. data/mutant.gemspec +0 -41
  211. data/mutant.yml +0 -6
  212. data/spec/integration/mutant/corpus_spec.rb +0 -15
  213. data/spec/integration/mutant/isolation/fork_spec.rb +0 -28
  214. data/spec/integration/mutant/minitest_spec.rb +0 -11
  215. data/spec/integration/mutant/null_spec.rb +0 -16
  216. data/spec/integration/mutant/rspec_spec.rb +0 -15
  217. data/spec/integration/mutant/test_mutator_handles_types_spec.rb +0 -9
  218. data/spec/integrations.yml +0 -63
  219. data/spec/shared/base_behavior.rb +0 -45
  220. data/spec/shared/framework_integration_behavior.rb +0 -70
  221. data/spec/shared/method_matcher_behavior.rb +0 -47
  222. data/spec/spec_helper.rb +0 -75
  223. data/spec/support/corpus.rb +0 -318
  224. data/spec/support/file_system.rb +0 -62
  225. data/spec/support/ice_nine_config.rb +0 -10
  226. data/spec/support/ruby_vm.rb +0 -84
  227. data/spec/support/shared_context.rb +0 -169
  228. data/spec/support/test_app.rb +0 -7
  229. data/spec/support/warnings.yml +0 -6
  230. data/spec/support/xspec.rb +0 -183
  231. data/spec/unit/mutant/ast/meta/optarg_spec.rb +0 -24
  232. data/spec/unit/mutant/ast/meta/send/proc_predicate_spec.rb +0 -30
  233. data/spec/unit/mutant/ast/meta/send/receiver_possible_top_level_const_predicate_spec.rb +0 -39
  234. data/spec/unit/mutant/ast/meta/send_spec.rb +0 -42
  235. data/spec/unit/mutant/ast/named_children_spec.rb +0 -89
  236. data/spec/unit/mutant/ast/sexp_spec.rb +0 -38
  237. data/spec/unit/mutant/ast_spec.rb +0 -57
  238. data/spec/unit/mutant/bootstrap_spec.rb +0 -216
  239. data/spec/unit/mutant/cli_spec.rb +0 -305
  240. data/spec/unit/mutant/clock_monotonic_spec.rb +0 -52
  241. data/spec/unit/mutant/config_spec.rb +0 -126
  242. data/spec/unit/mutant/context_spec.rb +0 -111
  243. data/spec/unit/mutant/diff_spec.rb +0 -189
  244. data/spec/unit/mutant/env_spec.rb +0 -229
  245. data/spec/unit/mutant/expression/method_spec.rb +0 -62
  246. data/spec/unit/mutant/expression/methods_spec.rb +0 -61
  247. data/spec/unit/mutant/expression/namespace/exact_spec.rb +0 -28
  248. data/spec/unit/mutant/expression/namespace/recursive_spec.rb +0 -66
  249. data/spec/unit/mutant/expression/parser_spec.rb +0 -65
  250. data/spec/unit/mutant/expression_spec.rb +0 -45
  251. data/spec/unit/mutant/integration/rspec_spec.rb +0 -201
  252. data/spec/unit/mutant/integration_spec.rb +0 -150
  253. data/spec/unit/mutant/isolation/fork_spec.rb +0 -309
  254. data/spec/unit/mutant/isolation/none_spec.rb +0 -23
  255. data/spec/unit/mutant/isolation/result_spec.rb +0 -73
  256. data/spec/unit/mutant/license_spec.rb +0 -293
  257. data/spec/unit/mutant/loader_spec.rb +0 -79
  258. data/spec/unit/mutant/matcher/chain_spec.rb +0 -26
  259. data/spec/unit/mutant/matcher/compiler_spec.rb +0 -0
  260. data/spec/unit/mutant/matcher/config_spec.rb +0 -47
  261. data/spec/unit/mutant/matcher/filter_spec.rb +0 -22
  262. data/spec/unit/mutant/matcher/method/instance_spec.rb +0 -164
  263. data/spec/unit/mutant/matcher/method/singleton_spec.rb +0 -90
  264. data/spec/unit/mutant/matcher/methods/instance_spec.rb +0 -54
  265. data/spec/unit/mutant/matcher/methods/singleton_spec.rb +0 -51
  266. data/spec/unit/mutant/matcher/namespace_spec.rb +0 -37
  267. data/spec/unit/mutant/matcher/null_spec.rb +0 -12
  268. data/spec/unit/mutant/matcher/scope_spec.rb +0 -35
  269. data/spec/unit/mutant/matcher/static_spec.rb +0 -13
  270. data/spec/unit/mutant/matcher_spec.rb +0 -102
  271. data/spec/unit/mutant/meta/example/dsl_spec.rb +0 -108
  272. data/spec/unit/mutant/meta/example/verification_spec.rb +0 -154
  273. data/spec/unit/mutant/meta/example_spec.rb +0 -34
  274. data/spec/unit/mutant/mutation_spec.rb +0 -140
  275. data/spec/unit/mutant/mutator/node_spec.rb +0 -52
  276. data/spec/unit/mutant/mutator_spec.rb +0 -21
  277. data/spec/unit/mutant/parallel/driver_spec.rb +0 -126
  278. data/spec/unit/mutant/parallel/source/array_spec.rb +0 -57
  279. data/spec/unit/mutant/parallel/worker_spec.rb +0 -206
  280. data/spec/unit/mutant/parallel_spec.rb +0 -115
  281. data/spec/unit/mutant/parser_spec.rb +0 -26
  282. data/spec/unit/mutant/range_spec.rb +0 -141
  283. data/spec/unit/mutant/registry_spec.rb +0 -74
  284. data/spec/unit/mutant/reporter/cli/printer/config_spec.rb +0 -17
  285. data/spec/unit/mutant/reporter/cli/printer/env_progress_spec.rb +0 -85
  286. data/spec/unit/mutant/reporter/cli/printer/env_result_spec.rb +0 -45
  287. data/spec/unit/mutant/reporter/cli/printer/isolation_result_spec.rb +0 -132
  288. data/spec/unit/mutant/reporter/cli/printer/mutation_progress_result_spec.rb +0 -25
  289. data/spec/unit/mutant/reporter/cli/printer/mutation_result_spec.rb +0 -153
  290. data/spec/unit/mutant/reporter/cli/printer/status_progressive_spec.rb +0 -45
  291. data/spec/unit/mutant/reporter/cli/printer/subject_progress_spec.rb +0 -36
  292. data/spec/unit/mutant/reporter/cli/printer/subject_result_spec.rb +0 -44
  293. data/spec/unit/mutant/reporter/cli/printer/test_result_spec.rb +0 -16
  294. data/spec/unit/mutant/reporter/cli/printer_spec.rb +0 -163
  295. data/spec/unit/mutant/reporter/cli_spec.rb +0 -137
  296. data/spec/unit/mutant/reporter/null_spec.rb +0 -14
  297. data/spec/unit/mutant/reporter/sequence_spec.rb +0 -31
  298. data/spec/unit/mutant/repository/diff/ranges_spec.rb +0 -180
  299. data/spec/unit/mutant/repository/diff_spec.rb +0 -122
  300. data/spec/unit/mutant/repository/subject_filter_spec.rb +0 -30
  301. data/spec/unit/mutant/require_highjack_spec.rb +0 -73
  302. data/spec/unit/mutant/result/class_methods_spec.rb +0 -51
  303. data/spec/unit/mutant/result/env_spec.rb +0 -161
  304. data/spec/unit/mutant/result/mutation_spec.rb +0 -70
  305. data/spec/unit/mutant/result/subject_spec.rb +0 -111
  306. data/spec/unit/mutant/result/test_spec.rb +0 -14
  307. data/spec/unit/mutant/result_spec.rb +0 -33
  308. data/spec/unit/mutant/runner/sink_spec.rb +0 -174
  309. data/spec/unit/mutant/runner_spec.rb +0 -121
  310. data/spec/unit/mutant/selector/expression_spec.rb +0 -62
  311. data/spec/unit/mutant/selector/null_spec.rb +0 -17
  312. data/spec/unit/mutant/subject/method/instance_spec.rb +0 -181
  313. data/spec/unit/mutant/subject/method/singleton_spec.rb +0 -61
  314. data/spec/unit/mutant/subject_spec.rb +0 -93
  315. data/spec/unit/mutant/transform/array_spec.rb +0 -92
  316. data/spec/unit/mutant/transform/bool_spec.rb +0 -63
  317. data/spec/unit/mutant/transform/error_spec.rb +0 -132
  318. data/spec/unit/mutant/transform/exception_spec.rb +0 -44
  319. data/spec/unit/mutant/transform/hash_spec.rb +0 -236
  320. data/spec/unit/mutant/transform/index_spec.rb +0 -92
  321. data/spec/unit/mutant/transform/named_spec.rb +0 -49
  322. data/spec/unit/mutant/transform/primitive_spec.rb +0 -56
  323. data/spec/unit/mutant/transform/sequence_spec.rb +0 -98
  324. data/spec/unit/mutant/util/one_spec.rb +0 -22
  325. data/spec/unit/mutant/warnings_spec.rb +0 -89
  326. data/spec/unit/mutant/world_spec.rb +0 -63
  327. data/spec/unit/mutant/zombifier_spec.rb +0 -122
  328. data/test_app/.rspec +0 -1
  329. data/test_app/Gemfile.minitest +0 -4
  330. data/test_app/Gemfile.rspec3.8 +0 -7
  331. data/test_app/lib/test_app.rb +0 -109
  332. data/test_app/lib/test_app/literal.rb +0 -35
  333. data/test_app/spec/spec_helper.rb +0 -9
  334. data/test_app/spec/unit/test_app/literal_spec.rb +0 -20
  335. data/test_app/test/unit/test_app/literal_test.rb +0 -16
@@ -1,37 +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::Singleton, raw_scope_a, [subject_a]],
17
- [Mutant::Matcher::Methods::Instance, raw_scope_a, []]
18
- ].each do |klass, scope, subjects|
19
- matcher = instance_double(Mutant::Matcher)
20
- expect(matcher).to receive(:call).with(env).and_return(subjects)
21
-
22
- expect(klass).to receive(:new)
23
- .with(scope)
24
- .and_return(matcher)
25
- end
26
-
27
- allow(env).to receive(:matchable_scopes).and_return(
28
- [raw_scope_a, raw_scope_b, raw_scope_c].map do |raw_scope|
29
- Mutant::Scope.new(raw_scope, parse_expression(raw_scope.name))
30
- end
31
- )
32
- end
33
-
34
- it 'returns subjects' do
35
- expect(object.call(env)).to eql([subject_a, subject_b])
36
- end
37
- 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,35 +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(:subject_a) { instance_double(Mutant::Subject) }
10
- let(:subject_b) { instance_double(Mutant::Subject) }
11
-
12
- subject { object.call(env) }
13
-
14
- before do
15
- expect(Mutant::Matcher::Methods::Singleton).to receive(:new)
16
- .with(scope)
17
- .and_return(matcher_a)
18
-
19
- expect(Mutant::Matcher::Methods::Instance).to receive(:new)
20
- .with(scope)
21
- .and_return(matcher_b)
22
-
23
- expect(matcher_a).to receive(:call)
24
- .with(env)
25
- .and_return([subject_a])
26
-
27
- expect(matcher_b).to receive(:call)
28
- .with(env)
29
- .and_return([subject_b])
30
- end
31
-
32
- it 'concatenates subjects from matched singleton and instance methods' do
33
- should eql([subject_a, subject_b])
34
- end
35
- 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
@@ -1,108 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Meta::Example::DSL do
4
- describe '.call' do
5
- subject { described_class.call(file, types, block) }
6
-
7
- let(:file) { 'foo.rb' }
8
- let(:node) { s(:false) }
9
- let(:types) { Set.new([node.type]) }
10
- let(:expected) { [] }
11
-
12
- let(:expected_example) do
13
- Mutant::Meta::Example.new(
14
- file: file,
15
- node: node,
16
- types: types,
17
- expected: expected
18
- )
19
- end
20
-
21
- def self.expect_example(&block)
22
- let(:block) { block }
23
-
24
- specify do
25
- # Kill mutations to warnings
26
- warnings = Mutant::WORLD.warnings.call do
27
- should eql(expected_example)
28
- end
29
- expect(warnings).to eql([])
30
- end
31
- end
32
-
33
- def self.expect_error(message, &block)
34
- let(:block) { block }
35
-
36
- specify do
37
- expect { subject }.to raise_error(RuntimeError, message)
38
- end
39
- end
40
-
41
- context 'source as node' do
42
- expect_example do
43
- source s(:false)
44
- end
45
- end
46
-
47
- context 'source as string' do
48
- expect_example do
49
- source 'false'
50
- end
51
- end
52
-
53
- context 'on node that needs unparser preprocessing to be normalized' do
54
- let(:node) { s(:send, s(:float, -1.0), :/, s(:float, 0.0)) }
55
-
56
- expect_example do
57
- source '(-1.0) / 0.0'
58
- end
59
- end
60
-
61
- context 'using #mutation' do
62
- let(:expected) { [s(:nil)] }
63
-
64
- expect_example do
65
- source 'false'
66
-
67
- mutation 'nil'
68
- end
69
- end
70
-
71
- context 'using #singleton_mutations' do
72
- let(:expected) { [s(:nil), s(:self)] }
73
-
74
- expect_example do
75
- source 'false'
76
-
77
- singleton_mutations
78
- end
79
- end
80
-
81
- context 'no definition of source' do
82
- expect_error('source not defined') do
83
- end
84
- end
85
-
86
- context 'duplicate definition of source' do
87
- expect_error('source already defined') do
88
- source 'true'
89
- source 'false'
90
- end
91
- end
92
-
93
- context 'uncoercable source' do
94
- expect_error('Cannot coerce to node: nil') do
95
- source nil
96
- end
97
- end
98
-
99
- context 'duplicate mutation expectation' do
100
- expect_error('Mutation for input: "true" is already expected') do
101
- source 'false'
102
-
103
- mutation 'true'
104
- mutation 'true'
105
- end
106
- end
107
- end
108
- end
@@ -1,154 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- RSpec.describe Mutant::Meta::Example::Verification do
4
- let(:object) { described_class.new(example, mutations) }
5
-
6
- let(:example) do
7
- Mutant::Meta::Example.new(
8
- file: 'foo.rb',
9
- node: s(:true),
10
- types: [:true],
11
- expected: expected_nodes
12
- )
13
- end
14
-
15
- let(:mutations) do
16
- generated_nodes.map do |node|
17
- Mutant::Mutation::Evil.new(example, node)
18
- end
19
- end
20
-
21
- let(:generated_nodes) { [] }
22
- let(:expected_nodes) { [] }
23
-
24
- describe '#success?' do
25
- subject { object.success? }
26
-
27
- context 'when generated nodes equal expected nodes' do
28
- it { should be(true) }
29
- end
30
-
31
- context 'when expected node is missing' do
32
- let(:expected_nodes) { [s(:false)] }
33
-
34
- it { should be(false) }
35
- end
36
-
37
- context 'when there is extra generated node' do
38
- let(:generated_nodes) { [s(:false)] }
39
-
40
- it { should be(false) }
41
- end
42
-
43
- context 'when there is no diff to original source' do
44
- let(:expected_nodes) { [s(:true)] }
45
- let(:generated_nodes) { [s(:true)] }
46
-
47
- it { should be(false) }
48
- end
49
- end
50
-
51
- describe '#error_report' do
52
- subject { object.error_report }
53
-
54
- context 'on success' do
55
- specify do
56
- expect { subject }.to raise_error(
57
- RuntimeError,
58
- 'no error report on successful validation'
59
- )
60
- end
61
- end
62
-
63
- context 'when expected node is missing' do
64
- let(:expected_nodes) { [s(:false), s(:nil)] }
65
-
66
- specify do
67
- should eql(<<~'REPORT')
68
- ---
69
- file: foo.rb
70
- original_ast: s(:true)
71
- original_source: 'true'
72
- missing:
73
- - node: s(:false)
74
- source: 'false'
75
- - node: s(:nil)
76
- source: nil
77
- unexpected: []
78
- invalid_syntax: []
79
- no_diff: []
80
- REPORT
81
- end
82
- end
83
-
84
- context 'when there is extra generated node' do
85
- let(:generated_nodes) { [s(:false), s(:nil)] }
86
-
87
- specify do
88
- should eql(<<~'REPORT')
89
- ---
90
- file: foo.rb
91
- original_ast: s(:true)
92
- original_source: 'true'
93
- missing: []
94
- unexpected:
95
- - node: s(:false)
96
- source: 'false'
97
- - node: s(:nil)
98
- source: nil
99
- invalid_syntax: []
100
- no_diff: []
101
- REPORT
102
- end
103
- end
104
-
105
- context 'when there is no diff to original source' do
106
- let(:expected_nodes) { [s(:true)] }
107
- let(:generated_nodes) { [s(:true)] }
108
-
109
- specify do
110
- should eql(<<~'REPORT')
111
- ---
112
- file: foo.rb
113
- original_ast: s(:true)
114
- original_source: 'true'
115
- missing: []
116
- unexpected: []
117
- invalid_syntax: []
118
- no_diff:
119
- - node: s(:true)
120
- source: 'true'
121
- REPORT
122
- end
123
- end
124
-
125
- context 'when the generated node is invalid syntax after unparsed' do
126
- let(:invalid_node) do
127
- s(:op_asgn, s(:send, s(:self), :at, s(:int, 1)), :+, s(:int, 1))
128
- end
129
-
130
- let(:expected_nodes) { [invalid_node] }
131
- let(:generated_nodes) { [invalid_node] }
132
-
133
- specify do
134
- should eql(<<~'REPORT')
135
- ---
136
- file: foo.rb
137
- original_ast: s(:true)
138
- original_source: 'true'
139
- missing: []
140
- unexpected: []
141
- invalid_syntax:
142
- - node: |-
143
- s(:op_asgn,
144
- s(:send,
145
- s(:self), :at,
146
- s(:int, 1)), :+,
147
- s(:int, 1))
148
- source: self.at(1) += 1
149
- no_diff: []
150
- REPORT
151
- end
152
- end
153
- end
154
- end